Zum Inhalt

Hermes-Dienst

Der Hermes-Dienst ist ein Daemon, der in imperia für verschiedene Zwecke eingesetzt wird. Bei einem Daemon handelt es sich um einen Prozess, der ununterbrochen im Hintergrund ausgeführt wird und nach einem bestimmten Zeitplan oder aufgrund bestimmter Systemereignisse definierte Funktionen ausführt. Die auszuführenden Funktionen können auf mehrere Hermes-Worker aufgeteilt werden, sodass die Aufgabenliste parallel und nicht nacheinander abgearbeitet wird.

Der Daemon von imperia wird durch die Skripte /site/bin/site_hermes_unix.pl bzw. /site/bin/site_hermes_win.pl und /site/bin/site_hermes.pl repräsentiert und zeichnet sich durch einen modularen Aufbau aus. Alle Funktionen sind in externe Plug-ins ausgelagert. Daraus ergibt sich ein Maximum an Flexibilität und Skalierbarkeit.

Er ist für alle automatischen Funktionen sowohl auf dem Entwicklungssystem als auch auf den Zielsystemen von imperia verantwortlich. Dazu gehören die Überwachung von Verzeichnissen, die Ausführung von Systemdiensten und SiteActives.

Für Testzwecke ist es sinnvoll, den Daemon bei Bedarf zu starten. Er bietet zusätzlich einen Debug-Modus zur Fehlersuche, die Sie durch eine entsprechende Kommandozeilenoption aktivieren können.

Die Ausführungseigenschaften der einzelnen Funktionen der Plug-ins werden in einer Tabelle gespeichert, die darüber Auskunft gibt, wann und unter welchen Bedingungen ein Plug-in ausgeführt wird.

Tipp

Eine generelle Dokumentation findet sich unter: site/config/hermes.conf.sample

In der Installationsdoku finden Sie auch wichtige Informationen zur hermes.conf.


Starten des Hintergrund-Daemons Hermes#

Es empfiehlt sich, den Daemon im Hintergrund auszuführen. Unter Windows®-Betriebssystemen ist die zusätzliche Registrierung des Daemons als Systemdienst empfehlenswert. Der Hermes-Daemon muss auf dem Entwicklungssystem und auf den Zielsystemen laufen.


Starten des Daemons unter UNIX®#

Unter UNIX® sollte Hermes im Hintergrund beim Starten des Systems ausgeführt werden. Um den Hintergrund-Daemon manuell unter UNIX® zu starten, gehen Sie wie folgt vor:

  1. Öffnen Sie eine Konsole und wechseln Sie in das Verzeichnis site/bin Ihrer imperia -Installation (Entwicklungs- bzw. Zielsystem).

  2. Geben Sie dort folgenden Befehl ein:

    nohup ./site_hermes_unix.pl &
    

Starten des Daemons unter Windows®#

Um den Hintergrund-Daemon unter Windows® manuell zu starten, gehen Sie wie folgt vor:

  1. Öffnen Sie eine DOS-Box und wechseln Sie in das Verzeichnis site\bin Ihrer imperia-Installation (Entwicklungs- bzw. Zielsystem). Geben Sie folgenden Befehl ein:

    perl site_hermes_win.pl
    
  2. Lassen Sie die DOS-Box geöffnet.


Der Daemon als Systemdienst unter Windows®#

Wichtig

Alle benötigten Dateien finden Sie im Verzeichnis site/util/XYNTService der imperia-Installation.


Installation#

Das Programm 'XYNTService' bietet die Möglichkeit, den Hermes als Systemdienst im Hintergrund unter Windows zu starten. Dafür ist die Anpassung der Datei 'XYNTService.ini' von Nöten, welche sich im Verzeichnis des Programms befinden muss:

Beispiel Konfiguration der XYNTService.ini

  • Anzupassen sind hier die Einträge 'CommandLine' und 'WorkingDir' um den Dienst an die Systemumgebung anzupassen.
  • Weiterhin besteht die Möglichkeit, den Eintrag 'PauseEnd' nach Gebrauch zu verändern:
    'PauseEnd' definiert die Zeit in Millisekunden, die bei einem Stopp des Dienstes oder dem Herunterfahren des Systems dem Dienst (Hermes) verbleibt, um den Prozess ordentlich zu beenden.
    • Im Beispiel werden 600000 Millisekunden gewählt, was 10 Minuten entspricht. Allerdings kann dieser Wert nicht ausreichend sein, falls das Hermes-Skript zu sehr ausgelastet ist.
    • Verstreicht die Zeit, wird das Hermes-Skript vom Programm 'XYNTService.exe' umgehend beendet.
  • Um den Systemdienst zu installieren, öffnen Sie eine DOS-Box, wechseln in das Verzeichnis, indem das Programm 'XYNTService.exe' liegt und geben folgenden Befehl ein:

    XYNTService.exe -i

  • Wenn der Dienst erfolgreich installiert wurde, finden Sie im Windows Service Manager den Dienst 'Hermes' (der Name wird durch den Eintrag 'ServiceName' der 'XYNTService.ini' definiert ) in der Liste der Dienste vor.
    Bei jedem Windows-Start wird der Dienst nun gestartet.

  • Der Dienst kann auch manuell im Windows Service Manager oder durch folgenden Befehl einer DOS-Box gestartet werden:

    net start Hermes


Deinstallation#

Möchten Sie den Systemdienst entfernen, öffnen Sie eine DOS-Box, wechseln in das Verzeichnis, indem sich das Programm 'XYNTService.exe' befindet und geben folgenden Befehl ein:

XYNTService.exe -u

Wenn der Dienst erfolgreich deinstalliert wurde, ist der Eintrag 'Hermes' definiert durch den Eintrag 'ServiceName' der 'XYNTService.ini') in der Liste der Systemdienste im Windows Service Manager verschwunden.


Kommandozeilenoptionen#

Über teilweise betriebssystemspezifische Kommandozeilenoptionen können Sie die Funktionsweise des Daemons beeinflussen.


Verwendung#

site_hermes_unix.pl [OPTIONS] | site_hermes_win.pl [OPTIONS]

Nutzen Sie die folgende Zeile um die Hilfe des Skripts einzusehen, in der alle verfügbaren Optionen angezeigt werden:

site_hermes_unix.pl -h, --help | site_hermes_win.pl -h, --help

Log File#

Alle Aktivitäten des Daemons werden in der Log-Datei hermes.log im Verzeichnis site/logs Ihrer imperia-Installation protokolliert. Abhängig vom eingestellten Debug-Modus können Menge und Art der protokollierten Informationen stark variieren. Hier ein typischer Ausschnitt aus einer Log-Datei:

[Wed Jun 10 16:07:17 2011] HERMES IS RUNNING ...
[Wed Jun 10 16:07:18 2011] Hermes running with pid 3516
[Wed Jun 10 16:07:18 2011] FOUND 8 PLUGINS (SiteActive, ArchiveMinimizer,
     Import, ExpiryDate, CleanUp, MessageCheck, LogRotate, AutoPublish)
[Wed Jun 10 16:07:18 2011] SCHEDULING PLUGINS
[Wed Jun 10 16:07:18 2011] SUCCESSFULLY LOADED PLUGIN SiteActive
[Wed Jun 10 16:07:18 2011] SUCCESSFULLY LOADED PLUGIN ArchiveMinimizer
[Wed Jun 10 16:07:18 2011] SUCCESSFULLY LOADED PLUGIN Import
[Wed Jun 10 16:07:18 2011] SUCCESSFULLY LOADED PLUGIN ExpiryDate
[Wed Jun 10 16:07:18 2011] SUCCESSFULLY LOADED PLUGIN CleanUp
[Wed Jun 10 16:07:18 2011] SUCCESSFULLY LOADED PLUGIN MessageCheck
[Wed Jun 10 16:07:19 2011] SUCCESSFULLY LOADED PLUGIN LogRotate
[Wed Jun 10 16:07:19 2011] SUCCESSFULLY LOADED PLUGIN AutoPublish
[Wed Jun 10 16:07:19 2011] STARTUP DONE

HERMES IS RUNNING ...
[Wed Jun 10 16:07:19 2011] [MessageCheck] Processing notification
                           '469df2e40360bf2.free'
[Wed Jun 10 16:07:19 2011] [MessageCheck] Processing notification
                           '469df2e403606e0.free'
[Wed Jun 10 16:07:19 2011] [MessageCheck] Processing notification
                           '469df2e40360f41.free'
[Wed Jun 10 16:07:19 2011] [Import] looking for configuration file
                           C:/imperia/dev/sanne/site/config/import.conf
[Wed Jun 10 16:07:19 2011] [Import] not found, falling back to hardcoded
                           defaults
[Wed Jun 10 16:07:19 2011] [Import] successfully (re)initialized plugin
                           Ascii
[Wed Jun 10 16:07:19 2011] [Import] successfully (re)initialized plugin
                           ImperiaXML
[Wed Jun 10 16:07:19 2011] [Import] successfully (re)initialized plugin
                           Meta
[Wed Jun 10 16:07:49 2011] SCHEDULING HERMES FOR QUIT ...
[Wed Jun 10 16:07:50 2011] EXIT SIGNAL RECEIVED.
[Wed Jun 10 16:07:50 2011] HERMES IS GOING AWAY...
[Wed Jun 10 16:07:50 2011] TERMINATING PID: 2912

Hinweis

Obenstehender Dateiauszug ist aus Darstellungsgründen umgebrochen.

Die Prozess-ID des Daemons wird zusätzlich in der Datei hermes.pid im Verzeichnis site/logs gespeichert. In der Regel existiert diese Datei nur, wenn der Daemon läuft. Sie wird gelöscht, sobald der Daemon normal beendet wird.


Plug-in-Tabelle#

Beim ersten Start des Daemons werden alle gefundenen Plug-ins in die Ausführungstabelle aufgenommen. Jede Funktion eines Plug-ins erhält eine inkrementelle ID (z.B. hermes_0, hermes_1, hermes_2 ) anhand derer sie eindeutig identifiziert werden kann.

Die Tabelle enthält neben dem Namen (NAME), der Funktion (FUNCTION) und der ID (ID) alle weiteren Eigenschaften des Plug-ins. Hierzu gehören: die Ausführungszeit (EXEC_TIME), die maximale Laufzeit (MAX_RUNTIME), die Priorität (PRIORITY), der Zeitpunkt der letzten Ausführung (LAST_RUN).

Die Einträge in der Plug-in-Tabelle werden nach Ausführungspriorität aufgelistet. Die Spalte der Ausführungszeit (EXEC_TIME) lässt mehrere Eintragformate zu: Zeitintervall in Sekunden (e.g. 300 => 5 minutes, 0 => always), fester Zeitpunkt in hh:mm[:ss] ( e.g. '0:00' => midnight), keine Ausführung aufgrund der Kennung no.

Die Tabelle bleibt nach der initialen Erstellung auch bei Beendigung des Daemons gültig.

Plug-ins werden nur beim Start des Hintergrund-Daemons geladen.
Um ein Plug-in zu entfernen, muss der Hintergrund-Daemon angehalten werden. Danach kann man das entsprechende Plug-in aus dem Verzeichnis site/modules/core/Dynamic/Hermes entfernen und den Hintergrund-Daemon wieder starten.

Um die Liste der verfügbaren Plug-ins und die Aufgaben im System zu erhalten, rufen Sie das Skript site/bin/site_hermes_plugins_list.pl auf.
Alternativ können Sie auch die Datei hermes.conf erstellen:

    perl site/bin/site_hermes_plugins_list.pl > site/config/hermes.conf

Hermes-Worker#

Hermes-Worker können einerseits für ein Plug-in reserviert werden, sodass der Hermes-Worker nur dessen Aufgaben abarbeitet, andererseits ist es bei einigen Plug-ins möglich, deren Aufgaben auf mehrere Worker zu verteilen.

Eine Aufgabe ist dabei die Kombination aus Plug-in und Methode (Funktion).
Jede Instanz (Hermes-Worker) kann eine oder mehrere Aufgaben durchführen (abhängig von der site/config/hermes.conf). Eine Instanz ist dabei der Prozess, der durch ein Hermes-Skript gestartet wird.

Wichtig

Stellen Sie sicher, dass unterschiedliche Instanzen nicht dieselben Aufgaben enthalten.

Entsteht ein Problem mit einem Hermes-Worker, wird der komplette Hermes-Dienst gestoppt.

Konfiguration in hermes.conf#

Die Konfiguration von Hermes-Worker findet in der Datei site/config/hermes.conf statt. Bei der Installation von oder beim Update auf imperia 10.2 wird die Konfigurationsdatei automatisch mit den vorhanden Hermes-Plug-ins befüllt. Allerdings werden dabei auch alle Plug-ins nur einem Worker zugeordnet.

Hinweis

Nur in der Konfiguration definierte Aufgaben werden durchgeführt, es sei denn, das Hermes-Starter-Skript wird mit dem Parameter --all_tasks durchgeführt.

Die Konfiguration mehrerer Hermes-Worker müssen Sie selbst vornehmen. Dabei können Sie sich an der mitgelieferten Datei site/config/hermes.conf.sample orientieren.

Für jede Instanz wird ein separater Prozess gestartet. Mehrere Instanzen können dabei gleichzeitig laufen.
Jede Aufgabe in einer Instanz besteht aus einem Plugin-in und dem Funktionsnamen, die gemeinsam die auszuführende Methode der Instanz definieren.

Die Definition einer Instanz besteht aus einem Block mit einem eindeutigen Namen, einem Options-Tag sowie einer Liste von auszuführenden Hermes-Plug-in-Funktionen.

  • Für jede parallel ausgeführte Instanz muss der folgende Block definiert werden:

    <instance NAME>
    </instance>
    
  • Am Anfang eines jeden Instanzblocks gehört ein <options></options>-Block der - falls er leer ist - automatisch mit den folgenden Standardeinstellungen gefüllt wird:

    <options>
         sleep = 6
         table = 0
         exit = 0
         verbose = 0
         debug = 0
         pdebug = 0
    </options>
    
    • sleep enthält eine ganze Zahl, da es die Sekunden bis sleep angibt
    • Alle anderen Werte sind true/false-Werte.
  • Danach werden die tatsächlich in der Instanz ausgeführten Plug-ins sowie die dort aufgerufenen Funktionen definiert, z.B:

    <plugin Export>
        <function export>
        # MAX_RUNTIME = 1000000
        # EXEC_TIME   = 0
        # PRIORITY    = 20
        </function>
    </plugin>
    
    • MAX_RUNTIME: definiert nach wie vielen Sekunden die Aufgabe unterbrochen wird, damit die anderen Aufgaben in der Instanz gestartet werden können.
    • EXEC_TIME: Hier werden die Sekunden nach der letzten Ausführung angegeben, ab dann die Aufgabe erneut ausgeführt werden soll, z.B. 60.
      Damit die Aufgabe immer durchgeführt wird, geben Sie 0 an.
    • PRIORITY: gibt die Reihenfolde der auszuführenden Aufgaben innerhalb der Instanz an.

Andere Plug-in-Beispiele:

  • <plugin MessageCheck>: Mithilfe des MessageCheck-Plug-ins können Sie die zuletzt veränderten bzw. gelöschten Dokumente registrieren.
    Auch wird dieses Plug-in für den SQL-Export eingesetzt.

    Hinweis

    Bedenken Sie hier jedoch, dass imperia auch zeitgesteuert Systemdienste antriggert.

  • SiteActive(SA)-Plug-in: Das SA-Plug-in führt nicht die SA-Jobs aus, sondern speichert/nimmt diese in eine Datenbank, die von einem zusätzlichen SA-Worker-Plug-in ausgeführt werden (ähnlich zu Systemdienstschema.


Hermes-Import#

Für den Import von Daten mit Hilfe des Hintergrund-Daemons Hermes sind im Lieferumfang von imperia mehrere Plug-ins für verschiedene Formate enthalten. Der Hermes enthält eine fest programmierte Standard-Import-Konfiguration, mit der die Einstellungen für diese Standard-Formate festgelegt werden.
Folgende Formate können importiert werden:

  • ASCII-Dateien mit der Endung .simple,
  • XML-Dateien, die nach dem Schema *.xml benannt sind,
  • imperia-Metadateien mit der Endung .meta.

Um andere Formate zu importieren, muss ein entsprechendes Import-Plug-in programmiert und die Standard-Import-Konfiguration erweitert werden. Die geänderte Konfiguration muss in der Datei /site/config/import.conf gespeichert werden.

Bitte beachten

  • Diese Datei existiert nach der Installation nicht, sondern muss angelegt werden, da die Standard-Import-Konfiguration fester Bestandteil des Moduls /site/modules/core/Dynamic/Hermes/Import.pm ist.
  • Die in der Datei import.conf eingestellte Konfiguration überschreibt die Standard-Import-Konfiguration.
  • Soll neben der neuen Konfiguration die Standard-Import-Konfiguration erhalten bleiben, muss diese aus dem Modul in die import.conf kopiert werden.

Alle importierten Dokumente enthalten nach dem Import eine zusätzliche Meta-Variable __imperia_imported, dessen Wert ein Zeitstempel ist, der die Anzahl der Sekunden seit einem bestimmten Zeitpunkt (Epoche) enthält. Dieser Zeitpunkt ist auf den meisten Systemen der 1. Januar 1970, 00:00 GMT.


Standard-Import-Konfiguration des Hermes-Daemons#

Die Standard-Import-Konfiguration enthält Abschnitte für alle im Lieferumfang von imperia enthaltenen Import-Plug-ins. Jedes Format wird in der Konfigurationsdatei in einem filetype-Tag definiert. Dieses Tag muss folgende Tags enthalten:

  • Ein mask-Tag, das einen Regulären Ausdruck enthält, der mit dem Namen der zu importierenden Dateien verglichen wird.

  • Ein plugin-Tag, das den Namen des zu verwendenden Plug-ins enthält.

  • Ein optionales data-Tag, mit dem andere Daten an das Plug-in übergeben werden können.

Hinweis

Es ist nur ein data-Tag je filetype-Tag erlaubt. Weitere data-Tags werden ignoriert.

Die Standard-Import-Konfiguration ist wie folgt:

<?xml version="1.0" encoding="us-ascii"?>
<import_config>

  <filetype>
    <mask>^.*\.simple$</mask>
    <plugin>Ascii </plugin>
    <data>zusätzliche Daten für das ASCII-Plug-in</data>
  </filetype>

  <filetype>
    <mask>.*/red[^/]*\.xml$</mask>
    <plugin>ImperiaXML </plugin>
    <data>zusätzliche Daten für das ImperiaXML-Plug-in</data>
  </filetype>

  <filetype>
    <mask>^.*\.meta$</mask>
    <plugin>Meta</plugin>
    <data>zusätzliche Daten für das Meta-Plug-in</data>
  </filetype>
</import_config>

Mit dieser Import-Konfiguration können folgende Formate importiert werden:

  • ASCII-Dateien, die auf .simple enden und durch das ASCII-Plug-in verarbeitet werden.

  • XML-Dateien, die auf den Regulären Ausdruck .*/red[^/]*\.xml$ passen und durch das Imperia-XML-Plug-in verarbeitet werden.

  • imperia -Meta-Dateien, die auf .meta enden und durch das Meta-Plug-in verarbeitet werden.

Sollen andere Formate importiert werden, muss die Konfiguration angepasst werden. Für jedes weitere Format muss ein entsprechendes Plug-in vorhanden sein.

Zur Programmierung eigener Plug-ins empfiehlt sich die Datei /site/modules/core/Dynamic/Import/Ascii.pm als Einstiegshilfe.


Zielrubrik bestimmen#

Ein häufiger Grund für das Fehlschlagen des Imports ist das Fehlen der Rubrikinformationen, sodass imperia nicht entscheiden kann, in welche Rubrik ein Dokument importiert werden soll.

Plug-ins entscheiden dies aufgrund des Inhalts des data-Tags in der Konfigurationsdatei, wobei versucht wird, die dort gefundenen Informationen zuerst der Meta-Variablen __imperia_category (Name der Rubrik) und, wenn dies fehlschlägt, der Meta-Variablen __imperia_node_id (Ziffernfolge) zuzuordnen.

Enthält die Konfigurationsdatei keine Informationen über die zu verwendende Rubrik, prüft imperia, ob in den zu importierenden Dateien jeweils eine Rubrik angegeben ist. Ist dies nicht der Fall, schlägt der Import fehl und Hermes liefert eine Fehlermeldung.

Existieren im Rubrikenbaum mehrere Rubriken mit dem gleichen Namen, verwendet Hermes die erste passende Rubrik. Um eine bestimmte Rubrik zu verwenden, muss diese über die Node-ID eindeutig identifiziert werden.

Eine NodeID besteht aus zwei Teilen:

  • der Rubrik-ID, zum Beispiel /12/24/35/

  • der Dokument-ID, zum Beispiel 130336.

Die vollständige Node-ID aus diesen beiden Teilen stellt sich wie folgt dar: /12/24/35/130336. Sowohl die Dokument-ID als auch jeder einzelne Abschnitt der Rubrik-ID sind garantiert eindeutig, da imperia sie aus einem automatisch inkrementierten Zähler generiert.

Enthält die Meta-Variable __imperia_node_id eine gültige NodeID, wird die Rubrik aus dieser Information gebildet, wobei die Dokument-ID nicht beachtet wird. Die Dateien werden dann in die gefundene Rubrik importiert.


Vorhandene Dokumente beim Import mergen#

Neben der Möglichkeit, Dokumente anhand der NodeID in die richtige Zielrubrik zu importieren, gibt es zwei weitere Meta-Variablen, die dazu verwendet werden können, vorhandene und importierte Dokumente zu "mergen":

  • __imperia_clobber_by_name = 1 | 0

  • __imperia_clobber_by_id = nodeID, z. B. /1/2/3

Wenn Sie die Meta-Variable __imperia_clobber_by_name aktivieren, indem Sie sie auf 1 setzen, wird im Dokumenten-Baum nach einem Dokument gesucht, dass die gleiche URL wie das zu importierende Dokument hat. Wird ein solches Dokument gefunden, werden die beiden zusammengeführt, d. h. alle zusätzlichen Informationen aus der XML-Datei werden als Meta-Felder in Meta::Info des bereits im Archiv existierenden Dokumentes geschrieben.

Die Meta-Variable __imperia_clobber_by_id hat die gleiche Funktion, hierbei wird jedoch nicht nach einer URL, sondern nach einer NodeID gesucht. Diese Alternative ist schneller als die Suche nach der URL.

In beiden Fällen wird nur die ausgewählte Rubrik (siehe Zielrubrik bestimmen) durchsucht.


Aufbau der Import-Daten#

In diesem Abschnitt wird das jeweilige Format der Dateien beschrieben, die mit den Standard-Import-Plug-ins importiert werden können.


ASCII-Import#

Eine Datei, die durch das ASCII-Import-Plug-in importiert werden soll, muss aus Schlüssel-Wert-Paaren bestehen, wobei Schlüssel und Wert durch Gleichheitszeichen voneinander getrennt werden. Beispiel:

filename = index.html
directory = /import/ascii
title = Import-Test
metapage = movies
author = superuser
docid = 131875
__imperia_node_id = /4/10
expiry_date = 2012-03-11 10:06

XML-Import#

Eine Datei, die mit Hilfe des imperia-XML-Plug-ins importiert werden soll, muss für jedes Meta-Feld ein entsprechendes Tag beinhalten, das wiederum den Wert des Meta-Feldes enthalten muss.

Beispiel:

<?xml version="1.0" encoding="ASCII" standalone="yes"?>
<IMPERIA_CONTENT>
  <filename>index.html</filename>
  <directory>/import/xml</directory>
  <title>Import-Test</title>
  <metapage>movies</metapage>
  <author>superuser</author>
  <docid>131876</docid>
  <__imperia_node_id>/4/11<!--__imperia_node_id-->
  <expiry_date>2012-03-11 10:06</expiry_date>
</IMPERIA_CONTENT>

Meta-Import#

Bei imperia-Metadateien handelt es sich um Binärdateien, die nicht ohne Weiteres von Hand erzeugt werden können. Dieser Import wird dazu verwendet, bereits bestehende imperia-Dokumente von einer imperia-Installation in eine andere (auf Basis der gleichen Programm-Version) zu übertragen.