Commit 3c8d4bd3c0d9

Vincent Demeester <vincent@sbr.pm>
2026-04-16 10:46:37
feat: generate Boox SSH config from globals.nix
Added Nix expression to derive Boox SSH config from globals.machines, replacing manually maintained file. Added make target for regeneration.
1 parent 35cce3c
Changed files (3)
dots/config/boox/generate-ssh-config.nix
@@ -0,0 +1,78 @@
+# Generate SSH config for Boox (osaka) Termux
+# Usage: nix eval --raw -f dots/config/boox/generate-ssh-config.nix
+# Or:    make boox/ssh-config
+let
+  pkgs = import <nixpkgs> { };
+  lib = pkgs.lib;
+  globals = import ../../../globals.nix { };
+
+  # Generate host entries from globals.machines
+  # Only VPN hosts (Boox connects via WireGuard, not LAN)
+  hostEntries = lib.concatStrings (
+    lib.attrsets.mapAttrsToList (
+      _name: machine:
+      let
+        vpnIps = lib.attrsets.attrByPath [ "net" "vpn" "ips" ] [ ] machine;
+        names = lib.attrsets.attrByPath [ "net" "names" ] [ ] machine;
+        vpnNames = builtins.filter (n: lib.strings.hasSuffix ".vpn" n) names;
+        sbrNames = builtins.filter (n: lib.strings.hasSuffix ".sbr.pm" n) names;
+        homeNames = builtins.filter (n: lib.strings.hasSuffix ".home" n) names;
+      in
+      lib.optionalString (vpnIps != [ ]) (
+        lib.concatStrings (
+          # VPN entries
+          map (n: ''
+
+            Host ${n}
+                HostName ${builtins.head vpnIps}
+                User vincent
+          '') vpnNames
+          # .sbr.pm entries (use DNS)
+          ++ map (n: ''
+
+            Host ${n}
+                HostName ${n}
+                User vincent
+          '') sbrNames
+          # .home entries (LAN IP)
+          ++ lib.optionals (lib.attrsets.attrByPath [ "net" "ips" ] [ ] machine != [ ]) (
+            map (n: ''
+
+              Host ${n}
+                  HostName ${builtins.head machine.net.ips}
+                  User vincent
+            '') homeNames
+          )
+        )
+      )
+    ) globals.machines
+  );
+in
+''
+  # Boox (osaka) SSH config — auto-generated from globals.nix
+  # Do not edit manually! Regenerate with: make boox/ssh-config
+  #
+  # Generated entries: VPN, LAN, and .sbr.pm hosts
+
+  Host *
+      ServerAliveInterval 60
+      AddKeysToAgent yes
+      IdentityFile ~/.ssh/id_ed25519
+      StrictHostKeyChecking accept-new
+
+  # === Homelab ===
+  ${hostEntries}
+  # === Git forges ===
+
+  Host github.com
+      User git
+      IdentityFile ~/.ssh/id_ed25519
+
+  Host gitlab.com
+      User git
+      IdentityFile ~/.ssh/id_ed25519
+
+  Host codeberg.org
+      User git
+      IdentityFile ~/.ssh/id_ed25519
+''
dots/config/boox/ssh_config
@@ -1,5 +1,7 @@
-# Boox (osaka) SSH config — generated from homelab globals
-# Simplified: no FIDO2, no shpool, plain ed25519 key
+# Boox (osaka) SSH config — auto-generated from globals.nix
+# Do not edit manually! Regenerate with: make boox/ssh-config
+#
+# Generated entries: VPN, LAN, and .sbr.pm hosts
 
 Host *
     ServerAliveInterval 60
@@ -7,68 +9,200 @@ Host *
     IdentityFile ~/.ssh/id_ed25519
     StrictHostKeyChecking accept-new
 
-# === Homelab (VPN) ===
-
-Host athena.vpn
-    HostName 10.100.0.83
-    User vincent
-
-Host demeter.vpn
-    HostName 10.100.0.82
-    User vincent
-
-Host rhea.vpn
-    HostName 10.100.0.50
-    User vincent
+# === Homelab ===
 
 Host aion.vpn
     HostName 10.100.0.49
     User vincent
 
-Host kerkouane.vpn
-    HostName 10.100.0.1
+Host aion.sbr.pm
+    HostName aion.sbr.pm
     User vincent
 
-Host shikoku.vpn
-    HostName 10.100.0.2
-    User vincent
-
-Host nagoya.vpn
-    HostName 10.100.0.80
-    User vincent
-
-Host kyushu.vpn
-    HostName 10.100.0.17
-    User vincent
-
-Host aomi.vpn
-    HostName 10.100.0.17
-    User vincent
-
-Host sakhalin.vpn
-    HostName 10.100.0.16
-    User vincent
-
-Host okinawa.vpn
-    HostName 10.100.0.14
-    User vincent
-
-Host wakasu.vpn
-    HostName 10.100.0.8
-    User vincent
-
-Host hass.vpn
-    HostName 10.100.0.81
+Host aion.home
+    HostName 192.168.1.49
     User vincent
 
 Host aix.vpn
     HostName 10.100.0.89
     User vincent
 
+Host aix.sbr.pm
+    HostName aix.sbr.pm
+    User vincent
+
+Host aomi.vpn
+    HostName 10.100.0.17
+    User vincent
+
+Host aomi.sbr.pm
+    HostName aomi.sbr.pm
+    User vincent
+
+Host aomi.home
+    HostName 192.168.1.23
+    User vincent
+
+Host athena.vpn
+    HostName 10.100.0.83
+    User vincent
+
+Host athena.sbr.pm
+    HostName athena.sbr.pm
+    User vincent
+
+Host athena.home
+    HostName 192.168.1.183
+    User vincent
+
 Host carthage.vpn
     HostName 10.100.0.1
     User vincent
 
+Host carthage.sbr.pm
+    HostName carthage.sbr.pm
+    User vincent
+
+Host demeter.vpn
+    HostName 10.100.0.82
+    User vincent
+
+Host demeter.sbr.pm
+    HostName demeter.sbr.pm
+    User vincent
+
+Host demeter.home
+    HostName 192.168.1.182
+    User vincent
+
+Host hass.vpn
+    HostName 10.100.0.81
+    User vincent
+
+Host hass.sbr.pm
+    HostName hass.sbr.pm
+    User vincent
+
+Host hass.home
+    HostName 192.168.1.181
+    User vincent
+
+Host hokkaido.vpn
+    HostName 10.100.0.5
+    User vincent
+
+Host hokkaido.sbr.pm
+    HostName hokkaido.sbr.pm
+    User vincent
+
+Host hokkaido.home
+    HostName 192.168.1.115
+    User vincent
+
+Host kerkouane.vpn
+    HostName 10.100.0.1
+    User vincent
+
+Host kerkouane.sbr.pm
+    HostName kerkouane.sbr.pm
+    User vincent
+
+Host kyushu.vpn
+    HostName 10.100.0.19
+    User vincent
+
+Host kyushu.sbr.pm
+    HostName kyushu.sbr.pm
+    User vincent
+
+Host kyushu.home
+    HostName 192.168.1.36
+    User vincent
+
+Host nagoya.vpn
+    HostName 10.100.0.80
+    User vincent
+
+Host nagoya.sbr.pm
+    HostName nagoya.sbr.pm
+    User vincent
+
+Host nagoya.home
+    HostName 192.168.1.80
+    User vincent
+
+Host okinawa.vpn
+    HostName 10.100.0.14
+    User vincent
+
+Host okinawa.sbr.pm
+    HostName okinawa.sbr.pm
+    User vincent
+
+Host okinawa.home
+    HostName 192.168.1.42
+    User vincent
+
+Host osaka.vpn
+    HostName 10.100.0.64
+    User vincent
+
+Host osaka.sbr.pm
+    HostName osaka.sbr.pm
+    User vincent
+
+Host rhea.vpn
+    HostName 10.100.0.50
+    User vincent
+
+Host rhea.sbr.pm
+    HostName rhea.sbr.pm
+    User vincent
+
+Host rhea.home
+    HostName 192.168.1.50
+    User vincent
+
+Host sakhalin.vpn
+    HostName 10.100.0.16
+    User vincent
+
+Host sakhalin.sbr.pm
+    HostName sakhalin.sbr.pm
+    User vincent
+
+Host sakhalin.home
+    HostName 192.168.1.70
+    User vincent
+
+Host shikoku.vpn
+    HostName 10.100.0.2
+    User vincent
+
+Host shikoku.sbr.pm
+    HostName shikoku.sbr.pm
+    User vincent
+
+Host shikoku.home
+    HostName 192.168.1.24
+    User vincent
+
+Host suzu.vpn
+    HostName 10.100.0.65
+    User vincent
+
+Host suzu.sbr.pm
+    HostName suzu.sbr.pm
+    User vincent
+
+Host wakasu.vpn
+    HostName 10.100.0.8
+    User vincent
+
+Host wakasu.sbr.pm
+    HostName wakasu.sbr.pm
+    User vincent
+
 # === Git forges ===
 
 Host github.com
Makefile
@@ -91,6 +91,11 @@ fmt: ## Format Nix files
 dots: ## Build dotfiles
 	@$(MAKE) -C dots
 
+.PHONY: boox/ssh-config
+boox/ssh-config: ## Generate Boox SSH config from globals.nix
+	nix eval --raw -f dots/config/boox/generate-ssh-config.nix > dots/config/boox/ssh_config
+	@echo "✅ dots/config/boox/ssh_config regenerated"
+
 ##@ Keyboards
 
 .PHONY: keyboards keyboards/moonlander/build keyboards/moonlander/flash keyboards/moonlander/update keyboards/moonlander/clean