278 lines
7.6 KiB
Nix
278 lines
7.6 KiB
Nix
#
|
|
# Per-system configuration for Trailblazer.
|
|
#
|
|
# vim: et:ts=2:sw=2:
|
|
#
|
|
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
modulesPath,
|
|
...
|
|
}:
|
|
let
|
|
ledOffScript = pkgs.writeScriptBin "ledsoff" ''
|
|
#!${pkgs.bash}/bin/bash
|
|
openrgb -d 0 -m off -b 0
|
|
openrgb -d 1 -m off -b 0
|
|
openrgb -d 2 -m off -b 0
|
|
openrgb -d 3 -m off -b 0
|
|
openrgb -d 4 -m off -b 0
|
|
openrgb -d "Corsair Lighting Node Pro" -m direct -z 0 -s 100 -b 0 -c black
|
|
openrgb -d "Corsair Lighting Node Pro" -m direct -z 1 -s 100 -b 0 -c black
|
|
'';
|
|
|
|
ledOnScript = pkgs.writeScriptBin "ledson" ''
|
|
#!${pkgs.bash}/bin/bash
|
|
openrgb -d 0 -m direct -c $1 -b 100
|
|
openrgb -d 1 -m direct -c $1 -b 100
|
|
openrgb -d 2 -m direct -c $1 -b 100
|
|
openrgb -d 3 -m direct -c $1 -b 100
|
|
openrgb -d 4 -m direct -c $1 -b 100
|
|
openrgb -d "Corsair Lighting Node Pro" -m direct -z 0 -s 100 -b 100 -c $1
|
|
openrgb -d "Corsair Lighting Node Pro" -m direct -z 1 -s 100 -b 100 -c $1
|
|
'';
|
|
|
|
commandScript = pkgs.writeScriptBin "trailblazer-command-daemon" ''
|
|
#!${pkgs.xonsh}/bin/xonsh
|
|
|
|
print("[I] Trailblazer command service started. Waiting for command.")
|
|
print("----------------------------")
|
|
|
|
for verb in !(${pkgs.mosquitto}/bin/mosquitto_sub -h fuuka -t trailblazer/command):
|
|
verb = verb.strip()
|
|
|
|
if verb == "lights/off":
|
|
print("[I] Got a 'lights out' request. Making things quiet.")
|
|
|
|
# Turn off monitors for any X11 anything.
|
|
for auth in g`/tmp/xauth_*`:
|
|
print(f"[I] Turning off monitors on X instance with auth file {auth}.")
|
|
!(env DISPLAY=:0 XAUTHORITY=@(auth) xset dpms force off)
|
|
|
|
# Turn off monitors on each niri session,
|
|
sockets = g`/var/run/user/1000/niri*.sock`
|
|
for socket in sockets:
|
|
print(f"[I] Turning off monitors on niri instance {socket}.")
|
|
!(env NIRI_SOCKET=@(socket) niri msg action power-off-monitors)
|
|
|
|
print("[I] Turning off RGB leds.")
|
|
!(${ledOffScript}/bin/ledsoff)
|
|
|
|
print("[I] Everything should be... well, not-shiny, captain!")
|
|
|
|
if verb == "lights/ledsoff":
|
|
print("[I] Turning off RGB leds.")
|
|
!(${ledOffScript}/bin/ledsoff)
|
|
|
|
elif verb == "lights/o":
|
|
print("[I] Setting lights to 'sight colors.")
|
|
!(${ledOnScript}/bin/ledson white)
|
|
|
|
elif verb == "lights/t":
|
|
print("[I] Setting lights to tsu colors.")
|
|
!(${ledOnScript}/bin/ledson blue)
|
|
|
|
elif verb == "lights/k":
|
|
print("[I] Setting lights to Kaye colors.")
|
|
!(${ledOnScript}/bin/ledson purple)
|
|
|
|
elif verb == "lights/w":
|
|
print("[I] Setting lights to Whim colors.")
|
|
!(${ledOnScript}/bin/ledson green)
|
|
|
|
elif verb == "lights/s":
|
|
print("[I] Setting lights to Scar colors.")
|
|
!(${ledOnScript}/bin/ledson red)
|
|
|
|
elif verb == "lights/e":
|
|
print("[I] Setting lights to Echo colors.")
|
|
!(${ledOnScript}/bin/ledson gray)
|
|
|
|
elif verb == "suspend":
|
|
print("[I] Going to sleep, as requested.")
|
|
!(systemctl suspend)
|
|
|
|
else:
|
|
print(f"[W] ignoring unknown verb '{verb}'")
|
|
|
|
print("----------------------------")
|
|
'';
|
|
in
|
|
{
|
|
system.stateVersion = "23.11";
|
|
|
|
imports = [
|
|
#./ups.nix
|
|
(modulesPath + "/installer/scan/not-detected.nix")
|
|
../../configs/build-machine-users.nix
|
|
];
|
|
|
|
# Bootloader.
|
|
boot.loader.systemd-boot.enable = true;
|
|
boot.loader.efi.canTouchEfiVariables = true;
|
|
|
|
# Networking.
|
|
networking.hostName = "trailblazer";
|
|
networking.networkmanager.enable = true;
|
|
networking.firewall.enable = false;
|
|
|
|
# This is a local machine, rather than our typical network-accesed ones.
|
|
# Run an ssh-agent locally.
|
|
programs.ssh.startAgent = true;
|
|
|
|
# Let fuse run as our user and still mount with proper perms.
|
|
programs.fuse.userAllowOther = true;
|
|
|
|
# Optimize our system for virtualisation.
|
|
boot.kernelPackages = pkgs.linuxPackages_zen;
|
|
|
|
# Disallow nouveau so the NVIDIA device is available for VFIO.
|
|
boot.blacklistedKernelModules = [ "nouveau" ];
|
|
|
|
# Allow IOMMU members to be sorted into their own groups for passthrough.
|
|
boot.kernelParams = [
|
|
"iommu=on"
|
|
"amd_iommu=on"
|
|
"pcie_acs_override=downstream,multifunction"
|
|
];
|
|
|
|
# Enable fingerprint reader.
|
|
services.fprintd.enable = true;
|
|
|
|
#
|
|
# Niri configuration for our monitors.
|
|
#
|
|
home-manager.users.deprekated = {
|
|
|
|
programs.niri.settings = {
|
|
|
|
# Top monitor.
|
|
outputs."DP-2" = {
|
|
scale = 1.0;
|
|
position = {
|
|
x = 0;
|
|
y = 0;
|
|
};
|
|
};
|
|
|
|
# Bottom monitor.
|
|
outputs."DP-3" = {
|
|
scale = 1.0;
|
|
position = {
|
|
x = 0;
|
|
y = 1440;
|
|
};
|
|
mode = {
|
|
width = 3440;
|
|
height = 1440;
|
|
refresh = 144.0;
|
|
};
|
|
};
|
|
|
|
# Right, vertical monitor.
|
|
# Note that the y position here makes the monitor not -so- offset.
|
|
outputs."HDMI-A-1" = {
|
|
scale = 1.0;
|
|
position = {
|
|
x = 3440;
|
|
y = 1440;
|
|
};
|
|
};
|
|
|
|
input.tablet.map-to-output = "HDMI-A-1";
|
|
};
|
|
|
|
# Also position waybar on only one monitor.
|
|
programs.waybar.settings.mainBar.output = "DP-3";
|
|
};
|
|
|
|
# Override stylix font sizes.
|
|
stylix.fonts.sizes.desktop = lib.mkForce 16;
|
|
|
|
# Use kwin for sddm instead of westin, to account for multi-monitor.
|
|
services.displayManager.sddm.wayland.compositor = "kwin";
|
|
|
|
# Use OpenRGB so we can silence our LEDs when appropriate.
|
|
services.hardware.openrgb = {
|
|
enable = true;
|
|
package = pkgs.openrgb-with-all-plugins;
|
|
motherboard = "amd";
|
|
};
|
|
|
|
# Provide docker for remote tasks.
|
|
virtualisation.docker.enable = true;
|
|
users.users.deprekated.extraGroups = [ "docker" ];
|
|
|
|
#
|
|
# Trailblazer remote service (allows trailblazer things to be controlled via Home Assistant.
|
|
#
|
|
systemd.services.trailblazer-commands = {
|
|
description = "trailblazer command service";
|
|
|
|
# Start once we're online.
|
|
wantedBy = [ "default.target" ];
|
|
wants = [ "network-online.target" ];
|
|
after = [ "network-online.target" ];
|
|
|
|
script = "${commandScript}/bin/trailblazer-command-daemon";
|
|
};
|
|
|
|
#
|
|
# Hardware config.
|
|
#
|
|
boot.initrd.availableKernelModules = [
|
|
"nvme"
|
|
"xhci_pci"
|
|
"ahci"
|
|
"usbhid"
|
|
"usb_storage"
|
|
"sd_mod"
|
|
"dm-raid"
|
|
];
|
|
boot.initrd.kernelModules = [ ];
|
|
boot.extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ];
|
|
boot.kernelModules = [
|
|
"kvm-amd"
|
|
"v4l2loopback"
|
|
];
|
|
|
|
fileSystems."/" = {
|
|
device = "/dev/disk/by-label/nix";
|
|
fsType = "xfs";
|
|
};
|
|
|
|
fileSystems."/boot" = {
|
|
device = "/dev/disk/by-label/boot";
|
|
fsType = "vfat";
|
|
options = [
|
|
"fmask=0022"
|
|
"dmask=0022"
|
|
];
|
|
};
|
|
|
|
fileSystems."/home" = {
|
|
device = "/dev/disk/by-label/home";
|
|
fsType = "xfs";
|
|
};
|
|
|
|
swapDevices = [ ];
|
|
|
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
|
# still possible to use this option, but it's recommended to use it in conjunction
|
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
|
networking.useDHCP = lib.mkDefault true;
|
|
# networking.interfaces.enp26s0.useDHCP = lib.mkDefault true;
|
|
# networking.interfaces.wlp25s0.useDHCP = lib.mkDefault true;
|
|
|
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
|
|
boot.swraid.enable = true;
|
|
boot.swraid.mdadmConf = ''
|
|
MAILADDR kate@deprekated.net
|
|
ARRAY /dev/md/nixos:0 level=raid0 num-devices=2 metadata=1.2 UUID=325ee7dc:7fcc6062:635e902f:af2552dc
|
|
devices=/dev/nvme0n1p1,/dev/nvme1n1p1
|
|
'';
|
|
}
|