Explicação linha a linha dos scripts de confirmação de amostras
Aplicando uma mudança nas interfaces SONET/SDH
O script de compromisso XSLT a seguir aplica uma mudança transitória em cada interface cujo nome começa com so-
, definindo o encapsulamento para ppp
. Para obter informações sobre mudanças transitórias, consulte a visão geral da geração de mudanças de configuração persistentes ou transitórias usando scripts de compromisso. Para uma versão SLAX deste exemplo, veja Exemplo: Gerando uma mudança transitória.
1 <?xml version="1.0"?> 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:template match="configuration"> 9 <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') \ and unit/family/inet]"> 10 <transient-change> 11 <interfaces> 12 <interface> 13 <name><xsl:value-of select="name"/></name> 14 <encapsulation>ppp</encapsulation> 15 </interface> 16 </interfaces> 17 </transient-change> 18 </xsl:for-each> 19 </xsl:template> 20 </xsl:stylesheet>
As linhas 1 a 8 são placas de caldeira, conforme descrito em Required Boilerplate for Commit Scripts e são omitidas aqui por brevidade.
A Linha 9 é uma instrução <xsl:for-each>
de programação que examina cada nó de interface cujos nomes começam com 'so-' e que foi family inet
ativado em qualquer unidade lógica. (Aparece aqui em duas linhas apenas para brevidade.)
9 <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') \ and unit/family/inet]">
A linha 10 é a tag aberta para uma mudança transitória. O conteúdo possível do <transient-change>
elemento é o mesmo que o conteúdo do elemento tag na operação <load-configuration>
de <configuration>
protocolo Junos XML.
10 <transient-change>
As linhas 11 a 16 representam o conteúdo da mudança transitória. O encapsulamento está definido para ppp
.
11 <interfaces> 12 <interface> 13 <name><xsl:value-of select="name"/></name> 14 <encapsulation>ppp</encapsulation> 15 </interface> 16 </interfaces>
As linhas 17 a 19 fecham todas as tags abertas neste modelo.
17 </transient-change> 18 </xsl:for-each> 19 </xsl:template>
A Linha 20 fecha a folha de estilo e o script de compromisso.
20 </xsl:stylesheet>
Aplicando uma mudança nas interfaces habilitadas por ISO
O script XSLT da amostra a seguir garante que as interfaces habilitadas para um protocolo da Organização Internacional para a Padronização (ISO) também tenham o MPLS habilitado e sejam incluídas no nível de [edit protocols mpls interface]
hierarquia. Para uma versão SLAX deste exemplo, veja Exemplo: Controle is-IS e interfaces MPLS.
1 <?xml version="1.0"?> 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:template match="configuration"> 9 <xsl:variable name="mpls" select="protocols/mpls"/> 10 <xsl:for-each select="interfaces/interface/unit[family/iso]"> 11 <xsl:variable name="ifname" select="concat(../name, '.', name)"/> 12 <xsl:if test="not(family/mpls)"> 13 <xsl:call-template name="jcs:emit-change"> 14 <xsl:with-param name="message"> 15 <xsl:text> 16 Adding 'family mpls' to ISO-enabled interface 17 </xsl:text> 18 </xsl:with-param> 19 <xsl:with-param name="content"> 20 <family> 21 <mpls/> 22 </family> 23 </xsl:with-param> 24 </xsl:call-template> 25 </xsl:if> 26 <xsl:if test="$mpls and not($mpls/interface[name = $ifname])"> 27 <xsl:call-template name="jcs:emit-change"> 28 <xsl:with-param name="message"> 29 <xsl:text>Adding ISO-enabled interface </xsl:text> 30 <xsl:value-of select="$ifname"/> 31 <xsl:text> to [protocols mpls]</xsl:text> 32 </xsl:with-param> 33 <xsl:with-param name="dot" select="$mpls"/> 34 <xsl:with-param name="content"> 35 <interface> 36 <name> 37 <xsl:value-of select="$ifname"/> 38 </name> 39 </interface> 40 </xsl:with-param> 41 </xsl:call-template> 42 </xsl:if> 43 </xsl:for-each> 44 </xsl:template> 45 </xsl:stylesheet>
As linhas 1 a 8 são placas de caldeira, conforme descrito em Required Boilerplate for Commit Scripts e são omitidas aqui por brevidade.
A Linha 9 economiza uma referência ao nível de [edit protocols mpls]
hierarquia para que ela possa ser mencionada no loop a seguir for-each
.
9 <xsl:variable name="mpls" select="protocols/mpls"/>
A Linha 10 examina cada unidade de interface (interface lógica) na qual o ISO é habilitado. As select
paradas no unit
, mas o predicado limita a seleção a apenas aquelas unidades que contêm um <iso>
elemento aninhado sob um <family>
elemento.
10 <xsl:for-each select="interfaces/interface/unit[family/iso]">
A Linha 11 cria o nome da interface em uma variável. Primeiro, o name
atributo da declaração variável é definido para ifname
. No Junos OS, um nome de interface é a concatenação do nome do dispositivo, um período e o número da unidade. Neste ponto do script, o nó de contexto é o número da unidade, porque a Linha 10 muda o contexto para interfaces/interface/unidade. Refere-se ../name
ao <name>
elemento do nó pai do nó de contexto, que é o nome do dispositivo (type-fpc/pic/port). O token "name
" na expressão XPath refere-se ao <name>
elemento do nó de contexto, que é o número da unidade (unit-number
). Após a concatenação ser executada, a expressão XPath na Linha 11 resolve type-fpc//picport.unit-number. Conforme a <xsl:for-each>
instrução na Linha 10 atravessa a hierarquia e localiza interfaces habilitadas por ISO, os nomes da interface são armazenados recursivamente na ifname
variável.
11 <xsl:variable name="ifname" select="concat(../name, '.', name)"/>
A Linha 12 avalia como verdadeira para cada interface habilitada por ISO que não tem MPLS habilitada.
12 <xsl:if test="not(family/mpls)">
A Linha 13 chama o jcs:emit-change
modelo, que é um modelo de ajuda ou conveniência no arquivo junos.xsl . Este modelo é discutido no Modelo de emit-change (SLAX e XSLT) e emit_change (Python).
13 <xsl:call-template name="jcs:emit-change">
As linhas 14 a 18 usam o message
parâmetro do jcs:emit-change
modelo. O parâmetro de mensagem é um atalho que você pode usar em vez de incluir explicitamente os <warning>
, <edit-path>
e <statement>
elementos.
14 <xsl:with-param name="message"> 15 <xsl:text> 16 Adding 'family mpls' to ISO-enabled interface 17 </xsl:text> 18 </xsl:with-param>
As linhas 19 a 23 usam o content
parâmetro do jcs:emit-change
modelo. O content
parâmetro especifica a mudança a fazer, em relação ao nó de contexto atual.
19 <xsl:with-param name="content"> 20 <family> 21 <mpls/> 22 </family> 23 </xsl:with-param>
As linhas 24 e 25 fecham as tags abertas nas Linhas 13 e 12, respectivamente.
24 </xsl:call-template> 25 </xsl:if>
A linha 26 testa se o MPLS já está habilitado e se essa interface não está configurada no nível de [edit protocols mpls interface]
hierarquia.
26 <xsl:if test="$mpls and not($mpls/interface[name = $ifname])">
As linhas 27 a 41 contêm outra invocação do jcs:emit-change
modelo. Nesta invocação, a interface é adicionada no nível de [edit protocols mpls interface]
hierarquia.
27 <xsl:call-template name="jcs:emit-change"> 28 <xsl:with-param name="message"> 29 <xsl:text>Adding ISO-enabled interface </xsl:text> 30 <xsl:value-of select="$ifname"/> 31 <xsl:text> to [edit protocols mpls]</xsl:text> 32 </xsl:with-param> 33 <xsl:with-param name="dot" select="$mpls"/> 34 <xsl:with-param name="content"> 35 <interface> 36 <name> 37 <xsl:value-of select="$ifname"/> 38 </name> 39 </interface> 40 </xsl:with-param> 41 </xsl:call-template>
As linhas 42 a 45 fecham todos os elementos abertos.
42 </xsl:if> 43 </xsl:for-each> 44 </xsl:template> 45 </xsl:stylesheet>