Change the Configuration Using SLAX and XSLT Scripts
SLAX and XSLT op and event scripts can use the jcs:load-configuration
template to make structured changes to the Junos OS
configuration. Experienced users, who are familiar with Junos OS,
can write scripts that prompt for the relevant configuration information
and modify the configuration accordingly. This enables users who have
less experience with Junos OS to safely modify the configuration using
the script.
This topic discusses how to use the jcs:load-configuration
template to modify the configuration.
jcs:load-configuration Template Overview
The jcs:load-configuration
template
is included in the junos.xsl import
file. The template can:
Load Junos XML configuration data into the candidate configuration using a
load merge
,load replace
, orload override
operation and commit the changesRoll back the active configuration to a previously committed configuration
Load and commit the rescue configuration
When called, the jcs:load-configuration
template performs the following actions on the target device:
Locks the configuration database
Loads the configuration changes
Commits the configuration
Unlocks the configuration database
The jcs:load-configuration
template
makes changes to the configuration in configure exclusive
mode. In this mode, Junos OS locks the candidate global configuration for as long as the script accesses the shared database
and makes changes to the configuration. The template call might fail
if the configuration database is already locked or if there are existing,
uncommitted changes in the candidate configuration when the template
is called. If the template successfully loads the configuration data,
but the commit fails, Junos OS discards the uncommitted changes when
the database is unlocked.
The SLAX template syntax is:
call jcs:load-configuration($action="(merge | override | replace)", $commit-options=node-set, $configuration=configuration-data, $connection=connection-handle, $rescue="rescue", $rollback=number);
The XSLT template syntax is:
<xsl:call-template name="jcs:load-configuration"> <xsl:with-param name="action" select="(merge | override | replace)"/> <xsl:with-param name="commit-options" select="node-set"/> <xsl:with-param name="configuration" select="configuration-data"/> <xsl:with-param name="connection" select="connection-handle"/> <xsl:with-param name="rescue" select=""rescue""/> <xsl:with-param name="rollback" select="number"/> </xsl:call-template>
You provide arguments to the jcs:load-configuration
template to specify:
the connection handle to the device on which the changes will be made
the changes to make to the configuration
the load action that defines how to integrate the changes into the existing configuration
optional commit options
You must establish a connection with the target device before
calling the jcs:load-configuration
template.
To connect to a device, call the jcs:open()
function with the necessary arguments. Then set the jcs:load-configuration
connection
parameter to the handle returned by the jcs:open()
function.
The following sample code connects to the local device and modifies the configuration:
var $conn = jcs:open(); var $results := { call jcs:load-configuration($configuration=$config-changes, $connection=$conn); } var $close-results = jcs:close($conn);
When you call the jcs:load-configuration
template, you can include the configuration
parameter to load new configuration data on a device, you can specify
the rollback
parameter to revert the configuration
to a previously committed configuration, or you can specify the rescue
parameter to load and commit the rescue configuration.
Loading and Committing Configuration Data
SLAX and XSLT scripts can call the jcs:load-configuration
template to modify the configuration. The configuration
parameter defines the Junos XML configuration data to load, and
the action
parameter specifies how to load
the data. The commit-options
parameter
defines the options to use during the commit operation.
The following sample op script calls the jcs:load-configuration
template to modify the configuration to disable an interface. All
of the values required for the jcs:load-configuration
template are defined as variables, which are then passed into the
template as arguments.
The :=
operator copies the results
of the jcs:load-configuration
template
call to a temporary variable and runs the node-set
function on that variable. The :=
operator
ensures that the disable-results
variable
is a node-set rather than a result tree fragment so that the script
can access the contents.
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"; ns ext = "http://xmlsoft.org/XSLT/namespace"; import "../import/junos.xsl"; match / { <op-script-results> { var $interface = jcs:get-input("Enter interface to disable: "); var $config-changes = { <configuration> { <interfaces> { <interface> { <name> $interface; <disable>; } } } } var $load-action = "merge"; var $options := { <commit-options> { <synchronize>; <log> "disabling interface " _ $interface; } } var $conn = jcs:open(); var $results := { call jcs:load-configuration($action=$load-action, $commit-options=$options, $configuration=$config-changes, $connection=$conn); } if ($results//xnm:error) { for-each ($results//xnm:error) { <output> message; } } var $close-results = jcs:close($conn); } }
For detailed information about this script, see Example: Change the Configuration Using SLAX and XSLT Op Scripts.
The equivalent XSLT code for the call to the jcs:load-configuration
template is:
<xsl:variable name="disable-results-temp"> <xsl:call-template name="jcs:load-configuration"> <xsl:with-param name="action" select="$load-action"/> <xsl:with-param name="commit-options" select="$options"/> <xsl:with-param name="configuration" select="$disable"/> <xsl:with-param name="connection" select="$conn"/> </xsl:call-template> </xsl:variable> <xsl:variable xmlns ext="http:xmlsoft.org/XSLT/namespace" \ name="disable-results" select="ext:node-set($disable-results-temp)"/>
Loading and Committing the Rescue Configuration
A rescue configuration allows you to define a known working
configuration or a configuration with a known state that you can restore
at any time. SLAX and XSLT scripts can call the jcs:load-configuration
template with the rescue
parameter to
load the rescue configuration, if one exists.
The following SLAX op script loads and commits the existing rescue configuration.
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 "/var/db/scripts/import/junos.xsl"; match / { <op-script-results> { /* Open the connection */ var $conn = jcs:open(); /* Load and commit the rescue configuration */ var $results = { call jcs:load-configuration($connection=$conn, $rescue="rescue"); } expr jcs:output($results); /* Close the connection */ expr jcs:close($conn); } }
The equivalent XSLT script is:
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet 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" version="1.0"> <xsl:import href="/var/db/scripts/import/junos.xsl"/> <xsl:template match="/"> <op-script-results> <!-- Open the connection --> <xsl:variable name="conn" select="jcs:open()"/> <!-- Load and commit the rescue configuration --> <xsl:variable name="results"> <xsl:call-template name="jcs:load-configuration"> <xsl:with-param name="connection" select="$conn"/> <xsl:with-param name="rescue" select=""rescue""/> </xsl:call-template> </xsl:variable> <xsl:value-of select="jcs:output($results)"/> <!-- Close the connection --> <xsl:value-of select="jcs:close($conn)"/> </op-script-results> </xsl:template> </xsl:stylesheet>
Rolling Back the Configuration
SLAX and XSLT scripts can call the jcs:load-configuration
template with the rollback
parameter
to revert the configuration to a previously committed configuration.
The following SLAX op script prompts for the rollback number, and
then loads the requested rollback configuration and commits it.
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 / { <op-script-results> { var $rollback_id = jcs:get-input("Rollback id: "); /* Open the connection */ var $conn = jcs:open(); /* Roll back the configuration and commit it */ var $results = { call jcs:load-configuration($connection=$conn, $rollback=$rollback_id); } /* Close the connection */ expr jcs:close($conn); } }
user@host> op load-rollback Rollback id: 1