From b4b928a985c650651d1c142d7de213531a70353b Mon Sep 17 00:00:00 2001 From: Hermes Date: Wed, 17 Jun 2026 08:29:24 -0400 Subject: [PATCH] fix: clean module and flake after merge --- flake.nix | 8 +- .../nixos/hardware/uconsole-cm5-aio-v2.nix | 144 +++++++++++++++++- users/ai-worker/ai-worker.nix | 1 - users/gortium/gortium.nix | 2 + 4 files changed, 141 insertions(+), 14 deletions(-) diff --git a/flake.nix b/flake.nix index febb26b..a57e394 100644 --- a/flake.nix +++ b/flake.nix @@ -14,14 +14,10 @@ }; nixpkgs-uconsole.url = "github:NixOS/nixpkgs/nixos-25.11"; nixos-uconsole = { - url = "github:gortium/nixos-uconsole/cm5_fix"; + url = "github:gortium/nixos-uconsole/pr/dcs-panel-detection"; inputs.nixpkgs.follows = "nixpkgs-uconsole"; inputs.nixos-raspberrypi.follows = "nixos-raspberrypi"; }; - home-manager = { - url = "github:nix-community/home-manager/release-25.11"; - inputs.nixpkgs.follows = "nixpkgs-uconsole"; - }; nixos-raspberrypi = { url = "github:gortium/nixos-raspberrypi/cm5-cross-v1"; inputs.nixpkgs.follows = "nixpkgs-uconsole"; @@ -121,12 +117,10 @@ in { nix.package = lixCross.lix; }) inputs.home-manager.nixosModules.home-manager agenix.nixosModules.default - home-manager.nixosModules.home-manager ./hosts/uconsole-cm5/configuration.nix ./hosts/uconsole-cm5/hardware-configuration.nix ./modules/nixos/services/wireguard-client.nix ./modules/nixos/security/ai-worker-restricted.nix - ./modules/nixos/hardware/uconsole-cm5-aio-v2.nix ./users/gortium/gortium.nix ./users/ai-worker/ai-worker.nix ]; diff --git a/modules/nixos/hardware/uconsole-cm5-aio-v2.nix b/modules/nixos/hardware/uconsole-cm5-aio-v2.nix index 132fb96..7c70505 100644 --- a/modules/nixos/hardware/uconsole-cm5-aio-v2.nix +++ b/modules/nixos/hardware/uconsole-cm5-aio-v2.nix @@ -7,7 +7,7 @@ let # GPIO pin map matching the AIO v2 board hardware # SDR (RTL-SDR): GPIO 7 - # LoRa (S60127) : GPIO 16 + # LoRa (SX1262) : GPIO 16 # USB Hub Interne: GPIO 23 # GPS (GNSS) : GPIO 27 gpioMap = { @@ -21,17 +21,149 @@ let applyRailsScript = pkgs.writeShellScript "apply-aio-v2-rails" ( '' set -e - PINCTRL=${pkgs.libraspberrypip}/bin/pinctrl + PINCTRL=${pkgs.libraspberrypi}/bin/pinctrl '' - + concatStringsSep "" (mapAttrToList (name: pin: '' + + concatStringsSep "" (mapAttrsToList (name: pin: '' if [ "${if cfg.bootRails.${name} then "1" else "0"}" = "1" ]; then - echo "AIO v2: ${name} (GPIO${toString pin}) β†’ ON" + echo "AIO v2: ${name} (GPIO${toString pin}) -> ON" $PINCTRL set ${toString pin} op dh else - echo "AIO v2: ${name} (GPIO${toString pin}) β†’ OFF" + echo "AIO v2: ${name} (GPIO${toString pin}) -> OFF" $PINCTRL set ${toString pin} op dl fi '') gpioMap) ); - # aiov2_ctl CLI tool ‘䁙•э‘•™Ι½΄₯Ρ!Ո°…Ω…₯±…‰±”…́…₯½ΨΙ}Ρ±€(€…₯½ΨΙ Ρ±A­œ€τΑ­ΜΉΝΡ‘•ΉΨΉ΅­•Ι₯Ω…Ρ₯½ΈΙ•Œμ(€€€ΑΉ…΅”€τ€‰…₯½ΨΙ}Ρ°ˆμ(€€€Ω•ΙΝ₯½Έ€τ€ˆΐ΅ΥΉΝΡ…‰±”΄ΘΐΘΨ΄ΐΨ΄Δ؈μ((€€€ΝɌ€τΑ­ΜΉ™•э‘Ι½΅₯Ρ!Ոμ(€€€€€½έΉ•Θ€τ€‰‘…­•ɝ…‘•Ρ̈μ(€€€€€Ι•ΑΌ€τ€‰…₯½ΨΙ}Ρ°ˆμ(€€€€€Ι•Ψ€τ€‰΅…₯Έˆμ(€€€€€‘…Ν €τ€‰Ν‘„ΘΤΨ΅‘Ε=ΩLΕ,ΥΑYaΙ½UΤΑ€ΥHεeΕI ΙTΝ™ι‰δΩΥΥΨέ,ΐĈμ(€€€τμ((€€€‘½ΉΡUΉΑ…¬€τΡΙΥ”μ((€€€₯ΉΝΡ…±±A‘…Ν”€τ€œœ(€€€€€΅­‘₯Θ€΅ΐ€‘½ΥΠ½‰₯Έ€‘½ΥΠ½Ν‘…Ι”½…₯½ΨΙ}Ρ°½₯΅œ(€€€€€ΐ€‘ΝɌ½…₯½ΨΙ}Ρ°ΉΑ䀑½ΥΠ½‰₯Έ½…₯½ΨΙ}Ρ°(€€€€€‘΅½€¬έ`€‘½ΥΠ½‰₯Έ½…₯½ΨΙ}Ρ°(€€€€€Α…э‘M‘•‰…ΉΜ€‘½ΥΠ½‰₯Έ½…₯½ΨΙ}Ρ°(€€€€€ΝΥ‰ΝΡ₯ΡΥΡ•%ΉA±…”€‘½ΥΠ½‰₯Έ½…₯½ΨΙ}Ρ°p(€€€€€€€€΄΅Ι•Α±…”΅™…₯°€œˆ½ΥΝΘ½±½…°½Ν‘…Ι”½…₯½ΨΙ}Ρ°½₯΅œΌœ€œˆ‘½ΥΠ½Ν‘…Ι”½…₯½ΨΙ}Ρ°½₯΅œΌœ(€€€€€ΐ€΅Θ€‘ΝɌ½₯΅œΌ¨€‘½ΥΠ½Ν‘…Ι”½…₯½ΨΙ}Ρ°½₯΅œΌ(€€€€œœμ((€€€΅•Ρ„€τμ(€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰!…­•Ι…‘•ΡΜΥ ½ΉΝ½±”%<ΨȁA%<½ΉΡΙ½°…ΉΡ•±•΅•ΡΙδΡ½½°ˆμ(€€€€€‘½΅•Α…”€τ€‰‘ΡΡΑΜθΌ½₯ёՈΉ½΄½‘…­•ɝ…‘•ΡΜ½…₯½ΨΙ}Ρ°ˆμ(€€€€€±₯•ΉΝ”€τ±₯ˆΉ±₯•ΉΝ•ΜΉ΅₯Πμ(€€€€€΅…₯ΉΡ…₯Ή•ΙΜ€τέ₯Ρ ±₯ˆΉ΅…₯ΉΡ…₯Ή•ΙΜμltμ(€€€€€Α±…Ρ™½Ι΅Μ€τl€‰……ɍ ΨΠ΅±₯ΉΥΰˆtμ(€€€τμ(€τμ)₯Έμ(€½ΑΡ₯½ΉΜΉ‘…Ι‘έ…Ι”ΉΥ½ΉΝ½±”΅΄Τ΅…₯Ό΅ΨΘ€τμ(€€€•Ή…‰±”€τ΅­Ή…‰±•=ΑΡ₯½Έ€‰!…­•Ι…‘•ΡΜΥ ½ΉΝ½±”%<Ψȁ‰½…ɐΝΥΑΑ½ΙЈμ((€€€‰½½ΡI…₯±Μ€τμ(€€€€€AL€τ΅­=ΑΡ₯½Έμ(€€€€€€€ΡεΑ”€τΡεΑ•ΜΉ‰½½°μ(€€€€€€€‘•™…Υ±Π€τ™…±Ν”μ(€€€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰Ή…‰±”AL΅½‘Υ±”…Ё‰½½Π€‘A%<€Θά€ˆμ(€€€€€τμ(€€€€€1=I€τ΅­=ΑΡ₯½Έμ(€€€€€€€ΡεΑ”€τΡεΑ•ΜΉ‰½½°μ(€€€€€€€‘•™…Υ±Π€τ™…±Ν”μ(€€€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰Ή…‰±”1½I„΅½‘Υ±”…Ё‰½½Π€‘A%<€ΔΨ€ˆμ(€€€€€τμ(€€€€€MH€τ΅­=ΑΡ₯½Έμ(€€€€€€€ΡεΑ”€τΡεΑ•ΜΉ‰½½°μ(€€€€€€€‘•™…Υ±Π€τ™…±Ν”μ(€€€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰Ή…‰±”M΅½‘Υ±”…Ё‰½½Π€‘A%<€ά€ˆμ(€€€€€τμ(€€€€€UM€τ΅­=ΑΡ₯½Έμ(€€€€€€€ΡεΑ”€τΡεΑ•ΜΉ‰½½°μ(€€€€€€€‘•™…Υ±Π€τ™…±Ν”μ(€€€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰Ή…‰±”₯ΉΡ•ΙΉ…°UM‘Ո…Ё‰½½Π€‘A%<€ΘΜ€ˆμ(€€€€€τμ(€€€τμ((€€€Α…­…”€τ΅­=ΑΡ₯½Έμ(€€€€€ΡεΑ”€τΡεΑ•ΜΉΑ…­…”μ(€€€€€‘•™…Υ±Π€τ…₯½ΨΙ Ρ±A­œμ(€€€€€‘•™…Υ±ΡQ•αΠ€τ±₯Ρ•Ι…±αΑΙ•ΝΝ₯½Έ€‰…₯½ΨΙ Ρ±A­œˆμ(€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰…₯½ΨΙ}Ρ°Α…­…”ΡΌΥΝ”ˆμ(€€€τμ((€€€•Ή…‰±•AL€τ΅­=ΑΡ₯½Έμ(€€€€€ΡεΑ”€τΡεΑ•ΜΉ‰½½°μ(€€€€€‘•™…Υ±Π€τ™…±Ν”μ(€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€œœ(€€€€€€€Ή…‰±”ALUIP€ ½‘•Ψ½ΡΡε5ΐ…Π€δΨΐΐ‰…Ր€Έ(€€€€€€€I•ΕΥ₯ɕ́•Ή…‰±₯ΉœUIP½ΈΡ‘” 4ԁΩ₯„‰½½ΠΉ­•ΙΉ•±A…Ι…΅ΜΈ(€€€€€€œœμ(€€€τμ((€€€•Ή…‰±•U$€τ΅­=ΑΡ₯½Έμ(€€€€€ΡεΑ”€τΡεΑ•ΜΉ‰½½°μ(€€€€€‘•™…Υ±Π€τ™…±Ν”μ(€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€œœ(€€€€€€€Ή…‰±”Ρ‘”ΝεΝΡ•΄ΡΙ…δU$™½Θ…₯½ΨΙ}Ρ°Έ(€€€€€€€I•ΕΥ₯ɕ́„‘•Ν­Ρ½ΐ•ΉΩ₯Ι½Ή΅•ΉΠέ₯Ρ ΝεΝΡ•΄ΡΙ…δΝΥΑΑ½ΙΠΈ(€€€€€€œœμ(€€€τμ(€τμ((€½Ή™₯œ€τ΅­%˜™œΉ•Ή…‰±”μ(€€€€ŒA…­…”Ρ‘”…₯½ΨΙ}Ρ°Ρ½½°€¬Α₯ΉΡΙ°(€€€•ΉΩ₯Ι½Ή΅•ΉΠΉΝεΝΡ•΅A…­…•Μ€τέ₯Ρ Α­Μμl(€€€€€™œΉΑ…­…”(€€€€€±₯‰Ι…ΝΑ‰•ΙΙεΑ€€€€€€€ŒΑΙ½Ω₯‘•́Α₯ΉΡΙ°(€€€tμ((€€€€Œ ½½ΠΙ…₯°ΝεΝΡ•΅½Ή•Ν‘½ΠΝ•ΙΩ₯”(€€€ΝεΝΡ•΅ΉΝ•ΙΩ₯•ΜΉ…₯½ΨΘ΅Ι…₯±Μ΅‰½½Π€τμ(€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰ΑΑ±δ%<ΨȁA%<Ι…₯°‰½½ΠΝΡ…Ρ•Μˆμ(€€€€€…™Ρ•Θ€τl€‰±½…°΅™ΜΉΡ…ɝ•Πˆtμ(€€€€€έ…ΉΡΜ€τl€‰±½…°΅™ΜΉΡ…ɝ•Πˆtμ(€€€€€‰•™½Ι”€τl€‰΅Υ±Ρ€΅Υ͕ȹхɝ•Πˆtμ(€€€€€έ…ΉΡ•‘ δ€τl€‰΅Υ±Ρ€΅Υ͕ȹхɝ•Πˆtμ(€€€€€Ν•ΙΩ₯• ½Ή™₯œ€τμ(€€€€€€€QεΑ”€τ€‰½Ή•Ν‘½Πˆμ(€€€€€€€ᕍMΡ…ΙΠ€τ€ˆ‘ν…ΑΑ±εI…₯±ΝMΙ₯ΑΡτˆμ(€€€€€€€I•΅…₯Ή™Ρ•Ια₯Π€τΡΙΥ”μ(€€€€€τμ(€€€τμ((€€€€ŒAL½Ή™₯ΥΙ…Ρ₯½Έ(€€€‰½½ΠΉ­•ΙΉ•±A…Ι…΅Μ€τ΅­%˜™œΉ•Ή…‰±•ALl€‰Υ…ΙΠΐυ½Έˆtμ((€€€ΥΝ•ΙΜΉΥΝ•ΙΜ€τ΅­%˜™œΉ•Ή…‰±•ALμ(€€€€€½ΙΡ₯Υ΄€τμ(€€€€€€€•αΡΙ…Ι½ΥΑΜ€τl€‰‘₯…±½ΥЈtμ(€€€€€τμ(€€€τμ((€€€€ŒU$…ΥΡ½ΝΡ…ΙΠ€‘a€(€€€ΝεΝΡ•΅ΉΥΝ•ΘΉΝ•ΙΩ₯•ΜΉ…₯½ΨΘ΅Ρ°΅Υ€€τ΅­%˜™œΉ•Ή…‰±•U$μ(€€€€€‘•͍Ι₯ΑΡ₯½Έ€τ€‰%<ΨȁMεΝΡ•΄QΙ…δ ½ΉΡΙ½±±•Θˆμ(€€€€€…™Ρ•Θ€τl€‰Ι…Α‘₯…°΅Ν•ΝΝ₯½ΈΉΡ…ɝ•Πˆtμ(€€€€€έ…ΉΡΜ€τl€‰Ι…Α‘₯…°΅Ν•ΝΝ₯½ΈΉΡ…ɝ•Πˆtμ(€€€€€έ…ΉΡ•‘ δ€τl€‰Ι…Α‘₯…°΅Ν•ΝΝ₯½ΈΉΡ…ɝ•Πˆtμ(€€€€€Ν•ΙΩ₯• ½Ή™₯œ€τμ(€€€€€€€QεΑ”€τ€‰Ν₯΅Α±”ˆμ(€€€€€€€ᕍMΡ…ΙΠ€τ€ˆ‘퍙œΉΑ…­…•τ½‰₯Έ½…₯½ΨΙ}Ρ°€΄΅Υ€ˆμ(€€€€€€€I•ΝΡ…ΙΠ€τ€‰½Έ΅™…₯±ΥΙ”ˆμ(€€€€€€€I•ΝΡ…ΙΡM•Œ€τ€Τμ(€€€€€τμ(€€€€€•ΉΩ₯Ι½Ή΅•ΉΠ€τμ(€€€€€€€%=XΙ} Q1} U€τ€ˆΐˆμ(€€€€€τμ(€€€τμ(€τμ)τ \ No newline at end of file + # aiov2_ctl CLI tool -- fetched from GitHub, available as `aiov2_ctl` + aiov2CtlPkg = pkgs.stdenv.mkDerivation rec { + pname = "aiov2_ctl"; + version = "0-unstable-2026-06-16"; + + src = pkgs.fetchFromGitHub { + owner = "hackergadgets"; + repo = "aiov2_ctl"; + rev = "main"; + hash = "sha256-hqOvS1K5pDVXAroUE50i5R9YqRgC2U3fzby6uuB67K0="; + }; + + dontUnpack = true; + + installPhase = '' + mkdir -p $out/bin $out/share/aiov2_ctl/img + cp $src/aiov2_ctl.py $out/bin/aiov2_ctl + chmod +x $out/bin/aiov2_ctl + patchShebangs $out/bin/aiov2_ctl + substituteInPlace $out/bin/aiov2_ctl \ + --replace-fail '"/usr/local/share/aiov2_ctl/img/' '"'$out'/share/aiov2_ctl/img/' + cp -r $src/img/* $out/share/aiov2_ctl/img/ + ''; + + meta = { + description = "HackerGadgets uConsole AIO v2 GPIO control and telemetry tool"; + homepage = "https://github.com/hackergadgets/aiov2_ctl"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ ]; + platforms = [ "aarch64-linux" ]; + }; + }; +in { + options.hardware.uconsole-cm5-aio-v2 = { + enable = mkEnableOption "HackerGadgets uConsole AIO v2 board support"; + + bootRails = { + GPS = mkOption { + type = types.bool; + default = false; + description = "Enable GPS module at boot (GPIO 27)"; + }; + LORA = mkOption { + type = types.bool; + default = false; + description = "Enable LoRa module at boot (GPIO 16)"; + }; + SDR = mkOption { + type = types.bool; + default = false; + description = "Enable SDR module at boot (GPIO 7)"; + }; + USB = mkOption { + type = types.bool; + default = false; + description = "Enable internal USB hub at boot (GPIO 23)"; + }; + }; + + package = mkOption { + type = types.package; + default = aiov2CtlPkg; + defaultText = literalExpression "aiov2CtlPkg"; + description = "aiov2_ctl package to use"; + }; + + enableGPS = mkOption { + type = types.bool; + default = false; + description = '' + Enable GPS UART (/dev/ttyAMA0 at 9600 baud). + Requires enabling UART on the CM5 via boot.kernelParams. + ''; + }; + + enableGUI = mkOption { + type = types.bool; + default = false; + description = '' + Enable the system tray GUI for aiov2_ctl. + Requires a desktop environment with system tray support. + ''; + }; + }; + + config = mkIf cfg.enable { + # Package the aiov2_ctl tool + pinctrl + environment.systemPackages = with pkgs; [ + cfg.package + libraspberrypi # provides pinctrl + ]; + + # Boot rail systemd oneshot service + systemd.services.aiov2-rails-boot = { + description = "Apply AIO v2 GPIO rail boot states"; + after = [ "local-fs.target" ]; + wants = [ "local-fs.target" ]; + before = [ "multi-user.target" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${applyRailsScript}"; + RemainAfterExit = true; + }; + }; + + # GPS configuration + boot.kernelParams = mkIf cfg.enableGPS [ "uart0=on" ]; + + users.users = mkIf cfg.enableGPS { + gortium = { + extraGroups = [ "dialout" ]; + }; + }; + + # GUI autostart (XDG) + systemd.user.services.aiov2-ctl-gui = mkIf cfg.enableGUI { + description = "AIO v2 System Tray Controller"; + after = [ "graphical-session.target" ]; + wants = [ "graphical-session.target" ]; + wantedBy = [ "graphical-session.target" ]; + serviceConfig = { + Type = "simple"; + ExecStart = "${cfg.package}/bin/aiov2_ctl --gui"; + Restart = "on-failure"; + RestartSec = 5; + }; + environment = { + AIOV2_CTL_DEBUG = "0"; + }; + }; + }; +} diff --git a/users/ai-worker/ai-worker.nix b/users/ai-worker/ai-worker.nix index 6308151..8354681 100644 --- a/users/ai-worker/ai-worker.nix +++ b/users/ai-worker/ai-worker.nix @@ -22,7 +22,6 @@ # - NO access to infra repo (no bind mount) # - NO sudo access (no nh, nixos-rebuild, nixpkgs-fmt, nix) # WORKFLOW: SSH from Hermes container, run docker benchmarks, return and save results to /opt/data/ai-optimizer/ - services.aiWorkerAccess = true; # Restricted sudo for ai-worker - security checks only security.sudo.extraRules = [ diff --git a/users/gortium/gortium.nix b/users/gortium/gortium.nix index 7fbcbc6..1a2d77d 100644 --- a/users/gortium/gortium.nix +++ b/users/gortium/gortium.nix @@ -1,4 +1,5 @@ { pkgs, inputs, config, keys, ... }: { + home-manager.extraSpecialArgs = { inherit (config.networking) hostName; dotfiles = ../../assets/dotfiles; }; home-manager.users.gortium = import ./home.nix; home-manager.extraSpecialArgs = { hostName = config.networking.hostName; @@ -14,6 +15,7 @@ ]; shell = pkgs.zsh; passwordFile = config.age.secrets.gortium_password.path; + ignoreShellProgramCheck = true; openssh.authorizedKeys.keys = [ keys.users.gortium.main ];