diff --git a/tools/addon/adguardhome-sync.sh b/tools/addon/adguardhome-sync.sh index fdc037d0a..417e84ac8 100644 --- a/tools/addon/adguardhome-sync.sh +++ b/tools/addon/adguardhome-sync.sh @@ -95,7 +95,7 @@ function update() { BACKUP_DIR="/opt/adguardhome-sync_backup" create_backup "$CONFIG_PATH" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_amd64.tar.gz" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_$(arch_resolve).tar.gz" restore_backup @@ -115,7 +115,7 @@ function update() { # INSTALL # ============================================================================== function install() { - fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_amd64.tar.gz" + fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_$(arch_resolve).tar.gz" # Gather configuration from user echo "" diff --git a/tools/addon/coder-code-server.sh b/tools/addon/coder-code-server.sh index 19e5b5d7c..272b37af7 100644 --- a/tools/addon/coder-code-server.sh +++ b/tools/addon/coder-code-server.sh @@ -52,7 +52,7 @@ function uninstall() { function update() { if check_for_gh_release "coder-code-server" "coder/code-server"; then msg_info "Updating ${APP}" - fetch_and_deploy_gh_release "coder-code-server" "coder/code-server" "binary" "latest" "/opt/coder-code-server" "code-server_*_amd64.deb" + fetch_and_deploy_gh_release "coder-code-server" "coder/code-server" "binary" "latest" "/opt/coder-code-server" "code-server_*_$(arch_resolve).deb" systemctl restart code-server@"$USER" msg_ok "Updated successfully!" exit @@ -77,7 +77,7 @@ function install() { preexisting_config=true fi - fetch_and_deploy_gh_release "coder-code-server" "coder/code-server" "binary" "latest" "/opt/coder-code-server" "code-server_*_amd64.deb" + fetch_and_deploy_gh_release "coder-code-server" "coder/code-server" "binary" "latest" "/opt/coder-code-server" "code-server_*_$(arch_resolve).deb" mkdir -p "${HOME}/.config/code-server/" if [ "$preexisting_config" = false ]; then diff --git a/tools/addon/filebrowser-quantum.sh b/tools/addon/filebrowser-quantum.sh index 637606de9..9315f2f2d 100644 --- a/tools/addon/filebrowser-quantum.sh +++ b/tools/addon/filebrowser-quantum.sh @@ -101,7 +101,7 @@ if [[ -f "$INSTALL_PATH" ]]; then rc-update del filebrowser &>/dev/null || true rm -f "$SERVICE_PATH" fi - rm -f "$INSTALL_PATH" "$CONFIG_PATH" + rm -f "$INSTALL_PATH" "$CONFIG_PATH" "$HOME/.filebrowser-quantum" msg_ok "${APP} has been uninstalled." exit 0 fi @@ -109,13 +109,13 @@ if [[ -f "$INSTALL_PATH" ]]; then 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 $STD $PKG_MANAGER curl; fi - TMP_BIN=$(mktemp) - 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}" + if check_for_gh_release "filebrowser-quantum" "gtsteffaniak/filebrowser"; then + msg_info "Updating ${APP}" + if ! command -v curl &>/dev/null; then $STD $PKG_MANAGER curl; fi + fetch_and_deploy_gh_release "filebrowser-quantum" "gtsteffaniak/filebrowser" "singlefile" "latest" "/usr/local/bin" "linux-$(arch_resolve)-filebrowser" + mv -f /usr/local/bin/filebrowser-quantum "$INSTALL_PATH" + msg_ok "Updated ${APP}" + fi exit 0 else msg_warn "Update skipped. Exiting." @@ -139,10 +139,8 @@ msg_info "Installing ${APP} on ${OS}" $STD $PKG_MANAGER \ curl \ ffmpeg -TMP_BIN=$(mktemp) -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 +fetch_and_deploy_gh_release "filebrowser-quantum" "gtsteffaniak/filebrowser" "singlefile" "latest" "/usr/local/bin" "linux-$(arch_resolve)-filebrowser" +mv -f /usr/local/bin/filebrowser-quantum "$INSTALL_PATH" msg_ok "Installed ${APP}" msg_info "Preparing configuration directory" diff --git a/tools/addon/filebrowser.sh b/tools/addon/filebrowser.sh index 2c3dc96bd..cdf986301 100644 --- a/tools/addon/filebrowser.sh +++ b/tools/addon/filebrowser.sh @@ -70,18 +70,20 @@ if [ -f "$INSTALL_PATH" ]; then rc-update del filebrowser &>/dev/null || true rm -f "$SERVICE_PATH" fi - rm -f "$INSTALL_PATH" "$DB_PATH" + rm -f "$INSTALL_PATH" "$DB_PATH" "$HOME/.filebrowser" 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 $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}" + if check_for_gh_release "filebrowser" "filebrowser/filebrowser"; then + msg_info "Updating ${APP}" + fetch_and_deploy_gh_release "filebrowser" "filebrowser/filebrowser" "prebuild" "latest" "/opt/filebrowser-dist" "linux-$(arch_resolve)-filebrowser.tar.gz" + install -m 755 /opt/filebrowser-dist/filebrowser "$INSTALL_PATH" + rm -rf /opt/filebrowser-dist + msg_ok "Updated ${APP}" + fi exit 0 else msg_warn "Update skipped. Exiting." @@ -97,11 +99,11 @@ 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}" $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" + fetch_and_deploy_gh_release "filebrowser" "filebrowser/filebrowser" "prebuild" "latest" "/opt/filebrowser-dist" "linux-$(arch_resolve)-filebrowser.tar.gz" + install -m 755 /opt/filebrowser-dist/filebrowser "$INSTALL_PATH" + rm -rf /opt/filebrowser-dist msg_ok "Installed ${APP}" msg_info "Creating FileBrowser directory" diff --git a/tools/addon/netdata.sh b/tools/addon/netdata.sh index 3570c2301..63d435ee6 100644 --- a/tools/addon/netdata.sh +++ b/tools/addon/netdata.sh @@ -5,6 +5,22 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.netdata.cloud/ | Github: https://github.com/netdata/netdata +APP="Netdata" +APP_TYPE="addon" + +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 "netdata" "addon" + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + function header_info { clear cat <<"EOF" @@ -17,63 +33,6 @@ function header_info { EOF } -YW=$(echo "\033[33m") -BL=$(echo "\033[36m") -RD=$(echo "\033[01;31m") -GN=$(echo "\033[1;92m") -CL=$(echo "\033[m") -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" "addon" - -set -e -header_info -echo "Loading..." -function msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." -} - -function msg_ok() { - local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" -} - -function msg_error() { echo -e "${RD}✗ $1${CL}"; } - -# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. -# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0–9.x -pve_check() { - local PVE_VER - PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" - - # Check for Proxmox VE 8.x: allow 8.0–8.9 - if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then - local MINOR="${BASH_REMATCH[1]}" - if ((MINOR < 0 || MINOR > 9)); then - msg_error "This version of Proxmox VE is not supported." - msg_error "Supported: Proxmox VE version 8.0 – 8.9" - exit 105 - fi - return 0 - fi - - # Check for Proxmox VE 9.x: allow 9.0–9.x - if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then - return 0 - fi - - # All other unsupported versions - msg_error "This version of Proxmox VE is not supported." - msg_error "Supported versions: Proxmox VE 8.0 – 8.9 or 9.0–9.x" - exit 105 -} - detect_codename() { source /etc/os-release if [[ "$ID" != "debian" ]]; then @@ -99,7 +58,7 @@ get_latest_repo_pkg() { install() { header_info while true; do - read -p "Are you sure you want to install NetData on Proxmox VE host. Proceed(y/n)? " yn + read -r -p "Are you sure you want to install ${APP} on Proxmox VE host. Proceed(y/n)? " yn case $yn in [Yy]*) break ;; [Nn]*) exit ;; @@ -107,56 +66,52 @@ install() { esac done - read -r -p "Verbose mode? " prompt - [[ ${prompt,,} =~ ^(y|yes)$ ]] && STD="" || STD="silent" - CODENAME=$(detect_codename) REPO_URL="https://repo.netdata.cloud/repos/repoconfig/debian/${CODENAME}/" msg_info "Setting up repository" - $STD apt-get install -y debian-keyring + $STD apt install -y debian-keyring PKG=$(get_latest_repo_pkg "$REPO_URL") if [[ -z "$PKG" ]]; then msg_error "Could not find netdata-repo package for Debian $CODENAME" exit 237 fi - curl -fsSL "${REPO_URL}${PKG}" -o "$PKG" - $STD dpkg -i "$PKG" - rm -f "$PKG" + TMP_DEB=$(mktemp --suffix=.deb) + curl -fsSL "${REPO_URL}${PKG}" -o "$TMP_DEB" + $STD dpkg -i "$TMP_DEB" + rm -f "$TMP_DEB" msg_ok "Set up repository" - msg_info "Installing Netdata" - $STD apt-get update - $STD apt-get install -y netdata - msg_ok "Installed Netdata" + msg_info "Installing ${APP}" + $STD apt update + $STD apt install -y netdata + msg_ok "Installed ${APP}" msg_ok "Completed successfully!\n" - echo -e "\n Netdata should be reachable at${BL} http://$(hostname -I | awk '{print $1}'):19999 ${CL}\n" + echo -e "\n${APP} should be reachable at${BL} http://$(hostname -I | awk '{print $1}'):19999 ${CL}\n" } uninstall() { header_info - read -r -p "Verbose mode? " prompt - [[ ${prompt,,} =~ ^(y|yes)$ ]] && STD="" || STD="silent" - msg_info "Uninstalling Netdata" + msg_info "Uninstalling ${APP}" systemctl stop netdata || true rm -rf /var/log/netdata /var/lib/netdata /var/cache/netdata /etc/netdata/go.d rm -rf /etc/apt/trusted.gpg.d/netdata-archive-keyring.gpg /etc/apt/sources.list.d/netdata.list - $STD apt-get remove --purge -y netdata netdata-repo + $STD apt remove --purge -y netdata netdata-repo systemctl daemon-reload $STD apt autoremove -y $STD userdel netdata || true - msg_ok "Uninstalled Netdata" + msg_ok "Uninstalled ${APP}" msg_ok "Completed successfully!\n" } header_info pve_check -OPTIONS=(Install "Install NetData on Proxmox VE" - Uninstall "Uninstall NetData from Proxmox VE") +OPTIONS=(Install "Install ${APP} on Proxmox VE" + Uninstall "Uninstall ${APP} from Proxmox VE") -CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NetData" \ +CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP}" \ --menu "Select an option:" 10 58 2 "${OPTIONS[@]}" 3>&1 1>&2 2>&3) case $CHOICE in diff --git a/tools/addon/pyenv.sh b/tools/addon/pyenv.sh index 71e37398b..7ab1163ac 100644 --- a/tools/addon/pyenv.sh +++ b/tools/addon/pyenv.sh @@ -5,40 +5,29 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://pyenv.run/ | Github: https://github.com/pyenv/pyenv -set -e -YW=$(echo "\033[33m") -RD=$(echo "\033[01;31m") -BL=$(echo "\033[36m") -GN=$(echo "\033[1;92m") -CL=$(echo "\033[m") -CM="${GN}✓${CL}" -CROSS="${RD}✗${CL}" -BFR="\\r\\033[K" -HOLD="-" -function msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." -} +APP="pyenv" +APP_TYPE="addon" -function msg_ok() { - local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" -} -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/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 "pyenv" "addon" +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + if command -v pveversion >/dev/null 2>&1; then msg_error "Can't Install on Proxmox " - exit + exit 1 fi -msg_info "Installing pyenv" -apt-get install -y \ +msg_info "Installing ${APP}" +$STD apt update +$STD apt install -y \ make \ build-essential \ libjpeg-dev \ @@ -62,18 +51,18 @@ apt-get install -y \ libopenjp2-7 \ libtiff5 \ libturbojpeg0-dev \ - liblzma-dev &>/dev/null + liblzma-dev -git clone https://github.com/pyenv/pyenv.git ~/.pyenv &>/dev/null -set +e +$STD git clone https://github.com/pyenv/pyenv.git ~/.pyenv +set +Eeuo pipefail echo 'export PYENV_ROOT="$HOME/.pyenv"' >>~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >>~/.bashrc echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init --path)"\nfi' >>~/.bashrc -msg_ok "Installed pyenv" +msg_ok "Installed ${APP}" . ~/.bashrc -set -e +set -Eeuo pipefail msg_info "Installing Python 3.11.1" -pyenv install 3.11.1 &>/dev/null +$STD pyenv install 3.11.1 pyenv global 3.11.1 msg_ok "Installed Python 3.11.1" read -r -p "Would you like to install Home Assistant Beta? " prompt @@ -95,10 +84,10 @@ EOF cd /srv/homeassistant python3 -m venv . source bin/activate - python3 -m pip install wheel &>/dev/null - pip3 install --upgrade pip &>/dev/null - pip3 install psycopg2-binary &>/dev/null - pip3 install --pre homeassistant &>/dev/null + $STD python3 -m pip install wheel + $STD pip3 install --upgrade pip + $STD pip3 install psycopg2-binary + $STD pip3 install --pre homeassistant systemctl enable homeassistant &>/dev/null msg_ok "Installed Home Assistant Beta" echo -e " Go to $(hostname -I | awk '{print $1}'):8123" @@ -112,9 +101,9 @@ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then cd /srv/esphome python3 -m venv . source bin/activate - python3 -m pip install wheel &>/dev/null - pip3 install --upgrade pip &>/dev/null - pip3 install --pre esphome &>/dev/null + $STD python3 -m pip install wheel + $STD pip3 install --upgrade pip + $STD pip3 install --pre esphome cat </srv/esphome/start.sh #!/usr/bin/env bash @@ -150,18 +139,19 @@ fi read -r -p "Would you like to install Matter-Server (Beta)? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Installing Matter Server" - apt-get install -y \ + $STD apt install -y \ libcairo2-dev \ libjpeg62-turbo-dev \ libgirepository1.0-dev \ libpango1.0-dev \ libgif-dev \ - g++ &>/dev/null - python3 -m pip install wheel - pip3 install --upgrade pip - pip install python-matter-server[server] + g++ + $STD python3 -m pip install wheel + $STD pip3 install --upgrade pip + $STD pip install python-matter-server[server] msg_ok "Installed Matter Server" echo -e "Start server > python -m matter_server.server" fi msg_ok "\nFinished\n" exec $SHELL + diff --git a/tools/addon/webmin.sh b/tools/addon/webmin.sh index df07d6466..f1ef1de11 100644 --- a/tools/addon/webmin.sh +++ b/tools/addon/webmin.sh @@ -5,6 +5,22 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.webmin.com/ | Github: https://github.com/webmin/webmin +APP="Webmin" +APP_TYPE="addon" + +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 "webmin" "addon" + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + function header_info { clear cat <<"EOF" @@ -15,51 +31,27 @@ function header_info { EOF } -set -eEuo pipefail -YW=$(echo "\033[33m") -BL=$(echo "\033[36m") -BGN=$(echo "\033[4;92m") -GN=$(echo "\033[1;92m") -DGN=$(echo "\033[32m") -CL=$(echo "\033[m") -CM="${GN}✓${CL}" -BFR="\\r\\033[K" -HOLD="-" - -msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." -} - -msg_ok() { - local msg="$1" - 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 +whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} Installer" --yesno "This Will Install ${APP} on this LXC Container. Proceed?" 10 58 msg_info "Installing Prerequisites" -apt update &>/dev/null -apt-get -y install libnet-ssleay-perl libauthen-pam-perl libio-pty-perl unzip shared-mime-info curl &>/dev/null +$STD apt update +$STD apt install -y \ + libnet-ssleay-perl \ + libauthen-pam-perl \ + libio-pty-perl \ + unzip \ + shared-mime-info \ + curl msg_ok "Installed Prerequisites" -LATEST=$(curl -fsSL https://api.github.com/repos/webmin/webmin/releases/latest | grep '"tag_name":' | cut -d'"' -f4) - -msg_info "Downloading Webmin" -curl -fsSL "https://github.com/webmin/webmin/releases/download/$LATEST/webmin_${LATEST}_all.deb" -o $(basename "https://github.com/webmin/webmin/releases/download/$LATEST/webmin_${LATEST}_all.deb") -msg_ok "Downloaded Webmin" - -msg_info "Installing Webmin" -dpkg -i webmin_${LATEST}_all.deb &>/dev/null +msg_info "Installing ${APP}" +fetch_and_deploy_gh_release "webmin" "webmin/webmin" "binary" "latest" "/opt/webmin" "webmin_*_all.deb" /usr/share/webmin/changepass.pl /etc/webmin root root &>/dev/null -rm -rf /root/webmin_${LATEST}_all.deb -msg_ok "Installed Webmin" +msg_ok "Installed ${APP}" IP=$(hostname -I | cut -f1 -d ' ') -echo -e "Successfully Installed!! Webmin should be reachable by going to ${BL}https://${IP}:10000${CL}" +echo -e "Successfully Installed!! ${APP} should be reachable by going to ${BL}https://${IP}:10000${CL}" +