@@ -101,13 +101,48 @@ TUN needs to be enabled before running this installer."
101
101
fi
102
102
}
103
103
104
+ set_client_name () {
105
+ # Allow a limited set of characters to avoid conflicts
106
+ client=$( sed ' s/[^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-]/_/g' <<< " $unsanitized_client" )
107
+ }
108
+
104
109
parse_args () {
105
110
while [ " $# " -gt 0 ]; do
106
111
case $1 in
107
112
--auto)
108
113
auto=1
109
114
shift
110
115
;;
116
+ --addclient)
117
+ add_client=1
118
+ unsanitized_client=" $2 "
119
+ shift
120
+ shift
121
+ ;;
122
+ --exportclient)
123
+ export_client=1
124
+ unsanitized_client=" $2 "
125
+ shift
126
+ shift
127
+ ;;
128
+ --listclients)
129
+ list_clients=1
130
+ shift
131
+ ;;
132
+ --revokeclient)
133
+ revoke_client=1
134
+ unsanitized_client=" $2 "
135
+ shift
136
+ shift
137
+ ;;
138
+ --uninstall)
139
+ remove_ovpn=1
140
+ shift
141
+ ;;
142
+ -y|--yes)
143
+ assume_yes=1
144
+ shift
145
+ ;;
111
146
-h|--help)
112
147
show_usage
113
148
;;
@@ -118,6 +153,43 @@ parse_args() {
118
153
done
119
154
}
120
155
156
+ check_args () {
157
+ if [ " $auto " = 1 ] && [ -e " $OVPN_CONF " ]; then
158
+ echo " Error: Invalid parameter '--auto'. OpenVPN is already set up on this server." >&2
159
+ echo " To manage OpenVPN clients, re-run this script without '--auto'." >&2
160
+ exit 1
161
+ fi
162
+ if [ " $(( add_client + export_client + list_clients + revoke_client)) " -gt 1 ]; then
163
+ show_usage " Invalid parameters. Specify only one of '--addclient', '--exportclient', '--listclients' or '--revokeclient'."
164
+ fi
165
+ if [ " $remove_ovpn " = 1 ]; then
166
+ if [ " $(( add_client + export_client + list_clients + revoke_client + auto)) " -gt 0 ]; then
167
+ show_usage " Invalid parameters. '--uninstall' cannot be specified with other parameters."
168
+ fi
169
+ fi
170
+ if [ ! -e " $OVPN_CONF " ]; then
171
+ [ " $add_client " = 1 ] && exiterr " You must first set up OpenVPN before adding a client."
172
+ [ " $export_client " = 1 ] && exiterr " You must first set up OpenVPN before exporting a client."
173
+ [ " $list_clients " = 1 ] && exiterr " You must first set up OpenVPN before listing clients."
174
+ [ " $revoke_client " = 1 ] && exiterr " You must first set up OpenVPN before revoking a client."
175
+ [ " $remove_ovpn " = 1 ] && exiterr " Cannot remove OpenVPN because it has not been set up on this server."
176
+ fi
177
+ if [ " $add_client " = 1 ]; then
178
+ set_client_name
179
+ if [ -z " $client " ]; then
180
+ exiterr " Invalid client name. Use one word only, no special characters except '-' and '_'."
181
+ elif [ -e /etc/openvpn/server/easy-rsa/pki/issued/" $client " .crt ]; then
182
+ exiterr " $client : invalid name. Client already exists."
183
+ fi
184
+ fi
185
+ if [ " $export_client " = 1 ] || [ " $revoke_client " = 1 ]; then
186
+ set_client_name
187
+ if [ -z " $client " ] || [ ! -e /etc/openvpn/server/easy-rsa/pki/issued/" $client " .crt ]; then
188
+ exiterr " Invalid client name, or client does not exist."
189
+ fi
190
+ fi
191
+ }
192
+
121
193
check_nftables () {
122
194
if [ " $os " = " centos" ]; then
123
195
if grep -qs " hwdsl2 VPN script" /etc/sysconfig/nftables.conf \
@@ -183,6 +255,7 @@ cat <<'EOF'
183
255
184
256
Welcome to this OpenVPN server installer!
185
257
GitHub: https://github.com/hwdsl2/openvpn-install
258
+
186
259
EOF
187
260
}
188
261
@@ -205,8 +278,14 @@ cat 1>&2 <<EOF
205
278
Usage: bash $0 [options]
206
279
207
280
Options:
208
- --auto auto install OpenVPN using default options
209
- -h, --help show this help message and exit
281
+ --auto auto install OpenVPN using default options
282
+ --addclient [client name] add a new client
283
+ --exportclient [client name] export configuration for an existing client
284
+ --listclients list the names of existing clients
285
+ --revokeclient [client name] revoke an existing client
286
+ --uninstall remove OpenVPN and delete all configuration
287
+ -y, --yes assume "yes" as answer to prompts when revoking a client or removing OpenVPN
288
+ -h, --help show this help message and exit
210
289
211
290
To customize install options, run this script without arguments.
212
291
EOF
216
295
show_welcome () {
217
296
if [ " $auto " = 0 ]; then
218
297
show_header2
219
- echo
220
298
echo ' I need to ask you a few questions before starting setup.'
221
299
echo ' You can use the default options and just press enter if you are OK with them.'
222
300
else
@@ -430,11 +508,6 @@ select_dns() {
430
508
fi
431
509
}
432
510
433
- set_client_name () {
434
- # Allow a limited set of characters to avoid conflicts
435
- client=$( sed ' s/[^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-]/_/g' <<< " $unsanitized_client" )
436
- }
437
-
438
511
enter_first_client_name () {
439
512
if [ " $auto " = 0 ]; then
440
513
echo
@@ -975,7 +1048,11 @@ enter_client_name() {
975
1048
[ -z " $unsanitized_client " ] && abort_and_exit
976
1049
set_client_name
977
1050
while [[ -z " $client " || -e /etc/openvpn/server/easy-rsa/pki/issued/" $client " .crt ]]; do
978
- echo " $client : invalid name."
1051
+ if [ -z " $client " ]; then
1052
+ echo " Invalid client name. Use one word only, no special characters except '-' and '_'."
1053
+ else
1054
+ echo " $client : invalid name. Client already exists."
1055
+ fi
979
1056
read -rp " Name: " unsanitized_client
980
1057
[ -z " $unsanitized_client " ] && abort_and_exit
981
1058
set_client_name
@@ -1005,7 +1082,7 @@ check_clients() {
1005
1082
if [[ " $num_of_clients " = 0 ]]; then
1006
1083
echo
1007
1084
echo " There are no existing clients!"
1008
- exit
1085
+ exit 1
1009
1086
fi
1010
1087
}
1011
1088
@@ -1032,12 +1109,16 @@ select_client_to() {
1032
1109
}
1033
1110
1034
1111
confirm_revoke_client () {
1035
- echo
1036
- read -rp " Confirm $client revocation? [y/N]: " revoke
1037
- until [[ " $revoke " =~ ^[yYnN]* $ ]]; do
1038
- echo " $revoke : invalid selection."
1112
+ if [ " $assume_yes " != 1 ]; then
1113
+ echo
1039
1114
read -rp " Confirm $client revocation? [y/N]: " revoke
1040
- done
1115
+ until [[ " $revoke " =~ ^[yYnN]* $ ]]; do
1116
+ echo " $revoke : invalid selection."
1117
+ read -rp " Confirm $client revocation? [y/N]: " revoke
1118
+ done
1119
+ else
1120
+ revoke=y
1121
+ fi
1041
1122
}
1042
1123
1043
1124
print_revoke_client () {
@@ -1054,7 +1135,7 @@ remove_client_conf() {
1054
1135
fi
1055
1136
}
1056
1137
1057
- revoke_client () {
1138
+ revoke_client_ovpn () {
1058
1139
cd /etc/openvpn/server/easy-rsa/ || exit 1
1059
1140
(
1060
1141
set -x
@@ -1079,12 +1160,16 @@ print_client_revocation_aborted() {
1079
1160
}
1080
1161
1081
1162
confirm_remove_ovpn () {
1082
- echo
1083
- read -rp " Confirm OpenVPN removal? [y/N]: " remove
1084
- until [[ " $remove " =~ ^[yYnN]* $ ]]; do
1085
- echo " $remove : invalid selection."
1163
+ if [ " $assume_yes " != 1 ]; then
1164
+ echo
1086
1165
read -rp " Confirm OpenVPN removal? [y/N]: " remove
1087
- done
1166
+ until [[ " $remove " =~ ^[yYnN]* $ ]]; do
1167
+ echo " $remove : invalid selection."
1168
+ read -rp " Confirm OpenVPN removal? [y/N]: " remove
1169
+ done
1170
+ else
1171
+ remove=y
1172
+ fi
1088
1173
}
1089
1174
1090
1175
print_remove_ovpn () {
@@ -1141,9 +1226,76 @@ check_tun
1141
1226
OVPN_CONF=" /etc/openvpn/server/server.conf"
1142
1227
1143
1228
auto=0
1229
+ assume_yes=0
1230
+ add_client=0
1231
+ export_client=0
1232
+ list_clients=0
1233
+ revoke_client=0
1234
+ remove_ovpn=0
1235
+
1236
+ parse_args " $@ "
1237
+ check_args
1238
+
1239
+ if [ " $add_client " = 1 ]; then
1240
+ show_header
1241
+ echo
1242
+ build_client_config
1243
+ new_client
1244
+ print_client_action added
1245
+ exit 0
1246
+ fi
1247
+
1248
+ if [ " $export_client " = 1 ]; then
1249
+ show_header
1250
+ new_client
1251
+ print_client_action exported
1252
+ exit 0
1253
+ fi
1254
+
1255
+ if [ " $list_clients " = 1 ]; then
1256
+ show_header
1257
+ print_check_clients
1258
+ check_clients
1259
+ echo
1260
+ show_clients
1261
+ print_client_total
1262
+ exit 0
1263
+ fi
1264
+
1265
+ if [ " $revoke_client " = 1 ]; then
1266
+ show_header
1267
+ confirm_revoke_client
1268
+ if [[ " $revoke " =~ ^[yY]$ ]]; then
1269
+ print_revoke_client
1270
+ revoke_client_ovpn
1271
+ print_client_revoked
1272
+ exit 0
1273
+ else
1274
+ print_client_revocation_aborted
1275
+ exit 1
1276
+ fi
1277
+ fi
1278
+
1279
+ if [ " $remove_ovpn " = 1 ]; then
1280
+ show_header
1281
+ confirm_remove_ovpn
1282
+ if [[ " $remove " =~ ^[yY]$ ]]; then
1283
+ print_remove_ovpn
1284
+ remove_firewall_rules
1285
+ disable_ovpn_service
1286
+ remove_sysctl_rules
1287
+ remove_rclocal_rules
1288
+ remove_pkgs
1289
+ print_ovpn_removed
1290
+ exit 0
1291
+ else
1292
+ print_ovpn_removal_aborted
1293
+ exit 1
1294
+ fi
1295
+ fi
1296
+
1144
1297
if [[ ! -e " $OVPN_CONF " ]]; then
1145
1298
check_nftables
1146
- parse_args " $@ "
1147
1299
install_wget
1148
1300
install_iproute
1149
1301
show_welcome
@@ -1188,35 +1340,36 @@ else
1188
1340
build_client_config
1189
1341
new_client
1190
1342
print_client_action added
1191
- exit
1343
+ exit 0
1192
1344
;;
1193
1345
2)
1194
1346
check_clients
1195
1347
select_client_to export
1196
1348
new_client
1197
1349
print_client_action exported
1198
- exit
1350
+ exit 0
1199
1351
;;
1200
1352
3)
1201
1353
print_check_clients
1202
1354
check_clients
1203
1355
echo
1204
1356
show_clients
1205
1357
print_client_total
1206
- exit
1358
+ exit 0
1207
1359
;;
1208
1360
4)
1209
1361
check_clients
1210
1362
select_client_to revoke
1211
1363
confirm_revoke_client
1212
1364
if [[ " $revoke " =~ ^[yY]$ ]]; then
1213
1365
print_revoke_client
1214
- revoke_client
1366
+ revoke_client_ovpn
1215
1367
print_client_revoked
1368
+ exit 0
1216
1369
else
1217
1370
print_client_revocation_aborted
1371
+ exit 1
1218
1372
fi
1219
- exit
1220
1373
;;
1221
1374
5)
1222
1375
confirm_remove_ovpn
@@ -1228,13 +1381,14 @@ else
1228
1381
remove_rclocal_rules
1229
1382
remove_pkgs
1230
1383
print_ovpn_removed
1384
+ exit 0
1231
1385
else
1232
1386
print_ovpn_removal_aborted
1387
+ exit 1
1233
1388
fi
1234
- exit
1235
1389
;;
1236
1390
6)
1237
- exit
1391
+ exit 0
1238
1392
;;
1239
1393
esac
1240
1394
fi
0 commit comments