You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gennet/gen_machines.py

91 lines
1.9 KiB
Python

3 years ago
#!/bin/python3
import ipaddress
import jinja2
import os
import sys
from pathlib import Path
3 years ago
class Bridge:
def __init__(self, name, num):
self.name = name
self.num = num
self.computers = []
class Computer:
def __init__(self, name, num):
self.name = name
self.num = num
self.bridges = []
def add_to_bridge(self, bridge):
self.bridges.append(bridge)
bridge.computers.append(self)
3 years ago
def gen_files(self):
files = [
'qemu.sh',
'interfaces',
'bird.conf',
'hosts',
'hostname',
'mactab',
3 years ago
]
context = {'c': self}
loader = jinja2.FileSystemLoader('templates/')
environment = jinja2.Environment(loader=loader, trim_blocks=True, keep_trailing_newline=True)
3 years ago
for f in files:
template = environment.get_template(f)
(Path('output') / self.name).mkdir(parents=True,exist_ok=True)
template.stream(context).dump('output/' + self.name + '/' + f)
mode = os.stat('output/' + self.name + '/qemu.sh').st_mode
os.chmod('output/' + self.name + '/qemu.sh', mode | 0o0100)
3 years ago
# Computers:
comps = {}
for i, n in enumerate('ABCDEFGHIX', start=1):
3 years ago
comps[n] = Computer(n, i)
# Bridges
bridges = {}
for i, n in [(x, 'net_'+str(x)) for x in range(1, 8)]:
bridges[i] = Bridge(n, i)
3 years ago
def gen_bridge_files(bridges):
files = [
'bridge.conf',
'gen_bridges.sh',
]
context = {'bridges': bridges}
loader = jinja2.FileSystemLoader('templates/')
environment = jinja2.Environment(loader=loader, trim_blocks=True, keep_trailing_newline=True)
for f in files:
template = environment.get_template(f)
template.stream(context).dump('output/' + f)
mode = os.stat('output/gen_bridges.sh').st_mode
os.chmod('output/gen_bridges.sh', mode | 0o0100)
3 years ago
# Connections
# dict[ net_num -> [comp_names]
conns = {
1: 'IGH',
2: 'HCE',
3: 'GDF',
4: 'ACD',
5: 'BEF',
6: 'ABX',
7: 'X',
}
for net, cs in conns.items():
for c in cs:
comps[c].add_to_bridge(bridges[net])
os.mkdir('output')
gen_bridge_files(bridges)
for c in comps.values():
c.gen_files()