finish xhprof and db profiling in server cli
[tine20] / tine20 / Tinebase / Server / Cli.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Server
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Philipp Schüle <p.schuele@metaways.de>
10  * 
11  * @todo remove cli session/cache path (add http://aidanlister.com/2004/04/recursively-deleting-a-folder-in-php/ to helpers?)
12  */
13
14 /**
15  * Cli Server class with handle() function
16  * 
17  * @package     Tinebase
18  * @subpackage  Server
19  */
20 class Tinebase_Server_Cli extends Tinebase_Server_Abstract implements Tinebase_Server_Interface
21 {
22     protected static $_anonymousMethods = array(
23         'Tinebase.triggerAsyncEvents',
24         'Tinebase.executeQueueJob',
25         'Tinebase.monitoringCheckDB',
26         'Tinebase.monitoringCheckConfig',
27         'Tinebase.monitoringCheckCron',
28         'Tinebase.monitoringLoginNumber',
29     );
30     
31     /**
32      * return anonymous methods
33      * 
34      * @param string $method
35      * @return array
36      */
37     public static function getAnonymousMethods($method = null)
38     {
39         $result = self::$_anonymousMethods;
40         
41         // check if application cli frontend defines its own anonymous methods
42         if ($method && strpos($method, '.') !== false) {
43             list($application, $cliMethod) = explode('.', $method);
44             $class = $application . '_Frontend_Cli';
45             if (@class_exists($class)) {
46                 $object = new $class;
47                 if (method_exists($object, 'getAnonymousMethods')) {
48                     $result = array_merge($result, call_user_func($class . '::getAnonymousMethods' ));
49                 }
50             }
51         }
52         
53         return $result;
54     }
55     
56     /**
57      * initializes the config
58      * - overwrite session_save_path
59      */
60     public function _setupCliConfig()
61     {
62         $configData = @include('config.inc.php');
63         if ($configData === false) {
64             echo 'UNKNOWN STATUS / CONFIG FILE NOT FOUND (include path: ' . get_include_path() . ")\n";
65             exit(3);
66         }
67         $configData['sessiondir'] = Tinebase_Core::getTempDir();
68         
69         $config = new Zend_Config($configData);
70         Tinebase_Core::set(Tinebase_Core::CONFIG, $config);
71     }
72     
73     /**
74      * handler for command line scripts
75      * 
76      * @return boolean
77      */
78     public function handle()
79     {
80         $method = $this->getRequestMethod();
81         
82         if (! in_array($method, array('Tinebase.monitoringCheckDB', 'Tinebase.monitoringCheckConfig'))) {
83             Tinebase_Core::initFramework();
84             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
85                 .' Is cli request. method: ' . $method);
86         }
87         
88         $tinebaseServer = new Tinebase_Frontend_Cli();
89         
90         $opts = Tinebase_Core::get('opts');
91         if (! in_array($method, self::getAnonymousMethods($method))) {
92             $tinebaseServer->authenticate($opts->username, $opts->password);
93         }
94         $result = $tinebaseServer->handle($opts);
95         
96         //@todo remove cli session path
97         
98         // convert function result to shell return code
99         if ($result === NULL || $result === TRUE || ! is_int($result)) {
100             $result = 0;
101         } else if ($result === FALSE) {
102             $result = 1;
103         }
104         
105         // finish profiling here - we won't run in Tinebase_Core again
106         Tinebase_Core::finishProfiling();
107         Tinebase_Core::getDbProfiling();
108         
109         exit($result);
110     }
111     
112     /**
113     * returns request method
114     *
115     * @return string|NULL
116     */
117     public function getRequestMethod()
118     {
119         $opts = Tinebase_Core::get('opts');
120         return (isset($opts->method)) ? $opts->method : NULL;
121     }
122     
123     /**
124      * prompts user for input
125      * 
126      * @param  string $_promptText   prompt text to dipslay
127      * @param  bool   $_isPassword  is prompt a password?
128      * @return string
129      */
130     public static function promptInput($_promptText, $_isPassword = FALSE)
131     {
132         fwrite(STDOUT, PHP_EOL . "$_promptText> ");
133         
134         if ($_isPassword) {
135             if (preg_match('/^win/i', PHP_OS)) {
136                 $pwObj = new Com('ScriptPW.Password');
137                 $input = $pwObj->getPassword();
138             } else {
139                 system('stty -echo');
140                 $input = fgets(STDIN);
141                 system('stty echo');
142             }
143             fwrite(STDOUT, PHP_EOL);
144         } else {
145             $input = fgets(STDIN);
146         }
147         
148         return rtrim($input);
149     }
150     
151     /**
152      * read password from file
153      * 
154      * @param string $_filename
155      * @return string
156      */
157     public static function getPasswordFromFile($_filename)
158     {
159         $result = @file_get_contents($_filename);
160         return rtrim($result);
161     }
162 }