# coding: utf-8

import netaddr
import datetime
import lglass.bird
import lglass.route
import lglass.database.file

with open("routes.bird") as fh:
	routes = lglass.route.RoutingTable(lglass.bird.parse_routes(fh))

db = lglass.database.file.FileDatabase("/home/zorun/net.dn42.registry/data")

dn42_native = netaddr.IPNetwork("172.22.0.0/15")
db_nets = netaddr.IPSet()
route_nets = netaddr.IPSet()

for type, primary_key in db.list():
	if type == "inetnum":
		addr = netaddr.IPNetwork(primary_key)
		if addr not in dn42_native:
			continue
		obj = db.get(type, primary_key)
		if "BLK" in obj.getfirst("netname", ""):
			continue
		db_nets.add(addr)

for route in routes:
	if route.prefix not in dn42_native:
		continue
	route_nets.add(route.prefix)

all_nets = netaddr.IPSet()
all_nets.add(dn42_native)
announced_nets = route_nets
registered_nets = db_nets
unused_nets = all_nets - announced_nets
unregistered_nets = all_nets - registered_nets
free_nets = unused_nets.intersection(unregistered_nets)

print("DN42 network usage report")
print("Date: {}".format(datetime.datetime.now()))
print()

print("Statistics:")
print("  Total        {}".format(len(all_nets)))
print("-" * 80)
print("  Announced    {}\t{}%".format(len(announced_nets), len(announced_nets)/len(all_nets)*100))
print("  Registered   {}\t{}%".format(len(registered_nets), len(registered_nets)/len(all_nets)*100))
print("  Unregistered {}\t{}%".format(len(unregistered_nets), len(unregistered_nets)/len(all_nets)*100))
print("  Unused       {}\t{}%".format(len(unused_nets), len(unused_nets)/len(all_nets)*100))
print("  Free         {}\t{}%".format(len(free_nets), len(free_nets)/len(all_nets)*100))
print()

print("Announced netwoks:")
for net in announced_nets.iter_cidrs():
	print(" * {}".format(net))
print()

print("Registered netwoks:")
for net in registered_nets.iter_cidrs():
	print(" * {}".format(net))
print()

print("Unregistered netwoks:")
for net in unregistered_nets.iter_cidrs():
	print(" * {}".format(net))
print()

print("Unused netwoks:")
for net in unused_nets.iter_cidrs():
	print(" * {}".format(net))
print()

print("Free netwoks:")
for net in free_nets.iter_cidrs():
	print(" * {}".format(net))