fix(v2.4.5): wait for apt lock + versioned python3.X-venv fallback

- bot_install: wait up to 300s for dpkg/apt lock (unattended-upgrades)
- use apt-get -o DPkg::Lock::Timeout=120 as extra safety
- detect python3 minor version and include python3.X-venv in package list
- stop silencing apt errors with 2>/dev/null — surface them to user
- python3-full is optional; fall back to core packages if unavailable
- venv fallback path also installs versioned package and retries
- templates_catalog.json: skip cp when source==dest (symlink install)
This commit is contained in:
anten-ka
2026-04-10 15:59:46 +03:00
parent 3919f201f5
commit 3403975636
3 changed files with 65 additions and 13 deletions

View File

@@ -100,7 +100,7 @@ logger = logging.getLogger(__name__)
# CONFIGURATION # CONFIGURATION
# ============================================================================ # ============================================================================
GOTELEGRAM_VERSION = "2.4.4" GOTELEGRAM_VERSION = "2.4.5"
GOTELEGRAM_CONFIG = "/opt/gotelegram/config.json" GOTELEGRAM_CONFIG = "/opt/gotelegram/config.json"
TELEMT_CONFIG = "/etc/telemt/config.toml" TELEMT_CONFIG = "/etc/telemt/config.toml"
TELEMT_SERVICE = "telemt" TELEMT_SERVICE = "telemt"

View File

@@ -762,10 +762,45 @@ bot_install() {
if [ "$need_py" = "1" ]; then if [ "$need_py" = "1" ]; then
log_info "$(t bot_install_python)" log_info "$(t bot_install_python)"
if command -v apt-get &>/dev/null; then if command -v apt-get &>/dev/null; then
apt-get update -qq # Wait for dpkg lock (unattended-upgrades often holds it on fresh VPS)
# python3-full pulls venv, pip, distutils — safer than piece-by-piece local lock_waited=0
apt-get install -y -qq python3 python3-venv python3-pip python3-full 2>/dev/null || \ while fuser /var/lib/dpkg/lock-frontend &>/dev/null \
apt-get install -y -qq python3 python3-venv python3-pip || 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 elif command -v dnf &>/dev/null; then
dnf install -y -q python3 python3-pip dnf install -y -q python3 python3-pip
elif command -v yum &>/dev/null; then elif command -v yum &>/dev/null; then
@@ -792,20 +827,37 @@ bot_install() {
return 1 return 1
fi fi
# Templates catalog # Templates catalog — skip if source and dest are the same file (symlink install case)
[ -f "$SCRIPT_DIR/templates_catalog.json" ] && \ if [ -f "$SCRIPT_DIR/templates_catalog.json" ]; then
cp "$SCRIPT_DIR/templates_catalog.json" "$GOTELEGRAM_DIR/" 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) # 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 if [ ! -d "$BOT_DIR/venv" ] || [ ! -x "$BOT_DIR/venv/bin/pip" ]; then
log_info "$(t bot_create_venv)" log_info "$(t bot_create_venv)"
rm -rf "$BOT_DIR/venv" rm -rf "$BOT_DIR/venv"
if ! python3 -m venv "$BOT_DIR/venv" 2>/tmp/venv_err; then if ! python3 -m venv "$BOT_DIR/venv" 2>/tmp/venv_err; then
log_error "venv creation failed: $(cat /tmp/venv_err 2>/dev/null)" log_error "venv creation failed:"
# Try to fix by reinstalling python3-venv 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 if command -v apt-get &>/dev/null; then
apt-get install --reinstall -y -qq python3-venv python3-pip python3-full 2>/dev/null || true # Wait for lock again (unattended-upgrades may have restarted)
python3 -m venv "$BOT_DIR/venv" || { log_error "venv still broken, aborting"; return 1; } 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 else
return 1 return 1
fi fi

View File

@@ -3,7 +3,7 @@
# Colors, logging, spinner, system helpers, v1 compat, i18n-aware # Colors, logging, spinner, system helpers, v1 compat, i18n-aware
# ── Version ─────────────────────────────────────────────────────────────────── # ── Version ───────────────────────────────────────────────────────────────────
GOTELEGRAM_VERSION="2.4.4" GOTELEGRAM_VERSION="2.4.5"
GOTELEGRAM_NAME="GoTelegram" GOTELEGRAM_NAME="GoTelegram"
# ── Пути ────────────────────────────────────────────────────────────────────── # ── Пути ──────────────────────────────────────────────────────────────────────