ipcalc для python

import re
print('Введите ip адрес\n'
      'формат адреса x.x.x.x/y\n'
      ' где y - маска в десятичном формате')
print()
decimal = input('Введите адрес: ')
while re.fullmatch(r'((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(3[0-2]|[12][0-9]|[1-9])$', decimal) == None:
    print('Неверный адрес')
    decimal = input('Введите корректный адрес: ')
print()

ipaddr = decimal.split('/')[0]
mask = decimal.split('/')[1]

separet_ipaddr = ipaddr.split('.')
octets_ip_0 = bin(int(separet_ipaddr[0]))[2:]
octets_ip_1 = bin(int(separet_ipaddr[1]))[2:]
octets_ip_2 = bin(int(separet_ipaddr[2]))[2:]
octets_ip_3 = bin(int(separet_ipaddr[3]))[2:]


list_for_fully_empty = [octets_ip_0, octets_ip_1, octets_ip_2, octets_ip_3]
binars_ip_octets_group = []
for i in list_for_fully_empty:
    if len(i) != 8:
        diff_octets = 8 - len(i)
        i = '0' * diff_octets + i
        binars_ip_octets_group.append(i)
    elif len(i) == 8:
        binars_ip_octets_group.append(i)
    else:
        print('ошибка (else)')
        continue

#mask
dictionary_of_masks = {'1':'128.0.0.0',
                       '2':'192.0.0.0',
                       '3':'224.0.0.0',
                       '4':'240.0.0.0',
                       '5':'248.0.0.0',
                       '6':'252.0.0.0',
                       '7':'254.0.0.0',
                       '8':'255.0.0.0',
                       '9':'255.128.0.0',
                       '10':'255.192.0.0',
                       '11':'255.224.0.0',
                       '12':'255.240.0.0',
                       '13':'255.248.0.0',
                       '14':'255.252.0.0',
                       '15':'255.254.0.0',
                       '16':'255.255.0.0',
                       '17':'255.255.128.0',
                       '18':'255.255.192.0',
                       '19':'255.255.224.0',
                       '20':'255.255.240.0',
                       '21':'255.255.248.0',
                       '22':'255.255.252.0',
                       '23':'255.255.254.0',
                       '24':'255.255.255.0',
                       '25':'255.255.255.128',
                       '26':'255.255.255.192',
                       '27':'255.255.255.224',
                       '28':'255.255.255.240',
                       '29':'255.255.255.248',
                       '30':'255.255.255.252',
                       '31':'255.255.255.254',
                       '32':'255.255.255.255'}
separet_mask = dictionary_of_masks[mask].split('.')
# print(f"separet_mask = {separet_mask}")
octets_mask_0 = bin(int(separet_mask[0]))[2:]
octets_mask_1 = bin(int(separet_mask[1]))[2:]
octets_mask_2 = bin(int(separet_mask[2]))[2:]
octets_mask_3 = bin(int(separet_mask[3]))[2:]
list_for_fully_empty_of_masks = [octets_mask_0, octets_mask_1, octets_mask_2, octets_mask_3]
binars_masks_octets_group = []

#заполнение нулями маску
for f in list_for_fully_empty_of_masks:
    if len(f) != 8:
        diff_octets_of_mask = 8 - len(f)
        f = '0' * diff_octets_of_mask + f
        binars_masks_octets_group.append(f)
    elif len(f) == 8:
        binars_masks_octets_group.append(f)
    else:
        print('ошибка в маске (else)')
        continue

binary_mask_for_show = '.'.join(binars_masks_octets_group)

#логическое поумноживание каждого октета ip c mask
"""Нулевый октет"""
binary_final_result_of_logic_and = []
binary_result_of_logic_and_octet_0 = []
count = 0 # счетчик для внутреннего цикла
for inet in str(binars_ip_octets_group[0]):
    for imask in str(binars_masks_octets_group[0])[count]:
        logic_and = int(inet) & int(imask)
        binary_result_of_logic_and_octet_0.append(logic_and)
    count +=1
###отполировка результата нулевого октета
binary_result_of_logic_and_octet_0 = str(binary_result_of_logic_and_octet_0).replace(',', '').replace(' ','').replace('[','').replace(']','')
###Добавление отполированного результата нулевого октета в итог
binary_final_result_of_logic_and.append(binary_result_of_logic_and_octet_0)

"""Первый октет"""
binary_result_of_logic_and_octet_1 = []
count = 0 # счетчик для внутреннего цикла
for inet in str(binars_ip_octets_group[1]):
    for imask in str(binars_masks_octets_group[1])[count]:
        logic_and = int(inet) & int(imask)
        binary_result_of_logic_and_octet_1.append(logic_and)
    count +=1
###отполировка результата первого октета
binary_result_of_logic_and_octet_1 = str(binary_result_of_logic_and_octet_1).replace(',', '').replace(' ','').replace('[','').replace(']','')
###Добавление отполированного результата первого октета в итог
binary_final_result_of_logic_and.append(binary_result_of_logic_and_octet_1)

"""Второй октет"""
binary_result_of_logic_and_octet_2 = []
count = 0 # счетчик для внутреннего цикла
for inet in str(binars_ip_octets_group[2]):
    for imask in str(binars_masks_octets_group[2])[count]:
        logic_and = int(inet) & int(imask)
        binary_result_of_logic_and_octet_2.append(logic_and)
    count +=1
###отполировка результата первого октета
binary_result_of_logic_and_octet_2 = str(binary_result_of_logic_and_octet_2).replace(',', '').replace(' ','').replace('[','').replace(']','')
###Добавление отполированного результата первого октета в итог
binary_final_result_of_logic_and.append(binary_result_of_logic_and_octet_2)

"""Третий октет"""
binary_result_of_logic_and_octet_3 = []
count = 0 # счетчик для внутреннего цикла
for inet in str(binars_ip_octets_group[3]):
    for imask in str(binars_masks_octets_group[3])[count]:
        logic_and = int(inet) & int(imask)
        binary_result_of_logic_and_octet_3.append(logic_and)
    count +=1
###отполировка результата первого октета
binary_result_of_logic_and_octet_3 = str(binary_result_of_logic_and_octet_3).replace(',', '').replace(' ','').replace('[','').replace(']','')
###Добавление отполированного результата первого октета в итог
binary_final_result_of_logic_and.append(binary_result_of_logic_and_octet_3)

octets_0_final = binary_final_result_of_logic_and[0]
octets_1_final = binary_final_result_of_logic_and[1]
octets_2_final = binary_final_result_of_logic_and[2]
octets_3_final = binary_final_result_of_logic_and[3]
binary_network = (f"{octets_0_final}.{octets_1_final}.{octets_2_final}.{octets_3_final}")

#Конкретирование адреса сети из бинара в десятичную
binary_network_address = binary_network.split('.')
"""Нулевый октет"""
degree = 7
decimal_result_of_network_octet_0 = 0
for i in binary_network_address[0]:
    i = int(i) * (2 ** degree)
    decimal_result_of_network_octet_0+=i
    degree-=1

"""Первый октет"""
degree = 7
decimal_result_of_network_octet_1 = 0
for i in binary_network_address[1]:
    i = int(i) * (2 ** degree)
    decimal_result_of_network_octet_1+=i
    degree-=1

"""Второй октет"""
degree = 7
decimal_result_of_network_octet_2 = 0
for i in binary_network_address[2]:
    i = int(i) * (2 ** degree)
    decimal_result_of_network_octet_2+=i
    degree-=1

"""Третий октет"""
degree = 7
decimal_result_of_network_octet_3 = 0
for i in binary_network_address[3]:
    i = int(i) * (2 ** degree)
    decimal_result_of_network_octet_3+=i
    degree-=1
result_network_address = f'{decimal_result_of_network_octet_0}.{decimal_result_of_network_octet_1}.{decimal_result_of_network_octet_2}.{decimal_result_of_network_octet_3}'

# Найти бродкаст адрес
net_for_find_broadcast = binary_network.replace('.', '')
mask_for_find_broadcast = f"{binars_masks_octets_group[0]}.{binars_masks_octets_group[1]}.{binars_masks_octets_group[2]}.{binars_masks_octets_group[3]}"
mask_for_find_broadcast = mask_for_find_broadcast.replace('.', '')
find_first_zero_for_broadcast = mask_for_find_broadcast.find('0')

binary_broadcast = []
count = 0
for i in net_for_find_broadcast:
    if count >= find_first_zero_for_broadcast:
        i = '1'
        binary_broadcast.append(i)
        count+=1
    else:
        binary_broadcast.append(i)
        count+=1
binary_broadcast = str(binary_broadcast).replace(',', '').replace(' ','').replace('[','').replace(']','').replace("'",'')
binary_broadcast = binary_broadcast[:8] + '.' + binary_broadcast[8:16] + '.' + binary_broadcast[16:24] + '.' + binary_broadcast[24:]
binary_broadcast = binary_broadcast.split('.')
binary_broadcast_for_show = '.'.join(binary_broadcast)

#Конвертирование бродкаст адреса с бинара в десятичную
"""Нулевый октет"""
degree = 7
decimal_final_result_of_broadcast = []
decimal_result_of_broadcast_octet_0 = 0
for i in binary_broadcast[0]:
    i = int(i) * (2 ** degree)
    decimal_result_of_broadcast_octet_0+=i
    degree-=1

#Конвертирование бродкаст адреса с бинара в десятичную
"""Первый октет"""
degree = 7
decimal_result_of_broadcast_octet_1 = 0
for i in binary_broadcast[1]:
    i = int(i) * (2 ** degree)
    decimal_result_of_broadcast_octet_1+=i
    degree-=1

#Конвертирование бродкаст адреса с бинара в десятичную
"""Второй октет"""
degree = 7
decimal_result_of_broadcast_octet_2 = 0
for i in binary_broadcast[2]:
    i = int(i) * (2 ** degree)
    decimal_result_of_broadcast_octet_2+=i
    degree-=1

#Конвертирование бродкаст адреса с бинара в десятичную
"""Третий октет"""
degree = 7
decimal_result_of_broadcast_octet_3 = 0
for i in binary_broadcast[3]:
    i = int(i) * (2 ** degree)
    decimal_result_of_broadcast_octet_3+=i
    degree-=1

result_broadcast_address = f'{decimal_result_of_broadcast_octet_0}.{decimal_result_of_broadcast_octet_1}.{decimal_result_of_broadcast_octet_2}.{decimal_result_of_broadcast_octet_3}'

# Первый адрес хоста

binary_find_first_host = []
count = 1
binary_final_result_for_first_host = binary_final_result_of_logic_and

for i in binary_final_result_for_first_host[3]:
    if count == len(binary_final_result_for_first_host[3]):
        i = '1'
        binary_find_first_host.append(i)
    else:
        binary_find_first_host.append(i)
        count+=1
binary_find_first_host = ''.join(binary_find_first_host)
binary_final_result_for_first_host.pop(3)
binary_final_result_for_first_host.append(binary_find_first_host)
binary_first_host_for_show = '.'.join(binary_final_result_for_first_host)

#Конвертирование адреса первого хоста с бинара в десятичную
"""Нулевый октет"""
degree = 7
decimal_result_of_first_host_octet_0 = 0
for i in binary_final_result_for_first_host[0]:
    i = int(i) * (2 ** degree)
    decimal_result_of_first_host_octet_0+=i
    degree-=1

#Конвертирование адреса первого хоста с бинара в десятичную
"""Первый октет"""
degree = 7
decimal_result_of_first_host_octet_1 = 0
for i in binary_final_result_for_first_host[1]:
    i = int(i) * (2 ** degree)
    decimal_result_of_first_host_octet_1+=i
    degree-=1

#Конвертирование адреса первого хоста с бинара в десятичную
"""Второй октет"""
degree = 7
decimal_result_of_first_host_octet_2 = 0
for i in binary_final_result_for_first_host[2]:
    i = int(i) * (2 ** degree)
    decimal_result_of_first_host_octet_2+=i
    degree-=1

#Конвертирование адреса первого хоста с бинара в десятичную
"""Второй октет"""
degree = 7
decimal_result_of_first_host_octet_3 = 0
for i in binary_final_result_for_first_host[3]:
    i = int(i) * (2 ** degree)
    decimal_result_of_first_host_octet_3+=i
    degree-=1

result_first_host_address = f'{decimal_result_of_first_host_octet_0}.{decimal_result_of_first_host_octet_1}.{decimal_result_of_first_host_octet_2}.{decimal_result_of_first_host_octet_3}'


# Найти последний адрес хоста
find_first_zero_for_last_host = find_first_zero_for_broadcast

net_for_find_last_host = net_for_find_broadcast
binary_net_find_last_host = []
count = 0

for i in net_for_find_last_host:
    if count >= find_first_zero_for_last_host and count < 31:
        i = '1'
        binary_net_find_last_host.append(i)
        count+=1
    else:
        binary_net_find_last_host.append(i)
        count+=1
binary_net_find_last_host = ''.join(binary_net_find_last_host)
binary_net_find_last_host = binary_net_find_last_host[:8] + '.' + binary_net_find_last_host[8:16] + '.' + binary_net_find_last_host[16:24] + '.' + binary_net_find_last_host[24:]
binary_net_find_last_host = binary_net_find_last_host.split('.')
binary_last_host_for_show = '.'.join(binary_net_find_last_host)

#Конвертирование адреса последнего хоста с бинара в десятичную
"""Нулевый октет"""
degree = 7

decimal_result_of_last_host_octet_0 = 0
for i in binary_net_find_last_host[0]:
    i = int(i) * (2 ** degree)
    decimal_result_of_last_host_octet_0+=i
    degree-=1

#Конвертирование адреса последнего хоста с бинара в десятичную
"""Первый октет"""
degree = 7
decimal_result_of_last_host_octet_1 = 0
for i in binary_net_find_last_host[1]:
    i = int(i) * (2 ** degree)
    decimal_result_of_last_host_octet_1+=i
    degree-=1
#Конвертирование адреса последнего хоста с бинара в десятичную
"""Второй октет"""
degree = 7
decimal_result_of_last_host_octet_2 = 0
for i in binary_net_find_last_host[2]:
    i = int(i) * (2 ** degree)
    decimal_result_of_last_host_octet_2+=i
    degree-=1

#Конвертирование адреса последнего хоста с бинара в десятичную
"""Третий октет"""
degree = 7
decimal_result_of_last_host_octet_3 = 0
for i in binary_net_find_last_host[3]:
    i = int(i) * (2 ** degree)
    decimal_result_of_last_host_octet_3+=i
    degree-=1

result_last_host_address = f'{decimal_result_of_last_host_octet_0}.{decimal_result_of_last_host_octet_1}.{decimal_result_of_last_host_octet_2}.{decimal_result_of_last_host_octet_3}'

#число хостов
##Находим кол-во нулей

binary_mask_of_count_hosts = ''.join(binars_masks_octets_group)
binary_mask_of_wildcard_mask = binary_mask_of_count_hosts
binary_mask_of_count_hosts = binary_mask_of_count_hosts.count('0')
if binary_mask_of_count_hosts == 0:
    count_hosts_for_show = 1
else:
    count_hosts_for_show = (2 ** binary_mask_of_count_hosts) - 2

#wildcard mask
binary_wildcard_mask = []
for i in binary_mask_of_wildcard_mask:
    if i == '1':
        i = '0'
        binary_wildcard_mask.append(i)
    elif i == '0':
        i = '1'
        binary_wildcard_mask.append(i)
    else:
        print('error else - wildcard')
binary_wildcard_mask = ''.join(binary_wildcard_mask)
binary_wildcard_mask_for_show = binary_wildcard_mask[:8] + '.' + binary_wildcard_mask[8:16] + '.' + binary_wildcard_mask[16:24] + '.' + binary_wildcard_mask[24:]

#Конвертирование wildcard маски с бинара в десятичную
"""Нулевый октет"""
degree = 7
binary_wildcard_mask_for_decimal = binary_wildcard_mask_for_show.split('.')
decimal_result_of_wildcard_mask_octet_0 = 0
for i in binary_wildcard_mask_for_decimal[0]:
    i = int(i) * (2 ** degree)
    decimal_result_of_wildcard_mask_octet_0+=i
    degree-=1

#Конвертирование wildcard маски с бинара в десятичную
"""Первый октет"""
degree = 7
decimal_result_of_wildcard_mask_octet_1 = 0
for i in binary_wildcard_mask_for_decimal[1]:
    i = int(i) * (2 ** degree)
    decimal_result_of_wildcard_mask_octet_1+=i
    degree-=1

#Конвертирование wildcard маски с бинара в десятичную
"""Второй октет"""
degree = 7
decimal_result_of_wildcard_mask_octet_2 = 0
for i in binary_wildcard_mask_for_decimal[2]:
    i = int(i) * (2 ** degree)
    decimal_result_of_wildcard_mask_octet_2+=i
    degree-=1

#Конвертирование wildcard маски с бинара в десятичную
"""Третий октет"""
degree = 7
decimal_result_of_wildcard_mask_octet_3 = 0
for i in binary_wildcard_mask_for_decimal[3]:
    i = int(i) * (2 ** degree)
    decimal_result_of_wildcard_mask_octet_3+=i
    degree-=1
result_wilrdcard_mask = f'{decimal_result_of_wildcard_mask_octet_0}.{decimal_result_of_wildcard_mask_octet_1}.{decimal_result_of_wildcard_mask_octet_2}.{decimal_result_of_wildcard_mask_octet_3}'

print('//Вводимые данные\\\\')
print(f"Адрес: {ipaddr}")
print(f"Маска: {dictionary_of_masks[mask]} = {mask}")
print('---------------------')
print('    //Результат\\\\')
row_name_network = 'Network:'
row_name_mask = 'Mask:'
row_name_first_address = 'First address:'
row_name_last_address = 'Last address:'
row_name_broadcast_address = 'Broadcast address:'
row_name_available_hosts = 'Available hosts:'
row_name_wildcard_mask = 'Wildcard mask:'
row_net_and_mask = f"{result_network_address}/{mask}"
if mask == '32':
    result_last_host_address = result_first_host_address
    binary_last_host_for_show = binary_first_host_for_show

print(f"{row_name_network.ljust(20)}{row_net_and_mask.ljust(20)}{binary_network} ")
print(f"{row_name_mask.ljust(20)}{dictionary_of_masks[mask].ljust(20)}{binary_mask_for_show}")
print(f"{row_name_wildcard_mask.ljust(20)}{result_wilrdcard_mask.ljust(20)}{binary_wildcard_mask_for_show}")
print(f"{row_name_first_address.ljust(20)}{result_first_host_address.ljust(20)}{binary_first_host_for_show}")
print(f'{row_name_last_address.ljust(20)}{result_last_host_address.ljust(20)}{binary_last_host_for_show}')
print(f'{row_name_broadcast_address.ljust(20)}{result_broadcast_address.ljust(20)}{binary_broadcast_for_show}')
print(f"{row_name_available_hosts.ljust(20)}{count_hosts_for_show}")

Добавить комментарий

Ваш адрес email не будет опубликован.