Opennet Firmware
00_on-migrations
gehe zur Dokumentation dieser Datei
1 #!/bin/sh
2 #
3 # Dieses Skript enthaelt Funktionen, die fuer Updates altes Firmware-Versionen notwendig sind.
4 # Alle Funktionen muessen idempotent sein.
5 #
6 # Dieses Skript wird nach jedem Booten ausgeführt.
7 # Damit ermöglichen wir das Laden eines alten Backups auf eine neue Firmware.
8 # Ausserdem wird dieses Skript als Teil des uci-defaults-Konzepts beim ersten Booten nach einer
9 # Aktualisierung ausgefuehrt. Dies ist erforderlich, um alle notwendigen Vorbereitungen fuer
10 # die erste Ausfuehrung des "on-core"-Init-Skripts zu treffen (z.B. crontab-Einrichtung).
11 #
12 
13 
14 # shellcheck source=opennet/packages/on-core/files/usr/lib/opennet/on-helper.sh
15 . "${IPKG_INSTROOT:-}/usr/lib/opennet/on-helper.sh"
16 
17 
18 # bis Version v0.4-5: openvpn.opennet_user.comp_lzo=1
19 # seit Version v0.5 muss die Einstellung einen der folgenden Werte haben: yes/no/adaptive
20 # bzw. seit Version v0.5 gibt es Sektion nicht mehr (openvpn.opennet_user)
21 # Status in v0.4-5:
22 # ~# uci show | grep lzo
23 # on-usergw.opennet_ugw.comp_lzo=1
24 # openvpn.opennet_user.comp_lzo=1
25 # openvpn.opennet_ugw_erina_on_i_de.comp_lzo=1
26 # openvpn.opennet_ugw_subaru_on_i_de.comp_lzo=1
27 coerce_openvpn_comp_lzo() {
28  trap 'error_trap coerce_openvpn_comp_lzo "$*"' EXIT
29  local new_value
30  local key
31  # wir wissen nicht genau, ob on-usergw und openvpn existiert - also lieber vorsichtig fragen
32  (uci -q show openvpn; uci -q show on-usergw) | grep '\.comp_lzo=[01]$' | while read -r line; do
33  new_value=no
34  echo "$line" | grep -q "1$" && new_value=yes
35  key=$(echo "$line" | cut -f 1 -d =)
36  uci set "$key=$new_value"
37  done
38  if [ -n "$(uci -q changes openvpn)" ] || uci changes | grep -q '^on-usergw\.'; then
39  msg_info "MIGRATION: coerce_openvpn_comp_lzo"
40  uci changes | grep -q '^on-usergw\.' && uci commit on-usergw
41  apply_changes openvpn
42  fi
43 }
44 
45 
46 # bis Version v0.4-5: die Opennet-Firmware hat die /etc/passwd durch einen Symlink auf /etc/etc_preset/passwd ersetzt
47 # Bei einem Update wird das symlink-Ziel ersetzt und somit gibt es keine Nutzerdatenbank mehr.
48 # Dies verhindert jeden telnet/ssh-Login-Versuch. Lediglich das Web-Interface ist nutzbar.
49 fix_passwd_broken_symlink() {
50  trap 'error_trap fix_passwd_broken_symlink "$*"' EXIT
51  local target=/etc/passwd
52  if [ -h "$target" ] && [ ! -e "$target" ]; then
53  msg_info "MIGRATION: fix_passwd_broken_symlink"
54  rm "$target"
55  # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox
56  cat >"$target" << EOF
57 root:x:0:0:root:/root:/bin/ash
58 daemon:*:1:1:daemon:/var:/bin/false
59 ftp:*:55:55:ftp:/home/ftp:/bin/false
60 network:*:101:101:network:/var:/bin/false
61 nobody:*:65534:65534:nobody:/var:/bin/false
62 EOF
63  # Ein paar Dienste schlugen aufgrund der fehlenden Nutzerdatenbank fehl.
64  # Ein reboot waere schoen - aber kann zukuenftig eventuell irgendwann zu einer Schleife fuehren.
65  # Also: manuell einzelne Dienste neu starten.
66  /etc/init.d/dnsmasq restart
67  fi
68 }
69 
70 
71 # bis Version v0.4-5 war /etc/rc.local ein Symlink nach /etc/etc_presets/rc.local
72 # In den folgenden Versionen gibt es kein /etc/etc_presets/ mehr.
73 # Der Symlink kann dann durch den ueblichen Kommentar-Text ersetzt werden.
74 fix_rclocal_broken_symlink() {
75  trap 'error_trap fix_rclocal_broken_symlink "$*"' EXIT
76  local target=/etc/rc.local
77  # die Datei existiert, bzw. der Symlink zeigt nicht ins Leere
78  [ -e "$target" ] && return 0
79  # falls die Datei kein Symlink ist, dann fassen wir sie lieber nicht an
80  [ -h "$target" ] || return 0
81  # die Datei ist ein kaputter Symlink - wir ersetzen sie
82  rm -f "$target"
83  # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox
84  cat >"$target" << EOF
85 # Put your custom commands here that should be executed once
86 # the system init finished. By default this file does nothing.
87 
88 exit 0
89 EOF
90  chmod 644 "$target"
91 }
92 
93 
94 
95 # wandele Leerzeichen-getrennte "option"-Eintraege in "list"-Eintraege um
96 _convert_uci_option_to_list() {
97  trap 'error_trap _convert_uci_option_to_list "$*"' EXIT
98  local config="$1"
99  local optname="$2"
100  local filename="/etc/config/$config"
101  # Zeilen der Form " option $optname 'foo bar'" werden in mehrere " option $optname '$ITEM'"-Zeilen verwandelt
102  # Wir korrigieren dabei sowohl "option"- als auch "list"-Elemente sofern ihr Inhalt Leerzeichen enthält.
103  # Dies ist notwendig, da schon vor dem Ausführen dieses Migrationsskripts beim Booten "uci add_list" angewandt
104  # wird - dies verwandelt die Leerzeichen-separierte alte "option" in eine unveränderte "list". Also müssen wir
105  # leider blind nachkorrigieren :(
106  awk '{
107  if ((($1 == "option") || ($1 == "list")) && ($2 == "'"$optname"'")) {
108  i = 3
109  while (i <= NF) {
110  gsub(/'\''/, "", $i)
111  printf " list %s '"'%s'"'\n", $2, $i
112  i++
113  }
114  } else {
115  print $0
116  }}' "$filename" | update_file_if_changed "$filename" && apply_changes "$config"
117  true
118 }
119 
120 
121 # Gelegentlich ändert openwrt die Definition einzelner Variablen. Dies müssen wir via Migration nachbereiten.
122 migrate_uci_definition_changes() {
123  trap 'error_trap migrate_uci_definition_changes "$*"' EXIT
124  # vor Barrier Breaker war "firewall.ZONE.network" eine "option" - anschliessed wurde es zur "list"
125  _convert_uci_option_to_list "firewall" "network"
126 }
127 
128 
129 # bis Version v0.4-5: "firewall reload" fuehrte auch die "include"-Dateien aus (z.B. /etc/firewall.opennet)
130 # Ab Version v0.5 verwenden wir diese Datei nicht mehr.
131 # Beispiel (v0.4-5):
132 # ~# uci show firewall | grep @include
133 # firewall.@include[0]=include
134 # firewall.@include[0].path=/etc/firewall.opennet
135 # firewall.@include[1]=include
136 # firewall.@include[1].path=/etc/firewall.user
137 fix_firewall_reload() {
138  trap 'error_trap fix_firewall_reload "$*"' EXIT
139  local filename=/etc/firewall.opennet
140  local uci_prefix
141  for uci_prefix in $(find_all_uci_sections "firewall" "include"); do
142  if [ "$(uci_get "${uci_prefix}.path")" = "$filename" ]; then
143  # gesamte "include"-Abzweigung loeschen
144  uci_delete "$uci_prefix"
145  apply_changes "firewall"
146  rm -f "$filename"
147  break
148  fi
149  done
150  return 0
151 }
152 
153 
154 # bis Version 0.4-5 sind die folgenden beiden Firewall-Einstellungen gesetzt:
155 # firewall.zone_on_vpn.forward=ACCEPT
156 # firewall.zone_on_mesh.forward=ACCEPT
157 # Diese erlauben die Paketweiterleitung aus unerwuenschten Netzen heraus.
158 disable_unwanted_forward() {
159  trap 'error_trap disable_unwanted_forward "$*"' EXIT
160  local zone_name
161  local uci_prefix
162  local changed=0
163  for uci_prefix in $(find_all_uci_sections firewall zone "forward=ACCEPT"); do
164  zone_name=$(uci_get "${uci_prefix}.name")
165  # eventuell ist ZONE_TUNNEL nicht definiert (falls on-openvpn nicht installiert ist)
166  if [ "$zone_name" = "$ZONE_MESH" ] || [ "$zone_name" = "${ZONE_TUNNEL:-on_vpn}" ]; then
167  uci set "${uci_prefix}.forward=REJECT"
168  changed=1
169  fi
170  done
171  if [ "$changed" = "1" ]; then
172  # sicherstellen, dass die als Ersatz fuer "forward=ACCEPT" noetige Weiterleitung existiert
173  add_zone_forward "$ZONE_MESH" "$ZONE_MESH"
174  apply_changes "firewall"
175  fi
176 }
177 
178 
179 # bis Version 0.4-5 wurden die folgenden Einstellungen fuer die Reihenfolge der VPN-Gateways verwendet:
180 # * on-openvpn.gateways.vpn_sort_criteria=metric|etx
181 # * on-openvpn.gateways.autosearch=on|off
182 # Die darauffolgenden Firrmware-Versionen verwenden stattdessen die Einstellung 'on-core.settings.service_sorting'.
183 transfer_vpn_sort_criteria_and_autosearch() {
184  trap 'error_trap transfer_vpn_sort_criteria_and_autosearch "$*"' EXIT
185  local sort_criteria
186  local autosearch
187  local result
188  sort_criteria=$(uci_get on-openvpn.gateways.vpn_sort_criteria)
189  autosearch=$(uci_get on-openvpn.gateways.autosearch)
190  if [ -z "$autosearch" ] && [ -z "$sort_criteria" ]; then
191  # die Einstellungen wurden bereits uebertragen
192  return 0
193  elif [ "$autosearch" = "off" ]; then
194  result=manual
195  elif [ "$sort_criteria" = "metric" ]; then
196  result=hop
197  else
198  result=etx
199  fi
200  uci set "on-core.settings.service_sorting=$result"
201 }
202 
203 
204 # bis Version 0.4-5 verwendeten wir vollstaendige uci-Sektionen fuer die VPN-Server
205 # z.B. openvpn.opennet_user
206 remove_tunnel_openvpn_settings() {
207  trap 'error_trap remove_tunnel_openvpn_settings "$*"' EXIT
208  local uci_prefix=openvpn.opennet_user
209  # Abbruch falls die Einstellungen bereits entfernt wurden
210  [ -z "$(uci_get "$uci_prefix")" ] && return
211  uci delete "$uci_prefix"
212  uci commit openvpn
213 }
214 
215 
216 # bis Version 0.4-5 wurde folgende Zeile ausgefuehrt:
217 # lua -e "require('luci.model.opennet.on_usergw') upgrade()" 2>/dev/null
218 # Dadurch wurden openvpn-uci-Konfigurationen (z.B. openvpn.opennet_ugw_erina_on_i_de) nach on-usergw.opennet_ugw* übertragen.
219 # Da die openvpn-Konfigurationen nun ein anderes Namensformat haben, loeschen wir sie.
220 remove_usergw_openvpn_configs() {
221  trap 'error_trap remove_usergw_openvpn_configs "$*"' EXIT
222  local uci_prefix
223  for uci_prefix in $(find_all_uci_sections "openvpn" "openvpn" | grep '^openvpn\.opennet_ugw_'); do
224  uci delete "$uci_prefix"
225  done
226  return 0
227 }
228 
229 
230 # Die uci-Sektion on-core.defaults und on-core.openssl wurde nur bis v0.4-5 verwendet.
231 # Anschliessend wanderten diese Einstellungen nach /usr/share/opennet/core.defaults.
232 # Ausserdem sind die folgenden Schluessel nach v0.4-5 nicht mehr in Verwendung:
233 # on-openvpn.gateways.searchmask
234 # on-openvpn.gateways.gw_dns
235 # on-openvpn.gateways.gw_ntp
236 # on-openvpn.gateways.better_gw
237 # on-openvpn.gateways.autosearch
238 # on-openvpn.gateways.vpn_nonworking_timeout
239 # on-openvpn.gateways.vpn_bettergateway_timeout
240 # on-openvpn.gateways.vpn_sort_criteria
241 # on-openvpn.gateways.vpn_recheck_age
242 remove_obsolete_on_core_settings() {
243  trap 'error_trap remove_obsolete_on_core_settings "$*"' EXIT
244  local key
245  for key in \
246  on-core.defaults \
247  on-core.openssl \
248  on-openvpn.gateways.gateways.searchmask \
249  on-openvpn.gateways.gateways.gw_dns \
250  on-openvpn.gateways.gateways.gw_ntp \
251  on-openvpn.gateways.gateways.better_gw \
252  on-openvpn.gateways.gateways.autosearch \
253  on-openvpn.gateways.gateways.vpn_nonworking_timeout \
254  on-openvpn.gateways.gateways.vpn_bettergateway_timeout \
255  on-openvpn.gateways.gateways.vpn_sort_criteria \
256  on-openvpn.gateways.gateways.vpn_recheck_age; do
257  if [ -n "$(uci_get "$key")" ]; then
258  uci_delete "$key"
259  fi
260  done
261 }
262 
263 
264 # bis Version 0.4-5 wurde die Variable "on-usergw.ugwng_hna_mask" verwendet.
265 remove_obsolete_usergw_settings() {
266  trap 'error_trap remove_obsolete_usergw_settings "$*"' EXIT
267  [ -n "$(uci_get "on-usergw.ugwng_hna_mask")" ] && uci delete "on-usergw.ugwng_hna_mask"
268  return 0
269 }
270 
271 
272 # Die uci-Einstellungen "on-openvpn.gate_XY.*" waren bis Version 0.4-5 in Verwendung.
273 # In den darauffolgenden Firmware-Versionen werden diese Informationen im Dateisystem gespeichert.
274 # Im Zweifelsfall (z.B. falls gerade keine Verbindung zum mesh existiert), werden die
275 # zu uebertragenden Informationen (die Offsets der Gateways oder ihre manuelle Reihenfolge) verworfen.
276 transfer_gateway_uci_settings() {
277  trap 'error_trap transfer_gateway_uci_settings "$*"' EXIT
278  local uci_prefix
279  local host
280  local offset
281  local rank
282  local service_name
283  for uci_prefix in $(find_all_uci_sections "on-openvpn" "gateway"); do
284  host=$(uci_get "${uci_prefix}.ipaddr")
285  offset=$(uci_get "${uci_prefix}.etx_offset")
286  rank="${uci_prefix#on-openvpn.gate_}"
287  # ermittle alle passenden Dienste dieses Hosts (es koennen mehrere Dienste pro Host vorhanden sein)
288  for service_name in $(get_services "gw" | filter_services_by_value "host" "$host"); do
289  # Offset fuer automatische Sortierung uebertragen
290  [ -n "$offset" ] && set_service_value "$service_name" "offset" "$offset"
291  # Rang fuer manuelle Sortierung uebertragen
292  [ -n "$rank" ] && [ "$rank" != "$uci_prefix" ] && set_service_value "$service_name" "rank" "$rank"
293  true
294  done
295  uci_delete "$uci_prefix"
296  done
297  uci_delete on-openvpn.gateways
298 }
299 
300 
301 # Bis Version 0.4-5 wurde die Datei /etc/crontabs/root einfach ueberschrieben (bzw. erzeugt).
302 # In Version 0.5 wurde die busybox-Funktion "run-parts" verwendet. Zugunsten der separaten
303 # Paketierung wollen wir dies nicht mehr verwenden.
304 # Fortan werden die Eintraege manuell hinzugefuegt (siehe /etc/uci-defaults/on-core-init).
305 remove_crontab_entries() {
306  trap 'error_trap remove_crontab_entries "$*"' EXIT
307  local crontab_file=/etc/crontabs/root
308  [ -e "$crontab_file" ] || return 0
309  # Verwendung des alten shell-Skripts
310  sed -i '/\/usr\/bin\/run-parts\.sh/d' "$crontab_file"
311  # Verwendung der busybox-Funktion
312  sed -i '/\trun-parts /d' "$crontab_file"
313 }
314 
315 
316 # Bis Version 0.4-5 wurde der Port des httpinfo-Plugins mit der Variable "olsrd.@LoadPlugin[1].Port" festgelegt.
317 # uci-typisch sind jedoch Attribute mit Kleinbuchstaben.
318 rename_olsrd_port_to_port() {
319  trap 'error_trap rename_olsrd_port_to_port "$*"' EXIT
320  local uci_prefix
321  local library
322  for uci_prefix in $(find_all_uci_sections "olsrd" "LoadPlugin"); do
323  library="$(uci_get "${uci_prefix}.library")"
324  # falsche Bibliothek?
325  [ "$library" != "${library#olsrd_httpinfo}" ] || continue
326  if [ -n "$(uci_get "${uci_prefix}.Port")" ]; then
327  # Wert von "Port" nach "port" uebertragen; "Port" loeschen
328  uci set "${uci_prefix}.port=$(uci_get "${uci_prefix}.Port")"
329  uci_delete "${uci_prefix}.Port"
330  fi
331  done
332  apply_changes olsrd
333 }
334 
335 
336 # Bis Version 0.4-5 gab es anscheinend die veraltete "mtu_fix"-Option in firewall-Weiterleitungen.
337 # Seit OpenWRT 8.09.2 befindet sich diese Option jedoch nicht mehr in den Weiterleitungen, sondern in der Zielzone.
338 move_mtu_fix_to_target_zone() {
339  trap 'error_trap move_mtu_fix_to_target_zone "$*"' EXIT
340  local uci_prefix
341  local mtu_value
342  local target_zone
343  local zone_uci_prefix
344  for uci_prefix in $(find_all_uci_sections firewall forwarding); do
345  mtu_value=$(uci_get "${uci_prefix}.mtu_fix")
346  # leer? Es gibt nichts zu uebertragen ...
347  [ -z "$mtu_value" ] && continue
348  target_zone=$(uci_get "${uci_prefix}.dest")
349  zone_uci_prefix=$(find_first_uci_section firewall zone "name=$target_zone")
350  # mtu-Wert uebertragen
351  [ -n "$zone_uci_prefix" ] && uci set "${zone_uci_prefix}.mtu_fix=$mtu_value"
352  # alten Wert loeschen
353  uci_delete "${uci_prefix}.mtu_fix"
354  done
355  apply_changes firewall
356 }
357 
358 
359 # Bis Version 0.4-5 verwendeten wir ntpclient anstelle des integrierten ntpd
360 # Die alten Einstellungen koennen also entfernt werden, da die Hosts automatisch gewaehlt werden.
361 remove_ntpclient_config() {
362  trap 'error_trap remove_ntpclient_config "$*"' EXIT
363  # keine config-Datei? Fertig ...
364  [ -e /etc/config/ntpclient ] || return 0
365  # ntpclient ist installiert? Konfiguration belassen ...
366  is_package_installed "ntpclient" && return 0
367  rm -f /etc/config/ntpclient
368 }
369 
370 
371 ## @fn rename_firewall_zone()
372 ## @brief Ändere den Namen einer Firewall-Zone (definiert im alten Barrier-Breaker-Stil).
373 ## @param old_zone Bisheriger Name der Firewall-Zone
374 ## @param new_zone Zukünftiger Name der Firewall-Zone
375 ## @details Alle abhängigen Firewall-Regeln (offene Ports, Weiterleitungen, Umleitungen) werden auf die neue Zone umgelenkt.
376 ## Die Umbenennung ist auf alte "benannte" Firewll-Zonen ausgelegt. Die Zone wird in eine neue "unbenannte" verwandelt.
377 rename_firewall_zone() {
378  trap 'error_trap rename_firewall_zone "$*"' EXIT
379  local old_zone="$1"
380  local new_zone="$2"
381  local uci_prefix
382  local key
383  uci_prefix=$(find_first_uci_section firewall zone "name=$old_zone")
384  # die Zone existiert nicht (mehr)
385  [ -z "$uci_prefix" ] && return 0
386  # "name"-Attribut der alten Zone neu setzen
387  uci set "${uci_prefix}.name=$new_zone"
388  # benannte Zone in eine unbenannte umwandeln
389  sed -i "s/^config zone 'zone_$old_zone'$/config zone/g" /etc/config/firewall
390  # aktualisiere alle Forwardings, Redirects und Regeln
391  for section in "forwarding" "redirect" "rule"; do
392  for key in "src" "dest"; do
393  for uci_prefix in $(find_all_uci_sections firewall "$section" "${key}=$old_zone"); do
394  uci set "${uci_prefix}.${key}=$new_zone"
395  done
396  done
397  done
398  apply_changes firewall
399 }
400 
401 
402 ## @fn move_wifidog_networks_to_captive_portal()
403 ## @brief Änderung des Netzwerk-Namens für offene Zugangspunkte von "free" zu "on_free".
404 ## @details Bis v0.4-5 hieß das wifidog-Netzwerk "free". Ab v0.5.2 heißt es "on_free".
405 move_wifidog_networks_to_captive_portal() {
406  trap 'error_trap move_wifidog_networks_to_captive_portal "$*"' EXIT
407  local old_name="free"
408  local new_name="${NETWORK_FREE:-}"
409  # das on-captive-portal-Paket ist nicht installiert - keine Aenderungen
410  [ -z "$new_name" ] && return 0
411  local old_interfaces
412  local uci_prefix
413  # das alte Interface existiert nicht? Weitermachen ...
414  [ -z "$(uci_get "network.$old_name")" ] && return 0
415  # neues Interface anlegen, falls es noch nicht existieren sollte
416  # (das migrations-Skript wird vor dem on-captive-portal-Skript via uci-defaults ausgefuehrt)
417  configure_free_network
418  # die nicht-wifi-Netzwerke übertragen
419  old_interfaces=$(uci_get "network.${old_name}.ifname")
420  # das Interface muss immer angegeben sein (oder "none")
421  uci set "network.${new_name}.ifname=${old_interfaces:-none}"
422  # alle wifi-Interfaces verschieben
423  for uci_prefix in $(find_all_uci_sections "wireless" "wifi-iface" "network=$old_name"); do
424  uci set "${uci_prefix}.network=$new_name"
425  done
426  # fertig: wir ignorieren das Bridge-Attribute - es ist nicht mehr erforderlich (und selten noetig)
427  uci_delete "network.$old_name"
428  apply_changes network wireless
429 }
430 
431 
432 ## @fn remove_wifidog_alias_interface()
433 ## @brief Entferne ein Alias-Interface, das für das wifidog-Setup verwendet wurde.
434 ## @details Bis Version 0.4-5 wurde wifidog mit einem lokalen Alias-Interface konfiguriert, um
435 ## die Umlenkung von Paketen via REDIRECT zu ermöglichen.
436 remove_wifidog_alias_interface() {
437  trap 'error_trap remove_wifidog_alias_interface "$*"' EXIT
438  local uci_prefix
439  for uci_prefix in $(find_all_uci_sections "network" "alias" "interface=free"); do
440  uci_delete "$uci_prefix"
441  done
442  apply_changes network
443 }
444 
445 
446 ## @fn remove_opennet_ca_certificates_from_previous_location()
447 ## @brief Löschung alter CA-Dateien an nicht mehr verwendeten Orten.
448 ## @details Bis Version v0.5.1 wurden die CA-Zertifikate für die OpenVPN-Verbindungen
449 ## im openvpn-Verzeichnis neben den persönlichen Schlüsseln und Zertifikaten gespeichert.
450 ## Da diese Verzeichnisse jedoch von luci als zu erhaltender Bereich bei einem Upgrade
451 ## konfiguriert ist (luci.flash_keep.openvpn=/etc/openvpn), blieben diese Dateien bei einem
452 ## Upgrade der Firmware unverändert. Der Austausch eines CA-Zertifikats war somit nicht
453 ## möglich.
454 ## Mit der Verschiebung aller Opennet-Zertifikate an einen nicht-zu-sichernden Ort
455 ## (/etc/ssl/certs/opennet-initiative.de) können nun die alten CA-Zertifikate an ihrem ursprünglichen
456 ## Ort gelöscht werden.
457 ## Folgende Orte sind betroffen:
458 ## /etc/openvpn/opennet_user/opennet-ca.crt
459 ## /etc/openvpn/opennet_ugw/opennet-ca_ugws.crt
460 ## /etc/openvpn/opennet_vpntest/opennet-ca.crt
461 remove_opennet_ca_certificates_from_previous_location() {
462  trap 'error_trap remove_opennet_ca_certificates_from_previous_location "$*"' EXIT
463  rm -f /etc/openvpn/opennet_user/opennet-ca.crt
464  rm -f /etc/openvpn/opennet_ugw/opennet-ca_ugws.crt
465  rm -f /etc/openvpn/opennet_vpntest/opennet-ca.crt
466 }
467 
468 
469 ## @fn remove_openvpn_vpntest_keydir()
470 ## @brief Dieses Verzeichnis ist mindestens seit v0.5.2 nicht mehr in Nutzung.
471 remove_openvpn_vpntest_keydir() {
472  trap 'error_trap remove_openvpn_vpntest_keydir "$*"' EXIT
473  rm -rf /etc/openvpn/vpntest/
474 }
475 
476 
477 ## @fn remove_wifidog_config()
478 ## @brief Lösche die nicht mehr verwendete Konfiguration von "wifidog" und "on-wifidog".
479 ## @details Die Konfiguration enthält keine relevanten Inhalte mehr, die zu übertragen wären.
480 remove_wifidog_config() {
481  trap 'error_trap remove_wifidog_config "$*"' EXIT
482  rm -f /etc/config/on-wifidog
483  uci_delete luci.flash_keep.wifidog
484  rm -f /etc/wifidog.conf
485 }
486 
487 
488 ## @fn enable_uhttpd_redirect()
489 ## @brief Aktiviere die automatische https-Weiterleitung
490 ## @details Bei einer Aktualisierung von v0.5.1 auf v0.5.2 fehlt diese Einstellung andernfalls, da
491 ## zuvor keine https-Unterstützung in der Firmware aktiviert war.
492 enable_uhttpd_redirect() {
493  trap 'error_trap enable_uhttpd_redirect "$*"' EXIT
494  local uci_key="uhttpd.main.redirect_https"
495  [ -n "$(uci_get "$uci_key")" ] && return 0
496  uci set "$uci_key=1"
497  uci commit uhttpd
498  reload_config
499 }
500 
501 
502 ## @fn guess_previously_used_modules()
503 ## @brief Versuche nach der Aktualisierung von einer Version vor v0.5.2 die zuvor verwendeten Module zu erraten.
504 ## @details Die Firmware-Versionen vor v0.5.2 enthielten alle Module vorinstalliert. Ab v0.5.2 werden Module bei
505 ## Bedarf nachinstalliert. Beim Übergang von Komplett- zu Bedarfsinstallation versuchen wir die vorherige
506 ## Nutzungsform zu erraten und die dazu passende Modulliste zu speichern.
507 guess_previously_used_modules() {
508  trap 'error_trap guess_previously_used_modules "$*"' EXIT
509  local module
510  # falls bereits etwas in der uci-Sektion gespeichert wurde, ist keine Nachbereitung noetig
511  [ -n "$(uci -q show "on-core.modules")" ] && return 0
512  # Zweig anlegen
513  uci set "on-core.modules=modules"
514  # prüfe ob relevante Dateien vorhanden sind, die die jeweiligen Module benutzen würden
515  [ -e "/etc/openvpn/opennet_user/on_aps.crt" ] \
516  && uci_add_list "on-core.modules.installed" "on-openvpn"
517  [ -e "/etc/openvpn/opennet_ugw/on_aps.crt" ] \
518  && uci_add_list "on-core.modules.installed" "on-usergw"
519  [ -e "/etc/wifidog.conf" ] \
520  && uci_add_list "on-core.modules.installed" "on-captive-portal"
521  [ -e "/etc/xinetd.d/munin" ] \
522  && uci_add_list "on-core.modules.installed" "on-monitoring"
523  # enable default modules
524  for module in $DEFAULT_MODULES_ENABLED; do
525  enable_on_module "$module"
526  done
527 }
528 
529 
530 ## @fn remove_pre05_usergateway_olsr_announcement()
531 ## @brief Entferne das veraltete UGW-Announcierungsformat von Firmware v0.4-x.
532 ## Beispiel:
533 ## olsrd.cfg0c4e54.service=http://192.168.0.42:8080|tcp|ugw upload:50 download:350 ping:27
534 remove_pre05_usergateway_olsr_announcement() {
535  trap 'error_trap remove_pre05_usergateway_olsr_announcement "$*"' EXIT
536  uci -X show olsrd | grep -q '^olsrd.cfg[^.]\+.service=http://.*:8080|tcp|ugw' || return 0
537  sed -i '/option service .http:\/\/.*|tcp|ugw/d' /etc/config/olsrd
538  /etc/init.d/olsrd restart || true
539 }
540 
541 
542 ## @fn remove_pre05_usergateway_tap_interfaces()
543 ## @brief Entferne alte "on_tapX"-Interfaces, die in dem UGW-Modul bis Firmware v0.4-5 verwendet wurden.
544 remove_pre05_usergateway_tap_interfaces() {
545  trap 'error_trap remove_pre05_usergateway_tap_interfaces "$*"' EXIT
546  local netnum
547  for netnum in 0 1 2 3 4; do
548  uci_delete "network.on_tap${netnum}"
549  done
550  apply_changes network
551 }
552 
553 
554 ## @fn remove_pre05_on_usergw_settings()
555 ## @brief Seit v0.5.2 verwendet das on-usergw-Modul keine uci-Einstellungen mehr.
556 remove_pre05_on_usergw_settings() {
557  trap 'error_trap remove_pre05_on_usergw_settings "$*"' EXIT
558  rm -f /etc/config/on-usergw
559 }
560 
561 
562 ## @fn auto_enable_on_free_network()
563 ## @brief In v0.5.2 wurde das on-free-Netzwerk als auto=0 konfiguriert. Darauffolgende Versionen
564 ## erwarten auto=1.
565 auto_enable_on_free_network() {
566  [ -z "${ZONE_FREE:-}" ] && return 0
567  local uci_prefix="network.$NETWORK_FREE"
568  [ -n "$(uci_get "$uci_prefix")" ] && uci set "${uci_prefix}.auto=1"
569  apply_changes network
570 }
571 
572 
573 ## @fn rename_gpio_switch_poe_passthrough
574 ## @brief Im Dezember 2015 (siehe 67e1c8701215724dcee9fabcbd7a397ea76e1a9d) wurde im openwrt-
575 ## Repository das Config-Sektions-Präfix 'gpio_switch_' von steuerbaren GPIO-Signalen
576 ## entfernt. Somit wollen wir auf Geräten mit alten Einstellungen diese über die neu
577 ## generierten Vorgabeeinstellungen schreiben.
578 rename_gpio_switch_poe_passthrough() {
579  # keine alten Einstellungen? Nichts zu tun ...
580  [ -z "$(uci_get "system.gpio_switch_poe_passthrough")" ] && return 0
581  # sicherheitshalber neu generierten Zustand loeschen (der Schaltzustand wird "aus" sein)
582  uci_delete "system.poe_passthrough"
583  # alte Einstellungen an neue Stelle schreiben
584  uci rename system.gpio_switch_poe_passthrough=poe_passthrough
585  uci commit system
586  reload_config
587 }
588 
589 
590 ## @fn rename_tun_to_tun_on_user
591 ## @brief Vor v0.5.4 wurde das Netzwerk-Interface des Nutzer-VPN durch openvpn mit dem automatisch
592 ## vergebenen Namen "tun0" bezeichnet.
593 ## Aufgrund potentieller Uneindeutigkeit durch Timing-Probleme heißt das Interface seit
594 ## v0.5.4 "tun-on-user".
595 rename_tun_to_tun_on_user() {
596  [ "$(uci_get "network.on_vpn.ifname")" = "tun0" ] || return 0
597  uci set "network.on_vpn.ifname=tun-on-user"
598  uci commit network
599  reload_config
600 }
601 
602 
603 ## @fn update_olsrd_plugin_versions()
604 ## @brief Aktualisiere die in der olsrd-Konfigurationsdatei angegebenen Versionen der Plugins.
605 ## @details Leider verwendet olsrd ein starres Konzept der Plugin-Referenzierung
606 ## (inkl. so-Version). Dies benoetigt manuelle Anpassungen.
607 update_olsrd_plugin_versions() {
608  trap 'error_trap update_olsrd_plugin_versions "$*"' EXIT
609  local uci_prefix
610  local configured_library
611  for uci_prefix in $(find_all_uci_sections "olsrd" "LoadPlugin"); do
612  configured_library=$(uci_get "${uci_prefix}.library")
613  while read -r library_name library_version; do
614  echo "$configured_library" | grep -q "^$library_name"'\.so\.' || continue
615  [ "$configured_library" = "$library_name.so.$library_version" ] && continue
616  uci set "${uci_prefix}.library=$library_name.so.$library_version"
617  done <<EOF
618  olsrd_jsoninfo 1.1
619  olsrd_nameservice 0.4
620  olsrd_txtinfo 1.1
621 EOF
622  done
623  apply_changes olsrd
624 }
625 
626 
627 ## @fn update_uhttpd_configuration()
628 ## @brief Setze fehlende Einstellungen in /etc/config/uhttpd.
629 ## @details Seit v0.5.5 sind in der Upstream-Konfiguration die beiden Einstellungen
630 ## "uhttpd.main.lua_prefix" und "uhttpd.main.lua_handler" gesetzt. Bei der Aktualisierung von
631 ## einer älteren Firmware fehlen diese Einstellungen naturgemäß.
632 ## Ohne diese Einstellungen wird ein HTTP-Request des root-Pfads ("/") mit einer Umleitung nach
633 ## /luci beantwortet, obwohl uhttpd (per default) auf /cgi-bin/luci lauscht.
634 update_uhttpd_configuration() {
635  trap 'error_trap update_uhttpd_configuration "$*"' EXIT
636  [ -e "/etc/config/uhttpd" ] || return 0
637  [ -z "$(uci_get "uhttpd.main.lua_prefix")" ] || return 0
638  [ -z "$(uci_get "uhttpd.main.lua_handler")" ] || return 0
639  uci set "uhttpd.main.lua_prefix=/luci"
640  uci set "uhttpd.main.lua_handler=/usr/lib/lua/luci/sgi/uhttpd.lua"
641  uci commit uhttpd
642  reload_config
643 }
644 
645 
646 coerce_openvpn_comp_lzo
647 fix_passwd_broken_symlink
648 fix_rclocal_broken_symlink
649 migrate_uci_definition_changes
650 fix_firewall_reload
651 transfer_vpn_sort_criteria_and_autosearch
652 remove_tunnel_openvpn_settings
653 remove_obsolete_on_core_settings
654 remove_obsolete_usergw_settings
655 remove_usergw_openvpn_configs
656 remove_crontab_entries
657 rename_olsrd_port_to_port
658 remove_ntpclient_config
659 
660 # Bis Version 0.4-5 hiess die Opennet-Mesh-Firewall-Zone "opennet".
661 # Mit Version 0.5 wurde die Zone in "on_mesh" umbenannt.
662 rename_firewall_zone "opennet" "$ZONE_MESH"
663 
664 # mit Version 0.5.2 wird wifidog durch on-captive-portal ersetzt
665 move_wifidog_networks_to_captive_portal
666 remove_wifidog_alias_interface
667 # Bis Version 0.4-5 hieß die wifidog-Zone "free".
668 # Mit Version 0.5.2 wurde die Zone in "on_free" umbenannt.
669 # Da die alte Zone falsch konfiguriert war ("FORWARD=yes"), werfen wir sie lieber einfach weg.
671 apply_changes firewall
672 
673 disable_unwanted_forward
674 move_mtu_fix_to_target_zone
675 
676 # Bis Version 0.4-5 wurden ins lokale Netz eingehende Pakete (z.B. Portweiterleitungen) via SNAT maskiert.
677 # siehe https://dev.opennet-initiative.de/ticket/73
678 uci_delete firewall.zone_local.masq
679 apply_changes firewall
680 
681 # Bis Version 0.4-5 hiess die lokale Zone "local" - bei barrier breaker heisst sie nun "lan"
682 rename_firewall_zone "local" "$ZONE_LOCAL"
683 
684 # Diese Aktion startet mit 10 Minuten Verzoegerung im Hintergrund, um vorher ein Empfangen der
685 # olsrd-Announcements zu ermoeglichen. Falls keine alten Gateway-Definitionen vorhanden sind,
686 # ist dies nicht noetig.
687 [ -n "$(uci_get on-openvpn.gateway)" ] && run_delayed_in_background 600 transfer_gateway_uci_settings
688 
689 remove_opennet_ca_certificates_from_previous_location
690 remove_openvpn_vpntest_keydir
691 # die Pruefung muss vor der Loeschung der wifidog-Konfiguration stattfinden
692 guess_previously_used_modules
693 remove_wifidog_config
694 enable_uhttpd_redirect
695 remove_pre05_usergateway_olsr_announcement
696 remove_pre05_usergateway_tap_interfaces
697 remove_pre05_on_usergw_settings
698 auto_enable_on_free_network
699 rename_gpio_switch_poe_passthrough
700 rename_tun_to_tun_on_user
701 update_olsrd_plugin_versions
702 update_uhttpd_configuration
uci_delete(uci_path)
Lösche ein UCI-Element.
Definition: uci.sh:46
local key
Definition: core.sh:85
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
Definition: core.sh:15
delete_firewall_zone(zone)
Lösche eine Firewall-Zone, sowie alle Regeln, die sich auf diese Zone beziehen.
Definition: network.sh:66
set eu on function print_services services log for dir in etc on services d var on services volatile d
Definition: services:13
done
Definition: core.sh:85