| { |
| lib |
| , config |
| , pkgs |
| , ... |
| }: let |
| cfg = config.chimera.cooling.OpenLinkHub; |
| in { |
| options.chimera.cooling.OpenLinkHub = { |
| enable = lib.mkEnableOption "Enable OpenLinkHub service for Corsair iCUE Link"; |
| package = lib.mkOption { |
| type = lib.types.package; |
| description = "OpenLinkHub package to use for the module"; |
| default = pkgs.chimera.OpenLinkHub; |
| }; |
| config = lib.mkOption { |
| type = lib.types.path; |
| default = "${cfg.package}/var/lib/OpenLinkHub/config.json"; |
| }; |
| }; |
| |
| config = lib.mkIf cfg.enable { |
| users.groups.OpenLinkHub = {}; |
| |
| users.users.OpenLinkHub = { |
| isSystemUser = true; |
| group = config.users.groups.OpenLinkHub.name; |
| extraGroups = [ config.users.groups.input.name ]; |
| }; |
| |
| systemd.services.OpenLinkHub = let |
| path = "/var/lib/OpenLinkHub"; |
| in { |
| enable = true; |
| description = "Open source interface for iCUE LINK System Hub, Corsair AIOs and Hubs"; |
| |
| preStart = '' |
| mkdir -p ${path}/database |
| [ -f ${path}/database/rgb.json ] || cp ${cfg.package}/var/lib/OpenLinkHub/rgb.json ${path}/database/rgb.json |
| mkdir -p ${path}/database/temperatures |
| mkdir -p ${path}/database/profiles |
| mkdir -p /run/udev/rules.d |
| |
| cp ${cfg.config} ${path}/config.json |
| |
| [ -L ${path}/static ] || ln -s ${cfg.package}/var/lib/OpenLinkHub/static ${path}/static |
| [ -L ${path}/web ] || ln -s ${cfg.package}/var/lib/OpenLinkHub/web ${path}/web |
| |
| ${pkgs.usbutils}/bin/lsusb -d 1b1c: | while read -r line; do |
| ids=$(echo "$line" | ${pkgs.gawk}/bin/awk '{print $6}') |
| vendor_id=$(${pkgs.coreutils}/bin/echo "$ids" | ${pkgs.coreutils}/bin/cut -d':' -f1) |
| device_id=$(${pkgs.coreutils}/bin/echo "$ids" | ${pkgs.coreutils}/bin/cut -d':' -f2) |
| ${pkgs.coreutils}/bin/cat > /run/udev/rules.d/99-corsair-openlinkhub-"$device_id".rules <<- EOM |
| KERNEL=="hidraw*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="$vendor_id", ATTRS{idProduct}=="$device_id", MODE="0666" |
| EOM |
| done |
| |
| ${pkgs.coreutils}/bin/chmod -R 744 ${path} |
| ${pkgs.coreutils}/bin/chown -R OpenLinkHub:OpenLinkHub ${path} |
| |
| ${pkgs.systemd}/bin/udevadm control --reload |
| ${pkgs.systemd}/bin/udevadm trigger |
| ''; |
| |
| postStop = '' |
| ${pkgs.coreutils}/bin/rm /run/udev/rules.d/99-corsair-openlinkhub-*.rules |
| |
| ${pkgs.systemd}/bin/udevadm control --reload |
| ${pkgs.systemd}/bin/udevadm trigger |
| ''; |
| |
| path = [ pkgs.pciutils ]; |
| |
| serviceConfig = { |
| DynamicUser = true; |
| ExecStart = "${cfg.package}/bin/OpenLinkHub"; |
| ExecReload = "${pkgs.coreutils}/bin/kill -s HUP \$MAINPID"; |
| RestartSec = 5; |
| PermissionsStartOnly = true; |
| StateDirectory = "OpenLinkHub"; |
| WorkingDirectory = "/var/lib/OpenLinkHub"; |
| }; |
| |
| wantedBy = [ "multi-user.target" ]; |
| }; |
| }; |
| } |