#!/bin/bash # auto-cpufreq-installer: # auto-cpufreq source code based installer SCRIPT_PATH=$(readlink -f "$0") SCRIPT_DIR=$(dirname "${SCRIPT_PATH}") cd "${SCRIPT_DIR}" # check if lsb_release exists on the system before using it if command -v lsb_release > /dev/null then distro="$(lsb_release -is)" release="$(lsb_release -rs)" codename="$(lsb_release -cs)" fi # functions #separator function separator { local COLUMNS="`tput cols`" echo -e "\n" printf "%0.s─" $(seq $COLUMNS) echo -e "\n" } # root check function root_check { if ((EUID != 0)); then separator echo -e "\nMust be run as root (i.e: 'sudo $0')." separator exit 1 fi } function header { local COLUMNS="`tput cols`" MID="$((COLUMNS / 2))" HEADER="$1" printf "%0.s─" $(seq $((MID-(${#HEADER}/2)- 1))) echo -n " $HEADER " printf "%0.s─" $(seq $((MID-(${#HEADER}/2)- 1))) echo -e "\n" return } # python packages install 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 wheel python3 -m pip install -r requirements.txt } # tool install function install { python3 setup.py install --record files.txt mkdir -p /usr/local/share/auto-cpufreq/ cp -r scripts/ /usr/local/share/auto-cpufreq/ cp -r images/ /usr/local/share/auto-cpufreq/ cp images/icon.png /usr/share/pixmaps/auto-cpufreq.png cp scripts/org.auto-cpufreq.pkexec.policy /usr/share/polkit-1/actions # 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 cp scripts/start_app /usr/local/bin/auto-cpufreq-gtk chmod a+x /usr/local/bin/auto-cpufreq chmod a+x /usr/local/bin/auto-cpufreq-gtk desktop-file-install --dir=/usr/share/applications scripts/auto-cpufreq-gtk.desktop update-desktop-database /usr/share/applications } # First argument is the distro function detected_distro() { echo -e "\nDetected $1 distribution" separator echo -e "\nSetting up Python environment\n" } # merged functions pip - install - complete_msg, since it repeats function completed () { echo -e "\nInstalling necessary Python packages\n" setup_venv separator echo -e "\ninstalling auto-cpufreq tool\n" install } function complete_msg() { separator cat <<- _EOF_ auto-cpufreq tool successfully installed. For list of options, run: auto-cpufreq --help" _EOF_ separator } function manual_install { cat <<- _EOF_ Didn't detect Debian or RedHat based distro. To complete installation, you need to: Install: python3, pip3, python3-setuptools, gobject-introspection, cairo (or cairo-devel), gcc, and gtk3 Install necessary Python packages: pip3 install psutil click distro power requests PyGObject Run following sequence of lines: ----- python3 setup.py install --record files.txt mkdir -p /usr/local/share/auto-cpufreq/ cp -r scripts/ /usr/local/share/auto-cpufreq/ ----- After which tool is installed, for full list of options run: auto-cpufreq _EOF_ separator cat <<- _EOF_ Consider creating a feature request to add support for your distro: https://github.com/AdnanHodzic/auto-cpufreq/issues/new Make sure to include following information: Distribution: $distro Release: $release Codename: $codename _EOF_ separator } function tool_install { separator if [ -f /etc/debian_version ]; then detected_distro "Debian based" apt install python3-dev python3-pip python3-venv python3-setuptools dmidecode libgirepository1.0-dev libcairo2-dev libgtk-3 gcc -y completed complete_msg elif [ -f /etc/redhat-release ]; then detected_distro "RedHat based" if [ -f /etc/centos-release ]; then yum install platform-python-devel dmidecode gcc cairo-devel gobject-introspection-devel cairo-gobject-devel gtk3-devel else yum install python-devel dmidecode gcc cairo-devel gobject-introspection-devel cairo-gobject-devel gtk3-devel fi completed complete_msg elif [ -f /etc/solus-release ]; then detected_distro "Solus" eopkg install pip python3 python3-devel dmidecode gobject-introspection-devel libcairo-devel gcc libgtk-3 eopkg install -c system.devel completed complete_msg elif [ -f /etc/os-release ];then eval "$(cat /etc/os-release)" separator case $ID in opensuse-leap) detected_distro "OpenSUSE" zypper install -y python3 python3-pip python3-setuptools python3-devel gcc dmidecode gobject-introspection-devel python3-cairo-devel gtk3 gtk3-devel completed ;; opensuse-tumbleweed) detected_distro "OpenSUSE" echo -e "\nDetected an OpenSUSE distribution\n\nSetting up Python environment\n" zypper install -y python38 python3-pip python3-setuptools python3-devel gcc dmidecode gobject-introspection-devel python3-cairo-devel gtk3 gtk3-devel completed ;; arch|manjaro|endeavouros|garuda|artix) detected_distro "Arch Linux based" pacman -S --noconfirm --needed python python-pip python-setuptools base-devel dmidecode gobject-introspection gtk3 gcc completed ;; void) detected_distro "Void Linux" xbps-install -Sy python3 python3-pip python3-devel python3-setuptools base-devel dmidecode cairo-devel gobject-introspection gcc gtk+3 completed ;; *) #Any other distro manual_install completed ;; esac complete_msg else # In case /etc/os-release doesn't exist manual_install fi } function tool_remove { files="files.txt" share_dir="/usr/local/share/auto-cpufreq/" srv_install="/usr/local/bin/auto-cpufreq-install" srv_install_old="/usr/bin/auto-cpufreq-install" srv_remove="/usr/local/bin/auto-cpufreq-remove" srv_remove_old="/usr/bin/auto-cpufreq-remove" stats_file="/var/run/auto-cpufreq.stats" tool_proc_rm="/usr/local/bin/auto-cpufreq --remove" wrapper_script="/usr/local/bin/auto-cpufreq" gui_wrapper_script="/usr/local/bin/auto-cpufreq-gtk" unit_file="/etc/systemd/system/auto-cpufreq.service" venv_path="/opt/auto-cpufreq" cpufreqctl="/usr/local/bin/cpufreqctl.auto-cpufreq" cpufreqctl_old="/usr/bin/cpufreqctl.auto-cpufreq" desktop_file="/usr/share/applications/auto-cpufreq-gtk.desktop" # stop any running auto-cpufreq argument (daemon/live/monitor) tool_arg_pids=($(pgrep -f "auto-cpufreq --")) for pid in "${tool_arg_pids[@]}"; do if [[ $tool_arg_pids != $$ ]]; then kill "$tool_arg_pids" fi done # run uninstall in case of installed daemon if [ -f $srv_remove -o -f $srv_remove_old -o $wrapper_script ]; then eval $tool_proc_rm else separator printf "Couldn't remove the auto-cpufreq daemon\n$srv_remove or $srv_remove_old do not exist.\n" exit 1; separator fi # remove auto-cpufreq and all its supporting files [ -f $files ] && cat $files | xargs sudo rm -rf && rm -f $files [ -d $share_dir ] && rm -rf $share_dir # files cleanup [ -f $srv_install ] && rm $srv_install [ -f $srv_install_old ] && rm $srv_install_old [ -f $srv_remove ] && rm $srv_remove [ -f $srv_remove_old ] && rm $srv_remove_old [ -f $stats_file ] && rm $stats_file [ -f $unit_file ] && rm $unit_file [ -f $wrapper_script ] && rm $wrapper_script [ -f $gui_wrapper_script ] && rm $gui_wrapper_script [ -f $cpufreqctl ] && rm $cpufreqctl [ -f $cpufreqctl_old ] && rm $cpufreqctl_old [ -f $desktop_file ] && rm $desktop_file update-desktop-database /usr/share/applications # remove python virtual environment rm -rf "${venv_path}" separator echo -e "\nauto-cpufreq tool and all its supporting files successfully removed." separator } function tool_update { # Specify the repository and package name # IT IS IMPORTANT TO NOTE THAT IF THE REPOSITORY STRUCTURE IS CHANGED, THE FOLLOWING FUNCTION NEEDS TO BE UPDATED ACCORDINGLY repository="AdnanHodzic/auto-cpufreq" # Fetch the latest release information from GitHub API latest_release=$(curl -s "https://api.github.com/repos/$repository/releases/latest") # Extract the latest release version without using jq latest_version=$(echo "$latest_release" | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) # Get the current version of auto-cpufreq #installed_version=$(pip list | awk '/auto-cpufreq/ {print $2}') installed_version=$(grep -oP "(?<=__requires__ = 'auto-cpufreq==)\d+(\.\d+)+" /opt/auto-cpufreq/venv/bin/auto-cpufreq) #Check whether the same is installed or not if [[ -z "$installed_version" ]]; then echo "Current version not found, please install auto-cpufreq first" echo $installed_version sleep 1 exit 1 fi installed_version="v$installed_version" # Compare the latest version with the installed version and perform update if necessary if [[ "$latest_version" == "$installed_version" ]]; then echo "auto-cpufreq is up to date" else echo -e "Updates are available,\nCurrent version: $installed_version\nLatest version: $latest_version \nNote that your previous custom settings might be \033[1merased\033[0m with the following update \nalong with the \033[1mcurrent\033[0m directory. " read -p "Do you want to update auto-cpufreq to the latest release? [y/n]: " ans if [[ "$ans" == "y" ]]; then header "Updating auto-cpufreq to the latest release\n" tool_remove echo -e "deleting the current directory\n" script_directory="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" mkdir "$script_directory/../auto-cpufreq $latest_version" && cd $_ rm -rf $script_directory echo -e "cloning to the latest release\n" git clone https://github.com/AdnanHodzic/auto-cpufreq.git cd auto-cpufreq separator tool_install else separator echo "Aborting..." sleep 0.5 fi fi } function ask_operation { header "auto-cpufreq installer" echo -e "Welcome to auto-cpufreq tool installer. \nOptions:\n" read -p \ "[I]nstall [U]pdate [R]emove [Q]uit Select a key: [i/u/r/q]: " answer } # End of functions root_check if [[ -z "${1}" ]]; then ask_operation else case "${1}" in "--install") answer="i" ;; "--update") answer="u" ;; "--remove") answer="r" ;; *) answer="n" ;; esac fi case $answer in I|i) tool_install ;; U|u) tool_update ;; R|r) tool_remove ;; Q|q) separator echo "" exit 0 ;; *) separator echo -e "\nUnknown key, aborting ...\n" exit 1 ;; esac