From 35d6c2c70824cf77ef2216889cc9730b622f5ac1 Mon Sep 17 00:00:00 2001 From: Emile Date: Fri, 13 Sep 2024 15:04:06 +0200 Subject: big push --- nix/modules/vm/default.nix | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 nix/modules/vm/default.nix (limited to 'nix/modules/vm/default.nix') diff --git a/nix/modules/vm/default.nix b/nix/modules/vm/default.nix new file mode 100644 index 0000000..0f65765 --- /dev/null +++ b/nix/modules/vm/default.nix @@ -0,0 +1,78 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.services.emile.r2wars-web; +in with lib; { + options.services.emile.r2wars-web = { + enable = mkEnableOption "Enable r2wars-web"; + + # ip and port to listen on + guest = mkOption { + type = types.str; + default = "vmnameone"; + example = "vmnameone"; + description = "The name of the vm"; + }; + }; + + config = mkIf cfg.enable { + systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" { + after = [ "libvirtd.service" ]; + requires = [ "libvirtd.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + script = + let + xml = pkgs.writeText "libvirt-guest-${name}.xml" + '' + + ${name} + UUID + + hvm + + ${guest.memory} + + + + + + + + + + + + + + + + + + ''; + in + '' + uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)" + ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}') + ${pkgs.libvirt}/bin/virsh start '${name}' + ''; + preStop = + '' + ${pkgs.libvirt}/bin/virsh shutdown '${name}' + let "timeout = $(date +%s) + 10" + while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do + if [ "$(date +%s)" -ge "$timeout" ]; then + # Meh, we warned it... + ${pkgs.libvirt}/bin/virsh destroy '${name}' + else + # The machine is still running, let's give it some time to shut down + sleep 0.5 + fi + done + ''; + }) guests; + }; +} -- cgit 1.4.1