[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