[j-nsp] aggregated-ethernet and metric adjustment, if one link fails
Alex D.
listensammler at gmx.de
Fri Jan 13 16:07:06 EST 2012
Serge,
also many thanks for your op-script.
Regards,
Alex
Am 13.01.2012 21:32, schrieb Serge Vautour:
> Hello,
>
> There is a minimum member option in LAG links which will allow you to shutdown the whole bundle if 1 member fails.
>
> If you just want to increase metrics when 1 interface fails, you can do that with an event-script. Here's an example for OSPF. Adjust as required.
>
> Serge
>
> 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";
>
> /*
> * Increase OSPF cost when interface goes Down.
>
> * Note: This script only works when OSPF interfaces use unit 0 and with area 0.
>
> * Version 2: Updated to allow 2 instances to be called simultaneously
>
> */
>
> var $arguments = {
> <argument> {
> <name> "interface";
> <description> "Interface to lower cost";
> }
> <argument> {
> <name> "metric";
> <description> "New OSPF metric";
> }
> }
>
> var $area = "0.0.0.0";
>
> /* Decides where the output will go, 0 -> stdout, 1 -> syslog, 2 -> none */
> var $silent = "1";
>
> var $maxattempts = "5"; /* Number of times to try before giving up */
>
> match / {
>
> /*
> * xml config to set interface metric
> */
>
> var $xml = {
> <configuration> {
> <protocols> {
> <ospf> {
> <area> {
> <name>$area;
> <interface> {
> <name>$interface;
> <metric>$metric;
> }
> }
> }
> }
> }
> }
> var $attempt = "1";
> call doConfigChange($xml, $attempt);
>
>
> }
>
> template doConfigChange($xml, $attempt) {
> /*
> * Open connection with mgd
> */
> var $con = jcs:open();
>
> if (not($con)) {
> call emit-error($message = "Not able to connect to local mgd");
> }
> var $config-private =<open-configuration> {
> <private>;
> }
> var $private-results = jcs:execute($con, $config-private);
> var $load-configuration =<load-configuration> {
> copy-of $xml;
> }
>
> var $load-results = jcs:execute($con, $load-configuration);
> /*
> * Use load-configuration template defined in junos.xsl to load and
> * commit the configuration
> */
>
> var $commit-configuration =<commit-configuration>;
> var $commit-results = jcs:execute($con, $commit-configuration);
>
> /* Keep trying if we get an error while committing. This could be because another
> * instance of the script is committing.
> */
>
> if( $attempt> $maxattempts ) {
> /* Give up */
>
> for-each ($commit-results//xnm:error) {
> call emit-error($message = message);
> }
>
> var $giveupmessage = "ChangeOSPFMetric.slax configuration changes could not be made after " _ $attempt _ " attempts. - Script is exiting.";
> expr jcs:syslog("user.error", "ChangeOSPFMetric.slax[Error]: ", $giveupmessage);
> }
> else {
> /* if we have an error, wait 10sec, increment attempts and perform recursive call to try again */
> if ($commit-results//xnm:error) {
> var $error-msg = "configuration change failed, a user may be editing the config or the script attempted to load a bad config. Configuration change error info follows - " _ $commit-results _ " - trying again in 10 seconds . . . ";
> expr jcs:syslog(5, $error-msg);
> expr jcs:sleep(10);
> call doConfigChange($xml, $attempt = $attempt + 1 );
> }
> else {
> call emit-success($message = "Changed Metric");
>
> for-each ($commit-results//xnm:warning) {
> call emit-warn($message = message);
> }
>
> } /* end if commit-results */
> } /* end if attempt statement */
>
> var $close-private =<close-configuration>;
> var $close-configuration-results = jcs:execute($con, $close-private);
> var $close-results = jcs:close($con);
> }
>
>
> template emit-success($message) {
>
> if ($silent == 0) {
> expr jcs:output($message);
> } else if ($silent == 1) {
> expr jcs:syslog("user.info","ChangeOSPFMetric.slax[Success]: ", $message);
> }
> }
>
> template emit-error($message) {
>
> if ($silent == 0) {
> expr jcs:output($message);
> } else if ($silent == 1) {
> expr jcs:syslog("user.error", "ChangeOSPFMetric.slax[Error]: ", $message);
> }
> }
>
> template emit-warn($message) {
>
> if ($silent == 0) {
> expr jcs:output($message);
> } else if ($silent == 1) {
> expr jcs:syslog("user.warning", "ChangeOSPFMetric.slax[Warning]: ", $message);
> }
> }
>
>
> Config to activate the script:
>
> event-options {
> policy TrackCoreInt {
> events snmp_trap_link_down;
> attributes-match {
> snmp_trap_link_down.interface-name matches "(xe-0/0/0)|(xe-0/1/0)";
> }
> then {
> execute-commands {
> commands {
> "show interfaces {$$.interface-name}";
> "show conf interfaces {$$.interface-name}";
> "show conf protocols ospf";
> }
> output-filename TrackCore_show_commands.txt;
> destination local;
> output-format text;
> }
> event-script ChangeOSPFMetric.slax {
> output-filename ChangeOSPFMetric.txt;
> destination local;
> output-format text;
> arguments {
> interface "{$$.interface-name}";
> metric "25";
> }
> }
> }
> }
> event-script {
> inactive: traceoptions {
> file event-trace.log;
> flag all;
> }
> file ChangeOSPFMetric.slax;
> }
> destinations {
> local {
> archive-sites {
> /var/home/;
> }
> }
> }
> }
>
More information about the juniper-nsp
mailing list