feat(metablogizer): Add duplicate port detection and auto-fix
- Fix get_next_port() to check both uhttpd and metablogizer configs - Add check-ports command to scan for duplicate port assignments - Add fix-ports command to auto-assign new ports to duplicates - Update WIP.md with 2026-03-10 changes Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
da3b8171a5
commit
f8367fc0a3
@ -1,6 +1,6 @@
|
|||||||
# Work In Progress (Claude)
|
# Work In Progress (Claude)
|
||||||
|
|
||||||
_Last updated: 2026-03-09 (HAProxy Routes Health Check)_
|
_Last updated: 2026-03-10 (Metablogizer Port Conflict Prevention)_
|
||||||
|
|
||||||
> **Architecture Reference**: SecuBox Fanzine v3 — Les 4 Couches
|
> **Architecture Reference**: SecuBox Fanzine v3 — Les 4 Couches
|
||||||
|
|
||||||
@ -8,6 +8,28 @@ _Last updated: 2026-03-09 (HAProxy Routes Health Check)_
|
|||||||
|
|
||||||
## Recently Completed
|
## Recently Completed
|
||||||
|
|
||||||
|
### 2026-03-10
|
||||||
|
|
||||||
|
- **Metablogizer Port Conflict Prevention**
|
||||||
|
- Fixed duplicate port detection in `get_next_port()` to check both uhttpd and metablogizer configs
|
||||||
|
- Added `check-ports` command: Scans all sites for duplicate port assignments
|
||||||
|
- Added `fix-ports` command: Auto-assigns new ports to duplicates
|
||||||
|
- Fixed 4 duplicate port conflicts:
|
||||||
|
- santefr.gk2.secubox.in: 8991 → 9010
|
||||||
|
- ganimed.maegia.fr: 9004 → 9011
|
||||||
|
- magic.maegia.tv: 8991 → 9012
|
||||||
|
- cybaxe.gk2.secubox.in: 9000 → 9004 (earlier fix)
|
||||||
|
|
||||||
|
- **magic.maegia.tv Full Publication**
|
||||||
|
- DNS A record added via Gandi API (`dnsctl -z maegia.tv add A magic`)
|
||||||
|
- Fixed ACME webroot path mismatch (`/var/www/acme-challenge`)
|
||||||
|
- SSL certificate issued and installed
|
||||||
|
- Fixed missing `luci_direct` HAProxy backend
|
||||||
|
|
||||||
|
- **HAProxy Container Recovery**
|
||||||
|
- Diagnosed container startup failure (missing backend reference)
|
||||||
|
- Added `luci_direct` backend to generated config
|
||||||
|
|
||||||
### 2026-03-09
|
### 2026-03-09
|
||||||
|
|
||||||
- **HAProxy Routes Health Check Panel**
|
- **HAProxy Routes Health Check Panel**
|
||||||
|
|||||||
@ -55,6 +55,8 @@ Runtime Commands:
|
|||||||
|
|
||||||
Management:
|
Management:
|
||||||
status Show overall status
|
status Show overall status
|
||||||
|
check-ports Check for duplicate port assignments
|
||||||
|
fix-ports Auto-fix duplicate ports
|
||||||
install-nginx Install nginx LXC container (optional)
|
install-nginx Install nginx LXC container (optional)
|
||||||
|
|
||||||
Runtime Selection:
|
Runtime Selection:
|
||||||
@ -117,14 +119,118 @@ detect_runtime() {
|
|||||||
# Site Management
|
# Site Management
|
||||||
# ===========================================
|
# ===========================================
|
||||||
|
|
||||||
|
port_in_use() {
|
||||||
|
local port="$1"
|
||||||
|
# Check uhttpd config
|
||||||
|
uci show uhttpd 2>/dev/null | grep -q "listen_http='0.0.0.0:$port'" && return 0
|
||||||
|
# Check metablogizer config (in case uhttpd hasn't loaded the site yet)
|
||||||
|
uci show ${CONFIG} 2>/dev/null | grep -q "\.port='$port'" && return 0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
get_next_port() {
|
get_next_port() {
|
||||||
local port=$PORT_BASE
|
local port=$PORT_BASE
|
||||||
while uci show uhttpd 2>/dev/null | grep -q "listen_http='0.0.0.0:$port'"; do
|
while port_in_use "$port"; do
|
||||||
port=$((port + 1))
|
port=$((port + 1))
|
||||||
done
|
done
|
||||||
echo $port
|
echo $port
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check for duplicate ports across all sites
|
||||||
|
cmd_check_ports() {
|
||||||
|
echo "Checking for duplicate ports..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local duplicates=0
|
||||||
|
local ports_file=$(mktemp)
|
||||||
|
|
||||||
|
# Collect all ports with their sites
|
||||||
|
uci show ${CONFIG} 2>/dev/null | grep "\.port=" | while read line; do
|
||||||
|
local section=$(echo "$line" | cut -d. -f2)
|
||||||
|
local port=$(echo "$line" | cut -d= -f2 | tr -d "'")
|
||||||
|
local name=$(uci_get "${section}.name" 2>/dev/null)
|
||||||
|
local domain=$(uci_get "${section}.domain" 2>/dev/null)
|
||||||
|
echo "$port|$name|$domain" >> "$ports_file"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Find duplicates
|
||||||
|
local seen_ports=""
|
||||||
|
while IFS='|' read port name domain; do
|
||||||
|
if echo "$seen_ports" | grep -q ":$port:"; then
|
||||||
|
echo "DUPLICATE: Port $port used by $name ($domain)"
|
||||||
|
duplicates=$((duplicates + 1))
|
||||||
|
else
|
||||||
|
seen_ports="$seen_ports:$port:"
|
||||||
|
fi
|
||||||
|
done < "$ports_file"
|
||||||
|
|
||||||
|
rm -f "$ports_file"
|
||||||
|
|
||||||
|
if [ "$duplicates" -eq 0 ]; then
|
||||||
|
echo "No duplicate ports found."
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo "Found $duplicates duplicate port(s)!"
|
||||||
|
echo "Run 'metablogizerctl fix-ports' to auto-assign new ports."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Auto-fix duplicate ports
|
||||||
|
cmd_fix_ports() {
|
||||||
|
echo "Scanning for duplicate ports..."
|
||||||
|
|
||||||
|
local ports_file=$(mktemp)
|
||||||
|
local seen_ports=""
|
||||||
|
local fixed=0
|
||||||
|
|
||||||
|
# Collect all ports
|
||||||
|
uci show ${CONFIG} 2>/dev/null | grep "\.port=" | while read line; do
|
||||||
|
local section=$(echo "$line" | cut -d. -f2)
|
||||||
|
local port=$(echo "$line" | cut -d= -f2 | tr -d "'")
|
||||||
|
echo "$section|$port" >> "$ports_file"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Process and fix duplicates
|
||||||
|
while IFS='|' read section port; do
|
||||||
|
if echo "$seen_ports" | grep -q ":$port:"; then
|
||||||
|
local name=$(uci_get "${section}.name" 2>/dev/null)
|
||||||
|
local new_port=$(get_next_port)
|
||||||
|
echo "Fixing $name: port $port -> $new_port"
|
||||||
|
|
||||||
|
# Update metablogizer config
|
||||||
|
uci set ${CONFIG}.${section}.port="$new_port"
|
||||||
|
|
||||||
|
# Update uhttpd config
|
||||||
|
uci set uhttpd.metablog_${section}.listen_http="0.0.0.0:$new_port"
|
||||||
|
|
||||||
|
# Update HAProxy backend if exists
|
||||||
|
uci set haproxy.metablog_${section}_srv.port="$new_port" 2>/dev/null
|
||||||
|
|
||||||
|
seen_ports="$seen_ports:$new_port:"
|
||||||
|
fixed=$((fixed + 1))
|
||||||
|
else
|
||||||
|
seen_ports="$seen_ports:$port:"
|
||||||
|
fi
|
||||||
|
done < "$ports_file"
|
||||||
|
|
||||||
|
rm -f "$ports_file"
|
||||||
|
|
||||||
|
if [ "$fixed" -gt 0 ]; then
|
||||||
|
uci commit ${CONFIG}
|
||||||
|
uci commit uhttpd
|
||||||
|
uci commit haproxy 2>/dev/null
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Fixed $fixed duplicate port(s)."
|
||||||
|
echo "Restarting services..."
|
||||||
|
/etc/init.d/uhttpd restart
|
||||||
|
haproxyctl generate 2>/dev/null && haproxyctl reload 2>/dev/null
|
||||||
|
else
|
||||||
|
echo "No duplicate ports found."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Convert site name to UCI section name (hyphens -> underscores)
|
# Convert site name to UCI section name (hyphens -> underscores)
|
||||||
get_section() {
|
get_section() {
|
||||||
echo "site_$(echo "$1" | tr '-' '_')"
|
echo "site_$(echo "$1" | tr '-' '_')"
|
||||||
@ -1062,6 +1168,8 @@ case "${1:-}" in
|
|||||||
emancipate) shift; cmd_emancipate "$@" ;;
|
emancipate) shift; cmd_emancipate "$@" ;;
|
||||||
runtime) shift; cmd_runtime "$@" ;;
|
runtime) shift; cmd_runtime "$@" ;;
|
||||||
status) shift; cmd_status "$@" ;;
|
status) shift; cmd_status "$@" ;;
|
||||||
|
check-ports) shift; cmd_check_ports "$@" ;;
|
||||||
|
fix-ports) shift; cmd_fix_ports "$@" ;;
|
||||||
install-nginx) shift; cmd_install_nginx "$@" ;;
|
install-nginx) shift; cmd_install_nginx "$@" ;;
|
||||||
gitea)
|
gitea)
|
||||||
shift
|
shift
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user