mirror of
https://github.com/SakurabaKiyoka/Wireguard-AllowedIPs-Calculator
synced 2024-10-30 21:20:09 +00:00
54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
from ipaddress import *
|
|
import sys
|
|
|
|
def check_ip_network_type(address):
|
|
try:
|
|
return 4 if type(ip_network(address)) is IPv4Network else 6
|
|
except ValueError:
|
|
return 10
|
|
|
|
|
|
def calc_wg_ip_range(allowed_networking: list, disallowed_networking: list) -> list:
|
|
addr = []
|
|
output = []
|
|
for i in allowed_networking:
|
|
count = 0
|
|
for j in disallowed_networking:
|
|
if j.subnet_of(i):
|
|
for allowedip in i.address_exclude(j):
|
|
addr.append(allowedip)
|
|
count += 1
|
|
if count == 0:
|
|
addr.append(i)
|
|
for res in addr:
|
|
for dis in disallowed_networking:
|
|
if dis.subnet_of(res):
|
|
addr.remove(res)
|
|
for strings in addr:
|
|
output.append(str(strings))
|
|
return output
|
|
|
|
|
|
data = sys.argv[1:]
|
|
if len(data) == 0:
|
|
print("Usage: [-a] AllowedIPs. comma to split the multiple ips. [-d] DisallowedIPs. comma to split\nExample: allow 0.0.0.0/0, 2001:db8::/32 and disallow 2001:db8:4001:103::/64, please use python3 wg.py -a 0.0.0.0,2001:db8::/32 -d 2001:db8:4001:103::/64")
|
|
exit(1)
|
|
allow_ip_raw = data[data.index('-a') + 1].split(',')
|
|
disallow_ip_raw = data[data.index('-d') + 1].split(',')
|
|
allowed_ipv4 = []
|
|
allowed_ipv6 = []
|
|
disallowed_ipv4 = []
|
|
disallowed_ipv6 = []
|
|
for ipa in allow_ip_raw:
|
|
if check_ip_network_type(ipa) == 4:
|
|
allowed_ipv4.append(IPv4Network(ipa))
|
|
elif check_ip_network_type(ipa) == 6:
|
|
allowed_ipv6.append(IPv6Network(ipa))
|
|
for ipd in disallow_ip_raw:
|
|
if check_ip_network_type(ipd) == 4:
|
|
disallowed_ipv4.append(IPv4Network(ipd))
|
|
elif check_ip_network_type(ipd) == 6:
|
|
disallowed_ipv6.append(IPv6Network(ipd))
|
|
result = f"AllowedIPs = {', '.join(calc_wg_ip_range(allowed_ipv4, disallowed_ipv4) + calc_wg_ip_range(allowed_ipv6, disallowed_ipv6))}"
|
|
print(result)
|