Ejemplo: exportar archivos mediante un script de operación
El script op de este ejemplo utiliza la operación del protocolo file-put
XML de Junos para escribir en un archivo en un servidor remoto y en el dispositivo local.
Requisitos
En este ejemplo se utiliza un dispositivo que ejecuta Junos OS.
Descripción general y script de operación
La operación de protocolo file-put
XML de Junos crea un archivo y escribe el contenido especificado en ese archivo. La sintaxis básica para usar el file-put
comando es la siguiente:
<rpc> <file-put> <delete-if-exist /> <encoding>value</encoding> <filename>value</filename> <permission>value</permission> <file-contents>file</file-contents> </file-put> </rpc>
Los siguientes elementos de etiqueta se utilizan con el file-put
comando. Estas etiquetas se pueden colocar en cualquier orden, con la excepción de file-contents
. El file-contents
elemento tag debe ser la última etiqueta de la lista.
delete-if-exist
—(Opcional) Si se incluye, se sobrescribe cualquier archivo existente. Si se omite la etiqueta, se devuelve un error si se encuentra un archivo existente.encoding
—(Obligatorio) Especifica el tipo de codificación utilizada. Puede usarASCII
obase64
codificar.filename
—(Obligatorio) Dentro de esta etiqueta, se incluyen la ruta completa o relativa y el nombre de archivo del archivo que se va a crear. Cuando se utiliza una ruta de acceso relativa, la ruta de acceso especificada es relativa al directorio principal del usuario. Si el directorio especificado no existe, el sistema devuelve un error "el directorio no existe".permission
—(Opcional) Establece el permiso UNIX del archivo en el servidor remoto. Por ejemplo, para aplicar acceso de lectura y escritura para el usuario y acceso de lectura a otros, debe establecer el valor de permiso en 0644. Para obtener una explicación completa de los permisos de UNIX, consulte elchmod
comando.file-contents
—(Obligatorio) Contenido del archivo codificado ASCII o base64 que se va a exportar. Esta debe ser la última etiqueta de la lista.
Sintaxis XSLT
La siguiente secuencia de comandos de ejemplo ejecuta una solicitud de API XML de Junos y exporta los resultados a un archivo en un dispositivo remoto y a un archivo en el dispositivo local. El script toma tres argumentos: la dirección IP o el nombre de host del dispositivo remoto, el nombre de archivo y la codificación del archivo. La arguments
variable se declara en el nivel global del script para que los nombres y descripciones de los argumentos sean visibles en la interfaz de línea de comandos (CLI).
El script invoca la solicitud de la API <get-software-information>
XML de Junos en el dispositivo local y almacena el resultado en la result
variable. El script declara la fileput
variable, que contiene la llamada a procedimiento remoto (RPC) para la file-put
operación. Los argumentos de la línea de comandos definen los valores de los elementos de filename
etiqueta y encoding
. Si falta el argumento myhost
obligatorio, el script emite un error y detiene la ejecución. De lo contrario, el script solicita el nombre de usuario y la contraseña que se usarán para conectarse al dispositivo remoto.
Si la conexión con el dispositivo remoto se realiza correctamente, el script ejecuta la RPC en el contexto del identificador de conexión. La salida de la file-put
operación, que es el resultado de la jcs:execute()
función, se almacena en la out
variable. Si la operación encuentra un error, el script imprime el error en la CLI. Si la file-put
operación se realiza correctamente, el contenido especificado por el elemento tag file-contents
se exporta al archivo especificado en el dispositivo remoto. A continuación, se cierra la conexión con el host remoto. El script también exporta el contenido a un archivo idéntico en el dispositivo local.
El script de ejemplo incluye los elementos permission
de etiqueta opcionales y delete-if-exist
para la file-put
operación. Al incluir la delete-if-exist
etiqueta, el script sobrescribe cualquier archivo existente del mismo nombre en los hosts remoto y local. En este ejemplo, la permission
etiqueta se establece en 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>
Sintaxis de 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; } }
Configuración
Procedimiento
Procedimiento paso a paso
Para descargar, habilitar y probar el script:
Copie el script XSLT o SLAX en un archivo de texto, asigne al archivo el nombre export.xsl o export.slax según corresponda y cópielo en el directorio /var/db/scripts/op/ del dispositivo.
En el modo de configuración, incluya la
file
instrucción en el nivel de[edit system scripts op]
jerarquía y export.xsl o export.slax , según corresponda.[edit system scripts op] user@host# set file export.(slax | xsl)
Emita el
commit and-quit
comando.[edit] user@host# commit and-quit
Ejecute el script op emitiendo el comando de
op export
modo operativo e incluya los argumentos necesarios.
Verificación
- Comprobación de los argumentos del script de operación
- Verificación de la ejecución del script de operación
Comprobación de los argumentos del script de operación
Propósito
Compruebe que los nombres y las descripciones de los argumentos aparecen en la CLI.
Acción
Emita el comando de op exort ?
modo operativo. La CLI enumera las posibles finalizaciones de los argumentos del script en función de las definiciones de la variable global arguments
del 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
Verificación de la ejecución del script de operación
Propósito
Compruebe que el script se comporta como se esperaba.
Acción
Emita el comando de op export myhost host encoding encoding filename file
modo operativo e incluya el nombre de usuario y la contraseña adecuados cuando se le solicite. Si la ejecución del script se realiza correctamente, el resultado de la <get-software-information>
solicitud RPC se escribe en el archivo del dispositivo remoto y también en el dispositivo local. Por ejemplo:
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 no proporciona la dirección IP o el nombre de host del dispositivo remoto en los argumentos de la línea de comandos, la secuencia de comandos emite un error y detiene la ejecución.
root@host> op export error: missing mandatory argument 'myhost'
Si omite la delete-if-exist
etiqueta secundaria de la file-put
operación y el archivo especificado ya existe, la secuencia de comandos informa de un error.
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 ejecuta la secuencia de comandos e incluye una ruta de acceso de directorio que no existe ni en el host remoto ni en el local, la secuencia de comandos notifica un error.
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