0010892: add monitoring cli function for active users
authorPhilipp Schüle <p.schuele@metaways.de>
Sat, 7 Mar 2015 11:00:44 +0000 (12:00 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Mon, 9 Mar 2015 09:06:27 +0000 (10:06 +0100)
* adds CLI function, user count function and full user filter

https://forge.tine20.org/view.php?id=10892

Change-Id: I9da562d07377a29b0fa9c9d1d1b19df7b313d982
Reviewed-on: http://gerrit.tine20.com/customers/1717
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tests/tine20/Tinebase/Frontend/CliTest.php
tine20/Tinebase/Frontend/Cli.php
tine20/Tinebase/Model/FullUserFilter.php [new file with mode: 0644]
tine20/Tinebase/User/Abstract.php

index 6beca61..b0e18b1 100644 (file)
@@ -4,16 +4,11 @@
  * 
  * @package     Tinebase
  * @license     http://www.gnu.org/licenses/agpl.html
- * @copyright   Copyright (c) 2010-2013 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2010-2015 Metaways Infosystems GmbH (http://www.metaways.de)
  * @author      Philipp Schüle <p.schuele@metaways.de>
  */
 
 /**
- * Test helper
- */
-require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'TestHelper.php';
-
-/**
  * Test class for Tinebase_Frontend_Cli
  */
 class Tinebase_Frontend_CliTest extends TestCase
@@ -96,6 +91,7 @@ class Tinebase_Frontend_CliTest extends TestCase
         
         ob_start();
         $this->_cli->clearTable($opts);
+        // TODO check $out
         $out = ob_get_clean();
         
         $accessLogsAfter = Admin_Controller_AccessLog::getInstance()->search();
@@ -139,7 +135,7 @@ class Tinebase_Frontend_CliTest extends TestCase
 
         $contactBackend = Addressbook_Backend_Factory::factory(Addressbook_Backend_Factory::SQL);
         $this->setExpectedException('Tinebase_Exception_NotFound');
-        $deletedRecord = $contactBackend->get($deletedRecord->getId(), TRUE);
+        $contactBackend->get($deletedRecord->getId(), TRUE);
     }
 
     /**
@@ -295,4 +291,21 @@ class Tinebase_Frontend_CliTest extends TestCase
         $this->assertGreaterThan(1, count($matches));
         $this->assertGreaterThanOrEqual(0, $matches[1]);
     }
+
+    /**
+     * testMonitoringActiveUsers
+     *
+     * TODO generalize monitoring tests
+     */
+    public function testMonitoringActiveUsers()
+    {
+        ob_start();
+        $result = $this->_cli->monitoringActiveUsers();
+        $out = ob_get_clean();
+        $this->assertEquals(0, $result);
+
+        preg_match('/ACTIVE USERS OK \| count=(\d+);;;;/', $out, $matches);
+        $this->assertGreaterThan(1, count($matches));
+        $this->assertGreaterThanOrEqual(1, $matches[1], 'at least unittest user should have logged in once');
+    }
 }
index e197a96..fa9c67b 100644 (file)
@@ -525,7 +525,32 @@ class Tinebase_Frontend_Cli extends Tinebase_Frontend_Cli_Abstract
         echo $message . "\n";
         return $result;
     }
-    
+
+    /**
+     * nagios monitoring for tine 2.0 active users
+     *
+     * @return number
+     *
+     * @todo allow to configure timeslot / currently the active users of the last month are returned
+     */
+    public function monitoringActiveUsers()
+    {
+        $message = 'ACTIVE USERS';
+        $result  = 0;
+
+        try {
+            $userCount = Tinebase_User::getInstance()->getActiveUserCount();
+            $valueString = ' | count=' . $userCount . ';;;;';
+            $message .= ' OK' . $valueString;
+        } catch (Exception $e) {
+            $message .= ' FAIL: ' . $e->getMessage();
+            $result = 2;
+        }
+
+        echo $message . "\n";
+        return $result;
+    }
+
     /**
      * undo changes to records defined by certain criteria (user, date, fields, ...)
      * 
diff --git a/tine20/Tinebase/Model/FullUserFilter.php b/tine20/Tinebase/Model/FullUserFilter.php
new file mode 100644 (file)
index 0000000..9aba3b7
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Tinebase
+ * @subpackage  Filter
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
+ *
+ * TODO use in Admin user module
+ */
+
+/**
+ *  user filter class
+ * 
+ * @package     Tinebase
+ * @subpackage  Filter 
+ */
+class Tinebase_Model_FullUserFilter extends Tinebase_Model_Filter_FilterGroup
+{
+    /**
+     * @var string application of this filter group
+     */
+    protected $_applicationName = 'Tinebase';
+    
+    /**
+     * @var string name of model this filter group is designed for
+     */
+    protected $_modelName = 'Tinebase_Model_FullUser';
+    
+    /**
+     * @var array filter model fieldName => definition
+     */
+    protected $_filterModel = array(
+        'id'             => array('filter' => 'Tinebase_Model_Filter_Id'),
+        'query'          => array('filter' => 'Tinebase_Model_Filter_Query', 'options' => array('fields' => array('login_name', 'full_name'))),
+        'login_name'     => array('filter' => 'Tinebase_Model_Filter_Text'),
+        'full_name'      => array('filter' => 'Tinebase_Model_Filter_Text'),
+        'status'         => array('filter' => 'Tinebase_Model_Filter_Text'),
+        'last_login'     => array('filter' => 'Tinebase_Model_Filter_DateTime'),
+    );
+}
index 7441969..886fb4b 100644 (file)
@@ -536,9 +536,7 @@ abstract class Tinebase_User_Abstract implements Tinebase_User_Interface
         
         return true;
     }
-    
-    /******************* abstract functions *********************/
-    
+
     /**
      * get user by login name
      *
@@ -550,7 +548,7 @@ abstract class Tinebase_User_Abstract implements Tinebase_User_Interface
     {
         return $this->getUserByProperty('accountLoginName', $_loginName, $_accountClass);
     }
-    
+
     /**
      * get user by id
      *
@@ -558,12 +556,36 @@ abstract class Tinebase_User_Abstract implements Tinebase_User_Interface
      * @param   string  $_accountClass  type of model to return
      * @return  Tinebase_Model_User user
      */
-    public function getUserById($_accountId, $_accountClass = 'Tinebase_Model_User') 
+    public function getUserById($_accountId, $_accountClass = 'Tinebase_Model_User')
     {
         $userId = $_accountId instanceof Tinebase_Model_User ? $_accountId->getId() : $_accountId;
-        
+
         return $this->getUserByProperty('accountId', $userId, $_accountClass);
     }
+
+    /**
+     * returns active users
+     *
+     * @return int
+     */
+    public function getActiveUserCount()
+    {
+        $backend = new Tinebase_Backend_Sql(array(
+            'modelName' => 'Tinebase_Model_User',
+            'tableName' => 'accounts',
+        ));
+
+        // TODO allow to set this as param
+        $afterDate = Tinebase_DateTime::now()->subMonth(1);
+        $filter = new Tinebase_Model_FullUserFilter(array(
+            array('field' => 'last_login', 'operator' => 'after', 'value' => $afterDate),
+            array('field' => 'status', 'operator' => 'equals', 'value' => Tinebase_Model_User::ACCOUNT_STATUS_ENABLED),
+        ));
+
+        return $backend->searchCount($filter);
+    }
+
+    /******************* abstract functions *********************/
     
     /**
      * setPassword() - sets / updates the password in the account backend