Das Expertensystem

Das Expertensystem ist ein Mechanismus der angezeigte Werte im Client auf bestimmte Muster überprüft. Danach wird dem Benutzer mit einem einfachen Ampelsystem angezeigt, ob irgendwelche Warnungen oder Fehler zu dem angezeigten Objekt existieren.

Die einzelnen Tests konfigurierst du dabei mit kleinen Skripten, welche ausgeführt werden sobald ein Objekt im Client angezeigt wird. Falls auf der Serverseite Werte noch nicht verfügbar sind, und erst später nachgeliefert werden, werden die Skripte mit neuen Werte erneut ausgeführt und die Ergebnisse aktualisiert.

Um die Entwicklung und Konfiguration zu erleichtern existiert ein grafischer Editor. Mit diesem kannst du einfach Skripte editieren und testen. Dazu kannst du auch Daten aus dem Raptor System exportieren und in dem Editor als Testdaten verwenden.

Konfiguration

Die Konfiguration des Expertensystems ist in der Datei expert_system.xml im Datenverzeichnis gespeichert. Sie enthält alle Skripte welche für das Resultat ausgewertet werden.

Das folgende Beispiel zeigt dir die grundlegende Struktur dieser Datei:

<?xml version="1.0" encoding="UTF-8" ?>
<ExpertSystem
    version="1"
    xmlns="http://educateit.ch/software/Raptor/ExpertSystem/1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <Test id="..." caption="..." objectType="...">
        ...
    </Test>
    ...
</ExpertSystem>

Das Dokument Element ExpertSystem

Das Dokument Element ExpertSystem umschliesst alle Test Elemente. Dabei benötigt es neben den XML-Namespace angaben, zwingend das Attribut version welches auf den Wert 1 gesetzt sein muss.

Das Element Test

Jeder Test wird mit einem Test Element definiert. Dabei musst du die Attribute id, caption und objectType angeben. Den eigentlichen Testskript gibst du als Inhalt des Elements an. Du solltest ihn dabei mit <[!CDATA[ und ]]> einschliessen, um Probleme mit dem XML Dokument zu vermeiden.

Die folgende Tabelle zeigt dir die Bedeutung aller Attribute:

Attribut

Bedeutung

id

Hier gibst du einen eindeutigen Bezeichner für den Test an. Aktuell wird dieser Bezeichner nur in den Logdateien verwendet. Mögliche Zeichen sind Buchstaben, Zahlen und der Unterstrich.

caption

Mit diesem Attribut gibst du dem Test einen Titel, der im Client angezeigt wird. Wähle hier einen möglichst kurzen aber prägnanten Titel, der das Resultat des Tests genau beschreibt. Da der Titel auch dann angezeigt wird, falls der Test erfolgreich ist, gibt dieser einen wichtigen Hinweis, was genau getestet wurde.

objectType

Hier schränkst du den Test auf einen bestimmten Objekttyp ein. Möglich sind beispielsweise die Bezeichner Computer oder User. Der Test wird nur für den angegebenen Objekttyp ausgeführt.

Das folgende Beispiel zeigt dir den Aufbau eines Test Elements:

<Test id="accountEnabledCheck" caption="Account Enabled Check" objectType="User"><![CDATA[
    ... JavaScript/QtScript code block ...
]]></Test>

Der Skript in dem Block kann folgendermassen aussehen:

if (object.hasInformationBlock("ActiveDirectoryOR")) {
    if (object.ActiveDirectoryOR.accountDisabled == false) {
        result.status = Result.Good;
        result.description = "User account is enabled.";
    } else {
        result.status = Result.Warning;
        result.description = "User account is disabled.";
    }
}

Die Skript-Umgebung

In der Skript-Umgebung hast du Zugriff auf zwei globale Variablen des Systems. Die erste ist object, welche dir Zugriff auf alle Informationen zum angezeigten Objekt bietet. Die zweite ist result, in der du das Ergebnis deines Tests speichern musst.

Variable

Beschreibung

object

Das aktuelle Objekt welches in dem Client angezeigt wird. Verwende diese Variable um auf die verfügbaren Informationsblöcke und dessen Werte zuzugreifen.

result

Das Resultat des Tests speicherst du in dieser Variable. Machst du das nicht, wird als Resultat „Unknown“ angezeigt.

Die Resultat Variable

Die Variable result ist ein Objekt mit zwei Properties: status und description. Verwende dieses Objekt um dein Resultat dem System zugänglich zu machen. Wenn du in deinem Skript dieses Objekt unverändert lässt, dann wird das Resultat im Client als „Unknown“ angezeigt.

In der folgenden Tabelle findest du die Beschreibung der beiden Properties:

Property

Beschreibung

result.status

Mit diesem Property definierst du den eigentlichen Status deines Skripts. Dabei kannst du einen der folgenden Werte zuweisen: Result.Error, Result.Warning, Result.Good und Result.Unknown. Letzteres ist der Standartwert und ist beim Start des Skripts bereits zugewiesen.

result.description

Mit diesem Property kannst du einen Text zuweisen, welcher im Client neben dem Status angezeigt wird. Damit kannst du dein Ergebnis weiter erklären und beispielsweise details zu dem Problem angeben, welches zum Status Error geführt hat.

Alle möglichen Werte für das result.status Property und deren Bedeutung findest du in der folgenden Tabelle:

Status

Bedeutung

Result.Error

Der getestete Wert ist definitiv ausserhalb des gültigen Bereichs und weist auf einen Fehler hin. In der Beschreibung solltest du eine Beschreibung des Fehlerhaften Wertes, sowie des getesteten Bereichs angeben.

Result.Warning

Der getestete Wert is fast ausserhalb des gültigen Bereichs und könnte die Ursache für einen Fehler sein. In der Beschreibung solltest du angeben, wieso dieser Wert die Ursache eines Fehlers sein könnte.

Result.Good

Der getestete Wert ist innerhalb des gültigen Bereichs und daher kaum Ursache eines Fehlers.

Result.Unknown

Dein Skript konnte den Wert nicht, oder noch nicht testen.

Die Objekt Variable

Die Variable object ist dein Zugangspunkt zu allen informationen welche im aktuellen Objekt gespeichert sind. Dabei bietet das Objekt welcher dieser Variable zugeordnet ist einige Funktionen sowie ein Property für jeden Informationsblock.

Alle Details wie du auf die Informationen über diese Schnittstelle zugreifst, findest du im Kapitel Skript Objekt Interface.

Der Editor für das Experten System

Der Editor für das Experten System ist ein Werkzeug mit dem du einfach Skripte erstellen und testen kannst.

../../_images/expert-system-mainwindow.jpg

Dieser Editor bietet dir folgende Vorteile:

  • Teste deine Scripte mit Objektdaten ausserhalb des Raptor Systems.

  • Speichert eine Sammlung von Skripten in einer Datei.

  • Importiert und Exportiert einzelne Skripte in eine Experten System Konfiguration.

  • Importiert Objekte welche mit dem Raptor Client exportiert wurden.

  • Kopiert einen Skript als XML Schnipsel, welches direkt in eine Konfiguration eingefügt werden kann.

Skript Beispiele

Die folgenden Skripte zeigen einige Beispiele wie die Skripte für das Expertensystem aussehen können. Sie geben dir auch eine Referenz, wie solche Skripte aufgebaut sein sollten.

Teste ob das Passwort abgelaufen ist.
 1if (object.hasInformationBlock("ActiveDirectoryOR")) {
 2    if (object.ActiveDirectoryOR.dontExpirePassword == false) {
 3        var currentDateTime = new Date();
 4        if (object.ActiveDirectoryOR.passwordExpirationDate >= currentDateTime) {
 5            result.status = Result.Good;
 6            result.description = "Password will expire in the future.";
 7        } else {
 8            result.status = Result.Error;
 9            result.description = "Password has expired.";
10        }
11    } else {
12        result.status = Result.Good;
13        result.description = "Password does not expire.";
14    }
15}
Teste ob das Konto aktiv ist.
1if (object.hasInformationBlock("ActiveDirectoryOR")) {
2    if (object.ActiveDirectoryOR.accountDisabled == false) {
3        result.status = Result.Good;
4        result.description = "User account is enabled.";
5    } else {
6        result.status = Result.Warning;
7        result.description = "User account is disabled.";
8    }
9}
Teste ob die Grösse des Home Verzeichnis innerhalb der Limite ist.
 1if (object.hasInformationBlock("DirectoryQuota")) {
 2    if (object.DirectoryQuota.homeDirectoryQuota > 0) {
 3        var ratio = object.DirectoryQuota.homeDirectorySize * 100 / object.DirectoryQuota.homeDirectoryQuota;
 4        if (ratio >= 100) {
 5            result.status = Result.Error;
 6            result.description = "The home directory quota is reached.";
 7        } else if (ratio >= 95) {
 8            result.status = Result.Warning;
 9            result.description = "The home directory nearly reaches the quota limit.";
10        } else {
11            result.status = Result.Good;
12            result.description = "The home directory size is ok.";
13        }
14    }
15}
Teste ob ein Computer Konto aktiv ist.
1if (object.hasInformationBlock("ActiveDirectoryOR")) {
2    if (object.ActiveDirectoryOR.accountDisabled == false) {
3        result.status = Result.Good;
4        result.description = "Computer account is enabled.";
5    } else {
6        result.status = Result.Warning;
7        result.description = "Computer account is disabled.";
8    }
9}
Teste ob ein Benutzer in mehreren Spezialgruppen ist.
 1if (object.hasInformationBlock("ActiveDirectory")) {
 2    var groups = object.ActiveDirectory.groupsDN;
 3    var groupCheck = /SpecialGroup-\d{2}/i;
 4    var groupCount = 0;
 5    var foundGroup = "";
 6    for (var x = 0; x < groups.length; ++x) {
 7        var m = groupCheck.exec(groups[x]);
 8        if (m != null) {
 9            foundGroup += m[0];
10            foundGroup += " ";
11            ++groupCount;
12        }
13    }
14    if (groupCount > 1) {
15        result.status = Result.Error;
16        result.description = "User is in more than one of this groups: " + foundGroup;
17    } else {
18        result.status = Result.Good;
19        result.description = "User is in no or only one of this groups.";
20    }
21}