PSS Lic Perfect Streamer Toolkit v2.0 — Lizenz des Knotens

Teil des Perfect Streamer Toolkithttps://pstreamer.tv

Ein Kommandozeilen-Dienstprogramm zur Verwaltung der Lizenz eines Knotens: es wendet das vom Anbieter gesendete Lizenz-Update an, exportiert den Zustand des Schlüssels für eine Aktivierungsanfrage und überträgt die Lizenz von einem Knoten auf einen anderen.

Es arbeitet mit demselben Schlüssel des Schutzsystems wie der Streamer selbst — einem Software- (SL) oder einem Hardware-Schlüssel (HL). Der Zugriff auf den Schlüssel erfolgt über den Dienst aksusbd des Schutzsystems, deshalb funktioniert das Dienstprogramm nur dort, wo dieser Dienst läuft.

Das Werkzeug ist Bestandteil des Pakets pstreamer und befindet sich nach der Installation unter /opt/pss/tools/pss_lic — es muss nichts separat installiert werden.

Wann das Dienstprogramm nötig ist

Der Bildschirm Lizenz kann das C2V exportieren und den zugesandten V2C-Schlüssel anwenden, mehr aber nicht. Über die Konsole sind alle Operationen am Schlüssel verfügbar, und nur von hier aus wird alles Übrige erledigt:

  • Aktivierung und Aktualisierung der Lizenz auf einem Knoten ohne Zugang zur Weboberfläche;

  • Automatisierung: Ausrollen eines Knotenparks, planmäßige Lizenzerneuerung, Prüfungen aus einem Überwachungssystem;

  • Übertragung einer Lizenz zwischen Knoten — dauerhaft oder vorübergehend.

Das Dienstprogramm braucht keine Root-Rechte: das Schreiben in den geschützten Speicher übernimmt der Dienst des Schutzsystems, nicht das Dienstprogramm. Root wird nur benötigt, um die Ausgabedatei in ein Systemverzeichnis zu schreiben und um den Dienst pss nach dem Lizenzwechsel neu zu starten.

Die Erstaktivierung der Testlizenz führt nicht dieses Dienstprogramm aus, sondern das Skript /opt/pss/tools/activate.sh — siehe Temporäre Aktivierung und Start. Das Skript ruft pss_lic selbst auf, startet anschließend den Dienst pss neu und aktiviert dessen Autostart. Wie eine dauerhafte Lizenz zu beziehen ist, beschreibt Dauerhafte Aktivierung.

Verwendung

pss_lic <Befehl> [Optionen]

Ohne Argumente, mit -h oder mit --help gestartet, gibt es die eingebaute Hilfe aus und endet mit Code 0. Optionen stehen nach dem Befehl; vor dem Befehl sind nur -h, --help, -V und --version zulässig. Positionsargumente werden nicht angenommen — alles wird über Optionen angegeben.

Befehle

Befehl

Zweck

Erforderliche Optionen

apply

Ein Lizenz-Update auf den Knoten anwenden — eine V2C-, H2R- oder R2H-Datei

--in

c2v

Den Zustand des Schlüssels (C2V) für den Versand an den Anbieter exportieren

fingerprint

Den Fingerabdruck des Knotens exportieren

recipient

Den Recipient-Block des Knotens exportieren — die Beschreibung des Knotens als Empfänger einer Übertragung

keys

Die von diesem Knoten aus sichtbaren Schlüssel des Schutzsystems auflisten

detach

Eine Produktlizenz vorübergehend auf einen anderen Knoten übertragen; das Ergebnis ist eine H2R-Datei

--product-id

rehost

Den Schlüssel auf einen anderen Knoten übertragen; das Ergebnis ist eine V2C-Datei, und die Lizenz wird vom aktuellen Knoten entfernt

--key-id

cancel

Eine vorübergehend übertragene Lizenz vorzeitig zurückgeben; das Ergebnis ist eine R2H-Datei

--key-id

version

Version des Dienstprogramms und API-Version des Schutzsystems anzeigen

help

Die eingebaute Hilfe anzeigen

Optionen

Option

Beschreibung

Akzeptiert von

-i, --in <Datei>

Eingabedaten

apply

-o, --out <Datei>

Ausgabedaten; standardmäßig -, also stdout

alle außer version und help

-r, --recipient <Datei>

Recipient-Block des empfangenden Knotens

detach, rehost

-k, --key-id <id>

Schlüssel-ID, dezimal

c2v, keys, detach, rehost, cancel

-p, --product-id <id>

Produkt-ID, dezimal

detach

--duration <Sek>

Dauer der vorübergehenden Übertragung in Sekunden; standardmäßig 120, höchstens 31536000

detach

--fast

Verkürzter Zustandsabzug; bei einem Hardware-Schlüssel (HL) eine kleinere Datei

c2v

--ids

Nur die Schlüssel-IDs ausgeben, eine pro Zeile

keys

-y, --yes

Keine Bestätigung anfordern

rehost, cancel

-q, --quiet

Nur Fehler

alle

-v, --verbose

Ausführliches Protokoll der Zugriffe auf das Schutzsystem

alle

-V, --version

Versionen anzeigen und beenden

alle

-h, --help

Hilfe anzeigen

alle

Eine Option, die in der Zeile ihres Befehls nicht aufgeführt ist, ist ein Syntaxfehler und kein stillschweigend ignoriertes Flag: das Dienstprogramm meldet beispielsweise --key-id is not valid for 'fingerprint' und fügt häufig eine Zeile mit der Ursache hinzu. Die Werte von --key-id, --product-id und --duration sind ausschließlich Dezimalzahlen ab 1; null ist unzulässig.

Ein- und Ausgabe

Jedes Dateiargument — --in, --out, --recipient — akzeptiert -: Lesen von stdin, Schreiben nach stdout. Standardmäßig geht die Ausgabe nach stdout.

Auf stdout gelangen nur die Daten selbst — der Lizenzblock. Erfolgsmeldungen, Warnungen und Fehler gehen auf stderr und beginnen mit dem Präfix pss_lic:. Dadurch lässt sich jeder Befehl in eine Datei oder eine Pipeline umleiten, ohne die Ausgabe auswerten zu müssen.

Ist keine Ausgabedatei angegeben und stdout ein Terminal, warnen die Befehle detach, rehost und cancel, dass das Ergebnis der Übertragung auf dem Bildschirm landet und verloren geht:

pss_lic: writing the V2C to the terminal; use --out <file> to keep it

Die Eingabedatei wird geprüft, bevor das Schutzsystem angesprochen wird: eine leere Datei, eine Datei, die ein Nullbyte enthält, und eine Datei über 8 MiB werden abgewiesen. Eine UTF-8-Bytereihenfolge-Markierung am Dateianfang — manche Mail-Clients und Editoren fügen sie hinzu — wird automatisch entfernt.

Anwenden eines Lizenz-Updates

Die vom Anbieter gesendete Datei wird mit einem einzigen Befehl angewendet:

# apply a licence update sent by the vendor
/opt/pss/tools/pss_lic apply --in license.v2c

# the same file through a pipe
cat license.v2c | /opt/pss/tools/pss_lic apply --in -

Bei Erfolg erscheint auf stderr:

pss_lic: update applied

Das Dienstprogramm startet den Dienst nicht neu. Ein laufender Streamer hält die bisherige Lizenz im Speicher, deshalb ist der Dienst nach einem Lizenzwechsel von Hand neu zu starten:

sudo systemctl restart pss

Das erneute Anwenden derselben Datei gilt nicht als Fehler: das Dienstprogramm meldet this V2C is already installed, nothing to do und beendet sich mit Code 0. Auf dieser Eigenschaft beruht die Wiederholbarkeit des Skripts activate.sh.

Verwechseln Sie diese Meldung nicht mit der Ablehnung the update is older than the one already installed (stale or rolled-back V2C) (Status 54) — diese bedeutet, dass eine veraltete Datei angewendet wird, und endet mit Code 1. Fordern Sie in diesem Fall beim Anbieter ein aktuelles V2C an.

Mit dem Befehl apply werden alle drei Arten von Updates angewendet: das V2C vom Anbieter, das H2R bei einer vorübergehenden Übertragung und das R2H bei deren Rückgabe.

Export der Daten für den Anbieter

Eine Aktivierungsanfrage oder eine Anfrage zur Erweiterung der Lizenz wird aus einer C2V-Datei erstellt — einer Momentaufnahme des aktuellen Zustands des Schlüssels:

# export the key state for the vendor
/opt/pss/tools/pss_lic c2v --out host.c2v

Sieht der Knoten mehrere Schlüssel, rät das Schutzsystem nicht, welcher gemeint ist, und antwortet mit der Ablehnung too many keys match the scope (Status 37). Die Schlüssel-IDs listet der Befehl keys auf:

# list the key ids visible on this host, then scope the export to one of them
/opt/pss/tools/pss_lic keys --ids
/opt/pss/tools/pss_lic c2v --key-id <id> --out host.c2v

Ohne --ids gibt der Befehl keys die Liste der Schlüssel und ihrer Lizenzen in der Form aus, in der das Schutzsystem sie liefert — als XML-Dokument, nicht als Tabelle. Für die Wahl eines Wertes für --key-id genügt die Form --ids.

Die Option --fast fordert beim Schlüssel einen verkürzten Zustandsabzug an. Bei einem Hardware-Schlüssel (HL) fällt diese Datei etwa um eine Größenordnung kleiner aus als die vollständige; bei einem Software-Schlüssel (SL) ist die Größe dieselbe — es unterscheidet sich nur der Umfang der Daten.

Der Inhalt eines C2V lässt sich auf dem Knoten nicht lesen, deshalb wird die Schlüssel-ID mit dem Befehl keys ermittelt und nicht aus der Datei selbst.

Ein C2V — eine Anfrage. Senden Sie dem Anbieter nicht zweimal dasselbe C2V: das zweite daraufhin ausgestellte V2C lässt sich möglicherweise nur teilweise anwenden. Für eine erneute Anfrage das C2V neu exportieren.

Die Befehle fingerprint und recipient exportieren den Fingerabdruck des Knotens und den Recipient-Block. Der Fingerabdruck beschreibt die Maschine und wird vom Anbieter benötigt, solange auf dem Knoten noch keine Lizenz vorhanden ist: an ihn wird ein neuer Software-Schlüssel gebunden. Der Recipient-Block beschreibt den Knoten als Empfänger einer Übertragung und wird nicht vom Anbieter, sondern vom zweiten Knoten gebraucht — siehe Übertragung der Lizenz auf einen anderen Knoten. Beide beziehen sich auf den Knoten als Ganzes und nicht auf einen einzelnen Schlüssel, deshalb ist die Option --key-id für sie unzulässig.

Übertragung der Lizenz auf einen anderen Knoten

Eine Lizenz lässt sich nur bei einem Software-Schlüssel (SL) zwischen Knoten übertragen: ein Hardware-Schlüssel wandert mit dem Gerät selbst und wird von den Befehlen des Dienstprogramms nicht berührt. Eine Testlizenz ist nicht übertragbar. Ob eine Übertragung möglich ist, legen die Lizenzbedingungen fest; ist sie nicht vorgesehen, antwortet das Schutzsystem mit der Ablehnung rehost is not allowed for this licence. Klären Sie das vorab mit dem Anbieter.

Warnung

rehost nimmt die Lizenz vom aktuellen Knoten. Die erzeugte Datei lässt sich nur auf dem Knoten anwenden, dessen Recipient-Block in --recipient übergeben wurde. Geht die Datei verloren oder ist der empfangende Knoten nicht erreichbar, ist die Lizenz mit ihr verloren: einen lokalen Rückweg gibt es nicht. Geben Sie stets --recipient an und speichern Sie das Ergebnis in einer Datei, nicht auf dem Bildschirm.

Die Übertragung erfolgt in drei Schritten und betrifft beide Knoten. Im Folgenden ist A der Knoten, den die Lizenz verlässt, und B der Knoten, auf den sie übergeht.

  1. Auf Knoten B den Recipient-Block exportieren und die Datei an Knoten A übergeben:

    /opt/pss/tools/pss_lic recipient --out b.rcp
    
  2. Auf Knoten A den Schlüssel übertragen. Das Dienstprogramm fragt nach einer Bestätigung:

    /opt/pss/tools/pss_lic rehost --key-id <id> --recipient b.rcp --out a2b.v2c
    
    pss_lic: about to move the licence off this host. This cannot be undone. Continue? [y/N]
    

    Als Bestätigung gilt eine Antwort, die mit y oder Y beginnt: yes bestätigt genauso wie y. Jede andere Antwort, auch eine leere Zeile, bricht die Operation ab. Die Frage wird direkt auf dem Terminal gestellt, eine Umleitung der Ausgabe verbirgt sie also nicht. Fehlt ein Terminal — etwa weil der Befehl aus einem Scheduler gestartet wurde —, verweigert das Dienstprogramm die Übertragung und schlägt --yes vor.

  3. Auf Knoten B die erhaltene Datei anwenden und den Dienst neu starten:

    /opt/pss/tools/pss_lic apply --in a2b.v2c
    sudo systemctl restart pss
    

Von dem Moment an, in dem Schritt 2 ausgeführt ist, bis Schritt 3 durchgelaufen ist, liegt die Lizenz auf keinem der beiden Knoten. Planen Sie die Übertragung so, dass dieser Zeitraum kurz bleibt.

Die erzeugte Datei ist überall außer auf Knoten B nutzlos: auf einer anderen Maschine ergibt sie eine Ablehnung mit Status 62. Der Versuch, auf Knoten A eine alte Datei desselben Schlüssels anzuwenden, ergibt Status 70 oder 71 — der Schlüssel wurde bereits übertragen.

Vorübergehende Übertragung der Lizenz

detach überträgt eine Produktlizenz für eine festgelegte Frist auf einen anderen Knoten, cancel gibt sie vorzeitig zurück. Wie die dauerhafte Übertragung funktioniert auch die vorübergehende nur mit einem Software-Schlüssel und nur, wenn die Lizenzbedingungen es zulassen; andernfalls antwortet das Schutzsystem mit einer Ablehnung mit Status 67. Bei einer Testlizenz ist eine solche Ablehnung das erwartete Ergebnis und kein Defekt.

Die Produkt-ID von Perfect Streamer ist 2. Die Frist wird in Sekunden mit der Option --duration angegeben; der Standardwert beträgt 120 Sekunden, geben Sie ihn im Betrieb daher stets ausdrücklich an. Die Obergrenze des Dienstprogramms selbst liegt bei 31536000 Sekunden (einem Jahr), die tatsächliche Grenze setzt jedoch die Lizenz: bei einer zu langen Frist antwortet das Schutzsystem mit der Ablehnung invalid duration specified. Die angeforderte Frist ist genau das — eine Anfrage: den endgültigen Wert bestimmt der Schlüssel, und er kann kürzer ausfallen.

  1. Auf Knoten B den Recipient-Block exportieren und die Datei an Knoten A übergeben:

    /opt/pss/tools/pss_lic recipient --out b.rcp
    
  2. Auf Knoten A die Lizenz für einen Tag übertragen:

    /opt/pss/tools/pss_lic detach --product-id 2 --duration 86400 --recipient b.rcp --out b.h2r
    
    pss_lic: product 2 detached, 86400 s requested
    
  3. Auf Knoten B die erhaltene Datei anwenden und den Dienst neu starten:

    /opt/pss/tools/pss_lic apply --in b.h2r
    sudo systemctl restart pss
    

Nach Ablauf der Frist kehrt die Lizenz von selbst auf Knoten A zurück. Die vorzeitige Rückgabe verläuft in umgekehrter Richtung: die R2H-Datei entsteht auf dem empfangenden Knoten und wird auf dem ursprünglichen angewendet. Ist die Frist bis dahin bereits abgelaufen, gibt es nichts zurückzugeben — das Dienstprogramm meldet the R2H: nothing to write und endet mit Code 1.

  1. Auf Knoten B die ID des übertragenen Schlüssels ermitteln und die Übertragung abbrechen:

    /opt/pss/tools/pss_lic keys --ids
    /opt/pss/tools/pss_lic cancel --key-id <id> --out back.r2h
    
  2. Auf Knoten A die erhaltene Datei anwenden und den Dienst neu starten:

    /opt/pss/tools/pss_lic apply --in back.r2h
    sudo systemctl restart pss
    

Die Option --recipient ist für cancel unzulässig: die Lizenz kehrt dorthin zurück, woher sie kam. Wie rehost fragt auch der Befehl cancel nach einer Bestätigung. detach selbst fragt nicht — die Übertragung ist zeitlich begrenzt und umkehrbar.

Bewahren Sie die Zwischendateien ebenso sorgfältig auf wie bei einer dauerhaften Übertragung: solange das H2R nicht auf Knoten B und das R2H nicht auf Knoten A angewendet ist, steht die Lizenz auf keinem von beiden zur Verfügung und kehrt erst nach Ablauf der Übertragungsdauer zurück.

Exit-Codes

Code

Bedeutung

0

Die Operation wurde ausgeführt. Derselbe Code wird zurückgegeben, wenn das Update bereits zuvor angewendet wurde

1

Das Schutzsystem hat die Operation abgelehnt — die Meldung nennt die Statusnummer. Derselbe Code wird zurückgegeben, wenn die Operation ohne Daten endete, zum Beispiel the R2H: nothing to write

2

Syntaxfehler: ein unbekannter Befehl, eine für den Befehl unzulässige Option, eine fehlende Pflichtoption, ein unzulässiger Wert. Derselbe Code wird zurückgegeben, wenn der Bediener die Bestätigungsabfrage mit „nein“ beantwortet hat

3

Ein-/Ausgabefehler: die Datei lässt sich nicht öffnen, lesen oder schreiben

Zwei Fälle sollten Skripte berücksichtigen. Verweigert der Bediener die Bestätigung, ist das Code 2 und nicht 0: eine Prüfung „Code ungleich null bedeutet Störung“ hält den Abbruch für einen Fehler. Eine nicht lesbare Eingabedatei ist Code 3 und nicht 1: bis zum Schutzsystem kam es gar nicht.

# distinguish a refusal by the key from a bad command line or a missing file
/opt/pss/tools/pss_lic apply --in license.v2c || {
    case $? in
        1) echo "the key refused the update" >&2 ;;
        2) echo "wrong command line, or the operator declined" >&2 ;;
        3) echo "the file could not be read" >&2 ;;
    esac
}

Meldungen und Diagnose

Meldungen erscheinen auf stderr mit dem Präfix pss_lic:. Eine Ablehnung des Schutzsystems wird immer in derselben Form ausgegeben — was misslungen ist, eine Beschreibung der Ursache im Klartext und die Statusnummer — und bei häufigen Ursachen kommt eine Hinweiszeile hinzu:

pss_lic: reading the key state (C2V) failed: too many keys match the scope (status 37)
pss_lic:   hint: this host holds several keys; run 'pss_lic keys --ids' and pass --key-id

Die Option -q entfernt die Erfolgsmeldungen — auch die Warnung vor der Ausgabe auf das Terminal —, nicht aber die Fehler und nicht die Hinweise. Die Option -v ergänzt ein Protokoll der Zugriffe auf das Schutzsystem: die Anfragen, die Zahl der gelesenen und geschriebenen Bytes, den Namen der aufgerufenen Funktion. Legen Sie beim Support genau die Ausgabe mit -v bei.

Die häufigste Gruppe von Ablehnungen ist ein nicht sichtbarer Schlüssel oder ein nicht antwortender Dienst des Schutzsystems (Status 7, 14, 33, 50 und 80). Prüfen Sie, ob der Dienst läuft (systemctl status aksusbd), ob der USB-Schlüssel angeschlossen ist und ob die Bibliotheken des Anbieters im Verzeichnis /var/hasplm vorhanden sind — sie installiert das Paket pstreamer. Die übrigen Ablehnungen stehen in der Tabelle unten; in der ersten Spalte die Statusnummer aus der Ablehnungszeile, in der zweiten deren Text.

Status

Text der Ablehnung

Ursache und Abhilfe

37

too many keys match the scope

Der Knoten sieht mehrere Schlüssel. Die Liste mit keys --ids abrufen und --key-id angeben

42

License Manager version is too old

Die Version von aksusbd ist niedriger als 9.12; das Paket des Schutzsystems aktualisieren

47

secure storage contains garbage

Der Lizenzspeicher ist beschädigt; ein neues V2C vom Anbieter ist erforderlich

48

vendor library cannot be found

Im Verzeichnis /var/hasplm fehlen die Bibliotheken des Anbieters; sie werden vom Paket pstreamer installiert

54

the update is older than the one already installed (stale or rolled-back V2C)

Es wird ein veraltetes V2C angewendet; ein aktuelles beim Anbieter anfordern

55

another update must be installed first

Die Update-Datei ist dem Zustand des Schlüssels voraus — ein Zwischenupdate wurde übersprungen; ein aktuelles C2V exportieren und das dafür ausgestellte V2C anwenden

58

invalid XML recipient parameter

Der Recipient-Block ist beschädigt; ihn auf dem empfangenden Knoten erneut exportieren

60

the scope does not select a unique Product

--product-id prüfen und auf einem Knoten mit mehreren Schlüsseln --key-id ergänzen

61

invalid Product information

--product-id prüfen; bei Perfect Streamer ist sie 2

62

unknown recipient; this blob may only be applied on the recipient it was made for

Die Datei wurde für eine andere Maschine ausgestellt und ist nur dort anwendbar

63

invalid duration specified

Die Übertragungsdauer ist länger als die Lizenz zulässt

64

cloned secure storage detected

Der Lizenzspeicher wurde als Kopie erkannt — eine Folge des Klonens einer Festplatte oder einer virtuellen Maschine; beim Anbieter eine Neuausstellung der Lizenz für diese Maschine anfordern

66

the specified key is inactive

Der Schlüssel ist inaktiv

67

no detachable Feature exists

Die vorübergehende Übertragung ist durch die Lizenzbedingungen nicht erlaubt

68

the scope does not select a unique host

Der Knoten sieht mehrere Dienste des Schutzsystems; fingerprint und recipient beziehen sich auf den Dienst, nicht auf den Schlüssel

69

rehost is not allowed for this licence

Die Übertragung ist durch die Lizenzbedingungen nicht erlaubt

70

the licence was rehosted to another machine

Der Schlüssel wurde bereits von diesem Knoten übertragen

71

an old rehost licence is being applied

Es wird eine alte Übertragungsdatei angewendet; der Schlüssel wurde bereits von diesem Knoten übertragen

77

the recipient of the requested operation is older than expected

Auf dem empfangenden Knoten läuft ein veralteter Dienst des Schutzsystems; ihn aktualisieren

78

secure storage ID mismatch

Der Lizenzspeicher gehört zu einer anderen Maschine; ein neues V2C vom Anbieter ist erforderlich

79

duplicate host name while the key uses host name fingerprinting

Im Netz gibt es einen zweiten Knoten mit demselben Namen; den Knoten umbenennen oder die Lizenz neu ausstellen lassen

94

the key and the update are out of sync (update counters diverged)

Die Update-Zähler von Schlüssel und Datei sind auseinandergelaufen; ein aktuelles C2V exportieren und das dafür ausgestellte V2C anwenden

Für jeden bekannten Status gibt das Dienstprogramm eine Beschreibung im Klartext aus; ein nicht erkannter Status wird als unrecognised status mit seiner Nummer ausgegeben.

Ein Sonderfall ist der Befehl keys: hat das Schutzsystem das ausführliche Format der Liste nicht angenommen, gibt das Dienstprogramm die Ablehnungszeile aus und wiederholt die Anfrage dann im Kurzformat. Die Liste wird dabei ausgegeben und der Exit-Code bleibt null, eine solche Ablehnungszeile vor einem normalen Ergebnis ist daher nicht als Störung zu lesen.

Der Befehl version funktioniert auch bei defektem Schutzsystem — genau das macht ihn als ersten Diagnoseschritt nützlich. Er gibt das Banner des Dienstprogramms und die API-Version des Schutzsystems aus; ist der Dienst des Schutzsystems nicht erreichbar, erscheint statt der Version unavailable mit einer Statusnummer, und der Exit-Code bleibt null.

Umstieg von Version 1.2

In Version 2.0 wurde die positionale Syntax durch Befehle und lange Optionen ersetzt; die früheren Formen werden nicht unterstützt. Bei ihrer Eingabe gibt das Dienstprogramm den Ersatz aus und beendet sich mit Code 2.

Bis 1.2

Ab 2.0

pss_lic u <Datei>

pss_lic apply --in <Datei>

pss_lic i [Schlüssel] [Datei]

pss_lic c2v [--key-id <Schlüssel>] [--out <Datei>]

pss_lic d <Produkt> [Datei]

pss_lic detach --product-id <Produkt> [--out <Datei>]

pss_lic r <Schlüssel> [Datei]

pss_lic rehost --key-id <Schlüssel> [--out <Datei>]

pss_lic f [Datei]

pss_lic fingerprint [--out <Datei>]

Auch das Verhalten der Ausgabe hat sich geändert: in 2.0 gelangen nur die Daten nach stdout, die Meldungen nach stderr. Skripte, die die gemischte Ausgabe der Version 1.2 ausgewertet haben, müssen angepasst werden.