diff --git a/nixos/ryu/apps/default.nix b/nixos/ryu/apps/default.nix index d4632b9..6951d07 100644 --- a/nixos/ryu/apps/default.nix +++ b/nixos/ryu/apps/default.nix @@ -6,6 +6,7 @@ ./crosspipe.nix ./easyeffects.nix + ./fan-control.nix ./gparted.nix ./hdbctrl.nix ./lmms.nix diff --git a/nixos/ryu/apps/fan-control-runtime-fix.patch b/nixos/ryu/apps/fan-control-runtime-fix.patch new file mode 100644 index 0000000..d6c4c5a --- /dev/null +++ b/nixos/ryu/apps/fan-control-runtime-fix.patch @@ -0,0 +1,40 @@ +diff --git a/data/src/dir_manager.rs b/data/src/dir_manager.rs +--- a/data/src/dir_manager.rs ++++ b/data/src/dir_manager.rs +@@ -124,6 +124,18 @@ impl DirManager { + project_dirs.data_local_dir().to_path_buf() + }; + ++ if !state_dir_path.exists() ++ && let Err(e) = fs::create_dir_all(&state_dir_path) ++ { ++ error!("Cannot create state directories: {e}.") ++ } ++ ++ if !project_dirs.cache_dir().exists() ++ && let Err(e) = fs::create_dir_all(project_dirs.cache_dir()) ++ { ++ error!("Cannot create cache directories: {e}.") ++ } ++ + let state = { + let state_file_path = state_dir_path.join(STATE_FILENAME); + +diff --git a/ui/src/lib.rs b/ui/src/lib.rs +--- a/ui/src/lib.rs ++++ b/ui/src/lib.rs +@@ -87,6 +87,14 @@ pub fn run_ui(mut app_state: AppState) { + let project_dirs = ProjectDirs::from(QUALIFIER, ORG, APP).unwrap(); + project_dirs.cache_dir().join("app.lock") + }; ++ if let Some(parent) = instance_lock_path.parent() { ++ let _ = std::fs::create_dir_all(parent); ++ } ++ let _ = std::fs::OpenOptions::new() ++ .create(true) ++ .write(true) ++ .truncate(false) ++ .open(&instance_lock_path); + let mut app_lock = LockFile::open(&instance_lock_path).expect("Failed to open app lock file"); + if !app_lock.try_lock_with_pid().unwrap_or(false) { + info!( diff --git a/nixos/ryu/apps/fan-control.nix b/nixos/ryu/apps/fan-control.nix new file mode 100644 index 0000000..9cccd4c --- /dev/null +++ b/nixos/ryu/apps/fan-control.nix @@ -0,0 +1,79 @@ +{ + pkgs, + lib, + ... +}: let + fan-control = pkgs.rustPlatform.buildRustPackage (finalAttrs: { + pname = "fan-control"; + version = "26.1.0"; + rev = "26.01"; + + src = pkgs.fetchFromGitHub { + owner = "wiiznokes"; + repo = "fan-control"; + rev = finalAttrs.rev; + fetchSubmodules = true; + hash = "sha256-tIR+e8u50Km8DzGPm2YzyJAlV6lo3qRlnRsUx57I9Zg="; + }; + + patches = [./fan-control-runtime-fix.patch]; + + cargoHash = "sha256-tA0Pvne3+lzvablVhwHClYeKB/3u+07RNrtSYo08lV0="; + + env = { + FAN_CONTROL_VERSION = finalAttrs.version; + FAN_CONTROL_COMMIT = finalAttrs.rev; + }; + + nativeBuildInputs = [ + pkgs.pkg-config + pkgs.makeWrapper + pkgs.glib + pkgs.rustPlatform.bindgenHook + pkgs.libcosmicAppHook + pkgs.bison + pkgs.flex + pkgs.clang + pkgs.gnumake + pkgs.which + ]; + + buildInputs = [ + pkgs.glib + pkgs.libinput + pkgs.fontconfig + pkgs.freetype + ]; + + cargoBuildFlags = ["--package" "fan-control"]; + cargoTestFlags = ["--package" "fan-control"]; + doCheck = false; + + preBuild = '' + make -j1 -C ./hardware/libsensors/ install PREFIX=./../../build/libsensors ETCDIR=./../../build/libsensors/etc + ''; + + postInstall = '' + install -Dm0644 res/linux/desktop_entry.desktop \ + $out/share/applications/io.github.wiiznokes.fan-control.desktop + install -Dm0644 res/linux/metainfo.xml \ + $out/share/metainfo/io.github.wiiznokes.fan-control.metainfo.xml + install -Dm0644 res/linux/app_icon.svg \ + $out/share/icons/hicolor/scalable/apps/io.github.wiiznokes.fan-control.svg + ''; + + meta = { + description = "Control fans with custom behaviors"; + homepage = "https://github.com/wiiznokes/fan-control"; + license = lib.licenses.gpl3Only; + mainProgram = "fan-control"; + platforms = lib.platforms.linux; + }; + }); +in { + environment.systemPackages = [fan-control]; + + services.udev.extraRules = '' + SUBSYSTEM=="hwmon", RUN+="${pkgs.runtimeShell} -c '${pkgs.coreutils}/bin/chmod a+w /sys%p/pwm* || true'" + ''; +} diff --git a/nixos/ryu/hardware/default.nix b/nixos/ryu/hardware/default.nix index 5eb6274..6538dc0 100644 --- a/nixos/ryu/hardware/default.nix +++ b/nixos/ryu/hardware/default.nix @@ -2,4 +2,11 @@ imports = [ # ./nvidia-power-limit.nix ]; + + boot.kernelModules = ["nct6775"]; + + environment.etc."sensors.d/ryu.conf".text = '' + chip "spd5118-*" + ignore temp1 + ''; } diff --git a/nixos/ryu/programs/coolercontrol.nix b/nixos/ryu/programs/coolercontrol.nix deleted file mode 100644 index 7eaa93b..0000000 --- a/nixos/ryu/programs/coolercontrol.nix +++ /dev/null @@ -1,3 +0,0 @@ -{...}: { - programs.coolercontrol.enable = true; -} diff --git a/nixos/ryu/programs/default.nix b/nixos/ryu/programs/default.nix index cbc88e0..a2fa9fc 100644 --- a/nixos/ryu/programs/default.nix +++ b/nixos/ryu/programs/default.nix @@ -22,7 +22,7 @@ ./foot.nix ./ddcutil.nix ./libnotify.nix + ./lm-sensors.nix ./fish.nix - ./coolercontrol.nix ]; } diff --git a/nixos/ryu/programs/lm-sensors.nix b/nixos/ryu/programs/lm-sensors.nix new file mode 100644 index 0000000..f32a0a0 --- /dev/null +++ b/nixos/ryu/programs/lm-sensors.nix @@ -0,0 +1,3 @@ +{pkgs, ...}: { + environment.systemPackages = with pkgs; [lm_sensors]; +} diff --git a/nixos/ryu/vms/gaming-session.nix b/nixos/ryu/vms/gaming-session.nix index 0bc3662..8c691f8 100644 --- a/nixos/ryu/vms/gaming-session.nix +++ b/nixos/ryu/vms/gaming-session.nix @@ -20,7 +20,6 @@ systemctl stop greetd.service || true systemctl stop prometheus-nvidia-gpu-exporter.service || true systemctl stop nvidia-persistenced.service || true - systemctl stop coolercontrold.service || true systemctl stop openrgb.service || true # Terminate any wayland/X session on a tty (Hyprland holds nvidia # even after greetd dies, since logind sessions are independent of @@ -89,7 +88,6 @@ # Restart consumer services systemctl start nvidia-persistenced.service 2>/dev/null || true - systemctl start coolercontrold.service || true systemctl start openrgb.service || true systemctl start prometheus-nvidia-gpu-exporter.service || true