src.wg.IPgen
1#!/usr/bin/python3 2 3import argparse 4from ipaddress import IPv4Address 5from pathlib import Path 6 7START_IP = "10.1.0.1" 8FILE = Path("INCREMENTED_IP") 9 10 11def ip_to_int(ip): 12 """Преобразует IP-адрес в целое число.""" 13 octets = list(map(int, ip.split("."))) 14 return (octets[0] << 24) + (octets[1] << 16) + (octets[2] << 8) + octets[3] 15 16 17def int_to_ip(num): 18 """Преобразует целое число обратно в IP-адрес.""" 19 return f"{(num >> 24) & 255}.{(num >> 16) & 255}.{(num >> 8) & 255}.{num & 255}" 20 21 22def generate_ip_range(start_ip, end_ip): 23 """Генерирует диапазон IP-адресов от start_ip до end_ip.""" 24 start = ip_to_int(start_ip) 25 end = ip_to_int(end_ip) 26 27 for ip in range(start, end + 1): 28 yield int_to_ip(ip) 29 30 31def increment_ip(filename: Path = FILE): 32 filename = filename.expanduser() 33 34 if not filename.exists(): 35 filename.touch() 36 37 with open(filename, "r+") as file: 38 _ip = file.read() 39 if _ip: 40 last_ip = ip_to_int(_ip) 41 else: 42 last_ip = ip_to_int(START_IP) 43 44 last_ip += 1 45 46 file.seek(0) 47 file.truncate(0) 48 49 file.write(int_to_ip(last_ip)) 50 51 52if __name__ == "__main__": 53 parser = argparse.ArgumentParser( 54 prog="IP generator", 55 description="Util for increment and range ip address", 56 ) 57 parser.add_argument("-f", "--file", type=Path, help="File with IP") 58 parser.add_argument( 59 "-r", 60 "--range", 61 action="extend", 62 help="Генерирует диапазон IP-адресов, пример --range 10.1.0.1 10.1.1.1", 63 nargs="*", 64 ) 65 66 args = parser.parse_args() 67 if args.range: 68 try: 69 start_ip, end_ip = args.range 70 IPv4Address(start_ip) 71 IPv4Address(end_ip) 72 except Exception as e: 73 print("BAD INPUT RANGE") 74 print(f"{e.args[0]}\n") 75 parser.print_help() 76 else: 77 if args.file: 78 with open(args.file, "w") as file: 79 for ip in generate_ip_range(start_ip, end_ip): 80 file.write(f"{ip}\n") 81 else: 82 for ip in generate_ip_range(start_ip, end_ip): 83 print(ip) 84 else: 85 if args.file: 86 increment_ip(filename=args.file) 87 else: 88 increment_ip()
START_IP =
'10.1.0.1'
FILE =
PosixPath('INCREMENTED_IP')
def
ip_to_int(ip):
12def ip_to_int(ip): 13 """Преобразует IP-адрес в целое число.""" 14 octets = list(map(int, ip.split("."))) 15 return (octets[0] << 24) + (octets[1] << 16) + (octets[2] << 8) + octets[3]
Преобразует IP-адрес в целое число.
def
int_to_ip(num):
18def int_to_ip(num): 19 """Преобразует целое число обратно в IP-адрес.""" 20 return f"{(num >> 24) & 255}.{(num >> 16) & 255}.{(num >> 8) & 255}.{num & 255}"
Преобразует целое число обратно в IP-адрес.
def
generate_ip_range(start_ip, end_ip):
23def generate_ip_range(start_ip, end_ip): 24 """Генерирует диапазон IP-адресов от start_ip до end_ip.""" 25 start = ip_to_int(start_ip) 26 end = ip_to_int(end_ip) 27 28 for ip in range(start, end + 1): 29 yield int_to_ip(ip)
Генерирует диапазон IP-адресов от start_ip до end_ip.
def
increment_ip(filename: pathlib.Path = PosixPath('INCREMENTED_IP')):
32def increment_ip(filename: Path = FILE): 33 filename = filename.expanduser() 34 35 if not filename.exists(): 36 filename.touch() 37 38 with open(filename, "r+") as file: 39 _ip = file.read() 40 if _ip: 41 last_ip = ip_to_int(_ip) 42 else: 43 last_ip = ip_to_int(START_IP) 44 45 last_ip += 1 46 47 file.seek(0) 48 file.truncate(0) 49 50 file.write(int_to_ip(last_ip))