5 # Copyright 2015 Lars Kruse <devel@sumpfralle.de> 7 # Licensed under the Apache License, Version 2.0 (the "License"); 8 # you may not use this file except in compliance with the License. 9 # You may obtain a copy of the License at 11 # http://www.apache.org/licenses/LICENSE-2.0 15 # shellcheck source=opennet/packages/on-core/files/usr/lib/opennet/on-helper.sh 16 .
"${IPKG_INSTROOT:-}/usr/lib/opennet/on-helper.sh" 21 echo
"$ifname" | sed
's/[^0-9a-zA-Z]/_/g' 25 setup_mesh_interface() {
28 netname=$(get_netname
"$ifname")
29 uci
set "network.${netname}=interface" 30 uci
set "network.${netname}.proto=none" 31 # wir duerfen das Interface nicht via uci hinzufuegen - andernfalls verliert das Interface durch netifd seine Konfiguration
33 #uci
set "network.${netname}.ifname=$ifname" 34 ubus call network reload
36 apply_changes network firewall
37 # indirekte Interface/Network-Zuordnung (siehe obigen Mailinglisten-Beitrag)
38 # Auf diesem Weg bleibt die IP-Konfiguration des Device erhalten. 39 local ubus_dev=
"network.interface.${netname}" 40 ubus call
"$ubus_dev" add_device
'{ "name": "'"$ifname"'" }' 41 # die obige ubus-Aktion wird nebenlaeufig abgearbeitet - wir muessen das Ergebnis abwarten 42 ubus -t 10 wait_for
"$ubus_dev" 43 # expliziter olsrd-Neustart: eventuell sind noch Fragmente alter tap-Devices in 44 # der olsrd-Konfiguration eingetragen. Diese verhindern einen olsrd-Neustart, 45 # da es scheinbar keine Änderung gab. 46 /etc/init.d/olsrd restart ||
true 47 # ohne dieses explizite reload reagiert die firewall seltsamerweise nicht auf die neuen Interfaces 48 /etc/init.d/firewall reload
49 # iu Kuerze moege die olsr-Interface-Liste neu erstellt werden (inkl. des neuen Interface) 50 echo
"on-function update_mesh_interfaces" | schedule_task
54 # UGWs ohne lokale Mesh-Interfaces sollen auch über ihre Main-IP erreichbar sein 55 # Wir konfigurieren die Main-IP abseits von uci manuell als /32-Adresse. Es gibt also keine 56 # Beeinflussung des Routings. Die zusätzliche Adresse wird nur konfiguriert, falls die Main-IP 57 # nicht bereits auf einem realen Interface aktiv ist (siehe "ip addr show"). 58 # Die zusätzliche Adresse wird auf dem loopback-Interface konfiguriert. 59 add_main_ip_if_missing() {
62 main_ip=$(get_main_ip)
63 # irgendwie kein Main-IP? Ignorieren ...
64 [ -z
"$main_ip" ] &&
return 0
65 # Ist auf einem Interface bereits diese Adresse aktiv?
66 # In diesem Fall müssen wir nichts tun.
67 ip addr show | grep -qwF
"inet $main_ip" &&
return 0
68 ip addr add
"$main_ip/32" dev lo scope host
75 # "script_type" wird von openvpn als Umgebungsvariable definiert (up/down). 76 # shellcheck disable=SC2154 77 case "$script_type" in
79 setup_mesh_interface
"$dev" 80 add_main_ip_if_missing
"$dev" 83 netname=$(get_netname
"$dev")
86 default_route=$(ip route show | grep ^
default | head -1)
87 # firewall-Reload erzeugt viele Status-Zeilen - wir wollen das Log nicht ueberfuellen
88 apply_changes network firewall 2>/dev/
null 89 # Aus irgendeinem Grund kann die lokale
default-Route verloren gehen, wenn
90 #
"apply_changes network" ausgeführt wird.
92 # * manuelles Töten eines Mesh-VPN-Prozess
93 # *
default-Route in der main-Table fehlt
94 # *
"ifup wan" behebt das Problem
95 # Wir prüfen also, ob die
default-Route verlorenging und fügen sie notfalls erneut hinzu.
96 ip route show | grep -q ^
default || {
97 if [ -n
"$default_route" ]; then
98 # Es gab eine vorherige Route, die wir wiederherstellen können.
99 add_banner_event "Lost default route during 'down' event of mesh VPN. Adding it again." 100 # shellcheck disable=SC2086
101 ip route replace $default_route 2>/dev/
null 103 # Schon vor dem
"down"-Event gab es keine
default-Route - wir
104 # verwenden also die allgemeine Korrektur-Funktion.
105 # Das
"banner"-Event wird durch die
"fix"-Funktion erzeugt - also nur
"info".
106 msg_info "Detected lost default route during 'down' event of mesh VPN. Adding it again." 112 esac 2>&1 | logger -t mesh-updown
uci_delete(uci_path)
Lösche ein UCI-Element.
add_banner_event(event, timestamp)
Füge ein Ereignis zum dauerhaften Ereignisprotokoll (/etc/banner) hinzu.
add_interface_to_zone()
Fuege ein logisches Netzwerk-Interface zu einer Firewall-Zone hinzu.
log_openvpn_events_and_disconnect_if_requested()
Allgemeines Ereignisbehandlung fuer openvpn-Verbindungen: Logging und eventuell Dienst-Bereinigung (n...
set eu grep root::etc shadow exit if command v chpasswd dev null
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
del_interface_from_zone()
Entferne ein logisches Interface aus einer Firewall-Zone.
fix_wan_route_if_missing()
Prüfe, ob die default-Route trotz aktivem WAN-Interface fehlt. In diesem Fall füge sie mit "ifup wan"...