From e058f5e3d8cc5f5fa9ef577ea5fb9569543e2a8a Mon Sep 17 00:00:00 2001 From: hwdsl2 Date: Sun, 23 Jun 2024 14:58:07 -0500 Subject: [PATCH] Add command line options - Add support for command-line options for managing OpenVPN clients and removing OpenVPN. --- openvpn-install.sh | 212 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 183 insertions(+), 29 deletions(-) diff --git a/openvpn-install.sh b/openvpn-install.sh index 9ebcdd6..47d0fae 100644 --- a/openvpn-install.sh +++ b/openvpn-install.sh @@ -101,6 +101,11 @@ TUN needs to be enabled before running this installer." fi } +set_client_name() { + # Allow a limited set of characters to avoid conflicts + client=$(sed 's/[^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-]/_/g' <<< "$unsanitized_client") +} + parse_args() { while [ "$#" -gt 0 ]; do case $1 in @@ -108,6 +113,36 @@ parse_args() { auto=1 shift ;; + --addclient) + add_client=1 + unsanitized_client="$2" + shift + shift + ;; + --exportclient) + export_client=1 + unsanitized_client="$2" + shift + shift + ;; + --listclients) + list_clients=1 + shift + ;; + --revokeclient) + revoke_client=1 + unsanitized_client="$2" + shift + shift + ;; + --uninstall) + remove_ovpn=1 + shift + ;; + -y|--yes) + assume_yes=1 + shift + ;; -h|--help) show_usage ;; @@ -118,6 +153,43 @@ parse_args() { done } +check_args() { + if [ "$auto" = 1 ] && [ -e "$OVPN_CONF" ]; then + echo "Error: Invalid parameter '--auto'. OpenVPN is already set up on this server." >&2 + echo " To manage OpenVPN clients, re-run this script without '--auto'." >&2 + exit 1 + fi + if [ "$((add_client + export_client + list_clients + revoke_client))" -gt 1 ]; then + show_usage "Invalid parameters. Specify only one of '--addclient', '--exportclient', '--listclients' or '--revokeclient'." + fi + if [ "$remove_ovpn" = 1 ]; then + if [ "$((add_client + export_client + list_clients + revoke_client + auto))" -gt 0 ]; then + show_usage "Invalid parameters. '--uninstall' cannot be specified with other parameters." + fi + fi + if [ ! -e "$OVPN_CONF" ]; then + [ "$add_client" = 1 ] && exiterr "You must first set up OpenVPN before adding a client." + [ "$export_client" = 1 ] && exiterr "You must first set up OpenVPN before exporting a client." + [ "$list_clients" = 1 ] && exiterr "You must first set up OpenVPN before listing clients." + [ "$revoke_client" = 1 ] && exiterr "You must first set up OpenVPN before revoking a client." + [ "$remove_ovpn" = 1 ] && exiterr "Cannot remove OpenVPN because it has not been set up on this server." + fi + if [ "$add_client" = 1 ]; then + set_client_name + if [ -z "$client" ]; then + exiterr "Invalid client name. Use one word only, no special characters except '-' and '_'." + elif [ -e /etc/openvpn/server/easy-rsa/pki/issued/"$client".crt ]; then + exiterr "$client: invalid name. Client already exists." + fi + fi + if [ "$export_client" = 1 ] || [ "$revoke_client" = 1 ]; then + set_client_name + if [ -z "$client" ] || [ ! -e /etc/openvpn/server/easy-rsa/pki/issued/"$client".crt ]; then + exiterr "Invalid client name, or client does not exist." + fi + fi +} + check_nftables() { if [ "$os" = "centos" ]; then if grep -qs "hwdsl2 VPN script" /etc/sysconfig/nftables.conf \ @@ -183,6 +255,7 @@ cat <<'EOF' Welcome to this OpenVPN server installer! GitHub: https://github.com/hwdsl2/openvpn-install + EOF } @@ -205,8 +278,14 @@ cat 1>&2 <