Example: Export 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 useASCIIorbase64encoding.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 thechmodcommand.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
Procedure
Step-by-Step Procedure
To download, enable, and test the script:
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.
In configuration mode, include the
filestatement 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)
Issue the
commit and-quitcommand.[edit] user@host# commit and-quit
Execute the op script by issuing the
op exportoperational 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