Skip to content

Commit 6198204

Browse files
committed
Fix update lock leak, persist traffic on reload, auto-clean old images, re-exec after update (#43, #44, #45, #46)
- #43: Fix flock FD leak in self_update — use trap RETURN to release the lock FD, preventing false "already running" on subsequent calls in the same TUI session. Improved message wording. - #44: Flush traffic counters to disk before hot-reload (SIGHUP) in reload_proxy_config, so stats survive if the reload triggers a container restart. - #45: Auto-remove old mtproxymax-telemt Docker images after engine upgrade, keeping only the current version and latest tag. - #46: Re-exec the updated script after self_update in the TUI so the new version is immediately active without manual restart.
1 parent 8e2682d commit 6198204

1 file changed

Lines changed: 32 additions & 2 deletions

File tree

mtproxymax.sh

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2746,6 +2746,9 @@ restart_proxy_container() {
27462746
reload_proxy_config() {
27472747
generate_telemt_config || { log_error "Config generation failed"; return 1; }
27482748

2749+
# Flush traffic counters to disk before reload (in case SIGHUP triggers a restart)
2750+
flush_traffic_to_disk 2>/dev/null
2751+
27492752
# Signal primary container to reload config (inotify may miss bind-mount changes)
27502753
is_proxy_running && docker kill -s SIGHUP "$CONTAINER_NAME" 2>/dev/null || true
27512754

@@ -3205,9 +3208,12 @@ self_update() {
32053208
local _lfd
32063209
exec {_lfd}>/tmp/.mtproxymax_update.lock
32073210
if ! flock -n "$_lfd" 2>/dev/null; then
3208-
log_warn "Another update is already running."
3211+
log_warn "Another update check is already in progress."
3212+
exec {_lfd}>&- 2>/dev/null
32093213
return 1
32103214
fi
3215+
# Ensure lock FD is released when function returns
3216+
trap "exec ${_lfd}>&- 2>/dev/null" RETURN
32113217
fi
32123218

32133219
local _script_updated=false
@@ -3262,6 +3268,7 @@ self_update() {
32623268
mv "$_tmp" "${INSTALL_DIR}/mtproxymax"
32633269
log_success "Script updated to v${_new_ver:-?}"
32643270
_script_updated=true
3271+
_SCRIPT_NEEDS_REEXEC=true
32653272
rm -f "$_UPDATE_BADGE"
32663273

32673274
# Save new commit SHA as baseline
@@ -3311,6 +3318,21 @@ self_update() {
33113318
load_secrets
33123319
restart_proxy_container
33133320
fi
3321+
# Clean up old engine images (keep only the current version + latest)
3322+
local _old_img
3323+
while IFS= read -r _old_img; do
3324+
[ -z "$_old_img" ] && continue
3325+
[[ "$_old_img" == *":${_expected_ver}" ]] && continue
3326+
[[ "$_old_img" == *":latest" ]] && continue
3327+
docker rmi "$_old_img" 2>/dev/null && log_info "Removed old image: ${_old_img}"
3328+
done <<< "$(docker images --format '{{.Repository}}:{{.Tag}}' 2>/dev/null | grep "^${DOCKER_IMAGE_BASE}:")"
3329+
# Also clean registry-prefixed copies
3330+
while IFS= read -r _old_img; do
3331+
[ -z "$_old_img" ] && continue
3332+
[[ "$_old_img" == *":${_expected_ver}" ]] && continue
3333+
[[ "$_old_img" == *":latest" ]] && continue
3334+
docker rmi "$_old_img" 2>/dev/null || true
3335+
done <<< "$(docker images --format '{{.Repository}}:{{.Tag}}' 2>/dev/null | grep "^${REGISTRY_IMAGE}:")"
33143336
fi
33153337
}
33163338

@@ -7374,7 +7396,15 @@ show_about() {
73747396
local choice
73757397
choice=$(read_choice "Choice" "0")
73767398
case "$choice" in
7377-
1) self_update || true; press_any_key ;;
7399+
1)
7400+
self_update || true
7401+
if [ "${_SCRIPT_NEEDS_REEXEC:-}" = "true" ]; then
7402+
log_info "Restarting with updated script..."
7403+
sleep 1
7404+
exec "${INSTALL_DIR}/mtproxymax" menu
7405+
fi
7406+
press_any_key
7407+
;;
73787408
2) create_backup || true; press_any_key ;;
73797409
3)
73807410
list_backups

0 commit comments

Comments
 (0)