gistfile1.txt
· 1.8 KiB · Text
Исходник
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}"
local desc
desc=$(json::get "$group_file" "desc")
printf "\n %-20s %s\n" "Description:" "${desc:-—}"
# Load peers
local peers_list=()
mapfile -t peers_list < <(json::get "$group_file" "peers")
# Filter empty entries
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
printf " %-20s %s\n" "Peers:" "$peer_count"
printf " %s\n" "$(printf '─%.0s' {1..50})"
if [[ "$peer_count" -gt 0 ]]; then
printf "\n %-28s %-15s %-12s %s\n" "NAME" "IP" "RULE" "STATUS"
printf " %s\n" "$(printf '─%.0s' {1..65})"
for peer_name in "${peers_list[@]}"; do
[[ -z "$peer_name" ]] && continue
local ip rule status_str status_color
ip=$(peers::get_ip "$peer_name")
rule=$(peers::get_meta "$peer_name" "rule")
rule="${rule:-—}"
if peers::is_blocked "$peer_name"; then
status_color="\033[1;31m"
status_str="blocked"
else
status_color="\033[1;32m"
status_str="active"
fi
printf " %-28s %-15s %-12s %b\n" \
"$peer_name" "${ip:-—}" "$rule" \
"${status_color}${status_str}\033[0m"
done
else
printf " —\n"
fi
printf "\n"
}
| 1 | function cmd::group::show() { |
| 2 | local name="" |
| 3 | |
| 4 | while [[ $# -gt 0 ]]; do |
| 5 | case "$1" in |
| 6 | --name) util::require_flag "--name" "${2:-}" || return 1; name="$2"; shift 2 ;; |
| 7 | --help) cmd::group::help; return ;; |
| 8 | *) log::error "Unknown flag: $1"; return 1 ;; |
| 9 | esac |
| 10 | done |
| 11 | |
| 12 | [[ -z "$name" ]] && log::error "Missing required flag: --name" && return 1 |
| 13 | group::require_exists "$name" || return 1 |
| 14 | |
| 15 | local group_file |
| 16 | group_file="$(group::path "$name")" |
| 17 | |
| 18 | log::section "Group: ${name}" |
| 19 | |
| 20 | local desc |
| 21 | desc=$(json::get "$group_file" "desc") |
| 22 | printf "\n %-20s %s\n" "Description:" "${desc:-—}" |
| 23 | |
| 24 | # Load peers |
| 25 | local peers_list=() |
| 26 | mapfile -t peers_list < <(json::get "$group_file" "peers") |
| 27 | # Filter empty entries |
| 28 | local filtered=() |
| 29 | for p in "${peers_list[@]:-}"; do |
| 30 | [[ -n "$p" ]] && filtered+=("$p") |
| 31 | done |
| 32 | peers_list=("${filtered[@]:-}") |
| 33 | local peer_count=${#peers_list[@]} |
| 34 | |
| 35 | [[ -z "${peers_list[0]}" ]] && peer_count=0 |
| 36 | |
| 37 | printf " %-20s %s\n" "Peers:" "$peer_count" |
| 38 | printf " %s\n" "$(printf '─%.0s' {1..50})" |
| 39 | |
| 40 | if [[ "$peer_count" -gt 0 ]]; then |
| 41 | printf "\n %-28s %-15s %-12s %s\n" "NAME" "IP" "RULE" "STATUS" |
| 42 | printf " %s\n" "$(printf '─%.0s' {1..65})" |
| 43 | for peer_name in "${peers_list[@]}"; do |
| 44 | [[ -z "$peer_name" ]] && continue |
| 45 | local ip rule status_str status_color |
| 46 | ip=$(peers::get_ip "$peer_name") |
| 47 | rule=$(peers::get_meta "$peer_name" "rule") |
| 48 | rule="${rule:-—}" |
| 49 | |
| 50 | if peers::is_blocked "$peer_name"; then |
| 51 | status_color="\033[1;31m" |
| 52 | status_str="blocked" |
| 53 | else |
| 54 | status_color="\033[1;32m" |
| 55 | status_str="active" |
| 56 | fi |
| 57 | |
| 58 | printf " %-28s %-15s %-12s %b\n" \ |
| 59 | "$peer_name" "${ip:-—}" "$rule" \ |
| 60 | "${status_color}${status_str}\033[0m" |
| 61 | done |
| 62 | else |
| 63 | printf " —\n" |
| 64 | fi |
| 65 | |
| 66 | printf "\n" |
| 67 | } |