Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

header-navigation
keyboard_arrow_up
close
keyboard_arrow_left
Automation Scripting User Guide
Table of Contents Expand all
list Table of Contents
file_download PDF
{ "lLangCode": "en", "lName": "English", "lCountryCode": "us", "transcode": "en_US" }
English
keyboard_arrow_right

Change the Configuration Using SLAX and XSLT Scripts

date_range 19-Nov-24

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, or load override operation and commit the changes

  • Roll 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:

  1. Locks the configuration database

  2. Loads the configuration changes

  3. Commits the configuration

  4. 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:

content_copy zoom_out_map
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:

content_copy zoom_out_map
 <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="&quot;rescue&quot;"/>
    <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:

content_copy zoom_out_map
  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:

content_copy zoom_out_map
version 1.2;

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:

content_copy zoom_out_map
<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.

content_copy zoom_out_map
version 1.2;

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:

content_copy zoom_out_map
<?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="&quot;rescue&quot;"/>
        </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.

content_copy zoom_out_map
version 1.2;
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);
    }
}
content_copy zoom_out_map
user@host> op load-rollback
Rollback id: 1
footer-navigation