Implement python virtual environment (#326)
* Implement python virtual environment * added venv instead of using system env pip * adjusted the unit file to startup the app from the venv * created a wrapper script to call the app from the venv * extended cleanup for venv and additional scripts * refactored the is_running() function to find the process now that it is called from a venv * remove update_service_file since we changed the binary path to the venv location * fix bug in argument handling; upgrade pip before installing python packages * fix bug in syntax * Renamed auto-cpufreq wrapper * Change permissions to use --stats as user * Changed init scripts to use wrapper Co-authored-by: aroundthfur <velimir@foolcontrol.org>
This commit is contained in:
parent
dd5d871769
commit
6e3f45182b
|
@ -34,8 +34,14 @@ function root_check {
|
||||||
}
|
}
|
||||||
|
|
||||||
# python packages install
|
# python packages install
|
||||||
function pip_pkg_install {
|
function setup_venv {
|
||||||
python3 -m pip install -r requirements.txt
|
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
|
# tool install
|
||||||
|
@ -43,12 +49,10 @@ function install {
|
||||||
python3 setup.py install --record files.txt
|
python3 setup.py install --record files.txt
|
||||||
mkdir -p /usr/local/share/auto-cpufreq/
|
mkdir -p /usr/local/share/auto-cpufreq/
|
||||||
cp -r scripts/ /usr/local/share/auto-cpufreq/
|
cp -r scripts/ /usr/local/share/auto-cpufreq/
|
||||||
}
|
|
||||||
|
|
||||||
function update_service_file {
|
# this is necessary since we need this script before we can run auto-cpufreq itself
|
||||||
echo -e "\nUpdating service file (/usr/local/bin/auto-cpufreq -> /usr/bin/auto-cpu-freq)"
|
cp scripts/auto-cpufreq-venv-wrapper /usr/local/bin/auto-cpufreq
|
||||||
sed -i 's|ExecStart=/usr/local/bin/auto-cpufreq|ExecStart=/usr/bin/auto-cpufreq|' \
|
chmod a+x /usr/local/bin/auto-cpufreq
|
||||||
/usr/local/share/auto-cpufreq/scripts/auto-cpufreq.service
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# First argument is the distro
|
# First argument is the distro
|
||||||
|
@ -61,7 +65,7 @@ function detected_distro() {
|
||||||
# merged functions pip - install - complete_msg, since it repeats
|
# merged functions pip - install - complete_msg, since it repeats
|
||||||
function completed () {
|
function completed () {
|
||||||
echo -e "\nInstalling necessary Python packages\n"
|
echo -e "\nInstalling necessary Python packages\n"
|
||||||
pip_pkg_install
|
setup_venv
|
||||||
separator
|
separator
|
||||||
echo -e "\ninstalling auto-cpufreq tool\n"
|
echo -e "\ninstalling auto-cpufreq tool\n"
|
||||||
install
|
install
|
||||||
|
@ -119,7 +123,6 @@ elif [ -f /etc/solus-release ]; then
|
||||||
eopkg install pip python3 python3-devel dmidecode
|
eopkg install pip python3 python3-devel dmidecode
|
||||||
eopkg install -c system.devel
|
eopkg install -c system.devel
|
||||||
completed
|
completed
|
||||||
update_service_file
|
|
||||||
complete_msg
|
complete_msg
|
||||||
elif [ -f /etc/os-release ];then
|
elif [ -f /etc/os-release ];then
|
||||||
eval "$(cat /etc/os-release)"
|
eval "$(cat /etc/os-release)"
|
||||||
|
@ -140,7 +143,6 @@ elif [ -f /etc/os-release ];then
|
||||||
detected_distro "Arch Linux based"
|
detected_distro "Arch Linux based"
|
||||||
pacman -S --noconfirm --needed python python-pip python-setuptools base-devel dmidecode
|
pacman -S --noconfirm --needed python python-pip python-setuptools base-devel dmidecode
|
||||||
completed
|
completed
|
||||||
[ $ID != "artix" ] && update_service_file
|
|
||||||
;;
|
;;
|
||||||
void)
|
void)
|
||||||
detected_distro "Void Linux"
|
detected_distro "Void Linux"
|
||||||
|
@ -164,7 +166,10 @@ function tool_remove {
|
||||||
srv_install="/usr/bin/auto-cpufreq-install"
|
srv_install="/usr/bin/auto-cpufreq-install"
|
||||||
srv_remove="/usr/bin/auto-cpufreq-remove"
|
srv_remove="/usr/bin/auto-cpufreq-remove"
|
||||||
stats_file="/var/run/auto-cpufreq.stats"
|
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)
|
# stop any running auto-cpufreq argument (daemon/live/monitor)
|
||||||
tool_arg_pids=($(pgrep -f "auto-cpufreq --"))
|
tool_arg_pids=($(pgrep -f "auto-cpufreq --"))
|
||||||
|
@ -187,6 +192,11 @@ function tool_remove {
|
||||||
[ -f $srv_install ] && rm $srv_install
|
[ -f $srv_install ] && rm $srv_install
|
||||||
[ -f $srv_remove ] && rm $srv_remove
|
[ -f $srv_remove ] && rm $srv_remove
|
||||||
[ -f $stats_file ] && rm $stats_file
|
[ -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
|
separator
|
||||||
echo -e "\nauto-cpufreq tool and all its supporting files successfully removed."
|
echo -e "\nauto-cpufreq tool and all its supporting files successfully removed."
|
||||||
|
|
|
@ -1080,22 +1080,12 @@ def read_stats():
|
||||||
|
|
||||||
# check if program (argument) is running
|
# check if program (argument) is running
|
||||||
def is_running(program, argument):
|
def is_running(program, argument):
|
||||||
# iterate over all process id's found by psutil
|
# iterate over all processes found by psutil
|
||||||
for pid in psutil.pids():
|
# and find the one with name and args passed to the function
|
||||||
try:
|
for p in psutil.process_iter():
|
||||||
# requests the process information corresponding to each process id
|
for s in filter(lambda x: program in x, p.cmdline()):
|
||||||
proc = psutil.Process(pid)
|
if argument in p.cmdline():
|
||||||
# check if value of program-variable that was used to call the function
|
return True
|
||||||
# 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
|
|
||||||
|
|
||||||
def daemon_running_msg():
|
def daemon_running_msg():
|
||||||
print("\n" + "-" * 24 + " auto-cpufreq running " + "-" * 30 + "\n")
|
print("\n" + "-" * 24 + " auto-cpufreq running " + "-" * 30 + "\n")
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
name=$RC_SVCNAME
|
name=$RC_SVCNAME
|
||||||
description="auto-cpufreq - Automatic CPU speed & power optimizer for Linux"
|
description="auto-cpufreq - Automatic CPU speed & power optimizer for Linux"
|
||||||
supervisor="supervise-daemon"
|
supervisor="supervise-daemon"
|
||||||
command="/usr/bin/auto-cpufreq"
|
command="/usr/local/bin/auto-cpufreq"
|
||||||
command_args="--daemon"
|
command_args="--daemon"
|
||||||
command_user="root"
|
command_user="root"
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
exec /usr/bin/auto-cpufreq --daemon
|
exec /usr/local/bin/auto-cpufreq --daemon
|
||||||
|
|
|
@ -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}"
|
|
@ -5,6 +5,10 @@ After=network.target network-online.target
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=root
|
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]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
Loading…
Reference in New Issue