commit 4f923afc427d7d7c423742c3edb19d9fc9b9e5c4 Author: Yannik Schmidt Date: Fri Dec 9 20:34:26 2022 +0100 Initial diff --git a/main.py b/main.py new file mode 100644 index 0000000..f36c8ff --- /dev/null +++ b/main.py @@ -0,0 +1,11 @@ +import json + +if __name__ == "__main__": + + FILE = "vms.json" + with open(FILE) as f: + jsonList = json.load(f) + vmList = [ VM(obj) for obj in jsonList ] + + for vm in vmList: + print(vmList.dumpHAProxyComponents()) diff --git a/vm.py b/vm.py new file mode 100644 index 0000000..3f8db99 --- /dev/null +++ b/vm.py @@ -0,0 +1,49 @@ +import libvirt + +HA_PROXY_TEMPLATE = ''' +listen {name} + bind 0.0.0.0:{port} + mode {proto} + timeout connect 4000 + timeout client 180000 + timeout client 180000 + server srv1 {ip} +''' + +class VM: + + def __init__(self, args): + + self.hostname = args.get("hostname") + self.subdomains = args.get("subdomains") + self.ports = args.get("ports") + self.network = args.get("network") or "default" + self.lease = _get_lease_for_hostname() + self.ip = lease.get("ipaddr") + + def _get_lease_for_hostname(self): + + with libvirt.open() as con: + network = con.networkLookupByName(self.network) + leases = network.DHCPLeases() + for l in leases: + if l.get("hostname") == self.hostname: + return l + + raise ValueError("Hostname {} doesn't have a DHCP lease".format(self.hostname)) + + def dumpHAProxyComponents(self): + + components = [] + for pObj in self.ports: + name = str(pObj.get("name")).replace(" ", "") + portOrRange = pObj.get("port").replace(" ", "") + proto = pObj.get("proto") or "tcp" + compositeName = "-".join((self.hostname, name, portOrRange, proto)) + + component = HA_PROXY_TEMPLATE.format(name=compositeName, port=port, + proto=proto, ip=self.ip) + components.append(component) + + return components +