81 lines
1.8 KiB
Bash
Executable File
81 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
set -o errexit
|
|
|
|
mode="fg"
|
|
pid_path=""
|
|
pass_path="accounts/fhnw/students.fhnw.ch"
|
|
op_args=""
|
|
|
|
display_help() {
|
|
echo "Usage: $0 [option...] " >&2
|
|
echo
|
|
echo " -m, vpn mode (one of \"fg\", \"bg\") [default: $mode]"
|
|
echo " -t, path to pid file if run in \"bg\" mode [default: mktemp]"
|
|
echo " -p, path for pass to get user and password information [default: $pass_path]"
|
|
echo " -h, display this help and exit"
|
|
echo
|
|
}
|
|
|
|
parse_args() {
|
|
while getopts ":hm:t:p:" opt; do
|
|
case $opt in
|
|
h)
|
|
display_help
|
|
exit 0
|
|
;;
|
|
m)
|
|
mode=$OPTARG
|
|
;;
|
|
t)
|
|
pid_path=$OPTARG
|
|
;;
|
|
p)
|
|
pass_path=$OPTARG
|
|
;;
|
|
\?)
|
|
echo "Invalid option: -$OPTARG" >&2
|
|
display_help
|
|
exit 1
|
|
;;
|
|
:)
|
|
echo "Option -$OPTARG requires an argument." >&2
|
|
display_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
get_account_info() {
|
|
echo "getting password and token from pass..."
|
|
acc_info="$(pass "$pass_path")"
|
|
acc_pw="$(echo "$acc_info" | head -n 1)"
|
|
acc_user="$(echo "$acc_info" | awk -F ': ' '/^login:/ {print $2}')"
|
|
acc_token="$(echo "$acc_info" | awk -F ': ' '/^otp-secret:/ {print $2}')"
|
|
}
|
|
|
|
connect_vpn() {
|
|
if [ "$mode" != "fg" ]; then
|
|
if [ -z "$pid_path" ]; then
|
|
pid_file="$(SUDO_PROMPT="sudo pw for pid: " sudo mktemp)"
|
|
else
|
|
pid_file="$pid_path"
|
|
fi
|
|
echo "vpn-pid: $pid_file"
|
|
op_args=" --pid-file=$pid_file --background"
|
|
fi
|
|
|
|
echo "getting vpn cookie..."
|
|
eval "$(ocma -v -u "$acc_user" -p "$acc_pw" -m "$acc_token" --print-to-stdout)"
|
|
|
|
op_args="$op_args --cookie=$VPN_COOKIE"
|
|
cmd="openconnect$op_args $VPN_HOST"
|
|
|
|
# shellcheck disable=2086
|
|
SUDO_PROMPT="sudo pw for vpn connection: " sudo $cmd
|
|
}
|
|
|
|
parse_args "$@"
|
|
get_account_info
|
|
connect_vpn
|