from celery import shared_task from .models import * from uncloud.models import UncloudTask import os import subprocess import logging import uuid log = logging.getLogger(__name__) @shared_task def whereami(): print(os.uname()) return os.uname() @shared_task def configure_wireguard_server_on_host(wg_name, config): """ - Create wireguard config (DB query -> string) - Submit config to cdist worker - Change config locally on worker / commit / shared """ # Write config fname = f"/etc/wireguard/{{wg_name}}.conf" with open(fname, "w") as fd: fd.write(config) # Ensure the device exists subprocess.run(f"ip link show {{wg_name}} || sudo ip link add {{wg_name}} type wireguard", shell=True, check=True) # Ensure the config is correct subprocess.run(f"sudo wg setconf {{wg_name}} {{fname}}", shell=True, check=True) def configure_wireguard_server_via_cdist(wireguardvpnpool): """ - Create wireguard config (DB query -> string) - Submit config to cdist worker - Change config locally on worker / commit / shared """ config = wireguardvpnpool.wireguard_config server = wireguardvpnpool.vpn_server_hostname log.info(f"Configuring VPN server {server} (async)") task_id = uuid.UUID(cdist_configure_wireguard_server.apply_async((config, server)).id) UncloudTask.objects.create(task_id=task_id) @shared_task def cdist_configure_wireguard_server(config, server): """ Create config and configure server. To be executed on the cdist worker. """ dirname= "/home/app/.cdist/type/__ungleich_wireguard/files/" fname = os.path.join(dirname,server) log.info(f"Configuring VPN server {server} (on cdist host)") with open(fname, "w") as fd: fd.write(config) log.debug("git committing wireguard changes") subprocess.run(f"cd {dirname} && git pull && git add {server} && git commit -m 'Updating config for {server}' && git push", shell=True, check=True) log.debug(f"Configuring VPN server {server} with cdist") subprocess.run(f"cdist config {server}", shell=True, check=True) # FIXME: # ensure logs are on the server # ensure exit codes are known return True