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))
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))
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))
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))
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))
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
def test_rpsl_format(config, expected): assert rpsl_format(config, 1) == expected
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))