emit-change Template (SLAX and XSLT) and emit_change (Python)
语法
Python 语法
jcs.emit_change(content, tag, format)
SLAX 语法
call jcs:emit-change($dot=expression, $name = name($dot), $tag = "(change | transient-change)" { with $content = { ... } with $message = { expr "message"; } }
XSLT 语法
<xsl:call-template name="jcs:emit-change"> <xsl:with-param name="content"> ... </xsl:with-param> <xsl:with-param name="dot" select="expression"/> <xsl:with-param name="message"> <xsl:text>message</xsl:text> </xsl:with-param> <xsl:with-param name="name" select="name($dot)"/> <xsl:with-param name="tag" select="'(change | transient-change)'"/> </xsl:call-template>
描述
对配置生成持续或瞬时更改。
参数
content |
持续或瞬时更改的内容。在 SLAX 和 XSLT 脚本中,这与 |
dot |
XPath 表达式,用于指定更改的层级。默认位置是脚本当前正在评估的 XML 层次结构中的位置。在调用模板时,可以通过为 |
format |
通过 Python 提交脚本加载的配置数据的格式。唯一支持的格式是 |
message |
CLI 中显示的警告消息,通知用户配置已更改。消息参数会自动包含编辑路径,编辑路径默认为 XML 层次结构中的当前位置。要更改默认编辑路径,请为 |
name |
允许您引用当前的元素或属性。 |
tag |
要生成的更改类型。指定 |
使用示例
以下示例演示了如何在 XSLT 提交脚本中调用jcs:emit-change
模板:
<xsl:template match="configuration"> <xsl:for-each select="interfaces/interface/unit[family/iso]"> <xsl:if test="not(family/mpls)"> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="message"> <xsl:text>Adding 'family mpls' to ISO-enabled interface</xsl:text> </xsl:with-param> <xsl:with-param name="content"> <family> <mpls/> </family> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:for-each> </xsl:template>
提交包括一个或多个启用了 IS-IS 但未在层次结构级别包含[edit interfaces interface-name unit logical-unit-number]
语句family mpls
的配置时,模板jcs:emit-change
会将该family mpls
语句添加到配置中并生成以下 CLI 输出:
[edit] user@host# commit [edit interfaces interface so-1/2/3 unit 0] warning: Adding 'family mpls' to ISO-enabled interface [edit interfaces interface so-1/2/3 unit 0] warning: Adding ISO-enabled interface so-1/2/3.0 to [protocols mpls] [edit interfaces interface so-1/3/2 unit 0] warning: Adding 'family mpls' to ISO-enabled interface [edit interfaces interface so-1/3/2 unit 0] warning: Adding ISO-enabled interface so-1/3/2.0 to [protocols mpls] commit complete
模板 content
参数 jcs:emit-change
提供了一种更简单的方法,用于指定对配置的更改。例如,考虑以下代码:
<xsl:with-param name="content"> <family> <mpls/> </family> </xsl:with-param>
在 SLAX 和 XSLT 脚本中 jcs:emit-change
,模板将 content
参数转换为 <change>
请求。请求 <change>
将提供的部分配置内容插入当前 上下文节点的完整层次结构中。因此,模板将 jcs:emit-change
参数中的 content
层次结构信息更改为以下代码:
<change> <interfaces> <interface> <name><xsl:value-of select="name"/></name> <unit> <name><xsl:value-of select="unit/name"/></name> <family> <mpls/> </family> </unit> </interface> </interfaces> </change>
如果需要瞬时更改, tag
则可以将参数作为 “”transient-change
传入,如下所示:
<xsl:with-param name="tag" select="'transient-change'"/>
要使 XSLT 能够区分字符串 “”和名为transient-change
“transient-change
” 的节点的内容,需要额外的引号。如果更改相对于上下文节点以外的某个节点,则可以将参数dot
设置为该节点,如以下示例中所示,其中上下文设置为[edit chassis]
层次结构级别:
<xsl:for-each select="interfaces/interface/unit"> ... <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="dot" select="chassis"/> ...
以下 Python 提交脚本会生成对配置的永久更改:
import jcs if __name__ == '__main__': script = "system-check.py" change_xml = """<system><scripts><op> <file><name>{0}</name></file></op> </scripts></system>""".format(script) jcs.emit_change(change_xml, "change", "xml")