mirror of
https://github.com/anten-ka/gotelegram_pro.git
synced 2026-05-19 13:26:02 +00:00
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:
@@ -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"
|
||||||
|
|||||||
74
install.sh
74
install.sh
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
# ── Пути ──────────────────────────────────────────────────────────────────────
|
# ── Пути ──────────────────────────────────────────────────────────────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user