Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

Navigation

Example: Exporting Files Using an Op Script

The op script in this example uses the Junos XML protocol file-put operation to write to a file on a remote server and on the local device.

Requirements

This example uses a device running Junos OS.

Overview and Op Script

The Junos XML protocol file-put operation creates a file and writes the specified contents to that file. The basic syntax for using the file-put command is as follows:

<rpc>
    <file-put>
        <delete-if-exist />
        <encoding>value</encoding>
        <filename>value</filename>
        <permission>value</permission>
        <file-contents>file</file-contents>
    </file-put>
</rpc>

The following tag elements are used with the file-put command. These tags can be placed in any order with the exception of file-contents. The file-contents tag element must be the last tag in list.

  • delete-if-exist—(Optional) If included, any existing file is overwritten. If the tag is omitted, an error is returned if an existing file is encountered.
  • encoding—(Mandatory) Specifies the type of encoding used. You can use ASCII or base64 encoding.
  • filename—(Mandatory) Within this tag, you include the full or relative path and filename of the file to create. When you use a relative path, the specified path is relative to the user’s home directory. If the specified directory does not exist, the system returns a “directory does not exist” error.
  • permission—(Optional) Sets the file’s UNIX permission on the remote server. For example, to apply read/write access for the user, and read access to others, you would set the permission value to 0644. For a full explanation of UNIX permissions, see the chmod command.
  • file-contents—(Mandatory) The ASCII or base64 encoded file contents to export. This must be the last tag in the list.

XSLT Syntax

The following sample script executes a Junos XML API request and exports the results to a file on a remote device and a file on the local device. 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 invokes the Junos XML API <get-software-information> request on the local device and stores the result in the result variable. The script declares the fileput variable, which contains the remote procedure call (RPC) for the file-put 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-put 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-put operation is successful, the contents specified by the file-contents tag element are exported to the specified file on the remote device. The connection to the remote host is then closed. The script also exports the contents to an identical file on the local device.

The sample script includes the optional tag elements permission and delete-if-exist for the file-put operation. By including the delete-if-exist tag, the script overwrites any existing file of the same name on the remote and local hosts. In this example, the permission tag is set to 0644.

<?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 destination file</description>
    </argument>
    <argument>
      <name>encoding</name>
      <description>ascii or base64</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="rpc">
        <get-software-information/>
      </xsl:variable>
      <xsl:variable name="result" select="jcs:invoke($rpc)"/>

      <xsl:variable name="fileput">
        <file-put>
          <filename>
            <xsl:value-of select="$filename"/>
          </filename>
          <encoding>
            <xsl:value-of select="$encoding"/>
          </encoding>
          <permission>0644</permission>
          <delete-if-exist/>
          <file-contents>
            <xsl:value-of select="$result"/>
          </file-contents>
        </file-put>
      </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.  Exporting file... </output>
              <xsl:variable name="out" select="jcs:execute($connect, $fileput)"/>
              <xsl:choose>
                <xsl:when test="$out//xnm:error">
                  <xsl:copy-of select="($out//xnm:error)"/>
                </xsl:when>
                <xsl:otherwise>
                  <output>
                    <xsl:value-of select="$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>
      
      <xsl:variable name="local-out" select="jcs:invoke($fileput)"/>
      <output>
        <xsl:value-of select="concat('Saving file on local host\n', $local-out)"/>
      </output>
    </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 destination file"; 	
     }
     <argument> {	
          <name> "encoding";
          <description> "ascii or base64"; 	
     }
}

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

match / {
     <op-script-results> {

          var $rpc = <get-software-information>;  	
          var $result = jcs:invoke($rpc);
     
          var $fileput = {
               <file-put> {
                    <filename>$filename;
                    <encoding>$encoding;
                    <permission>'0644';
                    <delete-if-exist>;
                    <file-contents>$result;
               }
          }
  
          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.  Exporting file... \n";
                    var $out = jcs:execute($connect, $fileput);
                    if ($out//xnm:error) {
                         copy-of ($out//xnm:error);
                    }
                    else {
                         <output> $out;	
                    }
                    expr jcs:close($connect);
    
               } 
               else {
                    <output> "No connection to host.";
               }
	
          }	
          var $local-out = jcs:invoke($fileput);
          <output> "Saving file on local host\n" _ $local-out;	
     }
}

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 export.xsl or export.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 export.xsl or export.slax as appropriate.

    [edit system scripts op]user@host# set file export.(slax | xsl)
  3. Issue the commit and-quit command.

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

Verification

Verifying the Op Script Arguments

Purpose

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

Action

Issue the op exort ? 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 export ?
Possible completions:
  <[Enter]>            Execute this command
  <name>               Argument name
  detail               Display detailed output
  encoding             ascii or base64
  filename             name of destination 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 export myhost host encoding encoding filename file operational mode command, and include the appropriate username and password when prompted. If script execution is successful, the result of the <get-software-information> RPC request is written to the file on the remote device and also on the local device. For example:

root@host> op export myhost router1 encoding ascii filename /var/log/host-version.txt
Enter username: root
Enter password:
Connected to host.  Exporting file...
 
/var/log/host-version.txt
Saving file on local host
 
/var/log/host-version.txt

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 export
error: missing mandatory argument 'myhost'

If you omit the delete-if-exist child tag of the file-put operation, and the specified file already exists, the script reports an error.

root@host> op export myhost router1 encoding ascii filename /var/log/host-version.txt
Enter username: root
Enter password:
Connected to host.  Exporting file...

Destination file exists
Saving file on local host

Destination file exists

If you execute the script and include a directory path that does not exist on either the remote or the local host, the script reports an error.

root@host> op export myhost router1 encoding ascii filename /var/test/host-version.txt
Enter username: root
Enter password:
Connected to host.  Exporting file...

Destination directory does not exist: /var/test
Saving file on local host

Destination directory does not exist: /var/test

Published: 2013-03-05