Exemplo: importar arquivos usando um script de operação
O script de operação neste exemplo usa a operação de protocolo file-get
Junos XML para ler o conteúdo de um arquivo de um servidor remoto.
Requisitos
Este exemplo usa um dispositivo que executa o Junos OS.
Visão geral e script de operação
A operação de protocolo file-get
Junos XML lê o conteúdo de um arquivo. A sintaxe básica para usar o comando é a file-get
seguinte:
<rpc> <file-get> <filename>value</filename> <encoding>value</encoding> </file-get> </rpc>
Os seguintes elementos de tag são usados com o file-get
comando.
encoding
— (Obrigatório) Especifica o tipo de codificação usada. Você pode usarASCII
oubase64
raw
codificar.filename
— (Obrigatório) Nesta tag, você inclui o caminho e o nome de arquivo completos ou relativos do arquivo para importar. Quando você usa um caminho relativo, o caminho especificado é relativo ao /var/tmp/ diretório se afile-get
operação for executada localmente. Se a operação for executada remotamente dentro do contexto de uma alça de conexão, o caminho será relativo ao diretório doméstico do usuário.
Quando você usa a codificação ASCII, a file-get
operação converte quaisquer caracteres de controle no arquivo importado para o caractere Unicode 'SECÇÃO SIGN' (U+00A7).
Sintaxe XSLT
O script de amostra a seguir se conecta a um dispositivo remoto e lê o conteúdo do arquivo especificado. O script leva três argumentos: o endereço IP ou nome de host do dispositivo remoto, o nome de arquivo e a codificação do arquivo. A arguments
variável é declarada no nível global do script para que os nomes e descrições dos argumentos sejam visíveis na interface de linha de comando (CLI).
O script declara a fileget
variável, que contém a chamada de procedimento remoto (RPC) para a file-get
operação. Os argumentos da linha de comando definem os valores para os filename
elementos de encoding
tag. Se o argumento myhost
obrigatório estiver faltando, o script emitirá um erro e interromperá a execução. Caso contrário, o script solicita o nome de usuário e a senha que serão usados para se conectar ao dispositivo remoto.
Se a conexão com o dispositivo remoto for bem-sucedida, o script executa o RPC no contexto da alça de conexão. A saída da file-get
operação, que é o resultado da jcs:execute()
função, é armazenada na out
variável. Se a operação encontrar um erro, o script imprime o erro na CLI. Se a file-get
operação for bem-sucedida, o conteúdo do arquivo será armazenado na out
variável, que é impressa na CLI. A conexão com o host remoto é então fechada.
<?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>
Sintaxe 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."; } } } }
Configuração
Procedimento
Procedimento passo a passo
Baixar, habilitar e testar o script:
Copie o script XSLT ou SLAX em um arquivo de texto, nomeie o arquivo import.xsl ou import.slax conforme apropriado e copie-o para o /var/db/scripts/op/ directory no dispositivo.
No modo de configuração, inclua a
file
declaração no nível de[edit system scripts op]
hierarquia e import.xsl ou import.slax conforme apropriado.[edit system scripts op] user@host# set file import.(slax | xsl)
Emite o
commit and-quit
comando para comprometer a configuração e voltar ao modo operacional.[edit] user@host# commit and-quit
Execute o script de operação emitindo o comando de
op import
modo operacional e inclua quaisquer argumentos necessários.
Verificação
Verificando os argumentos do script
Propósito
Verifique se os nomes e descrições dos argumentos aparecem na CLI.
Ação
Emitimos o comando do op import ?
modo operacional. A CLI lista as possíveis conclusões para os argumentos de script com base nas definições dentro da variável global arguments
no 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
Verificando a execução do script de operações
Propósito
Verifique se o script se comporta como esperado.
Ação
Emitimos o comando do op import myhost host encoding encoding filename file
modo operacional e incluam o nome de usuário e a senha apropriados quando solicitado. Se a execução do script for bem-sucedida, o conteúdo do arquivo solicitado será exibido. Por exemplo:
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"; ...
Se você não fornecer o endereço IP ou o nome de host do dispositivo remoto nos argumentos da linha de comando, o script emitirá um erro e interromperá a execução.
root@host> op import error: missing mandatory argument 'myhost'
Além disso, se o caminho ou arquivo especificado não existir, o script emitirá um erro.
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