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>