Beispiel #1
0
    def router(self):
        protocol = self.expect(Keyword)
        protocol_tag = taglib.tag("routing protocol", protocol.upper())
        protocol_tag.implied_by(taglib.env_tags.device, self.lineNum)

        if protocol == "bgp":
            local_as = self.expect(Literal)
            local_as_tag = taglib.as_number_tag(local_as, "local AS")
            local_as_lineNum = self.lineNum
            local_as_tag.implies(taglib.as_number_tag(local_as), local_as_lineNum)

            self.skipTo(EndOfCommand)
            while True:
            
                if self.accept(Token.EndOfMode) is not None:
                    return

                if self.accept(Whitespace) is not None:
                    continue
                    
                if self.accept(Comment) is not None:
                    self.skipTo(EndOfCommand)
                    continue
                
                try:
                    op = self.accept(Operator)
                    if op:
                        pass
                        
                    cmd = self.expect(Keyword)
                    if False:
                        pass

                    elif cmd == "neighbor-group":
                        self.bgp_neighbor_group(self.expect(Literal))
                    
                    elif cmd == "neighbor":
                        peer = self.expect(Literal)
                        peer_tag = taglib.ip_address_tag(peer, kind="%s peer" % protocol.upper())
                        peer_lineNum = self.lineNum
                        address_tag = taglib.ip_address_tag(peer)
                        peer_tag.implies(address_tag, self.lineNum)
                        
                        self.expect(EndOfCommand)
                        self.bgp_neighbor(protocol_tag, peer, peer_tag, peer_lineNum, local_as, local_as_tag, local_as_lineNum)
                    
                    elif cmd == "vrf":
                        self.expect(Literal)
                        self.expect(EndOfCommand)
    
                    else:
                        self.skipTo(EndOfCommand)

                except UnexpectedToken:
                    self.skipTo(EndOfCommand)
        elif protocol == "static":
            self.static()

        else:
            self.skipToEndOfMode()
Beispiel #2
0
    def test_as_number_tag(self):
        t = taglib.as_number_tag("1212")
        eq_(t.kind, "AS number")
        eq_(t.name, "1212")
        eq_(t.sort_name, "0000001212")

        t = taglib.as_number_tag("1212.4124")
        eq_(t.kind, "AS number")
        eq_(t.name, "1212.4124")
        eq_(t.sort_name, "0079433756")

        t = taglib.as_number_tag("1212.4124")
        eq_(t.kind, "AS number")
        eq_(t.name, "1212.4124")
        eq_(t.sort_name, "0079433756")
Beispiel #3
0
    def test_as_number_tag(self):
        t = taglib.as_number_tag("1212")
        eq_(t.kind, "AS number")
        eq_(t.name, "1212")
        eq_(t.sort_name, "0000001212")

        t = taglib.as_number_tag("1212.4124")
        eq_(t.kind, "AS number")
        eq_(t.name, "1212.4124")
        eq_(t.sort_name, "0079433756")

        t = taglib.as_number_tag("1212.4124")
        eq_(t.kind, "AS number")
        eq_(t.name, "1212.4124")
        eq_(t.sort_name, "0079433756")
Beispiel #4
0
    def bgp_neighbor(self, protocol_tag, peer, peer_tag, peer_lineNum,
                     top_local_as, top_local_as_tag, top_local_as_lineNum):
        local_as = top_local_as
        local_as_tag = top_local_as_tag
        local_as_lineNum = top_local_as_lineNum

        while True:

            if self.accept(Token.EndOfMode) is not None:
                if peer_as == local_as:
                    peering_relationship = "iBGP"
                else:
                    peering_relationship = "eBGP"

                peering_tag = taglib.tag("%s peering" % peering_relationship,
                                         "%s %s" % (device_tag.name, peer),
                                         sort_name="%s %s" %
                                         (device_tag.name, peer_tag.sort_name))
                peering_tag.implies(protocol_tag, peer_lineNum)
                peering_tag.implied_by(device_tag, peer_lineNum)
                local_as_tag.implied_by(peering_tag, peer_lineNum)
                peer_as_tag.implied_by(peering_tag, peer_lineNum)

                remote_peer_tag = taglib.ip_address_tag(peer,
                                                        kind="remote %s peer" %
                                                        protocol_tag.name)
                remote_peer_tag.implied_by(peering_tag, peer_lineNum)
                remote_peer_tag.implies(peer_tag, peer_lineNum)
                return

            if self.accept(Whitespace) is not None:
                continue

            if self.accept(Comment) is not None:
                self.skipTo(EndOfCommand)
                continue

            try:
                op = self.accept(Operator)
                if op:
                    pass

                cmd = self.expect(Keyword)
                if False:
                    pass

                elif cmd == "local-as":
                    local_as = self.expect(Literal)
                    local_as_lineNum = self.lineNum
                    local_as_tag = taglib.as_number_tag(local_as, "local AS")
                    local_as_tag.implies(taglib.as_number_tag(local_as),
                                         local_as_lineNum)
                    self.expect(EndOfCommand)

                elif cmd == "remote-as":
                    peer_as = self.expect(Literal)
                    peer_as_lineNum = self.lineNum
                    peer_as_tag = taglib.as_number_tag(peer_as, "remote AS")
                    peer_as_tag.implies(taglib.as_number_tag(peer_as),
                                        peer_as_lineNum)
                    self.expect(EndOfCommand)

                elif cmd == "use":
                    subcmd = self.expect(Keyword)
                    if subcmd == "neighbor-group":
                        group = self.expect(Literal)
                        group_local_as = bgp_group_local_as.get(group, None)
                        if group_local_as is not None:
                            local_as = group_local_as
                            local_as_lineNum = bgp_group_local_as_lineNum.get(
                                group, None)
                            local_as_tag = taglib.as_number_tag(
                                local_as, "local AS")
                            local_as_tag.implies(
                                taglib.as_number_tag(local_as),
                                local_as_lineNum)

                        group_peer_as = bgp_group_remote_as.get(group, None)
                        if group_peer_as is not None:
                            peer_as = group_peer_as
                            peer_as_lineNum = bgp_group_remote_as_lineNum.get(
                                group, None)
                            peer_as_tag = taglib.as_number_tag(
                                peer_as, "remote AS")
                            peer_as_tag.implies(taglib.as_number_tag(peer_as),
                                                peer_as_lineNum)

                    self.skipTo(EndOfCommand)

                elif cmd == "address-family":
                    self.bgp_neighbor_address_family()

                else:
                    self.skipTo(EndOfCommand)

            except UnexpectedToken:
                self.skipTo(EndOfCommand)
Beispiel #5
0
    def router(self):
        protocol = self.expect(Keyword)
        protocol_tag = taglib.tag("routing protocol", protocol.upper())
        protocol_tag.implied_by(taglib.env_tags.device, self.lineNum)

        if protocol == "bgp":
            local_as = self.expect(Literal)
            local_as_tag = taglib.as_number_tag(local_as, "local AS")
            local_as_lineNum = self.lineNum
            local_as_tag.implies(taglib.as_number_tag(local_as),
                                 local_as_lineNum)

            self.skipTo(EndOfCommand)
            while True:

                if self.accept(Token.EndOfMode) is not None:
                    return

                if self.accept(Whitespace) is not None:
                    continue

                if self.accept(Comment) is not None:
                    self.skipTo(EndOfCommand)
                    continue

                try:
                    op = self.accept(Operator)
                    if op:
                        pass

                    cmd = self.expect(Keyword)
                    if False:
                        pass

                    elif cmd == "neighbor-group":
                        self.bgp_neighbor_group(self.expect(Literal))

                    elif cmd == "neighbor":
                        peer = self.expect(Literal)
                        peer_tag = taglib.ip_address_tag(peer,
                                                         kind="%s peer" %
                                                         protocol.upper())
                        peer_lineNum = self.lineNum
                        address_tag = taglib.ip_address_tag(peer)
                        peer_tag.implies(address_tag, self.lineNum)

                        self.expect(EndOfCommand)
                        self.bgp_neighbor(protocol_tag, peer, peer_tag,
                                          peer_lineNum, local_as, local_as_tag,
                                          local_as_lineNum)

                    elif cmd == "vrf":
                        self.expect(Literal)
                        self.expect(EndOfCommand)

                    else:
                        self.skipTo(EndOfCommand)

                except UnexpectedToken:
                    self.skipTo(EndOfCommand)
        elif protocol == "static":
            self.static()

        else:
            self.skipToEndOfMode()
Beispiel #6
0
    def router(self):
        protocol = self.expect(Keyword)
        protocol_tag = taglib.tag("routing protocol", protocol.upper())
        protocol_tag.implied_by(taglib.env_tags.device, self.lineNum)
        
        if protocol == "bgp":
            bgp_router_id = None
            bgp_router_id_lineNum = None
            local_as = self.expect(Literal)
            local_as_tag = taglib.as_number_tag(local_as, "local AS")
            local_as_lineNum = self.lineNum
            local_as_tag.implies(taglib.as_number_tag(local_as), local_as_lineNum)
            
            self.skipTo(EndOfCommand)
            while True:
                disable = False
                
                if self.accept(Whitespace) is None:
                    for peer, peerdict in peer_dicts.items():
                        bgp_local_addr = None
                        bgp_local_addr_lineNum = None
                        peer_lineNum = peerdict.get("peer_lineNum", None)
                        
                        peer_group = peerdict.get("peer_group", None)
                        if peer_group:
                            peer_group_dict = peer_groups.get(peer_group, None)
                        else:
                            peer_group_dict = None
                            
                        peer_as = peerdict.get("peer_as", None)
                        if peer_as is not None:
                            peer_as_lineNum = peerdict.get("peer_as_lineNum", None)
                        elif peer_group_dict:
                            peer_as = peer_group_dict.get("peer_as", None);
                            peer_as_lineNum = peer_group_dict.get("peer_as_lineNum", None)
                            
                        if peer_as is None:
                            continue

                        update_source = peerdict.get("update_source", None)
                        update_source_lineNum = peerdict.get("update_source_lineNum", None)
                        if update_source is None and peer_group_dict is not None:
                            update_source = peer_group_dict.get("update_source", None)
                            update_source_lineNum = peer_group_dict.get("update_source_lineNum", None)
                            
                        peer_ip = IPy.IP(peer)
                        if update_source is None:
                            if peer_ip.version() == 4 and bgp_router_id:
                                bgp_local_addr = bgp_router_id
                                bgp_local_addr_lineNum = bgp_router_id_lineNum
                            else:
                                update_source = 'Loopback0'
                                update_source_lineNum = 0
                            
                        if update_source is not None:
                            bgp_local_addr_lineNum = update_source_lineNum
                            if peer_ip.version() == 4:
                                bgp_local_addr = if_addrs4.get(update_source)
                            elif peer_ip.version() == 6:
                                bgp_local_addr = if_addrs6.get(update_source)
                        
                        peer_tag = taglib.ip_address_tag(peer, kind="%s peer" % protocol.upper())
                        
                        address_tag = taglib.ip_address_tag(peer)
                        peer_tag.implies(address_tag, peer_lineNum)
                        
                        peer_as_tag = taglib.as_number_tag(peer_as, "remote AS")
                        peer_as_tag.implies(taglib.as_number_tag(peer_as), peer_as_lineNum)
                        
                        if peer_as == local_as:
                            peering_relationship = "iBGP"
                        else:
                            peering_relationship = "eBGP"

                        peering_tag = taglib.tag("%s peering" % peering_relationship,
                                                 "%s %s" % (device_tag.name, peer),
                                                 sort_name="%s %s" % (device_tag.name, peer_tag.sort_name))
                        peering_tag.implies(protocol_tag, peer_lineNum)
                        peering_tag.implied_by(device_tag, peer_lineNum)
                        local_as_tag.implied_by(peering_tag, peer_lineNum)
                        peer_as_tag.implied_by(peering_tag, peer_lineNum)
                        
                        if bgp_local_addr is not None:
                            peer2_tag = taglib.ip_address_tag(bgp_local_addr, kind="%s peer" % protocol.upper())
                            address2_tag = taglib.ip_address_tag(bgp_local_addr)
                            peer2_tag.implies(address2_tag, bgp_local_addr_lineNum)
                            local_peer_tag = taglib.ip_address_tag(bgp_local_addr, kind="local %s peer" % protocol.upper())
                            local_peer_tag.implied_by(peering_tag, bgp_local_addr_lineNum)
                            local_peer_tag.implies(peer2_tag, bgp_local_addr_lineNum)
                            
                        remote_peer_tag = taglib.ip_address_tag(peer, kind="remote %s peer" % protocol.upper())
                        remote_peer_tag.implied_by(peering_tag, peer_lineNum)
                        remote_peer_tag.implies(peer_tag, peer_lineNum)

                    return

                if self.accept(Comment) is not None:
                    self.skipTo(EndOfCommand)
                    continue
                
                try:
                    op = self.accept(Operator)
                    if op and op == "no":
                        disable = True
                        
                    cmd = self.expect(Keyword)

                    if cmd == "neighbor":
                        peer_group = None
                        peer = self.accept(Number)
                        if peer is None:
                            # if no address, then its probably a peer group
                            peer_group = self.expect(String)
                            peerdict = peer_groups.get(peer_group, None)
                            if peerdict is None:
                                peerdict = {}
                                peer_groups[peer_group] = peerdict
                        else:
                            peerdict = peer_dicts.get(peer, None)
                            if peerdict is None:
                                peerdict = {}
                                peerdict["peer"] = peer
                                peerdict["peer_lineNum"] = self.lineNum
                                peerdict["disable"] = disable
                                peer_dicts[peer] = peerdict
                            
                        subcmd = self.expect(Keyword)
                        if subcmd == "remote-as":
                            peerdict["peer_as"] = self.expect(Literal)
                            peerdict["peer_as_lineNum"] = self.lineNum
                            
                        elif subcmd == "peer-group":
                            if peer is not None:
                                peerdict["peer_group"] = self.accept(Literal)
                            
                        elif subcmd == "update-source":
                            peerdict["update_source"] = self.expect(Literal)
                            peerdict["update_source_lineNum"] = self.lineNum
                            
                    
                    elif cmd == "bgp":
                        subcmd = self.expect(Keyword)
                        if subcmd == "router-id":
                            bgp_router_id = self.accept(Literal)
                            bgp_router_id_lineNum = self.lineNum
                        else:
                            self.skipTo(EndOfCommand)
                    
                    elif cmd == "router-id":
                        bgp_router_id = self.accept(Literal)
                        bgp_router_id_lineNum = self.lineNum

                    self.skipTo(EndOfCommand)

                except UnexpectedToken:
                    self.skipTo(EndOfCommand)
                    
        self.skipTo(EndOfCommand)
def tag_protocols(top):
    
    protocol = "BGP"
    routing_options_local_as_list = top.xpath("routing-options/autonomous-system/as-number")
    routing_options_router_id_list = top.xpath("routing-options/router-id")
    
    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for group_elem in protocol_elem.xpath("group"):
            name_elem = group_elem.xpath("name")[0]
            group_tag = taglib.tag("%s group" % protocol,
                                   "%s %s" % (device_tag.name, name_elem.text))
            group_tag.implied_by(device_tag, name_elem.sourceline)
            for peer_name_elem in group_elem.xpath("neighbor/name"): 
                local_address_elem_list = peer_name_elem.xpath("ancestor::*/local-address")
                if local_address_elem_list:
                    local_address_elem = local_address_elem_list[0]
                elif routing_options_router_id_list:
                    local_address_elem = routing_options_router_id_list[0]
                
                local_elem_list = peer_name_elem.xpath("ancestor::*/local-as/as-number")
                if local_elem_list:
                    local_elem = local_elem_list[0]
                elif routing_options_local_as_list:
                    local_elem = routing_options_local_as_list[0]
                
                if local_elem is not None:
                    localasn_tag = taglib.as_number_tag(local_elem.text, "local AS")
                    
                    localasn_tag.implies(taglib.as_number_tag(local_elem.text),
                                         local_elem.sourceline)
                 
                asn_elem_list = peer_name_elem.xpath("ancestor::*/peer-as")
                if asn_elem_list:
                    asn_elem = asn_elem_list[0]
                else:
                    asn_elem = local_elem
                    
                asn_tag = taglib.as_number_tag(asn_elem.text, kind="remote AS")
                asn_tag.implies(taglib.as_number_tag(asn_elem.text),
                                asn_elem.sourceline)
                
                if asn_elem.text == local_elem.text:
                    peering_relationship = "iBGP"
                else:
                    peering_relationship = "eBGP"
                
                address_tag = taglib.ip_address_tag(peer_name_elem.text)
                peering_tag = taglib.tag("%s peering" % peering_relationship,
                                         "%s %s" % (device_tag.name, peer_name_elem.text),
                                         sort_name="%s %s" % (device_tag.name, address_tag.sort_name))
                peering_tag.implies(protocol_tag, peer_name_elem.sourceline)
                peering_tag.implied_by(device_tag, peer_name_elem.sourceline)
                peering_tag.implied_by(group_tag, peer_name_elem.sourceline)
                
                asn_tag.implied_by(peering_tag, asn_elem.sourceline)
                localasn_tag.implied_by(peering_tag, local_elem.sourceline)

                peer_tag = taglib.ip_address_tag(peer_name_elem.text, kind="%s peer" % protocol)
                peer_tag.implies(address_tag, peer_name_elem.sourceline)
                
                if local_address_elem is not None:
                    peer2_tag = taglib.ip_address_tag(local_address_elem.text, kind="%s peer" % protocol.upper())
                    address2_tag = taglib.ip_address_tag(local_address_elem.text)
                    peer2_tag.implies(address2_tag, local_address_elem.sourceline)
                    local_peer_tag = taglib.ip_address_tag(local_address_elem.text,
                                                           kind="local %s peer" % protocol)
                    local_peer_tag.implied_by(peering_tag, local_address_elem.sourceline)
                    local_peer_tag.implies(peer2_tag, peer_name_elem.sourceline)
                
                remote_peer_tag = taglib.ip_address_tag(peer_name_elem.text,
                                                          kind="remote %s peer" % protocol)
                remote_peer_tag.implied_by(peering_tag, peer_name_elem.sourceline)
                remote_peer_tag.implies(peer_tag, peer_name_elem.sourceline)
                
        
    protocol = "MSDP"
    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for group_elem in protocol_elem.xpath("group"):
            name_elem = group_elem.xpath("name")[0]
            group_tag = taglib.tag("%s group" % protocol,
                                   "%s %s" % (device_tag.name, name_elem.text))
            group_tag.implied_by(device_tag, name_elem.sourceline)
            for peer_name_elem in group_elem.xpath("peer/name"):
                peer_tag = taglib.tag("%s peer" % protocol, peer_name_elem.text)
                address_tag = taglib.ip_address_tag(peer_name_elem.text)
                peer_tag.implies(address_tag, peer_name_elem.sourceline)
                peer_tag.implied_by(group_tag, peer_name_elem.sourceline)
                peer_tag.implies(protocol_tag, peer_name_elem.sourceline)

    ospf_version_dict = {'ospf':'OSPF', 'ospf3':'OSPFv3'}
    for protocol_key, protocol in ospf_version_dict.items():
        protocol_elem_list = top.xpath("protocols/%s" % protocol_key)
        if not protocol_elem_list:
            continue
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for area_elem in protocol_elem.xpath("area"):
            name_elem = area_elem.xpath("name")[0]
            area_tag = taglib.tag("%s area" % protocol, name_elem.text)
            area_tag.implies(protocol_tag, name_elem.sourceline)
            for interface_name_elem in area_elem.xpath("interface/name"):
                if interface_name_elem.text == "all":
                    interface_tags = all_interface_tags
                else:
                    interface_tags = [
                        taglib.tag("interface", 
                                   "%s %s" % (device_tag.name, 
                                              interface_name_elem.text))]
                for t in interface_tags:
                    t.implies(area_tag, interface_name_elem.sourceline)

    protocol = "PIM"
    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for interface_name_elem in protocol_elem.xpath("interface/name"):
            if interface_name_elem.text == "all":
                interface_tags = all_interface_tags
            else:
                interface_tags = [
                    taglib.tag("interface", 
                               "%s %s" % (device_tag.name, 
                                          interface_name_elem.text))]
            for t in interface_tags:
                t.implies(protocol_tag, interface_name_elem.sourceline)

    for protocol in ("RIP", "RIPng"):
        protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
        if not protocol_elem_list:
            continue
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for group_elem in protocol_elem.xpath("group"):
            name_elem = group_elem.xpath("name")[0]
            group_tag = taglib.tag("%s group" % protocol,name_elem.text)
            group_tag.implies(protocol_tag, name_elem.sourceline)
            for interface_name_elem in group_elem.xpath("neighbor/name"):
                if interface_name_elem.text == "all":
                    interface_tags = all_interface_tags
                else:
                    interface_tags = [
                        taglib.tag("interface", 
                                   "%s %s" % (device_tag.name, 
                                              interface_name_elem.text))]
                for t in interface_tags:
                    t.implies(group_tag, interface_name_elem.sourceline)

    protocol = "router-advertisement"
    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for interface_elem in protocol_elem.xpath("interface"):
            interface_name_elem = interface_elem.xpath("name")[0]
            if interface_name_elem.text == "all":
                interface_tags = all_interface_tags
            else:
                interface_tags = [
                    taglib.tag("interface", 
                               "%s %s" % (device_tag.name, 
                                          interface_name_elem.text))]
            for t in interface_tags:
                ratag = taglib.tag("ND router advertisement server", 
                                    "%s %s" % (device_tag.name, interface_name_elem.text))
                ratag.implied_by(t, interface_name_elem.sourceline);
                
                for prefix_name_elem in interface_elem.xpath("prefix/name"):
                    ratag.implies(taglib.ip_subnet_tag(prefix_name_elem.text),
                                    prefix_name_elem.sourceline)
def tag_protocols(top):

    protocol = "BGP"
    routing_options_local_as_list = top.xpath(
        "routing-options/autonomous-system/as-number")
    routing_options_router_id_list = top.xpath("routing-options/router-id")

    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for group_elem in protocol_elem.xpath("group"):
            name_elem = group_elem.xpath("name")[0]
            group_tag = taglib.tag("%s group" % protocol,
                                   "%s %s" % (device_tag.name, name_elem.text))
            group_tag.implied_by(device_tag, name_elem.sourceline)
            for peer_name_elem in group_elem.xpath("neighbor/name"):
                local_address_elem_list = peer_name_elem.xpath(
                    "ancestor::*/local-address")
                if local_address_elem_list:
                    local_address_elem = local_address_elem_list[0]
                elif routing_options_router_id_list:
                    local_address_elem = routing_options_router_id_list[0]

                local_elem_list = peer_name_elem.xpath(
                    "ancestor::*/local-as/as-number")
                if local_elem_list:
                    local_elem = local_elem_list[0]
                elif routing_options_local_as_list:
                    local_elem = routing_options_local_as_list[0]

                if local_elem is not None:
                    localasn_tag = taglib.as_number_tag(
                        local_elem.text, "local AS")

                    localasn_tag.implies(taglib.as_number_tag(local_elem.text),
                                         local_elem.sourceline)

                asn_elem_list = peer_name_elem.xpath("ancestor::*/peer-as")
                if asn_elem_list:
                    asn_elem = asn_elem_list[0]
                else:
                    asn_elem = local_elem

                asn_tag = taglib.as_number_tag(asn_elem.text, kind="remote AS")
                asn_tag.implies(taglib.as_number_tag(asn_elem.text),
                                asn_elem.sourceline)

                if asn_elem.text == local_elem.text:
                    peering_relationship = "iBGP"
                else:
                    peering_relationship = "eBGP"

                address_tag = taglib.ip_address_tag(peer_name_elem.text)
                peering_tag = taglib.tag(
                    "%s peering" % peering_relationship,
                    "%s %s" % (device_tag.name, peer_name_elem.text),
                    sort_name="%s %s" %
                    (device_tag.name, address_tag.sort_name))
                peering_tag.implies(protocol_tag, peer_name_elem.sourceline)
                peering_tag.implied_by(device_tag, peer_name_elem.sourceline)
                peering_tag.implied_by(group_tag, peer_name_elem.sourceline)

                asn_tag.implied_by(peering_tag, asn_elem.sourceline)
                localasn_tag.implied_by(peering_tag, local_elem.sourceline)

                peer_tag = taglib.ip_address_tag(peer_name_elem.text,
                                                 kind="%s peer" % protocol)
                peer_tag.implies(address_tag, peer_name_elem.sourceline)

                if local_address_elem is not None:
                    peer2_tag = taglib.ip_address_tag(local_address_elem.text,
                                                      kind="%s peer" %
                                                      protocol.upper())
                    address2_tag = taglib.ip_address_tag(
                        local_address_elem.text)
                    peer2_tag.implies(address2_tag,
                                      local_address_elem.sourceline)
                    local_peer_tag = taglib.ip_address_tag(
                        local_address_elem.text,
                        kind="local %s peer" % protocol)
                    local_peer_tag.implied_by(peering_tag,
                                              local_address_elem.sourceline)
                    local_peer_tag.implies(peer2_tag,
                                           peer_name_elem.sourceline)

                remote_peer_tag = taglib.ip_address_tag(peer_name_elem.text,
                                                        kind="remote %s peer" %
                                                        protocol)
                remote_peer_tag.implied_by(peering_tag,
                                           peer_name_elem.sourceline)
                remote_peer_tag.implies(peer_tag, peer_name_elem.sourceline)

    protocol = "MSDP"
    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for group_elem in protocol_elem.xpath("group"):
            name_elem = group_elem.xpath("name")[0]
            group_tag = taglib.tag("%s group" % protocol,
                                   "%s %s" % (device_tag.name, name_elem.text))
            group_tag.implied_by(device_tag, name_elem.sourceline)
            for peer_name_elem in group_elem.xpath("peer/name"):
                peer_tag = taglib.tag("%s peer" % protocol,
                                      peer_name_elem.text)
                address_tag = taglib.ip_address_tag(peer_name_elem.text)
                peer_tag.implies(address_tag, peer_name_elem.sourceline)
                peer_tag.implied_by(group_tag, peer_name_elem.sourceline)
                peer_tag.implies(protocol_tag, peer_name_elem.sourceline)

    ospf_version_dict = {'ospf': 'OSPF', 'ospf3': 'OSPFv3'}
    for protocol_key, protocol in ospf_version_dict.items():
        protocol_elem_list = top.xpath("protocols/%s" % protocol_key)
        if not protocol_elem_list:
            continue
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for area_elem in protocol_elem.xpath("area"):
            name_elem = area_elem.xpath("name")[0]
            area_tag = taglib.tag("%s area" % protocol, name_elem.text)
            area_tag.implies(protocol_tag, name_elem.sourceline)
            for interface_name_elem in area_elem.xpath("interface/name"):
                if interface_name_elem.text == "all":
                    interface_tags = all_interface_tags
                else:
                    interface_tags = [
                        taglib.tag(
                            "interface", "%s %s" %
                            (device_tag.name, interface_name_elem.text))
                    ]
                for t in interface_tags:
                    t.implies(area_tag, interface_name_elem.sourceline)

    protocol = "PIM"
    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for interface_name_elem in protocol_elem.xpath("interface/name"):
            if interface_name_elem.text == "all":
                interface_tags = all_interface_tags
            else:
                interface_tags = [
                    taglib.tag(
                        "interface",
                        "%s %s" % (device_tag.name, interface_name_elem.text))
                ]
            for t in interface_tags:
                t.implies(protocol_tag, interface_name_elem.sourceline)

    for protocol in ("RIP", "RIPng"):
        protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
        if not protocol_elem_list:
            continue
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for group_elem in protocol_elem.xpath("group"):
            name_elem = group_elem.xpath("name")[0]
            group_tag = taglib.tag("%s group" % protocol, name_elem.text)
            group_tag.implies(protocol_tag, name_elem.sourceline)
            for interface_name_elem in group_elem.xpath("neighbor/name"):
                if interface_name_elem.text == "all":
                    interface_tags = all_interface_tags
                else:
                    interface_tags = [
                        taglib.tag(
                            "interface", "%s %s" %
                            (device_tag.name, interface_name_elem.text))
                    ]
                for t in interface_tags:
                    t.implies(group_tag, interface_name_elem.sourceline)

    protocol = "router-advertisement"
    protocol_elem_list = top.xpath("protocols/%s" % protocol.lower())
    if protocol_elem_list:
        protocol_elem = protocol_elem_list[0]
        protocol_tag = taglib.tag("routing protocol", protocol)
        protocol_tag.used(protocol_elem.sourceline)
        for interface_elem in protocol_elem.xpath("interface"):
            interface_name_elem = interface_elem.xpath("name")[0]
            if interface_name_elem.text == "all":
                interface_tags = all_interface_tags
            else:
                interface_tags = [
                    taglib.tag(
                        "interface",
                        "%s %s" % (device_tag.name, interface_name_elem.text))
                ]
            for t in interface_tags:
                ratag = taglib.tag(
                    "ND router advertisement server",
                    "%s %s" % (device_tag.name, interface_name_elem.text))
                ratag.implied_by(t, interface_name_elem.sourceline)

                for prefix_name_elem in interface_elem.xpath("prefix/name"):
                    ratag.implies(taglib.ip_subnet_tag(prefix_name_elem.text),
                                  prefix_name_elem.sourceline)
Beispiel #9
0
    def bgp_neighbor(self, protocol_tag, peer, peer_tag, peer_lineNum, top_local_as, top_local_as_tag, top_local_as_lineNum):
        local_as = top_local_as
        local_as_tag = top_local_as_tag
        local_as_lineNum = top_local_as_lineNum
        
        while True:
        
            if self.accept(Token.EndOfMode) is not None:
                if peer_as == local_as:
                    peering_relationship = "iBGP"
                else:
                    peering_relationship = "eBGP"
                
                peering_tag = taglib.tag("%s peering" % peering_relationship,
                                         "%s %s" % (device_tag.name, peer),
                                         sort_name="%s %s" % (device_tag.name, peer_tag.sort_name))
                peering_tag.implies(protocol_tag, peer_lineNum)
                peering_tag.implied_by(device_tag, peer_lineNum)
                local_as_tag.implied_by(peering_tag, peer_lineNum)
                peer_as_tag.implied_by(peering_tag, peer_lineNum)
                                
                remote_peer_tag = taglib.ip_address_tag(peer, kind="remote %s peer" % protocol_tag.name)
                remote_peer_tag.implied_by(peering_tag, peer_lineNum)
                remote_peer_tag.implies(peer_tag, peer_lineNum)
                return

            if self.accept(Whitespace) is not None:
                continue
                    
            if self.accept(Comment) is not None:
                self.skipTo(EndOfCommand)
                continue
            
            try:
                op = self.accept(Operator)
                if op:
                    pass
                    
                cmd = self.expect(Keyword)
                if False:
                    pass
                
                elif cmd == "local-as":
                    local_as = self.expect(Literal)
                    local_as_lineNum = self.lineNum
                    local_as_tag = taglib.as_number_tag(local_as, "local AS")
                    local_as_tag.implies(taglib.as_number_tag(local_as), local_as_lineNum)
                    self.expect(EndOfCommand)
                    
                elif cmd == "remote-as":
                    peer_as = self.expect(Literal)
                    peer_as_lineNum = self.lineNum
                    peer_as_tag = taglib.as_number_tag(peer_as, "remote AS")
                    peer_as_tag.implies(taglib.as_number_tag(peer_as), peer_as_lineNum)
                    self.expect(EndOfCommand)
                    
                elif cmd == "use":
                    subcmd = self.expect(Keyword)
                    if subcmd == "neighbor-group":
                        group = self.expect(Literal)
                        group_local_as = bgp_group_local_as.get(group, None)
                        if group_local_as is not None:
                            local_as = group_local_as
                            local_as_lineNum = bgp_group_local_as_lineNum.get(group, None)
                            local_as_tag = taglib.as_number_tag(local_as, "local AS")
                            local_as_tag.implies(taglib.as_number_tag(local_as), local_as_lineNum)
                        
                        group_peer_as = bgp_group_remote_as.get(group, None)
                        if group_peer_as is not None:
                            peer_as = group_peer_as
                            peer_as_lineNum = bgp_group_remote_as_lineNum.get(group, None)
                            peer_as_tag = taglib.as_number_tag(peer_as, "remote AS")
                            peer_as_tag.implies(taglib.as_number_tag(peer_as), peer_as_lineNum)
                        
                    self.skipTo(EndOfCommand)

                elif cmd == "address-family":
                    self.bgp_neighbor_address_family()
                    
                else:
                    self.skipTo(EndOfCommand)

            except UnexpectedToken:
                self.skipTo(EndOfCommand)