bin/dnsleases

94 lines
2.2 KiB
Python
Executable File

#!/bin/python3
#
import subprocess
import time
class host(object):
def __init__(self):
self.mac = ''
self.ip = ''
self.vlan = 0
self.state = ''
self.hostname = ''
self.lease_tm = 0
def sortcriteria(h):
rv = h.hostname if h.hostname != '*' else '~'
rv += ".".join(["%03d" % int(v) for v in h.ip.split('.')])
return rv.lower()
def __str__(self):
return " * %-16s - %17s - %-10s - %15s - %s" % (self.ip, self.mac, self.state, time.asctime(time.localtime(self.lease_tm)), self.hostname)
class hostlist(dict):
def __init__(self):
dict.__init__(self)
def append(self, host):
if host.mac in self:
if host.state < self[host.mac].state:
self[host.mac] = host
else:
self[host.mac] = host
def vlan_list(self, vlan):
rv = hostlist()
for h in self.values():
if h.vlan == vlan:
rv.append(h)
return rv
def __str__(self):
entries = list(self.values())
entries.sort(key=host.sortcriteria)
rv = ""
for h in entries:
rv += str(h) + '\n'
return rv
hl = hostlist()
#
# ip n
#
for line in subprocess.check_output(['ip', 'n']).decode('utf-8').split('\n'):
data = line.split(" ")
h = host()
h.ip = data[0]
try:
h.vlan = int(h.ip.split('.')[2])
except IndexError:
pass
if len(data) == 6:
h. mac = data[4]
h.state = data[5]
else:
continue
hl.append(h)
#
# leases
#
with open('/var/lib/misc/dnsmasq.leases', 'r') as fh:
for line in fh.read().split('\n'):
data = line.split(' ')
if len(data) == 5:
h = hl.get(data[1], host())
h.lease_tm = int(data[0])
h.mac = data[1]
h.ip = data[2]
try:
h.vlan = int(h.ip.split('.')[2])
except IndexError:
pass
h.hostname = data[3]
if h.mac not in hl:
hl.append(h)
for vlan in [20, 30, 40, 50, 60, 90]:
print("Hosts in VLAN %d" % vlan)
print(hl.vlan_list(vlan))
print()