2## @brief Hilfreiche Funktionen zum lesenden und schreibenden Zugriff auf die UCI-basierte Konfiguration. 
    3# Beginn der Doku-Gruppe 
    8    uci_is_false 
"$1" && trap 
"" EXIT && 
return 1
 
   15    # synchron halten mit "uci_to_bool" (lua-Module)
 
   16    if [ 
"$token" = 
"0" ] || [ 
"$token" = 
"no" ] || [ 
"$token" = 
"n" ] \
 
   17            || [ 
"$token" = 
"off" ] || [ 
"$token" = 
"false" ]; then
 
   20        trap 
"" EXIT && 
return 1
 
   25# "uci -q get ..." endet mit einem Fehlercode falls das Objekt nicht existiert
 
   26# Dies erschwert bei strikter Fehlerpruefung (set -e) die Abfrage von uci-Werten. 
   27# Die Funktion "uci_get" liefert bei fehlenden Objekten einen leeren String zurueck
 
   28# oder den gegebenen Standardwert zurueck. 
   29# Der Exitcode signalisiert immer Erfolg. 
   31#   uci_get firewall.zone_free.masq 1 
   32# Der abschließende Standardwert (zweiter Parameter) ist optional. 
   34    trap 
'error_trap uci_get "$*"' EXIT
 
   36    local 
default=
"${2:-}" 
   37    if uci -q get 
"$key"; then
 
   40        [ -n 
"$default" ] && echo 
"$default" 
   47## @brief Füge einen neuen Wert zu einer UCI-Liste hinzu und achte dabei auf Einmaligkeit. 
   48## @param uci_path Der UCI-Pfad des Listenelements. 
   49## @param new_item Der neue Wert, der zur Liste hinzugefügt werden soll. 
   50## @details Die Funktion ist vergleichbar mit "uci add_list". Es werden jedoch keine doppelten Einträge erzeugt.
 
   51##   Somit entfällt die Prüfung auf Vorhandensein des Eintrags. 
   53    trap 
'error_trap uci_add_list "$*"' EXIT
 
   57    # ist der Eintrag bereits vorhanden? 
   59    uci add_list 
"$uci_path=$new_item" 
   64## @brief Liefere alle einzelnen Elemente einer UCI-Liste zurück. 
   65## @param uci_path Der UCI-Pfad eines Elements. 
   66## @returns Die Einträge sind zeilenweise voneinander getrennt. 
   68    trap 
'error_trap uci_get_list "$*"' EXIT
 
   70    # falls es den Schlüssel nicht gibt, liefert "uci show" eine Fehlermeldung und Müll - das wollen wir abfangen
 
   71    [ -z 
"$(uci_get "$uci_path
")" ] && 
return 0
 
   72    # ansonsten: via "uci show" mit speziellem Trenner abfragen und zeilenweise separieren
 
   73    uci -q -
d "_=_=_=_=_" show 
"$uci_path" | cut -f 2- -
d = | sed 
's/_=_=_=_=_/\n/g' | sed 
"s/^'"'\(.*\)'"'"'$/\1/' 
   77## @fn uci_get_list_index() 
   78## @brief Ermittle die ID eines UCI-Listenelements. 
   79## @param uci_path Der UCI-Pfad der Liste. 
   80## @param value Der Inhalt des zu suchenden Elements. 
   81## @returns Die ID des Listenelements (beginnend bei Null) wird zurückgeliefert. 
   82## @details Falls das Element nicht gefunden wird, ist das Ergebnis leer. 
   84    trap 
'error_trap uci_get_list_index "$*"' EXIT
 
   90        [ 
"$current" = 
"$value" ] && echo 
"$index" && 
break 
   96## @fn uci_is_in_list() 
   97## @param uci_path Der UCI-Pfad der Liste. 
   98## @param item Das zu suchende Element. 
   99## @brief Prüfe ob ein Element in einer Liste vorkommt. 
  101    trap 
'error_trap uci_is_in_list "$*"' EXIT
 
  104    [ -n 
"$(uci_get_list_index "$uci_path
" "$value")" ] && 
return 0
 
  105    trap 
"" EXIT && 
return 1
 
  109## @fn uci_delete_list() 
  110## @brief Lösche ein Element einer UCI-Liste 
  111## @param uci_path Der UCI-Pfad der Liste. 
  112## @param value Der Inhalt des zu löschenden Elements. Es findet ein Vergleich auf Identität (kein Muster) statt. 
  113## @details Falls das Element nicht existiert, endet die Funktion stillschweigend ohne Fehlermeldung. 
  115    trap 
'error_trap uci_delete_list "$*"' EXIT
 
  120    [ -n 
"$index" ] && 
uci_delete "${uci_path}=${index}" 
  125## @fn uci_replace_list() 
  126## @brief Replace the items in a list. Wanted items are expected via stdin (one per line). 
  127## @param uci_path The path of the UCI list. 
  128## @details This function is idempotent. Thus it takes care to avoid unnecessary changes (e.g. an 
  129##    existing list being replaced with all of its current members).  This works around UCI's 
  130##    behaviour of not detecting (and discarding) no-change-operations.  The list is removed if no 
  131##    items were supplied.  Some processes may rely on the avoidance of unnecessary changes. 
  134    local current_list_items
 
  135    local wanted_list_items
 
  137    wanted_list_items=
$(sort)
 
  138    if [ 
"$current_list_items" != 
"$wanted_list_items" ]; then
 
  140        echo 
"$wanted_list_items" | 
while read -r item; 
do 
  148## @brief Lösche ein UCI-Element. 
  149## @param uci_path Der UCI-Pfad des Elements. 
  150## @details Keine Fehlermeldung, falls das Element nicht existiert. 
  153    uci -q 
delete "$uci_path" || 
true 
  157# Finde eine uci-Sektion mit gewuenschten Eigenschaften. 
  158# Dies ist hilfreich beim Auffinden von olsrd.@LoadPlugin, sowie firewall-Zonen und aehnlichem. 
  159# Parameter config: Name der uci-config-Datei 
  160# Parameter stype: Typ der Sektion (z.B. "zone" oder "LoadPlugin")
 
  161# Parameter Bedingugen: 
  162find_all_uci_sections() {
 
  163    _find_uci_sections 0 
"$@" 
  167# Ermittle den ersten Treffer einer uci-Sektionssuche (siehe find_all_uci_sections) 
  168find_first_uci_section() {
 
  169    _find_uci_sections 1 
"$@" 
  173## @fn filter_uci_show_value_quotes() 
  174## @brief Entferne fuehrende und abschliessende Quotes um die Werte der "uci show"-Ausgabe herum.
 
  175## @details Seit Chaos Calmer liefert 'uci show' die Werte (nach dem "=") mit Single-Quotes zurück.
 
  176##   Dies ist schön für die Splittung von Listen, aber nervig für unsere Bedingungsprüfung. 
  177##   Wir entfernen die Quotes daher. 
  178## @attention Das Ergebnis ist fuer die Verarbeitung von Listen-Elemente unbrauchbar, da diese separiert 
  179##   von Quotes umgeben sind. 
  181    sed 
's/^\([^=]\+\)='"'"'\(.*\)'"'"'$/\1=\2/' 
  185# Aus Performance-Gruenden brechen wir frueh ab, falls die gewuenschte Anzahl an Ergebnissen erreicht ist. 
  186# Die meisten Anfragen suchen nur einen Treffer ("find_first_uci_section") - daher koennen wir hier viel Zeit sparen.
 
  187_find_uci_sections() {
 
  188    trap 
'error_trap _find_uci_sections "$*"' EXIT
 
  196    # Der Cache beschleunigt den Vorgang wesentlich. 
  198    for section in 
$(echo 
"$uci_cache" | grep 
"^$config"'\.[^.]\+='"$stype$" | cut -f 1 -
d = | cut -f 2 -
d .); 
do 
  199        for condition in 
"$@"; 
do 
  200            # diese Sektion ueberspringen, falls eine der Bedingungen fehlschlaegt 
  201            echo 
"$uci_cache" | grep -q 
"^$config"'\.'"$section"'\.'"$condition$" || 
continue 2
 
  203        # alle Bedingungen trafen zu 
  204        echo 
"$config.$section" 
  205        counter=
$((counter + 1))
 
  206        [ 
"$max_num" != 0 ] && [ 
"$counter" -ge 
"$max_num" ] && 
break 
  212# Erzeuge die notwendigen on-core-Einstellungen fuer uci, falls sie noch nicht existieren. 
  213# Jede Funktion, die im on-core-Namensraum Einstellungen schreiben moechte, moege diese 
  214# Funktion zuvor aufrufen. 
  215prepare_on_uci_settings() {
 
  216    trap 
'error_trap prepare_on_uci_settings "$*"' EXIT
 
  218    # on-core-Konfiguration erzeugen, falls noetig 
  219    [ -e /etc/config/on-core ] || touch /etc/config/on-core
 
  220    # shellcheck disable=SC2043 
  221    for section in settings; 
do 
  222        uci show | grep -q 
'^on-core\.'"${section}"'\.' || uci set 
"on-core.${section}=$section" 
  227## @fn create_uci_section_if_missing 
  228## @brief Prüfe, ob eine definierte UCI-Sektion existiert und lege sie andernfalls an. 
  229## @returns Sektion wurde angelegt (True) oder war bereits vorhanden (false). 
  231    trap 
'error_trap create_uci_section_if_missing "$*"' EXIT
 
  237    # liefere "falsch" zurück (Sektion war bereits vorhanden)
 
  238    [ -n 
"$(find_first_uci_section "$config
" "$stype
" "$@")" ] && { trap 
"" EXIT; 
return 1; }
 
  239    # uci-Sektion fehlt -> anlegen 
  240    uci_prefix=
"$config.$(uci add "$config
" "$stype
")" 
  241    for key_value in 
"$@"; 
do 
  242        uci set 
"$uci_prefix.$key_value" 
  244    # liefere "wahr" zurück (Sektion wurde angelegt)
 
  248# Ende der Doku-Gruppe 
uci_get_list_index(uci_path, value)
Ermittle die ID eines UCI-Listenelements.
 
create_uci_section_if_missing()
Prüfe, ob eine definierte UCI-Sektion existiert und lege sie andernfalls an.
 
uci_is_in_list(uci_path, item)
Prüfe ob ein Element in einer Liste vorkommt.
 
uci_delete(uci_path)
Lösche ein UCI-Element.
 
uci_replace_list()
Replace the items in a list. Wanted items are expected via stdin (one per line, uci_path).
 
filter_uci_show_value_quotes()
Entferne fuehrende und abschliessende Quotes um die Werte der "uci show"-Ausgabe herum.
 
uci_get_list(uci_path)
Liefere alle einzelnen Elemente einer UCI-Liste zurück.
 
uci_add_list(uci_path, new_item)
Füge einen neuen Wert zu einer UCI-Liste hinzu und achte dabei auf Einmaligkeit.
 
uci_delete_list(uci_path, value)
Lösche ein Element einer UCI-Liste.
 
set eu on function print_services services log for dir in etc on services d var on services volatile d