1 | #!/bin/bash -e |
---|
2 | |
---|
3 | trap "" TSTP |
---|
4 | trap "" HUP |
---|
5 | trap "" INT |
---|
6 | |
---|
7 | export PATH="/bin:/sbin:/usr/sbin:/usr/bin" |
---|
8 | |
---|
9 | readonly LOG_MESSAGE_COMMAND=$(basename "${0}") |
---|
10 | |
---|
11 | # Quick check - is the configuration there? |
---|
12 | if ! scutil -w State:/Network/OpenVPN &>/dev/null -t 1 ; then |
---|
13 | # Configuration isn't there, so we forget it |
---|
14 | echo "$(date '+%a %b %e %T %Y') *OpenVPN $LOG_MESSAGE_COMMAND: WARNING: No existing OpenVPN DNS configuration found; not tearing down anything; exiting." |
---|
15 | exit 0 |
---|
16 | fi |
---|
17 | |
---|
18 | # Get info saved by the up script |
---|
19 | OPENVPN_CONFIG="$(/usr/sbin/scutil <<-EOF |
---|
20 | open |
---|
21 | show State:/Network/OpenVPN |
---|
22 | quit |
---|
23 | EOF)" |
---|
24 | |
---|
25 | MONITOR_NETWORK="$(echo "${OPENVPN_CONFIG}" | grep -i '^[[:space:]]*MonitorNetwork :' | sed -e 's/^.*: //g')" |
---|
26 | WATCHER_PLIST="$(echo "${OPENVPN_CONFIG}" | grep -i '^[[:space:]]*WatcherPlist :' | sed -e 's/^.*: //g')" |
---|
27 | PRIMARY_SERVICE_ID="$(echo "${OPENVPN_CONFIG}" | grep -i '^[[:space:]]*Service :' | sed -e 's/^.*: //g')" |
---|
28 | SCRIPT_LOG_FILE="$(echo "${OPENVPN_CONFIG}" | grep -i '^[[:space:]]*ScriptLogFile :' | sed -e 's/^.*: //g')" |
---|
29 | IS_TAP="$(echo "${OPENVPN_CONFIG}" | grep -i '^[[:space:]]*IsTapInterface :' | sed -e 's/^.*: //g')" |
---|
30 | bRouteGatewayIsDhcp="$(echo "${OPENVPN_CONFIG}" | grep -i '^[[:space:]]*RouteGatewayIsDhcp :' | sed -e 's/^.*: //g')" |
---|
31 | |
---|
32 | # @param String message - The message to log |
---|
33 | logMessage() |
---|
34 | { |
---|
35 | echo "$(date '+%a %b %e %T %Y') *OpenVPN $LOG_MESSAGE_COMMAND: "${@} >> "${SCRIPT_LOG_FILE}" |
---|
36 | } |
---|
37 | |
---|
38 | trim() |
---|
39 | { |
---|
40 | echo ${@} |
---|
41 | } |
---|
42 | |
---|
43 | if ${IS_TAP} ; then |
---|
44 | if [ "$bRouteGatewayIsDhcp" == "true" ]; then |
---|
45 | if [ -z "$dev" ]; then |
---|
46 | logMessage "Cannot configure TAP interface for DHCP without \$dev being defined. Device may not have disconnected properly." |
---|
47 | else |
---|
48 | set +e |
---|
49 | ipconfig set "$dev" NONE 2>/dev/null |
---|
50 | set -e |
---|
51 | fi |
---|
52 | fi |
---|
53 | fi |
---|
54 | |
---|
55 | # Issue warning if the primary service ID has changed |
---|
56 | PRIMARY_SERVICE_ID_CURRENT="$( (scutil | grep Service | sed -e 's/.*Service : //')<<- EOF |
---|
57 | open |
---|
58 | show State:/Network/OpenVPN |
---|
59 | quit |
---|
60 | EOF)" |
---|
61 | if [ "${PRIMARY_SERVICE_ID}" != "${PRIMARY_SERVICE_ID_CURRENT}" ] ; then |
---|
62 | logMessage "Ignoring change of Network Primary Service from ${PRIMARY_SERVICE_ID} to ${PRIMARY_SERVICE_ID_CURRENT}" |
---|
63 | fi |
---|
64 | |
---|
65 | # Remove leasewatcher |
---|
66 | if ${MONITOR_NETWORK} ; then |
---|
67 | launchctl unload "${WATCHER_PLIST}" |
---|
68 | logMessage "Cancelled monitoring of system configuration changes" |
---|
69 | fi |
---|
70 | |
---|
71 | # Restore configurations |
---|
72 | DNS_OLD="$(/usr/sbin/scutil <<-EOF |
---|
73 | open |
---|
74 | show State:/Network/OpenVPN/OldDNS |
---|
75 | quit |
---|
76 | EOF)" |
---|
77 | WINS_OLD="$(/usr/sbin/scutil <<-EOF |
---|
78 | open |
---|
79 | show State:/Network/OpenVPN/OldSMB |
---|
80 | quit |
---|
81 | EOF)" |
---|
82 | NO_SUCH_KEY="<dictionary> { |
---|
83 | NoSuchKey : true |
---|
84 | }" |
---|
85 | |
---|
86 | if [ "${DNS_OLD}" = "${NO_SUCH_KEY}" ] ; then |
---|
87 | scutil <<- EOF |
---|
88 | open |
---|
89 | remove State:/Network/Service/${PRIMARY_SERVICE_ID}/DNS |
---|
90 | quit |
---|
91 | EOF |
---|
92 | else |
---|
93 | scutil <<- EOF |
---|
94 | open |
---|
95 | get State:/Network/OpenVPN/OldDNS |
---|
96 | set State:/Network/Service/${PRIMARY_SERVICE_ID}/DNS |
---|
97 | quit |
---|
98 | EOF |
---|
99 | fi |
---|
100 | |
---|
101 | if [ "${WINS_OLD}" = "${NO_SUCH_KEY}" ] ; then |
---|
102 | scutil <<- EOF |
---|
103 | open |
---|
104 | remove State:/Network/Service/${PRIMARY_SERVICE_ID}/SMB |
---|
105 | quit |
---|
106 | EOF |
---|
107 | else |
---|
108 | scutil <<- EOF |
---|
109 | open |
---|
110 | get State:/Network/OpenVPN/OldSMB |
---|
111 | set State:/Network/Service/${PRIMARY_SERVICE_ID}/SMB |
---|
112 | quit |
---|
113 | EOF |
---|
114 | fi |
---|
115 | |
---|
116 | logMessage "Restored the DNS and WINS configurations" |
---|
117 | |
---|
118 | # Remove our system configuration data |
---|
119 | scutil <<- EOF |
---|
120 | open |
---|
121 | remove State:/Network/OpenVPN/SMB |
---|
122 | remove State:/Network/OpenVPN/DNS |
---|
123 | remove State:/Network/OpenVPN/OldSMB |
---|
124 | remove State:/Network/OpenVPN/OldDNS |
---|
125 | remove State:/Network/OpenVPN |
---|
126 | quit |
---|
127 | EOF |
---|
128 | |
---|
129 | exit 0 |
---|