OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
main @ 235 LINES
 
[ HISTORY ]  [ UP ]
 

{
  pkgs,
  lib,
  config,
  ...
}: let
  inherit (builtins) toFile;
  inherit (lib) mkIf;
  checkSudo =
    if config.virtualisation.libvirtd.qemu.runAsRoot
    then ''
      if [ "$EUID" -ne 0 ]; then
        log error "Sudo not provided: set 'virtualisation.libvirtd.qemu.runAsRoot 
= false;' to use without sudo."
        exit 1
      fi
    ''
    else "";
  networkConfig = toFile "ooknet-install-network.xml" ''
    <network>
      <name>${cfg.network.name}</name>
      <bridge name='${cfg.network.bridgeName}' stp='on' delay='0'/>
      <forward mode='nat'/>
      <ip address='${cfg.network.ip}' netmask='255.255.255.0'>
        <dhcp>
          <range start='${cfg.network.ipRange.start}' end='${cfg.network.ipRange.e
nd}'/>
          <host mac='${cfg.macAddress}' name='${cfg.name}' ip='${cfg.ipAddress}'/>
        </dhcp>
      </ip>
    </network>
  '';
  cfg = config.ooknet.virtualization.host.ooknet-install-vm;
in {
  config = mkIf cfg.enable {
    environment.systemPackages = [
      (pkgs.writeShellApplication {
        name = "ooknet-test-vm";
        runtimeInputs = [
          pkgs.gum
        ];
        text = ''
          set -e

          log() {
            local type="$1"
            local message="$2"
            gum log --structured --level "$type" "$message"
          }

          ${checkSudo}

          NAME=${cfg.name}
          IMAGE_PATH="/var/lib/libvirt/images/$NAME.img"

          buildVM() {
            log info "Setting up virtual network..."
            if virsh net-info ${cfg.network.name} >/dev/null 2>&1; then
              log info "Network already exists, ensuring it's started..."
              virsh net-start ${cfg.network.name} >/dev/null 2>&1 || true
            else
              log info "Creating network..."
              virsh net-define ${networkConfig} >/dev/null
              virsh net-start ${cfg.network.name} >/dev/null || true
              log info "Network created and started..."
            fi

            log info "Building $NAME VM..."
            gum spin --spinner dot --title "Installing VM..." -- \
            virt-install \
              -n "$NAME" \
              --ram=${toString cfg.ram} \
              --vcpus=${toString cfg.vcpus} \
              --disk path="$IMAGE_PATH",bus=virtio,size=${toString cfg.storage} \
              --cdrom ${cfg.isoPath} \
              --network network=${cfg.network.name},mac=${cfg.macAddress} \
              --os-variant="nixos-unstable" \
              --boot uefi \
              --noautoconsole
            log info "VM successfully created"
            log info "Connect with: ssh ${cfg.user}@${cfg.ipAddress}"

          }

          destroyNetwork() {
            if virsh net-info ${cfg.network.name} >/dev/null 2>&1; then
              local net_state
              net_state=$(virsh net-info ${cfg.network.name} | grep "Active:" | aw
k '{print $2}')

              if [ "$net_state" = "yes" ]; then
                virsh net-destroy ${cfg.network.name} >/dev/null
                log info "Network destroyed..."
              else
                log info "Network already stopped..."
              fi

              virsh net-undefine ${cfg.network.name} >/dev/null
              log info "Network undefined..."
            else
              log info "Network not found..."
            fi
          }

          destroyVM() {
            if virsh list --all | grep -q "\b$NAME\b"; then
              local vm_state
              vm_state=$(virsh domstate "$NAME" 2>/dev/null || echo "unknown")

              case "$vm_state" in
                "running")
                  log warn "Shutting VM down..."
                  virsh destroy "$NAME" >/dev/null || true
                  ;;
                "paused")
                  log warn "Stopping Paused VM..."
                  virsh destroy "$NAME" >/dev/null || true
                  ;;
                "shut off")
                  log info "VM already shut off..."
                  ;;
                *)
                  log warn "VM in unknown state: $vm_state"
                  virsh destroy "$NAME" >/dev/null || true
                  ;;
              esac

              if virsh dominfo "$NAME" | grep -q "Managed save:.*yes"; then
                log info "Removing managed save state..."
                virsh managedsave-remove "$NAME"
              fi

              log warn "Deleting VM..."
              if ! virsh undefine "$NAME" --nvram --remove-all-storage >/dev/null 
2>&1; then
                log warn "Standard undefine failed, removing manually..."

                virsh undefine "$NAME" >/dev/null 2>&1 || true

                if [ -f "$IMAGE_PATH" ]; then
                  log info "Manually removing disk image..."
                  rm -f "$IMAGE_PATH"
                fi
              fi
            else
              log warn "VM not found..."
            fi

            log info "VM successfully removed..."
          }

          destroyHostKey() {
            log info "Cleaning up old host keys..."
            ssh-keygen -R ${cfg.ipAddress} 2>/dev/null || true
            ssh-keygen -R ${cfg.name} 2>/dev/null || true
          }

          startVM() {
            local vm_state
            vm_state=$(virsh domstate "$NAME" 2>/dev/null || echo "unknown")

            case "$vm_state" in
              "running")
                log info "VM is already running..."
                ;;
              "paused")
                log info "Resuming paused VM..."
                virsh resume "$NAME" >/dev/null
                ;;
              "shut off")
                log info "Starting VM..."
                virsh start "$NAME" >/dev/null
                ;;
              *)
                log warn "VM in unknown state: $vm_state"
                ;;
            esac
          }

          log info "Checking if VM exists..."

          if virsh list --all | grep -q "\b$NAME\b"; then
            log info "$NAME VM Found:"

            choice=$(gum choose --no-show-help --selected="Start" "Start" "Delete"
 "Build New" "Cancel")

            case "$choice" in
              "Delete")
                destroyVM
                destroyNetwork
                destroyHostKey
                ;;
              "Build New")
                destroyVM
                destroyNetwork
                destroyHostKey
                buildVM
                ;;
              "Start")
                startVM

                if virsh net-info ${cfg.network.name} >/dev/null 2>&1; then
                  net_state=$(virsh net-info ${cfg.network.name} | grep "Active:" 
| awk '{print $2}')

                  if [ "$net_state" != "yes" ]; then
                    log info "Starting network..."
                    virsh net-start ${cfg.network.name} >/dev/null || true
                  fi
                else
                  log warn "Network not found, creating..."
                  virsh net-define ${networkConfig} >/dev/null
                  virsh net-start ${cfg.network.name} >/dev/null || true
                fi
                ;;
              "Cancel")
                log info "Operation cancelled..."
                exit 0
                ;;
            esac
          elif [ -f "$IMAGE_PATH" ]; then
            log warn "Disk Image for '$NAME' exists without VM"
            if gum confirm "Would you like to remove the orphaned disk?"; then
              rm -f "$IMAGE_PATH"
              buildVM
            else
              log error "Cannor create VM while orphaned disk exists"
              exit 1
            fi
          else
            buildVM
          fi


        '';
      })
    ];
  };
}

{
  pkgs,
  lib,
  config,
  ...
}: let
  inherit (builtins) toFile;
  inherit (lib) mkIf;
  checkSudo =
    if config.virtualisation.libvirtd.qemu.r
unAsRoot
    then ''
      if [ "$EUID" -ne 0 ]; then
        log error "Sudo not provided: set 'v
irtualisation.libvirtd.qemu.runAsRoot = fals
e;' to use without sudo."
        exit 1
      fi
    ''
    else "";
  networkConfig = toFile "ooknet-install-net
work.xml" ''
    <network>
      <name>${cfg.network.name}</name>
      <bridge name='${cfg.network.bridgeName
}' stp='on' delay='0'/>
      <forward mode='nat'/>
      <ip address='${cfg.network.ip}' netmas
k='255.255.255.0'>
        <dhcp>
          <range start='${cfg.network.ipRang
e.start}' end='${cfg.network.ipRange.end}'/>
          <host mac='${cfg.macAddress}' name
='${cfg.name}' ip='${cfg.ipAddress}'/>
        </dhcp>
      </ip>
    </network>
  '';
  cfg = config.ooknet.virtualization.host.oo
knet-install-vm;
in {
  config = mkIf cfg.enable {
    environment.systemPackages = [
      (pkgs.writeShellApplication {
        name = "ooknet-test-vm";
        runtimeInputs = [
          pkgs.gum
        ];
        text = ''
          set -e

          log() {
            local type="$1"
            local message="$2"
            gum log --structured --level "$t
ype" "$message"
          }

          ${checkSudo}

          NAME=${cfg.name}
          IMAGE_PATH="/var/lib/libvirt/image
s/$NAME.img"

          buildVM() {
            log info "Setting up virtual net
work..."
            if virsh net-info ${cfg.network.
name} >/dev/null 2>&1; then
              log info "Network already exis
ts, ensuring it's started..."
              virsh net-start ${cfg.network.
name} >/dev/null 2>&1 || true
            else
              log info "Creating network..."
              virsh net-define ${networkConf
ig} >/dev/null
              virsh net-start ${cfg.network.
name} >/dev/null || true
              log info "Network created and 
started..."
            fi

            log info "Building $NAME VM..."
            gum spin --spinner dot --title "
Installing VM..." -- \
            virt-install \
              -n "$NAME" \
              --ram=${toString cfg.ram} \
              --vcpus=${toString cfg.vcpus} 
\
              --disk path="$IMAGE_PATH",bus=
virtio,size=${toString cfg.storage} \
              --cdrom ${cfg.isoPath} \
              --network network=${cfg.networ
k.name},mac=${cfg.macAddress} \
              --os-variant="nixos-unstable" 
\
              --boot uefi \
              --noautoconsole
            log info "VM successfully create
d"
            log info "Connect with: ssh ${cf
g.user}@${cfg.ipAddress}"

          }

          destroyNetwork() {
            if virsh net-info ${cfg.network.
name} >/dev/null 2>&1; then
              local net_state
              net_state=$(virsh net-info ${c
fg.network.name} | grep "Active:" | awk '{pr
int $2}')

              if [ "$net_state" = "yes" ]; t
hen
                virsh net-destroy ${cfg.netw
ork.name} >/dev/null
                log info "Network destroyed.
.."
              else
                log info "Network already st
opped..."
              fi

              virsh net-undefine ${cfg.netwo
rk.name} >/dev/null
              log info "Network undefined...
"
            else
              log info "Network not found...
"
            fi
          }

          destroyVM() {
            if virsh list --all | grep -q "\
b$NAME\b"; then
              local vm_state
              vm_state=$(virsh domstate "$NA
ME" 2>/dev/null || echo "unknown")

              case "$vm_state" in
                "running")
                  log warn "Shutting VM down
..."
                  virsh destroy "$NAME" >/de
v/null || true
                  ;;
                "paused")
                  log warn "Stopping Paused 
VM..."
                  virsh destroy "$NAME" >/de
v/null || true
                  ;;
                "shut off")
                  log info "VM already shut 
off..."
                  ;;
                *)
                  log warn "VM in unknown st
ate: $vm_state"
                  virsh destroy "$NAME" >/de
v/null || true
                  ;;
              esac

              if virsh dominfo "$NAME" | gre
p -q "Managed save:.*yes"; then
                log info "Removing managed s
ave state..."
                virsh managedsave-remove "$N
AME"
              fi

              log warn "Deleting VM..."
              if ! virsh undefine "$NAME" --
nvram --remove-all-storage >/dev/null 2>&1; 
then
                log warn "Standard undefine 
failed, removing manually..."

                virsh undefine "$NAME" >/dev
/null 2>&1 || true

                if [ -f "$IMAGE_PATH" ]; the
n
                  log info "Manually removin
g disk image..."
                  rm -f "$IMAGE_PATH"
                fi
              fi
            else
              log warn "VM not found..."
            fi

            log info "VM successfully remove
d..."
          }

          destroyHostKey() {
            log info "Cleaning up old host k
eys..."
            ssh-keygen -R ${cfg.ipAddress} 2
>/dev/null || true
            ssh-keygen -R ${cfg.name} 2>/dev
/null || true
          }

          startVM() {
            local vm_state
            vm_state=$(virsh domstate "$NAME
" 2>/dev/null || echo "unknown")

            case "$vm_state" in
              "running")
                log info "VM is already runn
ing..."
                ;;
              "paused")
                log info "Resuming paused VM
..."
                virsh resume "$NAME" >/dev/n
ull
                ;;
              "shut off")
                log info "Starting VM..."
                virsh start "$NAME" >/dev/nu
ll
                ;;
              *)
                log warn "VM in unknown stat
e: $vm_state"
                ;;
            esac
          }

          log info "Checking if VM exists...
"

          if virsh list --all | grep -q "\b$
NAME\b"; then
            log info "$NAME VM Found:"

            choice=$(gum choose --no-show-he
lp --selected="Start" "Start" "Delete" "Buil
d New" "Cancel")

            case "$choice" in
              "Delete")
                destroyVM
                destroyNetwork
                destroyHostKey
                ;;
              "Build New")
                destroyVM
                destroyNetwork
                destroyHostKey
                buildVM
                ;;
              "Start")
                startVM

                if virsh net-info ${cfg.netw
ork.name} >/dev/null 2>&1; then
                  net_state=$(virsh net-info
 ${cfg.network.name} | grep "Active:" | awk 
'{print $2}')

                  if [ "$net_state" != "yes"
 ]; then
                    log info "Starting netwo
rk..."
                    virsh net-start ${cfg.ne
twork.name} >/dev/null || true
                  fi
                else
                  log warn "Network not foun
d, creating..."
                  virsh net-define ${network
Config} >/dev/null
                  virsh net-start ${cfg.netw
ork.name} >/dev/null || true
                fi
                ;;
              "Cancel")
                log info "Operation cancelle
d..."
                exit 0
                ;;
            esac
          elif [ -f "$IMAGE_PATH" ]; then
            log warn "Disk Image for '$NAME'
 exists without VM"
            if gum confirm "Would you like t
o remove the orphaned disk?"; then
              rm -f "$IMAGE_PATH"
              buildVM
            else
              log error "Cannor create VM wh
ile orphaned disk exists"
              exit 1
            fi
          else
            buildVM
          fi


        '';
      })
    ];
  };
}
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET