Exemplo: arquivos de exportação usando um script de operação
O script de operação neste exemplo usa a operação de protocolo file-put Junos XML para escrever a um arquivo em um servidor remoto e no dispositivo local.
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-put Junos XML cria um arquivo e escreve o conteúdo especificado nesse arquivo. A sintaxe básica para usar o comando é a file-put seguinte:
<rpc> <file-put> <delete-if-exist /> <encoding>value</encoding> <filename>value</filename> <permission>value</permission> <file-contents>file</file-contents> </file-put> </rpc>
Os seguintes elementos de tag são usados com o file-put comando. Essas etiquetas podem ser colocadas em qualquer ordem, com exceção de file-contents. O file-contents elemento tag deve ser a última tag da lista.
delete-if-exist— (Opcional) Se incluído, qualquer arquivo existente é sobreescrito. Se a tag for omitida, um erro é devolvido se um arquivo existente for encontrado.encoding— (Obrigatório) Especifica o tipo de codificação usada. Você pode usarASCIIoubase64codificar.filename— (Obrigatório) Nesta tag, você inclui o caminho e o nome de arquivo completos ou relativos do arquivo para criar. Quando você usa um caminho relativo, o caminho especificado é relativo ao diretório doméstico do usuário. Se o diretório especificado não existir, o sistema retorna um erro de "diretório não existe".permission— (Opcional) Define a permissão UNIX do arquivo no servidor remoto. Por exemplo, para aplicar o acesso de leitura/gravação para o usuário e ler o acesso a outros, você definiria o valor da permissão para 0644. Para obter uma explicação completa das permissões do UNIX, consulte ochmodcomando.file-contents— (Obrigatório) O conteúdo de arquivo codificado ASCII ou base64 para exportação. Esta deve ser a última tag da lista.
Sintaxe XSLT
O script de amostra a seguir executa uma solicitação de API Junos XML e exporta os resultados para um arquivo em um dispositivo remoto e um arquivo no dispositivo local. 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 invoca a solicitação de API <get-software-information> Junos XML no dispositivo local e armazena o resultado na result variável. O script declara a fileput variável, que contém a chamada de procedimento remoto (RPC) para a file-put 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-put 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-put operação for bem-sucedida, o conteúdo especificado pelo file-contents elemento tag é exportado para o arquivo especificado no dispositivo remoto. A conexão com o host remoto é então fechada. O script também exporta o conteúdo para um arquivo idêntico no dispositivo local.
O script de amostra inclui os elementos permission de tag opcionais e delete-if-exist a file-put operação. Ao incluir a delete-if-exist tag, o script sobregrava qualquer arquivo de mesmo nome existente nos hosts remotos e locais. Neste exemplo, a permission tag está definida para 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>
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 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;
}
}
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 export.xsl ou export.slax conforme apropriado e copie-o para o /var/db/scripts/op/ directory no dispositivo.
No modo de configuração, inclua a
filedeclaração no nível de[edit system scripts op]hierarquia e export.xsl ou export.slax conforme apropriado.[edit system scripts op] user@host# set file export.(slax | xsl)
Emitimos o
commit and-quitcomando.[edit] user@host# commit and-quit
Execute o script de operação emitindo o comando de
op exportmodo operacional e inclua quaisquer argumentos necessários.
Verificação
Verificando os argumentos do script de operações
Propósito
Verifique se os nomes e descrições dos argumentos aparecem na CLI.
Ação
Emitimos o comando do op exort ? 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 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
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 export 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 resultado da solicitação de <get-software-information> RPC será escrito no arquivo do dispositivo remoto e também no dispositivo local. Por exemplo:
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
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 export error: missing mandatory argument 'myhost'
Se você omitir a delete-if-exist tag infantil da file-put operação e o arquivo especificado já existir, o script relatará um erro.
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
Se você executar o script e incluir um caminho de diretório que não exista no remoto ou no host local, o script relata um erro.
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