Example: Generate a Custom Error Message
Junos OS commit scripts can generate custom error messages during a commit operation to alert you when the configuration violates custom configuration rules. Emitting an error message causes the commit to fail. This example creates a commit script that generates a custom error message when a specific statement is not included in the device configuration, thereby halting the commit operation.
Requirements
Junos OS Release 16.1R3 or later release when using a Python script.
Overview and Commit Script
Using a commit script, write a custom error message that appears
when the description
statement is not included at the [edit interfaces t1-fpc/pic/port]
hierarchy level:
The script is shown in XSLT, SLAX, and Python.
XSLT Syntax
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:template match="configuration"> <xsl:variable name="interface" select="interfaces/interface"/> <xsl:for-each select="$interface[starts-with(name, 't1-')]"> <xsl:variable name="ifname" select="."/> <xsl:if test="not(description)"> <xnm:error> <xsl:call-template name="jcs:edit-path"/> <xsl:call-template name="jcs:statement"/> <message>Missing a description for this T1 interface.</message> </xnm:error> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>
SLAX Syntax
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match configuration { var $interface = interfaces/interface; for-each ($interface[starts-with(name, 't1-')]) { var $ifname = .; if (not(description)) { <xnm:error> { call jcs:edit-path(); call jcs:statement(); <message> "Missing a description for this T1 interface."; } } } }
Python Syntax
from junos import Junos_Configuration import jcs def main(): root = Junos_Configuration for element in root.xpath( "./interfaces/interface[starts-with(name,'t1-')]"): # Missing description if element.find('description') is None: # Emit error message to console jcs.emit_error("Missing a description for this T1 interface: " + element.find('name').text) if __name__ == '__main__': main()
Configuration
Procedure
Step-by-Step Procedure
Download, enable, and test the script: To test that a
commit script generates an error message correctly, make sure that
the candidate configuration contains the condition that elicits the
error. For this example, ensure that the configuration for a T1 interface
does not include the description
statement.
To test the example in this topic:
Copy the script into a text file, name the file description.xsl, description.slax, or description.py as appropriate, and copy it to the /var/db/scripts/commit/ directory on the device.
Note:Unsigned Python scripts must be owned by either root or a user in the Junos OS
super-user
login class, and only the file owner can have write permission for the file.In configuration mode, configure the
file
statement and the script filename at the[edit system scripts commit]
hierarchy level.[edit] user@host# set system scripts commit file description.xsl
If the script is written in Python, enable the execution of unsigned Python scripts.
[edit] user@host# set system scripts language python
Note:Configure the
language python3
statement to use Python 3 to execute Python scripts, or configure thelanguage python
statement to use Python 2.7 to execute Python scripts. For more information, see language.If the configuration for every T1 interface includes the
description
statement, delete the description for an existing T1 interface for testing purposes.[edit] user@host# delete interfaces t1–0/0/1 description
Issue the
commit
command to commit the configuration.user@host# commit
Verification
Verifying Script Execution
Purpose
Verify the error message generated by the commit script.
Action
Review the output of the commit
command.
The commit script generates an error message for each T1 interface
that does not include a description
statement. Any error
causes the commit process to fail.
[edit] user@host# commit [edit interfaces interface t1-0/0/1] 'description' Missing a description for this T1 interface. [edit interfaces interface t1-0/0/2] 'description' Missing a description for this T1 interface. error: 2 errors reported by commit scripts error: commit script failure
To display the XML-formatted version of the error message,
issue the commit check | display xml
command.
[edit interfaces t1-0/0/1] user@host# commit check | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <commit-results> <routing-engine junos:style="normal"> <name>re0</name> <xnm:error> <edit-path> [edit interfaces interface t1-0/0/1] </edit-path> <statement> description </statement> <message> Missing a description for this T1 interface. </message> </xnm:error> <xnm:error> <edit-path> [edit interfaces interface t1-0/0/2] </edit-path> <statement> description </statement> <message> Missing a description for this T1 interface. </message> </xnm:error> <xnm:error xmlns="http://xml.juniper.net/xnm/1.1/xnm" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"> <message> 2 errors reported by commit scripts </message> </xnm:error> <xnm:error xmlns="http://xml.juniper.net/xnm/1.1/xnm" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"> <message> commit script failure </message> </xnm:error> </routing-engine> </commit-results> <cli> <banner>[edit interfaces]</banner> </cli> </rpc-reply>
To display a detailed trace of commit script processing,
issue the commit check | display detail
command.
[edit interfaces t1-0/0/1] user@host# commit check | display detail 2009-06-15 15:56:09 PDT: reading commit script configuration 2009-06-15 15:56:09 PDT: testing commit script configuration 2009-06-15 15:56:09 PDT: opening commit script '/var/db/scripts/commit/error.xsl' 2009-06-15 15:56:09 PDT: reading commit script 'error.xsl' 2009-06-15 15:56:09 PDT: running commit script 'error.xsl' 2009-06-15 15:56:09 PDT: processing commit script 'error.xsl' [edit interfaces interface t1-0/0/1] 'description' Missing a description for this T1 interface. [edit interfaces interface t1-0/0/2] 'description' Missing a description for this T1 interface. 2009-06-15 15:56:09 PDT: 2 errors from script 'error.xsl' error: 2 errors reported by commit scripts error: commit script failure