116 lines
4.4 KiB
Python

import collections
import copy
def inject_qubes(inject):
myname = inject["inventory_hostname"]
akk = collections.OrderedDict()
all_pcidevs = dict()
for invhostname in inject["groups"]["all"]:
if invhostname == myname:
continue
hostvars = inject["hostvars"][invhostname]
if hostvars.get("qubes", {}).get("dom0_vm") == myname:
akk[invhostname] = copy.deepcopy(hostvars)
for invhostname, hostvars in akk.items():
qubes = hostvars["qubes"]
dominv = qubes["dom0_vm"]
for dev in qubes.get("pcidevs", []):
if all_pcidevs.get(dev):
assert t in akk, (
"while processing attribute pcidevs of VM %s: "
"device %s already in use by VM %s"
) % (
invhostname,
dev,
all_pcidevs[dev],
)
all_pcidevs[dev] = invhostname
for vmitem in ["template_vm", "netvm_vm"]:
if vmitem == "template_vm":
if "_template" in hostvars and not "template_vm" in qubes:
qubes["template_vm"] = hostvars["_template"]
elif invhostname + "-template" in inject["groups"]:
qubes["template_vm"] = inject["groups"][invhostname + "-template"][0]
if vmitem in qubes:
t = qubes[vmitem]
if t is None or t.lower() == "none":
qubes[vmitem[:-3]] = None
else:
if t.startswith("sibling(") and t.endswith(")"):
t = t[len("sibling("):-1]
dompostfix = dominv.split(".")[1:]
dompostfix = "." + ".".join(dompostfix) if dompostfix else ""
t = t + dompostfix
assert t in akk, (
"while processing attribute %s of VM %s: "
"%s not found in VMs of %s: %s"
) % (
vmitem,
invhostname,
t,
dominv,
", ".join(akk)
)
qubes[vmitem[:-3]] = t
del qubes[vmitem]
enabledservices = []
disabledservices = []
defaultservices = []
for service, status in qubes.get("services", {}).items():
if status == "default" or status == None:
defaultservices.append(service)
elif status == True:
enabledservices.append(service)
elif status == False:
disabledservices.append(service)
else:
assert 0, "while processing service %s of VM %s: invalid value %r" % (
service, invhostname, status
)
if enabledservices or disabledservices or defaultservices:
qubes["services"] = collections.OrderedDict()
if enabledservices:
qubes["services"]["enable"] = enabledservices
if disabledservices:
qubes["services"]["disable"] = disabledservices
if defaultservices:
qubes["services"]["disable"] = defaultservices
elif "services" in qubes:
del qubes["services"]
try:
vmtype = qubes["vm_type"]
except KeyError:
assert 0, "while processing attribute %s of VM %s: attribute not set" % (
"vm_type", invhostname
)
flags = qubes.get("flags", [])
def add(l, v):
if v not in l:
l.append(v)
if vmtype == "NetVM":
add(flags, "net")
elif vmtype == "StandaloneVM":
add(flags, "standalone")
elif vmtype == "AppVM":
pass
elif vmtype == "ProxyVM":
add(flags, "proxy")
elif vmtype == "TemplateVM":
try:
qubes["source"] = qubes["template"]
del qubes["template"]
except KeyError:
if "source" in qubes:
del qubes["source"]
else:
assert 0, "while processing attribute %s of VM %s: VM type %s unsupported" % (
"vm_type", invhostname, vmtype
)
if flags:
qubes["flags"] = flags
else:
if "flags" in qubes:
del qubes["flags"]
return akk