{ pkgs, ... }: let userData = pkgs.writeText "fedora-user-data" ( "#cloud-config\n" + builtins.toJSON { hostname = "nate"; ssh_deletekeys = false; users = [ { name = "armbordy"; groups = [ "wheel" ]; shell = "/bin/bash"; sudo = "ALL=(ALL) NOPASSWD:ALL"; lock_passwd = true; ssh_authorized_keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICaC4wtRMqCAI1T+tFahIwDWM8AWlgLDsHV0yEPUb7nK armbordy@armbordy-Inspiron-14-5430" "cert-authority,principals=\"t:human,h:nate\" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEuc4HCdyEMu4uiYhlokSXmu+68hkm7j6CqVwjDkCeSj grace.pink" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINySDE+jaYpuAWUdPQf/JcAWETeHgmh+T5Y4GUa7MfeM grace@turing" ]; } ]; } ); metadata = pkgs.writeText "fedora-meta-data" '' instance-id: fedora-nate-v1 local-hostname: nate ''; network = pkgs.writeText "default-network.xml" '' default ''; domain = pkgs.writeText "fedora.xml" '' fedora 8ffbe0a2-839d-4f5b-8c9a-feb18edf9043 4096 4 hvm restart /run/libvirt/nix-emulators/qemu-system-x86_64 /dev/urandom ''; in { systemd.tmpfiles.rules = [ "d /var/lib/libvirt/images 0755 root root -" "d /var/lib/libvirt/boot 0755 root root -" ]; systemd.services.fedora-vm = { description = "Declare and start the Fedora VM"; wantedBy = [ "multi-user.target" ]; requires = [ "libvirtd.service" ]; after = [ "libvirtd.service" ]; restartTriggers = [ domain userData metadata ]; unitConfig.ConditionPathExists = "/var/lib/libvirt/images/fedora.qcow2"; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; }; path = [ pkgs.libvirt pkgs.cdrkit pkgs.coreutils pkgs.gnugrep ]; script = '' set -eu virsh() { command virsh --connect qemu:///system "$@"; } if ! virsh net-info default >/dev/null 2>&1; then virsh net-define ${network} fi virsh net-autostart default if ! virsh net-info default | grep -q 'Active:.*yes'; then virsh net-start default fi seed=$(mktemp -d) trap 'rm -rf "$seed"' EXIT cp ${userData} "$seed/user-data" cp ${metadata} "$seed/meta-data" genisoimage -quiet -output /var/lib/libvirt/boot/fedora-cloud-init.iso.new \ -volid cidata -joliet -rock "$seed/user-data" "$seed/meta-data" mv /var/lib/libvirt/boot/fedora-cloud-init.iso.new /var/lib/libvirt/boot/fedora-cloud-init.iso virsh define ${domain} virsh autostart fedora if ! virsh list --name | grep -qx fedora; then virsh start fedora fi ''; }; }