Opennet Firmware
 Alle Dateien Funktionen Variablen Gruppen Seiten
olsr.sh
gehe zur Dokumentation dieser Datei
1 ## @defgroup olsr OLSR
2 ## @brief Konfiguration und Abfrage des OLSR-Diensts. Einlesen von Diensten announciert via olsrd-nameservice.
3 # Beginn der Doku-Gruppe
4 ## @{
5 
6 OLSR_NAMESERVICE_SERVICE_TRIGGER=/usr/sbin/on_nameservice_trigger
7 SERVICES_FILE=/var/run/services_olsr
8 OLSR_HTTP_PORT=8080
9 
10 
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
16  local value=
17  local interfaces
18  interfaces=$(get_zone_interfaces "$ZONE_MESH")
19  # physische Interfaces werden beispielsweise durch die mesh-Interfaces erzeugt
20  local devices
21  devices=$(get_zone_raw_devices "$ZONE_MESH")
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"
25  apply_changes olsrd
26 }
27 
28 
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
33  local lib_file
34  local uci_prefix=
35  local library="olsrd_$1"
36  local current
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"
40  done | tail -1)
41  if [ -n "$current" ]; then
42  uci_prefix=$(echo "$current" | cut -f 1 -d = | sed 's/\.library$//')
43  else
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
48  fi
49  uci_prefix="olsrd.$(uci add olsrd LoadPlugin)"
50  uci set "${uci_prefix}.library=$(basename "$lib_file")"
51  fi
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"
56  echo "$uci_prefix"
57  fi
58  return 0
59 }
60 
61 
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.
67 olsr_set_main_ip() {
68  trap "error_trap olsr_set_main_ip '$*'" $GUARD_TRAPS
69  # Auslesen der aktuellen, bzw. der Standard-IP
70  local main_ip
71  if [ $# -eq 1 ]; then
72  main_ip="$1"
73  else
74  main_ip=$(get_main_ip)
75  fi
76 
77  # die Main-IP ist die erste IP dieses Geraets
78  uci set "olsrd.@olsrd[0].MainIp=$main_ip"
79 }
80 
81 
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
87  local libline
88  local libfile
89  local uci_prefix
90  local ignore
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"
98  fi
99  done
100  apply_changes olsrd
101 }
102 
103 
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
109  local olsr_name
110  local iproute_name
111  local olsr_id
112  local iproute_id
113  while read olsr_name iproute_name; do
114  olsr_id=$(uci_get "olsrd.@olsrd[0].$olsr_name")
115  iproute_id=$(get_routing_table_id "$iproute_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
119  [ -z "$iproute_id" ] && iproute_id=$(add_routing_table "$iproute_name")
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
122  done << EOF
123 RtTable $ROUTING_TABLE_MESH
124 RtTableDefault $ROUTING_TABLE_MESH_DEFAULT
125 EOF
126  apply_changes olsrd
127 }
128 
129 
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
134  local url
135  local proto
136  local service
137  local details
138  local scheme
139  local host
140  local port
141  local path
142  # verwende "|" und Leerzeichen als Separatoren
143  local IFS='| '
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"
154  done
155 }
156 
157 
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:-}"
171  local filter_service
172  local url
173  local proto
174  local service
175  local details
176  local scheme
177  local host
178  local port
179  local path
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; }'
187  return 0
188 }
189 
190 
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
194 ## werden angewandt.
196  trap "error_trap update_olsr_services '$*'" $GUARD_TRAPS
197  local scheme
198  local ip
199  local port
200  local path
201  local proto
202  local service
203  local details
204  local olsr_services
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
211  done
212  local service_name
213  local timestamp
214  local min_timestamp
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
218  get_services | filter_services_by_value "source" "olsr" | while read service_name; do
219  timestamp=$(get_service_value "$service_name" "timestamp" 0)
220  # der Service ist zu lange nicht aktualisiert worden
221  [ "$timestamp" -lt "$min_timestamp" ] && delete_service "$service_name"
222  true
223  done
224  fi
225  # aktualisiere DNS- und NTP-Dienste
226  apply_changes on-core
227 }
228 
229 
230 ## @fn request_olsrd_txtinfo()
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.
235  local request="$1"
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"
241  }
242 }
243 
244 # Ende der Doku-Gruppe
245 ## @}
get_services(service_type)
Liefere alle Dienste zurueck, die dem angegebenen Typ zugeordnet sind. Falls kein Typ angegben wird...
Definition: services.sh:61
notify_service()
Aktualisiere den Zeitstempel und die Entfernung (etx) eines Dienstes.
Definition: services.sh:11
olsr_sync_routing_tables()
Synchronisiere die olsrd-Routingtabellen-Konfiguration mit den iproute-Routingtabellennummern.
Definition: olsr.sh:7
get_routing_table_id(table_name)
Ermittle die Nummer der namentlich gegebenen Routing-Tabelle.
Definition: routing.sh:48
while read key value
Definition: core.sh:81
add_routing_table(table_name)
Erstelle einen neuen Routing-Tabellen-Eintrag.
Definition: routing.sh:55
filter_services_by_value(key, value)
Definition: services.sh:67
request_olsrd_txtinfo(request)
Sende eine Anfrage an das txtinfo-Interface von olsrd.
Definition: olsr.sh:17
get_zone_raw_devices()
Ermittle die physischen Netzwerkinterfaces, die direkt einer Firewall-Zone zugeordnet sind...
Definition: network.sh:24
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
Definition: core.sh:15
msg_debug(message)
Debug-Meldungen ins syslog schreiben.
Definition: core.sh:9
set eu on function print_services services log for dir in etc on services d var on services volatile d
Definition: services:13
get_service_value(key, default)
Auslesen eines Werts aus der Service-Datenbank.
Definition: services.sh:74
msg_error(message)
Die Fehlermeldungen werden in die Standard-Fehlerausgabe und ins syslog geschrieben.
Definition: core.sh:22
set eu grep root::etc shadow exit if which chpasswd dev null
Definition: on-password:12
done
Definition: core.sh:81
update_olsr_services()
Verarbeite die aktuelle Dienst-Liste aus dem olsrd-nameservice-Plugin.
Definition: olsr.sh:12