Ejemplo: importar archivos mediante un script de operación
El script op de este ejemplo utiliza la operación del protocolo file-get
XML de Junos para leer el contenido de un archivo desde un servidor remoto.
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-get
XML de Junos lee el contenido de un archivo. La sintaxis básica para usar el file-get
comando es la siguiente:
<rpc> <file-get> <filename>value</filename> <encoding>value</encoding> </file-get> </rpc>
Los siguientes elementos de etiqueta se utilizan con el file-get
comando.
encoding
—(Obligatorio) Especifica el tipo de codificación utilizada. Puede utilizarASCII
,base64
oraw
codificación.filename
—(Obligatorio) Dentro de esta etiqueta, se incluyen la ruta completa o relativa y el nombre de archivo del archivo que se va a importar. Cuando se utiliza una ruta relativa, la ruta especificada es relativa al directorio / var/tmp/ si lafile-get
operación se ejecuta localmente. Si la operación se ejecuta de forma remota en el contexto de un identificador de conexión, la ruta es relativa al directorio principal del usuario.
Cuando se utiliza la codificación ASCII, la operación convierte los file-get
caracteres de control del archivo importado en el carácter Unicode 'SECTION SIGN' (U+00A7).
Sintaxis XSLT
La siguiente secuencia de comandos de ejemplo se conecta a un dispositivo remoto y lee el contenido del archivo especificado. 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 declara la variable, que contiene la llamada a procedimiento remoto (RPC) para la file-get
fileget
operación. Los argumentos de la línea de comandos definen los valores de los elementos de filename
etiqueta yencoding
. 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 operación, que es el resultado de la función, se almacena en la file-get
jcs:execute()
out
variable. Si la operación encuentra un error, el script imprime el error en la CLI. Si la operación se realiza correctamente, el contenido del archivo se almacena en la variable, que se imprime en la file-get
out
CLI. A continuación, se cierra la conexión con el host remoto.
<?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>
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 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."; } } } }
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 import.xsl o import.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 e import.xsl o import.slax , según corresponda.[edit system scripts op] user@host# set file import.(slax | xsl)
Emita el
commit and-quit
comando para confirmar la configuración y volver al modo operativo.[edit] user@host# commit and-quit
Ejecute el script op emitiendo el comando de
op import
modo operativo e incluya los argumentos necesarios.
Verificación
Comprobación de los argumentos del script
Propósito
Compruebe que los nombres y las descripciones de los argumentos aparecen en la CLI.
Acción
Emita el comando de op import ?
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 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
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 modo operativo e incluya el op import myhost host encoding encoding filename file
nombre de usuario y la contraseña adecuados cuando se le solicite. Si la ejecución del script se realiza correctamente, se muestra el contenido del archivo solicitado. Por ejemplo:
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"; ...
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 import error: missing mandatory argument 'myhost'
Además, si la ruta de acceso o el archivo especificados no existen, el script emite un error.
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