Supported Platforms
Related Documentation
- ACX, EX, M, MX, PTX, SRX, T Series
- Declaring Arguments in Op Scripts
- Example: Importing Files Using an Op Script
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:
- Copy the XSLT or SLAX script into a text file, name the
file
export.xsl
orexport.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
orexport.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
Related Documentation
- ACX, EX, M, MX, PTX, SRX, T Series
- Declaring Arguments in Op Scripts
- Example: Importing Files Using an Op Script
Published: 2013-03-05
Supported Platforms
Related Documentation
- ACX, EX, M, MX, PTX, SRX, T Series
- Declaring Arguments in Op Scripts
- Example: Importing Files Using an Op Script