0010080: caldav client / import caldav tasks/task lists via CLI
[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         'updateCalDavData' => array(
33             'description'    => 'update calendar/events from a CalDav source using etags',
34             'params'         => array(
35                 'url'        => 'CalDav source URL',
36                 'caldavuserfile' => 'CalDav user file containing utf8 username;pwd',
37              )
38         ),
39         'importCalDavData' => array(
40             'description'    => 'import calendar/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         'importCalDavCalendars' => array(
47             'description'    => 'import calendars without events from a CalDav source',
48             'params'         => array(
49                 'url'        => 'CalDav source URL',
50                 'caldavuserfile' => 'CalDav user file containing utf8 username;pwd',
51              )
52         ),
53         'importegw14' => array(
54             'description'    => 'imports calendars/events from egw 1.4',
55             'params'         => array(
56                 'host'       => 'dbhost',
57                 'username'   => 'username',
58                 'password'   => 'password',
59                 'dbname'     => 'dbname'
60             )
61         ),
62         'exportICS' => array(  
63             'description'    => "export calendar as ics", 
64             'params'         => array('container_id') 
65         ),
66     );
67     
68     /**
69      * return anonymous methods
70      * 
71      * @return array
72      */
73     public static function getAnonymousMethods()
74     {
75         return array('Calendar.repairDanglingDisplaycontainerEvents');
76     }
77     
78     /**
79      * import events
80      *
81      * @param Zend_Console_Getopt $_opts
82      */
83     public function import($_opts)
84     {
85         parent::_import($_opts);
86     }
87     
88     /**
89      * exports calendars as ICS
90      *
91      * @param Zend_Console_Getopt $_opts
92      */
93     public function exportICS($_opts)
94     {
95         $opts = $_opts->getRemainingArgs();
96         $container_id = $opts[0];
97         $filter = new Calendar_Model_EventFilter(array(
98             array(
99                 'field'     => 'container_id',
100                 'operator'  => 'equals',
101                 'value'     => $container_id
102             )
103
104         ));
105         $result = Calendar_Controller_MSEventFacade::getInstance()->search($filter, null, false, false, 'get');
106         if ($result->count() == 0) {
107             throw new Tinebase_Exception('this calendar does not contain any records.');
108         }
109         $converter = Calendar_Convert_Event_VCalendar_Factory::factory("generic");
110         $result = $converter->fromTine20RecordSet($result);
111         print $result->serialize();
112     }
113     
114     /**
115      * delete duplicate events
116      * 
117      * @see 0008182: event with lots of exceptions breaks calendar sync
118      * 
119      * @todo allow user to set params
120      */
121     public function deleteDuplicateEvents()
122     {
123         $writer = new Zend_Log_Writer_Stream('php://output');
124         $writer->addFilter(new Zend_Log_Filter_Priority(6));
125         Tinebase_Core::getLogger()->addWriter($writer);
126         
127         $be = new Calendar_Backend_Sql();
128         $filter = new Calendar_Model_EventFilter(array(array(
129             'field'    => 'dtstart',
130             'operator' => 'after',
131             'value'    => Tinebase_DateTime::now(),
132         ), array(
133             'field'    => 'organizer',
134             'operator' => 'equals',
135             'value'    => 'contactid', // TODO: set correct contact_id or use container_id filter
136         )));
137         $dryrun = TRUE;
138         $be->deleteDuplicateEvents($filter, $dryrun);
139     }
140     
141     /**
142      * repair dangling attendee records (no displaycontainer_id)
143      * 
144      * @see https://forge.tine20.org/mantisbt/view.php?id=8172
145      */
146     public function repairDanglingDisplaycontainerEvents()
147     {
148         $writer = new Zend_Log_Writer_Stream('php://output');
149         $writer->addFilter(new Zend_Log_Filter_Priority(5));
150         Tinebase_Core::getLogger()->addWriter($writer);
151         
152         $be = new Calendar_Backend_Sql();
153         $be->repairDanglingDisplaycontainerEvents();
154     }
155     
156     /**
157      * import calendars from a CalDav source
158      * 
159      * param Zend_Console_Getopt $_opts
160      */
161     public function importCalDavCalendars(Zend_Console_Getopt $_opts)
162     {
163         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile'));
164         
165         $this->_addOutputLogWriter(4);
166         
167         $caldavCli = new Calendar_Frontend_CalDAV_Cli($_opts, $args);
168         $caldavCli->importAllCalendars();
169     }
170     
171     /**
172      * import calendar events from a CalDav source
173      * 
174      * param Zend_Console_Getopt $_opts
175      */
176     public function importCalDavData(Zend_Console_Getopt $_opts)
177     {
178         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile'));
179         
180         $this->_addOutputLogWriter(4);
181         
182         $caldavCli = new Calendar_Frontend_CalDAV_Cli($_opts, $args);
183         $caldavCli->importAllCalendarDataForUsers();
184     }
185     
186     /**
187      * import calendars and calendar events from a CalDav source using multiple parallel processes
188      * 
189      * param Zend_Console_Getopt $_opts
190      */
191     public function importCalDavMultiProc(Zend_Console_Getopt $_opts)
192     {
193         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile', 'numProc'));
194         
195         $this->_addOutputLogWriter(4);
196         
197         $caldavCli = new Calendar_Frontend_CalDAV_Cli($_opts, $args);
198         $caldavCli->runImportUpdateMultiproc('import');
199     }
200     
201     /**
202      * update calendar events from a CalDav source using multiple parallel processes
203      * 
204      * param Zend_Console_Getopt $_opts
205      */
206     public function updateCalDavMultiProc(Zend_Console_Getopt $_opts)
207     {
208         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile', 'numProc'));
209         
210         $this->_addOutputLogWriter(4);
211         
212         $caldavCli = new Calendar_Frontend_CalDAV_Cli($_opts, $args);
213         $caldavCli->runImportUpdateMultiproc('update');
214     }
215     
216     /**
217      * import calendar events from a CalDav source for one user
218      * 
219      * param Zend_Console_Getopt $_opts
220      */
221     public function importCalDavDataForUser(Zend_Console_Getopt $_opts)
222     {
223         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile', 'line', 'run'));
224         
225         $this->_addOutputLogWriter(4);
226         
227         $caldavCli = new Calendar_Frontend_CalDAV_Cli($_opts, $args);
228         $caldavCli->importAllCalendarData();
229     }
230     
231     /**
232      * update calendar/events from a CalDav source using etags for one user
233      * 
234      * @param Zend_Console_Getopt $_opts
235      */
236     public function updateCalDavDataForUser(Zend_Console_Getopt $_opts)
237     {
238         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile', 'line', 'run'));
239         
240         $this->_addOutputLogWriter(4);
241         
242         $caldavCli = new Calendar_Frontend_CalDAV_Cli($_opts, $args);
243         $caldavCli->updateAllCalendarData();
244     }
245     
246     /**
247      * update calendar/events from a CalDav source using etags
248      * 
249      * param Zend_Console_Getopt $_opts
250      */
251     public function updateCalDavData(Zend_Console_Getopt $_opts)
252     {
253         $args = $this->_parseArgs($_opts, array('url', 'caldavuserfile'));
254         
255         $this->_addOutputLogWriter(4);
256         
257         $caldavCli = new Calendar_Frontend_CalDAV_Cli($_opts, $args);
258         $caldavCli->updateAllCalendarDataForUsers();
259     }
260 }