サンプル コミット スクリプトの行ごとの説明
SONET/SDH インターフェイスへの変更の適用
次の XSLT コミット スクリプトは、カプセル化を に設定して、名前が で so-
始まる各インターフェイスに一時変更を ppp
適用します。一時的な変更については、 コミットスクリプトを使用した永続的または一時的な設定変更の生成の概要を参照してください。この例の SLAX バージョンについては、「 例: 一時変更の生成」を参照してください。
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>
行 1~8 は、 コミット スクリプトに必要な定型文で説明されている定型的 なものであり、簡潔にするためにここでは省略しています。
9行目は、 <xsl:for-each>
名前が「so-」で始まり、任意の論理ユニットで有効になっている family inet
各インターフェイスノードを調べるプログラミング命令です。(ここでは簡潔にするためにのみ 2 行で表示されます)。
9 <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') \ and unit/family/inet]">
10 行目は一時的な変更のオープン タグです。要素の<transient-change>
可能なコンテンツは、Junos XML プロトコル操作<load-configuration>
におけるタグ要素の<configuration>
コンテンツと同じです。
10 <transient-change>
11~16行目は、一時的な変化の内容を表しています。カプセル化は に ppp
設定されています。
11 <interfaces> 12 <interface> 13 <name><xsl:value-of select="name"/></name> 14 <encapsulation>ppp</encapsulation> 15 </interface> 16 </interfaces>
17~19行目は、このテンプレート内のすべての開いているタグを閉じます。
17 </transient-change> 18 </xsl:for-each> 19 </xsl:template>
20 行目は、スタイル シートとコミット スクリプトを閉じます。
20 </xsl:stylesheet>
ISO 対応インターフェイスへの変更の適用
次の XSLT スクリプトのサンプルでは、国際標準化機構 (ISO) プロトコルで有効になっているインターフェイスにも MPLS が有効になっており、 階層レベルに含まれていることを [edit protocols mpls interface]
確認します。この例の SLAX バージョンについては、 例: 制御 IS-IS および 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>
行 1~8 は、 コミット スクリプトに必要な定型文で説明されている定型的 なものであり、簡潔にするためにここでは省略しています。
9行目は、以下for-each
の[edit protocols mpls]
ループで参照できるように、 階層レベルへの参照を保存します。
9 <xsl:variable name="mpls" select="protocols/mpls"/>
10行目は、ISOが有効になっている各インターフェイスユニット(論理インターフェイス)を調べます。は 、 でunit
終わりますが、述部ではselect
、選択を、エレメントの下<family>
にネストされたエレメントを<iso>
含むユニットのみに制限します。
10 <xsl:for-each select="interfaces/interface/unit[family/iso]">
11行目は、インターフェイス名を変数に構築します。まず、name
変数宣言の属性は にifname
設定されます。Junos OS では、インターフェイス名はデバイス名、ピリオド、およびユニット番号の連結です。スクリプトのこの時点で、コンテキストノードはユニット番号になります。ライン10はコンテキストをインターフェイス/インターフェイス/ユニットに変更するためです。は../name
、<name>
コンテキストノードの親ノードの要素を指します。これはデバイス名(type-fpc/pic/port)です。XPath式の「name
」トークンは、ユニット番号(unit-number
)であるコンテキストノードの要素を指<name>
します。連結が実行されると、行 11 の XPath 式は -fpc//picport.unit-numberにtype解決されます。行10の<xsl:for-each>
命令が階層を通過し、ISO対応インターフェイスを検索すると、インターフェイス名は再帰的に変数にifname
格納されます。
11 <xsl:variable name="ifname" select="concat(../name, '.', name)"/>
12 行目は、MPLS を有効にしていない ISO 対応インターフェイスごとに true と評価されます。
12 <xsl:if test="not(family/mpls)">
13 行目は jcs:emit-change
、 junos.xsl ファイル内のヘルパーまたは便利なテンプレートであるテンプレートを呼び出します。このテンプレートについては、 出力変更テンプレート(SLAX および XSLT)とemit_change(Python)で説明します。
13 <xsl:call-template name="jcs:emit-change">
14~18行目では、テンプレートのmessage
パラメータをjcs:emit-change
使用します。メッセージ パラメーターは、 、 <edit-path>
要素<statement>
を明示的に含め<warning>
るのではなく、使用できるショートカットです。
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~23行目では、テンプレートの content
パラメータを jcs:emit-change
使用します。このパラメータは content
、現在のコンテキスト ノードに対する変更を指定します。
19 <xsl:with-param name="content"> 20 <family> 21 <mpls/> 22 </family> 23 </xsl:with-param>
24 行目と 25 行目は、それぞれ 13 行目と 12 行目で開かれたタグを閉じます。
24 </xsl:call-template> 25 </xsl:if>
26 行目では、MPLS がすでに有効になっているかどうか、このインターフェイスが 階層レベルで [edit protocols mpls interface]
設定されていないかどうかをテストします。
26 <xsl:if test="$mpls and not($mpls/interface[name = $ifname])">
27行目から41行目には、テンプレートの呼び出しが jcs:emit-change
含まれています。この呼び出しでは、インターフェイスが 階層レベルで [edit protocols mpls interface]
追加されます。
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>
42~45 行目は、すべての開いている要素を閉じます。
42 </xsl:if> 43 </xsl:for-each> 44 </xsl:template> 45 </xsl:stylesheet>