diff --git a/scripts/openvpn/clientStat.sh b/scripts/openvpn/clientStat.sh index ef04114..4737d7f 100755 --- a/scripts/openvpn/clientStat.sh +++ b/scripts/openvpn/clientStat.sh @@ -3,36 +3,82 @@ STATUS_LOG="/var/log/openvpn-status.log" -function hr() { - numfmt --to=iec-i --suffix=B "$1" +if [ ! -f "${STATUS_LOG}" ]; then + echo "The file: $STATUS_LOG was not found!" + exit 1 +fi + +scriptusage(){ + echo "::: List any connected clients to the server" + echo ":::" + echo "::: Usage: pivpn <-c|clients> [-b|bytes]" + echo ":::" + echo "::: Commands:" + echo "::: [none] List clients with human readable format" + echo "::: -b, bytes List clients with dotted decimal notation" + echo "::: -h, help Show this usage dialog" } -printf "\n" -if [ ! -f "${STATUS_LOG}" ]; then - echo "The file: $STATUS_LOG was not found!" - exit 1 -fi +hr(){ + numfmt --to=iec-i --suffix=B "$1" +} -printf ": NOTE : The output below is NOT real-time!\n" -printf ": : It may be off by a few minutes.\n" -printf "\n" -printf "\e[1m::: Client Status List :::\e[0m\n" -{ -printf "\e[4mName\e[0m \t \e[4mRemote IP\e[0m \t \e[4mVirtual IP\e[0m \t \e[4mBytes Received\e[0m \t \e[4mBytes Sent\e[0m \t \e[4mConnected Since\e[0m\n" +listClients(){ + printf ": NOTE : The output below is NOT real-time!\n" + printf ": : It may be off by a few minutes.\n" + printf "\n" + printf "\e[1m::: Client Status List :::\e[0m\n" -if grep -q "^CLIENT_LIST" "${STATUS_LOG}"; then - if [ -n "$(type -t numfmt)" ]; then - while read -r line; do + { + printf "\e[4mName\e[0m \t \e[4mRemote IP\e[0m \t \e[4mVirtual IP\e[0m \t \e[4mBytes Received\e[0m \t \e[4mBytes Sent\e[0m \t \e[4mConnected Since\e[0m\n" + + if grep -q "^CLIENT_LIST" "${STATUS_LOG}"; then + if [ -n "$(type -t numfmt)" ]; then + if [ "$HR" = 1 ]; then + while read -r line; do read -r -a array <<< $line [[ ${array[0]} = CLIENT_LIST ]] || continue - printf "%s \t %s \t %s \t %s \t %s \t %s %s %s - %s\n" ${array[1]} ${array[2]} ${array[3]} $(hr ${array[4]}) $(hr ${array[5]}) ${array[7]} ${array[8]} ${array[10]} ${array[9]} - done <$STATUS_LOG - else + printf "%s \t %s \t %s \t %s \t %s \t %s %s %s - %s\n" ${array[1]} ${array[2]} ${array[3]} $(hr ${array[4]}) $(hr ${array[5]}) ${array[7]} ${array[8]} ${array[10]} ${array[9]} + done <$STATUS_LOG + else + while read -r line; do + read -r -a array <<< $line + [[ ${array[0]} = CLIENT_LIST ]] || continue + printf "%s \t %s \t %s \t %'d \t %'d \t %s %s %s - %s\n" ${array[1]} ${array[2]} ${array[3]} ${array[4]} ${array[5]} ${array[7]} ${array[8]} ${array[10]} ${array[9]} + done <$STATUS_LOG + fi + else awk -F' ' -v s='CLIENT_LIST' '$1 == s {print $2"\t\t"$3"\t"$4"\t"$5"\t\t"$6"\t\t"$8" "$9" "$11" - "$10"\n"}' ${STATUS_LOG} - fi + fi + else + printf "\nNo Clients Connected!\n" + fi + + printf "\n" + } | column -t -s $'\t' +} + +if [[ $# -eq 0 ]]; then + HR=1 + listClients else - printf "\nNo Clients Connected!\n" + while true; do + case "$1" in + -b|bytes) + HR=0 + listClients + exit 0 + ;; + -h|help) + scriptusage + exit 0 + ;; + *) + HR=0 + listClients + exit 0 + ;; + esac + done fi -printf "\n" -} | column -t -s $'\t' \ No newline at end of file diff --git a/scripts/openvpn/pivpn b/scripts/openvpn/pivpn index c18049f..27d2d98 100755 --- a/scripts/openvpn/pivpn +++ b/scripts/openvpn/pivpn @@ -17,7 +17,8 @@ function makeOVPNFunc { } function listClientsFunc { - $SUDO /opt/pivpn/clientStat.sh + shift + $SUDO /opt/pivpn/clientStat.sh "$@" exit 0 } @@ -93,7 +94,7 @@ fi # Handle redirecting to specific functions based on arguments case "$1" in "-a" | "add" ) makeOVPNFunc "$@";; -"-c" | "clients" ) listClientsFunc;; +"-c" | "clients" ) listClientsFunc "$@";; "-d" | "debug" ) debugFunc;; "-l" | "list" ) listOVPNFunc;; "-r" | "revoke" ) removeOVPNFunc "$@";; diff --git a/scripts/wireguard/clientSTAT.sh b/scripts/wireguard/clientSTAT.sh index f75050f..166085f 100755 --- a/scripts/wireguard/clientSTAT.sh +++ b/scripts/wireguard/clientSTAT.sh @@ -1,43 +1,90 @@ -#!/bin/bash +#!/usr/bin/env bash +# PiVPN: client status script -cd /etc/wireguard/configs -if [ ! -s clients.txt ]; then +CLIENTS_FILE="/etc/wireguard/configs/clients.txt" + +if [ ! -s "$CLIENTS_FILE" ]; then echo "::: There are no clients to list" exit 1 fi +scriptusage(){ + echo "::: List any connected clients to the server" + echo ":::" + echo "::: Usage: pivpn <-c|clients> [-b|bytes]" + echo ":::" + echo "::: Commands:" + echo "::: [none] List clients with human readable format" + echo "::: -b, bytes List clients with dotted decimal notation" + echo "::: -h, help Show this usage dialog" +} + hr(){ numfmt --to=iec-i --suffix=B "$1" } -if DUMP="$(wg show wg0 dump)"; then - DUMP="$(tail -n +2 <<< "$DUMP")" -else - exit 1 -fi - -printf "\e[1m::: Connected Clients List :::\e[0m\n" - -{ -printf "\e[4mName\e[0m \t \e[4mRemote IP\e[0m \t \e[4mVirtual IP\e[0m \t \e[4mBytes Received\e[0m \t \e[4mBytes Sent\e[0m \t \e[4mLast Seen\e[0m\n" - -while IFS= read -r LINE; do - - PUBLIC_KEY="$(awk '{ print $1 }' <<< "$LINE")" - REMOTE_IP="$(awk '{ print $3 }' <<< "$LINE")" - VIRTUAL_IP="$(awk '{ print $4 }' <<< "$LINE")" - BYTES_RECEIVED="$(awk '{ print $6 }' <<< "$LINE")" - BYTES_SENT="$(awk '{ print $7 }' <<< "$LINE")" - LAST_SEEN="$(awk '{ print $5 }' <<< "$LINE")" - CLIENT_NAME="$(grep "$PUBLIC_KEY" clients.txt | awk '{ print $1 }')" - - if [ "$LAST_SEEN" -ne 0 ]; then - printf "%s \t %s \t %s \t %s \t %s \t %s\n" "$CLIENT_NAME" "$REMOTE_IP" "${VIRTUAL_IP/\/32/}" "$(hr "$BYTES_RECEIVED")" "$(hr "$BYTES_SENT")" "$(date -d @"$LAST_SEEN" '+%b %d %Y - %T')" +listClients(){ + if DUMP="$(wg show wg0 dump)"; then + DUMP="$(tail -n +2 <<< "$DUMP")" else - printf "%s \t %s \t %s \t %s \t %s \t %s\n" "$CLIENT_NAME" "$REMOTE_IP" "${VIRTUAL_IP/\/32/}" "$(hr "$BYTES_RECEIVED")" "$(hr "$BYTES_SENT")" "(not yet)" + exit 1 fi -done <<< "$DUMP" + printf "\e[1m::: Connected Clients List :::\e[0m\n" -printf "\n" -} | column -t -s $'\t' \ No newline at end of file + { + printf "\e[4mName\e[0m \t \e[4mRemote IP\e[0m \t \e[4mVirtual IP\e[0m \t \e[4mBytes Received\e[0m \t \e[4mBytes Sent\e[0m \t \e[4mLast Seen\e[0m\n" + + while IFS= read -r LINE; do + + PUBLIC_KEY="$(awk '{ print $1 }' <<< "$LINE")" + REMOTE_IP="$(awk '{ print $3 }' <<< "$LINE")" + VIRTUAL_IP="$(awk '{ print $4 }' <<< "$LINE")" + BYTES_RECEIVED="$(awk '{ print $6 }' <<< "$LINE")" + BYTES_SENT="$(awk '{ print $7 }' <<< "$LINE")" + LAST_SEEN="$(awk '{ print $5 }' <<< "$LINE")" + CLIENT_NAME="$(grep "$PUBLIC_KEY" "$CLIENTS_FILE" | awk '{ print $1 }')" + + if [ "$HR" = 1 ]; then + if [ "$LAST_SEEN" -ne 0 ]; then + printf "%s \t %s \t %s \t %s \t %s \t %s\n" "$CLIENT_NAME" "$REMOTE_IP" "${VIRTUAL_IP/\/32/}" "$(hr "$BYTES_RECEIVED")" "$(hr "$BYTES_SENT")" "$(date -d @"$LAST_SEEN" '+%b %d %Y - %T')" + else + printf "%s \t %s \t %s \t %s \t %s \t %s\n" "$CLIENT_NAME" "$REMOTE_IP" "${VIRTUAL_IP/\/32/}" "$(hr "$BYTES_RECEIVED")" "$(hr "$BYTES_SENT")" "(not yet)" + fi + else + if [ "$LAST_SEEN" -ne 0 ]; then + printf "%s \t %s \t %s \t %'d \t %'d \t %s\n" "$CLIENT_NAME" "$REMOTE_IP" "${VIRTUAL_IP/\/32/}" "$BYTES_RECEIVED" "$BYTES_SENT" "$(date -d @"$LAST_SEEN" '+%b %d %Y - %T')" + else + printf "%s \t %s \t %s \t %'d \t %'d \t %s\n" "$CLIENT_NAME" "$REMOTE_IP" "${VIRTUAL_IP/\/32/}" "$BYTES_RECEIVED" "$BYTES_SENT" "(not yet)" + fi + fi + + done <<< "$DUMP" + + printf "\n" + } | column -t -s $'\t' +} + +if [[ $# -eq 0 ]]; then + HR=1 + listClients +else + while true; do + case "$1" in + -b|bytes) + HR=0 + listClients + exit 0 + ;; + -h|help) + scriptusage + exit 0 + ;; + *) + HR=0 + listClients + exit 0 + ;; + esac + done +fi diff --git a/scripts/wireguard/pivpn b/scripts/wireguard/pivpn index d75f113..fd1ed17 100755 --- a/scripts/wireguard/pivpn +++ b/scripts/wireguard/pivpn @@ -17,7 +17,8 @@ makeConf(){ } listConnected(){ - $SUDO /opt/pivpn/clientSTAT.sh + shift + $SUDO /opt/pivpn/clientSTAT.sh "$@" exit 0 } @@ -84,7 +85,7 @@ fi # Handle redirecting to specific functions based on arguments case "$1" in "-a" | "add" ) makeConf "$@";; -"-c" | "clients" ) listConnected;; +"-c" | "clients" ) listConnected "$@";; "-d" | "debug" ) debug;; "-l" | "list" ) listClients;; "-qr" | "qrcode" ) showQrcode "$@";;