#!/usr/bin/env python3
# v0.3 - 2024-01-28 - Additional check for revDNS resolution
# v0.2 - 2022-08-28 - Added Python 3.9 compatibility
# v0.1 - 2021-10-14

# config
IFNAME = "eth0"
SLEEP = 0.15


# code
from itertools import chain
from progressbar import *
from time import sleep
import netifaces as ni
import socket
import sys


class Vhosts:
    def __init__(self):
        ipv4_l = ni.ifaddresses(IFNAME)[ni.AF_INET]
        ipv6_l = [
            af_inet6
            for af_inet6 in ni.ifaddresses(IFNAME)[ni.AF_INET6]
            if not af_inet6.get("addr").startswith("fe80::")
        ]
        ip_l = list(chain(ipv4_l[::-1], ipv6_l[::-1]))
        ip_l_len = len(ip_l)
        vhosts_l = []

        widgets = [
            RotatingMarker(),
            " ",
            FormatLabel("resolving hosts..."),
            " ",
            Bar(),
            " ",
            Percentage(),
            " ",
            Counter(format=f"[%d/{ip_l_len}]"),
        ]

        bar = ProgressBar(widgets=widgets, maxval=ip_l_len).start()
        for i, ip in enumerate(ip_l, 1):
            in_ptr = socket.gethostbyaddr(ip.get("addr"))
            # check if revDNS is resolved
            if len(in_ptr[2]) == 1:
                vhosts_l.append((in_ptr[0], ip.get("addr")))
            else:
                vhosts_l.append(("-", ip.get("addr")))

            bar.update(i)
            sleep(SLEEP)

        sys.stdout.write("\r\033[K")
        for vhost in vhosts_l:
            sys.stdout.write(f"* {vhost[0]}\r\t\t\t\t{vhost[1]}\n")


def main():
    vhosts = Vhosts()


if __name__ == "__main__":
    main()