Exemple : Exporter des fichiers à l’aide d’un script Op
Le script op de cet exemple utilise le protocole file-put
XML Junos pour écrire dans un fichier sur un serveur distant et sur l’équipement local.
Exigences
Cet exemple utilise un équipement exécutant Junos OS.
Script de présentation et d’exploitation
Le fonctionnement du protocole file-put
XML Junos crée un fichier et enregistre le contenu spécifié dans ce fichier. La syntaxe de base pour l’utilisation de la commande est la file-put
suivante :
<rpc> <file-put> <delete-if-exist /> <encoding>value</encoding> <filename>value</filename> <permission>value</permission> <file-contents>file</file-contents> </file-put> </rpc>
Les éléments de balise suivants sont utilisés avec la file-put
commande. Ces balises peuvent être placées dans n’importe quel ordre, à l’exception de file-contents
. L’élément file-contents
de balise doit être la dernière balise de la liste.
delete-if-exist
—(Facultatif) Si inclus, tout fichier existant est écrasé. Si la balise est omise, une erreur est renvoyée si un fichier existant est rencontré.encoding
— (Obligatoire) Spécifie le type d’encodage utilisé. Vous pouvez l’utiliser oubase64
l’encoderASCII
.filename
— (Obligatoire) Dans cette balise, vous incluez le chemin complet ou relatif et le nom de fichier à créer. Lorsque vous utilisez un chemin relatif, le chemin spécifié est relatif au répertoire personnel de l’utilisateur. Si le répertoire spécifié n’existe pas, le système renvoie une erreur « il n’existe pas de répertoire ».permission
— (Facultatif) Définit l’autorisation UNIX du fichier sur le serveur distant. Par exemple, pour appliquer l’accès en lecture/écriture à l’utilisateur et pour lire l’accès à d’autres utilisateurs, vous définissez la valeur d’autorisation sur 0644. Pour obtenir une explication complète des autorisations UNIX, reportez-vous à lachmod
commande.file-contents
—(Obligatoire) Contenu du fichier ASCII ou encodé en base64 pour l’exporter. Il doit s’agir de la dernière balise de la liste.
Syntaxe XSLT
L’exemple de script suivant exécute une demande d’API XML Junos et exporte les résultats vers un fichier sur un équipement distant et un fichier sur l’équipement local. Le script prend trois arguments : l’adresse IP ou le nom d’hôte de l’équipement distant, le nom de fichier et l’encodage du fichier. La arguments
variable est déclarée au niveau global du script, de sorte que les noms et les descriptions des arguments sont visibles dans l’interface de ligne de commande (CLI).
Le script appelle la requête d’API <get-software-information>
XML Junos sur l’équipement local et enregistre le résultat de la result
variable. Le script déclare la fileput
variable, qui contient l’appel de procédure à distance (RPC) pour l’opérationfile-put
. Les arguments en ligne de commande définissent les valeurs des éléments de balise et encoding
de balisefilename
. Si l’argument myhost
obligatoire est manquant, le script génère une erreur et arrête l’exécution. Sinon, le script invite à indiquer le nom d’utilisateur et le mot de passe qui seront utilisés pour se connecter à l’équipement distant.
Si la connexion à l’équipement distant réussit, le script exécute le rpc dans le contexte de la poignée de connexion. La sortie de l’opération file-put
, qui est le résultat de la jcs:execute()
fonction, est stockée dans la out
variable. Si l’opération rencontre une erreur, le script l’imprime à l’interface de ligne de commande. Si l’opération file-put
réussit, le contenu spécifié par l’élément file-contents
de balise est exporté vers le fichier spécifié sur l’équipement distant. La connexion à l’hôte distant est alors fermée. Le script exporte également le contenu vers un fichier identique sur l’équipement local.
L’exemple de script inclut les éléments permission
de balise facultatifs et delete-if-exist
pour l’opération file-put
. En incluant la delete-if-exist
balise, le script remplace tout fichier existant du même nom sur les hôtes locaux et distants. Dans cet exemple, la permission
balise est définie sur 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>
Syntaxe SLAX
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; } }
Configuration
Procédure
Procédure étape par étape
Pour télécharger, activer et tester le script :
Copiez le script XSLT ou SLAX dans un fichier texte, nommez le fichier export.xsl ou export.slax le cas échéant et copiez-le dans le répertoire /var/db/scripts/op/ de l’équipement.
En mode configuration, incluez l’instruction
file
au niveau de la hiérarchie et, le[edit system scripts op]
cas échéant, export.xsl ou export.slax .[edit system scripts op] user@host# set file export.(slax | xsl)
Émettre la
commit and-quit
commande.[edit] user@host# commit and-quit
Exécutez le script op en exécutant la commande du
op export
mode opérationnel et incluez tous les arguments nécessaires.
Vérification
Vérification des arguments des scripts op
But
Vérifiez que les noms et les descriptions des arguments s’affichent dans l’interface de ligne de commande.
Action
Émettre la commande du op exort ?
mode opérationnel. L’interface de ligne de commande répertorie les réussites possibles des arguments de script en fonction des définitions de la variable globale arguments
du script.
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
Vérification de l’exécution des scripts op
But
Vérifiez que le script se comporte comme prévu.
Action
Émettre la commande du op export myhost host encoding encoding filename file
mode opérationnel et inclure le nom d’utilisateur et le mot de passe appropriés lorsque vous y êtes invité. Si l’exécution de scripts réussit, le résultat de la <get-software-information>
demande RPC est écrit dans le fichier sur l’équipement distant et sur l’équipement local. Par exemple :
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
Si vous ne fournissez pas l’adresse IP ou le nom d’hôte de l’équipement distant dans les arguments de ligne de commande, le script génère une erreur et arrête l’exécution.
root@host> op export error: missing mandatory argument 'myhost'
Si vous omettez la delete-if-exist
balise enfant de l’opération file-put
et que le fichier spécifié existe déjà, le script signale une erreur.
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
Si vous exécutez le script et que vous incluez un chemin d’annuaire qui n’existe pas sur l’hôte local ou distant, le script signale une erreur.
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