{ 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
'';
};
}