/* * Set policer to half speed if all BGP is UP * */ 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"; /* ns ext = "http://xmlsoft.org/XSLT/namespace"; */ import "../import/junos.xsl"; param $policer; param $speed; param $localtime_iso; /* syslog priority: local7.error: 187, local7.notice: 189, local7.info: 190, local7.debug: 191 */ match / { var $as = { var $r = jcs:regex("AS ([0-9]+)", event-script-input/trigger-event/attribute-list/attribute[name="peer-name"]/value); expr $r[2]; } expr jcs:syslog(191, "event script policer ", $policer, " speed ", $speed, " as ", $as); var $speedc = { var $r = jcs:regex("([0-9]+)([gmk]?)$", $speed); if ($r[3] == "g") { expr $r[2] _ "000000000"; } else if ($r[3] == "m") { expr $r[2] _ "000000"; } else if ($r[3] == "k") { expr $r[2] _ "000"; } else { expr $r[2]; } } if (event-script-input/trigger-event/attribute-list/attribute[name="new-state"]/value != "Established") { if (event-script-input/trigger-event/attribute-list/attribute[name="old-state"]/value == "Established") { expr jcs:syslog(191, "Down BGP event with AS ", $as); call update($bw=$speedc); } } else { /* BGP UP event */ var $bgp-sum = jcs:invoke('get-bgp-summary-information'); if ($bgp-sum//xnm:error) { for-each ($bgp-sum//xnm:error) { expr jcs:syslog(187, "bgp sum error: ", message); } } else if ($bgp-sum/bgp-peer[peer-as==$as && not(peer-state=="Established")]) { expr jcs:syslog(191, "There are down BGP with AS ", $as); /* call update($bw=$speedc); */ } else if ($speedc > 1000000000) { expr jcs:syslog(191, "All BGP with AS ", $as, " are UP"); call update($bw=jcs:printf("%d000000", $speedc * 0.0000005)); } else { expr jcs:syslog(191, "All BGP with AS ", $as, " are UP"); call update($bw=jcs:printf("%d", $speedc * 0.5)); } } } template update($bw) { /* Retrieve the current committed configuration for the policer */ var $config-request = { { { { $policer; } } } } /* Open connection to get config as well as load it */ var $connection = jcs:open(); var $configuration = jcs:execute($connection, $config-request); var $oldbw = $configuration/firewall/policer[name==$policer]/if-exceeding/bandwidth-limit; var $oldbwc = { var $r = jcs:regex("([0-9]+)([gmk]?)$", $oldbw); if ($r[3] == "g") { expr $r[2] _ "000000000"; } else if ($r[3] == "m") { expr $r[2] _ "000000"; } else if ($r[3] == "k") { expr $r[2] _ "000"; } else { expr $r[2]; } } var $bws = { var $r = jcs:regex("([0-9]*[1-9]0?0?)(000)?(000)?(000)?$", $bw); if ($r[5]) { expr $r[2] _ "g"; } else if ($r[4]) { expr $r[2] _ "m"; } else if ($r[3]) { expr $r[2] _ "k"; } else { expr $bw; } } expr jcs:syslog(190, "Old bw ", $oldbw, " (", $oldbwc, "), new ", $bws, " (", $bw, ")"); if ($oldbwc != $bw) { /* Create the configuration change */ var $change = { { { { $policer; "Changed from " _ $oldbw _ " to " _ $bws _ " by event " _ $localtime_iso; { $bws; } } } } } /* var $results := { call jcs:load-configuration($connection, $configuration=$change); } */ var $open-req = { ; } var $res-open = jcs:execute($connection, $open-req); if ($res-open//xnm:error) { for-each ($res-open//xnm:error) { expr jcs:syslog(187, "Open configuration error: ", message); } } else { var $res-load = jcs:execute($connection, $change); if ($res-load//xnm:error) { for-each ($res-load//xnm:error) { expr jcs:syslog(187, "Load configuration error: ", message); } } else { var $res-commit = jcs:execute($connection, "commit-configuration"); if ($res-commit//xnm:error) { for-each ($res-commit//xnm:error) { expr jcs:syslog(187, "Commit error: ", message); } } else { expr jcs:syslog(189, "Bandwidth for ", $policer, " changed from ", $oldbw, " to ", $bws); } } expr jcs:execute($connection, "close-configuration"); } } else { expr jcs:syslog(191, "Bandwidth ", $oldbw, " for policer ", $policer, " not changed"); } /* Close the connection */ expr jcs:execute($connection, "request-end-session"); expr jcs:close($connection); }