#!/usr/bin/env bash # ============================================ # Client Config # ============================================ function peers::create_client_config() { local name="$1" local type="$2" local ip="$3" local allowed_ips="${4:-$(config::allowed_ips_for "$type")}" local conf conf="$(ctx::clients)/${name}.conf" if [[ -f "$conf" ]]; then log::wg_warning "Client config already exists: ${name}" return 1 fi local private_key private_key=$(keys::private "$name") local server_public_key server_public_key=$(config::server_public_key) cat > "$conf" <> "$config" </dev/null)" ]]; then log::wg_list "No clients configured" return 0 fi for conf in "${dir}"/*.conf; do local client_name client_name=$(basename "$conf" .conf) local ip ip=$(grep "^Address" "$conf" | awk '{print $3}' | cut -d'/' -f1) local public_key public_key=$(keys::public "$client_name" 2>/dev/null || echo "unknown") # Determine type from IP local type="unknown" for t in $(config::device_types); do local subnet subnet=$(config::subnet_for "$t") if string::starts_with "$ip" "$subnet"; then type="$t" break fi done printf " %-30s %-15s %-10s %s\n" \ "$client_name" "$ip" "$type" "$public_key" done } function peers::list_by_type() { local filter_type="$1" local dir dir="$(ctx::clients)" for conf in "${dir}"/*.conf; do local client_name client_name=$(basename "$conf" .conf) local ip ip=$(grep "^Address" "$conf" | awk '{print $3}' | cut -d'/' -f1) local subnet subnet=$(config::subnet_for "$filter_type") if string::starts_with "$ip" "$subnet"; then printf " %-30s %-15s\n" "$client_name" "$ip" fi done } function peers::exists_in_server() { local name="$1" grep -q "^# ${name}$" "$(config::config_file)" } # ============================================ # Live Reload # ============================================ function peers::reload() { wg syncconf "$(config::interface)" <(wg-quick strip "$(config::interface)") log::wg_success "WireGuard config reloaded" }