Wer den TechKnowLetter schon länger liest, wird die sehr guten Artikel von Markus Litters kennen. In Artikeln wie Open Source und IBM I – Teil 3 beschreibt er das XMLSERVICE-Tool, welches von IBM angeboten wird und per XML die Kommunikation mit und Steuerung der IBM i ermöglicht. Seit dem obigen Artikel, gab es einige interessante Neuerungen bzgl. XMLSERVICE. Ganz besonders interessant ist das relativ neue xmlservice-cli. In dieser Artikelreihe werden wir xmlservice-cli näher kennenlernen, die Einschränkungen des node-itoolkit Paketes erläutern und letztendlich einen alternativen Toolkit bauen.

 

XMLSERVICE vs. xmlservice-cli

XMLSERVICE ist, wie IBM beschreibt, eine Sammlung von open source RPG-Programmen, die es einem erlauben, die IBM i nahezu vollständig per XML zu steuern und zu verwalten. Open source bedeutet, dass wir uns tatsächlich den Quelltext ansehen, daran mitentwickeln und sogar eine eigene Version bauen können. Zusätzlich zu dem in RPG geschriebenen XMLSERVICE gibt es nun die relative neue Utility xmlservice-cli.

xmlservice-cli ist ein Befehlszeilenschnittstelle (Command Line Interface), um die Verwendung des XMLSERVICE per Shell zu tätigen. Wir haben schon in meinem Artikel Der mächtige „system“-Befehl gelernt, wie nützlich die Shell bzw. die “PASE for I”-Umgebung sein kann. Mit dem xmlservice-cli wird die PASE-Umgebung sogar mächtiger.

 

Installation xmlservice-cli

Man kann xmlservice-cli, wie viele coole neue Tools für die IBM i, mit yum installieren.

yum install itoolkit-utils

Da das Paket bei mir auf dem System schon installiert ist, folgt die Infoausgabe:

InfoausgabeQuelle: Güney

Infoausgabe

 

Sobald das getan ist, kann man direkt aus der Shell den XMLSERVICE per xmlservice-cli ansprechen.

Hinweis: Meine bevorzugte Shell ist die GNU Bash über SSH. QSH/QP2TERM sind für mich zu einschränkend und zudem brauche ich keine 5250-Sitzung bzw. ACS-Fenster für QSH/QP2TERM aufgeben. Zusätzlich: Wenn ich den Begriff „Shell“ benutze, meine ich damit auch die PASE for i Umgebung.

xmlservice-cli über die Shell nutzen

Wenn wir nun den xmlservice-cli Befehl aufrufen, dann passiert erst mal nichts, denn ungleich der meisten Befehlszeilentools erwartet xmlservice-cli einen Eingabestream. Hier wird das XML eingefügt, welches von XMLSERVICE konsumiert werden soll. Wenn man das XML fertig geschrieben hat, muss man noch das sogenannte END OF TRANSMISSION Zeichen tippen (Strg-D). Sobald das getan ist, führt XMLSERVICE das jeweilige XML aus.

 

 XML-Beispiele

Aufruf eines einfachen RPG-Programmes (HELLOKERIM in Bibliothek GUENEY):

XML:

<?xml version=’1.0′?>

<script>

<pgm name=’HELLOKERIM‘ lib=’GUENEY‘></pgm>

</script> 

Output:

Aufruf eines einfachen RPG-Programmes Quelle: Güney

Aufruf eines einfachen RPG-Programmes

 

Es ist auch möglich, mehrere Befehle in einem XML zusammenzufassen und somit eine Abfolge von Programmen auszuführen. In diesem Beispiel rufen wir dasselbe Programm zwei mal auf:

XML:

<?xml version=’1.0′?>

<script>

<pgm name=’HELLOKERIM‘ lib=’GUENEY‘></pgm>

<pgm name=’HELLOKERIM‘ lib=’GUENEY‘></pgm>

</script> 

Output:

Zweimaliger Aufruf desselben ProgrammsQuelle: Güney

Zweimaliger Aufruf desselben Programms

 

Weitere XML Beispiele kann man aus der offiziellen Dokumentation entnehmen.

 

Das Problem: zustandslose Aufrufe

In der Shell gibt es keine Bibliothekslisten, weswegen wir in den obigen Beispielen die Bibliothek für den Aufruf des Programmes über das lib-Attribute mitgeben mussten. Da wir aber auch QCMD Befehle per XMLSERVICE aufrufen können, können wir die Bibliotheksliste für den aktuellen xmlservice-cli-Aufruf wie folgt manipulieren:

XML:

<?xml version=’1.0′?>

<script>

<cmd>CHGLIBL LIBL(GUENEY QGPL QTEMP)</cmd>

</script>  

Output:

Manipulation der Bibliotheksliste für den aktuellen xmlservice-cli-Aufruf Quelle: Güney

Manipulation der Bibliotheksliste für den aktuellen xmlservice-cli-Aufruf

 

Leider ist diese nun angepasste Bibliotheksliste nicht persistent oder auf irgendeine Art mit unserer Shell-Sitzung gebunden. D. h. der folgende Aufruf schlägt fehl:

XML (man beachte, dass im <pgm> das lib-Attribut nicht übergeben ist):

<?xml version=’1.0′?>

<script>

<pgm name=’HELLOKERIM‘></pgm>

</script>

Output:

Fehlschlag des BefehlsQuelle: Güney

Fehlschlag des Befehls

 

Das deutet auf die Zustandslosigkeit der xmlservice-cli-Aufrufe hin. Dies ist problematisch, wenn man XMLSERVICE nicht nur über eine einzelne lange Aufrufskette ausführen will. Dies kann der Fall sein, wenn die Rückgabewerte eines Aufrufes evaluiert werden müssen, bevor der nächste Aufruf ausgeführt werden kann. Auch in Bereichen wie Commitment Control können zustandslose Aufrufe zu Problemen und unschönen Lösungen führen.

 

Zustandsvolle bzw. stateful xmlservice-cli

Tatsächlich ist es mit dem xmlservice-cli-Befehl möglich, auch zustandsvolle Sitzungen zu starten. Hierzu müssen wir den Befehl so aufrufen:

xmlservice-cli -c ‚*sbmjob‘ -i ‚/tmp/hallo‘

Der Parameter -c beschreibt, wie der Aufruf abzuarbeiten ist. Mit *sbmjob erstellt XMLSERVICE einen fortlaufenden Job für uns, den wir tatsächlich auch in WRKACTJOB wiederfinden:

WRKACTJOB Quelle: Güney

WRKACTJOB

 

Der -i Parameter steht für IPC und erwartet von uns einen Pfad. Hier wird eine Art Socketdatei erstellt, die in ls aussieht wie ein Ordner. Diese Datei dient als die IPC-Adresse, worüber xmlservice-cli mit dem obigen Job kommunizieren kann. Die Datei kann beliebig heißen darf aber nicht schon besetzt sein. Man muss sich den vollständigen Pfad notieren, denn nun können wir mit

xmlservice-cli  -i ‚/tmp/hallo‘

Befehle in diesem persistenten Job ausführen. Wir prüfen mit folgendem Beispiel, ob es auch tatsächlich klappt. Wenn wir versuchen HELLOKERIM ohne lib-Angabe auszuführen, bekommen wir den selben Fehler wie oben, denn – wie erwartet – kann das Programm nicht gefunden werden. Nun aber setzen wir die Bibliotheksliste in einem stateful Aufruf:

Bibliotheksliste in einem stateful AufrufQuelle: Güney

Bibliotheksliste in einem stateful Aufruf

 

Und versuchen den Aufruf nochmals, indem wir die Socketdatei mit angeben:

Socketdatei mit angegebenQuelle: Güney

Socketdatei mit angegeben

 

Und wir sehen, dass wir unsere obige Aufrufskette in mehrere Aufrufe unterteilen und ihn mit

xmlservice-cli -c ‚*immed‘ -i ‚/tmp/hallo‘

beenden konnten.

 

Zwischenergebnis

xmlservice-cli ist ein sehr cooles und mächtiges Werkzeug, um die IBM i über die Shell zu steuern. Tatsächlich haben wir bisher nur an der Oberfläche dieses wundervollen Werkzeuges gekratzt, um unser Ziel, eine zustandsvollen Verbindung zu erstellen. Es wäre z.B. möglich ein Bash-Skript zu schreiben, das xmlservice-cli und curl programmatisch aufruft und verbindet. Vielleicht ein Thema für einen zukünftigen Beitrag.

Auch wäre es möglich, ein Interface in einer anderen Programmiersprache zu schreiben, welches XML-fähig ist. Hier stellen uns IBM und die Community sogar einige zur Verfügung:

  1. node-itoolkit
  2. python-itoolkit
  3. .NET
  4. und mehr

Leider unterstützen viele dieser Interfaces keine zustandsvollen Verbindungen. Konkret werden wir uns bzgl. diesem Thema im nächsten Artikel dieser Serie mit dem node-itoolkit beschäftigen, jedoch werden unsere Erkenntnisse auch für andere Programmiersprachen gelten.

Der Autor Kerim Güney schreibt regelmäßig für den TechKnowLetter.

Sie erreichen ihn unter:

kerim[at]gueney.io

Sechs Ausgaben des TechKnowLetters erhalten Sie hier für 88 Euro.