From a3e4a0f6e9a03dea52b950c9625fb73acaf6b62a Mon Sep 17 00:00:00 2001 From: Amin Ben Romdhane Date: Mon, 1 Dec 2025 11:22:57 +0100 Subject: [PATCH] map-controller: uci-defaults: Assign unique ID to qos_rule sections --- .../uci-defaults/99-mapcntlr-add-qos-rule-id | 66 +++++++++++++++++++ .../99-mapcntlr-uci-rename-singletons | 2 - 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 map-controller/files/etc/uci-defaults/99-mapcntlr-add-qos-rule-id diff --git a/map-controller/files/etc/uci-defaults/99-mapcntlr-add-qos-rule-id b/map-controller/files/etc/uci-defaults/99-mapcntlr-add-qos-rule-id new file mode 100644 index 000000000..47528a52e --- /dev/null +++ b/map-controller/files/etc/uci-defaults/99-mapcntlr-add-qos-rule-id @@ -0,0 +1,66 @@ +#!/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 diff --git a/map-controller/files/etc/uci-defaults/99-mapcntlr-uci-rename-singletons b/map-controller/files/etc/uci-defaults/99-mapcntlr-uci-rename-singletons index 56c9e46e9..67b466b65 100644 --- a/map-controller/files/etc/uci-defaults/99-mapcntlr-uci-rename-singletons +++ b/map-controller/files/etc/uci-defaults/99-mapcntlr-uci-rename-singletons @@ -14,5 +14,3 @@ for sec in $sections; do uci rename $cfg.$s=$sec done - -uci commit $cfg