mirror of
https://github.com/andrey271192/PCA_Phobos.git
synced 2026-09-20 11:55:32 +00:00
fix: allocate client IPs from used metadata
This commit is contained in:
@@ -45,38 +45,41 @@ action_add() {
|
|||||||
local server_pub="$SERVER_WG_PUBLIC_KEY"
|
local server_pub="$SERVER_WG_PUBLIC_KEY"
|
||||||
local server_ip_v4="${SERVER_PUBLIC_IP_V4:-}"
|
local server_ip_v4="${SERVER_PUBLIC_IP_V4:-}"
|
||||||
local server_ip_v6="${SERVER_PUBLIC_IP_V6:-}"
|
local server_ip_v6="${SERVER_PUBLIC_IP_V6:-}"
|
||||||
|
local server_wg_network="${SERVER_WG_IPV4_NETWORK:-10.25.0.0/16}"
|
||||||
|
|
||||||
local client_ip_v4="$manual_ip"
|
local client_ip_v4="$manual_ip"
|
||||||
local ipv4_prefix_main=$(echo "${SERVER_WG_IPV4_NETWORK:-10.25.0.0/16}" | cut -d'/' -f1 | cut -d'.' -f1-2)
|
|
||||||
local ipv6_prefix_main=$(echo "${SERVER_WG_IPV6_NETWORK:-fd00:10:25::/48}" | cut -d'/' -f1 | sed 's/::.*//')
|
local ipv6_prefix_main=$(echo "${SERVER_WG_IPV6_NETWORK:-fd00:10:25::/48}" | cut -d'/' -f1 | sed 's/::.*//')
|
||||||
|
|
||||||
if [[ -z "$client_ip_v4" ]]; then
|
if [[ -z "$client_ip_v4" ]]; then
|
||||||
log_info "Поиск свободного IP..."
|
log_info "Поиск свободного IP..."
|
||||||
declare -A used_ips
|
local used_ips=""
|
||||||
|
|
||||||
for d in "$CLIENTS_DIR"/*; do
|
for d in "$CLIENTS_DIR"/*; do
|
||||||
if [[ -d "$d" ]] && [[ -f "$d/metadata.json" ]]; then
|
if [[ -d "$d" ]] && [[ -f "$d/metadata.json" ]]; then
|
||||||
local ip=$(jq -r '.tunnel_ip_v4 // empty' "$d/metadata.json" 2>/dev/null)
|
local ip=$(jq -r '.tunnel_ip_v4 // empty' "$d/metadata.json" 2>/dev/null | cut -d/ -f1)
|
||||||
[[ -n "$ip" ]] && used_ips["$ip"]=1
|
[[ -n "$ip" ]] && used_ips="${used_ips}${ip}"$'\n'
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
used_ips["${ipv4_prefix_main}.0.1"]=1
|
client_ip_v4="$(USED_IPS="$used_ips" python3 - "$server_wg_network" <<'PY'
|
||||||
|
import ipaddress
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
local found=false
|
net = ipaddress.ip_network(sys.argv[1], strict=False)
|
||||||
for oct3 in {0..255}; do
|
used = {line.strip() for line in os.environ.get("USED_IPS", "").splitlines() if line.strip()}
|
||||||
local start_oct4=2
|
hosts = net.hosts()
|
||||||
for oct4 in $(seq $start_oct4 254); do
|
reserved_first = True
|
||||||
local candidate="${ipv4_prefix_main}.${oct3}.${oct4}"
|
for candidate in hosts:
|
||||||
if [[ -z "${used_ips[$candidate]:-}" ]]; then
|
ip = str(candidate)
|
||||||
client_ip_v4="$candidate"
|
if reserved_first:
|
||||||
found=true
|
reserved_first = False
|
||||||
break 2
|
continue
|
||||||
fi
|
if ip not in used:
|
||||||
done
|
print(ip)
|
||||||
done
|
raise SystemExit(0)
|
||||||
|
raise SystemExit(1)
|
||||||
[[ "$found" == "false" ]] && die "Нет свободных IP в подсети."
|
PY
|
||||||
|
)" || die "Нет свободных IP в подсети."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local oct3=$(echo "$client_ip_v4" | cut -d. -f3)
|
local oct3=$(echo "$client_ip_v4" | cut -d. -f3)
|
||||||
|
|||||||
Reference in New Issue
Block a user