diff --git a/scripts/power.sh b/scripts/power.sh index 443b08a..38d5e5a 100755 --- a/scripts/power.sh +++ b/scripts/power.sh @@ -8,6 +8,13 @@ fi MODE=$1 +# Pin kmod: sudo inherits the caller's PATH (no secure_path in sudoers), so a +# devshell or profile with busybox in it shadows modprobe with busybox's +# applet, which hard-chdirs into /lib/modules/$(uname -r) and dies if that +# directory is missing. kmod is compiled with /run/current-system/kernel-modules +# as fallback and does not need /lib/modules. +MODPROBE=/run/current-system/sw/bin/modprobe + run_user_cmd() { if [ -n "${SUDO_USER:-}" ]; then local user_uid @@ -30,7 +37,6 @@ if [ "$MODE" = "screenpad" ]; then fi elif [ "$MODE" = "ultra-powersave" ]; then # Switch to ultra-powersave mode - run_user_cmd systemctl --user stop voxtype auto-cpufreq --force powersave undervolt -t 70 "$MODPROBE" -r nvidia_uvm nvidia_drm nvidia_modeset nvidia @@ -38,7 +44,6 @@ elif [ "$MODE" = "ultra-powersave" ]; then run_user_cmd notify-send "Power Mode" "Switched to ultra-powersave mode" --expire-time=500 elif [ "$MODE" = "powersave" ]; then # Switch to powersave mode (reset CPU, disable GPU) - run_user_cmd systemctl --user stop voxtype auto-cpufreq --force reset undervolt -t 93 "$MODPROBE" -r nvidia_uvm nvidia_drm nvidia_modeset nvidia @@ -49,8 +54,7 @@ elif [ "$MODE" = "performance" ]; then auto-cpufreq --force reset undervolt -t 93 echo 1 | sudo tee /sys/bus/pci/rescan - modprobe nvidia nvidia_modeset nvidia_drm - run_user_cmd systemctl --user start voxtype + "$MODPROBE" nvidia nvidia_modeset nvidia_drm run_user_cmd notify-send "Power Mode" "Switched to performance mode" --expire-time=500 else echo "Error: Invalid mode '$MODE'"