NESTA PÁGINA
Exemplo: Personalize a saída das interfaces de show terse Command usando um script op
Este exemplo usa um script de operação para personalizar a saída do show interfaces terse
comando. Uma explicação linha a linha do script XSLT é fornecida.
Requisitos
Este exemplo usa um dispositivo que executa o Junos OS.
Visão geral e script de op
Por padrão, o layout do show interfaces terse
comando se parece com este:
user@host> show interfaces terse Interface Admin Link Proto Local Remote dsc up up fxp0 up up fxp0.0 up up inet 192.168.71.246/21 fxp1 up up fxp1.0 up up inet 10.0.0.4/8 inet6 fe80::200:ff:fe00:4/64 fc00::10:0:0:4/64 tnp 4 gre up up ipip up up lo0 up up lo0.0 up up inet 127.0.0.1 --> 0/0 lo0.16385 up up inet inet6 fe80::2a0:a5ff:fe12:2f04 lsi up up mtun up up pimd up up pime up up tap up up
No Junos XML, os campos de saída são representados da seguinte forma:
user@host> show interfaces terse | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <interface-information xmlns="http://xml.juniper.net/junos/10.0R1/junos-interface" junos:style="terse"> <physical-interface> <name>dsc</name> <admin-status>up</admin-status> <oper-status>up</oper-status> </physical-interface> <physical-interface> <name>fxp0</name> <admin-status>up</admin-status> <oper-status>up</oper-status> <logical-interface> <name>fxp0.0</name> <admin-status>up</admin-status> <oper-status>up</oper-status> ... Remainder of output omitted for brevity ...
Sintaxe XSLT
O script a seguir personaliza a saída do show interfaces terse
comando. Uma explicação linha a linha do script é fornecida.
1 <?xml version="1.0" standalone="yes"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:junos="http://xml.juniper.net/junos/*/junos" 5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" 6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> 7 <xsl:import href="../import/junos.xsl"/> 8 <xsl:variable name="arguments"> 9 <argument> 10 <name>interface</name> 11 <description>Name of interface to display</description> 12 </argument> 13 <argument> 14 <name>protocol</name> 15 <description>Protocol to display (inet, inet6)</description> 16 </argument> 17 </xsl:variable> 18 <xsl:param name="interface"/> 19 <xsl:param name="protocol"/> 20 <xsl:template match="/"> 21 <op-script-results> 22 <xsl:variable name="rpc"> 23 <get-interface-information> 24 <terse/> 25 <xsl:if test="$interface"> 26 <interface-name> 27 <xsl:value-of select="$interface"/> 28 </interface-name> 29 </xsl:if> 30 </get-interface-information> 31 </xsl:variable> 32 <xsl:variable name="out" select="jcs:invoke($rpc)"/> 33 <interface-information junos:style="terse"> 34 <xsl:choose> 35 <xsl:when test="$protocol='inet' or $protocol='inet6' or $protocol='mpls' or $protocol='tnp'"> 36 <xsl:for-each select="$out/physical-interface/ logical-interface[address-family/address-family-name = $protocol]"> 37 <xsl:call-template name="intf"/> 38 </xsl:for-each> 39 </xsl:when> 40 <xsl:when test="$protocol"> 41 <xnm:error> 42 <message> 43 <xsl:text>invalid protocol: </xsl:text> 44 <xsl:value-of select="$protocol"/> 45 </message> 46 </xnm:error> 47 </xsl:when> 48 <xsl:otherwise> 49 <xsl:for-each select="$out/physical-interface/logical-interface"> 50 <xsl:call-template name="intf"/> 51 </xsl:for-each> 52 </xsl:otherwise> 53 </xsl:choose> 54 </interface-information> 55 </op-script-results> 56 </xsl:template> 57 <xsl:template name="intf"> 58 <xsl:variable name="status"> 59 <xsl:choose> 60 <xsl:when test="admin-status='up' and oper-status='up'"> 61 <xsl:text> </xsl:text> 62 </xsl:when> 63 <xsl:when test="admin-status='down'"> 64 <xsl:text>offline</xsl:text> 65 </xsl:when> 66 <xsl:when test="oper-status='down' and ../admin-status='down'"> 67 <xsl:text>p-offline</xsl:text> 68 </xsl:when> 69 <xsl:when test="oper-status='down' and ../oper-status='down'"> 70 <xsl:text>p-down</xsl:text> 71 </xsl:when> 72 <xsl:when test="oper-status='down'"> 73 <xsl:text>down</xsl:text> 74 </xsl:when> 75 <xsl:otherwise> 76 <xsl:value-of select="concat(oper-status, '/', admin-status)"/> 77 </xsl:otherwise> 78 </xsl:choose> 79 </xsl:variable> 80 <xsl:variable name="desc"> 81 <xsl:choose> 82 <xsl:when test="description"> 83 <xsl:value-of select="description"/> 84 </xsl:when> 85 <xsl:when test="../description"> 86 <xsl:value-of select="../description"/> 87 </xsl:when> 88 </xsl:choose> 89 </xsl:variable> 90 <logical-interface> 91 <name><xsl:value-of select="name"/></name> 92 <xsl:if test="string-length($desc)"> 93 <admin-status><xsl:value-of select="$desc"/></admin-status> 94 </xsl:if> 95 <admin-status><xsl:value-of select="$status"/></admin-status> 96 <xsl:choose> 97 <xsl:when test="$protocol"> 98 <xsl:copy-of select="address-family[address-family-name = $protocol]"/> 99 </xsl:when> 100 <xsl:otherwise> 101 <xsl:copy-of select="address-family"/> 102 </xsl:otherwise> 103 </xsl:choose> 104 </logical-interface> 105 </xsl:template> 106 </xsl:stylesheet>
Explicação linha a linha
As linhas 1 a 7, Linha 20 e Linhas 105 e 106 são a plataforma de caldeira que você inclui em todos os scripts de operação. Para obter mais informações, consulte o Required Boilerplate for Op Scripts.
1 <?xml version="1.0" standalone="yes"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:junos="http://xml.juniper.net/junos/*/junos" 5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" 6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> 7 <xsl:import href="../import/junos.xsl"/> ... 20 <xsl:template match="/"> ... 105 </xsl:template> 106 </xsl:stylesheet>
As linhas 8 a 17 declaram uma variável chamada arguments
, contendo dois argumentos ao script: interface
e protocol
. Essa declaração variável faz interface
com que e protocol
apareçam na interface de linha de comando (CLI) como argumentos disponíveis para o script.
8 <xsl:variable name="arguments"> 9 <argument> 10 <name>interface</name> 11 <description>Name of interface to display</description> 12 </argument> 13 <argument> 14 <name>protocol</name> 15 <description>Protocol to display (inet, inet6)</description> 16 </argument> 17 </xsl:variable>
As linhas 18 e 19 declaram dois parâmetros ao script, correspondentes aos argumentos criados nas Linhas 8 a 17. Os nomes dos parâmetros devem corresponder exatamente aos nomes dos argumentos.
18 <xsl:param name="interface"/> 19 <xsl:param name="protocol"/>
As linhas 20 a 31 declaram uma variável nomeada rpc
. O show interfaces terse
comando é atribuído à rpc
variável. Se você incluir o interface
argumento quando executa o script, o valor do argumento (o nome da interface) é passado para o script.
20 <xsl:template match="/"> 21 <op-script-results> 22 <xsl:variable name="rpc"> 23 <get-interface-information> 24 <terse/> 25 <xsl:if test="$interface"> 26 <interface-name> 27 <xsl:value-of select="$interface"/> 28 </interface-name> 29 </xsl:if> 30 </get-interface-information> 31 </xsl:variable>
A Linha 32 declara uma variável nomeada out
e aplica-se a ela a execução da rpc
variável (show interfaces terse
comando).
32 <xsl:variable name="out" select="jcs:invoke($rpc)"/>
A Linha 33 especifica que o nível de saída do show interfaces
comando que está sendo modificado é terse
(em extensive
vez de , detail
e assim por diante).
33 <interface-information junos:style="terse">
As linhas 34 a 39 especificam que, se você incluir o protocol
argumento quando executa o script e se o valor do protocolo que você especifica forinet
, inet6
outnp
mpls
, o intf
modelo é aplicado a cada instância desse tipo de protocolo na saída.
34 <xsl:choose> 35 <xsl:when test="$protocol='inet' or $protocol='inet6' or $protocol='mpls' or $protocol='tnp'"> 36 <xsl:for-each select="$out/physical-interface/ logical-interface[address-family/address-family-name = $protocol]"> 37 <xsl:call-template name="intf"/> 38 </xsl:for-each> 39 </xsl:when>
As linhas 40 a 47 especificam que se você incluir o protocol
argumento quando executa o script e se o valor do protocolo que você especifica for diferente inet
de, inet6
oumpls
tnp
, uma mensagem de erro é gerada.
40 <xsl:when test="$protocol"> 41 <xnm:error> 42 <message> 43 <xsl:text>invalid protocol: </xsl:text> 44 <xsl:value-of select="$protocol"/> 45 </message> 46 </xnm:error> 47 </xsl:when>
As linhas 48 a 52 especificam que, se você não incluir o protocol
argumento quando executa o script, o intf
modelo é aplicado a cada interface lógica na saída.
48 <xsl:otherwise> 49 <xsl:for-each select="$out/physical-interface/logical-interface"> 50 <xsl:call-template name="intf"/> 51 </xsl:for-each> 52 </xsl:otherwise>
As linhas 53 a 56 estão fechando etiquetas.
53 </xsl:choose> 54 </interface-information> 55 </op-script-results> 56 </xsl:template>
A Linha 57 abre o intf
modelo. Este modelo personaliza a saída do show interfaces terse
comando.
57 <xsl:template name="intf">
A Linha 58 declara uma variável chamada status
, com a finalidade de especificar como o status da interface é relatado. As linhas 59 a 78 contêm uma <xsl:choose>
instrução que povoa a status
variável considerando todos os estados possíveis. Como sempre no XSLT, a primeira <xsl:when>
instrução que avalia como TRUE é executada, e o restante é ignorado. Cada <xsl:when>
instrução é explicada separadamente.
58 <xsl:variable name="status"> 59 <xsl:choose>
As linhas 60 a 62 especificam que, se admin-status
estiver 'ativa' e oper-status
estiver 'ativa', nenhuma saída é gerada. Nesse caso, a status
variável permanece vazia.
60 <xsl:when test="admin-status='up' and oper-status='up'"> 61 <xsl:text> </xsl:text> 62 </xsl:when>
As linhas 63 a 65 especificam que, se admin-status
estiver "baixa", a status
variável contém o texto offline
.
63 <xsl:when test="admin-status='down'"> 64 <xsl:text>offline</xsl:text> 65 </xsl:when>
As linhas 66 a 68 especificam que, se oper-status
estiver 'baixa' e a interface admin-status
física estiver 'baixa', a status
variável contém o texto p-offline
. (../
selecione a interface física.)
66 <xsl:when test="oper-status='down' and ../admin-status='down'"> 67 <xsl:text>p-offline</xsl:text> 68 </xsl:when>
As linhas 69 a 71 especificam que, se oper-status
estiver 'baixa' e a interface oper-status
física estiver 'baixa', a status
variável contém o texto p-down
. (../
selecione a interface física.)
69 <xsl:when test="oper-status='down' and ../oper-status='down'"> 70 <xsl:text>p-down</xsl:text> 71 </xsl:when>
As linhas 72 a 74 especificam que, se oper-status
estiver "baixa", a status
variável contém o texto down
.
72 <xsl:when test="oper-status='down'"> 73 <xsl:text>down</xsl:text> 74 </xsl:when>
As linhas 75 a 77 especificam que, se nenhum dos casos de teste for verdadeiro, a status
variável contém oper-status
e admin-status
concatenada com uma barra como separador.
75 <xsl:otherwise> 76 <xsl:value-of select="concat(oper-status, '/', admin-status)"/> 77 </xsl:otherwise>
As linhas 78 e 79 estão fechando etiquetas.
78 </xsl:choose> 79 </xsl:variable>
As linhas 80 a 89 definem uma variável chamada desc
. Uma <xsl:choose>
instrução povoa a variável selecionando a descrição da interface mais específica disponível. Se uma descrição lógica da interface estiver incluída na configuração, ela é usada para povoar a desc
variável. Se não, a descrição da interface física é usada. Se nenhuma descrição da interface física for incluída na configuração, a variável permanecerá vazia. Como sempre no XSLT, a primeira <xsl:when>
instrução que avalia como TRUE é executada, e o restante é ignorado.
80 <xsl:variable name="desc"> 81 <xsl:choose> 82 <xsl:when test="description"> 83 <xsl:value-of select="description"/> 84 </xsl:when> 85 <xsl:when test="../description"> 86 <xsl:value-of select="../description"/> 87 </xsl:when> 88 </xsl:choose> 89 </xsl:variable>
O restante do script especifica como a saída do modo operacional é exibida.
As linhas 90 e 91 especificam que o nome da interface lógica é exibido primeiro na saída.
90 <logical-interface> 91 <name><xsl:value-of select="name"/></name>
As linhas 92 a 94 testam se a desc
variável tem um número não zero de caracteres. Se o número de caracteres for superior a zero, a descrição da interface será exibida na localização padrão do admin-status
campo. (Na saída padrão, o admin-status
campo é exibido na segunda linha.)
92 <xsl:if test="string-length($desc)"> 93 <admin-status><xsl:value-of select="$desc"/></admin-status> 94 </xsl:if>
A Linha 95 especifica que o status da interface conforme definido na variável é exibido em status
seguida.
95 <admin-status><xsl:value-of select="$status"/></admin-status>
As linhas 96 a 103 especificam que, se você incluir o protocol
argumento quando executa o script, apenas interfaces com esse protocolo configurado são exibidas. Se você não incluir o protocol
argumento, todas as interfaces são exibidas.
96 <xsl:choose> 97 <xsl:when test="$protocol"> 98 <xsl:copy-of select="address-family[address-family-name = $protocol]"/> 99 </xsl:when> 100 <xsl:otherwise> 101 <xsl:copy-of select="address-family"/> 102 </xsl:otherwise> 103 </xsl:choose>
As linhas 104 a 106 são etiquetas de fechamento.
104 </logical-interface> 105 </xsl:template> 106 </xsl:stylesheet>
Sintaxe SLAX
A versão SLAX do script é a seguinte:
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> "interface"; <description> "Name of interface to display"; } <argument> { <name> "protocol"; <description> "Protocol to display (inet, inet6)"; } } param $interface; param $protocol; match / { <op-script-results> { var $rpc = { <get-interface-information> { <terse>; if ($interface) { <interface-name> $interface; } } } var $out = jcs:invoke($rpc); <interface-information junos:style="terse"> { if ($protocol='inet' or $protocol='inet6' or $protocol='mpls' or $protocol='tnp') { for-each ($out/physical-interface/ logical-interface[address-family/address-family-name = $protocol]) { call intf(); } } else if ($protocol) { <xnm:error> { <message> { expr "invalid protocol: "; expr $protocol; } } } else { for-each ($out/physical-interface/logical-interface) { call intf(); } } } } } intf () { var $status = { if (admin-status='up' and oper-status='up') { } else if (admin-status='down') { expr "offline"; } else if (oper-status='down' and ../admin-status='down') { expr "p-offline"; } else if (oper-status='down' and ../oper-status='down') { expr "p-down"; } else if (oper-status='down') { expr "down"; } else { expr oper-status _ '/' _ admin-status; } } var $desc = { if (description) { expr description; } else if (../description) { expr ../description; } } <logical-interface> { <name> name; if (string-length($desc)) { <admin-status> $desc; } <admin-status> $status; if ($protocol) { copy-of address-family[address-family-name = $protocol]; } else { copy-of address-family; } } }
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 a interface do arquivo.xsl ou interface.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 interface.xsl ou interface.slax conforme apropriado.[edit system scripts op] user@host# set file interface.(slax | xsl)
Emita 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 do
op interface
modo operacional.
Verificação
Verificando a saída de script de confirmação
Propósito
Verifique se o script se comporta como esperado.
Ação
Emite os show interfaces terse
comandos operacionais e op interface
compare a saída. O show interfaces terse
comando exibe a saída padrão. O op interface
comando exibe a saída personalizada.
user@host> show interfaces terse Interface Admin Link Proto Local Remote dsc up up fxp0 up up fxp0.0 up up inet 192.168.71.246/21 fxp1 up up fxp1.0 up up inet 10.0.0.4/8 inet6 fe80::200:ff:fe00:4/64 fc00::10:0:0:4/64 tnp 4 gre up up ipip up up lo0 up up lo0.0 up up inet 127.0.0.1 --> 0/0 lo0.16385 up up inet inet6 fe80::2a0:a5ff:fe12:2f04 lsi up up mtun up up pimd up up pime up up tap up up user@host> op interface Interface Admin Link Proto Local Remote fxp0.0 This is the Ethernet Management interface. inet 192.168.71.246/21 fxp1.0 inet 10.0.0.4/8 inet6 fe80::200:ff:fe00:4/64 fc00::10:0:0:4/64 tnp 4 lo0.0 inet 127.0.0.1 --> 0/0 lo0.16385 inet inet6 fe80::2a0:a5ff:fe12:2f04-->
Emita o op interface
comando operacional para diferentes níveis de hierarquia e revise a saída. Por exemplo:
user@host> op interface interface fxp0 Interface Admin Link Proto Local Remote fxp0.0 This is the Ethernet Management interface. inet 192.168.71.246/21 user@host> op interface protocol inet Interface Admin Link Proto Local Remote fxp0.0 This is the Ethernet Management interface. inet 192.168.71.246/21 fxp1.0 inet 10.0.0.4/8 lo0.0 inet 127.0.0.1 --> 0/0 lo0.16385 inet