Termine von EGroupware automatisch in Drupal einbinden

Um Termine von Egroupware in Drupal automatisch anzuzeigen, werden folgende Dinge benötigt:

Und die folgenden Drupal Plugins:

  • CCK
  • Views
  • FeedAPI
  • FeedAPI Mapper
  • Date, Calendar
  • iCal parser (Version 1.1, Version 2.0 benötigt eine andere Feed API und funktioniert daher nicht)

Einstellungen für EGroupware Für das exportieren des Kalenders aus EGr oupware wird das Modul “iCalSrv” benötigt. Es erstellt unter “http://domain.de/egroupware/icalsrv/icalsrv.php/username/events.ics" automatisch eine ics Datei. Der Pfad “http://domain.de/egroupware/" ist abhängig von der EGroupware Installation. Automatisches kopieren per Cronjob Das folgende Skript kopiert die icsDatei automatisch in das Verzeichniss der Webseite.

#
# Author: Tobias Gafner
#
# Copy Event ics from Egroupware

# Verzeichniss oeffnen
# PFAD HIER EINTRAGEN TODO
cd /srv/www/vhosts/…../

#alte datei deleten
rm events.ics

#neue holen
wget http://domain.de/egroupware/icalsrv/icalsrv.php/usernamehier/events.ics –http-user=usernamehier –http-passwd=passworthier

Die Zeile “/srv/www/vhosts/…../“ muss durch den Ort ersetzt werden, an dem die ics Datei auf der Webseite liegen soll. Die Webadresse muss ebenfalls angepasst werden. Durch die Angabe von user und passwd kann sich wget auf die gesicherte Seite einloggen. Daher muss usernamehier und passworthier ebenfalls ersetzt werden. Dabei entsprechenden die beiden Angaben, der Zugangsdaten von EGroupware. Danach muss unbedingt noch ein entsprechender Cronjob erstellt werden, welcher die sh Datei mit “sh /home/Order1/Order2/event.sh” aufruft. Dabei kann die Zeit z.B. auf alle 14 Minuten gestellt werden. Dadurch wird der Kalender bei einer Drupal Feed Aktualisierung von 15 Minuten, mindestens 1x davor aktualisiert. Die Crontab Einstellung für diesen Cronjob würde daher dann so aussehen: /13 * sh /…..event.sh Drupal Einstellungen Zuerst müssen die Plugins installiert werden und die Anleitung unter http://drupal.org/node/341716 befolgt werden. Der Pfad zur ics Datei kann dann z.B. http://domain.de/events.ics sein. Dazu muss dieser Ort aber im Shell Skript zum kopieren der ICS Datei angegeben werden. Die Minimale Refresh Periode kann dann auf 15 Minuten gesetzt werden. Probleme mit Zeitzonen Sollte der Export aus Egroupware eine falsche Zeitzone aufweisen, kann man mithilfe von folgender Java Klasse und Shell-Skript die Zeit entsprechend bearbeiten. Die Java Klasse addiert 2 Stunden zu jedem Termin hinzu. Durch das editieren der Variable timeadd kann dabei die Zeit erhöht oder reduziert werden. Wichtig ist, dass im Inhaltstyp Datum bei Drupal unter “Startseite » Verwalten»Inhaltsverwaltung » Datum” die Zeitzonenbehandlung auf “UTC” steht. Dies kann man durch klicken auf “Konfigurieren” ändern. In beiden Skripten müssen Pfade und Dateinamen entsprechend der eigenen Gegebenheiten editiert werden. Die Java Klasse kann auf jede Shell mit folgendem Code compiliert werden:

javac Start.java

Das Shell Skript wird dann anstatt des oben erwähnten Shell Skriptes verwendet:

#
# Author: Tobias Gafner
#
# Copy Event ics from Egroupware

cd /…/ #Pfad vo die Shell Datei liegt
wget http:/domain.de/egroupware/icalsrv/icalsrv.php/benutuzername/events.ics –http-user=benutzername –http-passwd=passwort

java Start
rm events.ics
cd /srv/www/vhosts/…/httpdocs/
rm events.ics
cp /…/eventr.ics /srv/www/vhosts/…/httpdocs/
mv eventr.ics events.ics
rm /…/eventr.ics

Die Java Klasse dazu sieht folgendermaßen aus:

/*
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;

/**
* @author tobi
/
public class Start {

/\*\*
 \* @param args
 */
public static void main(String\[\] args) {

    int timeadd = 2;
    //
    // Ausgabestrom in Datei erzeugen
    //
    // Eine lokale Ausgabedatei in eine Instanz in File kapseln.
    File ausgabeDatei = new File("eventr.ics");
    // FileWriter erzeugen.
    FileWriter fw;
    BufferedReader in;
    try {
        in = new BufferedReader(new FileReader("events.ics"));
        fw = new FileWriter(ausgabeDatei);
        // Den FileWriter in einem BufferedWriter verpacken.
        BufferedWriter bw = new BufferedWriter(fw);
        //
        // Zeilenweise einlesen
        //
        String zeile = in.readLine();
        while (zeile != null) {
            if (zeile.contains("DTSTART") || zeile.contains("DTEND")) {
                int pos = zeile.lastIndexOf("T");
                String time = zeile.substring(pos + 1, pos + 3);
                int stunde = Integer.valueOf(time);
                stunde += timeadd;
                boolean flag = false;
                GregorianCalendar cal = new GregorianCalendar();
                if (stunde > 23) {

                    int year = Integer.valueOf(zeile.substring(pos - 8,
                            pos - 4));
                    int month = Integer.valueOf(zeile.substring(pos - 4,
                            pos - 2));
                    int day = Integer
                            .valueOf(zeile.substring(pos - 2, pos));
                    cal.set(year, month-1, day);
                    cal.add(Calendar.DAY\_OF\_YEAR, +1);
                    stunde -= 24;
                    flag = true;
                }
                String newTime = String.valueOf(stunde);
                if (newTime.length() == 1)
                    newTime = "0" + newTime;
                String zeile2 = "";
                if (!flag) {
                    zeile2 = zeile.substring(0, pos + 1) + newTime
                            \+ zeile.substring(pos + 3);
                } else {
                    String month = String.valueOf(cal.get(Calendar.MONTH)+1);
                    String day = String.valueOf(cal.get(Calendar.DAY\_OF\_MONTH));
                    if (month.length() == 1)
                        month = "0" + month;
                    if (day.length() == 1)
                        day = "0" + day;
                    String endnewTime = cal.get(Calendar.YEAR)+month+day+"T"+newTime;
                    zeile2 = zeile.substring(0, pos -8) + endnewTime
                            \+ zeile.substring(pos + 3);

                }
                bw.write(zeile2);
            } else {
                bw.write(zeile);
            }
            bw.newLine();
            zeile = in.readLine();
        }
        in.close();
        bw.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}