Files
topstore-server/wireguard_scripts/next_client.sh
T
2026-08-13 22:41:43 +03:00

97 lines
3.1 KiB
Bash

#!/bin/bash
# ==============================================================================
# 1. SETTINGS & GLOBALS
# ==============================================================================
# Exit immediately if a command exits with a non-zero status
set -e
# Determine the directory where this script resides
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# Global variables
server_pubkey=""
ips=""
users=""
# ==============================================================================
# 2. HELPER FUNCTIONS
# ==============================================================================
# Load environment variable of the script
environment_var() {
echo "--- Starting Environment & Pre-flight Checks ---"
# --- .env LOADING ---
# This safely loads the variables from .env without touching other files
if [ -f "$SCRIPT_DIR/.env" ]; then
set -a
source "$SCRIPT_DIR/.env"
set +a
echo "[✔] Environment variables loaded."
else
echo "[!] No .env file found. Using defaults."
fi
# --- Variable Checks ---
server_pubkey=$(cat ${WG0_DIR}/publickey)
ips=$(grep -i '^\s*AllowedIPs\s*=\s*' "${WG0_DIR}/wg0.conf" | sed 's/^\s*AllowedIPs\s*=\s*//I; s/\s*$//')
users=$(grep -i '^\s*# BEGIN_PEER \s*' "${WG0_DIR}/wg0.conf" | sed 's/^\s*# BEGIN_PEER \s*//i; s/\s*$//')
}
# Find the last registered client IP
find_last_ip() {
# Find the last ip an create the next ip
if [ -n "$ips" ]; then
last=$(printf "%s\n" "$ips" | tail -1)
addr=${last%/*} # strip /32 if present
IFS=. read -r a b c d <<< "$addr"
next_ip="10.0.0.$((d + 1))"
printf "Last CIDR: %s\nNext IP: %s/32\n" "$last" "$next_ip"
else
next_ip="10.0.0.2"
printf "No peers found, starting at %s/32\n" "$next_ip"
fi
}
# Show the template of the client's configuration file
client_show_template() {
# Show template from .client_template file
template_file="${TOOLS_DIR}/client_template"
if [ -f "$template_file" ]; then
printf "\n--- Wireguard client template (generated from %s) ---\n" "$template_file"
# Process template: replace placeholders
sed -e "s|<%CLIENT_IP%>|${next_ip}|g" \
-e "s|<%SERVER_PUBLIC_KEY%>|${server_pubkey}|g" \
-e "s|<%DOMAIN_NAME%>|${DOMAIN_NAME}|g" \
"$template_file"
else
printf "\n--- Error: Template file %s not found ---\n" "$template_file"
exit 1
fi
}
# ==============================================================================
# 3. MAIN LOGIC
# ==============================================================================
main() {
# Load environment variables first
environment_var
# Print current values
printf "Public Key of the server: %s\n" "$server_pubkey"
printf "List of current clients:\n"
paste -d '|' <(echo "$users") <(echo "$ips") | while IFS='|' read -r user ip; do
echo "User: $user -> IP: $ip"
done
printf "\n"
# Find the last IP
find_last_ip
# Show client template
client_show_template
}
# Invoke main
main "$@"