python ( , script ), , PHP. , , ( Python) , .
script : "" , BFS, pdf graphviz.
- BFS. ( "main", /24) , ( "" ) . - , "" (/25) . , "" , "". , "", "". .
.
script ( argparse):
usage: script.py [-h] -m M -t TAKEN [TAKEN ...] -o OUTPUT
optional arguments:
-h, --help show this help message and exit
-m M, --m M main subnet to check
-t TAKEN [TAKEN ...], --taken TAKEN [TAKEN ...]
taken subnets
-o OUTPUT, --output OUTPUT
graphviz output file name (.pdf)
script :
subnet_script.py -m 255.255.255.0/24 -t 255.255.255.192/26 -o test
:

- , :
script.py -m 255.255.255.0/24 -t 255.255.255.192/26 255.255.255.128/30 -o test
:

ipaddress, queue graphviz ( python), argparse, script .
:
def get_available_subnets_set(main, taken):
available = []
q = queue.Queue()
q.put(main)
while q.qsize() > 0:
subnet = q.get()
for taken_subnet in taken:
if taken_subnet.compare_networks(subnet) == 0:
print("similar: %s and %s" % (subnet, taken_subnet))
break
if taken_subnet.overlaps(subnet):
print("overlaps: %s and %s" % (subnet, taken_subnet))
for sub_subnet in subnet.subnets():
q.put(sub_subnet)
break
else:
available.append(subnet)
return set(available)
, graphviz :
def make_subnet_graph(main, taken_subnets, available_subnets, filename):
g = graphviz.Graph()
q = queue.Queue()
q.put(main)
g.node(str(main))
while q.qsize() > 0:
subnet = q.get()
for sub_subnet in subnet.subnets():
if sub_subnet in available_subnets:
g.node(str(sub_subnet), _attributes={"color": "green"})
g.edge(str(sub_subnet), str(subnet))
continue
if sub_subnet in taken_subnets:
g.node(str(sub_subnet), _attributes={"color": "red"})
g.edge(str(sub_subnet), str(subnet))
continue
g.node(str(sub_subnet))
g.edge(str(sub_subnet), str(subnet))
q.put(sub_subnet)
g.render(filename)
argparse:
import ipaddress
import argparse
import queue
import graphviz
def get_available_subnets(main, taken):
available = []
q = queue.Queue()
q.put(main)
while q.qsize() > 0:
subnet = q.get()
for taken_subnet in taken:
if taken_subnet.compare_networks(subnet) == 0:
print("similar: %s and %s" % (subnet, taken_subnet))
break
if taken_subnet.overlaps(subnet):
print("overlaps: %s and %s" % (subnet, taken_subnet))
for sub_subnet in subnet.subnets():
q.put(sub_subnet)
break
else:
available.append(subnet)
return available
def make_subnet_graph(main, taken_subnets, available_subnets, filename):
g = graphviz.Graph()
q = queue.Queue()
q.put(main)
g.node(str(main))
while q.qsize() > 0:
subnet = q.get()
for sub_subnet in subnet.subnets():
if sub_subnet in available_subnets:
g.node(str(sub_subnet), _attributes={"color": "green"})
g.edge(str(sub_subnet), str(subnet))
continue
if sub_subnet in taken_subnets:
g.node(str(sub_subnet), _attributes={"color": "red"})
g.edge(str(sub_subnet), str(subnet))
continue
g.node(str(sub_subnet))
g.edge(str(sub_subnet), str(subnet))
q.put(sub_subnet)
g.render(filename)
if "__main__" == __name__:
parser = argparse.ArgumentParser()
parser.add_argument('-m', '--m', help='main subnet to check', required=True)
parser.add_argument('-t', '--taken', nargs='+', help='taken subnets', required=True)
parser.add_argument('-o', '--output', help='graphviz output file name (.pdf)', required=True)
args = parser.parse_args()
taken = [ipaddress.IPv4Network(subnet) for subnet in args.taken]
main = ipaddress.IPv4Network(args.m)
available = get_available_subnets_set(main, taken)
make_subnet_graph(main, taken, available, args.output)