From c098d3ceb387e48f115cfa1dece63881db674896 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Mon, 21 Mar 2022 22:20:17 +0100 Subject: [PATCH] Init --- IDEA | 29 ++++++++++++++++++++++ baz.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ diag.xopp | Bin 0 -> 13612 bytes 3 files changed, 99 insertions(+) create mode 100644 IDEA create mode 100755 baz.py create mode 100644 diag.xopp diff --git a/IDEA b/IDEA new file mode 100644 index 0000000..26a3bfc --- /dev/null +++ b/IDEA @@ -0,0 +1,29 @@ +- each computer should have its configuration + - QEMU + - systemd-networkd? ( + - BIRD +- Also: bridges-up script to set up all the bridges. +- Network should have reasonable addressing scheme + - IP + - MAC + +MAC:52:54:00:17:: +IP: 172.23.. + +Rationale: mac is host-based, ip is net-based. This mimmics real networks. The +23 = 0x17 is just a number between 16 and 31 without meaning. MAC OUI is from +QEMU, could be something else (it _is_ locally administered), but this is +recognisable. + +QEMU flags: + -enable-kvm + -m 200M # enough? + -drive ... + - networks (copy from Zr/arch) + -name +- Networks: just bridges with tap-s attached. +- OS: Alpine? (/etc/network/interfaces is configurable by mac) +- Clonined hdds? Single base hdd + overlay for bird.conf? + +Impl: python with jinja. We want a templating engine, since most of the configs +are the same, and something to represent computers and networks. diff --git a/baz.py b/baz.py new file mode 100755 index 0000000..a50b8e2 --- /dev/null +++ b/baz.py @@ -0,0 +1,70 @@ +#!/bin/python3 + +import ipaddress +import jinja2 +import os +import sys +import pathlib + +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(computer) + + def gen_files(self): + files = [ + 'qemu.sh', + 'interfaces', + 'bird.conf', + ] + context = {'c': self} + + loader = jinja2.FileSystemLoader('templates/') + environment = jinja2.Environment(loader=loader, trim_blocks=True) + for f in files: + template = environment.get_template(f) + template.stream(context).dump(self.name + '/' + f) + +# Computers: +comps = {} +for i, n in enumerate('ABCDEFGHIX'): + comps[n] = Computer(n, i) + +# Bridges +bridges = {} +for i, n in [(x, 'net_'+str(x)) for x in range(1, 8)]: + bridges[n] = Bridge(n, i) + +def dump_bridges(fn): + with open(fn, 'w+') as f: + for br in bridges: + f.write(br + '\n') + +# 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]) + +dump_bridges('./bridges') diff --git a/diag.xopp b/diag.xopp new file mode 100644 index 0000000000000000000000000000000000000000..e1553ada874510121c9a77416947af36d7248c8c GIT binary patch literal 13612 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 yCy3jj2Aa}-7oTZ$NvRqa`8e$hyVbLyl9gE literal 0 HcmV?d00001