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
"" $GUARD_TRAPS &&
return 1
15 # synchron halten mit "uci_to_bool" (lua-Module)
16 [
"$token" =
"0" -o
"$token" =
"no" -o
"$token" =
"n" -o
"$token" =
"off" -o
"$token" =
"false" ] &&
return 0
17 trap
"" $GUARD_TRAPS &&
return 1
21 # "uci -q get ..." endet mit einem Fehlercode falls das Objekt nicht existiert
22 # Dies erschwert bei strikter Fehlerpruefung (set -e) die Abfrage von uci-Werten.
23 # Die Funktion "uci_get" liefert bei fehlenden Objekten einen leeren String zurueck
24 # oder den gegebenen Standardwert zurueck.
25 # Der Exitcode signalisiert immer Erfolg.
27 # uci_get firewall.zone_free.masq 1
28 # Der abschließende Standardwert (zweiter Parameter) ist optional.
30 trap
"error_trap uci_get '$*'" $GUARD_TRAPS
32 local
default=
"${2:-}"
33 if uci -q
get "$key"; then
36 [ -n
"$default" ] && echo
"$default"
43 ## @brief Füge einen neuen Wert zu einer UCI-Liste hinzu und achte dabei auf Einmaligkeit.
44 ## @param uci_path Der UCI-Pfad des Listenelements.
45 ## @param new_item Der neue Wert, der zur Liste hinzugefügt werden soll.
46 ## @details Die Funktion ist vergleichbar mit "uci add_list". Es werden jedoch keine doppelten Einträge erzeugt.
47 ## Somit entfällt die Prüfung auf Vorhandensein des Eintrags.
49 trap
"error_trap uci_add_list '$*'" $GUARD_TRAPS
53 # ist der Eintrag bereits vorhanden?
55 uci add_list
"$uci_path=$new_item"
60 ## @brief Liefere alle einzelenen Elemente einer UCI-Liste zurück.
61 ## @param uci_path Der UCI-Pfad eines Elements.
62 ## @returns Die Einträge sind zeilenweise voneinander getrennt.
64 trap
"error_trap uci_get_list '$*'" $GUARD_TRAPS
66 # falls es den Schlüssel nicht gibt, liefert "uci show" eine Fehlermeldung und Müll - das wollen wir abfangen
67 [ -z
"$(uci_get "$uci_path
")" ] &&
return 0
68 # ansonsten: via "uci show" mit speziellem Trenner abfragen und zeilenweise separieren
69 uci -q -
d "_=_=_=_=_" show
"$uci_path" | cut -f 2- -
d = | sed
's/_=_=_=_=_/\n/g' | sed
"s/^'\(.*\)'$/\1/"
73 ## @fn uci_get_list_index()
74 ## @brief Ermittle die ID eines UCI-Listenelements.
75 ## @param uci_path Der UCI-Pfad der Liste.
76 ## @param value Der Inhalt des zu suchenden Elements.
77 ## @returns Die ID des Listenelements (beginnend bei Null) wird zurückgeliefert.
78 ## @details Falls das Element nicht gefunden wird, ist das Ergebnis leer.
80 trap
"error_trap uci_get_list_index '$*'" $GUARD_TRAPS
86 [
"$current" =
"$value" ] && echo
"$index" &&
return 0
93 ## @fn uci_is_in_list()
94 ## @param uci_path Der UCI-Pfad der Liste.
95 ## @param item Das zu suchende Element.
96 ## @brief Prüfe ob ein Element in einer Liste vorkommt.
98 trap
"error_trap uci_is_in_list '$*'" $GUARD_TRAPS
101 [ -n
"$(uci_get_list_index "$uci_path
" "$value")" ] &&
return 0
102 trap
"" $GUARD_TRAPS &&
return 1
106 ## @fn uci_delete_list()
107 ## @brief Lösche ein Element einer UCI-Liste
108 ## @param uci_path Der UCI-Pfad der Liste.
109 ## @param value Der Inhalt des zu löschenden Elements. Es findet ein Vergleich auf Identität (kein Muster) statt.
110 ## @details Falls das Element nicht existiert, endet die Funktion stillschweigend ohne Fehlermeldung.
112 trap
"error_trap uci_delete_list '$*'" $GUARD_TRAPS
117 [ -n
"$index" ] &&
uci_delete "${uci_path}=${index}"
123 ## @brief Lösche ein UCI-Element.
124 ## @param uci_path Der UCI-Pfad des Elements.
125 ## @details Keine Fehlermeldung, falls das Element nicht existiert.
128 uci -q
delete "$uci_path" ||
true
132 # Finde eine uci-Sektion mit gewuenschten Eigenschaften.
133 # Dies ist hilfreich beim Auffinden von olsrd.@LoadPlugin, sowie firewall-Zonen und aehnlichem.
134 # Parameter config: Name der uci-config-Datei
135 # Parameter stype: Typ der Sektion (z.B. "zone" oder "LoadPlugin")
136 # Parameter Bedingugen:
137 find_all_uci_sections() {
138 _find_uci_sections 0
"$@"
142 # Ermittle den ersten Treffer einer uci-Sektionssuche (siehe find_all_uci_sections)
143 find_first_uci_section() {
144 _find_uci_sections 1
"$@"
148 ## @fn filter_uci_show_value_quotes()
149 ## @brief Entferne fuehrende und abschliessende Quotes um die Werte der "uci show"-Ausgabe herum.
150 ## @details Seit Chaos Calmer liefert 'uci show' die Werte (nach dem "=") mit Single-Quotes zurück.
151 ## Dies ist schön für die Splittung von Listen, aber nervig für unsere Bedingungsprüfung.
152 ## Wir entfernen die Quotes daher.
153 ## @attention Das Ergebnis ist fuer die Verarbeitung von Listen-Elemente unbrauchbar, da diese separiert
154 ## von Quotes umgeben sind.
156 sed
"s/^\([^=]\+\)='\(.*\)'$/\1=\2/"
160 # Aus Performance-Gruenden brechen wir frueh ab, falls die gewuenschte Anzahl an Ergebnissen erreicht ist.
161 # Die meisten Anfragen suchen nur einen Treffer ("find_first_uci_section") - daher koennen wir hier viel Zeit sparen.
162 _find_uci_sections() {
163 trap
"error_trap _find_uci_sections '$*'" $GUARD_TRAPS
171 # Der Cache beschleunigt den Vorgang wesentlich.
173 echo
"$uci_cache" | grep
"^$config\.[^.]\+=$stype$" | cut -f 1 -
d = | cut -f 2 -
d . |
while read section;
do
174 for condition in
"$@";
do
175 # diese Sektion ueberspringen, falls eine der Bedingungen fehlschlaegt
176 echo
"$uci_cache" | grep -q
"^$config\.$section\.$condition$" ||
continue 2
178 # alle Bedingungen trafen zu
179 echo
"$config.$section"
181 [
"$max_num" = 0 ] &&
continue
182 [
"$counter" -ge
"$max_num" ] &&
break
188 # Erzeuge die notwendigen on-core-Einstellungen fuer uci, falls sie noch nicht existieren.
189 # Jede Funktion, die im on-core-Namensraum Einstellungen schreiben moechte, moege diese
190 # Funktion zuvor aufrufen.
191 prepare_on_uci_settings() {
192 trap
"error_trap prepare_on_uci_settings '$*'" $GUARD_TRAPS
194 # on-core-Konfiguration erzeugen, falls noetig
195 [ -e /etc/config/on-core ] || touch /etc/config/on-core
196 for section in settings;
do
197 uci show | grep -q
"^on-core\.${section}\." || uci set
"on-core.${section}=$section"
201 # Ende der Doku-Gruppe
uci_get_list_index(uci_path, value)
Ermittle die ID eines UCI-Listenelements.
uci_delete(uci_path)
Lösche ein UCI-Element.
uci_is_in_list(uci_path, item)
Prüfe ob ein Element in einer Liste vorkommt.
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.
uci_get_list(uci_path)
Liefere alle einzelenen Elemente einer UCI-Liste zurück.
set eu on function print_services services log for dir in etc on services d var on services volatile d
filter_uci_show_value_quotes()
Entferne fuehrende und abschliessende Quotes um die Werte der "uci show"-Ausgabe herum.