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 # 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) 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
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 34 echo
"$line" | grep -q
"1$" && new_value=yes
35 key=$(echo
"$line" | cut -f 1 -
d =)
36 uci
set "$key=$new_value" 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
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" 55 # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox 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 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
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 83 # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox 85 # Put your custom commands here that should be executed once 86 # the system init finished. By default this file does nothing. 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
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 :( 107 if ((($1 == "option") || ($1 == "list")) && ($2 == "'"$optname"'")) { 111 printf
" list %s '"'%s'"'\n", $2, $i
116 }}
' "$filename" | update_file_if_changed "$filename" && apply_changes "$config" 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" 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. 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 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" 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 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" 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" 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 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 193 elif [ "$autosearch" = "off" ]; then 195 elif [ "$sort_criteria" = "metric" ]; then 200 uci set "on-core.settings.service_sorting=$result" 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" 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 223 for uci_prefix in $(find_all_uci_sections "openvpn" "openvpn" | grep '^openvpn\.opennet_ugw_
'); do 224 uci delete "$uci_prefix" 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 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 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" 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 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" 295 uci_delete "$uci_prefix" 297 uci_delete on-openvpn.gateways 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" 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 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" 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 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" 355 apply_changes firewall 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 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 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" 398 apply_changes firewall 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 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" 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 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 439 for uci_prefix in $(find_all_uci_sections "network" "alias" "interface=free"); do 440 uci_delete "$uci_prefix" 442 apply_changes network 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 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 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/ 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 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 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 510 # falls bereits etwas in der uci-Sektion gespeichert wurde, ist keine Nachbereitung noetig 511 [ -n "$(uci -q show "on-core.modules")" ] && return 0 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" 530 ## @fn remove_pre05_usergateway_olsr_announcement() 531 ## @brief Entferne das veraltete UGW-Announcierungsformat von Firmware v0.4-x. 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:
537 sed -i
'/option service .http:\/\/.*|tcp|ugw/d' /etc/config/olsrd
538 /etc/init.d/olsrd restart ||
true 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
547 for netnum in 0 1 2 3 4;
do 550 apply_changes network
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
562 ## @fn auto_enable_on_free_network() 563 ## @brief In v0.5.2 wurde das on-free-Netzwerk als auto=0 konfiguriert. Darauffolgende Versionen 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
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) 583 # alte Einstellungen an neue Stelle schreiben 584 uci rename system.gpio_switch_poe_passthrough=poe_passthrough
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" 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
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" 619 olsrd_nameservice 0.4
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" 646 coerce_openvpn_comp_lzo
647 fix_passwd_broken_symlink
648 fix_rclocal_broken_symlink
649 migrate_uci_definition_changes
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
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" 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
673 disable_unwanted_forward
674 move_mtu_fix_to_target_zone
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 679 apply_changes firewall
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" 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
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.
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
delete_firewall_zone(zone)
Lösche eine Firewall-Zone, sowie alle Regeln, die sich auf diese Zone beziehen.
set eu on function print_services services log for dir in etc on services d var on services volatile d