Skip to content

Commit 925b08f

Browse files
authored
Merge pull request #283 from buchdag/genconfig-fix
Fix ovpn_genconfig repeatability issue
2 parents 1b8374f + 7a29e8e commit 925b08f

File tree

3 files changed

+88
-73
lines changed

3 files changed

+88
-73
lines changed

bin/ovpn_genconfig

Lines changed: 83 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
TMP_PUSH_CONFIGFILE=$(mktemp -t vpn_push.XXXXXXX)
88
TMP_ROUTE_CONFIGFILE=$(mktemp -t vpn_route.XXXXXXX)
99
TMP_EXTRA_CONFIGFILE=$(mktemp -t vpn_extra.XXXXXXX)
10-
TMP_EXTRA_CLIENT_CONFIGFILE=$(mktemp -t vpn_extra_client.XXXXXXX)
1110

1211
#Traceback on Error and Exit come from https://docwhat.org/tracebacks-in-bash/
1312
set -eu
@@ -46,7 +45,6 @@ on_exit() {
4645
rm -f $TMP_PUSH_CONFIGFILE
4746
rm -f $TMP_ROUTE_CONFIGFILE
4847
rm -f $TMP_EXTRA_CONFIGFILE
49-
rm -f $TMP_EXTRA_CLIENT_CONFIGFILE
5048
local _ec="$?"
5149
if [[ $_ec != 0 && "${_showed_traceback}" != t ]]; then
5250
traceback 1
@@ -129,14 +127,6 @@ process_extra_config() {
129127
ovpn_extra_config="$1"
130128
echo "Processing Extra Config: '${ovpn_extra_config}'"
131129
[[ -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"
140130
}
141131

142132
if [ "${DEBUG:-}" == "1" ]; then
@@ -152,25 +142,33 @@ if [ -z "${EASYRSA_PKI:-}" ]; then
152142
export EASYRSA_PKI="$OPENVPN/pki"
153143
fi
154144

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
157150
OVPN_DEFROUTE=1
158-
OVPN_NAT=0
159-
OVPN_DNS=1
160151
OVPN_DEVICE="tun"
161152
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=''
162160
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=''
165169
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
172170

173-
# Import defaults if present
171+
# Import existing configuration if present
174172
[ -r "$OVPN_ENV" ] && source "$OVPN_ENV"
175173

176174
# Parse arguments
@@ -180,10 +178,16 @@ while getopts ":a:e:E:C:T:r:s:du:bcp:n:k:DNm:f:tz2" opt; do
180178
OVPN_AUTH="$OPTARG"
181179
;;
182180
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
184185
;;
185186
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
187191
;;
188192
C)
189193
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
192196
OVPN_TLS_CIPHER="$OPTARG"
193197
;;
194198
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
197203
;;
198204
s)
199-
OVPN_SERVER=$OPTARG
205+
OVPN_SERVER="$OPTARG"
200206
;;
201207
d)
202208
OVPN_DEFROUTE=0
203209
OVPN_DISABLE_PUSH_BLOCK_DNS=1
204210
;;
205211
u)
206-
OVPN_SERVER_URL=$OPTARG
212+
OVPN_SERVER_URL="$OPTARG"
207213
;;
208214
b)
209215
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
212218
OVPN_CLIENT_TO_CLIENT=1
213219
;;
214220
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
216225
;;
217226
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
219231
;;
220232
D)
221233
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
227239
OVPN_KEEPALIVE="$OPTARG"
228240
;;
229241
m)
230-
OVPN_MTU=$OPTARG
242+
OVPN_MTU="$OPTARG"
231243
;;
232244
t)
233245
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
239251
OVPN_OTP_AUTH=1
240252
;;
241253
f)
242-
OVPN_FRAGMENT=$OPTARG
254+
OVPN_FRAGMENT="$OPTARG"
243255
;;
244256
\?)
245257
set +x
@@ -259,9 +271,6 @@ done
259271
# Create ccd directory for static routes
260272
[ ! -d "${OPENVPN:-}/ccd" ] && mkdir -p ${OPENVPN:-}/ccd
261273

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-
265274
# Server name is in the form "udp://vpn.example.com:1194"
266275
if [[ "${OVPN_SERVER_URL:-}" =~ ^((udp|tcp|udp6|tcp6)://)?([0-9a-zA-Z\.\-]+)(:([0-9]+))?$ ]]; then
267276
OVPN_PROTO=${BASH_REMATCH[2]};
@@ -274,25 +283,13 @@ else
274283
exit 1
275284
fi
276285

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")
278289
[ -z "$OVPN_PROTO" ] && OVPN_PROTO=udp
279290
[ -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")
296293

297294
# Preserve config
298295
if [ -f "$OVPN_ENV" ]; then
@@ -301,17 +298,10 @@ if [ -f "$OVPN_ENV" ]; then
301298
mv "$OVPN_ENV" "$bak_env"
302299
fi
303300

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_')
315305

316306
conf=${OPENVPN:-}/openvpn.conf
317307
if [ -f "$conf" ]; then
@@ -320,6 +310,13 @@ if [ -f "$conf" ]; then
320310
mv "$conf" "$bak"
321311
fi
322312

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+
323320
cat > "$conf" <<EOF
324321
server $(getroute $OVPN_SERVER)
325322
verb 3
@@ -358,27 +355,42 @@ fi
358355

359356
[ -n "${OVPN_FRAGMENT:-}" ] && echo "fragment $OVPN_FRAGMENT" >> "$conf"
360357

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
361368
[ "$OVPN_DNS" == "1" ] && for i in "${OVPN_DNS_SERVERS[@]}"; do
362369
process_push_config "dhcp-option DNS $i"
363370
done
364371

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
368375

369-
# Append push commands
370376
echo -e "\n### Push Configurations Below" >> "$conf"
371377
cat $TMP_PUSH_CONFIGFILE >> "$conf"
372378

373-
# Optional OTP authentication support
379+
# Append optional OTP authentication support
374380
if [ -n "${OVPN_OTP_AUTH:-}" ]; then
375381
echo -e "\n\n# Enable OTP+PAM for user authentication" >> "$conf"
376382
echo "plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn" >> "$conf"
377383
echo "reneg-sec 0" >> "$conf"
378384
fi
379385

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
382394

383395
set +e
384396

bin/ovpn_getclient

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ remote $OVPN_CN $OVPN_PORT $OVPN_PROTO"
4444
if [ "$OVPN_PROTO" == "tcp6" ]; then
4545
echo "remote $OVPN_CN $OVPN_PORT tcp"
4646
fi
47-
echo "$OVPN_ADDITIONAL_CLIENT_CONFIG
48-
"
47+
for i in "${OVPN_EXTRA_CLIENT_CONFIG[@]}"; do
48+
echo "$i"
49+
done
4950
if [ "$mode" == "combined" ]; then
5051
echo "
5152
<key>

test/tests/conf_options/container.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ ovpn_genconfig \
5050
-e 'topology subnet' \
5151
-p 'route 172.22.22.0 255.255.255.0' \
5252

53+
# Run ovpn_genconfig a second time with no arguments to test its repeatability.
54+
ovpn_genconfig
5355

5456
#
5557
# Simple test cases

0 commit comments

Comments
 (0)