wgctl/modules/keys.module.sh
2026-05-06 23:02:12 +00:00

111 lines
2.3 KiB
Bash

#!/usr/bin/env bash
# ============================================
# Lifecycle
# ============================================
function keys::on_load() {
system::require_command wg
system::require_command qrencode
}
# ============================================
# Generation
# ============================================
function keys::generate_pair() {
local name="$1"
local dir
dir="$(ctx::clients)"
local private_key_file="${dir}/${name}_private.key"
local public_key_file="${dir}/${name}_public.key"
if [[ -f "$private_key_file" ]] || [[ -f "$public_key_file" ]]; then
log::wg_warning "Keys already exist for client: ${name}"
return 1
fi
wg genkey | tee "$private_key_file" | wg pubkey > "$public_key_file"
chmod 600 "$private_key_file"
log::wg_key "Generated key pair for: ${name}"
}
function keys::private() {
local name="$1"
local file
file="$(ctx::clients)/${name}_private.key"
if [[ ! -f "$file" ]]; then
log::error "Private key not found for: ${name}"
return 1
fi
cat "$file"
}
function keys::public() {
local name="$1"
local file
file="$(ctx::clients)/${name}_public.key"
if [[ ! -f "$file" ]]; then
log::error "Public key not found for: ${name}"
return 1
fi
cat "$file"
}
# ============================================
# Query
# ============================================
function keys::find_by_public() {
local public_key="$1"
local clients_dir
clients_dir="$(ctx::clients)"
for pubkey_file in "${clients_dir}"/*_public.key; do
[[ -f "$pubkey_file" ]] || continue
if [[ "$(cat "$pubkey_file")" == "$public_key" ]]; then
basename "$pubkey_file" _public.key
return 0
fi
done
return 1
}
# ============================================
# Removal
# ============================================
function keys::remove() {
local name="$1"
local dir
dir="$(ctx::clients)"
rm -f "${dir}/${name}_private.key"
rm -f "${dir}/${name}_public.key"
log::wg_key "Removed keys for: ${name}"
}
# ============================================
# QR Code
# ============================================
function keys::qr() {
local name="$1"
local conf
conf="$(ctx::clients)/${name}.conf"
if [[ ! -f "$conf" ]]; then
log::error "Client config not found: ${name}"
return 1
fi
log::wg_qr "QR code for: ${name}"
qrencode -t ansiutf8 < "$conf"
}