Exemplo: encontre LSPs em vários destinos usando um script op
Este exemplo usa um script de operação para verificar caminhos comutados por rótulos (LSPs) para vários destinos.
Requisitos
Este exemplo usa um dispositivo que executa o Junos OS.
Visão geral e script de operação
O script de exemplo a seguir, exibido tanto no XSLT quanto no SLAX, verifica se os LSPs estão em vários destinos. O script tem um argumento de linha de comando obrigatório, o endereço que especifica o endpoint LSP. O argumento do endereço pode incluir um comprimento de prefixo opcional. Se nenhum endereço for especificado, o script gera uma mensagem de erro e interrompe a execução.
A get-configuration
variável armazena a chamada de procedimento remoto (RPC) para recuperar o [edit protocols mpls]
nível de hierarquia da configuração comprometida do dispositivo. Essa configuração é armazenada na config
variável. A get-route-information
variável armazena o RPC equivalente ao show route address terse
comando de modo operacional, onde o valor da destination
tag especifica address. O script define esse valor para o endereço especificado pelo usuário na linha de comando. O script invoca o get-route-information
RPC e armazena a saída na rpc-out
variável. Se rpc-out
não conter erros, o script examinará todas as entradas de rota do host presentes no route-table/rt/rt-destination
nó.
Para cada entrada de rota de host, se um LSP até o destino estiver configurado na configuração ativa, o script gera uma mensagem "Encontrada" com o endereço de destino e o nome LSP correspondente na saída. Se um LSP para o destino não estiver configurado, a saída gera uma mensagem "Ausente" contendo o endereço de destino e o nome do host.
Sintaxe XSLT
<?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>address</name> <description>LSP endpoint</description> </argument> </xsl:variable> <xsl:param name="address"/> <xsl:template match="/"> <op-script-output> <xsl:choose> <xsl:when test="$address = ''"> <xnm:error> <message>missing mandatory argument 'address'</message> </xnm:error> </xsl:when> <xsl:otherwise> <xsl:variable name="get-configuration"> <get-configuration database="committed"> <configuration> <protocols> <mpls/> </protocols> </configuration> </get-configuration> </xsl:variable> <xsl:variable name="config" select="jcs:invoke($get-configuration)"/> <xsl:variable name="mpls" select="$config/protocols/mpls"/> <xsl:variable name="get-route-information"> <get-route-information> <terse/> <destination> <xsl:value-of select="$address"/> </destination> </get-route-information> </xsl:variable> <xsl:variable name="rpc-out" select="jcs:invoke($get-route-information)"/> <xsl:choose> <xsl:when test="$rpc-out//xnm:error"> <xsl:copy-of select="$rpc-out//xnm:error"/> </xsl:when> <xsl:otherwise> <xsl:for-each select="$rpc-out/route-table/rt/rt-destination"> <xsl:choose> <xsl:when test="contains(.,'/32')"> <xsl:variable name="dest" select="substring-before(.,'/')"/> <xsl:variable name="lsp" select="$mpls/label-switched-path[to = $dest]"/> <xsl:choose> <xsl:when test="$lsp"> <output> <xsl:value-of select="concat('Found: ', $dest, ' (',$lsp/to, ') --> ', $lsp/name)"/> </output> </xsl:when> <xsl:otherwise> <xsl:variable name="name" select="jcs:hostname($dest)"/> <output> <xsl:value-of select="concat('Name: ', $name)"/> </output> <output> <xsl:value-of select="concat('Missing: ', $dest)"/> </output> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <output> <xsl:value-of select="concat('Not a host route: ', .)"/> </output> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </op-script-output> </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> "address"; <description> "LSP endpoint"; } } param $address; match / { <op-script-output> { if ($address = '') { <xnm:error> { <message> "missing mandatory argument 'address'"; } } else { var $get-configuration = { <get-configuration database="committed"> { <configuration> { <protocols> { <mpls>; } } } } var $config = jcs:invoke($get-configuration); var $mpls = $config/protocols/mpls; var $get-route-information = { <get-route-information> { <terse>; <destination> $address; } } var $rpc-out = jcs:invoke($get-route-information); if ($rpc-out//xnm:error) { copy-of $rpc-out//xnm:error; } else { for-each ($rpc-out/route-table/rt/rt-destination) { if (contains(.,'/32')) { var $dest = substring-before(.,'/'); var $lsp = $mpls/label-switched-path[to = $dest]; if ($lsp) { <output> 'Found: ' _ $dest _ ' (' _ $lsp/to _ ') - -> ' _ $lsp/name; } else { var $name = jcs:hostname($dest); <output> 'Name: ' _ $name; <output> 'Missing: ' _ $dest; } } else { <output> 'Not a host route: ' _ .; } } } } } }
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 lsp.xsl ou lsp.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 lsp.xsl ou lsp.slax conforme apropriado.[edit system scripts op] user@host# set file lsp.(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 lsp address address
modo operacional.
Verificação
Verificando a execução do script
Propósito
Verifique se o script se comporta como esperado.
Ação
Emitimos o comando do op lsp address address
modo operacional para executar o script. A saída varia dependendo da configuração.
user@R4> op lsp address 10.168.215.0/24 Found: 192.168.215.1 (192.168.215.1) --> R4>R1 Found: 192.168.215.2 (192.168.215.2) --> R4>R2 Name: R3 Missing: 10.168.215.3 Name: R5 Missing: 10.168.215.4 Name: R6 Missing: 10.168.215.5