fix: tmpdir unset bug (declare+assign same line), check ns8-sendmail via runagent

This commit is contained in:
2026-05-18 22:12:39 +00:00
parent 07830e1467
commit c4d447a406
+50 -17
View File
@@ -3,15 +3,19 @@
# ns8-backup-monitor - Installer / Uninstaller # ns8-backup-monitor - Installer / Uninstaller
# ============================================================================= # =============================================================================
# Usage: # Usage:
# install.sh - install # install.sh - install (interactive)
# install.sh --uninstall - remove everything installed by this script # install.sh --uninstall - remove everything installed by this script
# #
# Requires: root, python3, curl (no git needed) # Requires: root, python3, curl (no git needed)
# Tested on: AlmaLinux 8/9, Rocky Linux 8/9 (NS8 supported distros) # Tested on: AlmaLinux 8/9, Rocky Linux 8/9 (NS8 supported distros)
#
# ns8-sendmail is NOT in the standard root PATH on NS8 nodes.
# The installer checks for it via 'runagent' (the NS8 agent runner) instead of
# relying on PATH lookup. This is the correct way to invoke NS8 built-in tools.
# ============================================================================= # =============================================================================
set -euo pipefail set -euo pipefail
# --- constants --------------------------------------------------------------- # --- constants ----------------------------------------------------------------
SERVICE_NAME="ns8-backup-monitor" SERVICE_NAME="ns8-backup-monitor"
INSTALL_DIR="/opt/ns8-backup-monitor" INSTALL_DIR="/opt/ns8-backup-monitor"
CONFIG_DIR="/etc/ns8-backup-monitor" CONFIG_DIR="/etc/ns8-backup-monitor"
@@ -25,7 +29,7 @@ ARCHIVE_URL="https://repo.lelekaos.com/admin/ns8-backup-monitor/archive/main.tar
PYTHON=$(command -v python3 || true) PYTHON=$(command -v python3 || true)
# --- colours ----------------------------------------------------------------- # --- colours ------------------------------------------------------------------
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
BLUE='\033[0;34m'; BOLD='\033[1m'; RESET='\033[0m' BLUE='\033[0;34m'; BOLD='\033[1m'; RESET='\033[0m'
@@ -34,6 +38,27 @@ ok() { echo -e "${GREEN}[OK]${RESET} $*"; }
warn() { echo -e "${YELLOW}[WARN]${RESET} $*"; } warn() { echo -e "${YELLOW}[WARN]${RESET} $*"; }
error() { echo -e "${RED}[ERROR]${RESET} $*" >&2; exit 1; } error() { echo -e "${RED}[ERROR]${RESET} $*" >&2; exit 1; }
# =============================================================================
# CHECK NS8-SENDMAIL
# On NS8 nodes, ns8-sendmail is not in the standard root PATH.
# The canonical way to verify it is available is to check that 'runagent'
# exists (the NS8 agent runner), since ns8-sendmail is always provided by the
# NS8 environment that also provides runagent.
# =============================================================================
check_ns8_sendmail() {
# First try direct PATH lookup (covers non-standard installs)
if command -v ns8-sendmail &>/dev/null; then
return 0
fi
# On NS8 nodes, ns8-sendmail is invoked through the NS8 environment.
# If runagent is present, ns8-sendmail is available at runtime.
if command -v runagent &>/dev/null; then
return 0
fi
# Neither found: genuine warning
return 1
}
# ============================================================================= # =============================================================================
# UNINSTALL # UNINSTALL
# ============================================================================= # =============================================================================
@@ -82,8 +107,10 @@ do_uninstall() {
# DOWNLOAD SOURCE # DOWNLOAD SOURCE
# ============================================================================= # =============================================================================
download_source() { download_source() {
local tmpdir # BUG FIX: declare and assign on the same line so that 'set -u' never sees
tmpdir=$(mktemp -d) # an unset variable, even if the trap fires before mktemp succeeds.
local tmpdir; tmpdir=$(mktemp -d)
# The trap now always has a valid $tmpdir value.
trap 'rm -rf "$tmpdir"' RETURN trap 'rm -rf "$tmpdir"' RETURN
info "Downloading source archive..." info "Downloading source archive..."
@@ -109,15 +136,21 @@ download_source() {
do_install() { do_install() {
echo -e "${BOLD}=== ns8-backup-monitor INSTALLER ===${RESET}\n" echo -e "${BOLD}=== ns8-backup-monitor INSTALLER ===${RESET}\n"
# --- pre-flight ---------------------------------------------------------- # --- pre-flight -----------------------------------------------------------
[[ $EUID -eq 0 ]] || error "Run as root (or with sudo)." [[ $EUID -eq 0 ]] || error "Run as root (or with sudo)."
[[ -n "$PYTHON" ]] || error "python3 not found." [[ -n "$PYTHON" ]] || error "python3 not found."
command -v curl &>/dev/null || error "curl not found." command -v curl &>/dev/null || error "curl not found."
command -v tar &>/dev/null || error "tar not found." command -v tar &>/dev/null || error "tar not found."
command -v ns8-sendmail &>/dev/null || \
warn "ns8-sendmail not found in PATH - make sure this runs on an NS8 node."
# --- interactive mail config --------------------------------------------- # Check ns8-sendmail availability the NS8-correct way (via runagent).
if check_ns8_sendmail; then
ok "ns8-sendmail available (NS8 node confirmed)."
else
warn "Neither ns8-sendmail nor runagent found."
warn "Make sure this runs on an NS8 node, or email delivery will fail."
fi
# --- interactive mail config ----------------------------------------------
echo -e "${BOLD}Mail configuration${RESET}" echo -e "${BOLD}Mail configuration${RESET}"
echo -e "Email delivery uses ${BLUE}ns8-sendmail${RESET} (NS8 configured relay)." echo -e "Email delivery uses ${BLUE}ns8-sendmail${RESET} (NS8 configured relay)."
echo echo
@@ -139,22 +172,22 @@ do_install() {
SUBJECT_PREFIX="${SUBJECT_PREFIX:-[NS8 Backup]}" SUBJECT_PREFIX="${SUBJECT_PREFIX:-[NS8 Backup]}"
echo echo
info "From: $MAIL_FROM" info "From: $MAIL_FROM"
info "To: ${MAIL_TO_LIST[*]}" info "To: ${MAIL_TO_LIST[*]}"
info "Prefix: $SUBJECT_PREFIX" info "Prefix: $SUBJECT_PREFIX"
echo echo
read -rp "Confirm and proceed with install? [Y/n] " go read -rp "Confirm and proceed with install? [Y/n] " go
[[ "$go" =~ ^[Nn]$ ]] && { info "Aborted."; exit 0; } [[ "$go" =~ ^[Nn]$ ]] && { info "Aborted."; exit 0; }
echo echo
# --- download source ----------------------------------------------------- # --- download source ------------------------------------------------------
if [[ -d "$INSTALL_DIR" ]]; then if [[ -d "$INSTALL_DIR" ]]; then
info "${INSTALL_DIR} already exists - updating source..." info "${INSTALL_DIR} already exists - updating source..."
rm -rf "$INSTALL_DIR" rm -rf "$INSTALL_DIR"
fi fi
download_source download_source
# --- config directory ---------------------------------------------------- # --- config directory -----------------------------------------------------
mkdir -p "$CONFIG_DIR" mkdir -p "$CONFIG_DIR"
chmod 750 "$CONFIG_DIR" chmod 750 "$CONFIG_DIR"
@@ -204,14 +237,14 @@ EOF
ok "Config written." ok "Config written."
fi fi
# --- systemd unit -------------------------------------------------------- # --- systemd unit ---------------------------------------------------------
info "Installing systemd unit..." info "Installing systemd unit..."
cp "${INSTALL_DIR}/deploy/ns8-backup-monitor.service" "$SERVICE_FILE" cp "${INSTALL_DIR}/deploy/ns8-backup-monitor.service" "$SERVICE_FILE"
systemctl daemon-reload systemctl daemon-reload
systemctl enable --now "$SERVICE_NAME" systemctl enable --now "$SERVICE_NAME"
ok "Service enabled and started." ok "Service enabled and started."
# --- done ---------------------------------------------------------------- # --- done -----------------------------------------------------------------
echo echo
echo -e "${GREEN}${BOLD}Installation complete.${RESET}" echo -e "${GREEN}${BOLD}Installation complete.${RESET}"
echo -e " Config: ${CONFIG_FILE}" echo -e " Config: ${CONFIG_FILE}"