function cmd::list::_precompute_all() { # Peer data declare -gA p_ips=() p_rules=() p_subtypes=() p_last_ts=() p_last_evt=() while IFS="|" read -r name ip rule subtype last_ts last_evt; do [[ -z "$name" ]] && continue p_ips["$name"]="$ip" p_rules["$name"]="${rule:-—}" p_subtypes["$name"]="$subtype" p_last_ts["$name"]="$last_ts" p_last_evt["$name"]="$last_evt" done < <(json::peer_data "$(ctx::clients)" "$(ctx::meta)" "$(ctx::events_log)") # WireGuard handshakes + endpoints declare -gA wg_handshakes=() wg_endpoints=() while IFS=$'\t' read -r pubkey ts; do [[ -n "$pubkey" ]] && wg_handshakes["$pubkey"]="$ts" done < <(wg show "$(config::interface)" latest-handshakes 2>/dev/null) while IFS=$'\t' read -r pubkey endpoint; do [[ -n "$pubkey" ]] && wg_endpoints["$pubkey"]="$endpoint" done < <(wg show "$(config::interface)" endpoints 2>/dev/null) # Block/restricted status declare -gA p_blocked=() p_restricted=() cmd::list::_precompute_block_status p_blocked p_restricted # Public keys declare -gA p_pubkeys=() local dir dir="$(ctx::clients)" for kf in "${dir}"/*_public.key; do [[ -f "$kf" ]] || continue local kname kname=$(basename "$kf" _public.key) p_pubkeys["$kname"]=$(cat "$kf" 2>/dev/null || echo "") done # Groups has_groups=false declare -gA peer_group_map=() local groups_dir groups_dir="$(ctx::groups)" local group_files=("${groups_dir}"/*.group) if [[ -f "${group_files[0]}" ]]; then has_groups=true while IFS=":" read -r peer_name group_name; do [[ -n "$peer_name" ]] && peer_group_map["$peer_name"]="$group_name" done < <(json::peer_group_map "$groups_dir") fi # Transfer/activity data — keyed by pubkey declare -gA p_rx=() p_tx=() p_activity=() while IFS="|" read -r pubkey rx tx level; do [[ -z "$pubkey" ]] && continue p_rx["$pubkey"]="$rx" p_tx["$pubkey"]="$tx" p_activity["$pubkey"]="$level" done < <(json::peer_transfer "$(config::interface)") }