import dns.resolver
import ifcfg 
import json
import socket
import struct
import sys
import time

interfaces = ifcfg.interfaces()

def exit_device():
    print("Possible devices:", ", ".join(interfaces.keys()))
    sys.exit(1)


def gateway(device):
    with open("/proc/net/route") as fh:
        # skip header
        next(fh)
        for line in fh:
            routes = line.strip().split()
            if routes[0] == device:
                destination = socket.inet_ntoa(struct.pack("<L", int(routes[1], 16)))
                if destination != "0.0.0.0":
                    continue
                return socket.inet_ntoa(struct.pack("<L", int(routes[2], 16)))


try:
    DEVICE = sys.argv[1]
except IndexError:
    print("You need to give the device name as first argument!\n")
    exit_device()

HRN = {     # Human Readable Name
    'MAC': 'ether',
    'MTU': 'mtu',
    'IP': 'inet',
    'Netmask': 'netmask',
}

try:
    info = interfaces[DEVICE]
except KeyError:
    print("Unknown device:", DEVICE, "\n")
    exit_device()
try:
    dns_resolver = dns.resolver.Resolver()
except dns.resolver.NoResolverConfiguration:
    dns_server = []
else:
    dns_server = dns_resolver.nameservers

print('+' + 27 * '-' + '+')
print("|%9s: %s" % ('Device', DEVICE) + (16 - len(DEVICE)) * ' ' + '|')
print('+' + 27 * '-' + '+')
for name in HRN:
    print("%10s: %s" % (name, info[HRN[name]]))
print("%10s: %s" % ('Gateway', gateway(DEVICE)))

try:
    print("%10s: %s" % ("Domain", socket.getfqdn().split('.', 1)[1]))
except IndexError:
    print("%10s: None" % "Domain")
for i, dns in enumerate(dns_server):
    print("%10s: %s" % ("DNS_%d" % (i + 1), dns))