Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

Navigation

Example: Importing Files Using an Op Script

The op script in this example uses the Junos XML protocol file-get operation to read the contents of a file from a remote server.

Requirements

This example uses a device running Junos OS.

Overview and Op Script

The Junos XML protocol file-get operation reads the contents of a file. The basic syntax for using the file-get command is as follows:

<rpc>
    <file-get>
        <filename>value</filename>
        <encoding>value</encoding>
    </file-get>
</rpc>

The following tag elements are used with the file-get command.

  • encoding—(Mandatory) Specifies the type of encoding used. You can use ASCII, base64, or raw encoding.
  • filename—(Mandatory) Within this tag, you include the full or relative path and filename of the file to import. When you use a relative path, the specified path is relative to the /var/tmp/ directory if the file-get operation is executed locally. If the operation is executed remotely within the context of a connection handle, the path is relative to the user’s home directory.

Note: When you use ASCII encoding, the file-get operation converts any control characters in the imported file to the Unicode character 'SECTION SIGN' (U+00A7).

XSLT Syntax

The following sample script connects to a remote device and reads the contents of the specified file. The script takes three arguments: the IP address or hostname of the remote device, the filename, and the file encoding. The arguments variable is declared at the global level of the script so that the argument names and descriptions are visible in the command-line interface (CLI).

The script declares the fileget variable, which contains the remote procedure call (RPC) for the file-get operation. The command-line arguments define the values for the filename and encoding tag elements. If the mandatory argument myhost is missing, the script issues an error and halts execution. Otherwise, the script prompts for the username and password that will be used to connect to the remote device.

If connection to the remote device is successful, the script executes the RPC within the context of the connection handle. The output of the file-get operation, which is the result of the jcs:execute() function, is stored in the out variable. If the operation encounters an error, the script prints the error to the CLI. If the file-get operation is successful, the contents of the file are stored in the out variable, which is printed to the CLI. The connection to the remote host is then closed.

<?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="../import/junos.xsl"/>
  
  <xsl:variable name="arguments">
     <argument>
          <name>myhost</name>
          <description>IP address or hostname of the remote host</description>
     </argument>
     <argument>
          <name>filename</name>
          <description>name of file</description>
     </argument>
     <argument>
          <name>encoding</name>
          <description>ascii, base64, or raw</description>
     </argument>
  </xsl:variable>
  
  <xsl:param name="myhost"/>
  <xsl:param name="filename"/>
  <xsl:param name="encoding"/>

  <xsl:template match="/">
     <op-script-results>
          <xsl:variable name="fileget">
               <file-get>
                    <filename>
                         <xsl:value-of select="$filename"/>
                    </filename>
                    <encoding>
                         <xsl:value-of select="$encoding"/>
                    </encoding>
               </file-get>
          </xsl:variable>
          <xsl:choose>
               <xsl:when test="$myhost = ''">
                    <xnm:error>
                         <message>missing mandatory argument 'myhost'</message>
                    </xnm:error>
               </xsl:when>
               <xsl:otherwise>
                    <xsl:variable name="username" select="jcs:get-input('Enter username: ')"/>
                    <xsl:variable name="pw" select="jcs:get-secret('Enter password: ')"/>
                    <xsl:variable name="connect" select="jcs:open($myhost, $username, $pw)"/>
                    <xsl:choose>
                         <xsl:when test="$connect">
                              <output>Connected to host.  Reading file... 
                              </output>
                              <xsl:variable name="out" select="jcs:execute($connect, $fileget)"/>
                              <xsl:choose>
                                   <xsl:when test="$out//xnm:error">
                                        <xsl:copy-of select="$out//xnm:error"/>
                                   </xsl:when>
                                   <xsl:otherwise>
                                        <output>
                                             <xsl:value-of select="concat('File contents: ', $out)"/>
                                        </output>
                                   </xsl:otherwise>
                              </xsl:choose>
                              <xsl:value-of select="jcs:close($connect)"/>
                         </xsl:when>
                         <xsl:otherwise>
                              <output>No connection to host.</output>
                         </xsl:otherwise>
                    </xsl:choose>
               </xsl:otherwise>
          </xsl:choose>
     </op-script-results>
  </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";
 
var $arguments = {
     <argument> {	
          <name> "myhost";
          <description> "IP address or hostname of the remote host"; 	
     }
     <argument> {	
          <name> "filename";
          <description> "name of file"; 	
     }
     <argument> {	
          <name> "encoding";
          <description> "ascii, base64, or raw"; 	
     }
}

param $myhost;
param $filename;
param $encoding;

match / {
     <op-script-results> {    
          var $fileget = {
               <file-get> {
                    <filename>$filename;
                    <encoding>$encoding;
               }
          }
     
          if ($myhost = '') {
               <xnm:error> {
                    <message> "missing mandatory argument 'myhost'";
               }
          }
          else {        			
               var $username = jcs:get-input("Enter username: ");
               var $pw = jcs:get-secret("Enter password: ");
               var $connect = jcs:open($myhost, $username, $pw); 
     
               if ($connect) {
                    <output> "Connected to host.  Reading file... \n";
                    var $out = jcs:execute($connect, $fileget);
                    if ($out//xnm:error) {
                         copy-of $out//xnm:error;
                    }
                    else {
                         <output> "File contents: " _ $out;
                    }
                    expr jcs:close($connect);   	    	
               } 
               else {
                    <output> "No connection to host.";
               }
          }
     }
}

Configuration

Step-by-Step Procedure

To download, enable, and test the script:

  1. Copy the XSLT or SLAX script into a text file, name the file import.xsl or import.slax as appropriate, and copy it to the /var/db/scripts/op/ directory on the device.
  2. In configuration mode, include the file statement at the [edit system scripts op] hierarchy level and import.xsl or import.slax as appropriate.

    [edit system scripts op]user@host# set file import.(slax | xsl)
  3. Issue the commit and-quit command to commit the configuration and to return to operational mode.

    [edit]user@host# commit and-quit
  4. Execute the op script by issuing the op import operational mode command and include any necessary arguments.

Verification

Verifying the Script Arguments

Purpose

Verify that the argument names and descriptions show up in the CLI.

Action

Issue the op import ? operational mode command. The CLI lists the possible completions for the script arguments based on the definitions within the global arguments variable in the script.

user@host> op import ?
Possible completions:
  <[Enter]>            Execute this command
  <name>               Argument name
  detail               Display detailed output
  encoding             ascii, base64, or raw
  filename             name of file
  myhost               IP address or hostname of the remote host
  |                    Pipe through a command

Verifying Op Script Execution

Purpose

Verify that the script behaves as expected.

Action

Issue the op import myhost host encoding encoding filename file operational mode command, and include the appropriate username and password when prompted. If script execution is successful, the contents of the requested file are displayed. For example:

root@host> op import myhost router1 encoding ascii filename /var/db/scripts/op/test.slax
Enter username: root
Enter password:
Connected to host.  Reading file...
File contents: 

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";
...

If you fail to supply the IP address or hostname of the remote device in the command-line arguments, the script issues an error and halts execution.

root@host> op import
error: missing mandatory argument 'myhost'

Also, if the specified path or file does not exist, the script issues an error.

root@host> op import myhost router1 encoding ascii filename /var/db/scripts/op/test1.slax
Enter username: root
Enter password:
Connected to host.  Reading file...
File contents: 

Failed to open file (/var/db/scripts/op/test1.slax): No such file or directory

Published: 2013-03-05