Exploring Junos' On-Box Scripting Capabilities

Junos OS, the operating system that powers Juniper Networks' wide range of networking devices, offers a powerful feature known as on-box scripting. This feature allows network administrators to automate tasks, customize behaviors, and extract operational data from the device. This blog post will delve into the details of Junos' on-box scripting capabilities, a topic that is crucial for students studying for the JNCIS-ENT certification.

What is On-Box Scripting?

On-box scripting refers to the ability to run scripts directly on a Juniper device. These scripts can be written in SLAX, XSLT, or Python, and can be used to automate operational and configuration tasks, respond to certain events, or extract and format operational data.

SLAX and XSLT Scripts

SLAX and XSLT are XML-based scripting languages. Junos OS uses XML for its configuration and operational data, which makes these languages a natural fit for on-box scripting.

Here's an example of a simple SLAX script that displays the interfaces that are currently up:

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 $interfaces = jcs:input("show interfaces terse | match up");
        for-each ($interfaces//physical-interface[normalize-space(admin-status)='up']) {
            <interface> {
                <name> expr { name } </name>
                <admin-status> expr { admin-status } </admin-status>
                <oper-status> expr { oper-status } </oper-status>
            }
        }
    }
}

This script uses the jcs:input function to execute the show interfaces terse | match up command and store the result in the $interfaces variable. It then loops over the physical-interface elements in the result where the admin-status is 'up', and for each such interface, it outputs an interface element with name, admin-status, and oper-status sub-elements.

Python Scripts

Starting from Junos OS 15.1, Python is also supported for on-box scripting. Python scripts have access to the Junos PyEZ library, which provides a high-level, Pythonic interface to Junos devices.

Here's the equivalent Python script for the above SLAX script:

from jnpr.junos import Device
from lxml import etree

with Device() as dev:
    interfaces = dev.rpc.get_interface_information(terse=True)
    for interface in interfaces.xpath('.//physical-interface[normalize-space(admin-status)="up"]'):
        print(etree.tostring(interface, pretty_print=True))

This script uses the Device class from the jnpr.junos module to connect to the local device. It then calls the get_interface_information method of the Device instance to execute the show interfaces terse command and store the result in the interfaces variable. It then loops over the physical-interface elements in the result where the admin-status is 'up', and for each such interface, it prints the XML representation of the interface.

Conclusion

On-box scripting is a powerful feature of Junos OS that can greatly simplify and automate the management of Juniper devices. Whether you prefer the XML-based SLAX and XSLT languages or the more general-purpose Python language, on-box scripting provides you with the tools to customize your device's behavior to your needs. As you prepare for your JNCIS-ENT certification, make sure to get hands-on experience with on-box scripting, as it is a key skill for any Juniper network engineer.

© Ben Jacobson.RSS