Make this into more of a CLI thing. Also write some code

This commit is contained in:
astatin3
2024-07-10 20:39:15 -06:00
parent 3377dd7e9a
commit 3662b18e9b
14 changed files with 394 additions and 73692 deletions
+93
View File
@@ -0,0 +1,93 @@
# https://github.com/bonsaiviking/IPMap/blob/master/ipmap/hilbert.py
def xy2d(side_length: int, x: int, y: int):
"""Find the distance of the point (x, y) along a Hilbert curve
which fills a square *side_length* units on a side."""
y = side_length-y
s = side_length / 2
d = 0
while( s > 0 ):
rx = 1 if (int(x) & int(s)) else 0
ry = 1 if (int(y) & int(s)) else 0
d += s * s * ((3 * rx) ^ ry)
if (ry == 0):
if (rx == 1):
x = s-1 - x
y = s-1 - y
(x, y) = (y, x)
s /= 2
return int(d)
# https://github.com/bonsaiviking/IPMap/blob/master/ipmap/hilbert.py
def d2xy(side_length: int, d: int):
"""Find the coordinates (x, y) of a point some distance *d* along
a Hilbert curve which fills a square *side_length* units on a side."""
x = y = 0
s = 1
while( s < side_length ):
rx = 1 & int(d/2)
ry = 1 & (int(d) ^ rx)
if (ry == 0):
if (rx == 1):
x = s-1 - x
y = s-1 - y
(x, y) = (y, x)
x += s * rx
y += s * ry
d /= 4
s *= 2
# if y < 10000:
# print(ip_int_to_ip(int(d)))
return x, side_length-y
def ip_to_int(ip):
return int(''.join([bin(int(x) + 256)[3:] for x in ip.split('.')]), 2)
def ip_int_to_ip(ip_int):
return ".".join(str((ip_int >> i) & 0xFF) for i in [24, 16, 8, 0])
def ipInCIDR(ip: str, ip_CIDR: str):
range_parts = ip_CIDR.split('/')
range_mask = int(range_parts[1])
range_mask_num = (0xFFFFFFFF << (32 - range_mask)) & 0xFFFFFFFF
return (ip_to_int(ip) & range_mask_num) == (ip_to_int(range_parts[0]) & range_mask_num)
def ipInRange(ip: str, ip_range: str):
ip_int = ip_to_int(ip)
start_ip_int, end_ip_int = [ip_to_int(ip) for ip in ip_range.split('-')]
return start_ip_int <= ip_int <= end_ip_int
reserved_ip_blocks=[
"0.0.0.0/8",
"10.0.0.0/8",
"100.64.0.0/10",
"127.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"192.0.0.0/24",
"192.0.2.0/24",
"192.88.99.0/24",
"192.168.0.0/16",
"198.18.0.0/15",
"198.51.100.0/24",
"203.0.113.0/24",
"224.0.0.0/4",
"233.252.0.0/24",
"240.0.0.0/4",
"255.255.255.255/32"
]
def is_valid_ip(ip: str):
if ":" in ip:
ip = ip.split(":")[0]
for reserved_ip in reserved_ip_blocks:
if ipInCIDR(ip, reserved_ip):
return False
return True