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 extensivevez de , detaile 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, inet6outnpmpls, 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 inetde, inet6oumplstnp, 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
filedeclaraçã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-quitcomando 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 interfacemodo 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