Opennet Firmware
 Alle Dateien Funktionen Variablen Gruppen Seiten
uci.sh
gehe zur Dokumentation dieser Datei
1 ## @defgroup uci UCI
2 ## @brief Hilfreiche Funktionen zum lesenden und schreibenden Zugriff auf die UCI-basierte Konfiguration.
3 # Beginn der Doku-Gruppe
4 ## @{
5 
6 
7 uci_is_true() {
8  uci_is_false "$1" && trap "" $GUARD_TRAPS && return 1
9  return 0
10 }
11 
12 
13 uci_is_false() {
14  local token="$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
18 }
19 
20 
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.
26 # Syntax:
27 # uci_get firewall.zone_free.masq 1
28 # Der abschließende Standardwert (zweiter Parameter) ist optional.
29 uci_get() {
30  trap "error_trap uci_get '$*'" $GUARD_TRAPS
31  local key="$1"
32  local default="${2:-}"
33  if uci -q get "$key"; then
34  return 0
35  else
36  [ -n "$default" ] && echo "$default"
37  return 0
38  fi
39 }
40 
41 
42 ## @fn uci_add_list()
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.
48 uci_add_list() {
49  trap "error_trap uci_add_list '$*'" $GUARD_TRAPS
50  local uci_path="$1"
51  local new_item="$2"
52  local index
53  # ist der Eintrag bereits vorhanden?
54  uci_is_in_list "$uci_path" "$new_item" && return 0
55  uci add_list "$uci_path=$new_item"
56 }
57 
58 
59 ## @fn uci_get_list()
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.
63 uci_get_list() {
64  trap "error_trap uci_get_list '$*'" $GUARD_TRAPS
65  local uci_path="$1"
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/"
70 }
71 
72 
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
81  local uci_path="$1"
82  local value="$2"
83  local current
84  local index=0
85  uci_get_list "$uci_path" | while read current; do
86  [ "$current" = "$value" ] && echo "$index" && return 0
87  : $((index++))
88  done
89  return 0
90 }
91 
92 
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
99  local uci_path="$1"
100  local value="$2"
101  [ -n "$(uci_get_list_index "$uci_path" "$value")" ] && return 0
102  trap "" $GUARD_TRAPS && return 1
103 }
104 
105 
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.
111 uci_delete_list() {
112  trap "error_trap uci_delete_list '$*'" $GUARD_TRAPS
113  local uci_path="$1"
114  local value="$2"
115  local index
116  index=$(uci_get_list_index "$uci_path" "$value")
117  [ -n "$index" ] && uci_delete "${uci_path}=${index}"
118  return 0
119 }
120 
121 
122 ## @fn uci_delete()
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.
126 uci_delete() {
127  local uci_path="$1"
128  uci -q delete "$uci_path" || true
129 }
130 
131 
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 "$@"
139 }
140 
141 
142 # Ermittle den ersten Treffer einer uci-Sektionssuche (siehe find_all_uci_sections)
143 find_first_uci_section() {
144  _find_uci_sections 1 "$@"
145 }
146 
147 
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/"
157 }
158 
159 
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
164  local max_num="$1"
165  local config="$2"
166  local stype="$3"
167  shift 3
168  local counter=0
169  local section
170  local condition
171  # Der Cache beschleunigt den Vorgang wesentlich.
172  uci_cache=$(uci -X -q show "$config" | filter_uci_show_value_quotes)
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
177  done
178  # alle Bedingungen trafen zu
179  echo "$config.$section"
180  : $((counter++))
181  [ "$max_num" = 0 ] && continue
182  [ "$counter" -ge "$max_num" ] && break
183  done | sort
184  return 0
185 }
186 
187 
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
193  local section
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"
198  done
199 }
200 
201 # Ende der Doku-Gruppe
202 ## @}
uci_get_list_index(uci_path, value)
Ermittle die ID eines UCI-Listenelements.
Definition: uci.sh:22
uci_delete(uci_path)
Lösche ein UCI-Element.
Definition: uci.sh:38
uci_is_in_list(uci_path, item)
Prüfe ob ein Element in einer Liste vorkommt.
Definition: uci.sh:27
while read key value
Definition: core.sh:81
uci_add_list(uci_path, new_item)
Füge einen neuen Wert zu einer UCI-Liste hinzu und achte dabei auf Einmaligkeit.
Definition: uci.sh:10
local key
Definition: core.sh:81
uci_delete_list(uci_path, value)
Lösche ein Element einer UCI-Liste.
Definition: uci.sh:33
uci_get_list(uci_path)
Liefere alle einzelenen Elemente einer UCI-Liste zurück.
Definition: uci.sh:15
set eu on function print_services services log for dir in etc on services d var on services volatile d
Definition: services:13
filter_uci_show_value_quotes()
Entferne fuehrende und abschliessende Quotes um die Werte der "uci show"-Ausgabe herum.
Definition: uci.sh:46
shift
Definition: core.sh:81
done
Definition: core.sh:81
do echo n $value
Definition: core.sh:81