Assignment06.py

 avatar
user_9560538
python
a year ago
4.5 kB
10
Indexable
# CSCI 355 Web Technology
#Summer 2024
#Assignment 6:  "Network Addressing and Forwarding"


#ACK - Class

from subprocess import check_output

# [1] Write a function execute_command(cmd) to execute a windows shell command ("cmd").
def exec_cmd(cmd):
    return check_output(cmd, shell=True)

# [2] Define a function get_routing_table by using the function from the previous step to run "route print" and then parsing the output into a table (2-D list).
def get_routing_table(routing_data):
    s = routing_data.decode()
    s = s[s.find("Destination"): s.find("Persistent Routes") - 1].replace("=", "").strip()
    lines = s.split('\n')
    headers = [get(lines[0], 0, 17), get(lines[0], 18, 35), get(lines[0], 36, 49), get(lines[0], 50, 60), get(lines[0], 61, 70)]
    print(headers)
    data = [[get(x, 0, 17), get(x, 18, 35), get(x, 36, 50), get(x, 51, 68), int(get(x, 69, 80))] for x in lines[1:]]
    for row in data:
        print(row)
    return headers, data

def get(s, i, j):
    return s[i:j+1].strip()

# [3] Prompt the user to enter an IPv4 address in dotted-decimal notation. If the IP address is 0 or empty, this is our cue to quit. Otherwise proceed to next step
def get_ip():
    ip = input("Enter IP Address in dotted-decimal notation: ") or "123.123.123.123"
    return ip

# [4] Define a function validate_address() to validate the address in two ways:
def validate_address(ip,verbose=False):
    octets = ip.split(".")
    if len(octets) != 4:
        print("Does not have four octets")
        return False
    for octet in octets:
        if not octet.isnumeric():
            print("Has a non-numeric octet: ", ip)
            return False
        if int(octet) < 0 or int(octet) > 255:
            print("Octet is out of 0-255: ", ip)
            return False
    return True

# [5] Define a function get_binary_address() to find the binary equivalent of an IP address in dotted decimal notation and use it on the inputted IP address.
def get_binary_address(ip_addr):
    binary = "".join([bin(int(octet))[2:].zfill(8) for octet in ip_addr.split('.')])
    return binary

# [6] Define a function bitwise_and() to do the “bitwise-AND” of two bit-strings.
def bitwise_and(bits1, bits2):
    res = ""
    n = min(len(bits1), len(bits2))
    for i in range(n):
        res += "1" if bits1[i] == "1" and bits2[i] == "1" else "0"
    return res

# [7] Define a function get_classful_address_type() to determine its class A thru E.
def get_class(binary_address):
    if binary_address.startswith('0'):
        return "A"
    elif binary_address.startswith('10'):
        return "B"
    elif binary_address.startswith('110'):
        return "C"
    elif binary_address.startswith('1110'):
        return "D"
    elif binary_address.startswith('1111'):
        return "E"
    else:
        return "Unknown"

def find_prefix_match(binary_and):
    return binary_and.find("0")

# [8] Define a function get_next_hop() to loop through the rows of the routing table from step [2] and determine the “Next Hop” for the user-inputted address.
def get_next_hop(table,dest_ip):
    dest_ip_bin = get_binary_address(dest_ip)
    best_row = None
    best_prefix = -1
    for row in table:
        table_dest = row[0]
        if validate_address(table_dest):
            table_dest_bin = get_binary_address(table_dest)
            binary_and = bitwise_and(dest_ip_bin, table_dest_bin)
            prefix = find_prefix_match(binary_and)
            if (prefix > best_prefix) or (prefix == best_prefix and row[4] < best_row[4]):
                best_prefix = prefix
                best_row = row
    return best_row,best_prefix

def process_ip(ip,table):
    print()
    print(f'IP: {ip}')

    ip_status = validate_address(ip, verbose=True)
    print(f'IP state is: {ip_status}')

    if ip_status:
        ip_binary = get_binary_address(ip)
        best_row, best_prefix = get_next_hop(table,ip)
        print(f'Binary is: {ip_binary}')
        print(f'Best row is: {best_row}' )
        print(f'Best prefix is: {best_prefix }' )
def main():
    routing_data = exec_cmd("route print")
    headers, data = get_routing_table(routing_data)
    ips_to_test = ["abc.def.ghi.jkl", "111-111-111-111", "613.613.613.613", "123.123.123", "225.225.225.225", "241.242.243.244", "127.0.0.1", "52.3.73.91", "216.239.63.255"]
    for ip in ips_to_test:
        process_ip(ip, data)

if __name__ == '__main__':
    main()


Editor is loading...
Leave a Comment