diff --git a/gotelegram-bot/bot.py b/gotelegram-bot/bot.py index 76581e2..d479181 100644 --- a/gotelegram-bot/bot.py +++ b/gotelegram-bot/bot.py @@ -100,7 +100,7 @@ logger = logging.getLogger(__name__) # CONFIGURATION # ============================================================================ -GOTELEGRAM_VERSION = "2.4.4" +GOTELEGRAM_VERSION = "2.4.5" GOTELEGRAM_CONFIG = "/opt/gotelegram/config.json" TELEMT_CONFIG = "/etc/telemt/config.toml" TELEMT_SERVICE = "telemt" diff --git a/install.sh b/install.sh index f9d880b..9bff3e0 100644 --- a/install.sh +++ b/install.sh @@ -762,10 +762,45 @@ bot_install() { if [ "$need_py" = "1" ]; then log_info "$(t bot_install_python)" if command -v apt-get &>/dev/null; then - apt-get update -qq - # python3-full pulls venv, pip, distutils — safer than piece-by-piece - apt-get install -y -qq python3 python3-venv python3-pip python3-full 2>/dev/null || \ - apt-get install -y -qq python3 python3-venv python3-pip + # Wait for dpkg lock (unattended-upgrades often holds it on fresh VPS) + local lock_waited=0 + while fuser /var/lib/dpkg/lock-frontend &>/dev/null \ + || fuser /var/lib/dpkg/lock &>/dev/null \ + || fuser /var/lib/apt/lists/lock &>/dev/null; do + if [ $lock_waited -eq 0 ]; then + log_warning "apt/dpkg locked by another process (likely unattended-upgrades), waiting up to 300s..." + fi + sleep 3 + lock_waited=$((lock_waited + 3)) + if [ $lock_waited -ge 300 ]; then + log_error "apt lock not released after 300s. Kill unattended-upgrades and retry: systemctl stop unattended-upgrades; pkill -9 unattended-upgr" + return 1 + fi + done + [ $lock_waited -gt 0 ] && log_success "apt lock released (waited ${lock_waited}s)" + + # Detect Python version for versioned venv package (Debian 12 / Ubuntu 24.04 need python3.12-venv etc.) + local py_ver="" + if command -v python3 &>/dev/null; then + py_ver=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null) + fi + + # apt's native lock timeout as extra safety + local APT_OPTS="-o DPkg::Lock::Timeout=120" + + apt-get $APT_OPTS update -qq || log_warning "apt update had errors (continuing)" + + # Build package list with versioned venv fallback + local pkg_list="python3 python3-venv python3-pip" + [ -n "$py_ver" ] && pkg_list="$pkg_list python${py_ver}-venv" + # python3-full is optional (not on all distros); try it first, then without + if ! apt-get $APT_OPTS install -y $pkg_list python3-full; then + log_warning "python3-full unavailable, installing core packages only..." + apt-get $APT_OPTS install -y $pkg_list || { + log_error "Failed to install Python packages. Run manually: apt install $pkg_list" + return 1 + } + fi elif command -v dnf &>/dev/null; then dnf install -y -q python3 python3-pip elif command -v yum &>/dev/null; then @@ -792,20 +827,37 @@ bot_install() { return 1 fi - # Templates catalog - [ -f "$SCRIPT_DIR/templates_catalog.json" ] && \ - cp "$SCRIPT_DIR/templates_catalog.json" "$GOTELEGRAM_DIR/" + # Templates catalog — skip if source and dest are the same file (symlink install case) + if [ -f "$SCRIPT_DIR/templates_catalog.json" ]; then + local src_tc="$SCRIPT_DIR/templates_catalog.json" + local dst_tc="$GOTELEGRAM_DIR/templates_catalog.json" + if [ "$(readlink -f "$src_tc" 2>/dev/null)" != "$(readlink -f "$dst_tc" 2>/dev/null)" ]; then + cp "$src_tc" "$dst_tc" + fi + fi # Venv — create, and verify pip exists (python3-venv can silently create broken venv) if [ ! -d "$BOT_DIR/venv" ] || [ ! -x "$BOT_DIR/venv/bin/pip" ]; then log_info "$(t bot_create_venv)" rm -rf "$BOT_DIR/venv" if ! python3 -m venv "$BOT_DIR/venv" 2>/tmp/venv_err; then - log_error "venv creation failed: $(cat /tmp/venv_err 2>/dev/null)" - # Try to fix by reinstalling python3-venv + log_error "venv creation failed:" + cat /tmp/venv_err >&2 2>/dev/null + # Try to fix by installing versioned python3.X-venv package if command -v apt-get &>/dev/null; then - apt-get install --reinstall -y -qq python3-venv python3-pip python3-full 2>/dev/null || true - python3 -m venv "$BOT_DIR/venv" || { log_error "venv still broken, aborting"; return 1; } + # Wait for lock again (unattended-upgrades may have restarted) + local lock_waited=0 + while fuser /var/lib/dpkg/lock-frontend &>/dev/null; do + sleep 3 + lock_waited=$((lock_waited + 3)) + [ $lock_waited -ge 180 ] && break + done + local py_ver + py_ver=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null) + log_info "reinstalling python${py_ver}-venv..." + apt-get -o DPkg::Lock::Timeout=120 install -y python3-venv python3-pip "python${py_ver}-venv" python3-full 2>&1 | tail -n 10 >&2 || true + rm -rf "$BOT_DIR/venv" + python3 -m venv "$BOT_DIR/venv" || { log_error "venv still broken, aborting. Manual fix: apt install python${py_ver}-venv python3-pip"; return 1; } else return 1 fi diff --git a/lib/common.sh b/lib/common.sh index 9abf57c..72398d1 100644 --- a/lib/common.sh +++ b/lib/common.sh @@ -3,7 +3,7 @@ # Colors, logging, spinner, system helpers, v1 compat, i18n-aware # ── Version ─────────────────────────────────────────────────────────────────── -GOTELEGRAM_VERSION="2.4.4" +GOTELEGRAM_VERSION="2.4.5" GOTELEGRAM_NAME="GoTelegram" # ── Пути ──────────────────────────────────────────────────────────────────────