3# Dieses Skript enthaelt Funktionen, die fuer Updates altes Firmware-Versionen notwendig sind.
4# Alle Funktionen muessen idempotent sein.
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).
14# shellcheck source=opennet/packages/on-core/files/usr/lib/opennet/on-helper.sh
15.
"${IPKG_INSTROOT:-}/usr/lib/opennet/on-helper.sh"
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
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 :(
30 if ((($1 == "option") || ($1 == "list")) && ($2 == "'"$optname"'")) {
34 printf
" list %s '"'%s'"'\n", $2, $i
39 }}
' "$filename" | update_file_if_changed "$filename" && apply_changes "$config"
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"
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
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
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
86 # falls bereits etwas in der uci-Sektion gespeichert wurde, ist keine Nachbereitung noetig
87 [ -n "$(uci -q show "on-core.modules")" ] && return 0
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"
106## @fn auto_enable_on_free_network()
107## @brief In v0.5.2 wurde das on-free-Netzwerk als auto=0 konfiguriert. Darauffolgende Versionen
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
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
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"
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
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"
163 olsrd_nameservice 0.4
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"
190migrate_uci_definition_changes
191# die Pruefung muss vor der Loeschung der wifidog-Konfiguration stattfinden
192guess_previously_used_modules
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