Остання активність 1 month ago

nuno ревизій цього gist 1 month ago. До ревизії

1 file changed, 157 insertions

gistfile1.txt(файл створено)

@@ -0,0 +1,157 @@
1 + function 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 +
16 + function cmd::activity::help() {
17 + function 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}
81 + function 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 + }
Новіше Пізніше