예제 #1
0
파일: maintainer.py 프로젝트: nbashev/noc
 def get_rpsl(self):
     s = []
     s += ["mntner: %s" % self.maintainer]
     s += ["descr: %s" % self.description]
     if self.password:
         s += ["auth: MD5-PW %s" % md5crypt(self.password)]
     s += ["admins: %s" % x.nic_hdl for x in self.admins.all()]
     s += ["mnt-by: %s" % self.maintainer]
     if self.extra:
         s += [self.extra]
     return rpsl_format("\n".join(s))
예제 #2
0
 def get_rpsl(self):
     sep = "remark: %s" % ("-" * 72)
     s = []
     if self.rpsl_header:
         s += self.rpsl_header.split("\n")
     s += ["as-set: %s" % self.name]
     for m in self.member_list:
         s += ["members: %s" % m]
     if self.rpsl_footer:
         s += [sep]
         s += self.rpsl_footer.split("\n")
     return rpsl_format("\n".join(s))
예제 #3
0
 def get_rpsl(self):
     s = []
     if self.type == "R":
         s += ["role: %s" % self.person]
     else:
         s += ["person: %s" % self.person]
     s += ["nic-hdl: %s" % self.nic_hdl]
     s += rpsl_multiple("address", self.address)
     s += rpsl_multiple("phone", self.phone)
     s += rpsl_multiple("fax-no", self.fax_no)
     s += rpsl_multiple("email", self.email)
     if self.extra:
         s += [self.extra]
     return rpsl_format("\n".join(s))
예제 #4
0
    def rpsl(self):
        """
        RPSL for reverse zone. RPSL contains domain: and nserver:
        attributes

        :return: RPSL
        :rtype: String
        """
        if self.type == ZONE_FORWARD:
            return ""
        # Do not generate RPSL for private reverse zones
        if self.name.lower().endswith(".10.in-addr.arpa"):
            return ""
        n1, n2, n = self.name.lower().split(".", 2)
        if "16.172.in-addr.arpa" <= n <= "31.172.in-addr.arpa":
            return ""
        n1, n = self.name.lower().split(".", 1)
        if n == "168.192.in-addr.arpa":
            return ""
        s = ["domain: %s" % self.name] + ["nserver: %s" % ns for ns in self.ns_list]
        return rpsl_format("\n".join(s))
예제 #5
0
 def rpsl(self):
     ifaddrs = set()
     peers = {}
     for p in self.peer_set.all():
         ifaddrs.add(p.local_ip)
         peers[p.remote_ip, p.remote_asn] = None
         if p.local_backup_ip and p.remote_backup_ip:
             ifaddrs.add(p.local_backup_ip)
             peers[p.remote_backup_ip, p.remote_asn] = None
     s = []
     s += ["inet-rtr: %s" % self.hostname]
     s += ["local-as: AS%d" % self.local_as.asn]
     for ip in sorted(ifaddrs):
         if "/" in ip:
             ip, masklen = ip.split("/")
         else:
             masklen = "30"
         s += ["ifaddr: %s masklen %s" % (ip, masklen)]
     for remote_ip, remote_as in sorted(peers, key=lambda x: x[0]):
         if "/" in remote_ip:
             remote_ip, masklen = remote_ip.split("/")
         s += ["peer: BGP4 %s asno(%s)" % (remote_ip, remote_as)]
     return rpsl_format("\n".join(s))
예제 #6
0
def test_rpsl_multiple(config1, config2, config3, config4, expected):
    kv = []
    kv += rpsl_multiple(config1, config2)
    kv += rpsl_multiple(config3, config4)
    assert rpsl_format(kv, 1) == expected
예제 #7
0
def test_rpsl_format(config, expected):
    assert rpsl_format(config, 1) == expected
예제 #8
0
 def get_rpsl(self):
     sep = "remarks: %s" % ("-" * 72)
     s = []
     s += ["aut-num: AS%s" % self.asn]
     if self.as_name:
         s += ["as-name: %s" % self.as_name]
     if self.description:
         s += ["descr: %s" % x for x in self.description.split("\n")]
     s += ["org: %s" % self.organisation.organisation]
     # Add header remarks
     if self.header_remarks:
         s += ["remarks: %s" % x for x in self.header_remarks.split("\n")]
     # Find AS peers
     pg = (
         {}
     )  # Peer Group -> AS -> peering_point -> [(import, export, localpref, import_med, export_med, remark)]
     for peer in self.peer_set.filter(status="A"):
         if peer.peer_group not in pg:
             pg[peer.peer_group] = {}
         if peer.remote_asn not in pg[peer.peer_group]:
             pg[peer.peer_group][peer.remote_asn] = {}
         if peer.peering_point not in pg[peer.peer_group][peer.remote_asn]:
             pg[peer.peer_group][peer.remote_asn][peer.peering_point] = []
         to_skip = False
         e_import_med = peer.effective_import_med
         e_export_med = peer.effective_export_med
         for R in pg[peer.peer_group][peer.remote_asn][peer.peering_point]:
             p_import, p_export, localpref, import_med, export_med, remark = R
             if (peer.import_filter == p_import
                     and peer.export_filter == p_export
                     and e_import_med == import_med
                     and e_export_med == export_med):
                 to_skip = True
                 break
         if not to_skip:
             pg[peer.peer_group][peer.remote_asn][peer.peering_point] += [(
                 peer.import_filter,
                 peer.export_filter,
                 peer.effective_local_pref,
                 e_import_med,
                 e_export_med,
                 peer.rpsl_remark,
             )]
     # Build RPSL
     inverse_pref = config.peer.rpsl_inverse_pref_style
     for peer_group in pg:
         s += [sep]
         s += [
             "remarks: -- %s" % x
             for x in peer_group.description.split("\n")
         ]
         s += [sep]
         for asn in sorted(pg[peer_group]):
             add_at = len(pg[peer_group][asn]) != 1
             for pp in pg[peer_group][asn]:
                 for R in pg[peer_group][asn][pp]:
                     import_filter, export_filter, localpref, import_med, export_med, remark = R
                     # Prepend import and export with remark when given
                     if remark:
                         s += ["remarks: # %s" % remark]
                     # Build import statement
                     i_s = "import: from AS%d" % asn
                     if add_at:
                         i_s += " at %s" % pp.hostname
                     actions = []
                     if localpref:
                         pref = (65535 -
                                 localpref) if inverse_pref else localpref
                         actions += ["pref=%d;" % pref]
                     if import_med:
                         actions += ["med=%d;" % import_med]
                     if actions:
                         i_s += " action " + " ".join(actions)
                     i_s += " accept %s" % import_filter
                     s += [i_s]
                     # Build export statement
                     e_s = "export: to AS%d" % asn
                     if add_at:
                         e_s += " at %s" % pp.hostname
                     if export_med:
                         e_s += " action med=%d;" % export_med
                     e_s += " announce %s" % export_filter
                     s += [e_s]
     # Add contacts
     for c in self.administrative_contacts.order_by("nic_hdl"):
         s += ["admin-c: %s" % c.nic_hdl]
     for c in self.tech_contacts.order_by("nic_hdl"):
         s += ["tech-c: %s" % c.nic_hdl]
     # Add maintainers
     for m in self.maintainers.all():
         s += ["mnt-by: %s" % m.maintainer]
     for m in self.routes_maintainers.all():
         s += ["mnt-routes: %s" % m.maintainer]
     # Add footer remarks
     if self.footer_remarks:
         s += ["remarks: %s" % x for x in self.footer_remarks.split("\n")]
     return rpsl_format("\n".join(s))