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 [
"$token" =
"0" -o
"$token" =
"no" -o
"$token" =
"n" -o
"$token" =
"off" -o
"$token" =
"false" ] &&
return 0
16 trap
"" $GUARD_TRAPS &&
return 1
20 # "uci -q get ..." endet mit einem Fehlercode falls das Objekt nicht existiert
21 # Dies erschwert bei strikter Fehlerpruefung (set -e) die Abfrage von uci-Werten.
22 # Die Funktion "uci_get" liefert bei fehlenden Objekten einen leeren String zurueck
23 # oder den gegebenen Standardwert zurueck.
24 # Der Exitcode signalisiert immer Erfolg.
26 # uci_get firewall.zone_free.masq 1
27 # Der abschließende Standardwert (zweiter Parameter) ist optional.
31 if uci -q
get "$key"; then
34 [ -n
"$default" ] && echo
"$default"
41 ## @brief Füge einen neuen Wert zu einer UCI-Liste hinzu und achte dabei auf Einmaligkeit.
42 ## @param uci_path Der UCI-Pfad des Listenelements.
43 ## @param new_item Der neue Wert, der zur Liste hinzugefügt werden soll.
44 ## @details Die Funktion ist vergleichbar mit "uci add_list". Es werden jedoch keine doppelten Einträge erzeugt.
45 ## Somit entfällt die Prüfung auf Vorhandensein des Eintrags.
49 # ist der Eintrag bereits vorhanden?
51 # schon vorhanden? Fertig ...
52 [ -n
"$index" ] &&
return 0
53 uci add_list
"$uci_path=$new_item"
58 ## @brief Liefere alle einzelenen Elemente einer UCI-Liste zurück.
59 ## @param uci_path Der UCI-Pfad eines Elements.
60 ## @returns Die Einträge sind zeilenweise voneinander getrennt.
63 # falls es den Schlüssel nicht gibt, liefert "uci show" eine Fehlermeldung und Müll - das wollen wir abfangen
64 [ -z
"$(uci_get "$uci_path
")" ] &&
return 0
65 # ansonsten: via "uci show" mit speziellem Trenner abfragen und zeilenweise separieren
66 uci show -
d "_=_=_=_=_" "$uci_path" | cut -f 2- -
d = | sed
's/_=_=_=_=_/\n/g'
70 ## @fn uci_get_list_index()
71 ## @brief Ermittle die ID eines UCI-Listenelements.
72 ## @param uci_path Der UCI-Pfad der Liste.
73 ## @param value Der Inhalt des zu suchenden Elements.
74 ## @returns Die ID des Listenelements (beginnend bei Null) wird zurückgeliefert.
75 ## @details Falls das Element nicht gefunden wird, ist das Ergebnis leer.
82 [
"$current" =
"$value" ] && echo
"$index" &&
return 0
89 ## @fn uci_delete_list()
90 ## @brief Lösche ein Element einer UCI-Liste
91 ## @param uci_path Der UCI-Pfad der Liste.
92 ## @param value Der Inhalt des zu löschenden Elements. Es findet ein Vergleich auf Identität (kein Muster) statt.
93 ## @details Falls das Element nicht existiert, endet die Funktion stillschweigend ohne Fehlermeldung.
98 [ -n
"$index" ] &&
uci_delete "${uci_path}=${index}"
104 ## @brief Lösche ein UCI-Element.
105 ## @param uci_path Der UCI-Pfad des Elements.
106 ## @details Keine Fehlermeldung, falls das Element nicht existiert.
109 uci -q
delete "$uci_path" ||
true
113 # Finde eine uci-Sektion mit gewuenschten Eigenschaften.
114 # Dies ist hilfreich beim Auffinden von olsrd.@LoadPlugin, sowie firewall-Zonen und aehnlichem.
115 # Parameter config: Name der uci-config-Datei
116 # Parameter stype: Typ der Sektion (z.B. "zone" oder "LoadPlugin")
117 # Parameter Bedingugen:
118 find_all_uci_sections() {
119 _find_uci_sections 0
"$@"
123 # Ermittle den ersten Treffer einer uci-Sektionssuche (siehe find_all_uci_sections)
124 find_first_uci_section() {
125 _find_uci_sections 1
"$@"
129 # Aus Performance-Gruenden brechen wir frueh ab, falls die gewuenschte Anzahl an Ergebnissen erreicht ist.
130 # Die meisten Anfragen suchen nur einen Treffen ("find_first_uci_section") - daher koennen wir hier viel Zeit sparen.
131 _find_uci_sections() {
139 # dieser Cache beschleunigt den Vorgang wesentlich
140 local uci_cache_file=$(mktemp)
141 uci -X show
"$config" >
"$uci_cache_file"
142 grep
"^$config\.[^.]\+=$stype$" "$uci_cache_file" | cut -f 1 -
d = | cut -f 2 -
d . |
while read section;
do
143 for condition in
"$@";
do
144 # diese Sektion ueberspringen, falls eine der Bedingungen fehlschlaegt
145 grep -q
"^$config\.$section\.$condition$" "$uci_cache_file" ||
continue 2
147 # alle Bedingungen trafen zu
148 echo
"$config.$section"
150 [
"$max_num" = 0 ] &&
continue
151 [
"$counter" -ge
"$max_num" ] &&
break
153 rm -f
"$uci_cache_file"
158 # Erzeuge die notwendigen on-core-Einstellungen fuer uci, falls sie noch nicht existieren.
159 # Jede Funktion, die im on-core-Namensraum Einstellungen schreiben moechte, moege diese
160 # Funktion zuvor aufrufen.
161 prepare_on_uci_settings() {
163 # on-core-Konfiguration erzeugen, falls noetig
164 [ -e /etc/config/on-core ] || touch /etc/config/on-core
165 for section in settings;
do
166 uci show | grep -q
"^on-core\.${section}\." || uci
set "on-core.${section}=$section"
170 # Ende der Doku-Gruppe