2 ## @brief Konfiguration und Abfrage des OLSR-Diensts. Einlesen von Diensten announciert via olsrd-nameservice.
3 # Beginn der Doku-Gruppe
6 OLSR_NAMESERVICE_SERVICE_TRIGGER=/usr/sbin/on_nameservice_trigger
7 SERVICES_FILE=/var/run/services_olsr
11 # uebertrage die Netzwerke, die derzeit der Zone "opennet" zugeordnet sind, in die olsr-Konfiguration
12 # Anschliessend wird olsr und die firewall neugestartet.
13 # Dieses Skript sollte via hotplug bei Aenderungen der Netzwerkkonfiguration ausgefuehrt werden.
14 update_olsr_interfaces() {
15 trap
"error_trap update_olsr_interfaces '$*'" $GUARD_TRAPS
18 interfaces=$(get_zone_interfaces
"$ZONE_MESH")
19 # physische Interfaces werden beispielsweise durch die mesh-Interfaces erzeugt
22 # fuehrende Leerzeichen entfernen; Zeilenumbrueche in Leerzeichen verwandeln
23 value=$(echo
"$interfaces $devices" | sed
's/^ *//; s/ *$//' | tr
'\n' ' ' | sed
's/^ *//; s/ *$//')
24 uci set -q
"olsrd.@Interface[0].interface=$value"
29 # Pruefe das angegebene olsrd-Plugin aktiv ist und aktiviere es, falls dies nicht der Fall sein sollte.
30 # Das Ergebnis ist die uci-Sektion (z.B.
"olsrd.@LoadPlugin[1]") als String.
31 get_and_enable_olsrd_library_uci_prefix() {
32 trap
"error_trap get_and_enable_olsrd_library_uci_prefix '$*'" $GUARD_TRAPS
35 local library=
"olsrd_$1"
37 current=$(find_all_uci_sections olsrd LoadPlugin |
while read uci_prefix;
do
38 # die Bibliothek beginnt mit dem Namen - danach folgt die genaue Versionsnummer
39 uci_get
"${uci_prefix}.library" | grep -q
"^$library\.so" && echo
"$uci_prefix"
41 if [ -n
"$current" ]; then
42 uci_prefix=$(echo
"$current" | cut -f 1 -
d = | sed
's/\.library$//')
44 lib_file=$(find /usr/lib -type f -name
"${library}.*")
45 if [ -z
"$lib_file" ]; then
46 msg_error "Failed to find olsrd '$library' plugin. Some Opennet services will fail."
47 trap
"" $GUARD_TRAPS &&
return 1
49 uci_prefix=
"olsrd.$(uci add olsrd LoadPlugin)"
50 uci set
"${uci_prefix}.library=$(basename "$lib_file
")"
52 # Plugin aktivieren; Praefix ausgeben
53 if [ -n
"$uci_prefix" ]; then
54 # moeglicherweise vorhandenen 'ignore'-Parameter abschalten
55 uci_is_true
"$(uci_get "${uci_prefix}.ignore
" 0)" && uci set
"${uci_prefix}.ignore=0"
62 # Setze die Einstellung MainIP in der olsr-Konfiguration:
63 # Quelle 1: der erste Parameter
64 # Quelle 2: on-core.settings.on_id
65 # Quelle 3: die vorkonfigurierte Standard-IP
66 # Anschliessend ist "apply_changes olsrd" erforderlich.
68 trap
"error_trap olsr_set_main_ip '$*'" $GUARD_TRAPS
69 # Auslesen der aktuellen, bzw. der Standard-IP
74 main_ip=$(get_main_ip)
77 # die Main-IP ist die erste IP dieses Geraets
78 uci set
"olsrd.@olsrd[0].MainIp=$main_ip"
82 # Ermittle welche olsr-Module konfiguriert sind, ohne dass die Library vorhanden ist.
83 # Deaktiviere diese Module - fuer ein sauberes boot-Log.
84 disable_missing_olsr_modules() {
85 trap
"error_trap disable_missing_olsr_modules '$*'" $GUARD_TRAPS
86 local libpath=/usr/lib
91 find_all_uci_sections
"olsrd" "LoadPlugin" |
while read uci_prefix;
do
92 libfile=$(uci_get
"${uci_prefix}.library")
93 ignore=$(uci_get
"${uci_prefix}.ignore")
94 [ -n
"$ignore" ] && uci_is_true
"$ignore" &&
continue
95 if [ ! -e
"$libpath/$libfile" ]; then
96 msg_info "Disabling missing olsr module '$libfile'"
97 uci set
"${uci_prefix}.ignore=1"
104 ## @fn olsr_sync_routing_tables()
105 ## @brief Synchronisiere die olsrd-Routingtabellen-Konfiguration mit den iproute-Routingtabellennummern.
106 ## @details Im Konfliktfall wird die olsrd-Konfiguration an die iproute-Konfiguration angepasst.
108 trap
"error_trap olsr_sync_routing_tables '$*'" $GUARD_TRAPS
113 while read olsr_name iproute_name;
do
114 olsr_id=$(uci_get
"olsrd.@olsrd[0].$olsr_name")
116 # beide sind gesetzt und identisch? Alles ok ...
117 [ -n
"$olsr_id" -a
"$olsr_id" =
"$iproute_id" ] &&
continue
118 # eventuell Tabelle erzeugen, falls sie noch nicht existiert
120 # olsr passt sich im Zweifel der iproute-Nummer an
121 [
"$olsr_id" !=
"$iproute_id" ] && uci set
"olsrd.@olsrd[0].$olsr_name=$iproute_id" ||
true
123 RtTable $ROUTING_TABLE_MESH
124 RtTableDefault $ROUTING_TABLE_MESH_DEFAULT
130 # Einlesen eines olsrd-Nameservice-Service.
131 # Details zum Eingabe- und Ausgabeformat: siehe
"get_olsr_services".
132 parse_olsr_service_descriptions() {
133 trap
"error_trap parse_olsr_service_descriptions '$*'" $GUARD_TRAPS
142 # verwende "|" und Leerzeichen als Separatoren
144 while read url proto service details;
do
145 scheme=$(echo
"$url" | cut -f 1 -
d :)
146 host=$(echo
"$url" | cut -f 3 -
d / | cut -f 1 -
d :)
147 port=$(echo
"$url" | cut -f 3 -
d / | cut -f 2 -
d :)
148 path=/$(echo
"$url" | cut -f 4- -
d /)
149 # Firmware-Versionen bis v0.4-5 veroeffentlichten folgendes Format:
150 # http://192.168.0.40:8080|tcp|ugw upload:50 download:15300 ping:23
151 [
"$scheme" =
"http" -a
"$port" =
"8080" -a
"$proto" =
"tcp" ] && \
152 [
"$service" =
"gw" -o
"$service" =
"ugw" ] && scheme=openvpn && port=1600 && proto=udp && service=gw
153 echo -e
"$scheme\t$host\t$port\t$path\t$proto\t$service\t$details"
158 # Parse die olsr-Service-Datei
159 # Die Service-Datei enthaelt Zeilen streng definierter Form (durchgesetzt vom nameservice-Plugin).
160 # Beispielhafte Eintraege:
161 # http://192.168.0.15:8080|tcp|ugw upload:3 download:490 ping:108 #192.168.2.15
162 # dns://192.168.10.4:53|udp|dns #192.168.10.4
163 # Parameter: service-Type (z.B. "gw", "dns", "ntp", "mesh")
164 # Ergebnis (tab-separiert):
165 # SCHEME IP PORT PATH PROTO SERVICE DETAILS
166 # Im Fall von "http://192.168.0.15:8080|tcp|ugw upload:3 download:490 ping:108" entspricht dies:
167 # http 192.168.0.15 8080 tcp ugw upload:3 download:490 ping:108
168 get_olsr_services() {
169 trap
"error_trap get_olsr_services '$*'" $GUARD_TRAPS
170 local wanted_type=
"${1:-}"
180 [ ! -e
"$SERVICES_FILE" ] &&
msg_debug "no olsr-services file found: $SERVICES_FILE" &&
return 0
181 # remove trailing commentary (containing the service's source IP address)
182 grep
"^[^#]" "$SERVICES_FILE" | \
183 sed
's/[\t ]\+#[^#]\+//' | \
184 parse_olsr_service_descriptions | \
185 # filtere die Ergebnisse nach einem Service-Typ, falls selbiger als erster Parameter angegeben wurde
186 awk
'{ if (("'$wanted_type
'" == "") || ("'$wanted_type
'" == $6)) print $0; }'
191 ## @fn update_olsr_services()
192 ## @brief Verarbeite die aktuelle Dienst-Liste aus dem olsrd-nameservice-Plugin.
193 ## @details Veraltete Dienste werden entfernt. Eventuelle Änderungen der DNS- und NTP-Serverliste
196 trap
"error_trap update_olsr_services '$*'" $GUARD_TRAPS
205 # aktuell verbreitete Dienste benachrichtigen
206 olsr_services=$(get_olsr_services)
207 # leere Liste? Keine Verbindung mit der Wolke? Keine Aktualisierung, keine Beraeumung ...
208 [ -z
"$olsr_services" ] &&
return
209 echo
"$olsr_services" |
while read scheme ip port path proto service details;
do
210 notify_service "$service" "$scheme" "$ip" "$port" "$proto" "$path" "olsr" "$details" >/dev/
null
215 min_timestamp=$(($(get_uptime_minutes) - $(get_on_core_default
"olsr_service_expire_minutes")))
216 # veraltete Dienste entfernen (nur falls die uptime groesser ist als die Verfallszeit)
217 if [
"$min_timestamp" -gt 0 ]; then
220 # der Service ist zu lange nicht aktualisiert worden
221 [
"$timestamp" -lt
"$min_timestamp" ] && delete_service
"$service_name"
225 # aktualisiere DNS- und NTP-Dienste
226 apply_changes on-core
231 ## @brief Sende eine Anfrage an das txtinfo-Interface von olsrd
232 ## @param request Der zu sende Request-Pfad (z.B. "links" oder "neighbours")
233 ## @details Bei Problemen mit dem Verbindungsaufbau erscheint ein Hinweis im syslog.
236 echo
"/$request" | timeout 2 nc localhost 2006 2>/dev/
null || {
237 # keine Fehlermeldung, falls wir uns gerade noch im Boot-Prozess befinden
238 # Dies tritt besonders nach einem Reboot via Web-Interface auf, da dann die Status-Seite
239 # noch während des Hochfahrens abgerufen wird.
240 [
"$(get_uptime_seconds)" -lt 180 ] ||
msg_error "request_olsrd_txtinfo: olsrd is not responding"
244 # Ende der Doku-Gruppe
get_services(service_type)
Liefere alle Dienste zurueck, die dem angegebenen Typ zugeordnet sind. Falls kein Typ angegben wird...
notify_service()
Aktualisiere den Zeitstempel und die Entfernung (etx) eines Dienstes.
olsr_sync_routing_tables()
Synchronisiere die olsrd-Routingtabellen-Konfiguration mit den iproute-Routingtabellennummern.
get_routing_table_id(table_name)
Ermittle die Nummer der namentlich gegebenen Routing-Tabelle.
add_routing_table(table_name)
Erstelle einen neuen Routing-Tabellen-Eintrag.
filter_services_by_value(key, value)
request_olsrd_txtinfo(request)
Sende eine Anfrage an das txtinfo-Interface von olsrd.
get_zone_raw_devices()
Ermittle die physischen Netzwerkinterfaces, die direkt einer Firewall-Zone zugeordnet sind...
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
msg_debug(message)
Debug-Meldungen ins syslog schreiben.
set eu on function print_services services log for dir in etc on services d var on services volatile d
get_service_value(key, default)
Auslesen eines Werts aus der Service-Datenbank.
msg_error(message)
Die Fehlermeldungen werden in die Standard-Fehlerausgabe und ins syslog geschrieben.
set eu grep root::etc shadow exit if which chpasswd dev null
update_olsr_services()
Verarbeite die aktuelle Dienst-Liste aus dem olsrd-nameservice-Plugin.