Explicación línea a línea de los scripts de confirmación de ejemplo
Aplicación de un cambio a interfaces SONET/SDH
La siguiente secuencia de comandos de confirmación XSLT aplica un cambio transitorio a cada interfaz cuyo nombre comience por so-
, estableciendo la encapsulación en ppp
. Para obtener más información acerca de los cambios transitorios, consulte Descripción general de la generación de cambios de configuración persistentes o transitorios mediante scripts de confirmación. Para una versión SLAX de este ejemplo, consulte Ejemplo: Generar un cambio transitorio.
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>
Las líneas 1 a 8 son placa de caldera como se describe en La placa de caldera requerida para scripts de confirmación y se omiten aquí por brevedad.
La línea 9 es una <xsl:for-each>
instrucción de programación que examina cada nodo de interfaz cuyos nombres comienzan por "so-" y que se ha family inet
habilitado en cualquier unidad lógica. (Aparece aquí en dos líneas solo por brevedad.)
9 <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') \ and unit/family/inet]">
La línea 10 es la etiqueta abierta para un cambio transitorio. El contenido posible del <transient-change>
elemento es el mismo que el contenido del <configuration>
elemento tag en la operación <load-configuration>
de protocolo JUnos XML .
10 <transient-change>
Las líneas 11 a 16 representan el contenido del cambio transitorio. La encapsulación se establece en ppp
.
11 <interfaces> 12 <interface> 13 <name><xsl:value-of select="name"/></name> 14 <encapsulation>ppp</encapsulation> 15 </interface> 16 </interfaces>
Las líneas 17 a 19 cierran todas las etiquetas abiertas de esta plantilla.
17 </transient-change> 18 </xsl:for-each> 19 </xsl:template>
La línea 20 cierra la hoja de estilo y la secuencia de comandos de confirmación.
20 </xsl:stylesheet>
Aplicación de un cambio a interfaces habilitadas para ISO
El siguiente script XSLT de ejemplo garantiza que las interfaces habilitadas para un protocolo de organización internacional de estandarización (ISO) también tengan MPLS habilitada y se incluyan en el [edit protocols mpls interface]
nivel jerárquico. Para una versión SLAX de este ejemplo, consulte Ejemplo: Interfaces de CONTROL IS-IS y 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>
Las líneas 1 a 8 son placa de caldera como se describe en La placa de caldera requerida para scripts de confirmación y se omiten aquí por brevedad.
La línea 9 guarda una referencia al [edit protocols mpls]
nivel de jerarquía para que se pueda hacer referencia en el siguiente for-each
bucle.
9 <xsl:variable name="mpls" select="protocols/mpls"/>
La línea 10 examina cada unidad de interfaz (interfaz lógica) en la que está habilitada la ISO. Las select
paradas en el unit
, pero el predicado limita la selección a solo las unidades que contienen un <iso>
elemento anidado bajo un <family>
elemento.
10 <xsl:for-each select="interfaces/interface/unit[family/iso]">
La línea 11 crea el nombre de interfaz en una variable. En primer lugar, el name
atributo de la declaración de variable se establece en ifname
. En Junos OS, un nombre de interfaz es la concatenación del nombre del dispositivo, un punto y el número de unidad. En este punto del script, el nodo contextual es el número de unidad, porque la línea 10 cambia el contexto a interfaces/interfaz/unidad. El ../name
se refiere al <name>
elemento del nodo principal del nodo contextual, que es el nombre del dispositivo (type-fpc/pic/port). El token "name
" de la expresión XPath hace referencia al <name>
elemento del nodo de contexto, que es el número de unidad (unit-number
). Después de realizar la concatenación, la expresión XPath de la línea 11 se resuelve en type-fpc/pic/port.unit-number. A medida que la instrucción de la <xsl:for-each>
línea 10 atraviesa la jerarquía y localiza interfaces habilitadas para ISO, los nombres de interfaz se almacenan recursivamente en la ifname
variable.
11 <xsl:variable name="ifname" select="concat(../name, '.', name)"/>
La línea 12 se evalúa como verdadera para cada interfaz habilitada para ISO que no tenga MPLS habilitado.
12 <xsl:if test="not(family/mpls)">
La línea 13 llama a la jcs:emit-change
plantilla, que es una plantilla de ayuda o de conveniencia en el archivo junos.xsl. Esta plantilla se analiza en la plantilla de emisión-cambio (SLAX y XSLT) y emit_change (Python).
13 <xsl:call-template name="jcs:emit-change">
Las líneas 14 a 18 usan el message
parámetro de la jcs:emit-change
plantilla. El parámetro message es un acceso directo que puede usar en lugar de incluir explícitamente los <warning>
elementos , <edit-path>
y <statement>
.
14 <xsl:with-param name="message"> 15 <xsl:text> 16 Adding 'family mpls' to ISO-enabled interface 17 </xsl:text> 18 </xsl:with-param>
Las líneas 19 a 23 usan el content
parámetro de la jcs:emit-change
plantilla. El content
parámetro especifica el cambio que se debe realizar en relación con el nodo de contexto actual.
19 <xsl:with-param name="content"> 20 <family> 21 <mpls/> 22 </family> 23 </xsl:with-param>
Las líneas 24 y 25 cierran las etiquetas abiertas en las líneas 13 y 12, respectivamente.
24 </xsl:call-template> 25 </xsl:if>
La línea 26 prueba si MPLS ya está habilitado y si esta interfaz no está configurada en el [edit protocols mpls interface]
nivel jerárquico.
26 <xsl:if test="$mpls and not($mpls/interface[name = $ifname])">
Las líneas 27 a 41 contienen otra invocación de la jcs:emit-change
plantilla. En esta invocación, la interfaz se agrega en el [edit protocols mpls interface]
nivel de jerarquía.
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>
Las líneas 42 a 45 cierran todos los elementos abiertos.
42 </xsl:if> 43 </xsl:for-each> 44 </xsl:template> 45 </xsl:stylesheet>