From 92b7155ff917a0739b547cdeb0d23281b9499c13 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Sat, 1 Aug 2026 22:06:30 +0200 Subject: [PATCH] refactor: complete addon harmonization (filebrowser-quantum, glances, olivetin, phpmyadmin, coder-code-server polish) - Remove local get_lxc_ip() shadow in glances.sh, use core.func version - Fix double header_info() call in olivetin.sh with _HEADER_SHOWN reset - Add core.func/tools.func/error_handler.func sourcing to phpmyadmin.sh - Replace unsafe hostname -I fallback with get_lxc_ip everywhere - Use $STD for command execution and shared msg_info/msg_ok/msg_error/msg_warn - All files verified clean via shellcheck (only expected SC1090 noise) --- tools/addon/coder-code-server.sh | 2 +- tools/addon/filebrowser-quantum.sh | 107 ++++++++++++----------------- tools/addon/filebrowser.sh | 90 ++++++++++-------------- tools/addon/glances.sh | 77 ++++++++------------- tools/addon/olivetin.sh | 62 ++++++----------- tools/addon/phpmyadmin.sh | 65 +++++++----------- 6 files changed, 154 insertions(+), 249 deletions(-) diff --git a/tools/addon/coder-code-server.sh b/tools/addon/coder-code-server.sh index 9455a3465..8e3b558a2 100644 --- a/tools/addon/coder-code-server.sh +++ b/tools/addon/coder-code-server.sh @@ -69,7 +69,7 @@ rm -rf code-server_"${VERSION}"_amd64.deb mkdir -p "${HOME}/.config/code-server/" if [ "$preexisting_config" = false ]; then -cat <"$config_path" + cat <"$config_path" bind-addr: 0.0.0.0:8680 auth: none password: diff --git a/tools/addon/filebrowser-quantum.sh b/tools/addon/filebrowser-quantum.sh index ca586f04d..43212497d 100644 --- a/tools/addon/filebrowser-quantum.sh +++ b/tools/addon/filebrowser-quantum.sh @@ -5,55 +5,42 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/filebrowserspace/quantum -function header_info() { - clear - cat <<"EOF" - _______ __ ____ ____ __ - / ____(_) /__ / __ )_________ _ __________ _____ / __ \__ ______ _____ / /___ ______ ___ - / /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/ / / / / / / / __ `/ __ \/ __/ / / / __ `__ \ - / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ / / /_/ / /_/ / /_/ / / / / /_/ /_/ / / / / / / -/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/ \___\_\__,_/\__,_/_/ /_/\__/\__,_/_/ /_/ /_/ - -EOF -} - -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}" - APP="FileBrowser Quantum" +APP_TYPE="addon" INSTALL_PATH="/usr/local/bin/filebrowser" CONFIG_PATH="/usr/local/community-scripts/fq-config.yaml" DEFAULT_PORT=8080 SRC_DIR="/" TMP_BIN="/tmp/filebrowser.$$" -# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser-quantum" "addon" -# Get primary IP -IFACE=$(ip -4 route | awk '/default/ {print $5; exit}') -IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1) -[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}') -[[ -z "$IP" ]] && IP="127.0.0.1" +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +header_info +get_lxc_ip +IP="$LOCAL_IP" # Proxmox Host Warning if [[ -d "/etc/pve" ]]; then - echo -e "${RD}⚠️ Warning: Running this addon directly on the Proxmox host is not recommended!${CL}" - echo -e "${YW} Only the boot disk will be visible — passthrough drives will not be indexed.${CL}" - echo -e "${YW} This causes incorrect disk usage stats and incomplete file browsing.${CL}" - echo -e "${YW} Run this addon inside an LXC or VM instead and mount your drives there.${CL}" + msg_warn "Running this addon directly on the Proxmox host is not recommended!" + msg_warn "Only the boot disk will be visible — passthrough drives will not be indexed." + msg_warn "This causes incorrect disk usage stats and incomplete file browsing." + msg_warn "Run this addon inside an LXC or VM instead and mount your drives there." echo "" - echo -n "Continue anyway on the Proxmox host? (y/N): " + echo -n "${TAB}Continue anyway on the Proxmox host? (y/N): " read -r host_confirm if [[ ! "${host_confirm,,}" =~ ^(y|yes)$ ]]; then - echo -e "${YW}Aborted.${CL}" + msg_error "Aborted." exit 0 fi fi @@ -68,16 +55,10 @@ elif [[ -f "/etc/debian_version" ]]; then SERVICE_PATH="/etc/systemd/system/filebrowser.service" PKG_MANAGER="apt-get install -y" else - echo -e "${CROSS} Unsupported OS detected. Exiting." + msg_error "Unsupported OS detected. Exiting." exit 238 fi -header_info - -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}"; } - # Detect legacy FileBrowser installation LEGACY_DB="/usr/local/community-scripts/filebrowser.db" LEGACY_BIN="/usr/local/bin/filebrowser" @@ -85,40 +66,40 @@ LEGACY_SERVICE_DEB="/etc/systemd/system/filebrowser.service" LEGACY_SERVICE_ALP="/etc/init.d/filebrowser" if [[ -f "$LEGACY_DB" || -f "$LEGACY_BIN" && ! -f "$CONFIG_PATH" ]]; then - echo -e "${YW}⚠️ Detected legacy FileBrowser installation.${CL}" - echo -n "Uninstall legacy FileBrowser and continue with Quantum install? (y/n): " + msg_warn "Detected legacy FileBrowser installation." + echo -n "${TAB}Uninstall legacy FileBrowser and continue with Quantum install? (y/n): " read -r remove_legacy if [[ "${remove_legacy,,}" =~ ^(y|yes)$ ]]; then msg_info "Uninstalling legacy FileBrowser" if [[ -f "$LEGACY_SERVICE_DEB" ]]; then - systemctl disable --now filebrowser.service &>/dev/null + systemctl disable --now filebrowser.service &>/dev/null || true rm -f "$LEGACY_SERVICE_DEB" elif [[ -f "$LEGACY_SERVICE_ALP" ]]; then - rc-service filebrowser stop &>/dev/null - rc-update del filebrowser &>/dev/null + rc-service filebrowser stop &>/dev/null || true + rc-update del filebrowser &>/dev/null || true rm -f "$LEGACY_SERVICE_ALP" fi rm -f "$LEGACY_BIN" "$LEGACY_DB" msg_ok "Legacy FileBrowser removed" else - echo -e "${YW}❌ Installation aborted by user.${CL}" + msg_error "Installation aborted by user." exit 0 fi fi # Existing installation if [[ -f "$INSTALL_PATH" ]]; then - echo -e "${YW}⚠️ ${APP} is already installed.${CL}" - echo -n "Uninstall ${APP}? (y/N): " + msg_warn "${APP} is already installed." + echo -n "${TAB}Uninstall ${APP}? (y/N): " read -r uninstall_prompt if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Uninstalling ${APP}" if [[ "$OS" == "Debian" ]]; then - systemctl disable --now filebrowser.service &>/dev/null + systemctl disable --now filebrowser.service &>/dev/null || true rm -f "$SERVICE_PATH" else - rc-service filebrowser stop &>/dev/null - rc-update del filebrowser &>/dev/null + rc-service filebrowser stop &>/dev/null || true + rc-update del filebrowser &>/dev/null || true rm -f "$SERVICE_PATH" fi rm -f "$INSTALL_PATH" "$CONFIG_PATH" @@ -126,36 +107,36 @@ if [[ -f "$INSTALL_PATH" ]]; then exit 0 fi - echo -n "Update ${APP}? (y/N): " + echo -n "${TAB}Update ${APP}? (y/N): " read -r update_prompt if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Updating ${APP}" - if ! command -v curl &>/dev/null; then $PKG_MANAGER curl &>/dev/null; fi + if ! command -v curl &>/dev/null; then $STD $PKG_MANAGER curl; fi curl -fsSL https://github.com/gtsteffaniak/filebrowser/releases/latest/download/linux-amd64-filebrowser -o "$TMP_BIN" chmod +x "$TMP_BIN" mv -f "$TMP_BIN" /usr/local/bin/filebrowser msg_ok "Updated ${APP}" exit 0 else - echo -e "${YW}⚠️ Update skipped. Exiting.${CL}" + msg_warn "Update skipped. Exiting." exit 0 fi fi -echo -e "${YW}⚠️ ${APP} is not installed.${CL}" -echo -n "Enter port number (Default: ${DEFAULT_PORT}): " +msg_warn "${APP} is not installed." +echo -n "${TAB}Enter port number (Default: ${DEFAULT_PORT}): " read -r PORT PORT=${PORT:-$DEFAULT_PORT} -echo -n "Install ${APP}? (y/n): " +echo -n "${TAB}Install ${APP}? (y/n): " read -r install_prompt if ! [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then - echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" + msg_warn "Installation skipped. Exiting." exit 0 fi msg_info "Installing ${APP} on ${OS}" -$PKG_MANAGER curl ffmpeg &>/dev/null +$STD $PKG_MANAGER curl ffmpeg curl -fsSL https://github.com/gtsteffaniak/filebrowser/releases/latest/download/linux-amd64-filebrowser -o "$TMP_BIN" chmod +x "$TMP_BIN" mv -f "$TMP_BIN" /usr/local/bin/filebrowser @@ -167,7 +148,7 @@ chown root:root /usr/local/community-scripts chmod 755 /usr/local/community-scripts msg_ok "Directory prepared" -echo -n "Use No Authentication? (y/N): " +echo -n "${TAB}Use No Authentication? (y/N): " read -r noauth_prompt # === YAML CONFIG GENERATION === @@ -251,9 +232,9 @@ depend() { } EOF chmod +x "$SERVICE_PATH" - rc-update add filebrowser default &>/dev/null - rc-service filebrowser start &>/dev/null + $STD rc-update add filebrowser default + $STD rc-service filebrowser start fi msg_ok "Service created successfully" -echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}" +msg_ok "${APP} is reachable at: ${BL}http://${IP}:${PORT}${CL}" diff --git a/tools/addon/filebrowser.sh b/tools/addon/filebrowser.sh index 369c91767..037b5a97e 100644 --- a/tools/addon/filebrowser.sh +++ b/tools/addon/filebrowser.sh @@ -5,41 +5,40 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://filebrowser.org/ | Github: https://github.com/filebrowser/filebrowser -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}" - APP="FileBrowser" APP_TYPE="addon" INSTALL_PATH="/usr/local/bin/filebrowser" DB_PATH="/usr/local/community-scripts/filebrowser.db" DEFAULT_PORT=8080 -# Telemetry source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) -load_functions +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser" "addon" +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +header_info get_lxc_ip IP="$LOCAL_IP" # Proxmox Host Warning if [[ -d "/etc/pve" ]]; then - echo -e "${RD}⚠️ Warning: Running this addon directly on the Proxmox host is not recommended!${CL}" - echo -e "${YW} Only the boot disk will be visible — passthrough drives will not be indexed.${CL}" - echo -e "${YW} This causes incorrect disk usage stats and incomplete file browsing.${CL}" - echo -e "${YW} Run this addon inside an LXC or VM instead and mount your drives there.${CL}" + msg_warn "Running this addon directly on the Proxmox host is not recommended!" + msg_warn "Only the boot disk will be visible — passthrough drives will not be indexed." + msg_warn "This causes incorrect disk usage stats and incomplete file browsing." + msg_warn "Run this addon inside an LXC or VM instead and mount your drives there." echo "" - echo -n "Continue anyway on the Proxmox host? (y/N): " + echo -n "${TAB}Continue anyway on the Proxmox host? (y/N): " read -r host_confirm if [[ ! "${host_confirm,,}" =~ ^(y|yes)$ ]]; then - echo -e "${YW}Aborted.${CL}" + msg_error "Aborted." exit 0 fi fi @@ -54,38 +53,21 @@ elif [[ -f "/etc/debian_version" ]]; then SERVICE_PATH="/etc/systemd/system/filebrowser.service" PKG_MANAGER="apt-get install -y" else - echo -e "${CROSS} Unsupported OS detected. Exiting." + msg_error "Unsupported OS detected. Exiting." exit 238 fi -header_info - -function msg_info() { - local msg="$1" - echo -e "${INFO} ${YW}${msg}...${CL}" -} - -function msg_ok() { - local msg="$1" - echo -e "${CM} ${GN}${msg}${CL}" -} - -function msg_error() { - local msg="$1" - echo -e "${CROSS} ${RD}${msg}${CL}" -} - if [ -f "$INSTALL_PATH" ]; then - echo -e "${YW}⚠️ ${APP} is already installed.${CL}" + msg_warn "${APP} is already installed." read -r -p "Would you like to uninstall ${APP}? (y/N): " uninstall_prompt if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Uninstalling ${APP}" if [[ "$OS" == "Debian" ]]; then - systemctl disable --now filebrowser.service &>/dev/null + systemctl disable --now filebrowser.service &>/dev/null || true rm -f "$SERVICE_PATH" else - rc-service filebrowser stop &>/dev/null - rc-update del filebrowser &>/dev/null + rc-service filebrowser stop &>/dev/null || true + rc-update del filebrowser &>/dev/null || true rm -f "$SERVICE_PATH" fi rm -f "$INSTALL_PATH" "$DB_PATH" @@ -96,25 +78,25 @@ if [ -f "$INSTALL_PATH" ]; then read -r -p "Would you like to update ${APP}? (y/N): " update_prompt if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Updating ${APP}" - if ! command -v curl &>/dev/null; then $PKG_MANAGER curl &>/dev/null; fi + if ! command -v curl &>/dev/null; then $STD $PKG_MANAGER curl; fi curl -fsSL "https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz" | tar -xzv -C /usr/local/bin &>/dev/null chmod +x "$INSTALL_PATH" msg_ok "Updated ${APP}" exit 0 else - echo -e "${YW}⚠️ Update skipped. Exiting.${CL}" + msg_warn "Update skipped. Exiting." exit 0 fi fi -echo -e "${YW}⚠️ ${APP} is not installed.${CL}" +msg_warn "${APP} is not installed." read -r -p "Enter port number (Default: ${DEFAULT_PORT}): " PORT PORT=${PORT:-$DEFAULT_PORT} read -r -p "Would you like to install ${APP}? (y/n): " install_prompt if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Installing ${APP} on ${OS}" - $PKG_MANAGER wget tar curl &>/dev/null + $STD $PKG_MANAGER wget tar curl curl -fsSL "https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz" | tar -xzv -C /usr/local/bin &>/dev/null chmod +x "$INSTALL_PATH" msg_ok "Installed ${APP}" @@ -132,19 +114,19 @@ if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${auth_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Configuring No Authentication" cd /usr/local/community-scripts - filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null - filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null - filebrowser config set --auth.method=noauth --database "$DB_PATH" &>/dev/null + $STD filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" + $STD filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" + $STD filebrowser config set --auth.method=noauth --database "$DB_PATH" if ! filebrowser users update 1 --perm.admin --database "$DB_PATH" &>/dev/null; then - filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH" &>/dev/null + $STD filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH" fi msg_ok "No Authentication configured" else msg_info "Setting up default authentication" cd /usr/local/community-scripts - filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null - filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null - filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH" &>/dev/null + $STD filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" + $STD filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" + $STD filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH" msg_ok "Default authentication configured (admin:community-scripts.org)" fi @@ -182,13 +164,13 @@ depend() { } EOF chmod +x "$SERVICE_PATH" - rc-update add filebrowser default &>/dev/null - rc-service filebrowser start &>/dev/null + $STD rc-update add filebrowser default + $STD rc-service filebrowser start fi msg_ok "Service created successfully" - echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}" + msg_ok "${APP} is reachable at: ${BL}http://${IP}:${PORT}${CL}" else - echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" + msg_warn "Installation skipped. Exiting." exit 0 fi diff --git a/tools/addon/glances.sh b/tools/addon/glances.sh index 7c9d7f9d8..496f6fb22 100644 --- a/tools/addon/glances.sh +++ b/tools/addon/glances.sh @@ -5,55 +5,33 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://nicolargo.github.io/glances/ | Github: https://github.com/nicolargo/glances -function header_info { - clear - cat <<"EOF" - ________ - / ____/ /___ _____ ________ _____ - / / __/ / __ `/ __ \/ ___/ _ \/ ___/ -/ /_/ / / /_/ / / / / /__/ __(__ ) -\____/_/\__,_/_/ /_/\___/\___/____/ - -EOF -} - APP="Glances" -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}" +APP_TYPE="addon" -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}"; } - -# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "glances" "addon" -get_lxc_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 - echo "127.0.0.1" - fi -} -IP=$(get_lxc_ip) +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +header_info +get_lxc_ip +IP="$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 curl >/dev/null 2>&1 + $STD apt-get update + $STD apt-get install -y gcc lm-sensors wireless-tools curl msg_ok "Installed dependencies" msg_info "Setting up Python + uv" - source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) setup_uv PYTHON_VERSION="3.12" msg_ok "Setup Python + uv" @@ -61,10 +39,10 @@ install_glances_debian() { cd /opt mkdir -p glances cd glances - uv venv --clear + $STD uv venv --clear 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 + $STD uv pip install --upgrade pip wheel setuptools + $STD uv pip install "glances[web]" deactivate msg_ok "Installed $APP" @@ -86,7 +64,7 @@ EOF systemctl enable -q --now glances msg_ok "Created systemd service" - echo -e "\n$APP is now running at: http://$IP:61208\n" + msg_ok "$APP is now running at: http://${IP}:61208" } # update on Debian/Ubuntu @@ -98,7 +76,7 @@ update_glances_debian() { msg_info "Updating $APP" cd /opt/glances source .venv/bin/activate - uv pip install --upgrade "glances[web]" >/dev/null 2>&1 + $STD uv pip install --upgrade "glances[web]" deactivate systemctl restart glances msg_ok "Updated successfully!" @@ -116,14 +94,13 @@ uninstall_glances_debian() { # install on Alpine install_glances_alpine() { msg_info "Installing dependencies" - apk update >/dev/null 2>&1 + $STD apk update $STD apk add --no-cache \ gcc musl-dev linux-headers python3-dev \ - python3 py3-pip py3-virtualenv lm-sensors wireless-tools curl >/dev/null 2>&1 + python3 py3-pip py3-virtualenv lm-sensors wireless-tools curl msg_ok "Installed dependencies" msg_info "Setting up Python + uv" - source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) setup_uv PYTHON_VERSION="3.12" msg_ok "Setup Python + uv" @@ -131,10 +108,10 @@ install_glances_alpine() { cd /opt mkdir -p glances cd glances - uv venv --clear + $STD uv venv --clear source .venv/bin/activate - uv pip install --upgrade pip wheel setuptools >/dev/null 2>&1 - uv pip install "glances[web]" >/dev/null 2>&1 + $STD uv pip install --upgrade pip wheel setuptools + $STD uv pip install "glances[web]" deactivate msg_ok "Installed $APP" @@ -165,7 +142,7 @@ update_glances_alpine() { msg_info "Updating $APP" cd /opt/glances source .venv/bin/activate - uv pip install --upgrade "glances[web]" >/dev/null 2>&1 + $STD uv pip install --upgrade "glances[web]" deactivate rc-service glances restart msg_ok "Updated successfully!" diff --git a/tools/addon/olivetin.sh b/tools/addon/olivetin.sh index afe6d811c..67df82f1f 100644 --- a/tools/addon/olivetin.sh +++ b/tools/addon/olivetin.sh @@ -5,67 +5,49 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://docs.olivetin.app/ | Github: https://github.com/OliveTin/OliveTin -function header_info { - clear - cat <<"EOF" - ____ ___ _______ - / __ \/ (_) _____/_ __(_)___ - / / / / / / | / / _ \/ / / / __ \ -/ /_/ / / /| |/ / __/ / / / / / / -\____/_/_/ |___/\___/_/ /_/_/ /_/ - -EOF -} - -IP=$(hostname -I | awk '{print $1}') -YW=$(echo "\033[33m") -BL=$(echo "\033[36m") -GN=$(echo "\033[1;92m") -CL=$(echo "\033[m") -BFR="\\r\\033[K" -HOLD="-" -CM="${GN}✓${CL}" APP="OliveTin" -hostname="$(hostname)" +APP_TYPE="addon" -# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "olivetin" "addon" -set-e +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + header_info +get_lxc_ip +IP="$LOCAL_IP" while true; do - read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn + echo -n "${TAB}This will Install ${APP}. Proceed (y/n)? " + read -r yn case $yn in [Yy]*) break ;; [Nn]*) exit ;; *) echo "Please answer yes or no." ;; esac done +unset _HEADER_SHOWN header_info -function msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." -} - -function msg_ok() { - local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" -} - msg_info "Installing ${APP}" if ! command -v curl &>/dev/null; then - apt-get update >/dev/null 2>&1 - apt-get install -y curl >/dev/null 2>&1 + $STD apt-get update + $STD apt-get install -y curl fi -curl -fsSL "https://github.com/OliveTin/OliveTin/releases/latest/download/OliveTin_linux_amd64.deb" -o $(basename "https://github.com/OliveTin/OliveTin/releases/latest/download/OliveTin_linux_amd64.deb") -dpkg -i OliveTin_linux_amd64.deb &>/dev/null +curl -fsSL "https://github.com/OliveTin/OliveTin/releases/latest/download/OliveTin_linux_amd64.deb" -o OliveTin_linux_amd64.deb +$STD dpkg -i OliveTin_linux_amd64.deb systemctl enable --now OliveTin &>/dev/null rm OliveTin_linux_amd64.deb -msg_ok "Installed ${APP} on $hostname" +msg_ok "Installed ${APP}" msg_ok "Completed successfully!\n" echo -e "${APP} should be reachable by going to the following URL. - ${BL}http://$IP:1337${CL} \n" + ${BL}http://${IP}:1337${CL} \n" diff --git a/tools/addon/phpmyadmin.sh b/tools/addon/phpmyadmin.sh index 8f59efaf9..72f20c7f2 100644 --- a/tools/addon/phpmyadmin.sh +++ b/tools/addon/phpmyadmin.sh @@ -5,39 +5,26 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.phpmyadmin.net/ | Github: https://github.com/phpmyadmin/phpmyadmin -function header_info { - clear - cat <<"EOF" - ____ __ __ ___ ___ __ _ - / __ \/ /_ ____ / |/ /_ __/ | ____/ /___ ___ (_)___ - / /_/ / __ \/ __ \/ /|_/ / / / / /| |/ __ / __ `__ \/ / __ \ - / ____/ / / / /_/ / / / / /_/ / ___ / /_/ / / / / / / / / / / -/_/ /_/ /_/ .___/_/ /_/\__, /_/ |_\__,_/_/ /_/ /_/_/_/ /_/ - /_/ /____/ -EOF -} - -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}" - APP="phpMyAdmin" +APP_TYPE="addon" INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin" INSTALL_DIR_ALPINE="/usr/share/phpmyadmin" -# Telemetry +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "phpmyadmin" "addon" -IFACE=$(ip -4 route | awk '/default/ {print $5; exit}') -IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1) -[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}') -[[ -z "$IP" ]] && IP="127.0.0.1" +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +get_lxc_ip +IP="$LOCAL_IP" # Detect OS if [[ -f "/etc/alpine-release" ]]; then @@ -51,20 +38,16 @@ elif [[ -f "/etc/debian_version" ]]; then PKG_QUERY="dpkg -l" INSTALL_DIR="$INSTALL_DIR_DEBIAN" else - echo -e "${CROSS} Unsupported OS detected. Exiting." + msg_error "Unsupported OS detected. Exiting." exit 238 fi header_info -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}"; } - function check_internet() { if ! command -v curl &>/dev/null; then - apt-get update >/dev/null 2>&1 - apt-get install -y curl >/dev/null 2>&1 + $STD apt-get update + $STD apt-get install -y curl fi msg_info "Checking Internet connectivity to GitHub" HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://github.com) @@ -103,7 +86,7 @@ function install_php_and_modules() { done if [[ ${#MISSING_PACKAGES[@]} -gt 0 ]]; then msg_info "Installing missing PHP packages: ${MISSING_PACKAGES[*]}" - if ! apt-get update &>/dev/null || ! apt-get install -y "${MISSING_PACKAGES[@]}" &>/dev/null; then + if ! $STD apt-get update || ! $STD apt-get install -y "${MISSING_PACKAGES[@]}"; then msg_error "Failed to install required PHP modules. Exiting." exit 237 fi @@ -113,7 +96,7 @@ function install_php_and_modules() { fi else msg_info "Installing Lighttpd and PHP for Alpine" - $PKG_MANAGER_INSTALL lighttpd php php-fpm php-session php-json php-mysqli curl tar openssl &>/dev/null + $STD $PKG_MANAGER_INSTALL lighttpd php php-fpm php-session php-json php-mysqli curl tar openssl msg_ok "Installed Lighttpd and PHP" fi } @@ -263,7 +246,7 @@ function update_phpmyadmin() { } if is_phpmyadmin_installed; then - echo -e "${YW}⚠️ ${APP} is already installed at ${INSTALL_DIR}.${CL}" + msg_warn "${APP} is already installed at ${INSTALL_DIR}." read -r -p "Would you like to Update (1), Uninstall (2) or Cancel (3)? [1/2/3]: " action action="${action//[[:space:]]/}" case "$action" in @@ -275,11 +258,11 @@ if is_phpmyadmin_installed; then uninstall_phpmyadmin ;; 3) - echo -e "${YW}⚠️ Action cancelled. Exiting.${CL}" + msg_warn "Action cancelled. Exiting." exit 0 ;; *) - echo -e "${YW}⚠️ Invalid input. Exiting.${CL}" + msg_warn "Invalid input. Exiting." exit 112 ;; esac @@ -292,12 +275,12 @@ else install_phpmyadmin configure_phpmyadmin if [[ "$OS" == "Debian" ]]; then - echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://${IP}/phpMyAdmin${CL}" + msg_ok "${APP} is reachable at: ${BL}http://${IP}/phpMyAdmin${CL}" else - echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://${IP}/${CL}" + msg_ok "${APP} is reachable at: ${BL}http://${IP}/${CL}" fi else - echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" + msg_warn "Installation skipped. Exiting." exit 0 fi fi