diff --git a/auto-cpufreq-installer b/auto-cpufreq-installer index 3cf2064..03d76a1 100755 --- a/auto-cpufreq-installer +++ b/auto-cpufreq-installer @@ -34,8 +34,14 @@ function root_check { } # python packages install -function pip_pkg_install { - python3 -m pip install -r requirements.txt +function setup_venv { + venv_dir=/opt/auto-cpufreq/venv + mkdir -p "${venv_dir}" + python3 -m venv "${venv_dir}" + + source "${venv_dir}/bin/activate" + python3 -m pip install --upgrade pip + python3 -m pip install -r requirements.txt } # tool install @@ -43,12 +49,10 @@ function install { python3 setup.py install --record files.txt mkdir -p /usr/local/share/auto-cpufreq/ cp -r scripts/ /usr/local/share/auto-cpufreq/ -} -function update_service_file { - echo -e "\nUpdating service file (/usr/local/bin/auto-cpufreq -> /usr/bin/auto-cpu-freq)" - sed -i 's|ExecStart=/usr/local/bin/auto-cpufreq|ExecStart=/usr/bin/auto-cpufreq|' \ - /usr/local/share/auto-cpufreq/scripts/auto-cpufreq.service + # this is necessary since we need this script before we can run auto-cpufreq itself + cp scripts/auto-cpufreq-venv-wrapper /usr/local/bin/auto-cpufreq + chmod a+x /usr/local/bin/auto-cpufreq } # First argument is the distro @@ -61,7 +65,7 @@ function detected_distro() { # merged functions pip - install - complete_msg, since it repeats function completed () { echo -e "\nInstalling necessary Python packages\n" - pip_pkg_install + setup_venv separator echo -e "\ninstalling auto-cpufreq tool\n" install @@ -119,7 +123,6 @@ elif [ -f /etc/solus-release ]; then eopkg install pip python3 python3-devel dmidecode eopkg install -c system.devel completed - update_service_file complete_msg elif [ -f /etc/os-release ];then eval "$(cat /etc/os-release)" @@ -140,7 +143,6 @@ elif [ -f /etc/os-release ];then detected_distro "Arch Linux based" pacman -S --noconfirm --needed python python-pip python-setuptools base-devel dmidecode completed - [ $ID != "artix" ] && update_service_file ;; void) detected_distro "Void Linux" @@ -164,7 +166,10 @@ function tool_remove { srv_install="/usr/bin/auto-cpufreq-install" srv_remove="/usr/bin/auto-cpufreq-remove" stats_file="/var/run/auto-cpufreq.stats" - tool_proc_rm="auto-cpufreq --remove" + tool_proc_rm="/usr/local/bin/auto-cpufreq --remove" + wrapper_script="/usr/local/bin/auto-cpufreq" + unit_file="/etc/systemd/system/auto-cpufreq.service" + venv_path="/opt/auto-cpufreq" # stop any running auto-cpufreq argument (daemon/live/monitor) tool_arg_pids=($(pgrep -f "auto-cpufreq --")) @@ -187,6 +192,11 @@ function tool_remove { [ -f $srv_install ] && rm $srv_install [ -f $srv_remove ] && rm $srv_remove [ -f $stats_file ] && rm $stats_file + [ -f $unit_file ] && rm $unit_file + [ -f $wrapper_script ] && rm $wrapper_script + + # remove python virtual environment + rm -rf "${venv_path}" separator echo -e "\nauto-cpufreq tool and all its supporting files successfully removed." diff --git a/auto_cpufreq/core.py b/auto_cpufreq/core.py index fc5129f..cf826fd 100644 --- a/auto_cpufreq/core.py +++ b/auto_cpufreq/core.py @@ -1080,22 +1080,12 @@ def read_stats(): # check if program (argument) is running def is_running(program, argument): - # iterate over all process id's found by psutil - for pid in psutil.pids(): - try: - # requests the process information corresponding to each process id - proc = psutil.Process(pid) - # check if value of program-variable that was used to call the function - # matches the name field of the plutil.Process(pid) output - if program in proc.name(): - # check output of p.name(), output name of program - # p.cmdline() - echo the exact command line via which p was called. - for arg in proc.cmdline(): - if argument in str(arg): - return True - except Exception as e: - print(repr(e)) - continue + # iterate over all processes found by psutil + # and find the one with name and args passed to the function + for p in psutil.process_iter(): + for s in filter(lambda x: program in x, p.cmdline()): + if argument in p.cmdline(): + return True def daemon_running_msg(): print("\n" + "-" * 24 + " auto-cpufreq running " + "-" * 30 + "\n") diff --git a/scripts/auto-cpufreq-openrc b/scripts/auto-cpufreq-openrc index 83df4b6..d223895 100644 --- a/scripts/auto-cpufreq-openrc +++ b/scripts/auto-cpufreq-openrc @@ -3,7 +3,7 @@ name=$RC_SVCNAME description="auto-cpufreq - Automatic CPU speed & power optimizer for Linux" supervisor="supervise-daemon" -command="/usr/bin/auto-cpufreq" +command="/usr/local/bin/auto-cpufreq" command_args="--daemon" command_user="root" diff --git a/scripts/auto-cpufreq-runit b/scripts/auto-cpufreq-runit index 153a02a..bada806 100755 --- a/scripts/auto-cpufreq-runit +++ b/scripts/auto-cpufreq-runit @@ -1,2 +1,2 @@ #!/bin/sh -exec /usr/bin/auto-cpufreq --daemon +exec /usr/local/bin/auto-cpufreq --daemon diff --git a/scripts/auto-cpufreq-venv-wrapper b/scripts/auto-cpufreq-venv-wrapper new file mode 100644 index 0000000..ce89e9f --- /dev/null +++ b/scripts/auto-cpufreq-venv-wrapper @@ -0,0 +1,34 @@ +#!/bin/sh +# Wrapper script around auto-cpufreq using the python virtual environment + +set -eu + +# get script name +PROGNAME=$(basename "${0}") + +# bailout function +err_exit() +{ + echo "${PROGNAME}: ${1:-wrong invocation. try --help for help.}" 1>&2 + exit 1 +} + +# invocation handling +# +param="" +if [ "${#}" -ne 1 ]; +then + err_exit +else + param="${1}" +fi + +# load python virtual environment +venv_dir=/opt/auto-cpufreq/venv +. "${venv_dir}/bin/activate" + +# run python code with venv loaded +PYTHONPATH=/opt/auto-cpufreq \ + /opt/auto-cpufreq/venv/bin/python \ + /opt/auto-cpufreq/venv/bin/auto-cpufreq \ + "${param}" diff --git a/scripts/auto-cpufreq.service b/scripts/auto-cpufreq.service index 024f4eb..3362723 100644 --- a/scripts/auto-cpufreq.service +++ b/scripts/auto-cpufreq.service @@ -5,6 +5,10 @@ After=network.target network-online.target [Service] Type=simple User=root -ExecStart=/usr/local/bin/auto-cpufreq --daemon +WorkingDirectory=/opt/auto-cpufreq/venv +Environment=PYTHONPATH=/opt/auto-cpufreq +ExecStart=/opt/auto-cpufreq/venv/bin/python /opt/auto-cpufreq/venv/bin/auto-cpufreq --daemon +Restart=on-failure + [Install] WantedBy=multi-user.target