-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy patharpaname
executable file
·61 lines (58 loc) · 2.36 KB
/
arpaname
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python3
# arpaname -- convert IP addresses to their reverse-lookup domain names
#
# This is an improved version of BIND's 'arpaname' with support for CIDR
# prefixes, e.g. `arpaname 2001:db8::/48` outputs the domain for that network.
import argparse
import ipaddress
import sys
parser = argparse.ArgumentParser()
parser.add_argument("address", nargs="+")
args = parser.parse_args()
for arg in args.address:
if "/" in arg:
net = ipaddress.ip_network(arg)
rev = net.reverse_pointer.split(".")
if net.version == 6:
nibbles, extrabits = divmod(net.prefixlen, 4)
# IPv6Network.reverse_pointer returns the "/nn" as individual
# nibbles ["n", "n", "/"]. Discard it (i.e. keep only the number
# of nibbles we need, plus two for .ip6.arpa)
if extrabits != 0:
rev = rev[-(nibbles+3):]
start = int(rev[0], 16)
count = 2 ** (4 - extrabits)
for i in range(count):
rev[0] = "%x" % (start + i)
print(".".join(rev))
else:
rev = rev[-(nibbles+2):]
print(".".join(rev))
else:
octets, extrabits = divmod(net.prefixlen, 8)
# IPv4Network.reverse_pointer returns the whole "xy/nn" as the
# leftmost octet. For /32 we should trim it off; for sub-/24 cases
# use a dash as the RFC begrudgingly recommends; in other cases
# discard it.
if net.prefixlen == 32:
rev[0] = rev[0].split("/")[0]
print(".".join(rev))
elif net.prefixlen > 24:
# print a sub-/24 delegation in RFC 2317 style
print("arpaname: using RFC 2317 style sub-/24 delegation",
file=sys.stderr)
rev[0] = rev[0].replace("/", "-")
print(".".join(rev))
elif extrabits != 0:
rev = rev[-(octets+3):]
start = int(rev[0], 10)
count = 2 ** (8 - extrabits)
for i in range(count):
rev[0] = "%d" % (start + i)
print(".".join(rev))
else:
rev = rev[-(octets+2):]
print(".".join(rev))
else:
net = ipaddress.ip_address(arg)
print(net.reverse_pointer)