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