7
7
TMP_PUSH_CONFIGFILE=$( mktemp -t vpn_push.XXXXXXX)
8
8
TMP_ROUTE_CONFIGFILE=$( mktemp -t vpn_route.XXXXXXX)
9
9
TMP_EXTRA_CONFIGFILE=$( mktemp -t vpn_extra.XXXXXXX)
10
- TMP_EXTRA_CLIENT_CONFIGFILE=$( mktemp -t vpn_extra_client.XXXXXXX)
11
10
12
11
# Traceback on Error and Exit come from https://docwhat.org/tracebacks-in-bash/
13
12
set -eu
@@ -46,7 +45,6 @@ on_exit() {
46
45
rm -f $TMP_PUSH_CONFIGFILE
47
46
rm -f $TMP_ROUTE_CONFIGFILE
48
47
rm -f $TMP_EXTRA_CONFIGFILE
49
- rm -f $TMP_EXTRA_CLIENT_CONFIGFILE
50
48
local _ec=" $? "
51
49
if [[ $_ec != 0 && " ${_showed_traceback} " != t ]]; then
52
50
traceback 1
@@ -129,14 +127,6 @@ process_extra_config() {
129
127
ovpn_extra_config=" $1 "
130
128
echo " Processing Extra Config: '${ovpn_extra_config} '"
131
129
[[ -n " $ovpn_extra_config " ]] && echo " $ovpn_extra_config " >> " $TMP_EXTRA_CONFIGFILE "
132
-
133
- }
134
-
135
- process_extra_client_config () {
136
- local ovpn_extra_config=' '
137
- ovpn_extra_config=" $1 "
138
- echo " Processing Extra Client Config: '${ovpn_extra_config} '"
139
- [[ -n " $ovpn_extra_config " ]] && echo " $ovpn_extra_config " >> " $TMP_EXTRA_CLIENT_CONFIGFILE "
140
130
}
141
131
142
132
if [ " ${DEBUG:- } " == " 1" ]; then
@@ -152,25 +142,33 @@ if [ -z "${EASYRSA_PKI:-}" ]; then
152
142
export EASYRSA_PKI=" $OPENVPN /pki"
153
143
fi
154
144
155
- OVPN_ENV=${OPENVPN} /ovpn_env.sh
156
- OVPN_SERVER=192.168.255.0/24
145
+ OVPN_AUTH=' '
146
+ OVPN_CIPHER=' '
147
+ OVPN_CLIENT_TO_CLIENT=' '
148
+ OVPN_CN=' '
149
+ OVPN_COMP_LZO=0
157
150
OVPN_DEFROUTE=1
158
- OVPN_NAT=0
159
- OVPN_DNS=1
160
151
OVPN_DEVICE=" tun"
161
152
OVPN_DEVICEN=0
153
+ OVPN_DISABLE_PUSH_BLOCK_DNS=0
154
+ OVPN_DNS=1
155
+ OVPN_DNS_SERVERS=()
156
+ OVPN_ENV=${OPENVPN} /ovpn_env.sh
157
+ OVPN_EXTRA_CLIENT_CONFIG=()
158
+ OVPN_EXTRA_SERVER_CONFIG=()
159
+ OVPN_FRAGMENT=' '
162
160
OVPN_KEEPALIVE=" 10 60"
163
- OVPN_DNS_SERVERS=(" 8.8.8.8" " 8.8.4.4" )
164
- TMP_DNS_SERVERS=()
161
+ OVPN_MTU=' '
162
+ OVPN_NAT=0
163
+ OVPN_PORT=' '
164
+ OVPN_PROTO=' '
165
+ OVPN_PUSH=()
166
+ OVPN_ROUTES=()
167
+ OVPN_SERVER=192.168.255.0/24
168
+ OVPN_SERVER_URL=' '
165
169
OVPN_TLS_CIPHER=' '
166
- OVPN_CIPHER=' '
167
- OVPN_AUTH=' '
168
- OVPN_EXTRA_CONFIG=' '
169
- CUSTOM_ROUTE_CONFIG=' '
170
- OVPN_COMP_LZO=0
171
- OVPN_DISABLE_PUSH_BLOCK_DNS=0
172
170
173
- # Import defaults if present
171
+ # Import existing configuration if present
174
172
[ -r " $OVPN_ENV " ] && source " $OVPN_ENV "
175
173
176
174
# Parse arguments
@@ -180,10 +178,16 @@ while getopts ":a:e:E:C:T:r:s:du:bcp:n:k:DNm:f:tz2" opt; do
180
178
OVPN_AUTH=" $OPTARG "
181
179
;;
182
180
e)
183
- process_extra_config " $OPTARG "
181
+ mapfile -t TMP_EXTRA_SERVER_CONFIG < <( echo " $OPTARG " )
182
+ for i in " ${TMP_EXTRA_SERVER_CONFIG[@]} " ; do
183
+ OVPN_EXTRA_SERVER_CONFIG+=(" $i " )
184
+ done
184
185
;;
185
186
E)
186
- process_extra_client_config " $OPTARG "
187
+ mapfile -t TMP_EXTRA_CLIENT_CONFIG < <( echo " $OPTARG " )
188
+ for i in " ${TMP_EXTRA_CLIENT_CONFIG[@]} " ; do
189
+ OVPN_EXTRA_CLIENT_CONFIG+=(" $i " )
190
+ done
187
191
;;
188
192
C)
189
193
OVPN_CIPHER=" $OPTARG "
@@ -192,18 +196,20 @@ while getopts ":a:e:E:C:T:r:s:du:bcp:n:k:DNm:f:tz2" opt; do
192
196
OVPN_TLS_CIPHER=" $OPTARG "
193
197
;;
194
198
r)
195
- CUSTOM_ROUTE_CONFIG=1
196
- process_route_config " $OPTARG "
199
+ mapfile -t TMP_ROUTES < <( echo " $OPTARG " )
200
+ for i in " ${TMP_ROUTES[@]} " ; do
201
+ OVPN_ROUTES+=(" $i " )
202
+ done
197
203
;;
198
204
s)
199
- OVPN_SERVER=$OPTARG
205
+ OVPN_SERVER=" $OPTARG "
200
206
;;
201
207
d)
202
208
OVPN_DEFROUTE=0
203
209
OVPN_DISABLE_PUSH_BLOCK_DNS=1
204
210
;;
205
211
u)
206
- OVPN_SERVER_URL=$OPTARG
212
+ OVPN_SERVER_URL=" $OPTARG "
207
213
;;
208
214
b)
209
215
OVPN_DISABLE_PUSH_BLOCK_DNS=1
@@ -212,10 +218,16 @@ while getopts ":a:e:E:C:T:r:s:du:bcp:n:k:DNm:f:tz2" opt; do
212
218
OVPN_CLIENT_TO_CLIENT=1
213
219
;;
214
220
p)
215
- process_push_config " $OPTARG "
221
+ mapfile -t TMP_PUSH < <( echo " $OPTARG " )
222
+ for i in " ${TMP_PUSH[@]} " ; do
223
+ OVPN_PUSH+=(" $i " )
224
+ done
216
225
;;
217
226
n)
218
- TMP_DNS_SERVERS+=(" $OPTARG " )
227
+ mapfile -t TMP_DNS_SERVERS < <( echo " $OPTARG " )
228
+ for i in " ${TMP_DNS_SERVERS[@]} " ; do
229
+ OVPN_DNS_SERVERS+=(" $i " )
230
+ done
219
231
;;
220
232
D)
221
233
OVPN_DNS=0
@@ -227,7 +239,7 @@ while getopts ":a:e:E:C:T:r:s:du:bcp:n:k:DNm:f:tz2" opt; do
227
239
OVPN_KEEPALIVE=" $OPTARG "
228
240
;;
229
241
m)
230
- OVPN_MTU=$OPTARG
242
+ OVPN_MTU=" $OPTARG "
231
243
;;
232
244
t)
233
245
OVPN_DEVICE=" tap"
@@ -239,7 +251,7 @@ while getopts ":a:e:E:C:T:r:s:du:bcp:n:k:DNm:f:tz2" opt; do
239
251
OVPN_OTP_AUTH=1
240
252
;;
241
253
f)
242
- OVPN_FRAGMENT=$OPTARG
254
+ OVPN_FRAGMENT=" $OPTARG "
243
255
;;
244
256
\? )
245
257
set +x
259
271
# Create ccd directory for static routes
260
272
[ ! -d " ${OPENVPN:- } /ccd" ] && mkdir -p ${OPENVPN:- } /ccd
261
273
262
- # if dns servers were not defined with -n, use google nameservers
263
- [ ${# TMP_DNS_SERVERS[@]} -gt 0 ] && OVPN_DNS_SERVERS=(" ${TMP_DNS_SERVERS[@]} " )
264
-
265
274
# Server name is in the form "udp://vpn.example.com:1194"
266
275
if [[ " ${OVPN_SERVER_URL:- } " =~ ^(( udp| tcp| udp6 | tcp6 ):// )? ([0 - 9 a- zA- Z\.\- ]+ )(: ([0 - 9 ]+ )) ? $ ]]; then
267
276
OVPN_PROTO=${BASH_REMATCH[2]} ;
@@ -274,25 +283,13 @@ else
274
283
exit 1
275
284
fi
276
285
277
- # Apply defaults
286
+ # Apply defaults. If dns servers were not defined with -n, use google nameservers
287
+ set +u
288
+ [ -z " $OVPN_DNS_SERVERS " ] && OVPN_DNS_SERVERS=(" 8.8.8.8" " 8.8.4.4" )
278
289
[ -z " $OVPN_PROTO " ] && OVPN_PROTO=udp
279
290
[ -z " $OVPN_PORT " ] && OVPN_PORT=1194
280
- [ -z " $CUSTOM_ROUTE_CONFIG " ] && [ " $OVPN_DEFROUTE " == " 1" ] && process_route_config " 192.168.254.0/24"
281
-
282
- # Save extra client config from temp file only if temp file is not empty
283
- if [ -s " $TMP_EXTRA_CLIENT_CONFIGFILE " ]; then
284
- OVPN_ADDITIONAL_CLIENT_CONFIG=$( cat $TMP_EXTRA_CLIENT_CONFIGFILE )
285
- fi
286
-
287
- export OVPN_SERVER OVPN_ROUTES OVPN_DEFROUTE
288
- export OVPN_SERVER_URL OVPN_ENV OVPN_PROTO OVPN_CN OVPN_PORT
289
- export OVPN_CLIENT_TO_CLIENT OVPN_PUSH OVPN_NAT OVPN_DNS OVPN_MTU OVPN_DEVICE
290
- export OVPN_TLS_CIPHER OVPN_CIPHER OVPN_AUTH
291
- export OVPN_COMP_LZO
292
- export OVPN_DISABLE_PUSH_BLOCK_DNS
293
- export OVPN_OTP_AUTH
294
- export OVPN_FRAGMENT
295
- export OVPN_ADDITIONAL_CLIENT_CONFIG
291
+ set -u
292
+ [ " ${# OVPN_ROUTES[@]} " == " 0" ] && [ " $OVPN_DEFROUTE " == " 1" ] && OVPN_ROUTES+=(" 192.168.254.0/24" )
296
293
297
294
# Preserve config
298
295
if [ -f " $OVPN_ENV " ]; then
@@ -301,17 +298,10 @@ if [ -f "$OVPN_ENV" ]; then
301
298
mv " $OVPN_ENV " " $bak_env "
302
299
fi
303
300
304
- # Like `export | grep OVPN_ > "$OVPN_ENV"` but handles multiline variables
305
- set +u
306
- while read var ; do
307
- eval value=\$ $var
308
- if [ -n " $value " ]; then
309
- echo " declare -x $var =\" $value \" " >> " $OVPN_ENV "
310
- else
311
- echo " declare -x $var " >> " $OVPN_ENV "
312
- fi
313
- done < <( export | egrep -o ' (OVPN_[^=]+)' )
314
- set -u
301
+ # Save the current OVPN_ vars to the ovpn_env.sh file
302
+ while read -r var; do
303
+ echo " declare -x $var " >> " $OVPN_ENV "
304
+ done < <( set | grep ' ^OVPN_' )
315
305
316
306
conf=${OPENVPN:- } /openvpn.conf
317
307
if [ -f " $conf " ]; then
@@ -320,6 +310,13 @@ if [ -f "$conf" ]; then
320
310
mv " $conf " " $bak "
321
311
fi
322
312
313
+ # Echo extra client configurations
314
+ if [ ${# OVPN_EXTRA_CLIENT_CONFIG[@]} -gt 0 ]; then
315
+ for i in " ${OVPN_EXTRA_CLIENT_CONFIG[@]} " ; do
316
+ echo " Processing Extra Client Config: $i "
317
+ done
318
+ fi
319
+
323
320
cat > " $conf " << EOF
324
321
server $( getroute $OVPN_SERVER )
325
322
verb 3
358
355
359
356
[ -n " ${OVPN_FRAGMENT:- } " ] && echo " fragment $OVPN_FRAGMENT " >> " $conf "
360
357
358
+ # Append route commands
359
+ if [ ${# OVPN_ROUTES[@]} -gt 0 ]; then
360
+ for i in " ${OVPN_ROUTES[@]} " ; do
361
+ process_route_config " $i "
362
+ done
363
+ echo -e " \n### Route Configurations Below" >> " $conf "
364
+ cat $TMP_ROUTE_CONFIGFILE >> " $conf "
365
+ fi
366
+
367
+ # Append push commands
361
368
[ " $OVPN_DNS " == " 1" ] && for i in " ${OVPN_DNS_SERVERS[@]} " ; do
362
369
process_push_config " dhcp-option DNS $i "
363
370
done
364
371
365
- # Append route commands
366
- echo -e " \n### Route Configurations Below " >> " $conf "
367
- cat $TMP_ROUTE_CONFIGFILE >> " $conf "
372
+ [ ${ # OVPN_PUSH[@]} -gt 0 ] && for i in " ${OVPN_PUSH[@]} " ; do
373
+ process_push_config " $i "
374
+ done
368
375
369
- # Append push commands
370
376
echo -e " \n### Push Configurations Below" >> " $conf "
371
377
cat $TMP_PUSH_CONFIGFILE >> " $conf "
372
378
373
- # Optional OTP authentication support
379
+ # Append optional OTP authentication support
374
380
if [ -n " ${OVPN_OTP_AUTH:- } " ]; then
375
381
echo -e " \n\n# Enable OTP+PAM for user authentication" >> " $conf "
376
382
echo " plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn" >> " $conf "
377
383
echo " reneg-sec 0" >> " $conf "
378
384
fi
379
385
380
- echo -e " \n### Extra Configurations Below" >> " $conf "
381
- cat $TMP_EXTRA_CONFIGFILE >> " $conf "
386
+ # Append extra server configurations
387
+ if [ ${# OVPN_EXTRA_SERVER_CONFIG[@]} -gt 0 ]; then
388
+ for i in " ${OVPN_EXTRA_SERVER_CONFIG[@]} " ; do
389
+ process_extra_config " $i "
390
+ done
391
+ echo -e " \n### Extra Configurations Below" >> " $conf "
392
+ cat $TMP_EXTRA_CONFIGFILE >> " $conf "
393
+ fi
382
394
383
395
set +e
384
396
0 commit comments