AUF DIESER SEITE
Beispiel: Dateien mithilfe eines Op-Skripts exportieren
Das Op-Skript in diesem Beispiel verwendet den Junos XML-Protokollvorgang file-put
, um in eine Datei auf einem Remoteserver und auf dem lokalen Gerät zu schreiben.
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-put
erstellt eine Datei und schreibt den angegebenen Inhalt in diese Datei. Die grundlegende Syntax für die Verwendung des file-put
Befehls lautet wie folgt:
<rpc> <file-put> <delete-if-exist /> <encoding>value</encoding> <filename>value</filename> <permission>value</permission> <file-contents>file</file-contents> </file-put> </rpc>
Die folgenden Tag-Elemente werden mit dem file-put
Befehl verwendet. Diese Tags können in beliebiger Reihenfolge platziert werden, mit Ausnahme von file-contents
. Das file-contents
Tag-Element muss das letzte Tag in der Liste sein.
delete-if-exist
—(Optional) Falls enthalten, wird eine vorhandene Datei überschrieben. Wenn das Tag ausgelassen wird, wird ein Fehler zurückgegeben, wenn eine vorhandene Datei aufgetreten ist.encoding
—(Pflichtfeld) Gibt den verwendeten Codierungstyp an. Sie können sie verwendenASCII
oderbase64
codieren.filename
—(Obligatorisch) In dieses Tag fügen Sie den vollständigen oder relativen Pfad und den Dateinamen der zu erstellenden Datei ein. Wenn Sie einen relativen Pfad verwenden, ist der angegebene Pfad relativ zum Homeverzeichnis des Benutzers. Wenn das angegebene Verzeichnis nicht vorhanden ist, gibt das System die Fehlermeldung "Verzeichnis existiert nicht" aus.permission
—(Optional) Legt die UNIX-Berechtigung der Datei auf dem Remote-Server fest. Wenn Sie beispielsweise Lese-/Schreibzugriff für den Benutzer und Lesezugriff auf andere anwenden möchten, setzen Sie den Berechtigungswert auf 0644. Eine vollständige Erklärung der UNIX-Berechtigungen finden Sie imchmod
Befehl.file-contents
—(Obligatorisch) Der ascii- oder base64-codierte Dateiinhalt, der exportiert werden soll. Dies muss das letzte Tag in der Liste sein.
XSLT-Syntax
Das folgende Beispielskript führt eine Junos XML-API-Anfrage aus und exportiert die Ergebnisse in eine Datei auf einem Remotegerät und eine Datei auf dem lokalen Gerät. Das Skript nimmt drei Argumente: die IP-Adresse oder den Hostnamen des Remotegerä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) angezeigt werden.
Das Skript ruft die Junos XML-API-Anforderung <get-software-information>
auf dem lokalen Gerät auf und speichert das Ergebnis in der result
Variablen. Das Skript deklariert die fileput
Variable, die den Remoteprozeduraufruf (RPC) für den file-put
Vorgang enthält. Die Befehlszeilenargumente definieren die Werte für die Und encoding
Tag-Elementefilename
. Wenn das obligatorische Argument myhost
fehlt, gibt das Skript einen Fehler aus und stoppt die Ausführung. Andernfalls fordert das Skript den Benutzernamen und das Kennwort ein, 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 Verbindungshandings aus. Die Ausgabe der file-put
Operation, die das Ergebnis der jcs:execute()
Funktion ist, wird in der out
Variablen gespeichert. Wenn beim Vorgang ein Fehler auftritt, gibt das Skript den Fehler an die CLI aus. Wenn der file-put
Vorgang erfolgreich ist, werden die vom file-contents
Tag-Element angegebenen Inhalte in die angegebene Datei auf dem Remotegerät exportiert. Die Verbindung zum Remote-Host wird dann geschlossen. Das Skript exportiert auch den Inhalt in eine identische Datei auf dem lokalen Gerät.
Das Beispielskript enthält die optionalen Tag-Elemente permission
und delete-if-exist
für den file-put
Vorgang. delete-if-exist
Das Skript überschreibt jede vorhandene Datei mit demselben Namen auf den Remote- und lokalen Hosts. In diesem Beispiel ist das permission
Tag auf 0644
.
<?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 destination file</description> </argument> <argument> <name>encoding</name> <description>ascii or base64</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="rpc"> <get-software-information/> </xsl:variable> <xsl:variable name="result" select="jcs:invoke($rpc)"/> <xsl:variable name="fileput"> <file-put> <filename> <xsl:value-of select="$filename"/> </filename> <encoding> <xsl:value-of select="$encoding"/> </encoding> <permission>0644</permission> <delete-if-exist/> <file-contents> <xsl:value-of select="$result"/> </file-contents> </file-put> </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. Exporting file... </output> <xsl:variable name="out" select="jcs:execute($connect, $fileput)"/> <xsl:choose> <xsl:when test="$out//xnm:error"> <xsl:copy-of select="($out//xnm:error)"/> </xsl:when> <xsl:otherwise> <output> <xsl:value-of select="$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> <xsl:variable name="local-out" select="jcs:invoke($fileput)"/> <output> <xsl:value-of select="concat('Saving file on local host\n', $local-out)"/> </output> </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 destination file"; } <argument> { <name> "encoding"; <description> "ascii or base64"; } } param $myhost; param $filename; param $encoding; match / { <op-script-results> { var $rpc = <get-software-information>; var $result = jcs:invoke($rpc); var $fileput = { <file-put> { <filename>$filename; <encoding>$encoding; <permission>'0644'; <delete-if-exist>; <file-contents>$result; } } 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. Exporting file... \n"; var $out = jcs:execute($connect, $fileput); if ($out//xnm:error) { copy-of ($out//xnm:error); } else { <output> $out; } expr jcs:close($connect); } else { <output> "No connection to host."; } } var $local-out = jcs:invoke($fileput); <output> "Saving file on local host\n" _ $local-out; } }
Konfiguration
Verfahren
Schritt-für-Schritt-Verfahren
Zum Herunterladen, Aktivieren und Testen des Skripts:
Kopieren Sie das XSLT- oder SLAX-Skript in eine Textdatei, geben Sie der Datei den Namen export.xsl oder export.slax und kopieren Sie sie in das Verzeichnis /var/db/scripts/op/ auf dem Gerät.
Fügen Sie die
file
Anweisung im Konfigurationsmodus auf[edit system scripts op]
Hierarchieebene und gegebenenfalls export.xsl oder export.slax ein.[edit system scripts op] user@host# set file export.(slax | xsl)
Erteilen Sie den
commit and-quit
Befehl.[edit] user@host# commit and-quit
Führen Sie das Op-Skript durch Ausgabe des Befehls für den
op export
Betriebsmodus aus und fügen Sie alle erforderlichen Argumente ein.
Überprüfung
Überprüfen der Op-Skript-Argumente
Zweck
Stellen Sie sicher, dass die Argumentnamen und -beschreibungen in der CLI angezeigt werden.
Aktion
Lösen Sie den op exort ?
Betriebsmodus-Befehl aus. Die CLI listet die möglichen Abschlussmöglichkeiten für die Skriptargumente basierend auf den Definitionen in der globalen arguments
Variablen im Skript auf.
user@host> op export ? Possible completions: <[Enter]> Execute this command <name> Argument name detail Display detailed output encoding ascii or base64 filename name of destination file myhost IP address or hostname of the remote host | Pipe through a command
Überprüfung der Ausführung von Op-Skripten
Zweck
Stellen Sie sicher, dass sich das Skript wie erwartet verhält.
Aktion
Geben Sie den Befehl für den op export myhost host encoding encoding filename file
Betriebsmodus aus und geben Sie den entsprechenden Benutzernamen und das entsprechende Kennwort an, wenn Sie dazu aufgefordert werden. Wenn die Skriptausführung erfolgreich ist, wird das Ergebnis der <get-software-information>
RPC-Anforderung in die Datei auf dem Remotegerät und auch auf dem lokalen Gerät geschrieben. Zum Beispiel:
root@host> op export myhost router1 encoding ascii filename /var/log/host-version.txt Enter username: root Enter password: Connected to host. Exporting file... /var/log/host-version.txt Saving file on local host /var/log/host-version.txt
Wenn Sie die IP-Adresse oder den Hostnamen des Remotegeräts in den Befehlszeilenargumenten nicht eingeben, gibt das Skript einen Fehler aus und stoppt die Ausführung.
root@host> op export error: missing mandatory argument 'myhost'
Wenn Sie das delete-if-exist
untergeordnete Tag des file-put
Vorgangs auslassen und die angegebene Datei bereits vorhanden ist, meldet das Skript einen Fehler.
root@host> op export myhost router1 encoding ascii filename /var/log/host-version.txt Enter username: root Enter password: Connected to host. Exporting file... Destination file exists Saving file on local host Destination file exists
Wenn Sie das Skript ausführen und einen Verzeichnispfad einschließen, der weder auf dem Remote- noch auf dem lokalen Host vorhanden ist, meldet das Skript einen Fehler.
root@host> op export myhost router1 encoding ascii filename /var/test/host-version.txt Enter username: root Enter password: Connected to host. Exporting file... Destination directory does not exist: /var/test Saving file on local host Destination directory does not exist: /var/test