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