grace/dots

dotfiles/nix configs

git clone https://git.gae.moe/grace/dots

Grace Yoderbig changesc1be8e3

main
4.3 KiB126 linesraw
1{ pkgs, ... }:
2
3let
4  userData = pkgs.writeText "fedora-user-data" (
5    "#cloud-config\n"
6    + builtins.toJSON {
7      hostname = "nate";
8      ssh_deletekeys = false;
9      users = [
10        {
11          name = "armbordy";
12          groups = [ "wheel" ];
13          shell = "/bin/bash";
14          sudo = "ALL=(ALL) NOPASSWD:ALL";
15          lock_passwd = true;
16          ssh_authorized_keys = [
17            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICaC4wtRMqCAI1T+tFahIwDWM8AWlgLDsHV0yEPUb7nK armbordy@armbordy-Inspiron-14-5430"
18            "cert-authority,principals=\"t:human,h:nate\" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEuc4HCdyEMu4uiYhlokSXmu+68hkm7j6CqVwjDkCeSj grace.pink"
19            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINySDE+jaYpuAWUdPQf/JcAWETeHgmh+T5Y4GUa7MfeM grace@turing"
20          ];
21        }
22      ];
23    }
24  );
25  metadata = pkgs.writeText "fedora-meta-data" ''
26    instance-id: fedora-nate-v1
27    local-hostname: nate
28  '';
29  network = pkgs.writeText "default-network.xml" ''
30    <network>
31      <name>default</name>
32      <forward mode='nat'/>
33      <bridge name='virbr0' stp='on' delay='0'/>
34      <ip address='192.168.122.1' netmask='255.255.255.0'>
35        <dhcp><range start='192.168.122.2' end='192.168.122.254'/></dhcp>
36      </ip>
37    </network>
38  '';
39  domain = pkgs.writeText "fedora.xml" ''
40    <domain type='kvm'>
41      <name>fedora</name>
42      <uuid>8ffbe0a2-839d-4f5b-8c9a-feb18edf9043</uuid>
43      <memory unit='MiB'>4096</memory>
44      <vcpu>4</vcpu>
45      <os><type arch='x86_64' machine='q35'>hvm</type><boot dev='hd'/></os>
46      <features><acpi/><apic/></features>
47      <cpu mode='host-passthrough'/>
48      <on_reboot>restart</on_reboot>
49      <devices>
50        <emulator>/run/libvirt/nix-emulators/qemu-system-x86_64</emulator>
51        <disk type='file' device='disk'>
52          <driver name='qemu' type='qcow2'/>
53          <source file='/var/lib/libvirt/images/fedora.qcow2'/>
54          <target dev='vda' bus='virtio'/>
55        </disk>
56        <disk type='file' device='cdrom'>
57          <driver name='qemu' type='raw'/>
58          <source file='/var/lib/libvirt/boot/fedora-cloud-init.iso'/>
59          <target dev='sda' bus='sata'/><readonly/>
60        </disk>
61        <interface type='network'>
62          <mac address='52:54:00:06:fa:d8'/>
63          <source network='default'/><model type='virtio'/>
64        </interface>
65        <serial type='pty'><target port='0'/></serial>
66        <console type='pty'><target type='serial' port='0'/></console>
67        <channel type='unix'><target type='virtio' name='org.qemu.guest_agent.0'/></channel>
68        <graphics type='spice' autoport='yes'><listen type='address' address='127.0.0.1'/></graphics>
69        <video><model type='virtio'/></video>
70        <rng model='virtio'><backend model='random'>/dev/urandom</backend></rng>
71      </devices>
72    </domain>
73  '';
74in
75{
76  systemd.tmpfiles.rules = [
77    "d /var/lib/libvirt/images 0755 root root -"
78    "d /var/lib/libvirt/boot 0755 root root -"
79  ];
80
81  systemd.services.fedora-vm = {
82    description = "Declare and start the Fedora VM";
83    wantedBy = [ "multi-user.target" ];
84    requires = [ "libvirtd.service" ];
85    after = [ "libvirtd.service" ];
86    restartTriggers = [
87      domain
88      userData
89      metadata
90    ];
91    unitConfig.ConditionPathExists = "/var/lib/libvirt/images/fedora.qcow2";
92    serviceConfig = {
93      Type = "oneshot";
94      RemainAfterExit = true;
95    };
96    path = [
97      pkgs.libvirt
98      pkgs.cdrkit
99      pkgs.coreutils
100      pkgs.gnugrep
101    ];
102    script = ''
103      set -eu
104      virsh() { command virsh --connect qemu:///system "$@"; }
105      if ! virsh net-info default >/dev/null 2>&1; then
106        virsh net-define ${network}
107      fi
108      virsh net-autostart default
109      if ! virsh net-info default | grep -q 'Active:.*yes'; then
110        virsh net-start default
111      fi
112      seed=$(mktemp -d)
113      trap 'rm -rf "$seed"' EXIT
114      cp ${userData} "$seed/user-data"
115      cp ${metadata} "$seed/meta-data"
116      genisoimage -quiet -output /var/lib/libvirt/boot/fedora-cloud-init.iso.new \
117        -volid cidata -joliet -rock "$seed/user-data" "$seed/meta-data"
118      mv /var/lib/libvirt/boot/fedora-cloud-init.iso.new /var/lib/libvirt/boot/fedora-cloud-init.iso
119      virsh define ${domain}
120      virsh autostart fedora
121      if ! virsh list --name | grep -qx fedora; then
122        virsh start fedora
123      fi
124    '';
125  };
126}