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 
19 get_netname() {
20  local ifname="$1"
21  echo "$ifname" | sed 's/[^0-9a-zA-Z]/_/g'
22 }
23 
24 
25 setup_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}.ifname=$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.
59 add_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 
72 log_openvpn_events_and_disconnect_if_requested "mesh-openvpn-connections"
73 
74 
75 # "script_type" wird von openvpn als Umgebungsvariable definiert (up/down).
76 # shellcheck disable=SC2154
77 case "$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  ;;
112 esac 2>&1 | logger -t mesh-updown
113 
114 exit 0
uci_delete(uci_path)
Lösche ein UCI-Element.
Definition: uci.sh:46
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:46
log_openvpn_events_and_disconnect_if_requested()
Allgemeines Ereignisbehandlung fuer openvpn-Verbindungen: Logging und eventuell Dienst-Bereinigung (n...
Definition: openvpn.sh:59
set eu grep root::etc shadow exit if command v chpasswd dev null
Definition: on-password:12
msg_info(message)
Informationen und Fehlermeldungen ins syslog schreiben.
Definition: core.sh:15
del_interface_from_zone()
Entferne ein logisches Interface aus einer Firewall-Zone.
Definition: network.sh:49
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:66