[horde] import calendar events into kronolith - using xmlRPC?

Daniel horde at daniu.de
Thu Jan 21 17:47:04 UTC 2016


Hi,

Quoting Michael J Rubinsky <mrubinsk at horde.org>:

> Quoting Daniel <horde at daniu.de>:
>
>> Zitat von Michael J Rubinsky <mrubinsk at horde.org>:
>>
>>> Quoting Michael J Rubinsky <mrubinsk at horde.org>:
>>>
>>>> Quoting Jan Schneider <jan at horde.org>:
>>>>
>>>>> Zitat von Daniel <horde at daniu.de>:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I am new to the list - hope my request is in the right place here:
>>>>>>
>>>>>> My final goal is to get a calendar from google into kronolith.  
>>>>>> Unfortunately my provider did not setup kronolith so that I can  
>>>>>> do that with kronolith itsself so I think of a cron-job that  
>>>>>> does that with a php script (I am not talking about syncing -  
>>>>>> just copying the google calendar to kronolith. Since the google  
>>>>>> calendar itsself gets populated with a cron-job itsself it's ok  
>>>>>> to have accurate data only after copying). I can already read  
>>>>>> all appointments from google (caldav still works) - so I got a  
>>>>>> string with Vevent infos. The plan is to purge the existing  
>>>>>> calendar in kronolith and write all events from the string into  
>>>>>> the existing calendar.
>>>>>>
>>>>>> I tried to adjust this: http://theupstairsroom.com/66 but don't  
>>>>>> seem to get it working at all. Partly because I don't have  
>>>>>> access to horde sources on the server from which I connect to  
>>>>>> the Horde - so I need to use another RPC-client. I would like  
>>>>>> to use the RPC-client built in php (epinion.com) which is  
>>>>>> turned on according to phpinfo. Somehow I cannot really find a  
>>>>>> good tutorial how to do that.
>>>>>>
>>>>>> Adjusting a script from php.net gave me the attached attempt.  
>>>>>> That one does nothing unfortunately ... (but at least no error  
>>>>>> message)
>>>>>>
>>>>>> Can someone point me in the right direction? Or is there a  
>>>>>> simpler way to achieve what I want to do?
>>>>>>
>>>>>> Is https a problem for what I want to do? Are my adjustments  
>>>>>> for that correct?
>>>>>>
>>>>>> Looking at the api it seems like the purge function from import  
>>>>>> in the GUI did not make it in there ... any chance to still do  
>>>>>> it or get it in the api?
>>>>>>
>>>>>> Thanks for any input!
>>>>>>
>>>>>> (BTW: there is a sourceforge project with exactly that topic,  
>>>>>> but it does not work any more and the author did not maintain  
>>>>>> it - I even asked him and he says he cannot help -  
>>>>>> http://sourceforge.net/projects/kron2gcalsync/)
>>>>>>
>>>>>> ***
>>>>>> function do_call($host, $port, $request) {
>>>>>>
>>>>>> $url = "https://$host:$port/";
>>>>>> //echo $url;
>>>>>> $header[] = "Content-type: text/xml";
>>>>>> $header[] = "Content-length: ".strlen($request);
>>>>>> $to['user']='username';
>>>>>> $to['pass']='password';
>>>>>> $userpwd = $to['user'] .":". $to['pass'];
>>>>>>
>>>>>>
>>>>>> $ch = curl_init();
>>>>>> curl_setopt($ch, CURLOPT_URL, $url);
>>>>>> curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
>>>>>> curl_setopt($ch, CURLOPT_TIMEOUT, 1);
>>>>>> curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
>>>>>> curl_setopt($ch, CURLOPT_USERPWD, $userpwd);
>>>>>> curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
>>>>>> curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
>>>>>> curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
>>>>>>
>>>>>> $data = curl_exec($ch);
>>>>>> if (curl_errno($ch)) {
>>>>>>     print curl_error($ch);
>>>>>> } else {
>>>>>>     curl_close($ch);
>>>>>>     return $data;
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> $host="path/rpc.php";
>>>>>> $port=443;
>>>>>> $request = xmlrpc_encode_request('kronolith.listCalendars', array());
>>>>>> $response = do_call($host, $port, $request);
>>>>>> echo $response;
>>>>>> ***
>>>>>>
>>>>>> regards
>>>>>>
>>>>>> -- 
>>>>>> Horde mailing list
>>>>>> Frequently Asked Questions: http://horde.org/faq/
>>>>>> To unsubscribe, mail: horde-unsubscribe at lists.horde.org
>>>>>
>>>>> You want to use the kronolith-import-icals script that comes  
>>>>> with Kronolith.
>>>>
>>>> This is correct, if you have shell access. If you don't, you  
>>>> should probably change to JSON as Jan suggests below. In newer  
>>>> versions of Horde we no longer support xmlrpc.
>>>>
>>>> Also:
>>>> 1) Don't set the port number in CURL when you use https://  
>>>> already in the URL.
>>>> 2) The proper method name would be "calendar.listCalendars", not  
>>>> "kronolith.listCalendars".
>>>>
>>>> So, for example (this is VERY rough and quickly done, so you  
>>>> might need to tweak some things):
>>>>
>>>>
>>>> function do_call($host, $method, $params) {
>>>>   $url = "https://$host";
>>>>   $header[] = "Content-type: application/json";
>>>>   $data = array('version' => '1.1', 'method' => $request);
>>>
>>> Sorry, this line should be (substitute $method for $request):
>>>   $data = array('version' => '1.1', 'method' => $method);
>>
>> sure - I found that ... works great! THANKS a lot!
>>
>> So now how about the other things:
>> *do I need to delete all events manually or may I beg for a purge  
>> to be implemented in the api?
>
> Use the calendar.deleteCalendar method.

I guess that should delete the calendar, not purge it? However I can't  
get that one to work ...

***
$request = 'calendar.deleteCalendar';

$params = array('calendar-id');

$response = do_call($host, $request, $params);
echo $response;
***

gives me:
{"version":"1.1","error":{"name":"JSONRPCError","code":999,"message":{"details":null,"logged":false}}}

>> *Can I import the events with the api yet?
>>
>> I tried that one - (function and host omitted)
>>
>> ***
>> $request = 'calendar.import';
>> $input = <<<EOF
>> BEGIN:VEVENT
>> UID:20160901T130000Z-123401 at host.com
>> DTSTAMP:20160110T1300Z
>> DTSTART:20160110T163000Z
>> DTEND:20160110T190000Z
>> SUMMARY:Test1
>> END:VEVENT
>> UID:20160902T130000Z-123401 at host.com
>> DTSTAMP:20160111T1300Z
>> DTSTART:20160111T163000Z
>> DTEND:20160111T190000Z
>> SUMMARY:Test2
>> END:VEVENT
>> EOF;
>> $params = array($input,'text/calendar','calendar-id');
>> $response = do_call($host, $request, $params);
>> echo $response;
>> ***
>>
>> which imported just the first event ... any chance to make it  
>> import many events with one call? I am afraid that I get a timeout  
>> for the script otherwise ...
>
>
> Correct, you can only import one VEVENT at a time.
>
> I'm confused by your statement about a timeout. A single event will  
> import faster than a large calendar. You are likely to get server  
> timeouts importing the full calendar at once.
>
>> I'd love to see a function like this:
>> public function import_many($content, $contentType, $calendar =  
>> null, $purge = FALSE)
>>
>> while it won't help me since my provider would not update Horde  
>> just for me ...

just for reference:
I was wrong - just as my string was - there was 1 BEGIN:VEVENT  
missing. Adding that missing part, I can import many events at once.

concerning timeout: I was refering to timeout of my php script, not  
the connection to the server within the php script. I guess it is  
faster if I send all events as 1 string than sending each event with a  
seperate call.
I guess I'm going to see how long it takes and in case of a problem  
break the string in parts. Since I don't need the ids afterwards  
should be OK like that.

regards



More information about the horde mailing list