Überwachung Client/Gateway-Service

Anforderung

Beim Betrieb grösserer print2forms-Installationen kommt bei dem einen oder anderen Administrator der Wunsch auf, darüber informiert zu werden, wenn einer der Drucker oder eines der Gateways in einen Zustand gerät, der ein manuelles Eingreifen erforderlich macht, wie im einfachsten Fall ein Papierstau oder fehlender Toner.

Im Kontrollfeld des Client/Gateway-Services sind diese Informationen sichtbar, aber das Kontrollfeld kann aus technischen Gründen nicht von einem anderen Rechner aus aufgerufen werden. Von daher ergibt sich die Frage, ob und wie eine Benachrichtigung z.B. via E-Mail realisiert werden kann.

Realisierung

Beginnend mit dem Build 55 des eigentlichen Services (der Datei p2fService.exe) wird ein Teil eines Überwachungs­mechanismus unterstützt, dessen vollständige Realisation erst in der Version 4 von print2forms enthalten sein kann.

Dieser Überwachungsmechanismus prüft alle 30 Sekunden den Zustand der aktuell konfigurierten Clients und Gateways. Alle Zustände, die nicht als normaler Betriebszustand (Angehalten, Bereit, Druckt) angesehen werden, werden in Form eines Ereignisses 1018 gemeldet, welches in das Ereignisprotokoll Anwendung des Windows-Systems eingetragen wird.

Dabei wird nicht jeder Fehlerzustand einzeln gemeldet, sondern es wird eine Fehlerliste für den gesamten Client/Gateway-Service erstellt. Erst wenn sich der Zustand mindestens eines Client oder Gateways ändert, wird wieder das Ereignis ausgelöst. Das bedeutet auch, dass die Behebung des einzigen oder letzten Fehlerzustands ein Ereignis (mit einer leeren Fehlerliste) erzeugt.

Zusammen mit der Möglichkeit, beim Eintritt eines Ereignisses im Windows-System ein Programm oder Skript zu starten, kann damit eine effektive, weil automatische Überwachung realisiert werden.

Wie mit dem Eintritt eines bestimmten Ereignisses ein Programm oder Skript gestartet wird, ist ausführlich in den Tips Überwachung von print2forms (für Windows XP, Windows Server 2003) und in Überwachung von print2forms II (für Windows 8, 8.1, 10 und Windows Server 2012, 2016, 2019 für genau diesen Fall) beschrieben. Hier soll nur gezeigt werden, wie konkret auf das Ereignis 1018 des Client/Gateway-Services reagiert werden kann.

Fehlerliste

Wie bereits angesprochen, erzeugt der Client/Gateway-Service eine Fehlerliste, die Bestandteil der Nachricht ist, die mit dem Ereignis 1018 mitgeliefert wird. Schaut man sich solch ein Ereignis in der Windows Ereignisanzeige an, ist die Fehlerliste der Text, der mit dem Wort Statusaenderung: beginnt.

Sind mehrere Clients oder Gateways betroffen, enthält die Liste entsprechend viele Zeilen.

Statusaenderung: 
PRT Systemdrucker
PAP Produktion/Halle 1
PAP Produktion/Halle 2

Dabei ist der konkrete Fehlerzustand in Form eines mnemonischen Kürzels aus drei Grossbuchstaben am Anfang der Zeile kodiert. Dahinter folgt, mit einer Leerstelle abgetrennt, der Name des Clients oder des Gateways, so wie er auch im Kontrollfeld angezeigt wird. Eventuell in Subcontainer abgelegte Drucker erscheinen mit ihrem kompletten Pfad.

Skript

Mit Hilfe eines sehr überschaubaren Skripts kann diese Fehlerliste in eine für jedermann verständliche E-Mail konvertiert werden. Im Skript wird dazu das Ereignisprotoll ausgelesen und nach dem letzten Ereignis 1018 gesucht. Dessen Fehlerliste wird Zeile für Zeile abgearbeitet. Die Kürzel aus der Fehlerliste werden in Klartext übersetzt (Liste im Skript ist vollständig). Ergebnis der Bearbeitung ist zum einen eine Zeichenkette mit dem Klartext (in der Datei 'Mail.txt') und eine HTML-Tabelle (in der globalen Variablen '$Tabelle').

p2fEvents.pl
#!/usr/bin/perl
 
use Win32::EventLog;
use MIME::Lite::TT::HTML; 
use strict;
 
my $Tabelle = "";
 
#---------------------------------------------------------------------------#
 
sub GetEvents
  {
    my ($recs, $base, $off, $hashRef, $Event, $Status);
 
    my $handle=Win32::EventLog->new("Application", $ENV{ComputerName});
    $handle->GetNumber($recs);
    $handle->GetOldest($base);
 
    $off = $recs - 1;
 
    while ($off >= 0) 
      {
        $handle->Read(EVENTLOG_BACKWARDS_READ | EVENTLOG_SEEK_READ,
                      $base + $off,
                      $hashRef);
 
        if ($hashRef->{Source} eq "p2fService")
          {
            Win32::EventLog::GetMessageText($hashRef);
 
            my $Msg = $hashRef->{Message};
            my $Event = $hashRef->{EventID} & 1073741823;
 
            if ($Event == 1018)
              {
                my @lines = split /\n/, $Msg;
 
                open (MAIL, ">Mail.txt");
 
                foreach my $line (@lines)
                  {
                    if ($line =~ /^[A-Z]{3}/)
                      {
                        $Status = "";
 
                           if ($line =~ /ERR (.*)./) { $Status = 'Fehler'; }
                        elsif ($line =~ /LIC (.*)./) { $Status = 'Lizenzfehler'; }
                        elsif ($line =~ /PRT (.*)./) { $Status = 'Druckerfehler'; }
                        elsif ($line =~ /SPC (.*)./) { $Status = 'Debug'; }
                        elsif ($line =~ /INT (.*)./) { $Status = 'Eingriff erforderlich'; }
                        elsif ($line =~ /JAM (.*)./) { $Status = 'Papierstau'; }
                        elsif ($line =~ /PAP (.*)./) { $Status = 'Kein Papier'; }
                        elsif ($line =~ /TON (.*)./) { $Status = 'Tonerstand niedrig'; }
                        elsif ($line =~ /OFL (.*)./) { $Status = 'Nicht betriebsbereit'; }
                        elsif ($line =~ /COV (.*)./) { $Status = 'Abdeckung offen'; }
                        elsif ($line =~ /NET (.*)./) { $Status = 'Netzwerkfehler'; }
                        elsif ($line =~ /FUL (.*)./) { $Status = 'Ausgabefach voll'; }
 
                        if ($Status ne "")
                          {
                            $Tabelle .= '<tr><td>' . $Status . '</td><td>' . $1 . "</td></tr>\n";
                            printf MAIL "%-21.21s %s\n", $Status, $1;
                          }
                      }
                  }
 
                close (MAIL);
 
                return ($Tabelle eq "") ? 0 : 1;
              }
          }
 
        $off--;
      }
 
    return 0;
  }
 
#---------------------------------------------------------------------------# 
 
chdir ("C:\\Users\\Public\\Documents\\SPE Systemhaus GmbH\\print2forms\\p2fScript");
 
if (GetEvents ())
  {   
    my %params = (Tabelle => $Tabelle);
    my %options = (die_on_bad_params => 0); 
 
    my $msg = MIME::Lite::TT::HTML->new(From        => 'p2f@spe-systemhaus.de',
                                        To          => 'spe@spe-systemhaus.de', 
                                        Subject     => 'Statusänderung Client / Gateway-Service', 
                                        Encoding    => 'quoted-printable',
                                        Template    => {
                                                         html => "Mail.html",
                                                         text => "Mail.txt"
                                                       },
                                        Charset     => 'iso8859-1',
                                        TmplOptions => \%options, 
                                        TmplParams  => \%params);
 
    MIME::Lite->send('smtp', "10.1.1.9", Timeout=>60);
 
    $msg->send;
  }
 
exit 0;


Zum Senden der E-Mail wird das Paket MIME::Lite::TT::HTML verwendet, welches eine E-Mail mit einem Text-Teil und einem HTML-Teil erzeugen kann. Dabei können im HTML-Teil Textersetzungen für variable Bestandteile der E-Mail vorgenommen werden.

Der HTML-Teil der E-Mail besteht aus der unten abgebildeten Datei Mail.html. In diesem Fall hier wird die Tabelle mit den Druckern und deren Stati eingesetzt (an Stelle des Tags '[% Tabelle %]').

Die Absender- und Empfängeradresse für das E-Mail, das Arbeitsverzeichnis sowie die Angaben zum eigenen E-Mail-Server sind selbstredend an die eigenen Bedürfnisse anzupassen.

Mail.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>Statusänderung Client/Gateway-Service</title>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  </head>
 
  <body style="font-size: 70%; font-family: Verdana, Arial, Helvetica, MS Sans Serif; padding: 0px; margin: 0px;">
 
    <div style="width: 55em; margin: 0px;
                background-color: white; float: left;
                background-repeat: no-repeat; 
                background-color: white;">
 
      <div style=" margin-left: 15px;">
 
        <h1 style="color: #CC0000; font-size: 110%; margin-top: 1em; margin-bottom: 2em;">
          Statusänderung Client/Gateway-Service
        </h1>
 
        <p>Sehr geehrte Damen und Herren,</p>
 
        <p>Mit dieser automatisch erzeugten Nachricht erhalten Sie eine Liste der Drucker und/oder Gateways, deren Status aktuell eine Handlung des Administrators notwendig macht.</p>
 
        <table cellpadding="4" cellspacing="0" border="0" 
               style="font-size: 100%; margin: 2em; border-collapse: collapse;">
          <tr bgcolor="#EEEEEE">
            <td height="15" width="120"><b>Status</b></td>
            <td height="15"><b>Drucker / Gateway</b></td>
          </tr>
 
          [% Tabelle %]
 
        </table>
      </div>
    </div>
  </body>
</html>


Ein Beispiel für die so erzeugten E-Mails zeigt die nachfolgende Abbildung. Aufgrund der einfachen Konstruktion mit der externen HTML-Datei als Vorlage für das E-Mail kann das Aussehen der E-Mail praktisch beliebig formatiert und an die persönlichen Bedürfnisse angepasst werden.


Ereignisse

Nachfolgend eine Liste der Ereignisse, die vom Client/Gateway-Service in das Ereignisprokoll eingetragen werden. Der Code %1 bedeutet, dass an diesen Stellen ergänzende, an die jeweilige Situation angepasste Informationen eingeblendet werden.

Typ Ereignis Bedeutung
Information 1000 Der print2forms Service wurde erfolgreich installiert.
Information 1001 Der print2forms Service wurde deinstalliert.
Information 1002 Der print2forms Service wurde erfolgreich gestartet.
Information 1003 Der print2forms Service wurde beendet. Waren bei der Anforderung zum Beenden des Service noch Clients und Gateways aktiv wurden diese zwangsweise beendet, was eventuell zu Datenverlusten geführt haben kann.
Fehler 1004 Der print2forms Service meldet den Fehler: %1.
Fehler 1005 Die print2forms Installation ist inkonsistent. Ein sicherer Betrieb ist nicht möglich (%1). Eine oder mehrere Komponenten des print2forms Systems sind entweder modifiziert oder umbenannt worden, was dazu führt, dass die eingebetteten Zertifikate ungültig geworden sind.
Fehler 1006 Der print2forms Service kann eine Anfrage nicht ausführen.
Fehler 1007 Der print2forms Service hat den/das Client/Gateway [%1] neu gestartet. Der Client oder das Gateway ist abnormal beendet worden. Der Service wurde so konfiguriert, dass solche Clients und Gateways automatisch neu gestartet werden.
Fehler 1008 Der print2forms Service kann den/das Client/Gateway [%1] nicht starten.
Information 1009 Der print2forms Service startet mit Status %1.
Information 1010 Der print2forms Service meldet den benutzerdefinierten Kode %1.
Fehler 1011 Der print2forms Service kann das Service-Objekt nicht finden. Eventuell wurde der Service gestartet, bevor ein Service-Objekt ausgewählt wurde. Ein Service-Objekt auswählen und dann den Dienst noch einmal neu starten.
Information 1012 Der print2forms Service hat eine Sicherungsdatei auf dem print2forms Server erstellt. Eine eventuell vorhandene ältere Sicherungsdatei ist dabei überschrieben worden.
Fehler 1013 Der print2forms Service kann keine Sicherungsdatei auf dem Server erstellen. Entweder kann die Verbindung zum print2forms Server nicht hergestellt werden, oder der Service kann keine lokale Datei mit den Sicherungsdaten im Verzeichnis Anwendungsdaten erzeugen.
Information 1014 Der print2forms Service muss keine neue Sicherungsdatei erstellen, weil in der Konfiguration des Service seit der letzten Sicherung keine Änderungen vorgenommen worden sein.
Information 1015 Die Management Konsole(n) ist/sind im Netzwerk erreichbar und ist/sind betriebsbereit.
Fehler 1016 Mindestens eine Management Konsole ist nicht via Netzwerk erreichbar oder ist nicht betriebsbereit. Die zusaetzliche Statusmeldung des Services ist '%1'.
Fehler 1017 Die Management Konsole(n) sind funktionsfaehig, aber es gibt folgende Zusatzinformation '%1'.
Warnung 1018 Statusaenderung: %1
Fehler 1019 Der Web-Server kann nicht gestartet werden. Die Fehlernummer ist %1.



Hinweise