gistfile1.txt
· 4.4 KiB · Text
原始文件
function cmd::activity::on_load() {
load_module net
flag::register --peer
flag::register --service
flag::register --ip
flag::register --hours
flag::register --type
flag::register --dropped
}
# ============================================
# Help
# ============================================
function cmd::activity::help() {
function cmd::activity::run() {
local filter_peer="" filter_service="" filter_ip="" filter_type=""
local hours=24 dropped_only=false
while [[ $# -gt 0 ]]; do
case "$1" in
--peer) filter_peer="$2"; shift 2 ;;
--service) filter_service="$2"; shift 2 ;;
--ip) filter_ip="$2"; shift 2 ;;
--type) filter_type="$2"; shift 2 ;;
--hours) hours="$2"; shift 2 ;;
--dropped) dropped_only=true; shift ;;
--help) cmd::activity::help; return ;;
*)
log::error "Unknown flag: $1"
cmd::activity::help
return 1
;;
esac
done
# Resolve peer name if type provided
if [[ -n "$filter_peer" && -n "$filter_type" ]]; then
filter_peer=$(peers::resolve_and_require "$filter_peer" "$filter_type") || return 1
fi
# Resolve --service to IP
local service_ip=""
if [[ -n "$filter_service" ]]; then
service_ip=$(net::resolve "$filter_service" 2>/dev/null | head -1 | cut -d: -f1) || true
if [[ -z "$service_ip" ]]; then
log::error "Service not found: ${filter_service}"
return 1
fi
fi
[[ -n "$filter_ip" ]] && service_ip="$filter_ip"
# Fetch aggregated data
local data
data=$(json::activity_aggregate \
"$(ctx::fw_events_log)" \
"$(ctx::events_log)" \
"$(config::interface)" \
"$(ctx::net)" \
"$(ctx::clients)" \
"$(ctx::meta)" \
"$hours" \
"$filter_peer" \
"$service_ip" 2>/dev/null)
if [[ -z "$data" ]]; then
log::wg_warning "No activity data found"
return 0
fi
# Measure w_peer and w_drops from data
local w_peer=16 w_drops=1
while IFS='|' read -r type rest; do
case "$type" in
peer)
local name drops
name=$(echo "$rest" | cut -d'|' -f1)
drops=$(echo "$rest" | cut -d'|' -f4)
(( ${#name} > w_peer )) && w_peer=${#name}
function cmd::group::show() {
local name=""
while [[ $# -gt 0 ]]; do
case "$1" in
--name) util::require_flag "--name" "${2:-}" || return 1; name="$2"; shift 2 ;;
--help) cmd::group::help; return ;;
*) log::error "Unknown flag: $1"; return 1 ;;
esac
done
[[ -z "$name" ]] && log::error "Missing required flag: --name" && return 1
group::require_exists "$name" || return 1
local group_file
group_file="$(group::path "$name")"
log::section "Group: ${name}"
printf "\n"
local desc
desc=$(json::get "$group_file" "desc")
ui::row "Description" "${desc:-—}"
local peers_list=()
mapfile -t peers_list < <(json::get "$group_file" "peers") || true
local filtered=()
for p in "${peers_list[@]:-}"; do
[[ -n "$p" ]] && filtered+=("$p")
done
peers_list=("${filtered[@]:-}")
local peer_count=${#peers_list[@]}
[[ -z "${peers_list[0]:-}" ]] && peer_count=0
local peer_word="peers"
[[ "$peer_count" -eq 1 ]] && peer_word="peer"
local valid_count=0
for p in "${peers_list[@]}"; do
[[ -z "$p" ]] && continue
peers::require_exists "$p" > /dev/null 2>&1 && (( valid_count++ )) || true
done
local peer_word="peers"
[[ "$valid_count" -eq 1 ]] && peer_word="peer"
ui::row "Peers" "${valid_count} ${peer_word}"
printf "\n"
if [[ "$peer_count" -gt 0 ]]; then
# Measure name and IP widths
local w_name=16 w_ip=13
for peer_name in "${peers_list[@]}"; do
[[ -z "$peer_name" ]] && continue
(( ${#peer_name} > w_name )) && w_name=${#peer_name}
done
(( w_name += 2 ))
for peer_name in "${peers_list[@]}"; do
[[ -z "$peer_name" ]] && continue
if ! peers::require_exists "$peer_name" > /dev/null 2>&1; then
printf " \033[2m%-${w_name}s (no longer exists)\033[0m\n" "$peer_name"
continue
fi
local ip rule is_blocked
ip=$(peers::get_ip "$peer_name")
rule=$(peers::get_meta "$peer_name" "rule")
peers::is_blocked "$peer_name" 2>/dev/null && is_blocked="true" || is_blocked="false"
ui::group::show_member_row "$peer_name" "$ip" "${rule:--}" \
"$is_blocked" "$w_name" "$w_ip"
done
else
printf " \033[2m—\033[0m\n"
fi
printf "\n"
}
| 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 | } |
| 158 |