system: replace host detection with capabilities module #4

Merged
torjus merged 1 commits from refactor/host-capabilities into master 2026-01-31 09:24:22 +00:00
8 changed files with 112 additions and 13 deletions

View File

@@ -14,8 +14,9 @@ let
dontUnpack = true; dontUnpack = true;
installPhase = "install -Dm755 ${./arrhist.py} $out/bin/arrhist"; installPhase = "install -Dm755 ${./arrhist.py} $out/bin/arrhist";
}; };
withArrhist = if (osConfig.system.name == "gunter") then true else false; cfg = osConfig.host.capabilities;
withBattery = if (osConfig.system.name == "magicman") then true else false; withArrhist = cfg.enableArrhist;
withBattery = cfg.hasBattery;
in in
{ {
sops.secrets."sonarr_base_url" = { }; sops.secrets."sonarr_base_url" = { };
@@ -153,7 +154,7 @@ in
settings = [ settings = [
( (
let let
volInterval = if (osConfig.system.name == "gunter") then "5" else "1"; volInterval = toString cfg.volumeScrollStep;
in in
{ {
"layer" = "top"; "layer" = "top";

View File

@@ -1,6 +1,6 @@
{ pkgs, osConfig, ... }: { pkgs, osConfig, ... }:
let let
withCuda = if (osConfig.system.name == "gunter") then true else false; withCuda = osConfig.host.capabilities.hasCuda;
in in
{ {
imports = [ imports = [

View File

@@ -1,5 +1,14 @@
{ pkgs, config, ... }: {
pkgs,
config,
lib,
osConfig,
...
}:
let let
cfg = osConfig.host.capabilities;
backupEnabled = cfg.backupRepository != null && cfg.backupPassword != null;
# Backup home script # Backup home script
backup-home = pkgs.writeShellApplication { backup-home = pkgs.writeShellApplication {
name = "backup-home"; name = "backup-home";
@@ -12,8 +21,8 @@ let
]; ];
text = '' text = ''
echo "========== BACKUP HOME STARTING ==========" echo "========== BACKUP HOME STARTING =========="
export RESTIC_PASSWORD="gunter.home.2rjus.net" export RESTIC_PASSWORD="${cfg.backupPassword}"
export RESTIC_REPOSITORY="rest:http://10.69.12.52:8000/gunter.home.2rjus.net" export RESTIC_REPOSITORY="${cfg.backupRepository}"
SECRET_PATH="$XDG_CONFIG_HOME/sops-nix/secrets/gotify_backup_home" SECRET_PATH="$XDG_CONFIG_HOME/sops-nix/secrets/gotify_backup_home"
if ! [ -f "$SECRET_PATH" ]; then if ! [ -f "$SECRET_PATH" ]; then
@@ -53,7 +62,7 @@ let
retval=$? retval=$?
if [ $retval -ne 0 ]; then if [ $retval -ne 0 ]; then
curl "https://gotify.t-juice.club/message?token=$GOTIFY_TOKEN" \ curl "https://gotify.t-juice.club/message?token=$GOTIFY_TOKEN" \
-F "title=Backup of home@gunter failed!" \ -F "title=Backup of home@${osConfig.networking.hostName} failed!" \
-F "message=Please check status of backup-home service" -F "message=Please check status of backup-home service"
fi fi
fi fi
@@ -92,9 +101,9 @@ let
}; };
in in
{ {
sops.secrets."gotify_backup_home" = { }; sops.secrets."gotify_backup_home" = lib.mkIf backupEnabled { };
systemd.user.services.backup-home = { systemd.user.services.backup-home = lib.mkIf backupEnabled {
Unit = { Unit = {
Description = "Backup home directory"; Description = "Backup home directory";
After = [ After = [
@@ -107,7 +116,7 @@ in
ExecStart = "${backup-home}/bin/backup-home"; ExecStart = "${backup-home}/bin/backup-home";
}; };
}; };
systemd.user.timers.backup-home = { systemd.user.timers.backup-home = lib.mkIf backupEnabled {
Unit = { Unit = {
Description = "Backup home directory"; Description = "Backup home directory";
After = [ "network.target" ]; After = [ "network.target" ];

View File

@@ -22,7 +22,7 @@ in
matchBlocks = { matchBlocks = {
"bmo.uio.no-on-eduroam" = ( "bmo.uio.no-on-eduroam" = (
lib.mkIf (osConfig.system.name == "magicman") ( lib.mkIf (osConfig.host.capabilities.hasEduroamAccess) (
lib.hm.dag.entryBefore [ "bmo.uio.no" "*" ] { lib.hm.dag.entryBefore [ "bmo.uio.no" "*" ] {
match = "host bmo.uio.no exec \"nmcli -g GENERAL.STATE c s eduroam|grep -q -E '\\bactiv'\""; match = "host bmo.uio.no exec \"nmcli -g GENERAL.STATE c s eduroam|grep -q -E '\\bactiv'\"";
hostname = "bmo.uio.no"; hostname = "bmo.uio.no";

View File

@@ -113,6 +113,18 @@
# ]; # ];
services.xserver.videoDrivers = [ "nvidia" ]; services.xserver.videoDrivers = [ "nvidia" ];
# Host capabilities
host.capabilities = {
hasCuda = true;
hasBattery = false;
formFactor = "desktop";
volumeScrollStep = 5;
enableArrhist = true;
hasEduroamAccess = false;
backupRepository = "rest:http://10.69.12.52:8000/gunter.home.2rjus.net";
backupPassword = "gunter.home.2rjus.net";
};
# Install system-wide packages # Install system-wide packages
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
curl curl
@@ -123,7 +135,7 @@
wget wget
v4l-utils v4l-utils
nmap nmap
(lib.mkIf (config.system.name == "gunter") pciutils) pciutils
# X shit # X shit
# xorg.xorgserver # xorg.xorgserver

View File

@@ -44,6 +44,18 @@
}; };
}; };
# Host capabilities
host.capabilities = {
hasCuda = false;
hasBattery = true;
formFactor = "laptop";
volumeScrollStep = 1;
enableArrhist = false;
hasEduroamAccess = true;
backupRepository = null;
backupPassword = null;
};
# Bluetooth stuff # Bluetooth stuff
services.blueman.enable = true; services.blueman.enable = true;
hardware.bluetooth.enable = true; hardware.bluetooth.enable = true;

View File

@@ -5,6 +5,7 @@
./fwupd.nix ./fwupd.nix
./git.nix ./git.nix
./greetd.nix ./greetd.nix
./host-capabilities.nix
./hyprland.nix ./hyprland.nix
./label.nix ./label.nix
./libvirt.nix ./libvirt.nix

View File

@@ -0,0 +1,64 @@
{ lib, ... }:
with lib;
{
options.host.capabilities = {
# Hardware capabilities
hasCuda = mkOption {
type = types.bool;
default = false;
description = "Whether the host has CUDA-capable GPU (for btop, OBS, etc.)";
};
hasBattery = mkOption {
type = types.bool;
default = false;
description = "Whether the host has a battery (laptop)";
};
# Form factor
formFactor = mkOption {
type = types.enum [
"desktop"
"laptop"
];
default = "desktop";
description = "Physical form factor of the host";
};
# UI behavior customizations
volumeScrollStep = mkOption {
type = types.int;
default = 5;
description = "Volume adjustment step percentage for scroll wheel";
};
# Service-specific features
enableArrhist = mkOption {
type = types.bool;
default = false;
description = "Enable Sonarr/Radarr monitoring widget (arrhist)";
};
# Network environment features
hasEduroamAccess = mkOption {
type = types.bool;
default = false;
description = "Whether this host can connect to eduroam (for SSH config)";
};
# Backup configuration
backupRepository = mkOption {
type = types.nullOr types.str;
default = null;
description = "Restic backup repository URL for this host";
example = "rest:http://10.69.12.52:8000/gunter.home.2rjus.net";
};
backupPassword = mkOption {
type = types.nullOr types.str;
default = null;
description = "Restic backup password identifier for this host";
example = "gunter.home.2rjus.net";
};
};
}