Последняя активность 1 month ago

gistfile1.txt Исходник
1function ui::logs::fw_row() {
2 local ts="${1:-}" client="${2:-}" dest_ip="${3:-}" dest_port="${4:-}" \
3 proto="${5:-}" svc_name="${6:-}" count="${7:-1}" \
4 w_client="${8:-20}" w_dest="${9:-30}" \
5 src_endpoint="${10:-}" src_resolved="${11:-}" \
6 w_endpoint="${12:-0}" resolved_only="${13:-false}"
7
8 local ts_pad client_pad
9 ts_pad=$(printf "%-11s" "$ts")
10 client_pad=$(printf "%-${w_client}s" "$client")
11
12 # ── Source endpoint ──
13 local src_padded=""
14 if [[ "$w_endpoint" -gt 0 ]]; then
15 if [[ -n "$src_endpoint" ]]; then
16 local src_colored
17 if $resolved_only; then
18 # Show resolved name only, or raw if unresolved
19 src_colored="${src_resolved:-$src_endpoint}"
20 else
21 src_colored="$src_endpoint"
22 [[ -n "$src_resolved" ]] && \
23 src_colored="${src_endpoint} \033[2m→ ${src_resolved}\033[0m"
24 fi
25 src_padded=$(ui::pad_mb "$src_colored" "$w_endpoint")
26 else
27 src_padded=$(ui::pad_mb "\033[2m—\033[0m" "$w_endpoint")
28 fi
29 fi
30
31 # ── Destination ──
32 local svc_display="" raw_suffix=""
33 if [[ -n "$svc_name" ]]; then
34 [[ -n "$dest_port" ]] && svc_display="${svc_name}/${proto}" \
35 || svc_display="${svc_name} (${proto})"
36 # Only add raw suffix when not resolved_only
37 if ! $resolved_only; then
38 [[ -n "$dest_port" ]] && raw_suffix=" \033[2m(${dest_ip}:${dest_port})\033[0m" \
39 || raw_suffix=" \033[2m(${dest_ip})\033[0m"
40 fi
41 else
42 [[ -n "$dest_port" ]] && svc_display="${dest_ip}:${dest_port}/${proto}" \
43 || svc_display="${dest_ip} (${proto})"
44 fi
45
46 # Pad for count alignment
47 local raw_plain=""
48 if ! $resolved_only; then
49 [[ -n "$svc_name" && -n "$dest_port" ]] && raw_plain=" (${dest_ip}:${dest_port})"
50 [[ -n "$svc_name" && -z "$dest_port" ]] && raw_plain=" (${dest_ip})"
51 fi
52 local full_dest_len=$(( ${#svc_display} + ${#raw_plain} ))
53 local dest_pad_n=$(( w_dest - full_dest_len ))
54 [[ $dest_pad_n -lt 0 ]] && dest_pad_n=0
55
56 # ── Count ──
57 local count_suffix=""
58 [[ "$count" -gt 1 ]] && count_suffix=" \033[2m(x${count})\033[0m"
59
60 # ── Render ──
61 if [[ "$w_endpoint" -gt 0 ]]; then
62 printf " %s %s %b \033[1;31m→\033[0m %s%b%*s%b\n" \
63 "$ts_pad" "$client_pad" \
64 "$src_padded" \
65 "$svc_display" "$raw_suffix" \
66 "$dest_pad_n" "" \
67 "$count_suffix"
68 else
69 printf " %s %s \033[1;31m→\033[0m %s%b%*s%b\n" \
70 "$ts_pad" "$client_pad" \
71 "$svc_display" "$raw_suffix" \
72 "$dest_pad_n" "" \
73 "$count_suffix"
74 fi
75}
76function ui::logs::wg_row() {
77 local ts="${1:-}" client="${2:-}" endpoint="${3:-}" event="${4:-}" \
78 count="${5:-1}" w_client="${6:-20}" w_endpoint="${7:-20}" \
79 gap_seconds="${8:-}" resolved="${9:-}"
80
81 local event_color
82 case "$event" in
83 handshake) event_color="\033[1;32m" ;;
84 attempt) event_color="\033[1;31m" ;;
85 *) event_color="\033[0;37m" ;;
86 esac
87
88 local count_suffix=""
89 [[ "$count" -gt 1 ]] && count_suffix=" \033[2m(x${count})\033[0m"
90
91 # Gap suffix — offline label only when gap > threshold * 2
92 local gap_suffix=""
93 if [[ "$event" == "handshake" && -n "$gap_seconds" && "$gap_seconds" -gt 0 ]]; then
94 local gap_int="$gap_seconds"
95 local threshold="${WG_HANDSHAKE_CHECK_TIME_SEC:-300}"
96 local offline_label=""
97 [[ "$gap_int" -gt $(( threshold * 2 )) ]] && offline_label=" offline"
98 if (( gap_int >= 3600 )); then
99 gap_suffix=" \033[2m↑ $(( gap_int / 3600 ))h${offline_label}\033[0m"
100 elif (( gap_int >= 60 )); then
101 gap_suffix=" \033[2m↑ $(( gap_int / 60 ))m${offline_label}\033[0m"
102 fi
103 fi
104
105 # Build endpoint display: raw_ip [dim → resolved]
106 # Use ui::pad_mb so ANSI annotation doesn't affect column alignment
107 local endpoint_raw="${endpoint:--}"
108 local endpoint_colored
109 if [[ -n "$resolved" && -n "$endpoint" ]]; then
110 endpoint_colored="${endpoint} \033[2m→ ${resolved}\033[0m"
111 else
112 endpoint_colored="$endpoint_raw"
113 fi
114 local endpoint_padded
115 endpoint_padded=$(ui::pad_mb "$endpoint_colored" "$w_endpoint")
116
117 local ts_pad client_pad
118 ts_pad=$(printf "%-11s" "$ts")
119 client_pad=$(printf "%-${w_client}s" "$client")
120
121 printf " %s %s %b %b%s\033[0m%b%b\n" \
122 "$ts_pad" "$client_pad" \
123 "$endpoint_padded" \
124 "$event_color" "$event" "$count_suffix" "$gap_suffix"
125}