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

Michael J Rubinsky mrubinsk at horde.org
Thu Jan 21 18:06:07 UTC 2016


Quoting Daniel <horde at daniu.de>:

> 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 ...

Correct, which is the same thing that happens when you select the  
purge checkbox in the UI.


> ***
> $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}}}

This looks like it should work (assuming it's the correct calendar id  
and you have enough rights to remove it). Without details from the  
server's log it's hard to say why it's not.

>>> *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.

Ah. Great. Not sure why I thought that :)


> 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.

True. Though it takes longer on the server to process it. Probably not  
an issue, but keep that in mind (your host may have a too-low timeout  
configured on the server).

> 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
>
> -- 
> Horde mailing list
> Frequently Asked Questions: http://horde.org/faq/
> To unsubscribe, mail: horde-unsubscribe at lists.horde.org



-- 
mike
The Horde Project
http://www.horde.org
https://www.facebook.com/hordeproject
https://www.twitter.com/hordeproject
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5751 bytes
Desc: S/MIME Signature
URL: <http://lists.horde.org/archives/horde/attachments/20160121/264d7e20/attachment-0001.bin>


More information about the horde mailing list