mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-10 07:44:50 +01:00
66 lines
1.3 KiB
Bash
66 lines
1.3 KiB
Bash
#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
|
|
cfg="mapcontroller"
|
|
config_load "$cfg"
|
|
|
|
used_ids=""
|
|
|
|
collect_used_ids() {
|
|
local section="$1"
|
|
local id
|
|
|
|
id=$(uci -q get ${cfg}.${section}.id)
|
|
if [ -n "$id" ] && printf "%s" "$id" | grep -qE '^[0-9]+$'; then
|
|
used_ids="$used_ids $id"
|
|
fi
|
|
}
|
|
|
|
# Find first available ID from 0 to INT32_MAX
|
|
find_first_available_id() {
|
|
local max_int=2147483647
|
|
local expected=0
|
|
local id
|
|
|
|
# Convert list to sorted unique list
|
|
sorted_ids=$(printf "%s\n" $used_ids | sort -n | uniq)
|
|
|
|
for id in $sorted_ids; do
|
|
if [ "$id" -eq "$expected" ]; then
|
|
expected=$((expected + 1))
|
|
elif [ "$id" -gt "$expected" ]; then
|
|
# Found a gap -> return the gap
|
|
echo "$expected"
|
|
return
|
|
fi
|
|
done
|
|
|
|
# If no gaps, next available is `expected`
|
|
if [ "$expected" -le "$max_int" ]; then
|
|
echo "$expected"
|
|
else
|
|
echo -1
|
|
fi
|
|
}
|
|
|
|
# Assign ID if missing
|
|
add_qos_rule_id() {
|
|
local section="$1"
|
|
local id
|
|
|
|
id=$(uci -q get ${cfg}.${section}.id)
|
|
if [ -z "$id" ]; then
|
|
new_id=$(find_first_available_id)
|
|
[ "$new_id" -ge 0 ] || return # No available ID
|
|
uci -q set ${cfg}.${section}.id="$new_id"
|
|
|
|
used_ids="$used_ids $new_id"
|
|
fi
|
|
}
|
|
|
|
# Step 1: Collect all existing IDs
|
|
config_foreach collect_used_ids qos_rule
|
|
|
|
# Step 2: Assign IDs to rules missing them
|
|
config_foreach add_qos_rule_id qos_rule
|