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.
45migrate_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.
56remove_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.
68enable_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.
83guess_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.
109auto_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.
122rename_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".
139rename_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.
151update_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
165EOF
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.
178update_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
190migrate_uci_definition_changes
191# die Pruefung muss vor der Loeschung der wifidog-Konfiguration stattfinden
192guess_previously_used_modules
193remove_wifidog_config
194enable_uhttpd_redirect
195auto_enable_on_free_network
196rename_gpio_switch_poe_passthrough
197rename_tun_to_tun_on_user
198update_olsrd_plugin_versions
199update_uhttpd_configuration