diff --git a/misc/api.func b/misc/api.func index baef2a1ad..457f5cc75 100644 --- a/misc/api.func +++ b/misc/api.func @@ -985,6 +985,62 @@ get_install_duration() { echo $((now - INSTALL_START_TIME)) } +# ------------------------------------------------------------------------------ +# _telemetry_report_exit() +# +# - Internal handler called by EXIT trap set in init_tool_telemetry() +# - Determines success/failure from exit code and reports via appropriate API +# - Arguments: +# * $1: exit_code from the script +# ------------------------------------------------------------------------------ +_telemetry_report_exit() { + local ec="${1:-0}" + local status="success" + [[ "$ec" -ne 0 ]] && status="failed" + + # Lazy name resolution: use explicit name, fall back to $APP, then "unknown" + local name="${TELEMETRY_TOOL_NAME:-${APP:-unknown}}" + + if [[ "${TELEMETRY_TOOL_TYPE:-tool}" == "addon" ]]; then + post_addon_to_api "$name" "$status" "$ec" + else + post_tool_to_api "$name" "$status" "$ec" + fi +} + +# ------------------------------------------------------------------------------ +# init_tool_telemetry() +# +# - One-line telemetry setup for tools/addon scripts +# - Reads DIAGNOSTICS from /usr/local/community-scripts/diagnostics +# - Starts install timer for duration tracking +# - Sets EXIT trap to automatically report success/failure on script exit +# - Arguments: +# * $1: tool_name (optional, falls back to $APP at exit time) +# * $2: type ("tool" for PVE host scripts, "addon" for container addons) +# - Usage: +# source <(curl -fsSL .../misc/api.func) 2>/dev/null || true +# init_tool_telemetry "post-pve-install" "tool" +# init_tool_telemetry "" "addon" # uses $APP at exit time +# ------------------------------------------------------------------------------ +init_tool_telemetry() { + local name="${1:-}" + local type="${2:-tool}" + + [[ -n "$name" ]] && TELEMETRY_TOOL_NAME="$name" + TELEMETRY_TOOL_TYPE="$type" + + # Read diagnostics opt-in/opt-out + if [[ -f /usr/local/community-scripts/diagnostics ]]; then + DIAGNOSTICS=$(grep -i "^DIAGNOSTICS=" /usr/local/community-scripts/diagnostics 2>/dev/null | awk -F'=' '{print $2}') || true + fi + + start_install_timer + + # EXIT trap: automatically report telemetry when script ends + trap '_telemetry_report_exit "$?"' EXIT +} + # ------------------------------------------------------------------------------ # post_tool_to_api() # diff --git a/misc/build.func b/misc/build.func index b0d7afbee..07185244f 100644 --- a/misc/build.func +++ b/misc/build.func @@ -4431,7 +4431,7 @@ EOF' export var_cpu="$CORE_COUNT" export VERBOSE="yes" export var_verbose="yes" - export RECOVERY_ATTEMPT=$(( ${RECOVERY_ATTEMPT:-0} + 1 )) + export RECOVERY_ATTEMPT=$((${RECOVERY_ATTEMPT:-0} + 1)) echo -e "${YW}Rebuilding with increased resources (attempt ${RECOVERY_ATTEMPT}/2):${CL}" echo -e " Container ID: ${old_ctid} → ${CTID}" diff --git a/tools/addon/add-netbird-lxc.sh b/tools/addon/add-netbird-lxc.sh index 64f20a279..d0b28b4d5 100644 --- a/tools/addon/add-netbird-lxc.sh +++ b/tools/addon/add-netbird-lxc.sh @@ -19,6 +19,11 @@ EOF } header_info set -e + +# Telemetry +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 "add-netbird-lxc" "tool" + while true; do read -p "This will add NetBird to an existing LXC Container ONLY. Proceed(y/n)?" yn case $yn in diff --git a/tools/addon/add-tailscale-lxc.sh b/tools/addon/add-tailscale-lxc.sh index 02b7ae731..0fcce0328 100644 --- a/tools/addon/add-tailscale-lxc.sh +++ b/tools/addon/add-tailscale-lxc.sh @@ -23,6 +23,10 @@ function msg_info() { echo -e " \e[1;36m➤\e[0m $1"; } function msg_ok() { echo -e " \e[1;32m✔\e[0m $1"; } function msg_error() { echo -e " \e[1;31m✖\e[0m $1"; } +# Telemetry +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 "add-tailscale-lxc" "tool" + header_info if ! command -v pveversion &>/dev/null; then diff --git a/tools/addon/adguardhome-sync.sh b/tools/addon/adguardhome-sync.sh index 249223aaa..9a32af294 100644 --- a/tools/addon/adguardhome-sync.sh +++ b/tools/addon/adguardhome-sync.sh @@ -13,6 +13,7 @@ fi 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 # Enable error handling set -Eeuo pipefail @@ -29,6 +30,7 @@ DEFAULT_PORT=8080 # Initialize all core functions (colors, formatting, icons, STD mode) load_functions +init_tool_telemetry "" "addon" # ============================================================================== # HEADER diff --git a/tools/addon/all-templates.sh b/tools/addon/all-templates.sh index ed06360a5..8e2af5ff2 100644 --- a/tools/addon/all-templates.sh +++ b/tools/addon/all-templates.sh @@ -42,6 +42,11 @@ function msg() { local TEXT="$1" echo -e "$TEXT" } + +# Telemetry +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 "all-templates" "tool" + function validate_container_id() { local ctid="$1" # Check if ID is numeric diff --git a/tools/addon/coder-code-server.sh b/tools/addon/coder-code-server.sh index 08211e5c4..586f2cf41 100644 --- a/tools/addon/coder-code-server.sh +++ b/tools/addon/coder-code-server.sh @@ -28,6 +28,11 @@ HOLD="-" CM="${GN}✓${CL}" APP="Coder Code Server" hostname="$(hostname)" + +# Telemetry +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 "coder-code-server" "addon" + set -o errexit set -o errtrace set -o nounset diff --git a/tools/addon/copyparty.sh b/tools/addon/copyparty.sh index 058b0b21b..f13bfa2c1 100644 --- a/tools/addon/copyparty.sh +++ b/tools/addon/copyparty.sh @@ -13,11 +13,13 @@ fi 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 # Enable error handling set -Eeuo pipefail trap 'error_handler' ERR load_functions +init_tool_telemetry "" "addon" # ============================================================================== # CONFIGURATION diff --git a/tools/addon/crowdsec.sh b/tools/addon/crowdsec.sh index db79762a0..5e6741481 100644 --- a/tools/addon/crowdsec.sh +++ b/tools/addon/crowdsec.sh @@ -17,6 +17,11 @@ HOLD="-" CM="${GN}✓${CL}" APP="CrowdSec" hostname="$(hostname)" + +# Telemetry +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 "crowdsec" "addon" + set -o errexit set -o errtrace set -o nounset diff --git a/tools/addon/filebrowser-quantum.sh b/tools/addon/filebrowser-quantum.sh index 33bb70997..f3e88e9d5 100644 --- a/tools/addon/filebrowser-quantum.sh +++ b/tools/addon/filebrowser-quantum.sh @@ -32,6 +32,10 @@ DEFAULT_PORT=8080 SRC_DIR="/" TMP_BIN="/tmp/filebrowser.$$" +# Telemetry +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) diff --git a/tools/addon/filebrowser.sh b/tools/addon/filebrowser.sh index 620a57a79..3b7004f5a 100644 --- a/tools/addon/filebrowser.sh +++ b/tools/addon/filebrowser.sh @@ -5,8 +5,8 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE function header_info { - clear - cat <<"EOF" + clear + cat <<"EOF" _______ __ ____ / ____(_) /__ / __ )_________ _ __________ _____ / /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/ @@ -29,6 +29,10 @@ 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/api.func) 2>/dev/null || true +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser" "addon" + # Get first non-loopback IP & Detect primary network interface dynamically 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) @@ -38,65 +42,65 @@ IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n # Detect OS if [[ -f "/etc/alpine-release" ]]; then - OS="Alpine" - SERVICE_PATH="/etc/init.d/filebrowser" - PKG_MANAGER="apk add --no-cache" + OS="Alpine" + SERVICE_PATH="/etc/init.d/filebrowser" + PKG_MANAGER="apk add --no-cache" elif [[ -f "/etc/debian_version" ]]; then - OS="Debian" - SERVICE_PATH="/etc/systemd/system/filebrowser.service" - PKG_MANAGER="apt-get install -y" + OS="Debian" + SERVICE_PATH="/etc/systemd/system/filebrowser.service" + PKG_MANAGER="apt-get install -y" else - echo -e "${CROSS} Unsupported OS detected. Exiting." - exit 1 + echo -e "${CROSS} Unsupported OS detected. Exiting." + exit 1 fi header_info function msg_info() { - local msg="$1" - echo -e "${INFO} ${YW}${msg}...${CL}" + local msg="$1" + echo -e "${INFO} ${YW}${msg}...${CL}" } function msg_ok() { - local msg="$1" - echo -e "${CM} ${GN}${msg}${CL}" + local msg="$1" + echo -e "${CM} ${GN}${msg}${CL}" } function msg_error() { - local msg="$1" - echo -e "${CROSS} ${RD}${msg}${CL}" + local msg="$1" + echo -e "${CROSS} ${RD}${msg}${CL}" } if [ -f "$INSTALL_PATH" ]; then - echo -e "${YW}⚠️ ${APP} is already installed.${CL}" - 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 - rm -f "$SERVICE_PATH" - else - rc-service filebrowser stop &>/dev/null - rc-update del filebrowser &>/dev/null - rm -f "$SERVICE_PATH" - fi - rm -f "$INSTALL_PATH" "$DB_PATH" - msg_ok "${APP} has been uninstalled." - exit 0 - fi - - 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 - 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 + echo -e "${YW}⚠️ ${APP} is already installed.${CL}" + 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 + rm -f "$SERVICE_PATH" else - echo -e "${YW}⚠️ Update skipped. Exiting.${CL}" - exit 0 + rc-service filebrowser stop &>/dev/null + rc-update del filebrowser &>/dev/null + rm -f "$SERVICE_PATH" fi + rm -f "$INSTALL_PATH" "$DB_PATH" + msg_ok "${APP} has been uninstalled." + exit 0 + fi + + 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 + 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}" + exit 0 + fi fi echo -e "${YW}⚠️ ${APP} is not installed.${CL}" @@ -105,43 +109,43 @@ 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 - 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}" + msg_info "Installing ${APP} on ${OS}" + $PKG_MANAGER wget tar curl &>/dev/null + 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}" - msg_info "Creating FileBrowser directory" - mkdir -p /usr/local/community-scripts - chown root:root /usr/local/community-scripts - chmod 755 /usr/local/community-scripts - touch "$DB_PATH" - chown root:root "$DB_PATH" - chmod 644 "$DB_PATH" - msg_ok "Directory created successfully" + msg_info "Creating FileBrowser directory" + mkdir -p /usr/local/community-scripts + chown root:root /usr/local/community-scripts + chmod 755 /usr/local/community-scripts + touch "$DB_PATH" + chown root:root "$DB_PATH" + chmod 644 "$DB_PATH" + msg_ok "Directory created successfully" - read -r -p "Would you like to use No Authentication? (y/N): " auth_prompt - 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 init --auth.method=noauth &>/dev/null - filebrowser config set --auth.method=noauth &>/dev/null - filebrowser users add ID 1 --perm.admin &>/dev/null - 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 helper-scripts.com --perm.admin --database "$DB_PATH" &>/dev/null - msg_ok "Default authentication configured (admin:helper-scripts.com)" - fi + read -r -p "Would you like to use No Authentication? (y/N): " auth_prompt + 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 init --auth.method=noauth &>/dev/null + filebrowser config set --auth.method=noauth &>/dev/null + filebrowser users add ID 1 --perm.admin &>/dev/null + 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 helper-scripts.com --perm.admin --database "$DB_PATH" &>/dev/null + msg_ok "Default authentication configured (admin:helper-scripts.com)" + fi - msg_info "Creating service" - if [[ "$OS" == "Debian" ]]; then - cat <"$SERVICE_PATH" + msg_info "Creating service" + if [[ "$OS" == "Debian" ]]; then + cat <"$SERVICE_PATH" [Unit] Description=Filebrowser After=network-online.target @@ -157,9 +161,9 @@ Restart=always [Install] WantedBy=multi-user.target EOF - systemctl enable -q --now filebrowser - else - cat <"$SERVICE_PATH" + systemctl enable -q --now filebrowser + else + cat <"$SERVICE_PATH" #!/sbin/openrc-run command="/usr/local/bin/filebrowser" @@ -172,14 +176,14 @@ depend() { need net } EOF - chmod +x "$SERVICE_PATH" - rc-update add filebrowser default &>/dev/null - rc-service filebrowser start &>/dev/null - fi - msg_ok "Service created successfully" + chmod +x "$SERVICE_PATH" + rc-update add filebrowser default &>/dev/null + rc-service filebrowser start &>/dev/null + fi + msg_ok "Service created successfully" - echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}" + echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}" else - echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" - exit 0 + echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" + exit 0 fi diff --git a/tools/addon/glances.sh b/tools/addon/glances.sh index 64e145a4c..46faa1a8b 100644 --- a/tools/addon/glances.sh +++ b/tools/addon/glances.sh @@ -30,6 +30,10 @@ 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/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}' diff --git a/tools/addon/immich-public-proxy.sh b/tools/addon/immich-public-proxy.sh index a147f80d1..f26a5c24c 100644 --- a/tools/addon/immich-public-proxy.sh +++ b/tools/addon/immich-public-proxy.sh @@ -13,6 +13,7 @@ fi 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 # Enable error handling set -Eeuo pipefail @@ -29,6 +30,7 @@ DEFAULT_PORT=3000 # Initialize all core functions (colors, formatting, icons, STD mode) load_functions +init_tool_telemetry "" "addon" # ============================================================================== # HEADER diff --git a/tools/addon/jellystat.sh b/tools/addon/jellystat.sh index 2afd4fa81..cb201f6c6 100644 --- a/tools/addon/jellystat.sh +++ b/tools/addon/jellystat.sh @@ -13,6 +13,7 @@ fi 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 # Enable error handling set -Eeuo pipefail @@ -29,6 +30,7 @@ DEFAULT_PORT=3000 # Initialize all core functions (colors, formatting, icons, STD mode) load_functions +init_tool_telemetry "" "addon" # ============================================================================== # HEADER diff --git a/tools/addon/netdata.sh b/tools/addon/netdata.sh index ca790ae45..5bdb418e0 100644 --- a/tools/addon/netdata.sh +++ b/tools/addon/netdata.sh @@ -26,6 +26,11 @@ BFR="\\r\\033[K" HOLD="-" CM="${GN}✓${CL}" silent() { "$@" >/dev/null 2>&1; } + +# Telemetry +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 "netdata" "tool" + set -e header_info echo "Loading..." diff --git a/tools/addon/nextcloud-exporter.sh b/tools/addon/nextcloud-exporter.sh index 60be17acb..94f3c5899 100644 --- a/tools/addon/nextcloud-exporter.sh +++ b/tools/addon/nextcloud-exporter.sh @@ -13,11 +13,13 @@ fi 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 # Enable error handling set -Eeuo pipefail trap 'error_handler' ERR load_functions +init_tool_telemetry "" "addon" # ============================================================================== # CONFIGURATION diff --git a/tools/addon/olivetin.sh b/tools/addon/olivetin.sh index 54672402a..77e2de07a 100644 --- a/tools/addon/olivetin.sh +++ b/tools/addon/olivetin.sh @@ -27,6 +27,11 @@ HOLD="-" CM="${GN}✓${CL}" APP="OliveTin" hostname="$(hostname)" + +# Telemetry +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 header_info diff --git a/tools/addon/phpmyadmin.sh b/tools/addon/phpmyadmin.sh index f19a037bc..49c7aa7c0 100644 --- a/tools/addon/phpmyadmin.sh +++ b/tools/addon/phpmyadmin.sh @@ -29,6 +29,10 @@ APP="phpMyAdmin" 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/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}') diff --git a/tools/addon/pihole-exporter.sh b/tools/addon/pihole-exporter.sh index c2395d86c..9102ca9f3 100644 --- a/tools/addon/pihole-exporter.sh +++ b/tools/addon/pihole-exporter.sh @@ -13,11 +13,13 @@ fi 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 # Enable error handling set -Eeuo pipefail trap 'error_handler' ERR load_functions +init_tool_telemetry "" "addon" # ============================================================================== # CONFIGURATION diff --git a/tools/addon/prometheus-paperless-ngx-exporter.sh b/tools/addon/prometheus-paperless-ngx-exporter.sh index 6f320c92b..a1db26d68 100644 --- a/tools/addon/prometheus-paperless-ngx-exporter.sh +++ b/tools/addon/prometheus-paperless-ngx-exporter.sh @@ -8,11 +8,13 @@ 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 # Enable error handling set -Eeuo pipefail trap 'error_handler' ERR load_functions +init_tool_telemetry "" "addon" # ============================================================================== # CONFIGURATION diff --git a/tools/addon/pyenv.sh b/tools/addon/pyenv.sh index 7611807f0..dd870954a 100644 --- a/tools/addon/pyenv.sh +++ b/tools/addon/pyenv.sh @@ -28,6 +28,11 @@ function msg_error() { local msg="$1" echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } + +# Telemetry +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 "pyenv" "addon" + if command -v pveversion >/dev/null 2>&1; then msg_error "Can't Install on Proxmox " exit diff --git a/tools/addon/qbittorrent-exporter.sh b/tools/addon/qbittorrent-exporter.sh index 69bbb0884..0dc72f684 100644 --- a/tools/addon/qbittorrent-exporter.sh +++ b/tools/addon/qbittorrent-exporter.sh @@ -13,11 +13,13 @@ fi 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 # Enable error handling set -Eeuo pipefail trap 'error_handler' ERR load_functions +init_tool_telemetry "" "addon" # ============================================================================== # CONFIGURATION diff --git a/tools/addon/webmin.sh b/tools/addon/webmin.sh index 2df075772..cc192d805 100644 --- a/tools/addon/webmin.sh +++ b/tools/addon/webmin.sh @@ -36,6 +36,10 @@ msg_ok() { echo -e "${BFR} ${CM} ${GN}${msg}${CL}" } +# Telemetry +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 "webmin" "addon" + header_info whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58 diff --git a/tools/pve/add-iptag.sh b/tools/pve/add-iptag.sh index bd4353d55..a9b8904a7 100644 --- a/tools/pve/add-iptag.sh +++ b/tools/pve/add-iptag.sh @@ -31,6 +31,10 @@ HOLD=" " CM="${GN}✓${CL} " CROSS="${RD}✗${CL} " +# Telemetry +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 "add-iptag" "tool" + # Stop any running spinner stop_spinner() { if [ -n "$SPINNER_PID" ] && kill -0 "$SPINNER_PID" 2>/dev/null; then diff --git a/tools/pve/clean-lxcs.sh b/tools/pve/clean-lxcs.sh index 61ed7abdb..9cf101b6b 100644 --- a/tools/pve/clean-lxcs.sh +++ b/tools/pve/clean-lxcs.sh @@ -22,6 +22,10 @@ CM='\xE2\x9C\x94\033' GN="\033[1;92m" CL="\033[m" +# Telemetry +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 "clean-lxcs" "tool" + header_info echo "Loading..." diff --git a/tools/pve/clean-orphaned-lvm.sh b/tools/pve/clean-orphaned-lvm.sh index f6dfb3745..677b10d87 100644 --- a/tools/pve/clean-orphaned-lvm.sh +++ b/tools/pve/clean-orphaned-lvm.sh @@ -5,8 +5,8 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE function header_info { - clear - cat <<"EOF" + clear + cat <<"EOF" ____ ________ ____ __ __ __ _ ____ ___ / __ \_________ _ ______ ___ ____ _ __ / ____/ /__ ____ _____ / __ \_________ / /_ ____ _____ ___ ____/ / / /| | / / |/ /____ / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / / / / _ \/ __ `/ __ \ / / / / ___/ __ \/ __ \/ __ `/ __ \/ _ \/ __ / / / | | / / /|_/ / ___/ @@ -16,62 +16,66 @@ function header_info { EOF } +# Telemetry +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 "clean-orphaned-lvm" "tool" + # Function to check for orphaned LVM volumes function find_orphaned_lvm { - echo -e "\n🔍 Scanning for orphaned LVM volumes...\n" + echo -e "\n🔍 Scanning for orphaned LVM volumes...\n" - orphaned_volumes=() - while read -r lv vg size seg_type; do - # Exclude system-critical LVs and Ceph OSDs - if [[ "$lv" == "data" || "$lv" == "root" || "$lv" == "swap" || "$lv" =~ ^osd-block- ]]; then - continue - fi + orphaned_volumes=() + while read -r lv vg size seg_type; do + # Exclude system-critical LVs and Ceph OSDs + if [[ "$lv" == "data" || "$lv" == "root" || "$lv" == "swap" || "$lv" =~ ^osd-block- ]]; then + continue + fi - # Exclude thin pools (any name) - if [[ "$seg_type" == "thin-pool" ]]; then - continue - fi + # Exclude thin pools (any name) + if [[ "$seg_type" == "thin-pool" ]]; then + continue + fi - container_id=$(echo "$lv" | grep -oE "[0-9]+" | head -1) - # Check if the ID exists as a VM or LXC container - if [ -f "/etc/pve/lxc/${container_id}.conf" ] || [ -f "/etc/pve/qemu-server/${container_id}.conf" ]; then - continue - fi + container_id=$(echo "$lv" | grep -oE "[0-9]+" | head -1) + # Check if the ID exists as a VM or LXC container + if [ -f "/etc/pve/lxc/${container_id}.conf" ] || [ -f "/etc/pve/qemu-server/${container_id}.conf" ]; then + continue + fi - orphaned_volumes+=("$lv" "$vg" "$size") - done < <(lvs --noheadings -o lv_name,vg_name,lv_size,seg_type --separator ' ' 2>/dev/null | awk '{print $1, $2, $3, $4}') + orphaned_volumes+=("$lv" "$vg" "$size") + done < <(lvs --noheadings -o lv_name,vg_name,lv_size,seg_type --separator ' ' 2>/dev/null | awk '{print $1, $2, $3, $4}') - # Display orphaned volumes - echo -e "❗ The following orphaned LVM volumes were found:\n" - printf "%-25s %-10s %-10s\n" "LV Name" "VG" "Size" - printf "%-25s %-10s %-10s\n" "-------------------------" "----------" "----------" + # Display orphaned volumes + echo -e "❗ The following orphaned LVM volumes were found:\n" + printf "%-25s %-10s %-10s\n" "LV Name" "VG" "Size" + printf "%-25s %-10s %-10s\n" "-------------------------" "----------" "----------" - for ((i = 0; i < ${#orphaned_volumes[@]}; i += 3)); do - printf "%-25s %-10s %-10s\n" "${orphaned_volumes[i]}" "${orphaned_volumes[i + 1]}" "${orphaned_volumes[i + 2]}" - done - echo "" + for ((i = 0; i < ${#orphaned_volumes[@]}; i += 3)); do + printf "%-25s %-10s %-10s\n" "${orphaned_volumes[i]}" "${orphaned_volumes[i + 1]}" "${orphaned_volumes[i + 2]}" + done + echo "" } # Function to delete selected volumes function delete_orphaned_lvm { - for ((i = 0; i < ${#orphaned_volumes[@]}; i += 3)); do - lv="${orphaned_volumes[i]}" - vg="${orphaned_volumes[i + 1]}" - size="${orphaned_volumes[i + 2]}" + for ((i = 0; i < ${#orphaned_volumes[@]}; i += 3)); do + lv="${orphaned_volumes[i]}" + vg="${orphaned_volumes[i + 1]}" + size="${orphaned_volumes[i + 2]}" - read -p "❓ Do you want to delete $lv (VG: $vg, Size: $size)? [y/N]: " confirm - if [[ "$confirm" =~ ^[Yy]$ ]]; then - echo -e "🗑️ Deleting $lv from $vg..." - lvremove -f "$vg/$lv" - if [ $? -eq 0 ]; then - echo -e "✅ Successfully deleted $lv.\n" - else - echo -e "❌ Failed to delete $lv.\n" - fi - else - echo -e "⚠️ Skipping $lv.\n" - fi - done + read -p "❓ Do you want to delete $lv (VG: $vg, Size: $size)? [y/N]: " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + echo -e "🗑️ Deleting $lv from $vg..." + lvremove -f "$vg/$lv" + if [ $? -eq 0 ]; then + echo -e "✅ Successfully deleted $lv.\n" + else + echo -e "❌ Failed to delete $lv.\n" + fi + else + echo -e "⚠️ Skipping $lv.\n" + fi + done } # Run script diff --git a/tools/pve/container-restore-from-backup.sh b/tools/pve/container-restore-from-backup.sh index b5c727503..de7615db2 100644 --- a/tools/pve/container-restore-from-backup.sh +++ b/tools/pve/container-restore-from-backup.sh @@ -7,8 +7,8 @@ clear if command -v pveversion >/dev/null 2>&1; then - echo -e "⚠️ Can't Run from the Proxmox Shell" - exit + echo -e "⚠️ Can't Run from the Proxmox Shell" + exit fi YW=$(echo "\033[33m") BL=$(echo "\033[36m") @@ -23,16 +23,16 @@ CM="${GN}✓${CL}" CROSS="${RD}✗${CL}" APP="Home Assistant Container" while true; do - read -p "This will restore ${APP} from a backup. Proceed(y/n)?" yn - case $yn in - [Yy]*) break ;; - [Nn]*) exit ;; - *) echo "Please answer yes or no." ;; - esac + read -p "This will restore ${APP} from a backup. Proceed(y/n)?" yn + case $yn in + [Yy]*) break ;; + [Nn]*) exit ;; + *) echo "Please answer yes or no." ;; + esac done clear function header_info { - cat <<"EOF" + cat <<"EOF" __ __ ___ _ __ __ / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ @@ -44,35 +44,39 @@ EOF header_info +# Telemetry +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 "container-restore" "tool" + function msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." } function msg_ok() { - local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" } function msg_error() { - local msg="$1" - echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" + local msg="$1" + echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } if [ -z "$(ls -A /var/lib/docker/volumes/hass_config/_data/backups/)" ]; then - msg_error "No backups found! \n" - exit 1 + msg_error "No backups found! \n" + exit 1 fi DIR=/var/lib/docker/volumes/hass_config/_data/restore if [ -d "$DIR" ]; then - msg_ok "Restore Directory Exists." + msg_ok "Restore Directory Exists." else - mkdir -p /var/lib/docker/volumes/hass_config/_data/restore - msg_ok "Created Restore Directory." + mkdir -p /var/lib/docker/volumes/hass_config/_data/restore + msg_ok "Created Restore Directory." fi cd /var/lib/docker/volumes/hass_config/_data/backups/ PS3="Please enter your choice: " files="$(ls -A .)" select filename in ${files}; do - msg_ok "You selected ${BL}${filename}${CL}" - break + msg_ok "You selected ${BL}${filename}${CL}" + break done msg_info "Stopping Home Assistant" docker stop homeassistant &>/dev/null diff --git a/tools/pve/core-restore-from-backup.sh b/tools/pve/core-restore-from-backup.sh index 663677489..22a6775fc 100644 --- a/tools/pve/core-restore-from-backup.sh +++ b/tools/pve/core-restore-from-backup.sh @@ -7,8 +7,8 @@ clear if command -v pveversion >/dev/null 2>&1; then - echo -e "⚠️ Can't Run from the Proxmox Shell" - exit + echo -e "⚠️ Can't Run from the Proxmox Shell" + exit fi YW=$(echo "\033[33m") BL=$(echo "\033[36m") @@ -23,16 +23,16 @@ CM="${GN}✓${CL}" CROSS="${RD}✗${CL}" APP="Home Assistant Core" while true; do - read -p "This will restore ${APP} from a backup. Proceed(y/n)?" yn - case $yn in - [Yy]*) break ;; - [Nn]*) exit ;; - *) echo "Please answer yes or no." ;; - esac + read -p "This will restore ${APP} from a backup. Proceed(y/n)?" yn + case $yn in + [Yy]*) break ;; + [Nn]*) exit ;; + *) echo "Please answer yes or no." ;; + esac done clear function header_info { - cat <<"EOF" + cat <<"EOF" __ __ ___ _ __ __ ______ / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ / ____/___ ________ / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ / / / __ \/ ___/ _ \ @@ -44,35 +44,39 @@ EOF header_info +# Telemetry +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 "core-restore" "tool" + function msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." } function msg_ok() { - local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" } function msg_error() { - local msg="$1" - echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" + local msg="$1" + echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } if [ -z "$(ls -A /root/.homeassistant/backups/)" ]; then - msg_error "No backups found! \n" - exit 1 + msg_error "No backups found! \n" + exit 1 fi DIR=/root/.homeassistant/restore if [ -d "$DIR" ]; then - msg_ok "Restore Directory Exists." + msg_ok "Restore Directory Exists." else - mkdir -p /root/.homeassistant/restore - msg_ok "Created Restore Directory." + mkdir -p /root/.homeassistant/restore + msg_ok "Created Restore Directory." fi cd /root/.homeassistant/backups/ PS3="Please enter your choice: " files="$(ls -A .)" select filename in ${files}; do - msg_ok "You selected ${BL}${filename}${CL}" - break + msg_ok "You selected ${BL}${filename}${CL}" + break done msg_info "Stopping Home Assistant" sudo service homeassistant stop diff --git a/tools/pve/execute.sh b/tools/pve/execute.sh index ba95ed14b..c863e361c 100644 --- a/tools/pve/execute.sh +++ b/tools/pve/execute.sh @@ -22,6 +22,11 @@ RD=$(echo "\033[01;31m") CM='\xE2\x9C\x94\033' GN=$(echo "\033[1;92m") CL=$(echo "\033[m") + +# Telemetry +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 "execute-lxcs" "tool" + header_info echo "Loading..." whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Execute" --yesno "This will execute a command inside selected LXC Containers. Proceed?" 10 58 @@ -40,7 +45,6 @@ if [ $? -ne 0 ]; then exit fi - read -r -p "Enter here command for inside the containers: " custom_command header_info @@ -50,12 +54,11 @@ function execute_in() { container=$1 name=$(pct exec "$container" hostname) echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}" - if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1" - then - echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}" - else - pct exec "$container" -- bash -c "${custom_command}" | tee - fi + if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1"; then + echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}" + else + pct exec "$container" -- bash -c "${custom_command}" | tee + fi } for container in $(pct list | awk '{if(NR>1) print $1}'); do diff --git a/tools/pve/frigate-support.sh b/tools/pve/frigate-support.sh index f9e6f5d07..e7b902fce 100644 --- a/tools/pve/frigate-support.sh +++ b/tools/pve/frigate-support.sh @@ -15,6 +15,11 @@ function header_info { /___/ /_/ /_/ EOF } + +# Telemetry +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 "frigate-support" "tool" + header_info while true; do read -p "This will Prepare a LXC Container for Frigate. Proceed (y/n)?" yn diff --git a/tools/pve/fstrim.sh b/tools/pve/fstrim.sh index 4bd68f442..31a78742c 100644 --- a/tools/pve/fstrim.sh +++ b/tools/pve/fstrim.sh @@ -19,6 +19,10 @@ RD="\033[01;31m" GN="\033[1;92m" CL="\033[m" +# Telemetry +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 "fstrim" "tool" + LOGFILE="/var/log/fstrim.log" touch "$LOGFILE" chmod 600 "$LOGFILE" diff --git a/tools/pve/host-backup.sh b/tools/pve/host-backup.sh index e38ada344..a0592463f 100644 --- a/tools/pve/host-backup.sh +++ b/tools/pve/host-backup.sh @@ -16,6 +16,10 @@ function header_info { EOF } +# Telemetry +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 "host-backup" "tool" + # Function to perform backup function perform_backup { local BACKUP_PATH diff --git a/tools/pve/hw-acceleration.sh b/tools/pve/hw-acceleration.sh index 4dea09ced..0f73a65dd 100644 --- a/tools/pve/hw-acceleration.sh +++ b/tools/pve/hw-acceleration.sh @@ -29,6 +29,11 @@ BFR="\\r\\033[K" HOLD="-" CM="${GN}✓${CL}" set -e + +# Telemetry +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 "hw-acceleration" "tool" + header_info echo "Loading..." function msg_info() { diff --git a/tools/pve/kernel-clean.sh b/tools/pve/kernel-clean.sh index 65c025d18..fb178d250 100644 --- a/tools/pve/kernel-clean.sh +++ b/tools/pve/kernel-clean.sh @@ -22,6 +22,10 @@ GN="\033[1;92m" RD="\033[01;31m" CL="\033[m" +# Telemetry +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 "kernel-clean" "tool" + # Detect current kernel current_kernel=$(uname -r) available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | grep -v "$current_kernel" | sort -V) diff --git a/tools/pve/kernel-pin.sh b/tools/pve/kernel-pin.sh index 02a957882..534ddac0f 100644 --- a/tools/pve/kernel-pin.sh +++ b/tools/pve/kernel-pin.sh @@ -25,6 +25,11 @@ HOLD="-" CM="${GN}✓${CL}" current_kernel=$(uname -r) available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print substr($2, 16, length($2)-22)}') + +# Telemetry +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 "kernel-pin" "tool" + header_info function msg_info() { diff --git a/tools/pve/lxc-delete.sh b/tools/pve/lxc-delete.sh index 7690afa03..755e3d4c4 100644 --- a/tools/pve/lxc-delete.sh +++ b/tools/pve/lxc-delete.sh @@ -38,6 +38,10 @@ CL=$(echo "\033[m") TAB=" " CM="${TAB}✔️${TAB}${CL}" +# Telemetry +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 "lxc-delete" "tool" + header_info echo "Loading..." whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58 diff --git a/tools/pve/microcode.sh b/tools/pve/microcode.sh index fbab1ab47..ef1144c41 100644 --- a/tools/pve/microcode.sh +++ b/tools/pve/microcode.sh @@ -29,6 +29,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; } msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } +# Telemetry +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 "microcode" "tool" + header_info current_microcode=$(journalctl -k | grep -i 'microcode: Current revision:' | grep -oP 'Current revision: \K0x[0-9a-f]+') [ -z "$current_microcode" ] && current_microcode="Not found." diff --git a/tools/pve/monitor-all.sh b/tools/pve/monitor-all.sh index 9e2b5a4a6..6d69b59c9 100644 --- a/tools/pve/monitor-all.sh +++ b/tools/pve/monitor-all.sh @@ -15,6 +15,10 @@ cat <<"EOF" EOF +# Telemetry +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 "monitor-all" "tool" + add() { echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled" echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service." @@ -28,9 +32,9 @@ add() { while true; do read -p "This script will add Monitor All to Proxmox VE. Proceed (y/n)? " yn case $yn in - [Yy]*) break ;; - [Nn]*) exit ;; - *) echo "Please answer yes or no." ;; + [Yy]*) break ;; + [Nn]*) exit ;; + *) echo "Please answer yes or no." ;; esac done @@ -175,5 +179,8 @@ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Monitor-All f case $CHOICE in "Add") add ;; "Remove") remove ;; -*) echo "Exiting..."; exit 0 ;; +*) + echo "Exiting..." + exit 0 + ;; esac diff --git a/tools/pve/nic-offloading-fix.sh b/tools/pve/nic-offloading-fix.sh index 63b3c67a3..b1199f12d 100644 --- a/tools/pve/nic-offloading-fix.sh +++ b/tools/pve/nic-offloading-fix.sh @@ -19,8 +19,8 @@ INFO="${TAB}ℹ️${TAB}${CL}" WARN="${TAB}⚠️${TAB}${CL}" function header_info { -clear -cat <<"EOF" + clear + cat <<"EOF" _ ____________ ____ __________ ___ ____ _ __ __ / | / / _/ ____/ / __ \/ __/ __/ /___ ____ _____/ (_)___ ____ _ / __ \(_)________ _/ /_ / /__ _____ @@ -33,6 +33,10 @@ Enhanced version supporting both e1000e and e1000 drivers EOF } +# Telemetry +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 "nic-offloading-fix" "tool" + header_info function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; } @@ -42,15 +46,18 @@ function msg_warn() { echo -e "${WARN} ${YWB}${1}"; } # Check for root privileges if [ "$(id -u)" -ne 0 ]; then - msg_error "Error: This script must be run as root." - exit 1 + msg_error "Error: This script must be run as root." + exit 1 fi if ! command -v ethtool >/dev/null 2>&1; then - msg_info "Installing ethtool" - apt-get update &>/dev/null - apt-get install -y ethtool &>/dev/null || { msg_error "Failed to install ethtool. Exiting."; exit 1; } - msg_ok "ethtool installed successfully" + msg_info "Installing ethtool" + apt-get update &>/dev/null + apt-get install -y ethtool &>/dev/null || { + msg_error "Failed to install ethtool. Exiting." + exit 1 + } + msg_ok "ethtool installed successfully" fi # Get list of network interfaces using Intel e1000e or e1000 drivers @@ -60,95 +67,95 @@ COUNT=0 msg_info "Searching for Intel e1000e and e1000 interfaces" for device in /sys/class/net/*; do - interface="$(basename "$device")" # or adjust the rest of the usages below, as mostly you'll use the path anyway - # Skip loopback interface and virtual interfaces - if [[ "$interface" != "lo" ]] && [[ ! "$interface" =~ ^(tap|fwbr|veth|vmbr|bonding_masters) ]]; then - # Check if the interface uses the e1000e or e1000 driver - driver=$(basename $(readlink -f /sys/class/net/$interface/device/driver 2>/dev/null) 2>/dev/null) - - if [[ "$driver" == "e1000e" ]] || [[ "$driver" == "e1000" ]]; then - # Get MAC address for additional identification - mac=$(cat /sys/class/net/$interface/address 2>/dev/null) - INTERFACES+=("$interface" "Intel $driver NIC ($mac)") - ((COUNT++)) - fi + interface="$(basename "$device")" # or adjust the rest of the usages below, as mostly you'll use the path anyway + # Skip loopback interface and virtual interfaces + if [[ "$interface" != "lo" ]] && [[ ! "$interface" =~ ^(tap|fwbr|veth|vmbr|bonding_masters) ]]; then + # Check if the interface uses the e1000e or e1000 driver + driver=$(basename $(readlink -f /sys/class/net/$interface/device/driver 2>/dev/null) 2>/dev/null) + + if [[ "$driver" == "e1000e" ]] || [[ "$driver" == "e1000" ]]; then + # Get MAC address for additional identification + mac=$(cat /sys/class/net/$interface/address 2>/dev/null) + INTERFACES+=("$interface" "Intel $driver NIC ($mac)") + ((COUNT++)) fi + fi done # Check if any Intel e1000e/e1000 interfaces were found if [ ${#INTERFACES[@]} -eq 0 ]; then - whiptail --title "Error" --msgbox "No Intel e1000e or e1000 network interfaces found!" 10 60 - msg_error "No Intel e1000e or e1000 network interfaces found! Exiting." - exit 1 + whiptail --title "Error" --msgbox "No Intel e1000e or e1000 network interfaces found!" 10 60 + msg_error "No Intel e1000e or e1000 network interfaces found! Exiting." + exit 1 fi msg_ok "Found ${BL}$COUNT${GN} Intel e1000e/e1000 interfaces" # Create a checklist for interface selection with all interfaces initially checked INTERFACES_CHECKLIST=() -for ((i=0; i<${#INTERFACES[@]}; i+=2)); do - INTERFACES_CHECKLIST+=("${INTERFACES[i]}" "${INTERFACES[i+1]}" "ON") +for ((i = 0; i < ${#INTERFACES[@]}; i += 2)); do + INTERFACES_CHECKLIST+=("${INTERFACES[i]}" "${INTERFACES[i + 1]}" "ON") done # Show interface selection checklist SELECTED_INTERFACES=$(whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --title "Network Interfaces" \ - --separate-output --checklist "Select Intel e1000e/e1000 network interfaces\n(Space to toggle, Enter to confirm):" 15 80 6 \ - "${INTERFACES_CHECKLIST[@]}" 3>&1 1>&2 2>&3) + --separate-output --checklist "Select Intel e1000e/e1000 network interfaces\n(Space to toggle, Enter to confirm):" 15 80 6 \ + "${INTERFACES_CHECKLIST[@]}" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus != 0 ]; then - msg_info "User canceled. Exiting." - exit 0 + msg_info "User canceled. Exiting." + exit 0 fi # Check if any interfaces were selected if [ -z "$SELECTED_INTERFACES" ]; then - msg_error "No interfaces selected. Exiting." - exit 0 + msg_error "No interfaces selected. Exiting." + exit 0 fi # Convert the selected interfaces into an array -readarray -t INTERFACE_ARRAY <<< "$SELECTED_INTERFACES" +readarray -t INTERFACE_ARRAY <<<"$SELECTED_INTERFACES" # Show the number of selected interfaces INTERFACE_COUNT=${#INTERFACE_ARRAY[@]} # Print selected interfaces with their driver types for iface in "${INTERFACE_ARRAY[@]}"; do - driver=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null) - msg_ok "Selected interface: ${BL}$iface${GN} (${BL}$driver${GN})" + driver=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null) + msg_ok "Selected interface: ${BL}$iface${GN} (${BL}$driver${GN})" done # Ask for confirmation with the list of selected interfaces CONFIRMATION_MSG="You have selected the following interface(s):\n\n" for iface in "${INTERFACE_ARRAY[@]}"; do - SPEED=$(cat /sys/class/net/$iface/speed 2>/dev/null || echo "Unknown") - MAC=$(cat /sys/class/net/$iface/address 2>/dev/null) - DRIVER=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null) - CONFIRMATION_MSG+="- $iface (Driver: $DRIVER, MAC: $MAC, Speed: ${SPEED}Mbps)\n" + SPEED=$(cat /sys/class/net/$iface/speed 2>/dev/null || echo "Unknown") + MAC=$(cat /sys/class/net/$iface/address 2>/dev/null) + DRIVER=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null) + CONFIRMATION_MSG+="- $iface (Driver: $DRIVER, MAC: $MAC, Speed: ${SPEED}Mbps)\n" done CONFIRMATION_MSG+="\nThis will create systemd service(s) to disable offloading features.\n\nProceed?" if ! whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --title "Confirmation" \ - --yesno "$CONFIRMATION_MSG" 20 80; then - msg_info "User canceled. Exiting." - exit 0 + --yesno "$CONFIRMATION_MSG" 20 80; then + msg_info "User canceled. Exiting." + exit 0 fi # Loop through all selected interfaces and create services for each for SELECTED_INTERFACE in "${INTERFACE_ARRAY[@]}"; do - # Get the driver type for this specific interface - DRIVER=$(basename $(readlink -f /sys/class/net/$SELECTED_INTERFACE/device/driver 2>/dev/null) 2>/dev/null) - - # Create service name for this interface - SERVICE_NAME="disable-nic-offload-$SELECTED_INTERFACE.service" - SERVICE_PATH="/etc/systemd/system/$SERVICE_NAME" - - # Create the service file with driver-specific optimizations - msg_info "Creating systemd service for interface: ${BL}$SELECTED_INTERFACE${YW} (${BL}$DRIVER${YW})" - - # Start with the common part of the service file - cat > "$SERVICE_PATH" << EOF + # Get the driver type for this specific interface + DRIVER=$(basename $(readlink -f /sys/class/net/$SELECTED_INTERFACE/device/driver 2>/dev/null) 2>/dev/null) + + # Create service name for this interface + SERVICE_NAME="disable-nic-offload-$SELECTED_INTERFACE.service" + SERVICE_PATH="/etc/systemd/system/$SERVICE_NAME" + + # Create the service file with driver-specific optimizations + msg_info "Creating systemd service for interface: ${BL}$SELECTED_INTERFACE${YW} (${BL}$DRIVER${YW})" + + # Start with the common part of the service file + cat >"$SERVICE_PATH" </dev/null) 2>/dev/null) - - if systemctl is-active --quiet "$SERVICE_NAME"; then - SVC_STATUS="Active" - else - SVC_STATUS="Inactive" - fi + SERVICE_NAME="disable-nic-offload-$iface.service" + DRIVER=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null) - if systemctl is-enabled --quiet "$SERVICE_NAME"; then - BOOT_SVC_STATUS="Enabled" - else - BOOT_SVC_STATUS="Disabled" - fi + if systemctl is-active --quiet "$SERVICE_NAME"; then + SVC_STATUS="Active" + else + SVC_STATUS="Inactive" + fi - SUMMARY_MSG+="- $iface ($DRIVER): $SVC_STATUS, Boot: $BOOT_SVC_STATUS\n" + if systemctl is-enabled --quiet "$SERVICE_NAME"; then + BOOT_SVC_STATUS="Enabled" + else + BOOT_SVC_STATUS="Disabled" + fi + + SUMMARY_MSG+="- $iface ($DRIVER): $SVC_STATUS, Boot: $BOOT_SVC_STATUS\n" done # Show summary results @@ -236,8 +247,8 @@ msg_ok "Intel e1000e/e1000 optimization complete for ${#INTERFACE_ARRAY[@]} inte echo "" msg_info "Verification commands:" for iface in "${INTERFACE_ARRAY[@]}"; do - echo -e "${TAB}${BL}ethtool -k $iface${CL} ${YW}# Check offloading status${CL}" - echo -e "${TAB}${BL}systemctl status disable-nic-offload-$iface.service${CL} ${YW}# Check service status${CL}" + echo -e "${TAB}${BL}ethtool -k $iface${CL} ${YW}# Check offloading status${CL}" + echo -e "${TAB}${BL}systemctl status disable-nic-offload-$iface.service${CL} ${YW}# Check service status${CL}" done exit 0 diff --git a/tools/pve/pbs3-upgrade.sh b/tools/pve/pbs3-upgrade.sh index 43bcd7917..8c539ff84 100644 --- a/tools/pve/pbs3-upgrade.sh +++ b/tools/pve/pbs3-upgrade.sh @@ -44,6 +44,10 @@ msg_error() { echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } +# Telemetry +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 "pbs3-upgrade" "tool" + start_routines() { header_info CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 2 BACKUP" --menu "\nMake a backup of /etc/proxmox-backup to ensure that in the worst case, any relevant configuration can be recovered?" 14 58 2 \ diff --git a/tools/pve/pbs4-upgrade.sh b/tools/pve/pbs4-upgrade.sh index 53a5d1408..6689d48af 100644 --- a/tools/pve/pbs4-upgrade.sh +++ b/tools/pve/pbs4-upgrade.sh @@ -32,6 +32,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; } msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } +# Telemetry +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 "pbs4-upgrade" "tool" + start_routines() { header_info CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 3 BACKUP" --menu \ diff --git a/tools/pve/pbs_microcode.sh b/tools/pve/pbs_microcode.sh index 970c9040d..6850f2078 100644 --- a/tools/pve/pbs_microcode.sh +++ b/tools/pve/pbs_microcode.sh @@ -28,6 +28,10 @@ CM="${GN}✓${CL}" CROSS="${RD}✗${CL}" msg_info() { echo -ne " ${HOLD} ${YW}$1..."; } + +# Telemetry +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 "pbs-microcode" "tool" msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } diff --git a/tools/pve/post-pbs-install.sh b/tools/pve/post-pbs-install.sh index 46df8b9cd..09cfc2ef8 100644 --- a/tools/pve/post-pbs-install.sh +++ b/tools/pve/post-pbs-install.sh @@ -32,6 +32,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; } msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } +# Telemetry +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 "post-pbs-install" "tool" + # ---- helpers ---- get_pbs_codename() { awk -F'=' '/^VERSION_CODENAME=/{print $2}' /etc/os-release diff --git a/tools/pve/post-pmg-install.sh b/tools/pve/post-pmg-install.sh index dbf652c02..60159afe2 100644 --- a/tools/pve/post-pmg-install.sh +++ b/tools/pve/post-pmg-install.sh @@ -43,6 +43,10 @@ msg_error() { echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } +# Telemetry +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 "post-pmg-install" "tool" + if ! grep -q "Proxmox Mail Gateway" /etc/issue 2>/dev/null; then msg_error "This script is only intended for Proxmox Mail Gateway" exit 1 diff --git a/tools/pve/post-pve-install.sh b/tools/pve/post-pve-install.sh index 4f3b81bf0..9926f8636 100644 --- a/tools/pve/post-pve-install.sh +++ b/tools/pve/post-pve-install.sh @@ -44,6 +44,10 @@ msg_error() { echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } +# Telemetry +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 "post-pve-install" "tool" + get_pve_version() { local pve_ver pve_ver="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" diff --git a/tools/pve/pve-privilege-converter.sh b/tools/pve/pve-privilege-converter.sh index d106c8b57..4f470e6fb 100644 --- a/tools/pve/pve-privilege-converter.sh +++ b/tools/pve/pve-privilege-converter.sh @@ -11,7 +11,9 @@ if ! command -v curl >/dev/null 2>&1; then apt-get install -y curl >/dev/null 2>&1 fi source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true load_functions +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve-privilege-converter" "tool" set -euo pipefail shopt -s inherit_errexit nullglob diff --git a/tools/pve/pve8-upgrade.sh b/tools/pve/pve8-upgrade.sh index 1945ef422..3529c8fe1 100644 --- a/tools/pve/pve8-upgrade.sh +++ b/tools/pve/pve8-upgrade.sh @@ -44,6 +44,10 @@ msg_error() { echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } +# Telemetry +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 "pve8-upgrade" "tool" + start_routines() { header_info diff --git a/tools/pve/scaling-governor.sh b/tools/pve/scaling-governor.sh index 879a8a061..d22656594 100644 --- a/tools/pve/scaling-governor.sh +++ b/tools/pve/scaling-governor.sh @@ -5,6 +5,11 @@ # License: MIT # https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE set -e + +# Telemetry +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 "scaling-governor" "tool" + header_info() { clear cat </dev/null || true +declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-apps" "tool" # ============================================================================= # CONFIGURATION VARIABLES @@ -98,14 +100,14 @@ EOF # Handle command line arguments case "${1:-}" in - --help|-h) - print_usage - exit 0 - ;; - --export-config) - export_config_json - exit 0 - ;; +--help | -h) + print_usage + exit 0 + ;; +--export-config) + export_config_json + exit 0 + ;; esac # ============================================================================= @@ -202,40 +204,40 @@ msg_ok "Loaded ${#menu_items[@]} containers" # Determine container selection based on var_container if [[ -n "$var_container" ]]; then case "$var_container" in - all) - # Select all containers with matching tags - CHOICE="" - for ((i=0; i<${#menu_items[@]}; i+=3)); do - CHOICE="$CHOICE ${menu_items[$i]}" - done - CHOICE=$(echo "$CHOICE" | xargs) - ;; - all_running) - # Select only running containers with matching tags - CHOICE="" - for ((i=0; i<${#menu_items[@]}; i+=3)); do - cid="${menu_items[$i]}" - if pct status "$cid" 2>/dev/null | grep -q "running"; then - CHOICE="$CHOICE $cid" - fi - done - CHOICE=$(echo "$CHOICE" | xargs) - ;; - all_stopped) - # Select only stopped containers with matching tags - CHOICE="" - for ((i=0; i<${#menu_items[@]}; i+=3)); do - cid="${menu_items[$i]}" - if pct status "$cid" 2>/dev/null | grep -q "stopped"; then - CHOICE="$CHOICE $cid" - fi - done - CHOICE=$(echo "$CHOICE" | xargs) - ;; - *) - # Assume comma-separated list of container IDs - CHOICE=$(echo "$var_container" | tr ',' ' ') - ;; + all) + # Select all containers with matching tags + CHOICE="" + for ((i = 0; i < ${#menu_items[@]}; i += 3)); do + CHOICE="$CHOICE ${menu_items[$i]}" + done + CHOICE=$(echo "$CHOICE" | xargs) + ;; + all_running) + # Select only running containers with matching tags + CHOICE="" + for ((i = 0; i < ${#menu_items[@]}; i += 3)); do + cid="${menu_items[$i]}" + if pct status "$cid" 2>/dev/null | grep -q "running"; then + CHOICE="$CHOICE $cid" + fi + done + CHOICE=$(echo "$CHOICE" | xargs) + ;; + all_stopped) + # Select only stopped containers with matching tags + CHOICE="" + for ((i = 0; i < ${#menu_items[@]}; i += 3)); do + cid="${menu_items[$i]}" + if pct status "$cid" 2>/dev/null | grep -q "stopped"; then + CHOICE="$CHOICE $cid" + fi + done + CHOICE=$(echo "$CHOICE" | xargs) + ;; + *) + # Assume comma-separated list of container IDs + CHOICE=$(echo "$var_container" | tr ',' ' ') + ;; esac if [[ -z "$CHOICE" ]]; then diff --git a/tools/pve/update-lxcs.sh b/tools/pve/update-lxcs.sh index ab998fef2..a737caf80 100644 --- a/tools/pve/update-lxcs.sh +++ b/tools/pve/update-lxcs.sh @@ -24,6 +24,11 @@ RD=$(echo "\033[01;31m") CM='\xE2\x9C\x94\033' GN=$(echo "\033[1;92m") CL=$(echo "\033[m") + +# Telemetry +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 "update-lxcs" "tool" + header_info echo "Loading..." whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58 diff --git a/tools/pve/update-repo.sh b/tools/pve/update-repo.sh index f431959c1..6d425aac7 100644 --- a/tools/pve/update-repo.sh +++ b/tools/pve/update-repo.sh @@ -23,6 +23,10 @@ RD=$(echo "\033[01;31m") GN=$(echo "\033[1;92m") CL=$(echo "\033[m") +# Telemetry +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 "update-repo" "tool" + header_info echo "Loading..." NODE=$(hostname)