最后活跃于 1 month ago

修订 f890a00f9cdaed3802756b187d7a66053703772d

gistfile1.txt 原始文件
1function cmd::activity::on_load() {
2 load_module net
3
4 flag::register --peer
5 flag::register --service
6 flag::register --ip
7 flag::register --hours
8 flag::register --type
9 flag::register --dropped
10}
11
12# ============================================
13# Help
14# ============================================
15
16function cmd::activity::help() {
17function cmd::activity::run() {
18 local filter_peer="" filter_service="" filter_ip="" filter_type=""
19 local hours=24 dropped_only=false
20
21 while [[ $# -gt 0 ]]; do
22 case "$1" in
23 --peer) filter_peer="$2"; shift 2 ;;
24 --service) filter_service="$2"; shift 2 ;;
25 --ip) filter_ip="$2"; shift 2 ;;
26 --type) filter_type="$2"; shift 2 ;;
27 --hours) hours="$2"; shift 2 ;;
28 --dropped) dropped_only=true; shift ;;
29 --help) cmd::activity::help; return ;;
30 *)
31 log::error "Unknown flag: $1"
32 cmd::activity::help
33 return 1
34 ;;
35 esac
36 done
37
38 # Resolve peer name if type provided
39 if [[ -n "$filter_peer" && -n "$filter_type" ]]; then
40 filter_peer=$(peers::resolve_and_require "$filter_peer" "$filter_type") || return 1
41 fi
42
43 # Resolve --service to IP
44 local service_ip=""
45 if [[ -n "$filter_service" ]]; then
46 service_ip=$(net::resolve "$filter_service" 2>/dev/null | head -1 | cut -d: -f1) || true
47 if [[ -z "$service_ip" ]]; then
48 log::error "Service not found: ${filter_service}"
49 return 1
50 fi
51 fi
52 [[ -n "$filter_ip" ]] && service_ip="$filter_ip"
53
54 # Fetch aggregated data
55 local data
56 data=$(json::activity_aggregate \
57 "$(ctx::fw_events_log)" \
58 "$(ctx::events_log)" \
59 "$(config::interface)" \
60 "$(ctx::net)" \
61 "$(ctx::clients)" \
62 "$(ctx::meta)" \
63 "$hours" \
64 "$filter_peer" \
65 "$service_ip" 2>/dev/null)
66
67 if [[ -z "$data" ]]; then
68 log::wg_warning "No activity data found"
69 return 0
70 fi
71
72 # Measure w_peer and w_drops from data
73 local w_peer=16 w_drops=1
74 while IFS='|' read -r type rest; do
75 case "$type" in
76 peer)
77 local name drops
78 name=$(echo "$rest" | cut -d'|' -f1)
79 drops=$(echo "$rest" | cut -d'|' -f4)
80 (( ${#name} > w_peer )) && w_peer=${#name}
81function cmd::group::show() {
82 local name=""
83
84 while [[ $# -gt 0 ]]; do
85 case "$1" in
86 --name) util::require_flag "--name" "${2:-}" || return 1; name="$2"; shift 2 ;;
87 --help) cmd::group::help; return ;;
88 *) log::error "Unknown flag: $1"; return 1 ;;
89 esac
90 done
91
92 [[ -z "$name" ]] && log::error "Missing required flag: --name" && return 1
93 group::require_exists "$name" || return 1
94
95 local group_file
96 group_file="$(group::path "$name")"
97
98 log::section "Group: ${name}"
99 printf "\n"
100
101 local desc
102 desc=$(json::get "$group_file" "desc")
103 ui::row "Description" "${desc:-—}"
104
105 local peers_list=()
106 mapfile -t peers_list < <(json::get "$group_file" "peers") || true
107 local filtered=()
108 for p in "${peers_list[@]:-}"; do
109 [[ -n "$p" ]] && filtered+=("$p")
110 done
111 peers_list=("${filtered[@]:-}")
112 local peer_count=${#peers_list[@]}
113 [[ -z "${peers_list[0]:-}" ]] && peer_count=0
114
115 local peer_word="peers"
116 [[ "$peer_count" -eq 1 ]] && peer_word="peer"
117 local valid_count=0
118 for p in "${peers_list[@]}"; do
119 [[ -z "$p" ]] && continue
120 peers::require_exists "$p" > /dev/null 2>&1 && (( valid_count++ )) || true
121 done
122 local peer_word="peers"
123 [[ "$valid_count" -eq 1 ]] && peer_word="peer"
124 ui::row "Peers" "${valid_count} ${peer_word}"
125 printf "\n"
126
127 if [[ "$peer_count" -gt 0 ]]; then
128 # Measure name and IP widths
129 local w_name=16 w_ip=13
130 for peer_name in "${peers_list[@]}"; do
131 [[ -z "$peer_name" ]] && continue
132 (( ${#peer_name} > w_name )) && w_name=${#peer_name}
133 done
134 (( w_name += 2 ))
135
136 for peer_name in "${peers_list[@]}"; do
137 [[ -z "$peer_name" ]] && continue
138
139 if ! peers::require_exists "$peer_name" > /dev/null 2>&1; then
140 printf " \033[2m%-${w_name}s (no longer exists)\033[0m\n" "$peer_name"
141 continue
142 fi
143
144 local ip rule is_blocked
145 ip=$(peers::get_ip "$peer_name")
146 rule=$(peers::get_meta "$peer_name" "rule")
147 peers::is_blocked "$peer_name" 2>/dev/null && is_blocked="true" || is_blocked="false"
148
149 ui::group::show_member_row "$peer_name" "$ip" "${rule:--}" \
150 "$is_blocked" "$w_name" "$w_ip"
151 done
152 else
153 printf " \033[2m—\033[0m\n"
154 fi
155
156 printf "\n"
157}
158