from __future__ import print_function # This is a hack I use to generate my tinydns configuration # It serves as e test for converting from Perl Net::IP to # Python and IPy # Further Information might be available at http://c0re.jp/c0de/IPy/ # Hacked 2001 by drt@un.bewaff.net import sys sys.path.append('..') import IPy ns = {'ns.nerxs.com': '213.221.113.70', 'ns.dorsch.org': '195.143.234.25', 'ns.c0re.jp': '217.6.214.130'} print("# *** nameservers ***") for x in ns: print("=%s:%s" % (x, ns[x])) print("\n# *** domains ***") fd = open('domains') for x in fd.readlines(): if x[0] != '#': if x[-1] == '\n': x = x[:-1] (domain, owner) = x.split(':') print("'%s:Contact for this domain is %s" % (domain, owner)) for y in ns: print(".%s::%s" % (domain, y)) fd.close() print("\n# *** Networks ***") fd = open('networks') ip6map = {} rmap = {} nmap = {} for x in fd.readlines(): if x[-1] == '\n': x = x[:-1] if len(x) > 0 and x[0] != '#': nets = x.split(',') name = nets.pop(0) print("# Network: %s" % name) for y in nets: ip = IPy.IP(y) print("# Address range: %s (%s), %d addresses" % (ip.strCompressed(), ip.iptype(), ip.len())) print("=net.%s:%s" % (name, ip.net())) print("=broadcast.%s:%s" % (name, ip.broadcast())) if ip.version() == 4: for z in ip: # TODO reverse? nmap[z.int()] = name rmap[z.int()] = z.strBin() + "." + name else: # IPv6 for z in ns: for v in ip.reverseName(): print(".%s::%s" % (v, z)) ip6map[ip.strFullsize(0)] = name fd.close() print("\n# *** hosts ***") fd = open('hosts') for x in fd.readlines(): if x[-1] == '\n': x = x[:-1] if x != '' and x[0] != '#': if "@Z'.".find(x[0]) >= 0: print(x) else: if "=+'".find(x[0]) >= 0: i = x.split(':') rmap[IPy.IP(i[1]).int()] = '' print(x) else: x = x[1:] x += '||||' fields = x.split('|') name = fields.pop(0) if name[0] == '.': name = name[1:] v = fields.pop(0) ips = v.split(',') v = fields.pop(0) aliases = v.split(',') if aliases == ['']: aliases = [] admin = fields.pop() if admin == '': admin = 'technik@c0re.23.nu' v = fields.pop() mxes = v.split(',') if mxes == ['']: mxes = [] for y in ips: ip = IPy.IP(y) if ip.version() == 4: # IPv4 is easy if ip.int() not in nmap: print("*** warning: no network for %s (%s) - ignoring" % (y, name), file=sys.stderr) print("# no network for %s (%s)" % (y, name)) else: print("=%s.%s:%s" % (name, nmap[ip.int()], y)) print("'%s.%s:Host contact is %s" % (name, nmap[ip.int()], admin)) rmap[ip.int()] = '' for z in aliases: print("+%s:%s" % (z, ip)) print("'%s:Host contact is %s" % (z, admin)) else: #IPv6 here net = ip.strFullsize(0) net = net[:19] + ':0000:0000:0000:0000' if net in ip6map: print("*** warning: no network for %s (%s) - ignoring" % (ip, name), file=sys.stderr) print("# no network for %s (%s) - ignoring" % (ip, name)) else: print("6%s.%s:%s" % (name, ip6map[net], ip.strHex()[2:])) for z in aliases: print("3%s:%s" % (name, ip.strHex()[2:])) print("'%s:Host contact is %s" % (name, admin)) fd.close() print("\n# *** reverse lookup ***") for x in sorted(nmap): if rmap.get(x): print("=%s:%s" % (rmap[x], str(IPy.IP(x))))