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
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'
25setup_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}.device=$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.
59add_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
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."
112esac 2>&1 | logger -t mesh-updown
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
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.
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"...
log_openvpn_events_and_disconnect_if_requested()
Allgemeines Ereignisbehandlung fuer openvpn-Verbindungen: Logging und eventuell Dienst-Bereinigung (n...
uci_delete(uci_path)
Lösche ein UCI-Element.
set eu grep root::etc shadow exit if command v chpasswd dev null