diff --git a/nixos/doc/manual/release-notes/rl-2605.section.md b/nixos/doc/manual/release-notes/rl-2605.section.md index 7d6e7e34d2a9..2e40f225818d 100644 --- a/nixos/doc/manual/release-notes/rl-2605.section.md +++ b/nixos/doc/manual/release-notes/rl-2605.section.md @@ -38,6 +38,8 @@ - [Howdy](https://github.com/boltgolt/howdy), a Windows Helloâ„¢ style facial authentication program for Linux. +- [linux-enable-ir-emitter](https://github.com/EmixamPP/linux-enable-ir-emitter), a tool used to set up IR cameras, used with Howdy. + - [udp-over-tcp](https://github.com/mullvad/udp-over-tcp), a tunnel for proxying UDP traffic over a TCP stream. Available as `services.udp-over-tcp`. - [Komodo Periphery](https://github.com/moghtech/komodo), a multi-server Docker and Git deployment agent by Komodo. Available as [services.komodo-periphery](#opt-services.komodo-periphery.enable). diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 19be56b1241c..8422d5f308c2 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -878,6 +878,7 @@ ./services/misc/languagetool.nix ./services/misc/leaps.nix ./services/misc/lifecycled.nix + ./services/misc/linux-enable-ir-emitter.nix ./services/misc/litellm.nix ./services/misc/llama-cpp.nix ./services/misc/local-content-share.nix diff --git a/nixos/modules/services/misc/linux-enable-ir-emitter.nix b/nixos/modules/services/misc/linux-enable-ir-emitter.nix new file mode 100644 index 000000000000..66d10fc87b35 --- /dev/null +++ b/nixos/modules/services/misc/linux-enable-ir-emitter.nix @@ -0,0 +1,71 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.services.linux-enable-ir-emitter; +in +{ + options = { + services.linux-enable-ir-emitter = { + enable = lib.mkEnableOption "" // { + description = '' + Whether to enable IR emitter hardware. Designed to be used with the + Howdy facial authentication. After enabling the service, configure + the emitter with `sudo linux-enable-ir-emitter configure`. + ''; + }; + + package = lib.mkPackageOption pkgs "linux-enable-ir-emitter" { } // { + description = '' + Package to use for the Linux Enable IR Emitter service. + ''; + }; + + device = lib.mkOption { + type = lib.types.str; + default = "video2"; + description = '' + IR camera device to depend on. For example, for `/dev/video2` + the value would be `video2`. Find this with the command + {command}`realpath /dev/v4l/by-path/`. + ''; + }; + }; + }; + + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + + # https://github.com/EmixamPP/linux-enable-ir-emitter/blob/7e3a6527ef2efccabaeefc5a93c792628325a8db/sources/systemd/linux-enable-ir-emitter.service + systemd.services.linux-enable-ir-emitter = + let + targets = [ + "suspend.target" + "sleep.target" + "hybrid-sleep.target" + "hibernate.target" + "suspend-then-hibernate.target" + ]; + in + { + description = "Enable the infrared emitter"; + # Added to match + # https://github.com/EmixamPP/linux-enable-ir-emitter/blob/6.1.2/boot_service/systemd/linux-enable-ir-emitter.service + # Prevents the program fail to detect the IR camera until a service + # restart. + preStart = '' + ${pkgs.kmod}/bin/modprobe uvcvideo + sleep 1 + ''; + script = "${lib.getExe cfg.package} --verbose run"; + serviceConfig.StateDirectory = "linux-enable-ir-emitter"; + serviceConfig.LogsDirectory = "linux-enable-ir-emitter"; + + wantedBy = targets ++ [ "multi-user.target" ]; + after = targets ++ [ "dev-${cfg.device}.device" ]; + }; + }; +}