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:
-
Öffnen Sie eine Konsole und wechseln Sie in das Verzeichnis
site/bin
Ihrer imperia -Installation (Entwicklungs- bzw. Zielsystem). -
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:
-
Ö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
-
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:
- 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
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 Sie0
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.