2d63fa5d757f0dbc5a977c018fcec0cb99394f67
[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         exit($result);
105     }
106     
107     /**
108     * returns request method
109     *
110     * @return string|NULL
111     */
112     public function getRequestMethod()
113     {
114         $opts = Tinebase_Core::get('opts');
115         return (isset($opts->method)) ? $opts->method : NULL;
116     }
117     
118     /**
119      * prompts user for input
120      * 
121      * @param  string $_promptText   prompt text to dipslay
122      * @param  bool   $_isPassword  is prompt a password?
123      * @return string
124      */
125     public static function promptInput($_promptText, $_isPassword = FALSE)
126     {
127         fwrite(STDOUT, PHP_EOL . "$_promptText> ");
128         
129         if ($_isPassword) {
130             if (preg_match('/^win/i', PHP_OS)) {
131                 $pwObj = new Com('ScriptPW.Password');
132                 $input = $pwObj->getPassword();
133             } else {
134                 system('stty -echo');
135                 $input = fgets(STDIN);
136                 system('stty echo');
137             }
138             fwrite(STDOUT, PHP_EOL);
139         } else {
140             $input = fgets(STDIN);
141         }
142         
143         return rtrim($input);
144     }
145     
146     /**
147      * read password from file
148      * 
149      * @param string $_filename
150      * @return string
151      */
152     public static function getPasswordFromFile($_filename)
153     {
154         $result = @file_get_contents($_filename);
155         return rtrim($result);
156     }
157 }