Opennet Firmware
mesh_openvpn_updown.sh
gehe zur Dokumentation dieser Datei
1#!/bin/sh
2#
3# Opennet Firmware
4#
5# Copyright 2015 Lars Kruse <devel@sumpfralle.de>
6#
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
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13
14
15# shellcheck source=opennet/packages/on-core/files/usr/lib/opennet/on-helper.sh
16. "${IPKG_INSTROOT:-}/usr/lib/opennet/on-helper.sh"
17
18
19get_netname() {
20 local ifname="$1"
21 echo "$ifname" | sed 's/[^0-9a-zA-Z]/_/g'
22}
23
24
25setup_mesh_interface() {
26 local ifname="$1"
27 local netname
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
32 # siehe https://lists.openwrt.org/pipermail/openwrt-devel/2015-June/033501.html
33 #uci set "network.${netname}.device=$ifname"
34 ubus call network reload
35 add_interface_to_zone "$ZONE_MESH" "$netname"
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
51}
52
53
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() {
60 local dev="$1"
61 local main_ip
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
69}
70
71
73
74
75# "script_type" wird von openvpn als Umgebungsvariable definiert (up/down).
76# shellcheck disable=SC2154
77case "$script_type" in
78 up)
79 setup_mesh_interface "$dev"
80 add_main_ip_if_missing "$dev"
81 ;;
82 down)
83 netname=$(get_netname "$dev")
84 del_interface_from_zone "$ZONE_MESH" "$netname"
85 uci_delete "network.${netname}"
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.
91 # Reproduzierbarkeit:
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
102 else
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."
108 fi
109 true
110 }
111 ;;
112esac 2>&1 | logger -t mesh-updown
113
114exit 0
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
Definition: core.sh:15
add_banner_event(event, timestamp)
Füge ein Ereignis zum dauerhaften Ereignisprotokoll (/etc/banner) hinzu.
Definition: core.sh:68
add_interface_to_zone()
Fuege ein logisches Netzwerk-Interface zu einer Firewall-Zone hinzu.
Definition: network.sh:47
del_interface_from_zone()
Entferne ein logisches Interface aus einer Firewall-Zone.
Definition: network.sh:50
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"...
Definition: on-usergw.sh:61
log_openvpn_events_and_disconnect_if_requested()
Allgemeines Ereignisbehandlung fuer openvpn-Verbindungen: Logging und eventuell Dienst-Bereinigung (n...
Definition: openvpn.sh:59
uci_delete(uci_path)
Lösche ein UCI-Element.
Definition: uci.sh:46
set eu grep root::etc shadow exit if command v chpasswd dev null
Definition: on-password:12