Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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
Example #8
0
    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
Example #9
0
    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
Example #10
0
    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
Example #11
0
    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
Example #12
0
    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
Example #13
0
    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
Example #14
0
    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
Example #15
0
    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
Example #16
0
    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
Example #17
0
    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
Example #18
0
    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
Example #19
0
    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
Example #20
0
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
Example #21
0
    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
Example #22
0
    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
Example #23
0
    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
Example #24
0
    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
Example #25
0
    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
Example #26
0
    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
Example #27
0
    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
Example #28
0
    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
Example #29
0
    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
Example #30
0
    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