Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

Navigation

Example: Changing the Configuration Using a NETCONF Perl Client Application

The NETCONF Perl distribution includes several sample Perl scripts to perform various functions on devices running Junos OS. The edit_configuration.pl script edits configuration statements and loads the configuration onto a device. It uses the basic structure for sending requests but also defines a graceful_shutdown subroutine that handles errors. The following sections describe the different functions that the script performs:

Handling Error Conditions

The graceful_shutdown subroutine in the edit_configuration.pl script handles errors encountered in the NETCONF session. It employs the following additional constants:

# query execution status constants
use constant REPORT_SUCCESS => 1;
use constant REPORT_FAILURE => 0;
use constant STATE_CONNECTED => 1;
use constant STATE_LOCKED => 2;
use constant STATE_CONFIG_LOADED => 3;

The first two if statements in the subroutine refer to the STATE_CONFIG_LOADED and STATE_LOCKED conditions, which apply specifically to loading a configuration in the edit_configuration.pl script.

sub graceful_shutdown
{
   my ($jnx, $state, $success) = @_;
   if ($state >= STATE_CONFIG_LOADED) {
       # We have already done an <edit-config> operation
       # - Discard the changes
       print "Discarding the changes made ...\n";
       $jnx->discard_changes();
       if ($jnx->has_error) {
           print "Unable to discard <edit-config> changes\n";
       }
   }

   if ($state >= STATE_LOCKED) {
       # Unlock the configuration database
       $jnx->unlock_config();
       if ($jnx->has_error) {
           print "Unable to unlock the candidate configuration\n";
       }
   }

   if ($state >= STATE_CONNECTED) {
       # Disconnect from the Netconf server
       $jnx->disconnect();
   }

   if ($success) {
       print "REQUEST succeeded !!\n";
   } else {
       print "REQUEST failed !!\n";
   }

   exit;
}

Locking the Configuration

The main section of the edit_configuration.pl script begins by establishing a connection to a NETCONF server. It then invokes the lock_configuration method to lock the configuration database. In case of error, the script invokes the graceful_shutdown subroutine described in Handling Error Conditions .

print "Locking configuration database ...\n";
my %queryargs = ( 'target' => 'candidate' );
$res = $jnx->lock_config(%queryargs);
# See if you got an error
if ($jnx->has_error) {
    print "ERROR: in processing request \n $jnx->{'request'} \n";
    graceful_shutdown($jnx, STATE_CONNECTED, REPORT_FAILURE);
}

Reading In the Configuration Data

In the following code sample, the edit_configuration.pl script reads in and parses a file that contains Junos XML configuration tag elements or ASCII-formatted statements. A detailed discussion of the functional subsections follows the complete code sample.

# Load the configuration from the given XML file
print "Loading configuration from $xmlfile \n";
if (! -f $xmlfile) {
    print "ERROR: Cannot load configuration in $xmlfile\n";
    graceful_shutdown($jnx, STATE_LOCKED, REPORT_FAILURE);    
}

# Read in the XML file
my $config = read_xml_file($xmlfile);
print "\n\n$config \n\n";

%queryargs = ( 
                 'target' => 'candidate'
             );

# If we are in text mode, use config-text arg with wrapped
# configuration-text, otherwise use config arg with raw XML
if ($opt{t}) {
  $queryargs{'config-text'} = '<configuration text> . $config . </configuration-text>';
} else {
  $queryargs{'config'} = $config;

The first subsection of the preceding code sample verifies the existence of the file containing configuration data. The name of the file was previously obtained from the command line and assigned to the $xmlfile variable. If the file does not exist, the script invokes the graceful_shutdown subroutine.

print "Loading configuration from $xmlfile \n";
if (! -f $xmlfile) {
    print "ERROR: Cannot load configuration in $xmlfile\n";
    graceful_shutdown($jnx, STATE_LOCKED, REPORT_FAILURE);
}

The script then invokes the read_xml_file subroutine, which opens the file for reading and return its contents in the $config variable. The queryargs key target is set to the value candidate. When the script calls the edit_configuration method, the candidate configuration is edited.

# Read in the XML file
my $config = read_xml_file($xmlfile);
print "\n\n$config \n\n";
 
%queryargs = ( 
                 'target' => 'candidate'
             );

If the -t command-line option was included when the edit_configuration.pl script was invoked, the file referenced by the $xmlfile variable should contain ASCII-formatted configuration statements like those returned by the CLI configuration-mode show command. If the configuration statements are in ASCII-formatted text, the script encloses the configuration stored in the $config variable within the configuration-text tag element and stores the result in the value associated with the queryargs hash key config-text.

If the -t command-line option was not included when the edit_configuration.pl script was invoked, the file referenced by the $xmlfile variable contains Junos XML configuration tag elements. In this case, the script stores just the $config variable as the value associated with the queryargs hash key config.

if ($opt{t}) {
  $queryargs{'config-text'} = '<configuration text> . $config . </configuration-text>';
} else {
  $queryargs{'config'} = $config;

Editing the Configuration Data

The script now invokes the edit_config method to edit the candidate configuration on the device. It invokes the graceful_shutdown subroutine if the response from the NETCONF server has errors.

$res = $jnx->edit_config(%queryargs);

# See if you got an error
if ($jnx->has_error) {
    print "ERROR: in processing request \n $jnx->{'request'} \n";
    # Get the error
    my $error = $jnx->get_first_error();
    get_error_info(%$error);
    # Disconnect
    graceful_shutdown($jnx, STATE_LOCKED, REPORT_FAILURE);

Committing the Configuration

If there are no errors, the script invokes the commit method:

# Commit the changes
print "Committing the <edit-config> changes ...\n";
$jnx->commit();
if ($jnx->has_error) {
    print "ERROR: Failed to commit the configuration.\n";
    graceful_shutdown($jnx, STATE_CONFIG_LOADED, REPORT_FAILURE);
}

Published: 2013-07-26