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 # wandele Leerzeichen-getrennte "option"-Eintraege in "list"-Eintraege um
19 _convert_uci_option_to_list() {
20  trap 'error_trap _convert_uci_option_to_list "$*"' EXIT
21  local config="$1"
22  local optname="$2"
23  local filename="/etc/config/$config"
24  # Zeilen der Form " option $optname 'foo bar'" werden in mehrere " option $optname '$ITEM'"-Zeilen verwandelt
25  # Wir korrigieren dabei sowohl "option"- als auch "list"-Elemente sofern ihr Inhalt Leerzeichen enthält.
26  # Dies ist notwendig, da schon vor dem Ausführen dieses Migrationsskripts beim Booten "uci add_list" angewandt
27  # wird - dies verwandelt die Leerzeichen-separierte alte "option" in eine unveränderte "list". Also müssen wir
28  # leider blind nachkorrigieren :(
29  awk '{
30  if ((($1 == "option") || ($1 == "list")) && ($2 == "'"$optname"'")) {
31  i = 3
32  while (i <= NF) {
33  gsub(/'\''/, "", $i)
34  printf " list %s '"'%s'"'\n", $2, $i
35  i++
36  }
37  } else {
38  print $0
39  }}' "$filename" | update_file_if_changed "$filename" && apply_changes "$config"
40  true
41 }
42 
43 
44 # Gelegentlich ändert openwrt die Definition einzelner Variablen. Dies müssen wir via Migration nachbereiten.
45 migrate_uci_definition_changes() {
46  trap 'error_trap migrate_uci_definition_changes "$*"' EXIT
47  # vor Barrier Breaker war "firewall.ZONE.network" eine "option" - anschliessed wurde es zur "list"
48  # TODO insert your migrations here
49  # e.g. _convert_uci_option_to_list "firewall" "network"
50 }
51 
52 
53 ## @fn remove_wifidog_config()
54 ## @brief Lösche die nicht mehr verwendete Konfiguration von "wifidog" und "on-wifidog".
55 ## @details Die Konfiguration enthält keine relevanten Inhalte mehr, die zu übertragen wären.
56 remove_wifidog_config() {
57  trap 'error_trap remove_wifidog_config "$*"' EXIT
58  rm -f /etc/config/on-wifidog
59  uci_delete luci.flash_keep.wifidog
60  rm -f /etc/wifidog.conf
61 }
62 
63 
64 ## @fn enable_uhttpd_redirect()
65 ## @brief Aktiviere die automatische https-Weiterleitung
66 ## @details Bei einer Aktualisierung von v0.5.1 auf v0.5.2 fehlt diese Einstellung andernfalls, da
67 ## zuvor keine https-Unterstützung in der Firmware aktiviert war.
68 enable_uhttpd_redirect() {
69  trap 'error_trap enable_uhttpd_redirect "$*"' EXIT
70  local uci_key="uhttpd.main.redirect_https"
71  [ -n "$(uci_get "$uci_key")" ] && return 0
72  uci set "$uci_key=1"
73  uci commit uhttpd
74  reload_config
75 }
76 
77 
78 ## @fn guess_previously_used_modules()
79 ## @brief Versuche nach der Aktualisierung von einer Version vor v0.5.2 die zuvor verwendeten Module zu erraten.
80 ## @details Die Firmware-Versionen vor v0.5.2 enthielten alle Module vorinstalliert. Ab v0.5.2 werden Module bei
81 ## Bedarf nachinstalliert. Beim Übergang von Komplett- zu Bedarfsinstallation versuchen wir die vorherige
82 ## Nutzungsform zu erraten und die dazu passende Modulliste zu speichern.
83 guess_previously_used_modules() {
84  trap 'error_trap guess_previously_used_modules "$*"' EXIT
85  local module
86  # falls bereits etwas in der uci-Sektion gespeichert wurde, ist keine Nachbereitung noetig
87  [ -n "$(uci -q show "on-core.modules")" ] && return 0
88  # Zweig anlegen
89  uci set "on-core.modules=modules"
90  # prüfe ob relevante Dateien vorhanden sind, die die jeweiligen Module benutzen würden
91  [ -e "/etc/openvpn/opennet_user/on_aps.crt" ] \
92  && uci_add_list "on-core.modules.installed" "on-openvpn"
93  [ -e "/etc/openvpn/opennet_ugw/on_aps.crt" ] \
94  && uci_add_list "on-core.modules.installed" "on-usergw"
95  [ -e "/etc/wifidog.conf" ] \
96  && uci_add_list "on-core.modules.installed" "on-captive-portal"
97  [ -e "/etc/xinetd.d/munin" ] \
98  && uci_add_list "on-core.modules.installed" "on-monitoring"
99  # enable default modules
100  for module in $DEFAULT_MODULES_ENABLED; do
101  enable_on_module "$module"
102  done
103 }
104 
105 
106 ## @fn auto_enable_on_free_network()
107 ## @brief In v0.5.2 wurde das on-free-Netzwerk als auto=0 konfiguriert. Darauffolgende Versionen
108 ## erwarten auto=1.
109 auto_enable_on_free_network() {
110  [ -z "${ZONE_FREE:-}" ] && return 0
111  local uci_prefix="network.$NETWORK_FREE"
112  [ -n "$(uci_get "$uci_prefix")" ] && uci set "${uci_prefix}.auto=1"
113  apply_changes network
114 }
115 
116 
117 ## @fn rename_gpio_switch_poe_passthrough
118 ## @brief Im Dezember 2015 (siehe 67e1c8701215724dcee9fabcbd7a397ea76e1a9d) wurde im openwrt-
119 ## Repository das Config-Sektions-Präfix 'gpio_switch_' von steuerbaren GPIO-Signalen
120 ## entfernt. Somit wollen wir auf Geräten mit alten Einstellungen diese über die neu
121 ## generierten Vorgabeeinstellungen schreiben.
122 rename_gpio_switch_poe_passthrough() {
123  # keine alten Einstellungen? Nichts zu tun ...
124  [ -z "$(uci_get "system.gpio_switch_poe_passthrough")" ] && return 0
125  # sicherheitshalber neu generierten Zustand loeschen (der Schaltzustand wird "aus" sein)
126  uci_delete "system.poe_passthrough"
127  # alte Einstellungen an neue Stelle schreiben
128  uci rename system.gpio_switch_poe_passthrough=poe_passthrough
129  uci commit system
130  reload_config
131 }
132 
133 
134 ## @fn rename_tun_to_tun_on_user
135 ## @brief Vor v0.5.4 wurde das Netzwerk-Interface des Nutzer-VPN durch openvpn mit dem automatisch
136 ## vergebenen Namen "tun0" bezeichnet.
137 ## Aufgrund potentieller Uneindeutigkeit durch Timing-Probleme heißt das Interface seit
138 ## v0.5.4 "tun-on-user".
139 rename_tun_to_tun_on_user() {
140  [ "$(uci_get "network.on_vpn.device")" = "tun0" ] || return 0
141  uci set "network.on_vpn.device=tun-on-user"
142  uci commit network
143  reload_config
144 }
145 
146 
147 ## @fn update_olsrd_plugin_versions()
148 ## @brief Aktualisiere die in der olsrd-Konfigurationsdatei angegebenen Versionen der Plugins.
149 ## @details Leider verwendet olsrd ein starres Konzept der Plugin-Referenzierung
150 ## (inkl. so-Version). Dies benoetigt manuelle Anpassungen.
151 update_olsrd_plugin_versions() {
152  trap 'error_trap update_olsrd_plugin_versions "$*"' EXIT
153  local uci_prefix
154  local configured_library
155  for uci_prefix in $(find_all_uci_sections "olsrd" "LoadPlugin"); do
156  configured_library=$(uci_get "${uci_prefix}.library")
157  while read -r library_name library_version; do
158  echo "$configured_library" | grep -q "^$library_name"'\.so\.' || continue
159  [ "$configured_library" = "$library_name.so.$library_version" ] && continue
160  uci set "${uci_prefix}.library=$library_name.so.$library_version"
161  done <<EOF
162  olsrd_jsoninfo 1.1
163  olsrd_nameservice 0.4
164  olsrd_txtinfo 1.1
165 EOF
166  done
167  apply_changes olsrd
168 }
169 
170 
171 ## @fn update_uhttpd_configuration()
172 ## @brief Setze fehlende Einstellungen in /etc/config/uhttpd.
173 ## @details Seit v0.5.5 sind in der Upstream-Konfiguration die beiden Einstellungen
174 ## "uhttpd.main.lua_prefix" und "uhttpd.main.lua_handler" gesetzt. Bei der Aktualisierung von
175 ## einer älteren Firmware fehlen diese Einstellungen naturgemäß.
176 ## Ohne diese Einstellungen wird ein HTTP-Request des root-Pfads ("/") mit einer Umleitung nach
177 ## /luci beantwortet, obwohl uhttpd (per default) auf /cgi-bin/luci lauscht.
178 update_uhttpd_configuration() {
179  trap 'error_trap update_uhttpd_configuration "$*"' EXIT
180  [ -e "/etc/config/uhttpd" ] || return 0
181  [ -z "$(uci_get "uhttpd.main.lua_prefix")" ] || return 0
182  [ -z "$(uci_get "uhttpd.main.lua_handler")" ] || return 0
183  uci set "uhttpd.main.lua_prefix=/luci"
184  uci set "uhttpd.main.lua_handler=/usr/lib/lua/luci/sgi/uhttpd.lua"
185  uci commit uhttpd
186  reload_config
187 }
188 
189 
190 migrate_uci_definition_changes
191 # die Pruefung muss vor der Loeschung der wifidog-Konfiguration stattfinden
192 guess_previously_used_modules
193 remove_wifidog_config
194 enable_uhttpd_redirect
195 auto_enable_on_free_network
196 rename_gpio_switch_poe_passthrough
197 rename_tun_to_tun_on_user
198 update_olsrd_plugin_versions
199 update_uhttpd_configuration