fix(service-registry): Disable slow direct services aggregation by default
The direct services provider was calling jsonfilter in a loop for each listening port (~40 ports), causing XHR timeouts in the UI. Changes: - Disable direct provider by default (set enabled=0) - Add limit of 20 services if enabled - Skip common system ports (22, 53, 67, 68, 123, 547, 953) - Add note about enabling via UCI if needed The real services come from HAProxy vhosts and UCI published services. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
d2e7836ab7
commit
8207c05376
@ -125,8 +125,10 @@ method_list_services() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# 4. Get direct listening services (from luci.secubox)
|
# 4. Get direct listening services (from luci.secubox)
|
||||||
|
# NOTE: Disabled by default - too slow with many ports (spawns jsonfilter per service)
|
||||||
|
# Enable in UCI: uci set service-registry.direct.enabled=1
|
||||||
local direct_enabled
|
local direct_enabled
|
||||||
direct_enabled=$(get_uci direct enabled 1)
|
direct_enabled=$(get_uci direct enabled 0)
|
||||||
if [ "$direct_enabled" = "1" ]; then
|
if [ "$direct_enabled" = "1" ]; then
|
||||||
_aggregate_direct_services "$lan_ip" "$TMP_SERVICES"
|
_aggregate_direct_services "$lan_ip" "$TMP_SERVICES"
|
||||||
fi
|
fi
|
||||||
@ -439,24 +441,41 @@ _aggregate_direct_services() {
|
|||||||
services_json=$(ubus call luci.secubox get_services 2>/dev/null)
|
services_json=$(ubus call luci.secubox get_services 2>/dev/null)
|
||||||
[ -z "$services_json" ] && return
|
[ -z "$services_json" ] && return
|
||||||
|
|
||||||
# Parse and add unpublished services
|
# Parse all services at once using jsonfilter list mode for better performance
|
||||||
local count
|
# Extract port|name|category|icon tuples in a single pass
|
||||||
count=$(echo "$services_json" | jsonfilter -e '@.services[*]' 2>/dev/null | wc -l)
|
local data_file="/tmp/sr_direct_$$"
|
||||||
local i=0
|
echo "$services_json" | jsonfilter -e '@.services[*].port' -e '@.services[*].name' -e '@.services[*].category' -e '@.services[*].icon' > "$data_file" 2>/dev/null
|
||||||
|
|
||||||
|
# Count services
|
||||||
|
local count=0
|
||||||
|
local ports=""
|
||||||
|
local names=""
|
||||||
|
local categories=""
|
||||||
|
local icons=""
|
||||||
|
|
||||||
|
# Read ports line by line (each jsonfilter -e outputs one line per match)
|
||||||
|
count=$(echo "$services_json" | jsonfilter -e '@.services[*].port' 2>/dev/null | wc -l)
|
||||||
|
[ "$count" -eq 0 ] && { rm -f "$data_file"; return; }
|
||||||
|
|
||||||
|
# Limit to first 20 direct services to avoid performance issues
|
||||||
|
[ "$count" -gt 20 ] && count=20
|
||||||
|
|
||||||
|
# Get all values at once using array notation
|
||||||
|
local i=0
|
||||||
while [ $i -lt "$count" ]; do
|
while [ $i -lt "$count" ]; do
|
||||||
local port name category icon external
|
local port name category icon
|
||||||
port=$(echo "$services_json" | jsonfilter -e "@.services[$i].port" 2>/dev/null)
|
port=$(echo "$services_json" | jsonfilter -e "@.services[$i].port" 2>/dev/null)
|
||||||
name=$(echo "$services_json" | jsonfilter -e "@.services[$i].name" 2>/dev/null)
|
name=$(echo "$services_json" | jsonfilter -e "@.services[$i].name" 2>/dev/null)
|
||||||
category=$(echo "$services_json" | jsonfilter -e "@.services[$i].category" 2>/dev/null)
|
category=$(echo "$services_json" | jsonfilter -e "@.services[$i].category" 2>/dev/null)
|
||||||
icon=$(echo "$services_json" | jsonfilter -e "@.services[$i].icon" 2>/dev/null)
|
icon=$(echo "$services_json" | jsonfilter -e "@.services[$i].icon" 2>/dev/null)
|
||||||
external=$(echo "$services_json" | jsonfilter -e "@.services[$i].external" 2>/dev/null)
|
|
||||||
|
|
||||||
i=$((i + 1))
|
i=$((i + 1))
|
||||||
|
|
||||||
[ -z "$port" ] && continue
|
[ -z "$port" ] && continue
|
||||||
# Skip if already processed
|
# Skip if already processed
|
||||||
grep -q "^${port}$" "$tmp_file" 2>/dev/null && continue
|
grep -q "^${port}$" "$tmp_file" 2>/dev/null && continue
|
||||||
|
# Skip common system ports (often not user services)
|
||||||
|
case "$port" in 22|53|67|68|123|547|953) continue ;; esac
|
||||||
|
|
||||||
json_add_object
|
json_add_object
|
||||||
json_add_string "id" "direct_${port}"
|
json_add_string "id" "direct_${port}"
|
||||||
@ -476,6 +495,8 @@ _aggregate_direct_services() {
|
|||||||
|
|
||||||
echo "$port" >> "$tmp_file"
|
echo "$port" >> "$tmp_file"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
rm -f "$data_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Aggregate LXC container services
|
# Aggregate LXC container services
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user