This is a typical script launched when a specific RASLOG message is generated.
The all_ports_down.py script below was deployed—as a temporary
workaround—to ensure that if a port-channel is shut down the members are also shut down.

Note
To access this script and related resources, refer to https://github.com/extremenetworks/ExtremeScripting.#!/usr/local/python/3.5.2/bin/python3
import getopt
import json
import sys
import io
import re
import pdb
from CLI import CLI
int_down_raslog = 'NSM-1020'
int_up_raslog = 'NSM-1019'
shutdown_string = ''
match = None
raslog_triggers = {}
output = ''
# For argument processing:
options, remainder = getopt.gnu_getopt(sys.argv[1:], '', ['raslog-triggers='])
for opt, arg in options:
if opt in ('--raslog-triggers'):
print('--raslog-triggers: ', arg)
output = io.StringIO(arg)
raslog_triggers = json.load(output)
# Opening a file for logging:
f = open("poout.txt", "a")
f.write("testing:\n")
def po_members(po_num, shutdown_str):
# Determines the physical members of the port-channel and executes
# a shutdown/no shutdown command as requested for each physical interface:
print("inside po_members", po_num, shutdown_str)
f.write("inside po_members" + str(po_num) + str(shutdown_str))
members = []
# Executing the show port-channel CLI and matching the output:
poCLI = "show port-channel " + str(po_num) + " | begin Link:"
output = CLI(poCLI, do_print=False).get_output()
print("output =\n" + str(output))
f.write("output = \n" + str(output))
# Iterating over each interface found in the output, and executing the
# appropriate configuration commands:
for entry in output:
print(entry)
str1 = "".join(entry)
str1 = str1.lstrip()
print(str1.startswith("Link"))
if str1.startswith("Link"):
phy = str1.split("Link: ")[1].split("(0x")[0]
members.append(phy)
command = "config term\nint " + phy + "\n" + str(shutdown_str)
output = CLI(command, do_print=False).get_output()
print("cli output = " + command + "\n" + str(output))
f.write("cli output = " + command + "\n" + str(output))
str1 = ""
return members
# The following section uses the passed information from the event-handler
# and calls po_members with the correct information:
print('raslog_triggers:\n', str(raslog_triggers))
f.write("raslog_triggers:\n" + str(raslog_triggers) + '\n')
if int_down_raslog in raslog_triggers:
shutdown_string = 'shutdown'
match = re.search(r'interface Port-channel (\d+)',
raslog_triggers[int_down_raslog], re.IGNORECASE)
elif int_up_raslog in raslog_triggers:
shutdown_string = 'no shutdown'
match = re.search(r'interface Port-channel (\d+)',
raslog_triggers[int_up_raslog], re.IGNORECASE)
if match:
po = match.group(1)
print('Performing operation "' + shutdown_string
+ '" on members for Port-channel ' + po + '\n')
f.write('Performing operation "' + shutdown_string
+ '" on members for Port-channel ' + po + '\n')
members = po_members(po, shutdown_string)
print('\tMembers on Port-channel ' + po + ': ' + str(members) + '\n')
f.write('\tMembers on Port-channel ' + po + ': ' + str(members) + '\n')
f.close()
all_ports_down.py script
for an NSM-1020
RASLOG:device# python all_ports_down.py --raslog-triggers {"NSM-1020":"interface Port-channel 10 is administratively down."}
all_ports_down.py script for an NSM-1019
RASLOG:device# python all_ports_down.py --raslog-triggers {"NSM-1019":"interface Port-channel 10 is administratively up."}
device# show port-channel detail LACP Aggregator: Po 10 Aggregator type: Standard Actor System ID - 0x8000,78-a6-e1-45-95-14 Admin Key: 0010 - Oper Key 0010 Receive link count: 4 - Transmit link count: 4 Individual: 0 - Ready: 1 Partner System ID - 0x0001,00-24-38-8b-f1-00 Partner Oper Key 0102 Flag * indicates: Primary link in port-channel Number of Ports: 4 Minimum links: 1 Member ports: Link: Eth 0/3 (0xC006000) sync: 1 Link: Eth 0/4 (0xC008000) sync: 1 * Link: Eth 0/5 (0xC00A000) sync: 1 Link: Eth 0/6 (0xC00C000) sync: 1 device# flex-cli show interface brief Port Link Port-State Dupl Speed Tag MAC Name po10 Up N/A N/A 40000 Mbit Yes 78a6.e145.9562 po11 Up N/A N/A 30000 Mbit Yes 78a6.e145.9563 lb1 Down N/A N/A N/A N/A N/A N/A 0/1 Disabled None None None No 78a6.e145.9519 Ifml 0/2 Disabled None None None No 78a6.e145.951a 0/3 Up Forward Full 10000 Mbit No 78a6.e145.951b 0/4 Up Forward Full 10000 Mbit No 78a6.e145.951c 0/5 Up Forward Full 10000 Mbit No 78a6.e145.951d 0/6 Up Forward Full 10000 Mbit No 78a6.e145.951e 0/7 Up Forward Full 10000 Mbit No 78a6.e145.951f