AUF DIESER SEITE
Beispiel: Importieren von Dateien mit einem Op-Skript
Das Op-Skript in diesem Beispiel verwendet den Junos XML-Protokollvorgang file-get
, um den Inhalt einer Datei von einem Remote-Server zu lesen.
Anforderungen
In diesem Beispiel wird ein Gerät verwendet, auf dem Junos OS ausgeführt wird.
Übersicht und Op-Skript
Der Junos XML-Protokollvorgang file-get
liest den Inhalt einer Datei. Die grundlegende Syntax für die Verwendung des file-get
Befehls lautet wie folgt:
<rpc> <file-get> <filename>value</filename> <encoding>value</encoding> </file-get> </rpc>
Die folgenden Tag-Elemente werden mit dem file-get
Befehl verwendet.
encoding
—(Obligatorisch) Gibt den Typ der verwendeten Codierung an. Sie können ,base64
oderraw
die Codierung verwendenASCII
.filename
—(Obligatorisch) In diesem Tag geben Sie den vollständigen oder relativen Pfad und Dateinamen der zu importierenden Datei an. Wenn Sie einen relativen Pfad verwenden, ist der angegebene Pfad relativ zum Verzeichnis /var/tmp/ , wenn derfile-get
Vorgang lokal ausgeführt wird. Wenn der Vorgang remote im Kontext einer Verbindungskennung ausgeführt wird, ist der Pfad relativ zum Basisverzeichnis des Benutzers.
Wenn Sie die ASCII-Codierung verwenden, konvertiert der file-get
Vorgang alle Steuerzeichen in der importierten Datei in das Unicode-Zeichen "SECTION SIGN" (U+00A7).
XSLT-Syntax
Das folgende Beispielskript stellt eine Verbindung zu einem Remotegerät her und liest den Inhalt der angegebenen Datei. Das Skript akzeptiert drei Argumente: die IP-Adresse oder den Hostnamen des Remote-Geräts, den Dateinamen und die Dateicodierung. Die arguments
Variable wird auf der globalen Ebene des Skripts deklariert, sodass die Argumentnamen und -beschreibungen in der Befehlszeilenschnittstelle (CLI) sichtbar sind.
Das Skript deklariert die Variable fileget
, die den Remoteprozeduraufruf (Remote Procedure Call , RPC) für den file-get
Vorgang enthält. Die Befehlszeilenargumente definieren die Werte für das filename
und encoding
tag-Element. Wenn das obligatorische Argument myhost
fehlt, gibt das Skript einen Fehler aus und hält die Ausführung an. Andernfalls fordert das Skript zur Eingabe des Benutzernamens und des Kennworts auf, die für die Verbindung mit dem Remotegerät verwendet werden.
Wenn die Verbindung mit dem Remotegerät erfolgreich ist, führt das Skript den RPC im Kontext des Verbindungshandles aus. Die Ausgabe der file-get
Operation, die das Ergebnis der jcs:execute()
Funktion ist, wird in der Variablen out
gespeichert. Wenn beim Vorgang ein Fehler auftritt, gibt das Skript den Fehler in der CLI aus. Wenn der file-get
Vorgang erfolgreich ist, wird der Inhalt der Datei in der out
Variablen gespeichert, die in der CLI ausgegeben wird. Die Verbindung zum Remote-Host wird dann geschlossen.
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0" version="1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:variable name="arguments"> <argument> <name>myhost</name> <description>IP address or hostname of the remote host</description> </argument> <argument> <name>filename</name> <description>name of file</description> </argument> <argument> <name>encoding</name> <description>ascii, base64, or raw</description> </argument> </xsl:variable> <xsl:param name="myhost"/> <xsl:param name="filename"/> <xsl:param name="encoding"/> <xsl:template match="/"> <op-script-results> <xsl:variable name="fileget"> <file-get> <filename> <xsl:value-of select="$filename"/> </filename> <encoding> <xsl:value-of select="$encoding"/> </encoding> </file-get> </xsl:variable> <xsl:choose> <xsl:when test="$myhost = ''"> <xnm:error> <message>missing mandatory argument 'myhost'</message> </xnm:error> </xsl:when> <xsl:otherwise> <xsl:variable name="username" select="jcs:get-input('Enter username: ')"/> <xsl:variable name="pw" select="jcs:get-secret('Enter password: ')"/> <xsl:variable name="connect" select="jcs:open($myhost, $username, $pw)"/> <xsl:choose> <xsl:when test="$connect"> <output>Connected to host. Reading file... </output> <xsl:variable name="out" select="jcs:execute($connect, $fileget)"/> <xsl:choose> <xsl:when test="$out//xnm:error"> <xsl:copy-of select="$out//xnm:error"/> </xsl:when> <xsl:otherwise> <output> <xsl:value-of select="concat('File contents: ', $out)"/> </output> </xsl:otherwise> </xsl:choose> <xsl:value-of select="jcs:close($connect)"/> </xsl:when> <xsl:otherwise> <output>No connection to host.</output> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </op-script-results> </xsl:template> </xsl:stylesheet>
SLAX-Syntax
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; var $arguments = { <argument> { <name> "myhost"; <description> "IP address or hostname of the remote host"; } <argument> { <name> "filename"; <description> "name of file"; } <argument> { <name> "encoding"; <description> "ascii, base64, or raw"; } } param $myhost; param $filename; param $encoding; match / { <op-script-results> { var $fileget = { <file-get> { <filename>$filename; <encoding>$encoding; } } if ($myhost = '') { <xnm:error> { <message> "missing mandatory argument 'myhost'"; } } else { var $username = jcs:get-input("Enter username: "); var $pw = jcs:get-secret("Enter password: "); var $connect = jcs:open($myhost, $username, $pw); if ($connect) { <output> "Connected to host. Reading file... \n"; var $out = jcs:execute($connect, $fileget); if ($out//xnm:error) { copy-of $out//xnm:error; } else { <output> "File contents: " _ $out; } expr jcs:close($connect); } else { <output> "No connection to host."; } } } }
Konfiguration
Verfahren
Schritt-für-Schritt-Anleitung
So laden Sie das Skript herunter, aktivieren und testen es:
Kopieren Sie das XSLT- oder SLAX-Skript in eine Textdatei, nennen Sie die Datei import.xsl oder import.slax und kopieren Sie sie in das Verzeichnis /var/db/scripts/op/ auf dem Gerät.
Fügen Sie im Konfigurationsmodus die
file
Anweisung auf Hierarchieebene[edit system scripts op]
und ggf. import.xsl oder import.slax ein.[edit system scripts op] user@host# set file import.(slax | xsl)
Geben Sie den
commit and-quit
Befehl ein, um die Konfiguration zu bestätigen und in den Betriebsmodus zurückzukehren.[edit] user@host# commit and-quit
Führen Sie das op-Skript aus, indem Sie den
op import
Befehl operational mode eingeben, und fügen Sie alle erforderlichen Argumente hinzu.
Überprüfung
Überprüfen der Skriptargumente
Zweck
Stellen Sie sicher, dass die Argumentnamen und -beschreibungen in der CLI angezeigt werden.
Aktion
Geben Sie den op import ?
Befehl Betriebsmodus ein. Die CLI listet die möglichen Vervollständigungen für die Skriptargumente basierend auf den Definitionen innerhalb der globalen arguments
Variablen im Skript auf.
user@host> op import ? Possible completions: <[Enter]> Execute this command <name> Argument name detail Display detailed output encoding ascii, base64, or raw filename name of file myhost IP address or hostname of the remote host | Pipe through a command
Überprüfen der Ausführung des Op-Skripts
Zweck
Stellen Sie sicher, dass sich das Skript wie erwartet verhält.
Aktion
Geben Sie den Befehl für den op import myhost host encoding encoding filename file
Betriebsmodus ein und geben Sie den entsprechenden Benutzernamen und das Kennwort an, wenn Sie dazu aufgefordert werden. Wenn die Skriptausführung erfolgreich war, wird der Inhalt der angeforderten Datei angezeigt. Zum Beispiel:
root@host> op import myhost router1 encoding ascii filename /var/db/scripts/op/test.slax Enter username: root Enter password: Connected to host. Reading file... File contents: version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; ...
Wenn Sie die IP-Adresse oder den Hostnamen des Remotegeräts nicht in den Befehlszeilenargumenten angeben, gibt das Skript einen Fehler aus und hält die Ausführung an.
root@host> op import error: missing mandatory argument 'myhost'
Wenn der angegebene Pfad oder die angegebene Datei nicht vorhanden ist, gibt das Skript außerdem einen Fehler aus.
root@host> op import myhost router1 encoding ascii filename /var/db/scripts/op/test1.slax Enter username: root Enter password: Connected to host. Reading file... File contents: Failed to open file (/var/db/scripts/op/test1.slax): No such file or directory