blob: 6150765a329465883a1f3fc96962b5fbf30e84f6 [file] [log] [blame]
{
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" ];
};
};
}