gistfile1.txt
· 5.7 KiB · Text
Originalformat
function cmd::logs::show_fw_events() {
local filter_ip="${1:-}" filter_name="${2:-}" filter_type="${3:-}" \
limit="${4:-50}" net_file="${5:-}" collapse="${6:-1}" \
since="${7:-}" filter_dest_ip="${8:-}" filter_dest_port="${9:-}" \
sort_order="${10:-desc}" resolved_only="${11:-false}"
[[ ! -f "$FW_EVENTS_LOG" ]] && return 0
local data
data=$(json::fw_events \
"$FW_EVENTS_LOG" "$filter_ip" "$filter_type" \
"$(ctx::clients)" "${net_file:-}" \
"$limit" "$collapse" "$since" \
"$filter_dest_ip" "$filter_dest_port" \
"$sort_order" \
2>/dev/null)
[[ -z "$data" ]] && return 0
# ── Pass 1: resolve endpoints and measure widths ──
local w_client=16 w_dest=20 w_endpoint=0
local resolved_data=""
while IFS='|' read -r ts client dest_ip dest_port proto svc count src_endpoint; do
[[ -z "$ts" ]] && continue
# Measure client
(( ${#client} > w_client )) && w_client=${#client}
# Build svc_display (for w_dest measurement)
local svc_display=""
if [[ -n "$svc" ]]; then
[[ -n "$dest_port" ]] && svc_display="${svc}/${proto}" \
|| svc_display="${svc} (${proto})"
else
[[ -n "$dest_port" ]] && svc_display="${dest_ip}:${dest_port}/${proto}" \
|| svc_display="${dest_ip} (${proto})"
fi
# Build raw_suffix plain (no ANSI) for w_dest measurement
local raw_plain=""
if [[ -n "$svc" ]]; then
[[ -n "$dest_port" ]] && raw_plain=" (${dest_ip}:${dest_port})" \
|| raw_plain=" (${dest_ip})"
fi
local measure_len
if $resolved_only; then
measure_len=${#svc_display}
else
local raw_plain=""
[[ -n "$svc" && -n "$dest_port" ]] && raw_plain=" (${dest_ip}:${dest_port})"
[[ -n "$svc" && -z "$dest_port" ]] && raw_plain=" (${dest_ip})"
measure_len=$(( ${#svc_display} + ${#raw_plain} ))
fi
(( measure_len > w_dest )) && w_dest=$measure_len
# Resolve endpoint once
local src_resolved=""
if [[ -n "$src_endpoint" ]]; then
src_resolved=$(resolve::ip "$src_endpoint" 2>/dev/null || true)
[[ "$src_resolved" == "$src_endpoint" ]] && src_resolved=""
# Measure endpoint column: raw IP + " → resolved"
local ep_display_len=${#src_endpoint}
[[ -n "$src_resolved" ]] && ep_display_len=$(( ep_display_len + 4 + ${#src_resolved} ))
(( ep_display_len > w_endpoint )) && w_endpoint=$ep_display_len
fi
if [[ -n "$src_endpoint" ]]; then
local ep_measure_len
if $resolved_only; then
ep_measure_len=${#src_resolved}
[[ -z "$src_resolved" ]] && ep_measure_len=${#src_endpoint}
else
ep_measure_len=${#src_endpoint}
[[ -n "$src_resolved" ]] && \
ep_measure_len=$(( ${#src_endpoint} + 4 + ${#src_resolved} ))
fi
(( ep_measure_len > w_endpoint )) && w_endpoint=$ep_measure_len
fi
resolved_data+="${ts}|${client}|${dest_ip}|${dest_port}|${proto}|${svc}|${count}|${src_endpoint}|${src_resolved}"$'\n'
done <<< "$data"
(( w_client += 2 ))
(( w_dest += 2 ))
[[ "$w_endpoint" -gt 0 ]] && (( w_endpoint += 2 ))
# ── Pass 2: render ──
ui::logs::fw_section_header
while IFS='|' read -r ts client dest_ip dest_port proto svc count src_endpoint src_resolved; do
[[ -z "$ts" ]] && continue
ui::logs::fw_row "$ts" "$client" "$dest_ip" "$dest_port" \
"$proto" "$svc" "$count" "$w_client" "$w_dest" \
"$src_endpoint" "$src_resolved" "$w_endpoint" "$resolved_only"
done <<< "$resolved_data"
printf "\n"
}
function cmd::logs::show_wg_events() {
local filter_ip="${1:-}" filter_name="${2:-}" filter_type="${3:-}" \
limit="${4:-50}" collapse="${5:-1}" \
since="${6:-}" filter_event="${7:-}" sort_order="${8:-desc}" \
resolved_only="${9:-false}"
[[ ! -f "$WG_EVENTS_LOG" ]] && return 0
local data
data=$(json::wg_events \
"$WG_EVENTS_LOG" "$filter_name" "$filter_type" \
"$limit" "$collapse" "$since" "$filter_event" \
"$(ctx::endpoint_cache)" "$sort_order" \
2>/dev/null)
[[ -z "$data" ]] && return 0
local w_client=16 w_endpoint=16
local resolved_data=""
while IFS='|' read -r ts client endpoint event count gap_seconds; do
[[ -z "$ts" ]] && continue
(( ${#client} > w_client )) && w_client=${#client}
local resolved=""
[[ -n "$endpoint" ]] && resolved=$(resolve::ip "$endpoint" 2>/dev/null || true)
[[ "$resolved" == "$endpoint" ]] && resolved=""
# In resolved_only mode, use resolved name as display (or raw if unresolved)
local ep_display
if $resolved_only; then
ep_display="${resolved:-$endpoint}"
[[ -z "$ep_display" ]] && ep_display="-"
else
ep_display="${endpoint:--}"
fi
(( ${#ep_display} > w_endpoint )) && w_endpoint=${#ep_display}
# Extra width for annotation when not resolved_only
$resolved_only || {
[[ -n "$resolved" && -n "$endpoint" ]] && \
w_endpoint=$(( w_endpoint > ${#endpoint} + 4 + ${#resolved} \
? w_endpoint : ${#endpoint} + 4 + ${#resolved} ))
}
resolved_data+="${ts}|${client}|${endpoint}|${event}|${count}|${gap_seconds}|${resolved}|${ep_display}"$'\n'
done <<< "$data"
(( w_client += 2 ))
(( w_endpoint += 2 ))
$resolved_only || (( w_endpoint += 4 )) # space for annotation
ui::logs::wg_section_header
while IFS='|' read -r ts client endpoint event count gap_seconds resolved ep_display; do
[[ -z "$ts" ]] && continue
if $resolved_only; then
ui::logs::wg_row "$ts" "$client" "$ep_display" "$event" \
"$count" "$w_client" "$w_endpoint" "$gap_seconds" ""
else
ui::logs::wg_row "$ts" "$client" "$endpoint" "$event" \
"$count" "$w_client" "$w_endpoint" "$gap_seconds" "$resolved"
fi
done <<< "$resolved_data"
printf "\n"
}
| 1 | function cmd::logs::show_fw_events() { |
| 2 | local filter_ip="${1:-}" filter_name="${2:-}" filter_type="${3:-}" \ |
| 3 | limit="${4:-50}" net_file="${5:-}" collapse="${6:-1}" \ |
| 4 | since="${7:-}" filter_dest_ip="${8:-}" filter_dest_port="${9:-}" \ |
| 5 | sort_order="${10:-desc}" resolved_only="${11:-false}" |
| 6 | |
| 7 | [[ ! -f "$FW_EVENTS_LOG" ]] && return 0 |
| 8 | |
| 9 | local data |
| 10 | data=$(json::fw_events \ |
| 11 | "$FW_EVENTS_LOG" "$filter_ip" "$filter_type" \ |
| 12 | "$(ctx::clients)" "${net_file:-}" \ |
| 13 | "$limit" "$collapse" "$since" \ |
| 14 | "$filter_dest_ip" "$filter_dest_port" \ |
| 15 | "$sort_order" \ |
| 16 | 2>/dev/null) |
| 17 | |
| 18 | [[ -z "$data" ]] && return 0 |
| 19 | |
| 20 | # ── Pass 1: resolve endpoints and measure widths ── |
| 21 | local w_client=16 w_dest=20 w_endpoint=0 |
| 22 | local resolved_data="" |
| 23 | |
| 24 | while IFS='|' read -r ts client dest_ip dest_port proto svc count src_endpoint; do |
| 25 | [[ -z "$ts" ]] && continue |
| 26 | |
| 27 | # Measure client |
| 28 | (( ${#client} > w_client )) && w_client=${#client} |
| 29 | |
| 30 | # Build svc_display (for w_dest measurement) |
| 31 | local svc_display="" |
| 32 | if [[ -n "$svc" ]]; then |
| 33 | [[ -n "$dest_port" ]] && svc_display="${svc}/${proto}" \ |
| 34 | || svc_display="${svc} (${proto})" |
| 35 | else |
| 36 | [[ -n "$dest_port" ]] && svc_display="${dest_ip}:${dest_port}/${proto}" \ |
| 37 | || svc_display="${dest_ip} (${proto})" |
| 38 | fi |
| 39 | |
| 40 | # Build raw_suffix plain (no ANSI) for w_dest measurement |
| 41 | local raw_plain="" |
| 42 | if [[ -n "$svc" ]]; then |
| 43 | [[ -n "$dest_port" ]] && raw_plain=" (${dest_ip}:${dest_port})" \ |
| 44 | || raw_plain=" (${dest_ip})" |
| 45 | fi |
| 46 | |
| 47 | local measure_len |
| 48 | if $resolved_only; then |
| 49 | measure_len=${#svc_display} |
| 50 | else |
| 51 | local raw_plain="" |
| 52 | [[ -n "$svc" && -n "$dest_port" ]] && raw_plain=" (${dest_ip}:${dest_port})" |
| 53 | [[ -n "$svc" && -z "$dest_port" ]] && raw_plain=" (${dest_ip})" |
| 54 | measure_len=$(( ${#svc_display} + ${#raw_plain} )) |
| 55 | fi |
| 56 | (( measure_len > w_dest )) && w_dest=$measure_len |
| 57 | |
| 58 | # Resolve endpoint once |
| 59 | local src_resolved="" |
| 60 | if [[ -n "$src_endpoint" ]]; then |
| 61 | src_resolved=$(resolve::ip "$src_endpoint" 2>/dev/null || true) |
| 62 | [[ "$src_resolved" == "$src_endpoint" ]] && src_resolved="" |
| 63 | # Measure endpoint column: raw IP + " → resolved" |
| 64 | local ep_display_len=${#src_endpoint} |
| 65 | [[ -n "$src_resolved" ]] && ep_display_len=$(( ep_display_len + 4 + ${#src_resolved} )) |
| 66 | (( ep_display_len > w_endpoint )) && w_endpoint=$ep_display_len |
| 67 | fi |
| 68 | |
| 69 | if [[ -n "$src_endpoint" ]]; then |
| 70 | local ep_measure_len |
| 71 | if $resolved_only; then |
| 72 | ep_measure_len=${#src_resolved} |
| 73 | [[ -z "$src_resolved" ]] && ep_measure_len=${#src_endpoint} |
| 74 | else |
| 75 | ep_measure_len=${#src_endpoint} |
| 76 | [[ -n "$src_resolved" ]] && \ |
| 77 | ep_measure_len=$(( ${#src_endpoint} + 4 + ${#src_resolved} )) |
| 78 | fi |
| 79 | (( ep_measure_len > w_endpoint )) && w_endpoint=$ep_measure_len |
| 80 | fi |
| 81 | |
| 82 | resolved_data+="${ts}|${client}|${dest_ip}|${dest_port}|${proto}|${svc}|${count}|${src_endpoint}|${src_resolved}"$'\n' |
| 83 | done <<< "$data" |
| 84 | |
| 85 | (( w_client += 2 )) |
| 86 | (( w_dest += 2 )) |
| 87 | [[ "$w_endpoint" -gt 0 ]] && (( w_endpoint += 2 )) |
| 88 | |
| 89 | # ── Pass 2: render ── |
| 90 | ui::logs::fw_section_header |
| 91 | while IFS='|' read -r ts client dest_ip dest_port proto svc count src_endpoint src_resolved; do |
| 92 | [[ -z "$ts" ]] && continue |
| 93 | ui::logs::fw_row "$ts" "$client" "$dest_ip" "$dest_port" \ |
| 94 | "$proto" "$svc" "$count" "$w_client" "$w_dest" \ |
| 95 | "$src_endpoint" "$src_resolved" "$w_endpoint" "$resolved_only" |
| 96 | done <<< "$resolved_data" |
| 97 | printf "\n" |
| 98 | } |
| 99 | function cmd::logs::show_wg_events() { |
| 100 | local filter_ip="${1:-}" filter_name="${2:-}" filter_type="${3:-}" \ |
| 101 | limit="${4:-50}" collapse="${5:-1}" \ |
| 102 | since="${6:-}" filter_event="${7:-}" sort_order="${8:-desc}" \ |
| 103 | resolved_only="${9:-false}" |
| 104 | |
| 105 | [[ ! -f "$WG_EVENTS_LOG" ]] && return 0 |
| 106 | |
| 107 | local data |
| 108 | data=$(json::wg_events \ |
| 109 | "$WG_EVENTS_LOG" "$filter_name" "$filter_type" \ |
| 110 | "$limit" "$collapse" "$since" "$filter_event" \ |
| 111 | "$(ctx::endpoint_cache)" "$sort_order" \ |
| 112 | 2>/dev/null) |
| 113 | |
| 114 | [[ -z "$data" ]] && return 0 |
| 115 | |
| 116 | local w_client=16 w_endpoint=16 |
| 117 | local resolved_data="" |
| 118 | |
| 119 | while IFS='|' read -r ts client endpoint event count gap_seconds; do |
| 120 | [[ -z "$ts" ]] && continue |
| 121 | (( ${#client} > w_client )) && w_client=${#client} |
| 122 | |
| 123 | local resolved="" |
| 124 | [[ -n "$endpoint" ]] && resolved=$(resolve::ip "$endpoint" 2>/dev/null || true) |
| 125 | [[ "$resolved" == "$endpoint" ]] && resolved="" |
| 126 | |
| 127 | # In resolved_only mode, use resolved name as display (or raw if unresolved) |
| 128 | local ep_display |
| 129 | if $resolved_only; then |
| 130 | ep_display="${resolved:-$endpoint}" |
| 131 | [[ -z "$ep_display" ]] && ep_display="-" |
| 132 | else |
| 133 | ep_display="${endpoint:--}" |
| 134 | fi |
| 135 | |
| 136 | (( ${#ep_display} > w_endpoint )) && w_endpoint=${#ep_display} |
| 137 | # Extra width for annotation when not resolved_only |
| 138 | $resolved_only || { |
| 139 | [[ -n "$resolved" && -n "$endpoint" ]] && \ |
| 140 | w_endpoint=$(( w_endpoint > ${#endpoint} + 4 + ${#resolved} \ |
| 141 | ? w_endpoint : ${#endpoint} + 4 + ${#resolved} )) |
| 142 | } |
| 143 | |
| 144 | resolved_data+="${ts}|${client}|${endpoint}|${event}|${count}|${gap_seconds}|${resolved}|${ep_display}"$'\n' |
| 145 | done <<< "$data" |
| 146 | |
| 147 | (( w_client += 2 )) |
| 148 | (( w_endpoint += 2 )) |
| 149 | $resolved_only || (( w_endpoint += 4 )) # space for annotation |
| 150 | |
| 151 | ui::logs::wg_section_header |
| 152 | while IFS='|' read -r ts client endpoint event count gap_seconds resolved ep_display; do |
| 153 | [[ -z "$ts" ]] && continue |
| 154 | if $resolved_only; then |
| 155 | ui::logs::wg_row "$ts" "$client" "$ep_display" "$event" \ |
| 156 | "$count" "$w_client" "$w_endpoint" "$gap_seconds" "" |
| 157 | else |
| 158 | ui::logs::wg_row "$ts" "$client" "$endpoint" "$event" \ |
| 159 | "$count" "$w_client" "$w_endpoint" "$gap_seconds" "$resolved" |
| 160 | fi |
| 161 | done <<< "$resolved_data" |
| 162 | printf "\n" |
| 163 | } |
| 164 |