def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output # initial variables ret_dict = {} # Total number of entries in the ARP table: 1233 p1 = re.compile(r'^Total +number +of +entries +in +the +ARP +table: +' \ '(?P<arp_table_entries>\d+)\.$') # Total number of Dynamic ARP entries: 1123 p2 = re.compile(r'^Total +number +of +(?P<entry_name>[\S\s]+): +' \ '(?P<num_of_entries>\d+)\.$') # GigabitEthernet0/0/4 4 p3 = re.compile( r'^(?P<interface_name>[\w\/\.]+) +(?P<entry_count>\d+)') # Learn ARP Entry Threshold is 409600 and Permit Threshold is 486400. p4 = re.compile(r'^Learn +ARP +Entry +Threshold +is +' \ '(?P<arp_entry_threshold>\d+) +and +Permit +Threshold +is +' \ '(?P<permit_threshold>\d+).?$') # Maximum limit of Learn ARP entry : 512000. p5 = re.compile(r'^(?P<maximum_entries_name>[\w\W]+) +: +' \ '(?P<maximum_entries>\d+).$') for line in out.splitlines(): line = line.strip() # Total number of entries in the ARP table: 1233 m = p1.match(line) if m: group = m.groupdict() total_num_of_entries = ret_dict.setdefault( \ 'total_num_of_entries', {}) total_num_of_entries.update( {'arp_table_entries': int(group['arp_table_entries'])}) continue # Total number of Dynamic ARP entries: 1123 m = p2.match(line) if m: group = m.groupdict() total_num_of_entries = ret_dict.setdefault( \ 'total_num_of_entries', {}) key = group['entry_name'].replace(' ', '_').lower() total_num_of_entries.update( {key: int(group['num_of_entries'])}) continue # GigabitEthernet0/0/4 4 m = p3.match(line) if m: group = m.groupdict() interfaces = ret_dict.setdefault('interface_entries', {}) interfaces.update({ Common.convert_intf_name(group['interface_name']): int(group['entry_count']) }) continue # Learn ARP Entry Threshold is 409600 and Permit Threshold is 486400. m = p4.match(line) if m: group = m.groupdict() ret_dict.update( {'arp_entry_threshold': int(group['arp_entry_threshold'])}) ret_dict.update( {'permit_threshold': int(group['permit_threshold'])}) continue # Maximum limit of Learn ARP entry : 512000. m = p5.match(line) if m: group = m.groupdict() key = group['maximum_entries_name'].replace(' ', '_').lower() maximum_entries = ret_dict.setdefault('maximum_entries', {}) maximum_entries.update({key: int(group['maximum_entries'])}) return ret_dict
def cli(self, pvstag_domain, output=None): if output is None: # get output from device out = self.device.execute( self.cli_command.format(pvstag_domain=pvstag_domain)) else: out = output # initial return dictionary ret_dict = {} # VLAN 2: p1 = re.compile(r'^VLAN\s+(?P<vlan_id>\d+)$') # Pre-empt delay is enabled. Sending startup BPDU until 13:38:03 # Pre-empt delay is enabled. Sending standard BPDU # Pre-empt delay is disabled p2 = re.compile( r'^Pre\-empt +delay +is +(?P<preempt_delay>\w+)' '\.?( +Sending +(startup|standard) +BPDU( +until \S+)?)?') # Sub-interface: GigabitEthernet0/0/0/1.5 (Up) # Sub-interface: Bundle-Ether1000.2100 (Up) p3 = re.compile(r'^Sub\-interface:\s+(?P<sub_interface>\S+)' '\s+\((?P<sub_interface_state>\w+)\)$') # Max Age: 20 p4 = re.compile(r'^Max\s+Age:\s+(?P<max_age>\d+)$') # Root Priority: 0 p5 = re.compile(r'^Root\s+Priority:\s+(?P<root_priority>\d+)$') # Root Bridge: 0000.0000.0000 p6 = re.compile(r'^Root\s+Bridge:\s+(?P<root_bridge>[\w\.]+)$') # Cost: 1 p7 = re.compile(r'^Cost:\s+(?P<root_cost>\d+)$') # Bridge Priority: 32768 p8 = re.compile(r'^Bridge\s+Priority:\s+(?P<bridge_priority>\d+)$') # Bridge ID: 0255.1dff.3c70 p9 = re.compile(r'^Bridge\s+ID:\s+(?P<bridge_id>[\w\.]+)$') # Port Priority: 128 p10 = re.compile(r'^Port\s+Priority:\s+(?P<port_priority>\d+)$') # Port ID 1 p11 = re.compile(r'^Port\s+ID:?\s+(?P<port_id>\d+)$') # Hello Time: 2 p12 = re.compile(r'^Hello\s+Time:\s+(?P<hello_time>\d+)$') # Active: Yes p13 = re.compile(r'^Active:\s+(?P<active>\w+)$') # BPDUs sent: 6 p14 = re.compile(r'^BPDUs\s+sent:\s+(?P<bdpu_sent>\d+)$') # Topology Changes: 0 p15 = re.compile(r'^Topology\s+Changes:\s+(?P<topology_changes>\d+)$') # GigabitEthernet0/0/0/1 p16 = re.compile(r'^(?P<interface>\S+)$') for line in out.splitlines(): line = line.strip() # VLAN 2 m = p1.match(line) if m: group = m.groupdict() vlan = vlans.setdefault(group['vlan_id'], {}) continue # Pre-empt delay is enabled. Sending startup BPDU until 13:38:03 # Pre-empt delay is enabled. Sending standard BPDU # Pre-empt delay is disabled m = p2.match(line) if m: group = m.groupdict() preempt_delay = group['preempt_delay'] vlan.update({'preempt_delay': (preempt_delay == 'enabled')}) continue # Sub-interface: GigabitEthernet0/0/0/1.5 (Up) # Sub-interface: Bundle-Ether1000.2100 (Up) m = p3.match(line) if m: group = m.groupdict() vlan.update({k: v for k, v in group.items()}) continue # Max Age: 20 m = p4.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Root Priority: 0 m = p5.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Root Bridge: 0000.0000.0000 m = p6.match(line) if m: group = m.groupdict() vlan.update({k: v for k, v in group.items()}) continue # Cost: 0 m = p7.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Bridge Priority: 32768 m = p8.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Bridge ID: 6c9c.edff.8d95 m = p9.match(line) if m: group = m.groupdict() vlan.update({k: v for k, v in group.items()}) continue # Port Priority: 128 m = p10.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Port ID 1 m = p11.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Hello Time: 2 m = p12.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Active: Yes m = p13.match(line) if m: group = m.groupdict() vlan.update({'active': (group['active'].lower() == 'yes')}) continue # BPDUs sent: 10 m = p14.match(line) if m: group = m.groupdict() counters = vlan.setdefault('counters', {}) counters.update({'bdpu_sent': int(group['bdpu_sent'])}) continue # Topology Changes: 0 m = p15.match(line) if m: group = m.groupdict() counters = vlan.setdefault('counters', {}) counters.update( {'topology_changes': int(group['topology_changes'])}) continue # Bundle-Ether1000 m = p16.match(line) if m: group = m.groupdict() pvrstag = ret_dict.setdefault('pvstag', {}). \ setdefault(pvstag_domain, {}) pvrstag.update({'domain': pvstag_domain}) interface = pvrstag.setdefault('interfaces', {}). \ setdefault( Common.convert_intf_name(group['interface']), {}) interface.update({ 'interface': Common.convert_intf_name(group['interface']) }) vlans = interface.setdefault('vlans', {}) continue return ret_dict
def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output # init returned dict parsed_dict = {} # init sub dicts sub_dict = {} intf_dict = {} port_dict = {} tmp_chassis_id = '' tmp_port_id = '' # Chassis id: 000d.bdff.4f04 # Chassis id: 39373638-3935-5A43-4A37-35303036574C p1 = re.compile(r'^Chassis +id: +(?P<chassis_id>[\S]+)$') # Port id: Gi0/0/0/1 # Port id: PCI-E Slot 1, Port 2 p2 = re.compile(r'^Port +id: +(?P<port_id>[\S ]+)$') # Local Port id: Eth1/2 p3 = re.compile(r'^Local +Port +id: +(?P<local_port_id>\S+)$') # Port Description: null p4 = re.compile( r'^Port +Description: +(?P<port_description>(?!null).+)$') # System Name: R2_xrv9000 p5 = re.compile(r'^System +Name: +(?P<system_name>\S+)$') # System Description: 6.2.2, IOS-XRv 9000 p6 = re.compile(r'^System +Description: +(?P<system_description>.+)$') # Copyright (c) 1986-2017 by Cisco Systems, Inc. p6_1 = re.compile(r'^(?P<copyright>Copyright +\([c|C]\) +.+)$') # Compiled Sat 22-Jul-17 05:51 by p6_2 = re.compile(r'^(?P<compiled_by>Compiled +.+)$') # Technical Support: http://www.cisco.com/techsupport p6_3 = re.compile( r'^(?P<technical_support>(Technical|TAC) (S|s)upport: +.+)$') # Time remaining: 95 seconds p7 = re.compile( r'^Time +remaining: +(?P<time_remaining>\d+) +seconds$') # System Capabilities: B, R # System Capabilities: not advertised p8 = re.compile(r'^System +Capabilities: +(?P<system>[\w ,]+)$') # Enabled Capabilities: R # Enabled Capabilities: not advertised p9 = re.compile(r'^Enabled +Capabilities: +(?P<enabled>[\w ,]+)$') # Management Address: 10.2.3.2 p10 = re.compile(r'^Management +Address: +(?P<mgmt_address_ipv4>.+)$') # Management Address IPV6: not advertised p11 = re.compile( r'^Management +Address +IPV6: +(?P<mgmt_address_ipv6>.+)$') # Vlan ID: not advertised p12 = re.compile(r'^Vlan +ID: +(?P<vlan_id>.+)$') # Total entries displayed: 2 p13 = re.compile( r'^Total +entries +displayed: +(?P<total_entries>\d+)$') # VRP (R) software, Version 8.80 (CE6850 V100R003C00SPC600) p14 = re.compile(r'(?P<custom_name>VRP .+)$') # customer devices p15 = re.compile(r'(?P<special_name>HUA.+)$') for line in out.splitlines(): line = line.strip() # Chassis id: 000d.bdff.4f04 # Chassis id: 39373638-3935-5A43-4A37-35303036574C m = p1.match(line) if m: group = m.groupdict() tmp_chassis_id = group['chassis_id'] continue # Port id: Gi0/0/0/1 # Port id: PCI-E Slot 1, Port 2 m = p2.match(line) if m: group = m.groupdict() port_id = Common.convert_intf_name(group['port_id']) tmp_port_id = port_id continue # Local Port id: Eth1/2 m = p3.match(line) if m: sub_dict = {} group = m.groupdict() intf = Common.convert_intf_name(group['local_port_id']) intf_dict = parsed_dict.setdefault('interfaces', {}).setdefault(intf, {}) sub_dict.update({'chassis_id': tmp_chassis_id}) port_dict = intf_dict.setdefault('port_id', {}).setdefault( tmp_port_id, {}) continue # Port Description: null m = p4.match(line) if m: group = m.groupdict() sub_dict.setdefault('port_description', group['port_description']) continue # System Name: R2_xrv9000 m = p5.match(line) if m: group = m.groupdict() system_name = group['system_name'] sub_dict.update({'system_name': system_name}) port_dict.setdefault('neighbors', {}).setdefault(system_name, sub_dict) continue # System Description: Cisco IOS Software [Everest], Virtual XE # Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.6.1, # RELEASE SOFTWARE (fc2) m = p6.match(line) if m: group = m.groupdict() sub_dict.update( {'system_description': group['system_description']}) continue # Copyright (c) 1986-2011 by Cisco Systems, Inc. m = p6_1.match(line) if m: group = m.groupdict() sub_dict['system_description'] += group['copyright'] + '\n' continue # Compiled Thu 21-Jul-11 01:23 by prod_rel_team m = p6_2.match(line) if m: group = m.groupdict() sub_dict['system_description'] += group['compiled_by'] continue # Technical Support: http://www.cisco.com/techsupport m = p6_3.match(line) if m: group = m.groupdict() sub_dict['system_description'] += '\n' + group[ 'technical_support'] + '\n' continue # Time remaining: 95 seconds m = p7.match(line) if m: sub_dict.update( {'time_remaining': int(m.groupdict()['time_remaining'])}) continue # System Capabilities: B, R # System Capabilities: not advertised m = p8.match(line) if m: cap_list = m.groupdict()['system'].split(',') if 'not advertised' in cap_list: sub_dict.update({'system_capabilities': 'not advertised'}) else: cap_list = map(str.strip, cap_list) cap = [self.CAPABILITY_CODES[n] for n in cap_list] for item in cap: cap_dict = sub_dict.setdefault('capabilities', {}).setdefault( item, {}) cap_dict.update({'name': item}) cap_dict.update({'system': True}) continue # Enabled Capabilities: R # Enabled Capabilities: not advertised m = p9.match(line) if m: cap_list = m.groupdict()['enabled'].split(',') if 'not advertised' in cap_list: sub_dict.update({'enabled_capabilities': 'not advertised'}) else: cap_list = map(str.strip, cap_list) cap = [self.CAPABILITY_CODES[n] for n in cap_list] for item in cap: cap_dict = sub_dict.setdefault('capabilities', {}).setdefault( item, {}) cap_dict.update({'name': item}) cap_dict.update({'enabled': True}) continue # Management Address: 10.2.3.2 m = p10.match(line) if m: group = m.groupdict() sub_dict.update( {'management_address_v4': group['mgmt_address_ipv4']}) continue # Management Address IPV6: not advertised m = p11.match(line) if m: group = m.groupdict() sub_dict.update( {'management_address_v6': group['mgmt_address_ipv6']}) continue # Vlan ID: not advertised m = p12.match(line) if m: sub_dict.update({'vlan_id': m.groupdict()['vlan_id']}) continue # Total entries displayed: 2 m = p13.match(line) if m: parsed_dict.update( {'total_entries': int(m.groupdict()['total_entries'])}) continue # VRP (R) software, Version 8.80 (CE6850 V100R003C00SPC600) m14 = p14.match(line) if m14: group = m14.groupdict() sub_dict[ 'system_description'] += '\n' + group['custom_name'] + '\n' continue # customer device m15 = p15.match(line) if m15: group = m15.groupdict() sub_dict['system_description'] += group['special_name'] + '\n' return parsed_dict
def cli(self, mst='', vlan='', output=None): if output is None: # get output from device if vlan: cmd = self.cli_command[0].format(vlan=vlan) elif mst: cmd = self.cli_command[1].format(mst=mst) else: cmd = self.cli_command[2] out = self.device.execute(cmd) else: out = output # initial return dictionary ret_dict = {} # initial regexp pattern p1 = re.compile(r'^(MST|VLAN)(?P<inst>\d+)$') p2 = re.compile(r'^Spanning +tree +enabled p+rotocol +(?P<mode>\w+)$') p3 = re.compile(r'^Root +ID +Priority +(?P<priority>\d+)$') p4 = re.compile(r'^Bridge +ID +Priority +(?P<priority>\d+)' '( *\(priority +(?P<configured_bridge_priority>\d+) +' 'sys\-id\-ext +(?P<sys_id_ext>\d+)\))?$') p5 = re.compile(r'^Address +(?P<address>[\w\.]+)$') p6 = re.compile(r'^Cost +(?P<cost>\d+)$') p7 = re.compile( r'^Port +(?P<port>\d+) +\((?P<interface>[\w\-\/\.]+)\)$') p8 = re.compile(r'Hello +Time +(?P<hello_time>\d+) +sec +' 'Max +Age +(?P<max_age>\d+) +sec +' 'Forward +Delay +(?P<forward_delay>\d+) +sec$') p9 = re.compile(r'^Aging +Time +(?P<aging_time>\d+) +sec$') p10 = re.compile(r'^(?P<interface>[\w\-\/\.]+) +' '(?P<role>[\w\*]+) +(?P<port_state>[A-Z\*]+) *' '(?P<cost>\d+) +(?P<port_priority>\d+)\.' '(?P<port_num>\d+) +(?P<type>\w+)' '( +(Bound\((?P<bound>\w+)\)|Peer\((?P<peer>\w+)\)))?' '( +\*\S+)?$') for line in out.splitlines(): line = line.strip() # VLAN0200 # MST10 m = p1.match(line) if m: inst = int(m.groupdict()['inst']) continue # Spanning tree enabled protocol rstp m = p2.match(line) if m: mode_dict = ret_dict.setdefault( self.MODE_NAME_MAP[m.groupdict()['mode']], {}) inst_dict = mode_dict.setdefault(self.MODE_INST_MAP[m.groupdict()['mode']], {}).\ setdefault(inst, {}) continue # Root ID Priority 24776 m = p3.match(line) if m: role_dict = inst_dict.setdefault('root', {}) role_dict['priority'] = int(m.groupdict()['priority']) continue # Address 58bf.eab6.2f00 m = p5.match(line) if m: role_dict['address'] = m.groupdict()['address'] continue # Cost 3 m = p6.match(line) if m: role_dict['cost'] = int(m.groupdict()['cost']) continue # Port 2390 (Port-channel14) m = p7.match(line) if m: group = m.groupdict() role_dict['port'] = int(group['port']) role_dict['interface'] = group['interface'] continue # Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec m = p8.match(line) if m: role_dict.update({k: int(v) for k, v in m.groupdict().items()}) continue # Bridge ID Priority 28872 (priority 28672 sys-id-ext 200) m = p4.match(line) if m: role_dict = inst_dict.setdefault('bridge', {}) role_dict.update( {k: int(v) for k, v in m.groupdict().items() if v}) continue # Aging Time 300 sec m = p9.match(line) if m: role_dict['aging_time'] = int(m.groupdict()['aging_time']) continue # Gi1/0/5 Desg FWD 4 128.5 P2p Peer(STP) # Gi1/0/5 Mstr FWD 20000 128.5 P2p Bound(RSTP) # Po14 Desg BKN*6660 128.2390 P2p Bound(PVST) *PVST_Inc m = p10.match(line) if m: group = m.groupdict() intf = Common.convert_intf_name(group.pop('interface')) intf_dict = inst_dict.setdefault('interfaces', {}).setdefault(intf, {}) intf_dict['cost'] = int(group.pop('cost')) intf_dict['port_priority'] = int(group.pop('port_priority')) intf_dict['port_num'] = int(group.pop('port_num')) intf_dict['role'] = self.ROLE_MAP[group.pop('role')] intf_dict['port_state'] = self.PORT_STATE_MAP[group.pop( 'port_state')] intf_dict.update({k: v for k, v in group.items() if v}) continue return ret_dict
def cli(self, pvst_id, output=None): if output is None: # get output from device out = self.device.execute(self.cli_command.format(pvst_id=pvst_id)) else: out = output # initial return dictionary ret_dict = {} # VLAN 2: p1 = re.compile(r'^VLAN +(?P<vlan_id>\d+):$') # Root ID Priority 32768 p2 = re.compile(r'^Root\s+ID\s+Priority\s+' '(?P<designated_root_priority>\d+)') # Address 0021.1bff.d973 p3 = re.compile(r'^Address\s+(?P<address>[\w\.]+)$') # Max Age 20 sec, Forward Delay 15 sec p4 = re.compile(r'^Max\s+Age\s+(?P<max_age>\d+)\s+sec,' '\s+Forward\s+Delay\s+(?P<forward_delay>\d+)\s+sec$') # Bridge ID Priority 32768 (priority 32768 sys-id-ext 0) p5 = re.compile( r'^Bridge\s+ID\s+Priority\s+(?P<bridge_priority>\d+)' '(\s+\(priority\s+\d+\s+sys\-id\-ext\s+(?P<sys_id_ext>\d+)\))?') # Transmit Hold count 6 p6 = re.compile( r'^Transmit\s+Hold\s+count\s+(?P<bridge_transmit_hold_count>\d+)') # Gi0/7/0/0 128.1 20000 DSGN FWD 32768 8cb6.4fff.6588 128.1 p7 = re.compile( r'^(?P<name>\S+)\s+(?P<port_priority>\d+)\.' '(?P<port_num>\d+)\s+(?P<cost>\d+)\s+(?P<role>\w+)\s+(?P<port_state>' '\w+)\s+(?P<designated_bridge_priority>\d+)\s+' '(?P<designated_bridge_address>[\w\.]+)\s+' '(?P<designated_port_priority>\d+)\.' '(?P<designated_port_num>\d+)$') for line in out.splitlines(): line = line.strip() # VLAN 2: m = p1.match(line) if m: group = m.groupdict() pvst = ret_dict.setdefault('pvst', {}). \ setdefault(pvst_id, {}) pvst.update({'pvst_id': pvst_id}) vlans = pvst.setdefault('vlans', {}) vlan = vlans.setdefault(int(group['vlan_id']), {}) vlan.update({'vlan_id': int(group['vlan_id'])}) continue # Root ID Priority 32768 m = p2.match(line) if m: address_type = 'designated_root_address' group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Address 0021.1bff.d973 m = p3.match(line) if m: group = m.groupdict() vlan.update({address_type: group['address']}) continue # Max Age 20 sec, Forward Delay 15 sec m = p4.match(line) if m: group = m.groupdict() if address_type == 'designated_root_address': vlan.update( {'designated_root_max_age': int(group['max_age'])}) vlan.update({ 'designated_root_forward_delay': int(group['forward_delay']) }) if address_type == 'bridge_address': vlan.update({'bridge_max_age': int(group['max_age'])}) vlan.update( {'bridge_forward_delay': int(group['forward_delay'])}) continue # Bridge ID Priority 32768 (priority 32768 sys-id-ext 0) m = p5.match(line) if m: address_type = 'bridge_address' group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Transmit Hold count 6 m = p6.match(line) if m: group = m.groupdict() vlan.update({k: int(v) for k, v in group.items()}) continue # Gi0/7/0/0 128.1 20000 DSGN FWD 32768 8cb6.4fff.6588 128.1 m = p7.match(line) if m: group = m.groupdict() interfaces = vlan.setdefault('interface' , {}). \ setdefault(Common.convert_intf_name(group['name']), {}) interfaces.update( {'name': Common.convert_intf_name(group['name'])}) interfaces.update({'cost': int(group['cost'])}) interfaces.update({'role': group['role']}) interfaces.update( {'port_priority': int(group['port_priority'])}) interfaces.update({'port_num': int(group['port_num'])}) interfaces.update({'port_state': group['port_state']}) interfaces.update({ 'designated_bridge_priority': int(group['designated_bridge_priority']) }) interfaces.update({ 'designated_bridge_address': group['designated_bridge_address'] }) interfaces.update({ 'designated_port_priority': int(group['designated_port_priority']) }) interfaces.update( {'designated_port_num': int(group['designated_port_num'])}) continue return ret_dict
def cli(self, route=None, protocol=None, vrf=None, interface=None, output=None, cmd=None): # execute command to get output if output is None: if protocol and route and interface and vrf: cmd = self.cli_command[0].format( protocol=protocol, route=route, interface=interface, vrf=vrf, ) elif protocol and route and interface: cmd = self.cli_command[1].format( protocol=protocol, route=route, interface=interface, ) elif protocol and route and vrf: cmd = self.cli_command[2].format( protocol=protocol, route=route, vrf=vrf, ) elif protocol and interface and vrf: cmd = self.cli_command[3].format( protocol=protocol, vrf=vrf, interface=interface, ) elif route and interface and vrf: cmd = self.cli_command[4].format( vrf=vrf, route=route, interface=interface, ) elif protocol and route: cmd = self.cli_command[5].format( protocol=protocol, route=route, ) elif protocol and interface: cmd = self.cli_command[6].format( protocol=protocol, interface=interface, ) elif protocol and vrf: cmd = self.cli_command[7].format( protocol=protocol, vrf=vrf, ) elif route and interface: cmd = self.cli_command[8].format( route=route, interface=interface, ) elif route and vrf: cmd = self.cli_command[9].format( route=route, vrf=vrf, ) elif interface and vrf: cmd = self.cli_command[10].format( interface=interface, vrf=vrf, ) elif protocol: cmd = self.cli_command[11].format( protocol=protocol, ) elif route: cmd = self.cli_command[12].format( route=route, ) elif interface: cmd = self.cli_command[13].format( interface=interface, ) elif vrf: cmd = self.cli_command[14].format( vrf=vrf, ) else: cmd = self.cli_command[15] out = self.device.execute(cmd) else: out = output if not cmd: cmd = 'ipv4' af = 'ipv6' if 'v6' in cmd else 'ipv4' result_dict = {} # IP Route Table for VRF "default" # IP Route Table for Context "default" # IPv6 Routing Table for VRF "default" # IP Route Table for VRF "default" p1 = re.compile(r'^\s*(?P<af>IPv6|IP) +Rout(?:e|ing) +Table +for (VRF|Context) +\"(?P<vrf>\S+)\"$') # 10.4.1.1/32, ubest/mbest: 2/0 # 10.36.3.3/32, ubest/mbest: 2/0, attached # 10.121.0.0/24, ubest/mbest: 1/0 time, attached # 10.94.77.1/32, ubest/mbest: 1/0 time # 0.0.0.0/0, 1 ucast next-hops, 0 mcast next-hops # 0.1.3.255/32, 1 ucast next-hops, 0 mcast next-hops, attached # 2001:db8:5f1:1::1/128, ubest/mbest: 1/0, attached # 192.168.1.1/32, ubest/mbest: 1/0, pending ufdm p2 = re.compile(r'^(?P<route>[\w\/\.\:]+), +(ubest/mbest: +' r'(?P<ubest_mbest>[\d\/]+)( +time)?)?((?P<ubest>\d+) ' r'+ucast +next-hops, +(?P<mbest>\d+) +mcast +next-hops)?' r'(, +(?P<attached>[\w]+))?( +(?P<attached2>[\w]+))?$') # *via 10.2.3.2, Eth1/4, [1/0], 01:01:30, static # *via 10.1.3.1, Eth1/2, [110/41], 01:01:18, ospf-1, intra # *via 10.229.11.11, [200/0], 01:01:12, bgp-100, internal, tag 100 # *via 2001:db8:5f1:1::1, Eth1/27, [0/0], 05:56:03, local # *via ::ffff:10.229.11.11%default:IPv4, [200/0], 01:01:43, bgp-100, internal, # *via 10.1.3.1, Eth1/2, [110/41], 01:01:18, ospf-1, intra, tag 100, # via 10.4.1.1, [200/0], 1w4d, bgp-65000, internal, tag 65000 (hidden) # via 10.23.120.2, Eth1/1.120, [120/2], 1w4d, rip-1, rip # **via 10.36.3.3%default, [33/0], 5w0d, bgp-100, internal, tag 100 (mpls-vpn) # *via vrf default, Null0, [20/0], 18:11:28, bgp-333, external, tag 333 # *via 10.55.130.3%default, [33/0], 3d10h, bgp-1, internal, tag 1 (evpn), segid: 50051 tunnelid: 0x64008203 encap: VXLAN # *via 2001:db8:626b:2101::3/128, [200/7], 01:51:32, bgp-10001, internal, tag 20001 p3 = re.compile(r'^\s*(?P<star>[*]+)?via +(?P<next_hop>[\s\w\:\.\/\%\!\#\$\*\+\-\;\=\@\^\_\{\}]+),' r'( +(?P<interface>[\w\/\.]+))?,? +\[(?P<route_preference>[\d\/]+)\],' r' +(?P<date>[0-9][\w\:]+)?,?( +(?P<source_protocol>[\w\-]+))?,?' r'( +(?P<source_protocol_status>[\w-]+))?,?( +tag +(?P<tag>[\d]+))?,?' r'( +\((?P<hidden>hidden)\))?' r'\s*(?P<vpn>[a-zA-Z\(\)\-]+)?,?( +segid: +(?P<segid>\d+))?,?' r'( +tunnelid: +(?P<tunnelid>[0-9x]+))?,?( +encap: +(?P<encap>[a-zA-Z0-9]+))?$') # tag 100 p4 = re.compile(r'^tag +(?P<tag>\d+)$') for line in out.splitlines(): line = line.strip() # IP Route Table for VRF "default" # IP Route Table for Context "default" # IPv6 Routing Table for VRF "default" m = p1.match(line) if m: if 'vrf' not in result_dict: vrfs_dict = result_dict.setdefault('vrf', {}) group = m.groupdict() vrf = group['vrf'] af = 'ipv6' if 'v6' in group['af'] else 'ipv4' routes_dict = vrfs_dict.setdefault(vrf, {}).setdefault('address_family', {}). \ setdefault(af, {}).setdefault('routes', {}) continue # 10.4.1.1/32, ubest/mbest: 2/0 # 10.36.3.3/32, ubest/mbest: 2/0, attached # 10.121.0.0/24, ubest/mbest: 1/0 time, attached # 10.94.77.1/32, ubest/mbest: 1/0 time # 0.0.0.0/0, 1 ucast next-hops, 0 mcast next-hops # 0.1.3.255/32, 1 ucast next-hops, 0 mcast next-hops, attached # 2001:db8:5f1:1::1/128, ubest/mbest: 1/0, attached # 192.168.1.1/32, ubest/mbest: 1/0, pending ufdm m = p2.match(line) if m: groups = m.groupdict() route = groups['route'] active = True index = 1 if groups['ubest_mbest']: ubest_mbest = groups['ubest_mbest'] if '/' in ubest_mbest: ubest_mbest = ubest_mbest.split('/') ubest = ubest_mbest[0] mbest = ubest_mbest[1] elif groups['ubest'] and groups['mbest']: ubest = groups['ubest'] mbest = groups['mbest'] if groups['attached']: attached = True if 'attached' in groups['attached'] else False # if vrf: if 'vrf' not in result_dict: routes_dict = result_dict.setdefault('vrf', {}).setdefault('default', {}). \ setdefault('address_family', {}).setdefault(af, {}). \ setdefault('routes', {}) route_dict = routes_dict.setdefault(route, {}) route_dict.update({'route': route}) route_dict.update({'active': active}) if ubest: route_dict.update({'ubest': int(ubest)}) if mbest: route_dict.update({'mbest': int(mbest)}) if groups['attached']: route_dict.update({'attached': attached}) continue # *via 10.2.3.2, Eth1/4, [1/0], 01:01:30, static # *via 10.1.3.1, Eth1/2, [110/41], 01:01:18, ospf-1, intra # *via 10.229.11.11, [200/0], 01:01:12, bgp-100, internal, tag 100 # *via 2001:db8:5f1:1::1, Eth1/27, [0/0], 05:56:03, local # *via ::ffff:10.229.11.11%default:IPv4, [200/0], 01:01:43, bgp-100, internal, # *via 10.1.3.1, Eth1/2, [110/41], 01:01:18, ospf-1, intra, tag 100, # via 10.4.1.1, [200/0], 1w4d, bgp-65000, internal, tag 65000 (hidden) # via 10.23.120.2, Eth1/1.120, [120/2], 1w4d, rip-1, rip # **via 10.36.3.3%default, [33/0], 5w0d, bgp-100, internal, tag 100 (mpls-vpn) # *via 10.55.130.3%default, [33/0], 3d10h, bgp-1, internal, tag 1 (evpn), segid: 50051 tunnelid: 0x64008203 encap: VXLAN m = p3.match(line) if m: groups = m.groupdict() tag = process_id = source_protocol_status = interface = next_hop_vrf = next_hop_af = "" star = m.groupdict()['star'] cast = None star_rp, non_star_rp, star_metrics, non_star_metrics = None, None, None, None if groups['route_preference']: rp_val = groups['route_preference'].split('/') rp = int(rp_val[0]) metrics = int(rp_val[1]) if star: if len(star) == 1: cast = 'best_ucast_nexthop' if len(star) == 2: cast = 'best_mcast_nexthop' star_rp = rp star_metrics = metrics else: non_star_rp = rp non_star_metrics = metrics if groups['next_hop']: next_hop = groups['next_hop'] if '%' in next_hop: next_hop_vrf = next_hop.split('%')[1] next_hop = next_hop.split('%')[0] if ':' in next_hop_vrf: next_hop_af = next_hop_vrf.split(':')[1].lower() next_hop_vrf = next_hop_vrf.split(':')[0] if groups['interface']: interface = Common.convert_intf_name(groups['interface']) if groups['date']: updated = groups['date'] if groups['source_protocol_status']: source_protocol_status = groups['source_protocol_status'] if groups['source_protocol']: if '-' in groups['source_protocol']: source_protocol = groups['source_protocol'].split('-')[0] process_id = groups['source_protocol'].split('-')[1] else: source_protocol = groups['source_protocol'] if groups['tag']: tag = groups['tag'] hidden = True if groups.get('hidden') else False if hidden: route_dict.update({'hidden': hidden}) if star_metrics is not None: route_dict.update({'metric': star_metrics}) if star_rp is not None: route_dict.update({'route_preference': int(star_rp)}) if process_id: route_dict.update({'process_id': process_id}) if tag: route_dict.update({'tag': int(tag)}) next_hop_dict = route_dict.setdefault('next_hop', {}) if not next_hop: interface_dict = next_hop_dict.setdefault('outgoing_interface', {}).setdefault(interface, {}) if interface: interface_dict.update({'outgoing_interface': interface}) if updated: interface_dict.update({'updated': updated}) else: index_dict = next_hop_dict.setdefault('next_hop_list', {}).setdefault(index, {}) index_dict.update({'index': index}) index_dict.update({'next_hop': next_hop}) if source_protocol: route_dict.update({'source_protocol': source_protocol}) index_dict.update({'source_protocol': source_protocol}) if source_protocol_status: route_dict.update({'source_protocol_status': source_protocol_status}) index_dict.update({'source_protocol_status': source_protocol_status}) if cast: index_dict.update({cast: True}) if updated: index_dict.update({'updated': updated}) if interface: index_dict.update({'outgoing_interface': interface}) if next_hop_vrf: index_dict.update({'next_hop_vrf': next_hop_vrf}) if next_hop_af: index_dict.update({'next_hop_af': next_hop_af}) if star_metrics is not None: index_dict['metric'] = star_metrics if non_star_metrics is not None: index_dict['metric'] = non_star_metrics if star_rp is not None: index_dict['route_preference'] = star_rp if non_star_rp is not None: index_dict['route_preference'] = non_star_rp segid = groups['segid'] if segid: index_dict['segid'] = int(segid) tunnelid = groups['tunnelid'] if tunnelid: index_dict['tunnelid'] = tunnelid encap = groups['encap'] if encap: index_dict['encap'] = encap.lower() vpn = groups['vpn'] if vpn and 'mpls-vpn' in vpn: index_dict['mpls_vpn'] = True elif vpn and 'mpls' in vpn: index_dict['mpls'] = True elif vpn and 'evpn' in vpn: index_dict['evpn'] = True elif vpn and 'stale' in vpn: index_dict['stale'] = True index += 1 continue # tag 100 m = p4.match(line) if m: groups = m.groupdict() if groups['tag']: route_dict.update({'tag': int(groups['tag'])}) self.sort_next_hop_list(result_dict) return result_dict
def cli(self, npu, interface, instance, location, output=None): ret_dict = {} if not output: cmd = self.cli_command.format(npu=npu, interface=interface, instance=instance, location=location ) out = self.device.execute(cmd) else: out = output # Node ID: 0/0/CPU0 p1 = re.compile(r'^Node +ID: +(?P<node_id>\S+)$') # Gi0/0/0/0 108 0 0 33 33 1024 5384 local 1G p2 = re.compile(r'^(?P<interface>\S+) +(?P<interface_handle_hex>[0-9a-f]+) +' r'(?P<npu_number>\d+) +(?P<npu_core>\d+) +(?P<pp_port>\d+) +' r'(?P<sys_port>\d+) +(?P<voq_base>\d+) +(?P<flow_base>\d+) +' r'(?P<voq_port_type>\S+) +(?P<port_speed>\S+)$') for line in out.splitlines(): line = line.strip() # Node ID: 0/0/CPU0 m = p1.match(line) if m: group = m.groupdict() node_id_dict = ret_dict.setdefault('node_id', {}). \ setdefault(group['node_id'], {}) continue # Gi0/0/0/0 108 0 0 33 33 1024 5384 local 1G m = p2.match(line) if m: group = m.groupdict() interface = group['interface'] interface = Common.convert_intf_name(interface) interface_handle_hex = group['interface_handle_hex'] npu_number = int(group['npu_number']) npu_core = int(group['npu_core']) pp_port = int(group['pp_port']) sys_port = int(group['sys_port']) voq_base = int(group['voq_base']) flow_base = int(group['flow_base']) voq_port_type = group['voq_port_type'] port_speed = group['port_speed'] interface_dict = node_id_dict.setdefault('interface', {}). \ setdefault(interface, {}) interface_dict.update({'interface_handle_hex': interface_handle_hex}) interface_dict.update({'npu_number': npu_number}) interface_dict.update({'npu_core': npu_core}) interface_dict.update({'pp_port': pp_port}) interface_dict.update({'sys_port': sys_port}) interface_dict.update({'voq_base': voq_base}) interface_dict.update({'flow_base': flow_base}) interface_dict.update({'voq_port_type': voq_port_type}) interface_dict.update({'port_speed': port_speed}) continue return ret_dict
def cli(self, output=None): """parsing mechanism: cli Function cli() defines the cli type output parsing mechanism which typically contains 3 steps: exe cuting, transforming, returning """ if output is None: out = self.device.execute(self.cli_command) else: out = output result_dict = {} #Gi0/0/0/36.52 10.129.196.34 450ms(150ms*3) 6s(2s*3) UP p1 = re.compile( r'^(?P<intf>\S+) +(?P<dest>\d+\.\d+\.\d+\.\d+) +(?P<echo_total_msec>\d+\w+)\((?P<echo_msec>\d+\w+)\*(?P<echo_multiplier>\d+)\) +(?P<async_total_msec>\d+\w+)\((?P<async_msec>\d+\w+)\*(?P<async_multiplier>\d+)\) +(?P<state>\S+)' ) #Gi0/0/0/26.110 10.0.221.98 0s 0s DOWN DAMP p2 = re.compile( r'^(?P<intf>\S+) +(?P<dest>\d+\.\d+\.\d+\.\d+) +(?P<echo_total_msec>\d+\w+) +(?P<async_total_msec>\d+\w+) +(?P<state>\S+) ?(?P<damp>\S+)?' ) #BE300 172.16.253.53 n/a n/a UP p3 = re.compile( r'^(?P<intf>\S+) +(?P<dest>\d+\.\d+\.\d+\.\d+) +(?P<echo_total_msec>\w+\/\w+) +(?P<async_total_msec>\w+\/\w+) +(?P<state>\S+) ?(?P<damp>\S+)?' ) # No n/a p4 = re.compile(r'(?P<hw>[No|Yes]+) +(?P<npu>\S+)') for line in out.splitlines(): if line: line = line.strip() else: continue #Gi0/0/0/36.52 10.129.196.34 450ms(150ms*3) 6s(2s*3) UP m = p1.match(line) if m: group = m.groupdict() interface = Common.convert_intf_name(group['intf']) destaddress = group['dest'] bfd_dict = result_dict.setdefault('interface', {}).setdefault( interface, {}).setdefault('dest_ip_address', {}).setdefault(destaddress, {}) if group['echo_total_msec'] and re.findall( r'\d+ms', group['echo_total_msec']) != []: group['echo_total_msec'] = group['echo_total_msec'].rstrip( 'ms') bfd_dict.update( {'echo_total_msec': int(group['echo_total_msec'])}) else: group['echo_total_msec'] = int( group['echo_total_msec'].rstrip('s')) * 1000 bfd_dict.update( {'echo_total_msec': int(group['echo_total_msec'])}) if group['echo_msec'] and re.findall(r'\d+ms', group['echo_msec']) != []: group['echo_msec'] = group['echo_msec'].rstrip('ms') bfd_dict.update({'echo_msec': int(group['echo_msec'])}) else: group['echo_msec'] = int( group['echo_msec'].rstrip('s')) * 1000 bfd_dict.update({'echo_msec': int(group['echo_msec'])}) bfd_dict.update( {'echo_multiplier': int(group['echo_multiplier'])}) if group['async_total_msec'] and re.findall( r'\d+ms', group['async_total_msec']) != []: group['async_total_msec'] = group[ 'async_total_msec'].rstrip('ms') bfd_dict.update( {'async_total_msec': int(group['async_total_msec'])}) else: group['async_total_msec'] = int( group['async_total_msec'].rstrip('s')) * 1000 bfd_dict.update( {'async_total_msec': int(group['async_total_msec'])}) if group['async_msec'] and re.findall( r'\d+ms', group['async_msec']) != []: group['async_msec'] = group['async_msec'].rstrip('ms') bfd_dict.update({'async_msec': int(group['async_msec'])}) else: group['async_msec'] = int( group['async_msec'].rstrip('s')) * 1000 bfd_dict.update({'async_msec': int(group['async_msec'])}) bfd_dict.update( {'async_multiplier': int(group['async_multiplier'])}) bfd_dict.update({'state': group['state']}) #Gi0/0/0/26.110 10.0.221.98 0s 0s DOWN DAMP m = p2.match(line) if m: group = m.groupdict() interface = Common.convert_intf_name(group['intf']) destaddress = group['dest'] bfd_dict = result_dict.setdefault('interface', {}).setdefault( interface, {}).setdefault('dest_ip_address', {}).setdefault(destaddress, {}) if group['echo_total_msec'] and re.findall( r'\d+ms', group['echo_total_msec']) != []: group['echo_total_msec'] = group['echo_total_msec'].rstrip( 'ms') bfd_dict.update( {'echo_total_msec': int(group['echo_total_msec'])}) else: group['echo_total_msec'] = int( group['echo_total_msec'].rstrip('s')) * 1000 bfd_dict.update( {'echo_total_msec': int(group['echo_total_msec'])}) if group['async_total_msec'] and re.findall( r'\d+ms', group['async_total_msec']) != []: group['async_total_msec'] = group[ 'async_total_msec'].rstrip('ms') bfd_dict.update( {'async_total_msec': int(group['async_total_msec'])}) else: group['async_total_msec'] = int( group['async_total_msec'].rstrip('s')) * 1000 bfd_dict.update( {'async_total_msec': int(group['async_total_msec'])}) bfd_dict.update({'state': group['state']}) if group['damp']: bfd_dict.update({'dampening': group['damp']}) #BE300 172.16.253.53 n/a n/a UP m = p3.match(line) if m: group = m.groupdict() interface = Common.convert_intf_name(group['intf']) destaddress = group['dest'] bfd_dict = result_dict.setdefault('interface', {}).setdefault( interface, {}).setdefault('dest_ip_address', {}).setdefault(destaddress, {}) bfd_dict.update({'echo_total_msec': group['echo_total_msec']}) bfd_dict.update( {'async_total_msec': group['async_total_msec']}) bfd_dict.update({'state': group['state']}) if group['damp']: bfd_dict.update({'dampening': group['damp']}) # No n/a m = p4.match(line) if m: group = m.groupdict() bfd_dict.update({'hardware': group['hw']}) bfd_dict.update({'npu': group['npu']}) continue return result_dict
def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output isis_adjacency_dict = {} for line in out.splitlines(): line = line.rstrip() # IS-IS 4445 Level-2 adjacencies: p1 = re.compile( r'^\s*IS-IS\s+(?P<isis_name>\S+)\s+(?P<level_name>\S+)\s*adjacencies:\s*$' ) m = p1.match(line) if m: isis_adjacency_dict.setdefault('isis', {}) isis_name = m.groupdict()['isis_name'] level_name = m.groupdict()['level_name'] isis_adjacency_dict['isis'][isis_name] = { 'level': { level_name: {} } } continue # BKL-P-C9010-02 BE2 *PtoP* Up 23 16w0d Yes Up None p2 = re.compile( r'^\s*(?P<system_id>\S+)\s+(?P<interface>\S+)\s+(?P<snpa>\S+)\s+(?P<state>(Up|Down|None)+)\s+(?P<hold>\S+)\s+(?P<changed>\S+)\s+(?P<nsf>\S+)\s+(?P<ipv4_bfd>(Up|Down|None)+)\s+(?P<ipv6_bfd>(Up|Down|None)+)\s*$' ) m = p2.match(line) if m: system_id = m.groupdict()['system_id'] isis_adjacency_dict['isis'][isis_name]['level'][ level_name].setdefault('system_id', {}).setdefault(system_id, {}) isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id][ 'interface'] = Common.convert_intf_name( m.groupdict()['interface']) isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id]['snpa'] = m.groupdict()['snpa'] isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id]['state'] = m.groupdict()['state'] isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id]['hold'] = m.groupdict()['hold'] isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id]['changed'] = m.groupdict( )['changed'] isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id]['nsf'] = m.groupdict()['nsf'] isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id]['ipv4_bfd'] = m.groupdict( )['ipv4_bfd'] isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'system_id'][system_id]['ipv6_bfd'] = m.groupdict( )['ipv6_bfd'] continue # Total adjacency count: 1 p3 = re.compile( r'^\s*Total\sadjacency\scount:\s+(?P<adjacency_count>\S+)\s*$') m = p3.match(line) if m: isis_adjacency_dict['isis'][isis_name]['level'][level_name][ 'total_adjacency_count'] = int( m.groupdict()['adjacency_count']) continue return isis_adjacency_dict
def cli(self, ip='',output=None): if ip: cmd = self.cli_command[0].format(ip=ip) else: cmd = self.cli_command[1] # excute command to get output if output is None: out = self.device.execute(cmd) else: out = output # Init dict bgp_dict = {} sub_dict = {} address_family = None for line in out.splitlines(): line = line.strip() # IP Route Table for VRF "default" # IPv6 Routing Table for VRF "default" p1 = re.compile(r'^(IP|IPv6) +(Route|Routing) +Table +for +VRF +"(?P<vrf>\w+)"$') m = p1.match(line) if m: vrf = str(m.groupdict()['vrf']) if vrf == 'default' and not ip: address_family = 'ipv4 unicast' elif vrf != 'default' and not ip: address_family = 'vpnv4 unicast' elif vrf == 'default' and ip: address_family = 'ipv6 unicast' elif vrf != 'default' and ip: address_family = 'vpnv6 unicast' continue # 20.43.0.1/32, ubest/mbest: 1/0 time, attached # 55.0.9.0/24, ubest/mbest: 1/0 time p2 = re.compile(r'(?P<ip_mask>[\w\:\.\/]+), +ubest/mbest: +' '(?P<ubest>\d+)/(?P<mbest>\d+)( +time)?' '(, +(?P<attach>\w+))?$') m = p2.match(line) if m: # Init vrf dict if 'vrf' not in bgp_dict: bgp_dict['vrf'] = {} if vrf and vrf not in bgp_dict['vrf']: bgp_dict['vrf'][vrf] = {} # Init address_family dict if 'address_family' not in bgp_dict['vrf'][vrf]: bgp_dict['vrf'][vrf]['address_family'] = {} if address_family is not None and \ address_family not in bgp_dict['vrf'][vrf]['address_family']: bgp_dict['vrf'][vrf]['address_family'][address_family] = {} # Create sub_dict sub_dict = bgp_dict['vrf'][vrf]['address_family'][address_family] # Init ip dict ip_mask = m.groupdict()['ip_mask'] if 'ip' not in sub_dict: sub_dict['ip'] = {} if ip_mask not in sub_dict['ip']: sub_dict['ip'][ip_mask] = {} sub_dict['ip'][ip_mask]['ubest_num'] = m.groupdict()['ubest'] sub_dict['ip'][ip_mask]['mbest_num'] = m.groupdict()['mbest'] if m.groupdict()['attach']: sub_dict['ip'][ip_mask]['attach'] = m.groupdict()['attach'] continue # *via fec1::1002%default, Eth1/1, [200/4444], 15:57:39, bgp-333, internal, tag 333 # *via 3.3.3.3%default, [33/0], 5w0d, bgp-100, internal, tag 100 (mpls-vpn) # *via 2001:db8::5054:ff:fed5:63f9, Eth1/1, [0/0], 00:15:46, direct, # *via 2001:db8:2:2::2, Eth1/1, [0/0], 00:15:46, direct, , tag 222 # *via 100.0.130.2%default, [200/0], 3d07h, bgp-1, internal, tag 1 (evpn), segid: 50009 tunnelid: 0x64008202 encap: VXLAN p3 = re.compile(r'^(?P<cast>.*)via +(?P<nexthop>[\w\.\:\s]+)' '(%(?P<table>[\w\:]+))?, *' '((?P<int>[a-zA-Z0-9\./_]+),)? *' '\[(?P<preference>\d+)/(?P<metric>\d+)\], *' '(?P<up_time>[\w\:\.]+), *' '(?P<protocol>\w+)(\-(?P<process>\d+))?,? *' '(?P<attribute>\w+)?,? *' '(tag *(?P<tag>\w+))?,? *(?P<vpn>[a-zA-Z\(\)\-]+)?' ',?( +segid: +(?P<segid>\d+))?,?( +tunnelid: +' '(?P<tunnelid>[0-9x]+))?,?( +encap: +' '(?P<encap>[a-zA-Z0-9]+))?$') m = p3.match(line) if m: cast = m.groupdict()['cast'] cast = {'1': 'unicast', '2': 'multicast'}['{}'.format(cast.count('*'))] # Init 'best_route' dict if 'best_route' not in sub_dict['ip'][ip_mask]: sub_dict['ip'][ip_mask]['best_route'] = {} if cast not in sub_dict['ip'][ip_mask]['best_route']: sub_dict['ip'][ip_mask]['best_route'][cast] = {} sub_dict['ip'][ip_mask]['best_route'][cast]\ ['nexthop'] = {} nexthop = m.groupdict()['nexthop'] if nexthop not in sub_dict\ ['ip'][ip_mask]['best_route'][cast]['nexthop']: sub_dict['ip'][ip_mask]\ ['best_route'][cast]['nexthop'][nexthop] = {} prot_dict = sub_dict['ip'][ip_mask]\ ['best_route'][cast]['nexthop'][nexthop]['protocol'] = {} protocol = m.groupdict()['protocol'] if \ m.groupdict()['protocol'] else m.groupdict()['prot'] if protocol not in prot_dict: prot_dict[protocol] = {} table = m.groupdict()['table'] if table: prot_dict[protocol]['route_table'] = table intf = m.groupdict()['int'] if intf: prot_dict[protocol]['interface'] = Common.convert_intf_name(intf) preference = m.groupdict()['preference'] if preference: prot_dict[protocol]['preference'] = preference metric = m.groupdict()['metric'] if metric: prot_dict[protocol]['metric'] = metric up_time = m.groupdict()['up_time'] if up_time: prot_dict[protocol]['uptime'] = up_time process = m.groupdict()['process'] if process: prot_dict[protocol]['protocol_id'] = process attribute = m.groupdict()['attribute'] if attribute: prot_dict[protocol]['attribute'] = attribute tag = m.groupdict()['tag'] if tag: prot_dict[protocol]['tag'] = tag.strip() segid = m.groupdict()['segid'] if segid: prot_dict[protocol]['segid'] = int(segid) tunnelid = m.groupdict()['tunnelid'] if tunnelid: prot_dict[protocol]['tunnelid'] = tunnelid encap = m.groupdict()['encap'] if encap: prot_dict[protocol]['encap'] = encap.lower() vpn = m.groupdict()['vpn'] if vpn and 'mpls-vpn' in vpn: prot_dict[protocol]['mpls_vpn'] = True elif vpn and 'mpls' in vpn: prot_dict[protocol]['mpls'] = True elif vpn and 'evpn' in vpn: prot_dict[protocol]['evpn'] = True # Set extra values for BGP Ops if attribute == 'external' and protocol == 'bgp': sub_dict['bgp_distance_extern_as'] = int(preference) elif attribute == 'internal' and protocol == 'bgp': sub_dict['bgp_distance_internal_as'] = int(preference) elif attribute == 'discard' and protocol == 'bgp': sub_dict['bgp_distance_local'] = int(preference) continue return bgp_dict
def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output vlan_dict = {} primary = "" for line in out.splitlines(): if line: line = line.rstrip() else: continue # VLAN Name Status Ports # 1 default active Gi1/0/1, Gi1/0/2, Gi1/0/3, Gi1/0/5, Gi1/0/6, Gi1/0/12, # 2 VLAN_0002 active # 20 VLAN-0020 active # 100 V100 suspended # 101 VLAN-0101 active # 102 VLAN_0102 active # 103 VLAN-0103 act/unsup # 104 VLAN_0104 act/lshut p1 = re.compile( r'^(?P<vlan_id>[0-9]+) +(?P<name>\S+)' ' +(?P<status>(active|suspended|(.*)lshut|(.*)unsup)+)(?P<interfaces>[\w\d\/\d, ]+)?$' ) m = p1.match(line) if m: vlan_id = m.groupdict()['vlan_id'] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if vlan_id not in vlan_dict: vlan_dict['vlans'][vlan_id] = {} vlan_dict['vlans'][vlan_id]['vlan_id'] = vlan_id vlan_dict['vlans'][vlan_id]['name'] = m.groupdict()['name'] vlan_dict['vlans'][vlan_id]['shutdown'] = False if 'act/unsup' in m.groupdict()['status']: status = 'unsupport' elif 'suspend' in m.groupdict()['status']: status = 'suspend' elif 'shut' in m.groupdict()['status']: status = 'shutdown' vlan_dict['vlans'][vlan_id]['shutdown'] = True else: status = m.groupdict()['status'] vlan_dict['vlans'][vlan_id]['state'] = status if m.groupdict()['interfaces']: vlan_dict['vlans'][vlan_id]['interfaces'] = \ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] continue # Gi1/0/19, Gi1/0/20, Gi1/0/21, Gi1/0/22 p2 = re.compile( r'^\s*(?P<space>\s{48})(?P<interfaces>[\w\s\/\,]+)?$') m = p2.match(line) if m: vlan_dict['vlans'][vlan_id]['interfaces'] = vlan_dict['vlans'][vlan_id]['interfaces']+\ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] continue # VLAN Type SAID MTU Parent RingNo BridgeNo Stp BrdgMode Trans1 Trans2 # ---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------ # 1 enet 100001 1500 - - - - - 0 0 p3 = re.compile( r'^\s*(?P<vlan_id>[0-9]+) +(?P<type>[a-zA-Z]+)' ' +(?P<said>\d+) +(?P<mtu>[\d\-]+) +(?P<parent>[\w\-]+)?' ' +(?P<ring_no>[\w\-]+)? +(?P<bridge_no>[\w\-]+)? +(?P<stp>[\w\-]+)?' ' +(?P<bridge_mode>[\w\-]+)? +(?P<trans1>[\d\-]+) +(?P<trans2>[\d\-]+)$' ) m = p3.match(line) if m: vlan_id = m.groupdict()['vlan_id'] type_ = m.groupdict()['type'] said = m.groupdict()['said'] mtu = m.groupdict()['mtu'] parent = m.groupdict()['parent'] ring_no = m.groupdict()['ring_no'] bridge_no = m.groupdict()['bridge_no'] stp = m.groupdict()['stp'] bridge_mode = m.groupdict()['bridge_mode'] trans1 = m.groupdict()['trans1'] trans2 = m.groupdict()['trans2'] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if vlan_id not in vlan_dict['vlans']: vlan_dict['vlans'][vlan_id] = {} vlan_dict['vlans'][vlan_id]['type'] = type_ vlan_dict['vlans'][vlan_id]['said'] = int(said) vlan_dict['vlans'][vlan_id]['mtu'] = int(mtu) if '-' not in parent.strip(): vlan_dict['vlans'][vlan_id]['parent'] = parent if '-' not in ring_no.strip(): vlan_dict['vlans'][vlan_id]['ring_no'] = ring_no if '-' not in bridge_no.strip(): vlan_dict['vlans'][vlan_id]['bridge_no'] = bridge_no if '-' not in stp.strip(): vlan_dict['vlans'][vlan_id]['stp'] = stp if '-' not in bridge_mode.strip(): vlan_dict['vlans'][vlan_id]['bridge_mode'] = bridge_mode vlan_dict['vlans'][vlan_id]['trans1'] = int(trans1) vlan_dict['vlans'][vlan_id]['trans2'] = int(trans2) continue # Remote SPAN VLANs # ------------------------------------- # 201-202 # 201,202 # 201,202-205 p4 = re.compile(r'^\s*(?P<remote_span_vlans>[^--][0-9\-\,]+)?$') m = p4.match(line) if m: if m.groupdict()['remote_span_vlans']: remote_span_vlans = m.groupdict( )['remote_span_vlans'].split(',') if remote_span_vlans: if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} for remote_vlan in remote_span_vlans: if '-' in remote_vlan: remote_span_list = remote_vlan.split('-') initial = remote_span_list[0] end = remote_span_list[1] value = int(initial) while (value <= int(end)): if str(value) not in vlan_dict['vlans']: vlan_dict['vlans'][str(value)] = {} vlan_dict['vlans'][str( value)]['remote_span_vlan'] = True value += 1 else: if remote_vlan not in vlan_dict['vlans']: vlan_dict['vlans'][remote_vlan] = {} vlan_dict['vlans'][remote_vlan][ 'remote_span_vlan'] = True continue # Primary Secondary Type Ports # ------- --------- ----------------- ------------------------------------------ # 2 301 community Fa5/3, Fa5/25 # 2 302 community # 10 community # none 20 community # 20 105 isolated # 100 151 non-operational # none 202 community # 303 community # 101 402 non-operational p5 = re.compile( r'^\s*(?P<primary>[0-9a-zA-Z]+)? +(?P<secondary>\d+)' ' +(?P<type>[\w\-]+)( +(?P<interfaces>[\w\/, ]+))?') m = p5.match(line) if m: if m.groupdict( )['primary'] and m.groupdict()['primary'].lower() != "none": primary = m.groupdict()['primary'] else: primary = "" secondary = m.groupdict()['secondary'] private_vlan_type = m.groupdict()['type'] if m.groupdict()['interfaces']: private_vlan_interfaces = \ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if m.groupdict( )['primary'] and m.groupdict()['primary'].lower() != "none": if primary not in vlan_dict['vlans']: vlan_dict['vlans'][primary] = {} if 'private_vlan' not in vlan_dict['vlans'][primary]: vlan_dict['vlans'][primary]['private_vlan'] = {} if primary: vlan_dict['vlans'][primary]['private_vlan'][ 'primary'] = True if 'association' in vlan_dict['vlans'][primary][ 'private_vlan']: vlan_dict['vlans'][primary]['private_vlan']['association'] = \ vlan_dict['vlans'][primary]['private_vlan']['association'] + [secondary] else: vlan_dict['vlans'][primary]['private_vlan'][ 'association'] = secondary.split() if secondary not in vlan_dict['vlans']: vlan_dict['vlans'][secondary] = {} if 'private_vlan' not in vlan_dict['vlans'][secondary]: vlan_dict['vlans'][secondary]['private_vlan'] = {} vlan_dict['vlans'][secondary]['private_vlan'][ 'primary'] = False vlan_dict['vlans'][secondary]['private_vlan'][ 'type'] = private_vlan_type if m.groupdict()['interfaces']: vlan_dict['vlans'][secondary]['private_vlan'][ 'ports'] = private_vlan_interfaces continue return vlan_dict
def cli(self, vrf='', output=None): if vrf and vrf != 'default': cmd = self.cli_command[0].format(vrf=vrf) else: vrf = 'default' cmd = self.cli_command[1] # excute command to get output if output is None: out = self.device.execute(cmd) else: out = output af = 'ipv6' route = "" result_dict = {} for line in out.splitlines(): if line: line = line.rstrip() else: continue # IP Route Table for VRF "default" p1 = re.compile(r'^\s*IPv6 +Routing +Table +for VRF +\"(?P<vrf>[\w]+)\"$') m = p1.match(line) if m: vrf = m.groupdict()['vrf'] continue # 1.1.1.1/32, ubest/mbest: 2/0 # 3.3.3.3/32, ubest/mbest: 2/0, attached # 2004:ab4:123:13::1/128, ubest/mbest: 1/0, attached p2 = re.compile(r'^\s*(?P<route>[\w\/\:]+)' ', +ubest/mbest: +(?P<ubest_mbest>[\d\/]+)(, +(?P<attached>[\w]+))?$') m = p2.match(line) if m: active = True ubest = mbest = route_preference = "" if m.groupdict()['ubest_mbest']: ubest_mbest = m.groupdict()['ubest_mbest'] if '/' in ubest_mbest: ubest = ubest_mbest.split('/')[0] mbest = ubest_mbest.split('/')[1] route = m.groupdict()['route'] index = 1 if m.groupdict()['attached']: if 'attached' in m.groupdict()['attached']: attached = True else: attached = False if vrf: if 'vrf' not in result_dict: result_dict['vrf'] = {} if vrf not in result_dict['vrf']: result_dict['vrf'][vrf] = {} if 'address_family' not in result_dict['vrf'][vrf]: result_dict['vrf'][vrf]['address_family'] = {} if af and af not in result_dict['vrf'][vrf]['address_family']: result_dict['vrf'][vrf]['address_family'][af] = {} if 'routes' not in result_dict['vrf'][vrf]['address_family'][af]: result_dict['vrf'][vrf]['address_family'][af]['routes'] = {} if route not in result_dict['vrf'][vrf]['address_family'][af]['routes']: result_dict['vrf'][vrf]['address_family'][af]['routes'][route] = {} result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['route'] = route if ubest: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['ubest'] = int(ubest) if mbest: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['mbest'] = int(mbest) if m.groupdict()['attached']: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['attached'] = attached result_dict['vrf'][vrf]['address_family'][af]['routes'][route] \ ['active'] = active continue # *via 10.2.3.2, Eth1/4, [1/0], 01:01:30, static # *via 10.1.3.1, Eth1/2, [110/41], 01:01:18, ospf-1, intra # *via 11.11.11.11, [200/0], 01:01:12, bgp-100, internal, tag 100 p3 = re.compile(r'^\s*(?P<star>[*]+)via +(?P<next_hop>[\w\.\:\%]+),' '( +(?P<interface>[\w\/\.]+))?,? +\[(?P<route_preference>[\d\/]+)\],' ' +(?P<date>[0-9][\w\:]+)?,?( +(?P<source_protocol>[\w\-]+))?,?' '( +(?P<source_protocol_status>[\w]+))?,?( +tag +(?P<tag>[\d]+))?$') m = p3.match(line) if m: tag = process_id = source_protocol_status = interface =\ nexthop_vrf = next_hop_vrf = next_hop_af= "" star = m.groupdict()['star'] if len(star) == 1: cast = 'best_ucast_nexthop' if len(star) == 2: cast = 'best_mcast_nexthop' if m.groupdict()['next_hop']: next_hop = m.groupdict()['next_hop'] if '%' in next_hop: nexthop_vrf = next_hop.split('%')[1] next_hop = next_hop.split('%')[0] if ':' in nexthop_vrf: next_hop_vrf = nexthop_vrf.split(':')[0] next_hop_af = nexthop_vrf.split(':')[1].lower() if m.groupdict()['route_preference']: routepreference = m.groupdict()['route_preference'] if '/' in routepreference: route_preference = routepreference.split('/')[0] metrics = routepreference.split('/')[1] if m.groupdict()['interface']: interface = Common.convert_intf_name(m.groupdict()['interface']) if m.groupdict()['date']: updated = m.groupdict()['date'] if m.groupdict()['source_protocol_status']: source_protocol_status = m.groupdict()['source_protocol_status'] if m.groupdict()['source_protocol']: if '-' in m.groupdict()['source_protocol']: source_protocol = m.groupdict()['source_protocol'].split('-')[0] process_id = m.groupdict()['source_protocol'].split('-')[1] else: if index > 1 : source_protocol_second = m.groupdict()['source_protocol'] if source_protocol_second != source_protocol: if 'local' in source_protocol_second or 'local' in source_protocol_second: source_protocol = 'local' else: source_protocol = source_protocol else: source_protocol = m.groupdict()['source_protocol'] if m.groupdict()['tag']: tag = m.groupdict()['tag'] if vrf: if 'vrf' not in result_dict: result_dict['vrf'] = {} if vrf not in result_dict['vrf']: result_dict['vrf'][vrf] = {} if 'address_family' not in result_dict['vrf'][vrf]: result_dict['vrf'][vrf]['address_family'] = {} if af and af not in result_dict['vrf'][vrf]['address_family']: result_dict['vrf'][vrf]['address_family'][af] = {} if 'routes' not in result_dict['vrf'][vrf]['address_family'][af]: result_dict['vrf'][vrf]['address_family'][af]['routes'] = {} if route not in result_dict['vrf'][vrf]['address_family'][af]['routes']: result_dict['vrf'][vrf]['address_family'][af]['routes'][route] = {} result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['route'] = route if metrics: result_dict['vrf'][vrf]['address_family'][af]['routes'][route] \ ['metric'] = int(metrics) if route_preference: result_dict['vrf'][vrf]['address_family'][af]['routes'][route] \ ['route_preference'] = int(route_preference) if process_id: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]\ ['process_id'] = process_id if source_protocol: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]\ ['source_protocol'] = source_protocol if source_protocol_status: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]\ ['source_protocol_status'] = source_protocol_status if tag: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]\ ['tag'] = int(tag) if 'next_hop' not in result_dict['vrf'][vrf]['address_family'][af]['routes'][route]: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] = {} if not next_hop: if 'outgoing_interface' not in result_dict['vrf'][vrf]['address_family'][af] \ ['routes'][route]['next_hop']: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]\ ['next_hop']['outgoing_interface'] = {} if m.groupdict()['interface'] and interface not in \ result_dict['vrf'][vrf]['address_family'][af]['routes'][route]\ ['next_hop']['outgoing_interface']: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]\ ['next_hop']['outgoing_interface'][interface] = {} if interface: result_dict['vrf'][vrf]['address_family'][af]['routes'][route] \ ['next_hop']['outgoing_interface'][interface]['outgoing_interface'] = interface if updated: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['outgoing_interface'][interface]['updated'] = updated else: if 'next_hop_list' not in result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop']: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'][ 'next_hop_list'] = {} result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index] = {} result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index]['index'] = index result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index]['next_hop'] = next_hop if cast: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index][cast] = True if updated: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index]['updated'] = updated if interface: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index]['outgoing_interface'] = interface if next_hop_af: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index]['next_hop_af'] = next_hop_af if nexthop_vrf: result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['next_hop'] \ ['next_hop_list'][index]['next_hop_vrf'] = next_hop_vrf if next_hop_vrf else nexthop_vrf index += 1 continue # tag 100 p5 = re.compile(r'^\s*tag +(?P<tag>[\d]+)$') m = p5.match(line) if m: tag = m.groupdict()['tag'] result_dict['vrf'][vrf]['address_family'][af]['routes'][route]['tag'] = int(tag) continue return result_dict
def cli(self, interface_id, output=None): if output is None: output = self.device.execute( self.cli_command.format(interface_id=interface_id)) # initial return dictionary ret_dict = {} description_found = False sub_dict_inserted = False # Local Interface: GigabitEthernet0/0/0/0 p1 = re.compile(r'^Local +Interface: +(?P<local_interface>\S+)$') # Chassis id: 001e.49ff.24f7 p2 = re.compile(r'^Chassis +id: +(?P<chassis_id>[\w\.]+)$') # Port id: Gi2 # Port id: xe-0/1/2 p3 = re.compile(r'^Port +id: +(?P<port_id>\S+)$') #Port Description - not advertised p4 = re.compile(r'^Port +Description(\:|\s\-) ' r'+(?P<port_description>[\s\S]+)$') # System Name: ncs540 p5 = re.compile(r'System +Name: +(?P<system_name>\S+)$') # System Description: #7.8.1.02I, NCS-540 p6 = re.compile(r'^System +Description:$') # Cisco IOS Software [Everest], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.6.1, RELEASE SOFTWARE (fc2) # Cisco Nexus Operating System (NX-OS) Software 7.0(3)I7(1) p15 = re.compile(r'^(?P<system_description>\d+[\S\s]+)$') # Time remaining: 117 seconds p7 = re.compile(r'Time +remaining: +(?P<time_remaining>\d+) +seconds$') # Hold Time: 120 seconds p8 = re.compile(r'Hold +Time: +(?P<hold_time>\d+) +seconds$') # Age: 142641 seconds p9 = re.compile(r'Age: +(?P<age>\d+) +seconds$') # System Capabilities: B,R p10 = re.compile(r'System +Capabilities: +(?P<system>[\w+,]+)$') # Enabled Capabilities: R p11 = re.compile(r'Enabled +Capabilities: +(?P<enabled>[\w+,]+)$') # IPv4 address: 10.1.2.1 p12 = re.compile(r'IPv4 +address: +(?P<management_address>[\d\.]+)$') # Total entries displayed: 2 p13 = re.compile( r'Total +entries +displayed: +(?P<total_entries>\d+)$') # Peer MAC Address: 30:b2:b1:ff:ce:56 p14 = re.compile(r'Peer +MAC +Address: +(?P<mac>[\s\S]+)$') for line in output.splitlines(): line = line.strip() # Local Interface: GigabitEthernet0/0/0/0 m = p1.match(line) if m: sub_dict_inserted = False sub_dict = {} group = m.groupdict() intf = Common.convert_intf_name(group['local_interface']) intf_dict = ret_dict.setdefault('interfaces', {}).setdefault(intf, {}) continue # Chassis id: 001e.49ff.24f7 m = p2.match(line) if m: group = m.groupdict() sub_dict.update({'chassis_id': group['chassis_id']}) continue # Port id: Gi1/0/4 # Port id: xe-0/1/2 m = p3.match(line) if m: group = m.groupdict() port_id = group['port_id'] # check if it is Junos interface name # Port id: xe-0/1/2 match = re.search(r'([\w]+)-([\d\/\.]+)', port_id) if not match: port_id = Common.convert_intf_name(group['port_id']) port_dict = intf_dict.setdefault('port_id', {}). \ setdefault(port_id, {}) continue # Port Description: GigabitEthernet1/0/4 # Port Description - not advertised # Port Description: to genie-3 genie 0/0/1/1 via genie3.genie 00-01 # Port Description: 10G to bl2-genie port Ge8/8/8:GG8 # Port Description: "10G link to Genie2 port Ge8/8/8/8/8" # Port Description: 10G link to genie3-genie port GEN 8/8/8/8 in BE 43 (with port 0/4/0/3) m = p4.match(line) if m: group = m.groupdict() sub_dict.setdefault('port_description', group['port_description']) continue # System Name: R5 m = p5.match(line) if m: group = m.groupdict() system_name = group['system_name'] sub_dict.update({'system_name': system_name}) sub_dict.update({'neighbor_id': system_name}) port_dict.setdefault('neighbors', {}).setdefault(system_name, sub_dict) sub_dict_inserted = True continue # System Description: m = p6.match(line) if m: description_found = True continue # # 7.8.1.02I, NCS-540 m = p15.match(line) if m and description_found: group = m.groupdict() sub_dict.update( {'system_description': group['system_description']}) description_found = False # Time remaining: 112 seconds m = p7.match(line) if m: group = m.groupdict() sub_dict['time_remaining'] = int( m.groupdict()['time_remaining']) continue # Hold Time: 120 seconds m = p8.match(line) if m: group = m.groupdict() sub_dict['hold_time'] = int(group['hold_time']) continue # Age: 142641 seconds m = p9.match(line) if m: group = m.groupdict() sub_dict['age'] = int(group['age']) continue # System Capabilities: B,R m = p10.match(line) if m: for item in m.groupdict()['system'].split(','): cap_dict = sub_dict.setdefault('capabilities', {}).\ setdefault(self.CAPABILITY_CODES[item], {}) cap_dict['system'] = True continue # Enabled Capabilities: B,R m = p11.match(line) if m: for item in m.groupdict()['enabled'].split(','): cap_dict = sub_dict.setdefault('capabilities', {}).\ setdefault(self.CAPABILITY_CODES[item], {}) cap_dict['enabled'] = True continue # IPv4 address: 10.1.2.1 m = p12.match(line) if m: group = m.groupdict() sub_dict['management_address'] = group['management_address'] continue # Total entries displayed: 2 m = p13.match(line) if m: group = m.groupdict() ret_dict['total_entries'] = int(group['total_entries']) continue # Peer MAC Address: 30:b2:b1:ff:ce:56 m = p14.match(line) if m: peer_mac = m.groupdict()['mac'] sub_dict.update({'peer_mac': peer_mac}) if not sub_dict_inserted: sub_dict_inserted = True port_dict.setdefault('neighbors', {}).setdefault(peer_mac, sub_dict) return ret_dict
def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output # This pattern is for when the Name field is so long that it causes the # line to wrap around. For example: # 1832 blablablablablablablablablablablablablabla # active p0 = re.compile(r'^\s*(active|suspended|\w+/lshut|\w+/unsup)+.*$') # VLAN Name Status Ports # 1 default active Gi1/0/1, Gi1/0/2, Gi1/0/3, Gi1/0/5, Gi1/0/6, Gi1/0/12, # 2 VLAN_0002 active # 20 VLAN-0020 active # 100 V100 suspended # 105 Misc. Name active Gi1/0/13, Gi1/0/14, Gi1/0/15, Gi1/0/16, Gi1/0/19 p1 = re.compile( r'^(?P<vlan_id>[0-9]+)\s+(?P<name>(?=\S).*(?<=\S))' '\s+(?P<status>(active|suspended|(.*)lshut|(.*)unsup)+)' '(?P<interfaces>[\s\S]+)?$') # Gi1/0/19, Gi1/0/20, Gi1/0/21, Gi1/0/22 p2 = re.compile(r'^\s*(?P<space>\s{48})(?P<interfaces>[\w\s\/\,]+)?$') # VLAN Type SAID MTU Parent RingNo BridgeNo Stp BrdgMode Trans1 Trans2 # ---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------ # 1 enet 100001 1500 - - - - - 0 0 p3 = re.compile( r'^\s*(?P<vlan_id>[0-9]+) +(?P<type>[a-zA-Z]+)' ' +(?P<said>\d+) +(?P<mtu>[\d\-]+) +(?P<parent>[\w\-]+)?' ' +(?P<ring_no>[\w\-]+)? +(?P<bridge_no>[\w\-]+)? +(?P<stp>[\w\-]+)?' ' +(?P<bridge_mode>[\w\-]+)? +(?P<trans1>[\d\-]+) +(?P<trans2>[\d\-]+)$' ) # Remote SPAN VLANs # ------------------------------------- # 201-202 # 201,202 # 201,202-205 p4 = re.compile(r'^\s*(?P<remote_span_vlans>[^--][0-9\-\,]+)?$') # Primary Secondary Type Ports # ------- --------- ----------------- ------------------------------------------ # 2 301 community Fa5/3, Fa5/25 # 2 302 community # 10 community # none 20 community # 20 105 isolated # 100 151 non-operational # none 202 community # 303 community # 101 402 non-operational p5 = re.compile(r'^\s*(?P<primary>[0-9a-zA-Z]+)? +(?P<secondary>\d+)' ' +(?P<type>[\w\-]+)( +(?P<interfaces>[\s\S]+))?') # VLAN AREHops STEHops Backup CRF # ---- ------- ------- ---------- # 1003 7 7 off p6 = re.compile(r'^\s*(?P<vlan_id>\d+)\s+' '(?P<are_hops>\d+)\s+' '(?P<ste_hops>\d+)\s+' '(?P<backup_crf>\S+)\s*$') vlan_dict = {} primary = prev_line = "" for line in out.splitlines(): if line: line = line.rstrip() else: continue # active Gi1/0/1, Gi1/0/2, Gi1/0/3, Gi1/0/5, Gi1/0/6, Gi1/0/12, # active # suspended m = p0.match(line) if m: line = prev_line + ' ' + line # VLAN Name Status Ports # 1 default active Gi1/0/1, Gi1/0/2, Gi1/0/3, Gi1/0/5, Gi1/0/6, Gi1/0/12, # 2 VLAN_0002 active # 20 VLAN-0020 active # 100 V100 suspended # 101 VLAN-0101 active # 102 VLAN_0102 active # 103 VLAN-0103 act/unsup # 104 VLAN_0104 act/lshut m = p1.match(line) if m: vlan_id = m.groupdict()['vlan_id'] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if vlan_id not in vlan_dict: vlan_dict['vlans'][vlan_id] = {} vlan_dict['vlans'][vlan_id]['vlan_id'] = vlan_id vlan_dict['vlans'][vlan_id]['name'] = m.groupdict()['name'] vlan_dict['vlans'][vlan_id]['shutdown'] = False if 'act/unsup' in m.groupdict()['status']: status = 'unsupport' elif 'suspend' in m.groupdict()['status']: status = 'suspend' elif 'shut' in m.groupdict()['status']: status = 'shutdown' vlan_dict['vlans'][vlan_id]['shutdown'] = True else: status = m.groupdict()['status'] vlan_dict['vlans'][vlan_id]['state'] = status if m.groupdict()['interfaces']: vlan_dict['vlans'][vlan_id]['interfaces'] = \ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] continue # Gi1/0/19, Gi1/0/20, Gi1/0/21, Gi1/0/22 m = p2.match(line) if m: vlan_dict['vlans'][vlan_id]['interfaces'] = vlan_dict['vlans'][vlan_id]['interfaces']+\ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] continue # VLAN Type SAID MTU Parent RingNo BridgeNo Stp BrdgMode Trans1 Trans2 # ---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------ # 1 enet 100001 1500 - - - - - 0 0 m = p3.match(line) if m: vlan_id = m.groupdict()['vlan_id'] type_ = m.groupdict()['type'] said = m.groupdict()['said'] mtu = m.groupdict()['mtu'] parent = m.groupdict()['parent'] ring_no = m.groupdict()['ring_no'] bridge_no = m.groupdict()['bridge_no'] stp = m.groupdict()['stp'] bridge_mode = m.groupdict()['bridge_mode'] trans1 = m.groupdict()['trans1'] trans2 = m.groupdict()['trans2'] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if vlan_id not in vlan_dict['vlans']: vlan_dict['vlans'][vlan_id] = {} vlan_dict['vlans'][vlan_id]['type'] = type_ vlan_dict['vlans'][vlan_id]['said'] = int(said) vlan_dict['vlans'][vlan_id]['mtu'] = int(mtu) if '-' not in parent.strip(): vlan_dict['vlans'][vlan_id]['parent'] = parent if '-' not in ring_no.strip(): vlan_dict['vlans'][vlan_id]['ring_no'] = ring_no if '-' not in bridge_no.strip(): vlan_dict['vlans'][vlan_id]['bridge_no'] = bridge_no if '-' not in stp.strip(): vlan_dict['vlans'][vlan_id]['stp'] = stp if '-' not in bridge_mode.strip(): vlan_dict['vlans'][vlan_id]['bridge_mode'] = bridge_mode vlan_dict['vlans'][vlan_id]['trans1'] = int(trans1) vlan_dict['vlans'][vlan_id]['trans2'] = int(trans2) continue # VLAN AREHops STEHops Backup CRF # ---- ------- ------- ---------- # 1003 7 7 off m = p6.match(line) if m: vlan_id = m.groupdict()['vlan_id'] are_hops = m.groupdict()['are_hops'] ste_hops = m.groupdict()['ste_hops'] backup_crf = m.groupdict()['backup_crf'] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if vlan_id not in vlan_dict['vlans']: vlan_dict['vlans'][vlan_id] = {} if 'token_ring' not in vlan_dict['vlans'][vlan_id]: vlan_dict['vlans'][vlan_id]['token_ring'] = {} vlan_dict['vlans'][vlan_id]['token_ring']['are_hops'] = int( are_hops) vlan_dict['vlans'][vlan_id]['token_ring']['ste_hops'] = int( ste_hops) vlan_dict['vlans'][vlan_id]['token_ring'][ 'backup_crf'] = backup_crf continue # Remote SPAN VLANs # ------------------------------------- # 201-202 # 201,202 # 201,202-205 m = p4.match(line) if m: if m.groupdict()['remote_span_vlans']: remote_span_vlans = m.groupdict( )['remote_span_vlans'].split(',') if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} for remote_vlan in remote_span_vlans: if '-' in remote_vlan: remote_span_list = remote_vlan.split('-') initial = remote_span_list[0] end = remote_span_list[1] value = int(initial) while (value <= int(end)): if str(value) not in vlan_dict['vlans']: vlan_dict['vlans'][str(value)] = {} vlan_dict['vlans'][str( value)]['remote_span_vlan'] = True value += 1 else: if remote_vlan not in vlan_dict['vlans']: vlan_dict['vlans'][remote_vlan] = {} vlan_dict['vlans'][remote_vlan][ 'remote_span_vlan'] = True continue # Primary Secondary Type Ports # ------- --------- ----------------- ------------------------------------------ # 2 301 community Fa5/3, Fa5/25 # 2 302 community # 10 community # none 20 community # 20 105 isolated # 100 151 non-operational # none 202 community # 303 community # 101 402 non-operational m = p5.match(line) if m: if m.groupdict( )['primary'] and m.groupdict()['primary'].lower() != "none": primary = m.groupdict()['primary'] else: primary = "" secondary = m.groupdict()['secondary'] private_vlan_type = m.groupdict()['type'] if m.groupdict()['interfaces']: private_vlan_interfaces = \ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if m.groupdict( )['primary'] and m.groupdict()['primary'].lower() != "none": if primary not in vlan_dict['vlans']: vlan_dict['vlans'][primary] = {} if 'private_vlan' not in vlan_dict['vlans'][primary]: vlan_dict['vlans'][primary]['private_vlan'] = {} if primary: vlan_dict['vlans'][primary]['private_vlan'][ 'primary'] = True if 'association' in vlan_dict['vlans'][primary][ 'private_vlan']: vlan_dict['vlans'][primary]['private_vlan']['association'] = \ vlan_dict['vlans'][primary]['private_vlan']['association'] + [secondary] else: vlan_dict['vlans'][primary]['private_vlan'][ 'association'] = secondary.split() if secondary not in vlan_dict['vlans']: vlan_dict['vlans'][secondary] = {} if 'private_vlan' not in vlan_dict['vlans'][secondary]: vlan_dict['vlans'][secondary]['private_vlan'] = {} vlan_dict['vlans'][secondary]['private_vlan'][ 'primary'] = False vlan_dict['vlans'][secondary]['private_vlan'][ 'type'] = private_vlan_type if m.groupdict()['interfaces']: vlan_dict['vlans'][secondary]['private_vlan'][ 'ports'] = private_vlan_interfaces continue """ Save previous line in case lines like 1832 blablablabla blablablablabla blablablabla bla active need to be combined into 1832 blablablabla blablablablabla blablablabla bla active """ prev_line = line return vlan_dict
def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output # Initializes the Python dictionary variable parsed_dict = {} # Defines the regex for the first line of device output. Example is: # EIGRP-IPv4 Interfaces for AS(1) p1 = re.compile('EIGRP-IPv4 +Interfaces +for +AS\((?P<auto_sys>(\d+))\)$') # Defines the regex for the second line of device output. Example is: # Xmit Queue PeerQ Mean Pacing Time Multicast Pending p2 = re.compile('Xmit +Queue +PeerQ +Mean +Pacing +Time +Multicast +Pending$') # Defines the regex for the third line of device output. Example is: # Interface Peers Un/Reliable Un/Reliable SRTT Un/Reliable Flow Timer Routes p3 = re.compile('Interface +Peers +Un/Reliable +Un/Reliable +SRTT +Un/Reliable +Flow +Timer +Routes$') # Defines the regex for the fourth, and repeating, lines of device output. Example is: # Gi1 1 0/0 0/0 20 0/0 84 0 p4 = re.compile('(?P<interface>(\S+\d)) +(?P<peers>(\d+)) +(?P<xmit_q_unreliable>(\d+))/(?P<xmit_q_reliable>(\d+)) +(?P<peer_q_unreliable>(\d+))/(?P<peer_q_reliable>(\d+)) +(?P<mean_srtt>(\d+)) +(?P<pacing_t_unreliable>(\d+))/(?P<pacing_t_reliable>(\d+)) +(?P<mcast_flow_timer>(\d+)) +(?P<pend_routes>(\d+))$') # Defines the "for" loop, to pattern match each line of output for line in out.splitlines(): line = line.strip() # Processes the matched patterns for the first line of output # EIGRP-IPv4 Interfaces for AS(1) m = p1.match(line) if m: group = m.groupdict() auto_sys = group['auto_sys'] instance_dict = parsed_dict.setdefault('vrf', {}). \ setdefault('default', {}).setdefault('eigrp_instance', {}). \ setdefault(auto_sys, {}).setdefault('address_family', {}). \ setdefault('ipv4', {}) continue # Processes the matched patterns for the second line of output # Xmit Queue PeerQ Mean Pacing Time Multicast Pending m = p2.match(line) if m: continue # Processes the matched patterns for the third line of output # Interface Peers Un/Reliable Un/Reliable SRTT Un/Reliable Flow Timer Routes m = p3.match(line) if m: continue # Processes the matched patterns for the fourth, and repeating, lines of output # Gi1 1 0/0 0/0 20 0/0 84 0 m = p4.match(line) if m: group = m.groupdict() interface_short = group['interface'] interface_long = Common.convert_intf_name(interface_short) int_dict = instance_dict.setdefault('interface', {}).setdefault(interface_long, {}) int_dict['peers'] = int(group['peers']) int_dict['xmit_q_unreliable'] = int(group['xmit_q_unreliable']) int_dict['xmit_q_reliable'] = int(group['xmit_q_reliable']) int_dict['peer_q_unreliable'] = int(group['peer_q_unreliable']) int_dict['peer_q_reliable'] = int(group['peer_q_reliable']) int_dict['mean_srtt'] = int(group['mean_srtt']) int_dict['pacing_time_unreliable'] = int(group['pacing_t_unreliable']) int_dict['pacing_time_reliable'] = int(group['pacing_t_reliable']) int_dict['mcast_flow_timer'] = int(group['mcast_flow_timer']) int_dict['pend_routes'] = int(group['pend_routes']) continue return parsed_dict
def cli(self, interface='', output=None): if output is None: if interface: cmd = self.cli_command[1].format(interface=interface) else: cmd = self.cli_command[0] out = self.device.execute(cmd) else: out = output # initial return dictionary ret_dict = {} # initial regexp pattern p1 = re.compile(r'^(?P<intf>[\w\-\/\.]+)\s*' r'(?P<admin_state>\w+)\s+' r'(?P<oper_state>\w+)\s+' r'(?P<power>[\d\.]+)\s+' r'(?P<device>(?=\S).*(?<=\S))\s+' r'(?P<class>[\w\/]+)\s+' r'(?P<max>[\d\.]+)$') # 1 1550.0 147.0 1403.0 p2 = re.compile(r'^(?P<module>\d+)\s+' r'(?P<available>[\d\.]+)\s+' r'(?P<used>[\d\.]+)\s+' r'(?P<remaining>[\d\.]+)\s*$') # Available:1170.0(w) Used:212.2(w) Remaining:957.8(w) p3 = re.compile(r'^\s*[Aa]vailable\:(?P<available>[\d\.]+)\(\w+\)\s+' r'[Uu]sed\:(?P<used>[\d\.]+)\(\w+\)\s+' r'[Rr]emaining\:(?P<remaining>[\d\.]+)\(\w+\)\s*$') for line in out.splitlines(): line = line.strip() # Gi1/0/13 auto on 15.4 AIR-CAP2602I-A-K9 3 30.0 m = p1.match(line) if m: group = m.groupdict() intf = Common.convert_intf_name(group.pop('intf')) intf_dict = ret_dict.setdefault('interface', {}).setdefault(intf, {}) intf_dict['power'] = float(group.pop('power')) intf_dict['max'] = float(group.pop('max')) intf_dict.update( {k: v for k, v in group.items() if 'n/a' not in v}) continue # 1 1550.0 147.0 1403.0 m = p2.match(line) if m: group = m.groupdict() module = group.pop('module') stat_dict = ret_dict.setdefault('watts', {}).setdefault(module, {}) stat_dict['module'] = module stat_dict['available'] = float(group.pop('available')) stat_dict['used'] = float(group.pop('used')) stat_dict['remaining'] = float(group.pop('remaining')) continue # Available:1170.0(w) Used:212.2(w) Remaining:957.8(w) m = p3.match(line) if m: group = m.groupdict() stat_dict = ret_dict.setdefault('watts', {}).setdefault('0', {}) stat_dict['module'] = '0' stat_dict['available'] = float(group.pop('available')) stat_dict['used'] = float(group.pop('used')) stat_dict['remaining'] = float(group.pop('remaining')) # Remove statistics if we don't have any interfaces if 'interface' not in ret_dict and 'watts' in ret_dict: ret_dict.pop('watts', None) return ret_dict
def cli(self, ip='', vrf='', output=None): if ip and vrf: cmd = self.cli_command[2].format(ip=ip, vrf=vrf) elif ip : cmd = self.cli_command[0].format(ip=ip) elif vrf: cmd = self.cli_command[3].format(vrf=vrf) else: cmd = self.cli_command[1] # excute command to get output if output is None: out = self.device.execute(cmd) else: out = output # Init dict result_dict = {} address_family = None is_ipv6 = False if ip and (':' in ip or ip == 'ipv6'): is_ipv6 = True for line in out.splitlines(): line = line.strip() # IP Route Table for VRF "default" # IPv6 Routing Table for VRF "default" # IPv6 Routing Table for VRF "otv-vrf139" p1 = re.compile(r'^(IP|IPv6) +(Route|Routing) +Table +for +VRF +"(?P<vrf>\S+)"$') m = p1.match(line) if m: vrf = str(m.groupdict()['vrf']) if vrf == 'default' and not is_ipv6: address_family = 'ipv4 unicast' elif vrf != 'default' and not is_ipv6: address_family = 'vpnv4 unicast' elif vrf == 'default' and is_ipv6: address_family = 'ipv6 unicast' elif vrf != 'default' and is_ipv6: address_family = 'vpnv6 unicast' continue # 10.144.0.1/32, ubest/mbest: 1/0 time, attached # 10.220.9.0/24, ubest/mbest: 1/0 time p2 = re.compile(r'(?P<ip_mask>[\w\:\.\/]+), +ubest/mbest: +' r'(?P<ubest>\d+)/(?P<mbest>\d+)( +time)?' r'(, +(?P<attach>\w+))?$') m = p2.match(line) if m: # Init af dict af_dict = result_dict.setdefault('vrf', {}).setdefault(vrf, {}).\ setdefault('address_family', {}).\ setdefault(address_family, {}) # Init ip dict ip_mask = m.groupdict()['ip_mask'] ip_dict = af_dict.setdefault('ip', {}).setdefault(ip_mask, {}) ip_dict['ubest_num'] = m.groupdict()['ubest'] ip_dict['mbest_num'] = m.groupdict()['mbest'] if m.groupdict()['attach']: ip_dict['attach'] = m.groupdict()['attach'] continue # *via 2001:db8:8b05::1002%default, Eth1/1, [200/4444], 15:57:39, bgp-333, internal, tag 333 # *via 10.36.3.3%default, [33/0], 5w0d, bgp-100, internal, tag 100 (mpls-vpn) # *via 2001:db8::5054:ff:fed5:63f9, Eth1/1, [0/0], 00:15:46, direct, # *via 2001:db8:2:2::2, Eth1/1, [0/0], 00:15:46, direct, , tag 222 # *via 10.55.130.2%default, [200/0], 3d07h, bgp-1, internal, tag 1 (evpn), segid: 50009 tunnelid: 0x64008202 encap: VXLAN # via 10.13.110.1, Eth1/2.110, [110/41], 5d03h, ospf-1, intra # via 10.4.1.1, [200/0], 5d03h, bgp-65000, internal, tag 65000 (hidden) # *via 10.13.90.1, Eth1/2.90, [90/3072], 1w5d, eigrp-test, internal p3 = re.compile(r'^(?P<cast>.*)via +(?P<nexthop>[\w\.\:\s]+)' r'(%(?P<table>[\w\:]+))?, *' r'((?P<int>[a-zA-Z0-9\./_]+),)? *' r'\[(?P<preference>\d+)/(?P<metric>\d+)\], *' r'(?P<up_time>[\w\:\.]+), *' r'(?P<protocol>\w+)(\-(?P<process>\w+))?,? *' r'(?P<attribute>\w+)?,? *' r'(tag *(?P<tag>\w+))?,? *(?P<vpn>[a-zA-Z\(\)\-]+)?' r',?( +segid: +(?P<segid>\d+))?,?( +tunnelid: +' r'(?P<tunnelid>[0-9x]+))?,?( +encap: +' r'(?P<encap>[a-zA-Z0-9]+))?$') m = p3.match(line) if m: cast = m.groupdict()['cast'] if cast: cast = {'1': 'unicast', '2': 'multicast'}['{}'.format(cast.count('*'))] # Init 'best_route' dict hop_dict = ip_dict.setdefault('best_route', {}).setdefault(cast, {}).\ setdefault('nexthop', {}) else: hop_dict = ip_dict.setdefault('routes', {}).setdefault('nexthop', {}) nexthop = m.groupdict()['nexthop'] protocol = m.groupdict()['protocol'] prot_dict = hop_dict.setdefault(nexthop, {}).setdefault('protocol', {}).\ setdefault(protocol, {}) table = m.groupdict()['table'] if table: prot_dict['route_table'] = table intf = m.groupdict()['int'] if intf: prot_dict['interface'] = Common.convert_intf_name(intf) preference = m.groupdict()['preference'] if preference: prot_dict['preference'] = preference metric = m.groupdict()['metric'] if metric: prot_dict['metric'] = metric up_time = m.groupdict()['up_time'] if up_time: prot_dict['uptime'] = up_time process = m.groupdict()['process'] if process: prot_dict['protocol_id'] = process attribute = m.groupdict()['attribute'] if attribute: prot_dict['attribute'] = attribute tag = m.groupdict()['tag'] if tag: prot_dict['tag'] = tag.strip() segid = m.groupdict()['segid'] if segid: prot_dict['segid'] = int(segid) tunnelid = m.groupdict()['tunnelid'] if tunnelid: prot_dict['tunnelid'] = tunnelid encap = m.groupdict()['encap'] if encap: prot_dict['encap'] = encap.lower() vpn = m.groupdict()['vpn'] if vpn and 'mpls-vpn' in vpn: prot_dict['mpls_vpn'] = True elif vpn and 'mpls' in vpn: prot_dict['mpls'] = True elif vpn and 'evpn' in vpn: prot_dict['evpn'] = True # Set extra values for BGP Ops if attribute == 'external' and protocol == 'bgp': af_dict['bgp_distance_extern_as'] = int(preference) elif attribute == 'internal' and protocol == 'bgp': af_dict['bgp_distance_internal_as'] = int(preference) elif attribute == 'discard' and protocol == 'bgp': af_dict['bgp_distance_local'] = int(preference) continue return result_dict
def cli(self, vrf='', output=None): if vrf: cmd = self.cli_command[0].format(vrf=vrf) else: cmd = self.cli_command[1] # excute command to get output if output is None: out = self.device.execute(cmd) else: out = output # initial variables ret_dict = {} group = None source = None for line in out.splitlines(): line = line.strip() # MLD Locally Joined Group Membership for VRF "default" p1 = re.compile( r'^MLD +Locally +Joined +Group +Membership +for +VRF +\"(?P<vrf>\S+)\"$' ) m = p1.match(line) if m: vrf = m.groupdict()['vrf'] if 'vrfs' not in ret_dict: ret_dict['vrfs'] = {} if vrf not in ret_dict['vrfs']: ret_dict['vrfs'][vrf] = {} continue # Group Type Interface Last Reported # (*, fffe::1) p2 = re.compile( r'^\((?P<source>[\w\.\:\*]+), *(?P<group>[\w\.\:]+)\)$') m = p2.match(line) if m: group = m.groupdict()['group'] source = m.groupdict()['source'] continue # Local Eth2/1 00:03:07 p2_1 = re.compile(r'^(?P<type>\w+) +(?P<intf>[\w\.\-\/]+) +' '(?P<last_reported>[\w\.\:]+)$') m = p2_1.match(line) if m: intf = Common.convert_intf_name(m.groupdict()['intf']) if 'interface' not in ret_dict['vrfs'][vrf]: ret_dict['vrfs'][vrf]['interface'] = {} if intf not in ret_dict['vrfs'][vrf]['interface']: ret_dict['vrfs'][vrf]['interface'][intf] = {} if 'group' not in ret_dict['vrfs'][vrf]['interface'][intf]: ret_dict['vrfs'][vrf]['interface'][intf]['group'] = {} if group and group not in ret_dict['vrfs'][vrf]['interface'][ intf]['group']: ret_dict['vrfs'][vrf]['interface'][intf]['group'][ group] = {} group_type = m.groupdict()['type'].lower() if source and source != '*': if 'source' not in ret_dict['vrfs'][vrf]['interface'][ intf]['group'][group]: ret_dict['vrfs'][vrf]['interface'][intf]['group'][ group]['source'] = {} if source not in ret_dict['vrfs'][vrf]['interface'][intf][ 'group'][group]['source']: ret_dict['vrfs'][vrf]['interface'][intf]['group'][ group]['source'][source] = {} ret_dict['vrfs'][vrf]['interface'][intf]['group'][group]\ ['source'][source]['type'] = group_type ret_dict['vrfs'][vrf]['interface'][intf]['group'][group]\ ['source'][source]['last_reported'] = m.groupdict()['last_reported'] else: ret_dict['vrfs'][vrf]['interface'][intf]['group'][group][ 'type'] = group_type ret_dict['vrfs'][vrf]['interface'][intf]['group'][group]['last_reported'] = \ m.groupdict()['last_reported'] # build static_group and join_group info if group_type == 'static': key = 'static_group' else: key = 'join_group' if key not in ret_dict['vrfs'][vrf]['interface'][intf]: ret_dict['vrfs'][vrf]['interface'][intf][key] = {} if group and source: build_group = group + ' ' + source if build_group not in ret_dict['vrfs'][vrf]['interface'][ intf][key]: ret_dict['vrfs'][vrf]['interface'][intf][key][ build_group] = {} ret_dict['vrfs'][vrf]['interface'][intf][key][build_group][ 'group'] = group ret_dict['vrfs'][vrf]['interface'][intf][key][build_group][ 'source'] = source continue return ret_dict
def cli(self, entry='', output=None): if output is None: if entry: cmd = self.cli_command[0].format(entry=entry) else: cmd = self.cli_command[1] out = self.device.execute(cmd) else: out = output # initial return dictionary ret_dict = {} item = '' sub_dict = {} # ==== initial regexp pattern ==== # Local Intf: Gi2/0/15 p1 = re.compile(r'^Local\s+Intf:\s+(?P<intf>[\w\/\.\-]+)$') # Port id: Gi1/0/4 p1_1 = re.compile(r'^Port\s+id:\s+(?P<port_id>[\S\s]+)$') # Chassis id: 843d.c6ff.f1b8 p2 = re.compile(r'^Chassis\s+id:\s+(?P<chassis_id>[\w\.]+)$') # Port Description: GigabitEthernet1/0/4 p3 = re.compile(r'^Port\s+Description:\s+(?P<desc>[\w\/\.\-\s]+)$') # System Name: R5 # System Name - not advertised p4 = re.compile(r'^System\s+Name(?: +-|:)\s+(?P<name>[\S\s]+)$') # System Description: p5 = re.compile(r'^System\s+Description:.*$') # Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 12.2(58)SE2, RELEASE SOFTWARE (fc1) # Technical Support: http://www.cisco.com/techsupport # Copyright (c) 1986-2011 by Cisco Systems, Inc. # Cisco IP Phone 7962G,V12, SCCP42.9-3-1ES27S p5_1 = re.compile( r'^(?P<msg>(Cisco +IOS +Software|Technical Support|Copyright|Cisco IP Phone).*)$' ) # Compiled Thu 21-Jul-11 01:23 by prod_rel_team # Avaya 1220 IP Deskphone, Firmware:06Q # IP Phone, Firmware:90234AP p5_2 = re.compile(r'^(?P<msg>(Compile|Avaya|IP Phone).*)$') # Time remaining: 112 seconds p6 = re.compile( r'^Time\s+remaining:\s+(?P<time_remaining>\w+)\s+seconds$') # System Capabilities: B,R p7 = re.compile(r'^System\s+Capabilities:\s+(?P<capab>[\w\,\s]+)$') # Enabled Capabilities: B,R p8 = re.compile(r'^Enabled\s+Capabilities:\s+(?P<capab>[\w\,\s]+)$') # Management Addresses: # IP: 10.9.1.1 # Management Addresses - not advertised p9 = re.compile(r'^IP:\s+(?P<ip>[\w\.]+)$') p9_1 = re.compile( r'^Management\s+Addresses\s+-\s+(?P<ip>not\sadvertised)$') # Auto Negotiation - supported, enabled p10 = re.compile( r'^Auto\s+Negotiation\s+\-\s+(?P<auto_negotiation>[\w\s\,]+)$') # Physical media capabilities: p11 = re.compile(r'^Physical\s+media\s+capabilities:$') # 1000baseT(FD) # 100base-TX(HD) # Symm, Asym Pause(FD) # Symm Pause(FD) p11_1 = re.compile( r'^(?P<physical_media_capabilities>[\S\(\s]+(HD|FD)[\)])$') # Media Attachment Unit type: 30 p12 = re.compile( r'^Media\s+Attachment\s+Unit\s+type:\s+(?P<unit_type>\d+)$') # Vlan ID: 1 # Note: not parsing 'not advertised since value type is int p13 = re.compile(r'^^Vlan\s+ID:\s+(?P<vlan_id>\d+)$') # Total entries displayed: 4 p14 = re.compile(r'^Total\s+entries\s+displayed:\s+(?P<entry>\d+)$') # ==== MED Information patterns ===== # F/W revision: 06Q # S/W revision: SCCP42.9-3-1ES27S # H/W revision: 12 med_p1 = re.compile( r'^(?P<head>(H/W|F/W|S/W))\s+revision:\s+(?P<revision>\S+)$') # Manufacturer: Avaya-05 med_p2 = re.compile(r'^Manufacturer:\s+(?P<manufacturer>[\S\s]+)$') # Model: 1220 IP Deskphone med_p3 = re.compile(r'^Model:\s+(?P<model>[\S\s]+)$') # Capabilities: NP, LI, PD, IN med_p4 = re.compile(r'^Capabilities:\s+(?P<capabilities>[\S\s]+)$') # Device type: Endpoint Class III med_p5 = re.compile(r'^Device\s+type:\s+(?P<device_type>[\S\s]+)$') # Network Policy(Voice): VLAN 110, tagged, Layer-2 priority: 5, DSCP: 46 # Network Policy(Voice Signal): VLAN 110, tagged, Layer-2 priority: 0, DSCP: 0 med_p6 = re.compile( r'^Network\s+Policy\(Voice(\s+(?P<voice_signal>Signal))?\):' r'\s+VLAN\s+(?P<vlan>\d+),\s+(?P<tagged>tagged),\s+' r'Layer-2 priority:\s+(?P<layer_2_priority>\d+),\s+DSCP:\s+(?P<dscp>\d+)$' ) # PD device, Power source: Unknown, Power Priority: High, Wattage: 6.0 med_p7 = re.compile( r'^(?P<device_type>PD device),\s+Power\s+source:\s+(?P<power_source>\S+),\s+' r'Power\s+Priority:\s+(?P<power_priority>\S+),\s+Wattage:\s+(?P<wattage>\S+)$' ) # Location - not advertised med_p8 = re.compile(r'^Location\s+-\s+(?P<location>[\S\s]+)$') # Serial number: FCH1610A5S5 med_p9 = re.compile(r'^Serial\s+number:\s+(?P<serial_number>\S+)$') for line in out.splitlines(): line = line.strip() # Local Intf: Gi2/0/15 m = p1.match(line) if m: intf = Common.convert_intf_name(m.groupdict()['intf']) intf_dict = ret_dict.setdefault('interfaces', {}).setdefault(intf, {}) intf_dict['if_name'] = intf sub_dict = {} continue # Chassis id: 843d.c6ff.f1b8 m = p2.match(line) if m: sub_dict = {} chassis_id = m.groupdict()['chassis_id'] sub_dict.setdefault('chassis_id', chassis_id) continue # Port id: Gi1/0/4 m = p1_1.match(line) if m: if 'interfaces' not in ret_dict: intf_dict = ret_dict.setdefault('interfaces', {}).setdefault('N/A', {}) intf_dict['if_name'] = 'N/A' port_id = Common.convert_intf_name(m.groupdict()['port_id']) port_dict = intf_dict.setdefault('port_id', {}). \ setdefault(port_id, {}) sub_dict.setdefault('port_id', port_id) continue # Port Description: GigabitEthernet1/0/4 m = p3.match(line) if m: sub_dict.setdefault('port_description', m.groupdict()['desc']) continue # System Name: R5 # System Name - not advertised m = p4.match(line) if m: name = m.groupdict()['name'] nei_dict = port_dict.setdefault('neighbors', {}).setdefault(name, {}) sub_dict['system_name'] = name nei_dict['neighbor_id'] = name nei_dict.update(sub_dict) continue # System Description: m = p5.match(line) if m: nei_dict.update({'system_description': ''}) continue # Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 12.2(58)SE2, RELEASE SOFTWARE (fc1) # Technical Support: http://www.cisco.com/techsupport # Copyright (c) 1986-2011 by Cisco Systems, Inc. # Cisco IP Phone 7962G,V12, SCCP42.9-3-1ES27S m = p5_1.match(line) if m: nei_dict['system_description'] += m.groupdict()['msg'] + '\n' continue # Compiled Thu 21-Jul-11 01:23 by prod_rel_team # Avaya 1220 IP Deskphone, Firmware:06Q # IP Phone, Firmware:90234AP m = p5_2.match(line) if m: nei_dict['system_description'] += m.groupdict()['msg'] continue # Time remaining: 112 seconds m = p6.match(line) if m: nei_dict['time_remaining'] = int( m.groupdict()['time_remaining']) continue # System Capabilities: B,R m = p7.match(line) if m: cap = [ self.CAPABILITY_CODES[n] for n in m.groupdict()['capab'].split(',') ] for item in cap: cap_dict = nei_dict.setdefault('capabilities', {}).\ setdefault(item, {}) cap_dict['name'] = item cap_dict['system'] = True continue # Enabled Capabilities: B,R m = p8.match(line) if m: cap = [ self.CAPABILITY_CODES[n] for n in m.groupdict()['capab'].split(',') ] for item in cap: cap_dict = nei_dict.setdefault('capabilities', {}).\ setdefault(item, {}) cap_dict['name'] = item cap_dict['enabled'] = True continue # Management Addresses: # IP: 10.9.1.1 # Management Addresses - not advertised m = p9.match(line) or p9_1.match(line) if m: nei_dict['management_address'] = m.groupdict()['ip'] continue # Auto Negotiation - supported, enabled m = p10.match(line) if m: nei_dict['auto_negotiation'] = m.groupdict( )['auto_negotiation'] continue # Physical media capabilities: m = p11.match(line) if m: nei_dict['physical_media_capabilities'] = [] continue # 1000baseT(FD) # 100base-TX(HD) # Symm, Asym Pause(FD) # Symm Pause(FD) m = p11_1.match(line) if m: item = nei_dict.get('physical_media_capabilities', []) item.append(m.groupdict()['physical_media_capabilities']) nei_dict['physical_media_capabilities'] = item continue # Media Attachment Unit type: 30 m = p12.match(line) if m: nei_dict['unit_type'] = int(m.groupdict()['unit_type']) continue # Vlan ID: 1 # Note: not parsing 'not advertised since value type is int m = p13.match(line) if m: nei_dict['vlan_id'] = int(m.groupdict()['vlan_id']) continue # Total entries displayed: 4 m = p14.match(line) if m: ret_dict['total_entries'] = int(m.groupdict()['entry']) continue # ==== Med Information ==== # F/W revision: 06Q # S/W revision: SCCP42.9-3-1ES27S # H/W revision: 12 m = med_p1.match(line) if m: group = m.groupdict() med_dict = ret_dict.setdefault('med_information', {}) med_dict[group['head'].lower() + '_revision'] = m.groupdict()['revision'] continue # Manufacturer: Avaya-05 # Model: 1220 IP Deskphone # Device type: Endpoint Class III m = med_p2.match(line) or med_p3.match(line) or med_p5.match(line) if m: match_key = [*m.groupdict().keys()][0] med_dict[match_key] = m.groupdict()[match_key] continue # Capabilities: NP, LI, PD, IN m = med_p4.match(line) if m: list_capabilities = m.groupdict()['capabilities'].split(', ') med_dict['capabilities'] = list_capabilities continue # Network Policy(Voice): VLAN 110, tagged, Layer-2 priority: 5, DSCP: 46 # Network Policy(Voice Signal): VLAN 110, tagged, Layer-2 priority: 0, DSCP: 0 m = med_p6.match(line) if m: group = m.groupdict() if group['voice_signal']: voice = 'voice_signal' else: voice = 'voice' voice_sub_dict = med_dict.setdefault('network_policy', {}).\ setdefault(voice, {}) if group['tagged'] == 'tagged': voice_sub_dict['tagged'] = True else: voice_sub_dict['tagged'] = False for k in ['layer_2_priority', 'dscp', 'vlan']: voice_sub_dict[k] = int(group[k]) continue # PD device, Power source: Unknown, Power Priority: High, Wattage: 6.0 m = med_p7.match(line) if m: for k in ['device_type', 'power_source', 'power_priority']: med_dict[k] = m.groupdict()[k] med_dict['wattage'] = float(m.groupdict()['wattage']) continue # Location - not advertised m = med_p8.match(line) if m: med_dict['location'] = m.groupdict()['location'] continue # Serial number: FCH1610A5S5 m = med_p9.match(line) if m: med_dict['serial_number']: m.groupdict()['serial_number'] continue return ret_dict
def verify_l2vpn_storm_control_configuration( device, interface, service_instance_id, storm_control ): """ Verify storm-control configuration is applied Args: device ('obj'): device object interface ('str'): interface name service_instance_id:('int'): service instance id storm_control('list'): list of storm control configurations ex.) [ { 'traffic_flow': 'unicast', 'name': 'cir', 'val': 8000 }, { 'traffic_flow': 'broadcast', 'name': 'cir', 'val': 8000 }, { 'traffic_flow': 'multicast', 'name': 'cir', 'val': 8000 } ] Returns: None Raises: None """ try: out = device.parse( "show ethernet service instance id " "{} interface {} detail".format( service_instance_id, Common.convert_intf_name(interface) ) ) except SchemaEmptyParserError: return False x = PrettyTable() x.field_names = [ "Traffic flow", "Configuration expected", "Configuration found", ] config_found = True for sc in storm_control: sc_traffic_flow = sc.get("traffic_flow", "") sc_name = sc.get("name", "") sc_val = sc.get("val", "") row_val = [sc_traffic_flow.title()] row_val.append( "{}".format( "storm-control {} {} {}".format( sc_traffic_flow, sc_name, sc_val ) ) ) try: val = out["service_instance"][service_instance_id]["interfaces"][ interface ]["micro_block_type"]["Storm-Control"][ "storm_control_{}_cir".format(sc_traffic_flow) ] if sc_val != int(val): config_found = False row_val.append( "{}".format( "storm-control {} {} {}".format( sc_traffic_flow, sc_name, int(val) ) ) ) else: row_val.append( "{}".format( "storm-control {} {} {}".format( sc_traffic_flow, sc_name, sc_val ) ) ) except KeyError as e: row_val.append( "Configuration not found for {}:".format(sc_traffic_flow) ) log.error( "Key: '{}' is not found from the command output".format(str(e)) ) config_found = False x.add_row(row_val) log.info(x) return config_found
def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output vlan_dict = {} for line in out.splitlines(): if line: line = line.rstrip() else: continue # VLAN Name Status Ports # 1 default active Gi1/0/1, Gi1/0/2, Gi1/0/3, Gi1/0/5, Gi1/0/6, Gi1/0/12, # 105 VLAN0105 act/lshut Po333 # 1 default active p1 = re.compile( r'^\s*(?P<vlan_id>[0-9]+) +(?P<name>[a-zA-Z0-9\-]+)' ' +(?P<status>[active|suspended|act/unsup|sus|(.*)/lshut]+)( *(?P<interfaces>[\w\s\/\,]+))?$' ) m = p1.match(line) if m: vlan_id = m.groupdict()['vlan_id'] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if vlan_id not in vlan_dict: vlan_dict['vlans'][vlan_id] = {} vlan_dict['vlans'][vlan_id]['vlan_id'] = vlan_id vlan_dict['vlans'][vlan_id]['name'] = m.groupdict()['name'] vlan_dict['vlans'][vlan_id]['shutdown'] = False if 'act/unsup' in m.groupdict()['status']: status = 'unsupport' elif 'suspend' in m.groupdict()['status']: status = 'suspend' elif 'shut' in m.groupdict()['status']: status = 'shutdown' vlan_dict['vlans'][vlan_id]['shutdown'] = True else: status = m.groupdict()['status'] vlan_dict['vlans'][vlan_id]['state'] = status if m.groupdict()['interfaces']: vlan_dict['vlans'][vlan_id]['interfaces'] = \ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] continue # Gi1/0/19, Gi1/0/20, Gi1/0/21, Gi1/0/22 p2 = re.compile( r'^\s*(?P<space>\s{48})(?P<interfaces>[\w\s\/\,]+)$') m = p2.match(line) if m: vlan_dict['vlans'][vlan_id]['interfaces'] = vlan_dict['vlans'][vlan_id]['interfaces']+\ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] continue # VLAN Type Vlan-mode # 1 enet CE p3 = re.compile(r'^\s*(?P<vlan_id>[0-9]+) +(?P<vlan_type>[\w]+)' ' +(?P<vlan_mode>[\w]+)?$') m = p3.match(line) if m: vlan_id = m.groupdict()['vlan_id'] if vlan_id in vlan_dict['vlans']: vlan_dict['vlans'][vlan_id]['mode'] = m.groupdict( )['vlan_mode'].lower() vlan_dict['vlans'][vlan_id]['type'] = m.groupdict( )['vlan_type'] continue # Remote SPAN VLANs # ------------------------------------- # 201-202 # 201,202 # 201,204,201-220 p4 = re.compile(r'^\s*(?P<remote_span_vlans>[^--][0-9\-\,]+)?$') m = p4.match(line) if m: remote_span_vlans = "" if m.groupdict()['remote_span_vlans']: remote_span_vlans = m.groupdict( )['remote_span_vlans'].split(',') if remote_span_vlans: if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} for remote_vlan in remote_span_vlans: if '-' in remote_vlan: remote_span_list = remote_vlan.split('-') initial = remote_span_list[0] end = remote_span_list[1] value = int(initial) while (value <= int(end)): if str(value) not in vlan_dict['vlans']: vlan_dict['vlans'][str(value)] = {} vlan_dict['vlans'][str( value)]['remote_span_vlan'] = True value += 1 else: if remote_vlan not in vlan_dict['vlans']: vlan_dict['vlans'][remote_vlan] = {} vlan_dict['vlans'][remote_vlan][ 'remote_span_vlan'] = True continue # Primary Secondary Type Ports # ------- --------- ----------------- ------------------------------------------ # 2 301 community Fa5/3, Fa5/25 # 2 302 community # 10 community p5 = re.compile( r'^\s*(?P<primary>\d+)? +(?P<secondary>\d+)' ' +(?P<type>[\w\-]+)( +(?P<interfaces>[\w\s\,\/]+))?$') m = p5.match(line) if m: if m.groupdict()['primary']: primary = m.groupdict()['primary'] else: primary = "" secondary = m.groupdict()['secondary'] private_vlan_type = m.groupdict()['type'] if m.groupdict()['interfaces']: private_vlan_interfaces = \ [Common.convert_intf_name(i) for i in m.groupdict()['interfaces'].split(',')] if 'vlans' not in vlan_dict: vlan_dict['vlans'] = {} if m.groupdict()['primary']: if primary not in vlan_dict['vlans']: vlan_dict['vlans'][primary] = {} if 'private_vlan' not in vlan_dict['vlans'][primary]: vlan_dict['vlans'][primary]['private_vlan'] = {} if primary: vlan_dict['vlans'][primary]['private_vlan'][ 'primary'] = True if 'association' in vlan_dict['vlans'][primary][ 'private_vlan']: vlan_dict['vlans'][primary]['private_vlan']['association'] = \ vlan_dict['vlans'][primary]['private_vlan']['association'] + [secondary] else: vlan_dict['vlans'][primary]['private_vlan'][ 'association'] = secondary.split() if secondary not in vlan_dict['vlans']: vlan_dict['vlans'][secondary] = {} if 'private_vlan' not in vlan_dict['vlans'][secondary]: vlan_dict['vlans'][secondary]['private_vlan'] = {} vlan_dict['vlans'][secondary]['private_vlan'][ 'primary'] = False vlan_dict['vlans'][secondary]['private_vlan'][ 'type'] = private_vlan_type if m.groupdict()['interfaces']: vlan_dict['vlans'][secondary]['private_vlan'][ 'ports'] = private_vlan_interfaces continue return vlan_dict
def cli(self, name, output=None): if output is None: cmd = self.cli_command.format(name=name) out = self.device.execute(cmd) else: out = output # Init vars ret_dict = {} index = 0 # Cache type: Normal (Platform cache) p1 = re.compile(r'^Cache +type: +(?P<cache_type>[\S\s]+)$') # Cache size: 16 p2 = re.compile(r'^Cache +size: +(?P<cache_size>\d+)$') # Current entries: 1 p3 = re.compile(r'^Current +entries: +(?P<current_entries>\d+)$') # High Watermark: 1 p4 = re.compile(r'^High +Watermark: +(?P<high_water_mark>\d+)$') # Flows added: 1 p5 = re.compile(r'^Flows +added: +(?P<flows_added>\d+)$') # Flows aged: 0 p6 = re.compile(r'^Flows +aged: +(?P<flows_aged>\d+)$') # - Inactive timeout ( 15 secs) 15 # - Event aged 0 # - Watermark aged 6 # - Emergency aged 0 p7 = re.compile(r'^- +(?P<key>[\S\s]+?)( +\( +(?P<secs>\d+) +secs\))? +(?P<value>\d+)$') # 0 (DEFAULT) 192.168.189.254 192.168.189.253 Null Te0/0/0.1003 2 p8 = re.compile(r'^(?P<ip_vrf_id_input>\d+ +\(\S+\)) +(?P<ipv4_src_addr>\S+) ' r'+(?P<ipv4_dst_addr>\S+) +(?P<intf_input>\S+) ' r'+(?P<intf_output>\S+) +(?P<pkts>\d+)$') # IP VRF ID INPUT: 0 (DEFAULT) p9 = re.compile(r'^IP VRF ID INPUT: +(?P<id>[\S\s]+)$') # IPV4 SOURCE ADDRESS: 192.168.189.254 p10 = re.compile(r'^IPV4 SOURCE ADDRESS: +(?P<src>\S+)$') # IPV4 DESTINATION ADDRESS: 192.168.189.253 p11 = re.compile(r'^IPV4 DESTINATION ADDRESS: +(?P<dst>\S+)$') # interface input: Null p12 = re.compile(r'^interface input: +(?P<input>\S+)$') # interface output: Te0/0/0.1003 p13 = re.compile(r'^interface output: +(?P<output>\S+)$') # counter packets: 3 p14 = re.compile(r'^counter packets: +(?P<pkts>\d+)$') for line in out.splitlines(): line = line.strip() # Cache type: Normal (Platform cache) m = p1.match(line) if m: group = m.groupdict() ret_dict.update({'cache_type': group['cache_type']}) continue # Cache size: 16 m = p2.match(line) if m: group = m.groupdict() ret_dict.update({'cache_size': int(group['cache_size'])}) continue # Current entries: 1 m = p3.match(line) if m: group = m.groupdict() ret_dict.update({'current_entries': int(group['current_entries'])}) continue # High Watermark: 1 m = p4.match(line) if m: group = m.groupdict() ret_dict.update({'high_water_mark': int(group['high_water_mark'])}) continue # Flows added: 1 m = p5.match(line) if m: group = m.groupdict() ret_dict.update({'flows_added': int(group['flows_added'])}) continue # Flows aged: 0 m = p6.match(line) if m: group = m.groupdict() aged_dict = ret_dict.setdefault('flows_aged', {}) aged_dict.update({'total': int(group['flows_aged'])}) continue # - Inactive timeout ( 15 secs) 15 m = p7.match(line) if m: group = m.groupdict() key = group['key'].lower().replace(' ', '_') aged_dict.update({key: int(group['value'])}) secs = group['secs'] if secs: aged_dict.update({key + '_secs': int(secs)}) continue # 0 (DEFAULT) 192.168.189.254 192.168.189.253 Null Te0/0/0.1003 2 m = p8.match(line) if m: index += 1 group = m.groupdict() entry_dict = ret_dict.setdefault('entries', {}).setdefault(index, {}) entry_dict.update({'ip_vrf_id_input': group['ip_vrf_id_input']}) entry_dict.update({'ipv4_src_addr': group['ipv4_src_addr']}) entry_dict.update({'ipv4_dst_addr': group['ipv4_dst_addr']}) entry_dict.update({'intf_input': Common.convert_intf_name(group['intf_input'])}) entry_dict.update({'intf_output': Common.convert_intf_name(group['intf_output'])}) entry_dict.update({'pkts': int(group['pkts'])}) continue # IP VRF ID INPUT: 0 (DEFAULT) m = p9.match(line) if m: index += 1 group = m.groupdict() entry_dict = ret_dict.setdefault('entries', {}).setdefault(index, {}) entry_dict.update({'ip_vrf_id_input': group['id']}) continue # IPV4 SOURCE ADDRESS: 192.168.189.254 m = p10.match(line) if m: group = m.groupdict() entry_dict.update({'ipv4_src_addr': group['src']}) continue # IPV4 DESTINATION ADDRESS: 192.168.189.253 m = p11.match(line) if m: group = m.groupdict() entry_dict.update({'ipv4_dst_addr': group['dst']}) continue # interface input: Null m = p12.match(line) if m: group = m.groupdict() entry_dict.update({'intf_input': Common.convert_intf_name(group['input'])}) continue # interface output: Te0/0/0.1003 m = p13.match(line) if m: group = m.groupdict() entry_dict.update({'intf_output': Common.convert_intf_name(group['output'])}) continue # counter packets: 3 m = p14.match(line) if m: group = m.groupdict() entry_dict.update({'pkts': int(group['pkts'])}) continue return ret_dict
def cli(self, mag_domain, output=None): if output is None: # get output from device out = self.device.execute(self.cli_command.\ format(mag_domain=mag_domain)) else: out = output # initial return dictionary ret_dict = {} # Bundle-Ether10.0 p1 = re.compile(r'^(?P<mag_interface>\S+)$') # Pre-empt delay is disabled # Preempt delay is disabled. p2 = re.compile( r'^Pre(\-)?empt +delay +is +(?P<preempt_delay>\w+)\.?' '( +)?(?P<preempt_delay_state>Sending +(startup|standard) ' '+BPDU( +until \S+)?)?') # Name: risc p3 = re.compile(r'^Name:\s+(?P<name>\S+)$') # Revision: 1 p4 = re.compile(r'^Revision:\s+(?P<revision>\d+)$') # Max Age: 20 p5 = re.compile(r'^Max Age:\s+(?P<max_age>\d+)$') # Provider Bridge: no p6 = re.compile(r'^Provider +Bridge:\s+(?P<provider_bridge>\w+)$') # Bridge ID: 0000.00ff.0002 p7 = re.compile(r'^Bridge +ID:\s+(?P<bridge_id>[\w\.]+)$') # Port ID: 1 p8 = re.compile(r'^Port +ID:\s+(?P<port_id>\d+)$') # External Cost: 0 p9 = re.compile(r'^External +Cost:\s+(?P<external_cost>\d+)$') # Hello Time: 2 p10 = re.compile(r'^Hello +Time:\s+(?P<hello_time>\d+)$') # Active: yes p11 = re.compile(r'^Active:\s+(?P<active>\w+)$') # BPDUs sent: 39921 p12 = re.compile(r'^BPDUs +sent:\s+(?P<bdpu_sent>\d+)$') # MSTI 0 (CIST): p13 = re.compile(r'^MSTI +(?P<mst_id>\d+)( +\(CIST\))?:?$') # VLAN IDs: 1-2,4-4094 p14 = re.compile(r'^VLAN +IDs:\s+(?P<vlans>\S+)$') # Bridge Priority: 8192 p15 = re.compile(r'^Bridge +Priority:\s+(?P<priority>\d+)$') # Port Priority: 128 p16 = re.compile(r'^Port +Priority:\s+(?P<port_priority>\d+)$') # Cost: 0 p17 = re.compile(r'^Cost:\s+(?P<cost>\d+)$') # Root Bridge: 0000.00ff.0001 p18 = re.compile(r'^Root +Bridge:\s+(?P<root_bridge>[\w\.]+)$') # Root Priority: 4096 p19 = re.compile(r'^Root +Priority:\s+(?P<root_priority>\d+)$') # Topology Changes: 31 p20 = re.compile(r'^Topology +Changes:\s+(?P<topology_changes>\d+)$') for line in out.splitlines(): line = line.strip() # Bundle-Ether10.0 m = p1.match(line) if m: group = m.groupdict() mstag = ret_dict.setdefault('mstag', {}). \ setdefault(mag_domain, {}) mstag.update({'domain': mag_domain}) interfaces = mstag.setdefault('interfaces', {}) interface = interfaces.setdefault( Common.convert_intf_name(group['mag_interface']), {}) interface.update({ 'interface': Common.convert_intf_name(group['mag_interface']) }) continue # Pre-empt delay is disabled m = p2.match(line) if m: group = m.groupdict() preempt_delay = group['preempt_delay'] interface.update( {'preempt_delay': (preempt_delay != 'disabled')}) if group['preempt_delay_state']: interface.update( {'preempt_delay_state': group['preempt_delay_state']}) continue # Name: risc m = p3.match(line) if m: group = m.groupdict() interface.update( {'name': Common.convert_intf_name(group['name'])}) continue # Name: risc m = p3.match(line) if m: group = m.groupdict() interface.update({k: v for k, v in group.items()}) continue # Revision: 1 m = p4.match(line) if m: group = m.groupdict() interface.update({k: int(v) for k, v in group.items()}) continue # Max Age: 20 m = p5.match(line) if m: group = m.groupdict() interface.update({k: int(v) for k, v in group.items()}) continue # Provider Bridge: no m = p6.match(line) if m: group = m.groupdict() interface.update({ 'provider_bridge': (group['provider_bridge'].lower() == 'yes') }) continue # Bridge ID: 0000.00ff.0002 m = p7.match(line) if m: group = m.groupdict() interface.update({k: v for k, v in group.items()}) continue # Port ID: 1 m = p8.match(line) if m: group = m.groupdict() interface.update({k: int(v) for k, v in group.items()}) continue # External Cost: 0 m = p9.match(line) if m: group = m.groupdict() interface.update({k: int(v) for k, v in group.items()}) continue # Hello Time: 2 m = p10.match(line) if m: group = m.groupdict() interface.update({k: int(v) for k, v in group.items()}) continue # Active: yes m = p11.match(line) if m: group = m.groupdict() interface.update({'active': (group['active'] == 'yes')}) continue # BPDUs sent: 39921 m = p12.match(line) if m: group = m.groupdict() bdpu_sent = {'bdpu_sent': int(group['bdpu_sent'])} interface.update({'counters': bdpu_sent}) continue # MSTI 0 (CIST): m = p13.match(line) if m: group = m.groupdict() instances = interfaces.setdefault('instances', {}). \ setdefault(group['mst_id'], {}) instances.update({'instance': int(group['mst_id'])}) continue # VLAN IDs: 1-2,4-4094 m = p14.match(line) if m: group = m.groupdict() instances.update({k: v for k, v in group.items()}) continue # Bridge Priority: 8192 m = p15.match(line) if m: group = m.groupdict() instances.update({k: int(v) for k, v in group.items()}) continue # Port Priority: 128 m = p16.match(line) if m: group = m.groupdict() instances.update({k: int(v) for k, v in group.items()}) continue # Cost: 0 m = p17.match(line) if m: group = m.groupdict() instances.update({k: int(v) for k, v in group.items()}) continue # Root Bridge: 0000.00ff.0001 m = p18.match(line) if m: group = m.groupdict() instances.update({k: v for k, v in group.items()}) continue # Root Priority: 4096 m = p19.match(line) if m: group = m.groupdict() instances.update({k: int(v) for k, v in group.items()}) continue # Topology Changes: 31 m = p20.match(line) if m: group = m.groupdict() topology_changes = { 'topology_changes': int(group['topology_changes']) } instances.update({'counters': topology_changes}) continue return ret_dict
def cli(self, cmd='', output=None): if output is None: # get output from device if cmd: out = self.device.execute(cmd) else: out = self.device.execute(self.cli_command) else: out = output # initial return dictionary ret_dict = {} description_found = False sub_dict_inserted = False # Local Interface: GigabitEthernet0/0/0/0 p1 = re.compile(r'^Local +Interface: +(?P<local_interface>\S+)$') # Chassis id: 001e.49ff.24f7 p2 = re.compile(r'^Chassis +id: +(?P<chassis_id>[\w\.]+)$') # Port id: Gi2 p3 = re.compile(r'^Port +id: +(?P<port_id>\S+)$') # Port Description: GigabitEthernet2 # Port Description - not advertised # Port Description: to genie-3 genie 0/0/1/1 via genie3.genie 00-01 # Port Description: 10G to bl2-genie port Ge8/8/8:GG8 # Port Description: "10G link to Genie2 port Ge8/8/8/8/8" # Port Description: 10G link to genie3-genie port GEN 8/8/8/8 in BE 43 (with port 0/4/0/3) # Port Description: PHY|BW|L3|CORE|type:CRAN-P2P|rhost:ASR-01|rport:TenGigE0/0/0/1 p4 = re.compile(r'^Port +Description(\:|\s\-) ' r'+(?P<port_description>[\s\S]+)$') # System Name: R1_csr1000v.openstacklocal p5 = re.compile(r'System +Name: +(?P<system_name>\S+)$') # System Description: p6 = re.compile(r'^System +Description:$') # Cisco IOS Software [Everest], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.6.1, RELEASE SOFTWARE (fc2) # Cisco Nexus Operating System (NX-OS) Software 7.0(3)I7(1) p7 = re.compile(r'^(?P<system_description>Cisco +[\S\s]+)$') # Copyright (c) 1986-2017 by Cisco Systems, Inc. p8 = re.compile(r'^(?P<copyright>Copyright +\(c\) +[\S\s]+)$') # Compiled Sat 22-Jul-17 05:51 by p9 = re.compile(r'^(?P<compiled_by>Compiled +[\S\s]+)$') # Technical Support: http://www.cisco.com/techsupport p10 = re.compile( r'^(?P<technical_support>(Technical|TAC) (S|s)upport: +[\S\s]+)$') # Time remaining: 117 seconds p11 = re.compile( r'Time +remaining: +(?P<time_remaining>\d+) +seconds$') # Hold Time: 120 seconds p12 = re.compile(r'Hold +Time: +(?P<hold_time>\d+) +seconds$') # System Capabilities: B,R p13 = re.compile(r'System +Capabilities: +(?P<system>[\w+,]+)$') # Enabled Capabilities: R p14 = re.compile(r'Enabled +Capabilities: +(?P<enabled>[\w+,]+)$') # IPv4 address: 10.1.2.1 p15 = re.compile(r'IPv4 +address: +(?P<management_address>[\d\.]+)$') # Total entries displayed: 2 p16 = re.compile( r'Total +entries +displayed: +(?P<total_entries>\d+)$') # Peer MAC Address: 30:b2:b1:ff:ce:56 p17 = re.compile(r'Peer +MAC +Address: +(?P<mac>[\s\S]+)$') for line in out.splitlines(): line = line.strip() # Local Interface: GigabitEthernet0/0/0/0 m = p1.match(line) if m: sub_dict_inserted = False sub_dict = {} group = m.groupdict() intf = Common.convert_intf_name(group['local_interface']) intf_dict = ret_dict.setdefault('interfaces', {}).setdefault(intf, {}) continue # Chassis id: 001e.49ff.24f7 m = p2.match(line) if m: group = m.groupdict() sub_dict.update({'chassis_id': group['chassis_id']}) continue # Port id: Gi1/0/4 m = p3.match(line) if m: group = m.groupdict() port_id = Common.convert_intf_name(group['port_id']) port_dict = intf_dict.setdefault('port_id', {}). \ setdefault(port_id, {}) continue # Port Description: GigabitEthernet1/0/4 # Port Description - not advertised # Port Description: to genie-3 genie 0/0/1/1 via genie3.genie 00-01 # Port Description: 10G to bl2-genie port Ge8/8/8:GG8 # Port Description: "10G link to Genie2 port Ge8/8/8/8/8" # Port Description: 10G link to genie3-genie port GEN 8/8/8/8 in BE 43 (with port 0/4/0/3) m = p4.match(line) if m: group = m.groupdict() sub_dict.setdefault('port_description', group['port_description']) continue # System Name: R5 m = p5.match(line) if m: group = m.groupdict() system_name = group['system_name'] sub_dict.update({'system_name': system_name}) sub_dict.update({'neighbor_id': system_name}) port_dict.setdefault('neighbors', {}).setdefault(system_name, sub_dict) sub_dict_inserted = True continue # System Description: m = p6.match(line) if m: description_found = True sub_dict['system_description'] = '' continue # Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 12.2(58)SE2, RELEASE SOFTWARE (fc1) m = p7.match(line) if m: if description_found: group = m.groupdict() sub_dict['system_description'] = group[ 'system_description'] + '\n' continue # Copyright (c) 1986-2011 by Cisco Systems, Inc. m = p8.match(line) if m: group = m.groupdict() sub_dict['system_description'] += group['copyright'] + '\n' continue # Compiled Thu 21-Jul-11 01:23 by prod_rel_team m = p9.match(line) if m: group = m.groupdict() sub_dict['system_description'] += group['compiled_by'] continue # Technical Support: http://www.cisco.com/techsupport m = p10.match(line) if m: group = m.groupdict() sub_dict[ 'system_description'] += group['technical_support'] + '\n' continue # Time remaining: 112 seconds m = p11.match(line) if m: sub_dict['time_remaining'] = int( m.groupdict()['time_remaining']) continue # Hold Time: 120 seconds m = p12.match(line) if m: group = m.groupdict() sub_dict['hold_time'] = int(group['hold_time']) continue # System Capabilities: B,R m = p13.match(line) if m: cap = [ self.CAPABILITY_CODES[n] for n in m.groupdict()['system'].split(',') ] for item in cap: cap_dict = sub_dict.setdefault('capabilities', {}).\ setdefault(item, {}) cap_dict['system'] = True continue # Enabled Capabilities: B,R m = p14.match(line) if m: cap = [ self.CAPABILITY_CODES[n] for n in m.groupdict()['enabled'].split(',') ] for item in cap: cap_dict = sub_dict.setdefault('capabilities', {}).\ setdefault(item, {}) cap_dict['enabled'] = True continue # IPv4 address: 10.1.2.1 m = p15.match(line) if m: sub_dict['management_address'] = m.groupdict( )['management_address'] continue # Total entries displayed: 2 m = p16.match(line) if m: ret_dict['total_entries'] = int(m.groupdict()['total_entries']) continue m = p17.match(line) if m: peer_mac = m.groupdict()['mac'] sub_dict.update({'peer_mac': peer_mac}) if not sub_dict_inserted: sub_dict_inserted = True port_dict.setdefault('neighbors', {}).setdefault(peer_mac, sub_dict) return ret_dict
def cli(self, mst, output=None): if output is None: # get output from device out = self.device.execute(self.cli_command.format(mst=mst)) else: out = output # initial return dictionary ret_dict = {} # MSTI 0 (CIST): p1 = re.compile(r'^MSTI +(?P<mst_id>\d+)([\s\S]+)?:$') # VLANS Mapped: 1-4094 p2 = re.compile(r'^VLANS +Mapped: +(?P<vlan>\S+)$') # CIST Root Priority 32768 p3 = re.compile(r'^CIST\s+Root\s+Priority\s+' '(?P<cist_root_priority>\d+)') # Address 0021.1bff.0e05 p4 = re.compile(r'^Address\s+(?P<address>[\w\.]+)$') # Ext Cost 2000 p5 = re.compile(r'^Ext\s+Cost\s+(?P<cist_root_cost>\d+)$') # Root ID Priority 32768 p6 = re.compile( r'^Root\s+ID\s+Priority\s+(?P<designated_root_priority>' '\d+)') # Int Cost 0 p7 = re.compile(r'^Int\s+Cost\s+(?P<root_cost>\d+)$') # Max Age 20 sec, Forward Delay 15 sec p8 = re.compile(r'^Max\s+Age\s+(?P<max_age>\d+)\s+sec,' '\s+Forward\s+Delay\s+(?P<forward_delay>\d+)\s+sec$') # Max Hops 20, Transmit Hold count 6 p9 = re.compile( r'^Max\s+Hops\s+(?P<bridge_max_hops>\d+),' '\s+Transmit\s+Hold\s+count\s+(?P<bridge_transmit_hold_count>\d+)$' ) # Bridge ID Priority 32768 (priority 32768 sys-id-ext 0) p10 = re.compile( r'^Bridge\s+ID\s+Priority\s+(?P<bridge_priority>\d+)' '(\s+\(priority\s+\d+\s+sys\-id\-ext\s+(?P<sys_id_ext>\d+)\))?') # Te0/0/0/16 128.1 2000 ROOT FWD 32768 0021.1bff.0e05 128.1 p11 = re.compile( r'^(?P<name>\S+)\s+(?P<port_priority>\d+)\.' '(?P<port_num>\d+)\s+(?P<cost>\d+)\s+(?P<role>\w+)\s+' '(?P<port_state>\w+)\s+((?P<designated_cost>\d+)\s+)?' '(?P<designated_bridge_priority>\d+)\s+(?P<designated_bridge_address>' '[\w\.]+)\s+(?P<designated_port_priority>\d+)\.' '(?P<designated_port_num>\d+)$') # This bridge is the root p12 = re.compile(r'This +bridge +is +(?P<this_bridge_is>[\w ]+)$') for line in out.splitlines(): line = line.strip() # MSTI 0 (CIST): m = p1.match(line) if m: group = m.groupdict() mst_instances = ret_dict.setdefault('mstp', {}). \ setdefault(mst, {}). \ setdefault('mst_instances', {}).setdefault(group['mst_id'], {}) mst_instances.update({'mst_id': group['mst_id']}) continue # VLANS Mapped: 1-4094 m = p2.match(line) if m: group = m.groupdict() mst_instances.update({'vlan': group['vlan']}) continue # CIST Root Priority 32768 m = p3.match(line) if m: address_type = 'cist_root_address' group = m.groupdict() mst_instances.update({k: int(v) for k, v in group.items()}) continue # Address 0021.1bff.0e05 m = p4.match(line) if m: group = m.groupdict() mst_instances.update({address_type: group['address']}) continue # Ext Cost 2000 m = p5.match(line) if m: group = m.groupdict() mst_instances.update({k: int(v) for k, v in group.items()}) continue # Root ID Priority 32768 m = p6.match(line) if m: address_type = 'designated_root_address' group = m.groupdict() mst_instances.update({k: int(v) for k, v in group.items()}) continue # Int Cost 0 m = p7.match(line) if m: group = m.groupdict() mst_instances.update({k: int(v) for k, v in group.items()}) continue # Max Age 20 sec, Forward Delay 15 sec m = p8.match(line) if m: group = m.groupdict() if address_type == 'designated_root_address': mst_instances.update( {'root_max_age': int(group['max_age'])}) mst_instances.update( {'root_forward_delay': int(group['forward_delay'])}) if address_type == 'bridge_address': mst_instances.update( {'bridge_max_age': int(group['max_age'])}) mst_instances.update( {'bridge_forward_delay': int(group['forward_delay'])}) continue # Max Hops 20, Transmit Hold count 6 m = p9.match(line) if m: group = m.groupdict() mst_instances.update({k: int(v) for k, v in group.items()}) continue # Bridge ID Priority 32768 (priority 32768 sys-id-ext 0) m = p10.match(line) if m: address_type = 'bridge_address' group = m.groupdict() mst_instances.update({k: int(v) for k, v in group.items()}) continue # Te0/0/0/16 128.1 2000 ROOT FWD 32768 0021.1bff.0e05 128.1 m = p11.match(line) if m: group = m.groupdict() interfaces = mst_instances.setdefault('interfaces' , {}). \ setdefault(Common.convert_intf_name(group['name']), {}) interfaces.update( {'name': Common.convert_intf_name(group['name'])}) interfaces.update({'cost': int(group['cost'])}) interfaces.update({'role': group['role']}) interfaces.update( {'port_priority': int(group['port_priority'])}) interfaces.update({'port_num': int(group['port_num'])}) interfaces.update({'port_state': group['port_state']}) interfaces.update({ 'designated_bridge_priority': int(group['designated_bridge_priority']) }) interfaces.update({ 'designated_bridge_address': group['designated_bridge_address'] }) interfaces.update({ 'designated_port_priority': int(group['designated_port_priority']) }) interfaces.update( {'designated_port_num': int(group['designated_port_num'])}) continue # This bridge is the root m = p12.match(line) if m: group = m.groupdict() mst_instances.update({k: v for k, v in group.items()}) continue return ret_dict
def cli(self, output=None): # Init vars result_dict = {} intf_conf = False rt_type = None af_flag = False # VRF VRF1 (VRF Id = 1); default RD 100:1; default VPNID <not set> # VRF Mgmt-vrf (VRF Id = 1); default RD <not set>; default VPNID <not set> # VRF vrf1; default RD 1:1; default VPNID <not set> # VRF Down; default RD 100:1; default VPNID <not set> VRF Table ID = 1 # VRF 12349; default RD 10.4.1.1:20; default VPNID <not set> # VRF DEMO (VRF Id = 12); default RD 65001:1; default VPNID <not set>; being deleted p1 = re.compile(r'^VRF +(?P<vrf>[\S]+)( +\(VRF +Id +\= +' r'(?P<vrf_id>\d+)\))?; +default +RD +' r'(?P<rd>[\S\s]+); +default +VPNID +' r'(?P<vpn_id>[\w\s\:\<\>]+)(?: +VRF +' r'Table +ID +\= +(?P<alt_vrf_id>\d))?' r'(?:(?P<being_deleted>; being deleted))?$') # New CLI format, supports multiple address-families p1_1 = re.compile(r'^(?P<cli_format>(New|Old)) +CLI +format,' r' +supports +(?P<support_af>[\s\S]+)$') # Flags: 0x180C p2 = re.compile(r'^Flags: +(?P<flags>\w+)$') # Interfaces: p3 = re.compile(r'^Interfaces:$') # Gi0/0 p3_1 = re.compile(r'^(?P<intf>[\w\s\/\.\-]+)$') # Address family ipv4 unicast (Table ID = 0x1): # Address family ipv4 (Table ID = 2 (0x2)): p4 = re.compile(r'^Address +family +(?P<af>[\w\s]+) +' r'\(Table +ID +\= +(?P<table_id>\w+)' r'( *[\w\(\)]+)?\)(:|;)?(?: being deleted:)?$') # VRF Table ID = 2 p5 = re.compile(r'^VRF +Table +ID += +(?P<table_id>\d+)$') # No Export VPN route-target communities # Export VPN route-target communities p6 = re.compile(r'^Export VPN route-target communities$') # No Import VPN route-target communities #Import VPN route-target communities p6_1 = re.compile(r'^Import VPN route-target communities$') # RT:100:1 RT:200:1 p6_2 = re.compile(r'RT: *(?P<rt>[\w\:\.]+)') # No import route-map p7 = re.compile(r'^No import route-map$') # Import route-map for ipv4 unicast: import_from_global_map (prefix limit: 1000) p7_1 = re.compile( r'^Import +route-map +for +(?P<af>[\w\s]+): +' r'(?P<import_map>[\w\-]+) +\(prefix +limit: (?P<limit>\d+)\)$') # Import route-map: import-test-map p7_2 = re.compile(r'^Import +route-map: +(?P<import_map>[\w\-]+)$') # No global export route-map # No export route-map p8 = re.compile(r'^No( *global)? export route-map$') # Global export route-map for ipv4 unicast: export_to_global_map (prefix limit: 1000) p8_1 = re.compile( r'^Global +export +route-map +for +(?P<af>[\w\s]+): +' r'(?P<export_map>[\w\-]+) +\(prefix +limit: +(?P<limit>\d+)\)$') # Export route-map: export-test-map p8_2 = re.compile(r'^Export +route-map: +(?P<export_map>[\w\-]+)$') # Route warning limit 10000, current count 0 # Route limit 10000, warning limit 70% (7000), current count 1 p9 = re.compile(r'^Route( *limit +(?P<limit>\d+),)? +' r'warning +limit +((?P<warning>\d+)|(?P<percent>\d+)' r'\% *\((?P<warning_limit>[\d\%]+)\)), +' r'current +count +(?P<count>\d+)$') # VRF label distribution protocol: not configured p10 = re.compile( r'^VRF +label +distribution +protocol: +(?P<vrf_label>[\w\s\-]+)$') # VRF label allocation mode: per-prefix p11 = re.compile(r'^VRF +label +allocation +mode: +(?P<mode>[\w\s\-]+)' r'(?:\s*\(Label\s*(?P<label>\d+)\))?$') # Description: desc p12 = re.compile(r'^Description: +(?P<desc>[\S\s]+)$') for line in output.splitlines(): line = line.strip() # VRF VRF1 (VRF Id = 1); default RD 100:1; default VPNID <not set> # VRF Mgmt-vrf (VRF Id = 1); default RD <not set>; default VPNID <not set> # VRF vrf1; default RD 1:1; default VPNID <not set> # VRF Down; default RD 100:1; default VPNID <not set> VRF Table ID = 1 # VRF 12349; default RD 10.4.1.1:20; default VPNID <not set> # VRF DEMO (VRF Id = 12); default RD 65001:1; default VPNID <not set>; being deleted m = p1.match(line) if m: groups = m.groupdict() vrf = groups['vrf'] vrf_dict = result_dict.setdefault(vrf, {}) if groups['being_deleted']: vrf_dict.update({'being_deleted': True}) if groups['vrf_id']: vrf_dict.update({'vrf_id': int(groups['vrf_id'])}) elif groups['alt_vrf_id']: vrf_dict.update({'vrf_id': int(groups['alt_vrf_id'])}) if 'not' not in groups['rd']: vrf_dict.update({'route_distinguisher': groups['rd']}) if 'not' not in groups['vpn_id']: vrf_dict.update({'vpn_id': groups['vpn_id']}) af_flag = False continue # New CLI format, supports multiple address-families m = p1_1.match(line) if m: groups = m.groupdict() vrf_dict.update({'cli_format': groups['cli_format']}) vrf_dict.update({'support_af': groups['support_af']}) continue # Flags: 0x180C m = p2.match(line) if m: groups = m.groupdict() if not af_flag: vrf_dict.update({'flags': groups['flags']}) else: af_dict = vrf_dict.setdefault('address_family', {}).setdefault(af, {}) af_dict.update({'flags': groups['flags']}) continue # Interfaces: # Gi0/0 m = p3.match(line) if m: intf_conf = True continue p3_1 = re.compile(r'^(?P<intf>[\w\s\/\.\-]+)$') m = p3_1.match(line) if m and intf_conf: groups = m.groupdict() intfs = groups['intf'].split() intf_list = [Common.convert_intf_name(item) for item in intfs] if 'interfaces' in result_dict[vrf]: vrf_dict.get('interfaces').extend(intf_list) else: vrf_dict.update({'interfaces': intf_list}) intf_dict = vrf_dict.setdefault('interface', {}) [ intf_dict.setdefault(intf, {}).update({'vrf': vrf}) for intf in intf_list ] continue # Address family ipv4 unicast (Table ID = 0x1): # Address family ipv4 (Table ID = 2 (0x2)): m = p4.match(line) if m: groups = m.groupdict() intf_conf = False af = groups['af'].lower() af_dict = vrf_dict.setdefault('address_family', {}).setdefault(af, {}) af_dict.update({'table_id': groups['table_id']}) af_flag = True continue # VRF Table ID = 2 m = p5.match(line) if m: groups = m.groupdict() intf_conf = False try: af except Exception: af = 'none' af_dict = vrf_dict.setdefault('address_family', {}).setdefault(af, {}) af_dict.update({'table_id': groups['table_id']}) af_flag = True continue # No Export VPN route-target communities # Export VPN route-target communities m = p6.match(line) if m: rt_type = 'export' rts_dict = af_dict.setdefault('route_targets', {}) continue # No Import VPN route-target communities # Import VPN route-target communities m = p6_1.match(line) if m: rt_type = 'import' rts_dict = af_dict.setdefault('route_targets', {}) continue # RT:100:1 RT:200:1 m = p6_2.findall(line) if m and rt_type: for rt in m: rt_dict = rts_dict.setdefault(rt, {}) rt_dict.update({'route_target': rt}) if 'rt_type' in rt_dict: rt_dict.update({'rt_type': 'both'}) else: rt_dict.update({'rt_type': rt_type.strip()}) continue # No import route-map m = p7.match(line) if m: rt_type = None continue # Import route-map for ipv4 unicast: import_from_global_map (prefix limit: 1000) m = p7_1.match(line) if m: groups = m.groupdict() rt_type = None import_global_dict = af_dict.setdefault( 'import_from_global', {}) import_global_dict.update( {'import_from_global_map': groups['import_map']}) import_global_dict.update( {'prefix_limit': int(groups['limit'])}) continue # Import route-map: import-test-map m = p7_2.match(line) if m: groups = m.groupdict() rt_type = None af_dict.update({'import_route_map': groups['import_map']}) continue # No global export route-map # No export route-map m = p8.match(line) if m: rt_type = None continue # Global export route-map for ipv4 unicast: export_to_global_map (prefix limit: 1000) m = p8_1.match(line) if m: groups = m.groupdict() rt_type = None export_global_dict = af_dict.setdefault('export_to_global', {}) export_global_dict.update( {'export_to_global_map': groups['export_map']}) export_global_dict.update( {'prefix_limit': int(groups['limit'])}) continue # Export route-map: export-test-map m = p8_2.match(line) if m: groups = m.groupdict() rt_type = None af_dict.update({'export_route_map': groups['export_map']}) continue # Route warning limit 10000, current count 0 # Route limit 10000, warning limit 70% (7000), current count 1 m = p9.match(line) if m: groups = m.groupdict() routing_table_limit_number = groups['limit'] alert_value = groups['warning'] alert_percent_value = groups['percent'] alert_percent_warning = groups['warning_limit'] count = int(groups['count']) rt_limit_dict = af_dict.setdefault('routing_table_limit', {}) if routing_table_limit_number: rt_limit_dict.update({ 'routing_table_limit_number': int(routing_table_limit_number) }) rt_limit_action_dict = rt_limit_dict.setdefault( 'routing_table_limit_action', {}) if alert_percent_value: alert_percent_dict = rt_limit_action_dict.setdefault( 'enable_alert_percent', {}) alert_percent_dict.update( {'alert_percent_value': int(alert_percent_value)}) if alert_percent_warning: alert_limit_dict = rt_limit_action_dict.setdefault( 'enable_alert_limit_number', {}) alert_limit_dict.update( {'alert_limit_number': int(alert_percent_warning)}) if alert_value: alert_limit_dict = rt_limit_action_dict.setdefault( 'enable_alert_limit_number', {}) alert_limit_dict.update( {'alert_limit_number': int(alert_value)}) continue # VRF label distribution protocol: not configured m = p10.match(line) if m: groups = m.groupdict() if 'not' not in groups['vrf_label']: vrf_label_dict = af_dict.setdefault('vrf_label', {}) vrf_label_dict.update( {'distribution_protocol': groups['vrf_label']}) continue # VRF label allocation mode: per-prefix m = p11.match(line) if m: groups = m.groupdict() if 'not' not in groups['mode']: vrf_label_dict = af_dict.setdefault('vrf_label', {}) vrf_label_dict.update( {'allocation_mode': groups['mode'].strip()}) if groups['label']: vrf_label_dict.update({'label': int(groups['label'])}) continue # Description: desc m = p12.match(line) if m: groups = m.groupdict() vrf_dict.update({'description': groups['desc']}) continue return result_dict
def cli(self, output=None): if output is None: # get output from device out = self.device.execute(self.cli_command) else: out = output # initial variables ret_dict = {} # Trusted Trunks : Te5/0/3 p0 = re.compile(r"^Trusted +Trunks\s+: +(?P<trust_links>(([A-Za-z\d\/]+[\d\/])+)|NA)$") # Vlan's : 851-854,1101-1102 p1 = re.compile(r"^Vlan.*: +(?P<vlans_added>[\d\-,]+)$") # Total Number of Location Groups: 0 p2 = re.compile(r"^Total +Number +of +Location +Groups: +(?P<total_loc_grps>([0-9]+))$") # 851 1 0 Te5/0/27, p3 = re.compile(r"^(?P<vlans>\d+)\s+(?P<no_of_lg>\d+)\s+(?P<lg_id>\d+)\s+(?P<ports>.*),?$") # 0 Te5/0/27, p4 = re.compile(r"^(?P<lg_id>\d+)\s+(?P<ports>.*),?$") for line in out.splitlines(): line = line.strip() # Trusted Trunks : Te5/0/3 m = p0.match(line) if m: ret_dict['trust_links'] = \ Common.convert_intf_name(m.groupdict()['trust_links']) continue # Vlan's : 851-854,1101-1102 - - m = p1.match(line) if m: ret_dict['vlans_added'] = m.groupdict()['vlans_added'] continue # Total Number of Location Groups: 0 m = p2.match(line) if m: ret_dict['total_loc_grps'] = m.groupdict()['total_loc_grps'] continue # 851 1 0 Te5/0/27, m = p3.match(line) if m: group = m.groupdict() vlans = group['vlans'] vlan_dict = ret_dict.setdefault('vlans', {})\ .setdefault(vlans, {}) vlan_dict['no_of_lg'] = m.groupdict()['no_of_lg'] lg_ids = vlan_dict.setdefault('lg_ids', {}) lg_id = lg_ids.setdefault(group['lg_id'], {}) lg_id.update({ 'ports': Common.convert_intf_name(m.groupdict()['ports']), }) continue # 0 Te5/0/27, m = p4.match(line) if m: group = m.groupdict() lg_id = lg_ids.setdefault(group['lg_id'], {}) if group['lg_id']: lg_id.update({ 'ports': Common.convert_intf_name( m.groupdict()['ports']), }) continue return ret_dict
def cli(self, vrf='', output=None): if vrf: cmd = self.cli_command[1].format(vrf=vrf) else: cmd = self.cli_command[0] if output is None: out = self.device.execute(cmd) else: out = output res_dict = {} # Mgmt-intf <not set> ipv4,ipv6 Gi1 # VRF1 65000:1 ipv4,ipv6 Tu1 # vpn4 100:2 ipv4,ipv6 # vpn4 100:2 ipv4,ipv6 # rb-bcn-lab 10.116.83.34:1 ipv4,ipv6 Lo9 # test 10.116.83.34:100 ipv4,ipv6 Lo100 p1 = re.compile( r'^(?P<vrf>[\w\d\-\.]+)\s+(?P<rd>\<not +set\>|[\.\d\:]+)\s+' r'(?P<protocols>[(?:ipv\d)\,]+)(?:\s+(?P<intf>[\S\s]+))?$') # Lo300 # Gi2.390 # Gi2.410 # Te0/0/1 p2 = re.compile(r'^(?P<intf>[\w\.\/]+)$') for line in out.splitlines(): line = line.strip() # Mgmt-intf <not set> ipv4,ipv6 Gi1 # VRF1 65000:1 ipv4,ipv6 Tu1 # vpn2 100:3 ipv4 Lo23 AT3/0/0.1 # vpn4 100:2 ipv4,ipv6 # rb-bcn-lab 10.116.83.34:1 ipv4,ipv6 Lo9 # Te0/0/1 # test 10.116.83.34:100 ipv4,ipv6 Lo100 m = p1.match(line) if m: groups = m.groupdict() vrf = groups['vrf'] vrf_dict = res_dict.setdefault('vrf', {}).setdefault(vrf, {}) rd = groups['rd'] if 'not set' not in rd: vrf_dict.update({'route_distinguisher': rd}) protocols = groups['protocols'].split(',') vrf_dict.update({'protocols': protocols}) if groups['intf']: intfs = groups['intf'].split() intf_list = [ Common.convert_intf_name(item) for item in intfs ] vrf_dict.update({'interfaces': intf_list}) continue # Lo300 # Gi2.390 # Gi2.410 # Te0/0/1 m = p2.match(line) if m: groups = m.groupdict() intf = Common.convert_intf_name(groups['intf']) vrf_dict.get('interfaces').append(intf) return res_dict
def cli(self, client='', output=None): if output is None: #execute command to get output if client: out = self.device.execute( self.cli_command[1].format(client=client)) else: out = self.device.execute(self.cli_command[0]) else: out = output # initial variables ret_dict = {} neighbors_found = False # 172.16.10.1 172.16.10.2 1/2 1 532 (3 ) Up Gig0/0/0 p1 = re.compile(r'^(?P<our_address>[\d\.]+)\s+(?P<our_neighbor>[\d\.]+' \ ')\s+(?P<ld_rd>\d+\/\d+)\s+(?P<rh_rs>\S+)\s+(?P<holdown_timer>\d+)' \ '\s+\((?P<holdown_timer_multiplier>\d+)\s+\)\s+(?P<state>\w+)' \ '\s+(?P<interface>[\w\W]+)$') # 172.16.1.1 172.16.1.3 p2 = re.compile(r'^(?P<our_address>[\d\.]+) +(?P<our_neighbor>'\ '[\d\.]+)$') # 5/2 1(RH) 150 (3) Up Gig0/0/1 p3 = re.compile(r'^(?P<ld_rd>\d+\/\d+)\s+(?P<rh_rs>\S+)\s+' \ '(?P<holdown_timer>\d+)\s+\((?P<holdown_timer_multiplier>\d+)\s+\)' \ '\s+(?P<state>\w+)\s+(?P<interface>[\w\W]+)') # 10.169.197.93 4097/4097 Up Up Gi0/0/0 p4 = re.compile(r'^(?P<our_neighbor>[\d\.]+)\s+(?P<ld_rd>\d+'\ '\/\d+)\s+(?P<rh_rs>\S+)\s+(?P<state>\w+)\s+(?P<interface>'\ '[\w\W]+)$') # OurAddr: 10.186.213.12 p5 = re.compile(r'^OurAddr:\s+(?P<our_address>[\d\.]+)$') # Session state is UP and using echo function with 500 ms interval. p6 = re.compile(r'^\s*Session +state +is +(?P<state>\S+) +and +using'\ ' +(?P<echo_function>\S+) +function +with +(?P<interval_in_ms>\d+)'\ ' +ms +interval\.$') # Session state is UP and not using echo function. p7 = re.compile(r'^\s*Session +state +is +(?P<state>\S+) +and +not '\ '+using +echo +function\.$') # Session Host: Software p8 = re.compile(r'^\s*Session\s+Host:\s+(?P<session_host>\S+)$') # Handle: 1 p10 = re.compile(r'^\s*Handle: +(?P<handle>\d+)$') # Local Diag: 0, Demand mode: 0, Poll bit: 0 p11 = re.compile(r'^\s*Local +Diag: +(?P<local_diag>\d+), +Demand +'\ 'mode: +(?P<demand_mode>\d+), +Poll +bit: +(?P<poll_bit>\d+)$') # MinTxInt: 50000, MinRxInt: 50000, Multiplier: 3 Received MinRxInt: 50000, Received Multiplier: 3 Holddown (hits): 150(0), Hello (hits): 50(2223) Rx Count: 2212, Rx Count: 2212, Rx Interval (ms) # min/max/avg: 8/68/49 last: 0 ms ago Tx Count: 2222, Tx Interval (ms) min/max/avg: 40/60/49 last: 20 ms ago Elapsed time watermarks: 0 0 (last: 0) Registered protocols: CEF Stub p12 = re.compile(r'^\s*MinTxInt:\s+(?P<min_tx_interface>\d+),\s+'\ 'MinRxInt:\s+(?P<min_rx_interface>\d+),\s+Multiplier:\s+'\ '(?P<multiplier>\d+)\s*Received\s+MinRxInt:\s+'\ '(?P<received_min_rx_interface>\d+),\s+Received\s+Multiplier:\s'\ '+(?P<received_multiplier>\d+)\s+Hold(d)?own\s+\(hits\):\s+'\ '(?P<holddown>\d+)\((?P<holddown_hits>\d+)\),\s+Hello\s+\(hits\)'\ ':\s+(?P<hello>\d+)\((?P<hello_hits>\d+)\)\s+Rx +Count:\s+'\ '(?P<rx_count>\d+),\s+Rx\s+Interval\s+\(ms\)\s+min\/max\/avg:\s+'\ '(?P<rx_min_interval_in_ms>\d+)\/(?P<rx_max_interval_in_ms>\d+)'\ '\/(?P<rx_avg_interval_in_ms>\d+) +last:\s+'\ '(?P<rx_last_interval_in_ms>\d+) +ms +ago\s*Tx\s+Count: +'\ '(?P<tx_count>\d+),\s+Tx\s+Interval\s+\(ms\)\s+min\/max\/avg:'\ '\s+(?P<tx_min_interval_in_ms>\d+)\/(?P<tx_max_interval_in_ms>'\ '\d+)\/(?P<tx_avg_interval_in_ms>\d+)\s+last:\s+'\ '(?P<tx_last_interval_in_ms>\d+)\s+ms\s+ago\s*Elapsed\s+time\s+'\ 'watermarks:\s+(?P<elapsed_time_watermarks>\d+\s+\d+) +\('\ 'last:\s+(?P<elapsed_time_watermarks_last>\d+)\)\s*'\ 'Registered\s+protocols:\s+(?P<registered_protocols>[\w\W]+)$') # MinTxInt: 100000, MinRxInt: 100000, Multiplier: 6 p13 = re.compile(r'^\s*MinTxInt: +(?P<min_tx_interface>\d+), +MinRxInt' \ ': +(?P<min_rx_interface>\d+), +Multiplier: +(?P<multiplier>\d+)$') # Received MinRxInt: 100000, Received Multiplier: 6 p14 = re.compile(r'^\s*Received +MinRxInt:\s+'\ '(?P<received_min_rx_interface>\d+),\s+Received\s+Multiplier:'\ '\s+(?P<received_multiplier>\d+)$') # Holdown (hits): 1000(0), Hello (hits): 200(5995) p15 = re.compile(r'^\s*Hold(d)?own +\(hits\): +' \ '(?P<holddown>\d+)\((?P<holddown_hits>\d+)\), +Hello +\(hits\): +' \ '(?P<hello>\d+)\((?P<hello_hits>\d+)\)$') # Rx Count: 1940, Rx Interval (ms) min/max/avg: 1/1003/879 last: 182 ms ago p16 = re.compile(r'^\s*Rx +Count: +(?P<count>\d+), +Rx +' \ 'Interval +\(ms\) +min\/max\/avg: +(?P<min_int_ms>\d+)' \ '\/(?P<max_int_ms>\d+)\/(?P<avg_int_ms>\d+) +' \ 'last: +(?P<last_ms_ago>\d+) +ms +ago$') # Rx Count: 5052 p17 = re.compile(r'^\s*Rx +Count: +(?P<count>\d+)$') # Tx Count: 1940, Tx Interval (ms) min/max/avg: 1/1003/879 last: 742 ms ago p18 = re.compile(r'^\s*Tx +Count: +(?P<count>\d+), +Tx +Interval +' \ '\(ms\) +min\/max\/avg: +(?P<min_int_ms>\d+)\/(?P<max_int_ms>\d+)'\ '\/(?P<avg_int_ms>\d+) +last: +(?P<last_ms_ago>\d+) +ms +ago$') # Tx Count: 7490 p19 = re.compile(r'^\s*Tx +Count: +(?P<count>\d+)$') # Elapsed time watermarks: 0 0 (last: 0) p20 = re.compile(r'^\s*Elapsed +time +watermarks: +' \ '(?P<elapsed_time_watermarks>\d+ +\d+) +\(last: +' \ '(?P<elapsed_time_watermarks_last>\d+)\)$') # Registered protocols: OSPF CEF p21 = re.compile(r'^\s*Registered +protocols: +' \ '(?P<registered_protocols>[\w\W]+)$') # Uptime: 00:28:03 p22 = re.compile(r'^\s*Uptime: +(?P<up_time>\S+)$') # Last packet: Version: 1 - Diagnostic: 0 p23 = re.compile(r'^\s*Last\s+packet:\s+Version:\s+(?P<version>\d+)'\ '\s+\-\s+Diagnostic:\s+(?P<diagnostic>\d+)$') # Last packet: Version: 0 p24 = re.compile(r'\s*Last\s+packet:\sVersion:\s+(?P<version>\d+)$') # - Diagnostic: 0 p25 = re.compile(r'\s*\-\s+Diagnostic:\s+(?P<diagnostic>\d+)$') # State bit: Up - Demand bit: 0 p26 = re.compile(r'^\s*State +bit: +(?P<state_bit>\S+)\s+\-\s+' \ 'Demand +bit:\s+(?P<demand_bit>\d+)$') p27 = re.compile(r'^\s*I +Hear +You +bit: +(?P<i_hear_you_bit>\S+)'\ '\s+\-\s+Demand +bit:\s+(?P<demand_bit>\d+)$') # Poll bit: 0 - Final bit: 0 p28 = re.compile(r'^\s*Poll\s+bit:\s+(?P<poll_bit>\d+)\s+\-\s+'\ 'Final\s+bit:\s+(?P<final_bit>\d+)$') # C bit: 0 p29 = re.compile(r'^\s*C +bit: +(?P<c_bit>\d+)$') # Multiplier: 6 - Length: 24 p30 = re.compile(r'^\s*Multiplier: +(?P<multiplier>\d+)\s+\-\s+' \ 'Length:\s+(?P<length>\d+)$') # My Discr.: 4097 - Your Discr.: 4097 p31 = re.compile(r'^\s*My +Discr\.: +(?P<my_discr>\d+)\s+\-\s+' \ 'Your +Discr\.:\s+(?P<your_discr>\d+)') # Min tx interval: 1000000 - Min rx interval: 1000000 p32 = re.compile(r'^\s*Min +tx +interval: +(?P<min_tx_interval>\d+)'\ '\s+\-\s+Min +rx +interval:\s+(?P<min_rx_interval>\d+)$') # Min Echo interval: 3000000 p33 = re.compile(r'^\s*Min\s+Echo\s+interval:\s+' \ '(?P<min_echo_interval>\d+)$') # Cleanup timer hits: 0 p34 = re.compile(r'^\s*Cleanup +timer +hits: +'\ '(?P<cleanup_timer_hits>\d+)$') # SSO Cleanup Timer called: 0 p35 = re.compile(r'^\s*SSO +Cleanup +Timer +called: +'\ '(?P<sso_cleanup_timer_called>\d+)$') # SSO Cleanup Action Taken: 0 p36 = re.compile(r'^\s*SSO +Cleanup +Action +Taken: +'\ '(?P<sso_cleanup_action_taken>\d+)$') # Pseudo pre-emptive process count: 239103 min/max/avg: 8/16/8 last: 0 ms ago p37 = re.compile(r'^\s*Pseudo +pre-emptive +process +count: +'\ '(?P<count>\d+) +min\/max\/avg: +(?P<min>\d+)\/(?P<max>\d+)'\ '\/(?P<avg>\d+) +last: +(?P<last_ms_ago>\d+) +ms +ago$') # IPC Tx Failure Count: 0 p38 = re.compile(r'^\s*IPC +Tx +Failure +Count: +'\ '(?P<ipc_tx_failure_count>\d+)$') # IPC Rx Failure Count: 0 p39 = re.compile(r'^\s*IPC +Rx +Failure +Count: +'\ '(?P<ipc_rx_failure_count>\d+)$') # Total Adjs Found: 1 p40 = re.compile(r'^\s*Total +Adjs +Found: +'\ '(?P<total_adjs_found>\d+)$') # Holddown - negotiated: 510000 adjusted: 0 p41 = re.compile(r'^\s*Hol(d)?down +\- +negotiated: +'\ '(?P<holddown_negotiated>\d+) +adjusted: +'\ '(?P<holddown_adjusted>\d+)$') for line in out.splitlines(): line = line.strip() # 172.16.10.1 172.16.10.2 1/2 1 532 (3 ) Up Gig0/0/0 m = p1.match(line) if m: group = m.groupdict() our_address = ret_dict.setdefault('our_address', {}). \ setdefault(group['our_address'], {}) our_neighbor = our_address.setdefault('neighbor_address', \ {}).setdefault(group['our_neighbor'], {}) our_neighbor.update({'ld_rd': group['ld_rd']}) our_neighbor.update({'rh_rs': group['rh_rs']}) our_neighbor.update({'holdown_timer' : \ int(group['holdown_timer'])}) our_neighbor.update({'holdown_timer_multiplier' : \ int(group['holdown_timer_multiplier'])}) our_neighbor.update({'state': group['state']}) our_neighbor.update({'interface' : \ Common.convert_intf_name(group['interface'])}) continue # 172.16.1.1 172.16.1.3 m = p2.match(line) if m: group = m.groupdict() our_address = ret_dict.setdefault('our_address', {}). \ setdefault(group['our_address'], {}) our_neighbor = our_address.setdefault('neighbor_address', \ {}).setdefault(group['our_neighbor'], {}) continue # 5/2 1(RH) 150 (3) Up Gig0/0/1 m = p3.match(line) if m: group = m.groupdict() our_neighbor.update({'ld_rd': group['ld_rd']}) our_neighbor.update({'rh_rs': group['rh_rs']}) our_neighbor.update({'holdown_timer' : \ int(group['holdown_timer'])}) our_neighbor.update({'holdown_timer_multiplier' : \ int(group['holdown_timer_multiplier'])}) our_neighbor.update({'state': group['state']}) our_neighbor.update({'interface' : \ Common.convert_intf_name(group['interface'])}) continue # 10.169.197.93 4097/4097 Up Up Gi0/0/0 m = p4.match(line) if m: group = m.groupdict() neighbor = {} our_neighbor = neighbor.setdefault(group['our_neighbor'], {}) our_neighbor.update({'ld_rd': group['ld_rd']}) our_neighbor.update({'rh_rs': group['rh_rs']}) our_neighbor.update({'state': group['state']}) our_neighbor.update({'interface' : \ Common.convert_intf_name(group['interface'])}) continue # OurAddr: 10.186.213.12 m = p5.match(line) if m: group = m.groupdict() our_address = ret_dict.setdefault('our_address', {}). \ setdefault(group['our_address'], {}) our_address.update({'neighbor_address': neighbor}) continue # Session state is UP and using echo function with 500 ms interval. m = p6.match(line) if m: group = m.groupdict() session = our_neighbor.setdefault('session', {}) session.update({'state': group['state']}) session.update({'echo_function': True}) session.update( {'echo_interval_ms': int(group['interval_in_ms'])}) continue # Session state is UP and not using echo function. m = p7.match(line) if m: group = m.groupdict() session = our_neighbor.setdefault('session', {}) session.update({'state': group['state']}) session.update({'echo_function': False}) # Session Host: Software m = p8.match(line) if m: group = m.groupdict() our_neighbor.update({'session_host': group['session_host']}) continue # Handle: 1 m = p10.match(line) if m: group = m.groupdict() our_neighbor.update({'handle': int(group['handle'])}) continue # Local Diag: 0, Demand mode: 0, Poll bit: 0 m = p11.match(line) if m: group = m.groupdict() our_neighbor.update({k: int(v) for k, v in group.items()}) continue # MinTxInt: 50000, MinRxInt: 50000, Multiplier: 3 Received MinRxInt: 50000, Received Multiplier: 3 Holddown (hits): 150(0), Hello (hits): 50(2223) Rx Count: 2212, Rx Count: 2212, Rx Interval (ms) # min/max/avg: 8/68/49 last: 0 ms ago Tx Count: 2222, Tx Interval (ms) min/max/avg: 40/60/49 last: 20 ms ago Elapsed time watermarks: 0 0 (last: 0) Registered protocols: CEF Stub m = p12.match(line) if m: group = m.groupdict() our_neighbor.update({'min_tx_int' : \ int(group['min_tx_interface'])}) our_neighbor.update({'min_rx_int' : \ int(group['min_rx_interface'])}) our_neighbor.update({'multiplier' : \ int(group['multiplier'])}) our_neighbor.update({'received_min_rx_int' : \ int(group['received_min_rx_interface'])}) our_neighbor.update({'received_multiplier' : \ int(group['received_multiplier'])}) our_neighbor.update({'holddown' : \ int(group['holddown'])}) our_neighbor.update({'holddown_hits' : \ int(group['holddown_hits'])}) our_neighbor.update({'hello': int(group['hello'])}) our_neighbor.update({'hello_hits': int(group['hello_hits'])}) rx = our_neighbor.setdefault('rx', {}) rx.update({'count': int(group['rx_count'])}) rx.update({'min_int_ms': int(group['rx_min_interval_in_ms'])}) rx.update({'max_int_ms': int(group['rx_max_interval_in_ms'])}) rx.update({'avg_int_ms': int(group['rx_avg_interval_in_ms'])}) rx.update({'last_ms_ago' : \ int(group['rx_last_interval_in_ms'])}) tx = our_neighbor.setdefault('tx', {}) tx.update({'count': int(group['tx_count'])}) tx.update({'min_int_ms': int(group['tx_min_interval_in_ms'])}) tx.update({'max_int_ms': int(group['tx_max_interval_in_ms'])}) tx.update({'avg_int_ms': int(group['tx_avg_interval_in_ms'])}) tx.update({'last_ms_ago' : \ int(group['tx_last_interval_in_ms'])}) our_neighbor.update({'elapsed_time_watermarks' : \ group['elapsed_time_watermarks']}) our_neighbor.update({'elapsed_time_watermarks_last' : \ int(group['elapsed_time_watermarks_last'])}) our_neighbor.update({'registered_protocols' : \ list(group['registered_protocols'].strip().split(' '))}) continue # MinTxInt: 100000, MinRxInt: 100000, Multiplier: 6 m = p13.match(line) if m: group = m.groupdict() our_neighbor.update({'min_tx_int' : \ int(group['min_tx_interface'])}) our_neighbor.update({'min_rx_int' : \ int(group['min_rx_interface'])}) our_neighbor.update({'multiplier' : \ int(group['multiplier'])}) continue # Received MinRxInt: 100000, Received Multiplier: 6 m = p14.match(line) if m: group = m.groupdict() our_neighbor.update({'received_min_rx_int' : \ int(group['received_min_rx_interface'])}) our_neighbor.update({'received_multiplier' : \ int(group['received_multiplier'])}) continue # Holddown (hits): 0(0), Hello (hits): 1000(1939) m = p15.match(line) if m: group = m.groupdict() our_neighbor.update({k: int(v) for k, v in group.items()}) continue # Rx Count: 1940, Rx Interval (ms) min/max/avg: 1/1003/879 last: 182 ms ago m = p16.match(line) if m: group = m.groupdict() rx = our_neighbor.setdefault('rx', {}) rx.update({k: int(v) for k, v in group.items()}) continue # Rx Count: 5052 m = p17.match(line) if m: group = m.groupdict() rx = our_neighbor.setdefault('rx', {}) rx.update({k: int(v) for k, v in group.items()}) continue # Tx Count: 1940, Tx Interval (ms) min/max/avg: 1/1003/879 last: 742 ms ago m = p18.match(line) if m: group = m.groupdict() tx = our_neighbor.setdefault('tx', {}) tx.update({k: int(v) for k, v in group.items()}) continue # Tx Count: 7490 m = p19.match(line) if m: group = m.groupdict() tx = our_neighbor.setdefault('tx', {}) tx.update({k: int(v) for k, v in group.items()}) continue # Elapsed time watermarks: 0 0 (last: 0) m = p20.match(line) if m: group = m.groupdict() our_neighbor.update({ 'elapsed_time_watermarks': group['elapsed_time_watermarks'] }) our_neighbor.update({ 'elapsed_time_watermarks_last': int(group['elapsed_time_watermarks_last']) }) continue # Registered protocols: OSPF CEF m = p21.match(line) if m: group = m.groupdict() our_neighbor.update({ 'registered_protocols': list(group['registered_protocols'].strip().split(' ')) }) continue # Uptime: 00:28:03 m = p22.match(line) if m: group = m.groupdict() our_neighbor.update({'up_time': group['up_time']}) continue # Last packet: Version: 1 - Diagnostic: 0 m = p23.match(line) if m: group = m.groupdict() last_packet = our_neighbor.setdefault('last_packet', {}) last_packet.update({'version': int(group['version'])}) last_packet.update({'diagnostic': int(group['diagnostic'])}) continue # Last packet: Version: 1 m = p24.match(line) if m: group = m.groupdict() last_packet = our_neighbor.setdefault('last_packet', {}) last_packet.update({'version': int(group['version'])}) continue # - Diagnostic: 0 m = p25.match(line) if m: group = m.groupdict() last_packet.update({'diagnostic': int(group['diagnostic'])}) continue # State bit: Up - Demand bit: 0 m = p26.match(line) if m: group = m.groupdict() last_packet.update({'state_bit': group['state_bit']}) last_packet.update({'demand_bit': int(group['demand_bit'])}) continue # I Hear You bit: 1 - Demand bit: 0 m = p27.match(line) if m: group = m.groupdict() last_packet.update({'i_hear_you_bit': group['i_hear_you_bit']}) last_packet.update({'demand_bit': int(group['demand_bit'])}) continue # Poll bit: 0 - Final bit: 0 m = p28.match(line) if m: group = m.groupdict() last_packet.update({'poll_bit': int(group['poll_bit'])}) last_packet.update({'final_bit': int(group['final_bit'])}) continue # C bit: 0 m = p29.match(line) if m: group = m.groupdict() last_packet.update({'c_bit': int(group['c_bit'])}) continue # Multiplier: 6 - Length: 24 m = p30.match(line) if m: group = m.groupdict() last_packet.update({'multiplier': int(group['multiplier'])}) last_packet.update({'length': int(group['length'])}) continue # My Discr.: 4097 - Your Discr.: 4097 m = p31.match(line) if m: group = m.groupdict() last_packet.update({'my_discr': int(group['my_discr'])}) last_packet.update({'your_discr': int(group['your_discr'])}) continue # Min tx interval: 1000000 - Min rx interval: 1000000 m = p32.match(line) if m: group = m.groupdict() last_packet.update( {'min_tx_int': int(group['min_tx_interval'])}) last_packet.update( {'min_rx_int': int(group['min_rx_interval'])}) continue # Min Echo interval: 3000000 m = p33.match(line) if m: group = m.groupdict() last_packet.update( {'min_echo_int': int(group['min_echo_interval'])}) continue # Cleanup timer hits: 0 m = p34.match(line) if m: group = m.groupdict() our_neighbor.update({'cleanup_timer_hits': \ int(group['cleanup_timer_hits'])}) continue # SSO Cleanup Timer called: 0 m = p35.match(line) if m: group = m.groupdict() our_neighbor.update({'sso_cleanup_timer_called': \ int(group['sso_cleanup_timer_called'])}) continue # SSO Cleanup Action Taken: 0 m = p36.match(line) if m: group = m.groupdict() our_neighbor.update({'sso_cleanup_action_taken': \ int(group['sso_cleanup_action_taken'])}) continue # Pseudo pre-emptive process count: 239103 min/max/avg: 8/16/8 last: 0 ms ago m = p37.match(line) if m: group = m.groupdict() pseudo_preemtive_process = our_neighbor.setdefault \ ('pseudo_preemtive_process', {}) pseudo_preemtive_process.update({k: \ int(v) for k, v in group.items()}) continue # IPC Tx Failure Count: 0 m = p38.match(line) if m: group = m.groupdict() our_neighbor.update({'ipc_tx_failure_count': \ int(group['ipc_tx_failure_count'])}) continue # SSO Cleanup Timer called: 0 m = p39.match(line) if m: group = m.groupdict() our_neighbor.update({'ipc_rx_failure_count': \ int(group['ipc_rx_failure_count'])}) continue # Total Adjs Found: 1 m = p40.match(line) if m: group = m.groupdict() our_neighbor.update({'total_adjs_found': \ int(group['total_adjs_found'])}) continue # Holddown - negotiated: 510000 adjusted: 0 m = p41.match(line) if m: group = m.groupdict() our_neighbor.update({'holddown_negotiated': \ int(group['holddown_negotiated'])}) our_neighbor.update({'holddown_adjusted': \ int(group['holddown_adjusted'])}) continue return ret_dict
def cli(self, output=None): if output is None: out = self.device.execute(self.cli_command) else: out = output # initialize result dict result_dict = {} # Bundle-Ether1 p1 = re.compile(r'^Bundle-Ether(?P<bundle_id>[\d]+)$') # Port (rate) State Port ID Key System ID # Gi0/0/0/0 30s ascdA--- 0x000a,0x0001 0x0001 0x0064,00-1b-0c-10-5a-26 # Partner 30s as--A--- 0x8000,0x0004 0x0002 0x8000,00-0c-86-5e-68-23 p2 = re.compile( r'^(?P<interface>[\S]+) +(?P<rate>[\d]+)s +(?P<state>[\w-]+)' ' +(?P<port_id>[\w, ]+) +(?P<key>[\w]+)' ' +(?P<system_id>[\w\-, ]+)$') # Port Receive Period Selection Mux A Churn P Churn # Gi0/0/0/0 Current Slow Selected Distrib None None p3 = re.compile( r'^(?P<interface>[\S]+) +(?P<receive>[\w]+) +(?P<period>[\w]+) +(?P<selection>[\w]+)' ' +(?P<mux>[\w]+) +(?P<a_churn>[\w]+) +(?P<p_churn>[\w]+)$') for line in out.splitlines(): if line: line = line.strip() else: continue # Bundle-Ether1 m = p1.match(line) if m: group = m.groupdict() name = m.group() bundle_dict = result_dict.setdefault('interfaces', {}).setdefault(name, {}) bundle_dict.update({'name': name}) bundle_dict.update({'bundle_id': int(group['bundle_id'])}) continue # Port (rate) State Port ID Key System ID # Gi0/0/0/0 30s ascdA--- 0x000a,0x0001 0x0001 0x0064,00-1b-0c-10-5a-26 # Partner 30s as--A--- 0x8000,0x0004 0x0002 0x8000,00-0c-86-5e-68-23 m = p2.match(line) if m: group = m.groupdict() state = group['state'] if not group['interface'] == 'Partner': interface = Common.convert_intf_name(group['interface']) sub_dict = bundle_dict.setdefault('port', {}).setdefault( interface, {}) sub_dict.update({'interface': interface}) sub_dict.update( {'bundle_id': bundle_dict.get('bundle_id')}) bundle_dict.update( {'lacp_mode': 'active' if "A" in state else 'passive'}) else: sub_dict = bundle_dict.setdefault('port', {}).setdefault( interface, {}).setdefault('partner', {}) sub_dict.update({'rate': int(group['rate'])}) sub_dict.update({'state': state}) sub_dict.update({'port_id': group['port_id']}) sub_dict.update({'key': group['key']}) sub_dict.update({'system_id': group['system_id']}) sub_dict.update( {'aggregatable': True if 'a' in state else False}) sub_dict.update({ 'synchronization': 'in_sync' if 's' in state else 'out_sync' }) sub_dict.update( {'collecting': True if 'c' in state else False}) sub_dict.update( {'distributing': True if 'd' in state else False}) continue # Port Receive Period Selection Mux A Churn P Churn # Gi0/0/0/0 Current Slow Selected Distrib None None m = p3.match(line) if m: group = m.groupdict() interface = Common.convert_intf_name(group['interface']) port_dict = bundle_dict.setdefault('port', {}).setdefault( interface, {}) port_dict.update({'interface': interface}) port_dict.update({'receive': group['receive']}) port_dict.update({'period': group['period']}) port_dict.update({'selection': group['selection']}) port_dict.update({'mux': group['mux']}) port_dict.update({'a_churn': group['a_churn']}) port_dict.update({'p_churn': group['p_churn']}) continue return result_dict