Edit on GitHub

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))