cdf8eea6ab34d0f48fa68d6fe03dbf96674b1fe5
[tine20] / tine20 / Calendar / Frontend / Cli.php
1 <?php
2 /**
3  * Tine 2.0
4  * @package     Calendar
5  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
6  * @author      Cornelius Weiss <c.weiss@metaways.de>
7  * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
8  */
9
10 /**
11  * Cli frontend for Calendar
12  *
13  * This class handles cli requests for the Calendar
14  *
15  * @package     Calendar
16  */
17 class Calendar_Frontend_Cli extends Tinebase_Frontend_Cli_Abstract
18 {
19     /**
20      * the internal name of the application
21      * 
22      * @var string
23      */
24     protected $_applicationName = 'Calendar';
25     
26     /**
27      * help array with function names and param descriptions
28      * 
29      * @return void
30      */
31     protected $_help = array(
32         'importCalDavData' => array(
33             'description'    => 'import calendar/events from a CalDav source',
34             'params'         => array(
35                 'url'        => 'CalDav source URL',
36                 'caldavuserfile' => 'CalDav user file containing utf8 username;pwd',
37              )
38         ),
39         'importCalDavCalendars' => array(
40             'description'    => 'import calendars without events from a CalDav source',
41             'params'         => array(
42                 'url'        => 'CalDav source URL',
43                 'caldavuserfile' => 'CalDav user file containing utf8 username;pwd',
44              )
45         ),
46         'importegw14' => array(
47             'description'    => 'imports calendars/events from egw 1.4',
48             'params'         => array(
49                 'host'       => 'dbhost',
50                 'username'   => 'username',
51                 'password'   => 'password',
52                 'dbname'     => 'dbname'
53             )
54         ),
55         'exportICS' => array(  
56             'description'    => "export calendar as ics", 
57             'params'         => array('container_id') 
58         ),
59     );
60     
61     /**
62      * return anonymous methods
63      * 
64      * @return array
65      */
66     public static function getAnonymousMethods()
67     {
68         return array('Calendar.repairDanglingDisplaycontainerEvents');
69     }
70     
71     /**
72      * import events
73      *
74      * @param Zend_Console_Getopt $_opts
75      */
76     public function import($_opts)
77     {
78         parent::_import($_opts);
79     }
80     
81     /**
82      * exports calendars as ICS
83      *
84      * @param Zend_Console_Getopt $_opts
85      */
86     public function exportICS($_opts)
87     {
88         $opts = $_opts->getRemainingArgs();
89         $container_id = $opts[0];
90         $filter = new Calendar_Model_EventFilter(array(
91             array(
92                 'field'     => 'container_id',
93                 'operator'  => 'equals',
94                 'value'     => $container_id
95             )
96
97         ));
98         $result = Calendar_Controller_MSEventFacade::getInstance()->search($filter, null, false, false, 'get');
99         if ($result->count() == 0) {
100             throw new Tinebase_Exception('this calendar does not contain any records.');
101         }
102         $converter = Calendar_Convert_Event_VCalendar_Factory::factory("generic");
103         $result = $converter->fromTine20RecordSet($result);
104         print $result->serialize();
105     }
106     
107     /**
108      * delete duplicate events
109      * 
110      * @see 0008182: event with lots of exceptions breaks calendar sync
111      * 
112      * @todo allow user to set params
113      */
114     public function deleteDuplicateEvents()
115     {
116         $writer = new Zend_Log_Writer_Stream('php://output');
117         $writer->addFilter(new Zend_Log_Filter_Priority(6));
118         Tinebase_Core::getLogger()->addWriter($writer);
119         
120         $be = new Calendar_Backend_Sql();
121         $filter = new Calendar_Model_EventFilter(array(array(
122             'field'    => 'dtstart',
123             'operator' => 'after',
124             'value'    => Tinebase_DateTime::now(),
125         ), array(
126             'field'    => 'organizer',
127             'operator' => 'equals',
128             'value'    => 'contactid', // TODO: set correct contact_id or use container_id filter
129         )));
130         $dryrun = TRUE;
131         $be->deleteDuplicateEvents($filter, $dryrun);
132     }
133     
134     /**
135      * repair dangling attendee records (no displaycontainer_id)
136      * 
137      * @see https://forge.tine20.org/mantisbt/view.php?id=8172
138      */
139     public function repairDanglingDisplaycontainerEvents()
140     {
141         $writer = new Zend_Log_Writer_Stream('php://output');
142         $writer->addFilter(new Zend_Log_Filter_Priority(5));
143         Tinebase_Core::getLogger()->addWriter($writer);
144         
145         $be = new Calendar_Backend_Sql();
146         $be->repairDanglingDisplaycontainerEvents();
147     }
148     
149     /**
150      * import calendar/events from a CalDav source
151      * 
152      * param Zend_Console_Getopt $_opts
153      */
154     public function importCalDavCalendars(Zend_Console_Getopt $_opts)
155     {
156         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile'));
157         
158         $writer = new Zend_Log_Writer_Stream('php://output');
159         $writer->addFilter(new Zend_Log_Filter_Priority(4));
160         Tinebase_Core::getLogger()->addWriter($writer);
161         
162         $users = $this->_readCalDavUserFile($args['caldavuserfile']);
163         
164         $client = new Calendar_Import_CalDav_Client(array('baseUri' => $args['url']), 'MacOSX');
165         $client->setVerifyPeer(false);
166         
167         $client->importAllCalendarsForUsers($users);
168     }
169     
170     /**
171      * import calendar/events from a CalDav source
172      * 
173      * param Zend_Console_Getopt $_opts
174      */
175     public function importCalDavData(Zend_Console_Getopt $_opts)
176     {
177         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile'));
178         
179         $writer = new Zend_Log_Writer_Stream('php://output');
180         $writer->addFilter(new Zend_Log_Filter_Priority(4));
181         Tinebase_Core::getLogger()->addWriter($writer);
182         
183         $users = $this->_readCalDavUserFile($args['caldavuserfile']);
184         
185         $client = new Calendar_Import_CalDav_Client(array('baseUri' => $args['url']), 'MacOSX');
186         $client->setVerifyPeer(false);
187         
188         $client->importAllCalendarDataForUsers($users);
189     }
190     
191     /**
192      * read caldav user credentials file
193      * 
194      * - file should have the following format (CSV):
195      * USERNAME1;PASSWORD1
196      * USERNAME2;PASSWORD2
197      * 
198      * @param string $file
199      * @throws Exception
200      */
201     protected function _readCalDavUserFile($file)
202     {
203         if (!($fh = fopen($file, 'r')))
204         {
205             Tinebase_Core::getLogger()->error(__METHOD__ . '::' . __LINE__ . ' couldn\'t open file: '.$file);
206             throw new Exception('Couldn\'t open file: '.$file);
207         }
208         $users = array();
209         while ($row = fgetcsv($fh, 2048, ';'))
210         {
211             $users[$row[0]] = $row[1];
212         }
213         if (count($users) < 1)
214         {
215             Tinebase_Core::getLogger()->error(__METHOD__ . '::' . __LINE__ . ' no users found in: '.$file);
216             throw new Exception('No users found in: '.$file);
217         }
218         return $users;
219     }
220 }