VLSM.py

VLSM.py
import os


def octToBin(oct):
    x = bin(int(oct))[2:]
    for i in range(8-len(x)):
        x = f"0{x}"
    return x


def addToStart(ip, num):
    for i in range(32-len(ip)):
        ip = f"{num}{ip}"
    return ip


def addToEnd(ip, num):
    for i in range(32-len(ip)):
        ip = f"{ip}{num}"
    return ip


def IPtoBin(ip):
    Bin = ""
    for oct in ip.split("."):
        Bin += f"{octToBin(oct)}"
    Bin = Bin[:35]
    return Bin


def IPbinToDec(ip):
    binIP = ""
    for oct in ip.split("."):
        x = oct.replace(".", "")
        num = int(x, base=2)
        binIP += f"{num}."
    return binIP[:-1]


def maskaAdres(mask):
    maska = ""
    for i in range(0, mask):
        maska += "1"
    for i in range(0, 32-mask):
        maska += "0"
    maska = binToIP(maska)
    return maska


def binToIP(bin):
    return f"{bin[0:8]}.{bin[8:16]}.{bin[16:24]}.{bin[24:32]}"


def fullPrint(name, ip):
    print(f"{name}\t{ip}\t{binToIP(IPtoBin(ip))}")


# Driver Code
if __name__ == '__main__':

    print("\nPodaj adres podsieci: ")
    print("np.: 192.168.1.0/24 \n")

    net = input()

    print("Podaj liczbę hostów: ")
    hosts = input()

    ip = net.split("/")[0]

    try:
        mask = int(net.split("/")[1])
    except:
        mask = 32
        hostsMax = 0
        while (int(hosts) > hostsMax and mask > 0 and mask <= 32):
            mask -= 1
            hostsMax = pow(2, 32-mask)-2
    hostsMax = pow(2, 32-mask)-2

    if int(hosts) <= int(hostsMax):
        fullPrint("\nadres IP", ip)

        maska = maskaAdres(mask)
        fullPrint(f"maska /{mask}", IPbinToDec(maska))

        binIP = ""
        for oct in ip.split("."):
            x = octToBin(oct)
            binIP += x

        siec = binIP[:mask]
        hosty = binIP[mask:]

        adresSieci = binToIP(addToEnd(siec, "0"))
        fullPrint(f"adres sieci ", IPbinToDec(adresSieci))

        broadcast = binToIP(addToEnd(siec, "1"))
        fullPrint(f"broadcast ", IPbinToDec(broadcast))

        print("Maksymalna liczba hostów: ", hostsMax)

        firstHost = addToEnd(siec, "0")[:-1]
        fullPrint(f"host min ", IPbinToDec(binToIP(f"{firstHost}1")))

        lastHost = addToEnd(siec, "1")[:-1]
        fullPrint(f"host max ", IPbinToDec(binToIP(f"{lastHost}0")))

    else:
        if (mask == 0):
            print("Tyle adresów nie zmieści się w żadnej podsieci")
        else:
            print(
                f"Tyle adresów nie zmieści się w tej podsieci, należy zmniejszyć maskę przynajmniej do {mask}")
    os.system("pause")