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 useASCII
orbase64
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 thechmod
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
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
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)
Issue the
commit and-quit
command.[edit] user@host# commit and-quit
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