grace/dots
dotfiles/nix configs
git clone https://git.gae.moe/grace/dots
c1be8e3
main
1{ pkgs , ...} : 2 3let 4userData = pkgs . writeText "fedora-user-data" ( 5"#cloud-config\n" 6+ builtins . toJSON { 7hostname = "nate" ; 8ssh_deletekeys = false ; 9users = [ 10{ 11name = "armbordy" ; 12groups = [ "wheel" ]; 13shell = "/bin/bash" ; 14sudo = "ALL=(ALL) NOPASSWD:ALL" ; 15lock_passwd = true ; 16ssh_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); 25metadata = pkgs . writeText "fedora-meta-data" '' 26instance-id: fedora-nate-v1 27local-hostname: nate 28'' ; 29network = 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'' ; 39domain = 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{ 76systemd . tmpfiles . rules = [ 77"d /var/lib/libvirt/images 0755 root root -" 78"d /var/lib/libvirt/boot 0755 root root -" 79]; 80 81systemd . services . fedora-vm = { 82description = "Declare and start the Fedora VM" ; 83wantedBy = [ "multi-user.target" ]; 84requires = [ "libvirtd.service" ]; 85after = [ "libvirtd.service" ]; 86restartTriggers = [ 87domain 88userData 89metadata 90]; 91unitConfig . ConditionPathExists = "/var/lib/libvirt/images/fedora.qcow2" ; 92serviceConfig = { 93Type = "oneshot" ; 94RemainAfterExit = true ; 95}; 96path = [ 97pkgs . libvirt 98pkgs . cdrkit 99pkgs . coreutils 100pkgs . gnugrep 101]; 102script = '' 103set -eu 104virsh () { command virsh --connect qemu:///system " $ @"; } 105if ! virsh net-info default > /dev/null 2 >&1; then 106virsh net-define ${ network } 107fi 108virsh net-autostart default 109if ! virsh net-info default | grep -q 'Active:.*yes'; then 110virsh net-start default 111fi 112seed = $( mktemp -d ) 113trap 'rm -rf "$seed"' EXIT 114cp ${ userData } " $ seed /user-data" 115cp ${ metadata } " $ seed /meta-data" 116genisoimage -quiet -output /var/lib/libvirt/boot/fedora-cloud-init.iso.new \ 117-volid cidata -joliet -rock " $ seed /user-data" " $ seed /meta-data" 118mv /var/lib/libvirt/boot/fedora-cloud-init.iso.new /var/lib/libvirt/boot/fedora-cloud-init.iso 119virsh define ${ domain } 120virsh autostart fedora 121if ! virsh list --name | grep -qx fedora; then 122virsh start fedora 123fi 124'' ; 125}; 126}