From 66c03ce1b40df14c804b15f5dd6c3174eb94ddd6 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:51:33 +0200 Subject: [PATCH] Refactor: Glances (+ Feature Bump) (#6976) * Refactor: Glances * Update glances.json * Update glances.json --- frontend/public/json/glances.json | 10 +- tools/addon/glances.sh | 245 ++++++++++++++++++++---------- 2 files changed, 164 insertions(+), 91 deletions(-) diff --git a/frontend/public/json/glances.json b/frontend/public/json/glances.json index a9d5224e3..41a9c68c9 100644 --- a/frontend/public/json/glances.json +++ b/frontend/public/json/glances.json @@ -6,7 +6,7 @@ ], "date_created": "2024-05-02", "type": "addon", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 61208, "documentation": "https://glances.readthedocs.io/en/latest/", @@ -33,12 +33,8 @@ }, "notes": [ { - "text": "Execute within an existing LXC Console", - "type": "warning" - }, - { - "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", - "type": "warning" + "text": "Execute within an existing LXC Console (Debian / Ubuntu / Alpine supported)", + "type": "info" } ] } diff --git a/tools/addon/glances.sh b/tools/addon/glances.sh index 90012a9df..0f1b76f11 100644 --- a/tools/addon/glances.sh +++ b/tools/addon/glances.sh @@ -1,9 +1,8 @@ #!/usr/bin/env bash # Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) -# License: MIT -# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Author: tteck (tteckster) | MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE function header_info { clear @@ -16,65 +15,55 @@ function header_info { EOF } -IP=$(hostname -I | awk '{print $1}') -YW=$(echo "\033[33m") -BL=$(echo "\033[36m") -RD=$(echo "\033[01;31m") -BGN=$(echo "\033[4;92m") -GN=$(echo "\033[1;92m") -DGN=$(echo "\033[32m") -CL=$(echo "\033[m") -BFR="\\r\\033[K" -HOLD=" " -CM="${GN}✓${CL}" + APP="Glances" -hostname="$(hostname)" -silent() { "$@" >/dev/null 2>&1; } -set -e -spinner() { - local chars="/-\|" - local spin_i=0 - printf "\e[?25l" - while true; do - printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}" - sleep 0.1 - done -} +YW=$(echo "\033[33m") +GN=$(echo "\033[1;92m") +RD=$(echo "\033[01;31m") +BL=$(echo "\033[36m") +CL=$(echo "\033[m") +CM="${GN}✔️${CL}" +CROSS="${RD}✖️${CL}" +INFO="${BL}ℹ️${CL}" -msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg} " - spinner & - SPINNER_PID=$! -} +function msg_info() { echo -e "${INFO} ${YW}$1...${CL}"; } +function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; } +function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; } -msg_ok() { - if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi - printf "\e[?25h" - local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" -} - -install() { - header_info - while true; do - read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn - case $yn in - [Yy]*) break ;; - [Nn]*) exit ;; - *) echo "Please answer yes or no." ;; - esac - done - header_info - read -r -p "Verbose mode? " prompt - if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - STD="" +get_local_ip() { + if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then + hostname -I | awk '{print $1}' + elif command -v ip >/dev/null 2>&1; then + ip -4 addr show scope global | awk '/inet / {print $2}' | cut -d/ -f1 | head -n1 else - STD="silent" + echo "127.0.0.1" fi - msg_info "Installing $APP" - rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED - $STD bash -c "$(curl -fsSL https://raw.githubusercontent.com/nicolargo/glancesautoinstall/master/install.sh)" +} +IP=$(get_local_ip) + +install_glances_debian() { + msg_info "Installing dependencies" + apt-get update >/dev/null 2>&1 + apt-get install -y gcc lm-sensors wireless-tools >/dev/null 2>&1 + msg_ok "Installed dependencies" + + msg_info "Setting up Python + uv" + source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) + setup_uv PYTHON_VERSION="3.12" + msg_ok "Setup Python + uv" + + msg_info "Installing $APP (with web UI)" + cd /opt + mkdir -p glances + cd glances + uv venv + source .venv/bin/activate >/dev/null 2>&1 + uv pip install --upgrade pip wheel setuptools >/dev/null 2>&1 + uv pip install "glances[web]" >/dev/null 2>&1 + deactivate + msg_ok "Installed $APP" + + msg_info "Creating systemd service" cat </etc/systemd/system/glances.service [Unit] Description=Glances - An eye on your system @@ -82,44 +71,132 @@ After=network.target [Service] Type=simple -ExecStart=/usr/local/bin/glances -w +ExecStart=/opt/glances/.venv/bin/glances -w Restart=on-failure +WorkingDirectory=/opt/glances [Install] WantedBy=multi-user.target EOF - systemctl enable -q --now glances.service - msg_ok "Installed $APP on $hostname" + systemctl enable -q --now glances + msg_ok "Created systemd service" - echo -e "${APP} should be reachable by going to the following URL. - ${BL}http://$IP:61208${CL} \n" + echo -e "\n$APP is now running at: http://$IP:61208\n" } -uninstall() { - header_info + +# update on Debian/Ubuntu +update_glances_debian() { + if [[ ! -d /opt/glances/.venv ]]; then + msg_error "$APP is not installed" + exit 1 + fi + msg_info "Updating $APP" + cd /opt/glances + source .venv/bin/activate + uv pip install --upgrade "glances[web]" >/dev/null 2>&1 + deactivate + systemctl restart glances + msg_ok "Updated $APP" +} + +# uninstall on Debian/Ubuntu +uninstall_glances_debian() { msg_info "Uninstalling $APP" - if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi - systemctl disable -q --now glances - bash -c "$(curl -fsSL https://raw.githubusercontent.com/nicolargo/glancesautoinstall/master/uninstall.sh)" - rm -rf /etc/systemd/system/glances.service - msg_ok "Uninstalled $APP" - msg_ok "Completed Successfully!\n" + systemctl disable -q --now glances || true + rm -f /etc/systemd/system/glances.service + rm -rf /opt/glances + msg_ok "Removed $APP" } +# install on Alpine +install_glances_alpine() { + msg_info "Installing dependencies" + apk update >/dev/null 2>&1 + $STD apk add --no-cache \ + gcc musl-dev linux-headers python3-dev \ + python3 py3-pip py3-virtualenv lm-sensors wireless-tools >/dev/null 2>&1 + msg_ok "Installed dependencies" + + msg_info "Setting up Python + uv" + source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) + setup_uv PYTHON_VERSION="3.12" + msg_ok "Setup Python + uv" + + msg_info "Installing $APP (with web UI)" + cd /opt + mkdir -p glances + cd glances + uv venv + source .venv/bin/activate + uv pip install --upgrade pip wheel setuptools >/dev/null 2>&1 + uv pip install "glances[web]" >/dev/null 2>&1 + deactivate + msg_ok "Installed $APP" + + msg_info "Creating OpenRC service" + cat <<'EOF' >/etc/init.d/glances +#!/sbin/openrc-run +command="/opt/glances/.venv/bin/glances" +command_args="-w" +command_background="yes" +pidfile="/run/glances.pid" +name="glances" +description="Glances monitoring tool" +EOF + chmod +x /etc/init.d/glances + rc-update add glances default + rc-service glances start + msg_ok "Created OpenRC service" + + echo -e "\n$APP is now running at: http://$IP:61208\n" +} + +# update on Alpine +update_glances_alpine() { + if [[ ! -d /opt/glances/.venv ]]; then + msg_error "$APP is not installed" + exit 1 + fi + msg_info "Updating $APP" + cd /opt/glances + source .venv/bin/activate + uv pip install --upgrade "glances[web]" >/dev/null 2>&1 + deactivate + rc-service glances restart + msg_ok "Updated $APP" +} + +# uninstall on Alpine +uninstall_glances_alpine() { + msg_info "Uninstalling $APP" + rc-service glances stop || true + rc-update del glances || true + rm -f /etc/init.d/glances + rm -rf /opt/glances + msg_ok "Removed $APP" +} + +# options menu OPTIONS=(Install "Install $APP" + Update "Update $APP" Uninstall "Uninstall $APP") -CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$APP" --menu "Select an option:" 10 58 2 \ - "${OPTIONS[@]}" 3>&1 1>&2 2>&3) +CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$APP" --menu "Select an option:" 12 58 3 \ + "${OPTIONS[@]}" 3>&1 1>&2 2>&3 || true) -case $CHOICE in -"Install") - install - ;; -"Uninstall") - uninstall - ;; -*) - echo "Exiting..." - exit 0 - ;; -esac +# OS detection +if grep -qi "alpine" /etc/os-release; then + case "$CHOICE" in + Install) install_glances_alpine ;; + Update) update_glances_alpine ;; + Uninstall) uninstall_glances_alpine ;; + *) exit 0 ;; + esac +else + case "$CHOICE" in + Install) install_glances_debian ;; + Update) update_glances_debian ;; + Uninstall) uninstall_glances_debian ;; + *) exit 0 ;; + esac +fi