Recently I got annoyed by the fact I have a Google account with only one purpose, to have a calendar which I can share with my wife. In the past I worked with Exchange and even with Zarafa but both didn’t make me happy. This also because at home I used to be full time Linux user (and since one year fully on Apple) and both Exchange and Zarafa seems to have trouble with Linux.
So, I started to search for a free (and preferable open source) alternative. Running a Debian/Ubuntu server at home so looking within the default repositories for a decent calendar. I found the ‘calendarserver’ package with the description “Apple calendar server”. Sounds promising. The configuration is done entirely by XML. For some reason I couldn’t get it working. Errors and when I finally created a working configuration, it simply didn’t work. So, the search went on.
Next stop was a program called Davical. Davical is a CalDAV calendar server based on Postgresql. Besides that, it’s very good documented .
Installation can be done in a few easy steps. This is the installation based on Ubuntu 11.04. You can read the whole how to on the website of davical.
After this, it works flawless. Apple’s iCal and iPhone both work splendid with this (configure it as CalDav) and even iCal can read all calendars you have access to. Thunderbird’s Lightning is also working, but it needs the whole url to your calendar (iCal can figure this out… Perhaps a feature request for Lightning?)
After this great success I could remove the whole Google Calendar. Best of all that Google Calendar can export the whole calendar and davical can import it!
Next step was to introduce Davical at my work. It took me almost a week because of problems with the latest Davical. At this moment, Davical 0.9.9.7 is working with less problems than the latest 1.0.1. On my home server, I don’t have issues for I’m not using OpenLDAP (which we use at work). The problems are the OpenLDAP. The synchronizing just don’t work.
To give you an idea, this is the configuration of davical on our work:
$c->domain_name = “domain.name.isp.nl”;
$c->admin_email = “firstname.lastname@example.org”;
$c->system_name = “ISP Calendar Server”;
$c->authenticate_hook[‘optional’] = false;
$c->do_not_sync_from_ldap = array( ‘admin’ => true, ‘ldapmanager’ => true, ‘ex-werknemers’ => true );
$c->default_privileges = array(‘read-free-busy’, ‘schedule-query-freebusy’);
$c->pg_connect = “dbname=davical port=5432 user=davical_app”;
$c->authenticate_hook[‘call’] = ‘LDAP_check’;
$c->authenticate_hook[‘config’] = array(
‘host’ => ‘ldap.isp.nl’,
‘port’ => ‘389’,
‘filterUsers’ => ‘gidNumber=10000’, // we need this to successfully search users
‘baseDNUsers’ => ‘dc=isp’, // most orgs have more fields
‘baseDNGroups’ => ‘ou=group,dc=signet’, //where to look for groups
‘filterGroups’ => ‘objectClass=posixGroup’, //filter with same rules as filterUsers, could also be groupOfUniqueNames
‘protocolVersion’ => 3,
‘mapping_field’ => array(“username” => “uid”,
“updated” => “modifyTimestamp”,
“fullname” => “cn”,
‘user_no’ => ‘uidNumber’,
“email” => “Email”
), //used to create the user based on his LDAP properties
‘format_updated’=> array(‘Y’ => array(0,4),
‘m’ => array(4,2),
‘d’ => array(6,2),
‘H’ => array(8,2),
‘M’ => array(10,2),
‘S’ => array(12,2)), // map LDAP “modifyTimestamp” field to SQL “updated” field
‘group_mapping_field’ => array(‘username’ => ‘cn’,
‘updated’ => ‘modifyTimestamp’,
‘fullname’ => ‘cn’ ,
), //used to create the group based on the ldap properties
‘scope’ => ‘subtree’, // Search scope to use, defaults to subtree ( applies to BOTH user and group mappings )
I put this here because at work we created the system at work using OpenLDAP and LDAP Account Manager. The base is created with the LDAP Account Manager and I couldn’t find any example. This one is working (so Google, index this! 😉 )
So, Davical is really a good piece of software. If you don’t trust Google for your calendar work, make your own. It’s easy and with a simple and free CACert you can make it SSL yourself !
And if you are planning to it together with OpenLDAP. Use an older version (0.9.9.7 at this moment) because of weird bugs in the latest. Hopefully they will fix it in 1.0.2!