Ultima attività 1 month ago

Revisione b5e9e3e415b7c31210b82b9cc9104f0f4b791030

gistfile1.txt Raw
1function cmd::group::rename() {
2 local name="" new_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 --new-name) util::require_flag "--new-name" "${2:-}" || return 1; new_name="$2"; shift 2 ;;
8 --help) cmd::group::help; return ;;
9 *) log::error "Unknown flag: $1"; return 1 ;;
10 esac
11 done
12
13 [[ -z "$name" ]] && log::error "Missing required flag: --name" && return 1
14 [[ -z "$new_name" ]] && log::error "Missing required flag: --new-name" && return 1
15 group::require_exists "$name" || return 1
16
17 if group::exists "$new_name"; then
18 log::error "Group already exists: ${new_name}"
19 return 1
20 fi
21
22 local old_file new_file
23 old_file="$(group::path "$name")"
24 new_file="$(group::path "$new_name")"
25
26 # Update name field in file
27 json::set "$old_file" "name" "\"$new_name\""
28 mv "$old_file" "$new_file"
29
30 log::wg_success "Group renamed: ${name} → ${new_name}"
31}
32
33function cmd::group::purge_stale() {
34 local name="" force=false all=false
35 local dry_run=false
36
37 while [[ $# -gt 0 ]]; do
38 case "$1" in
39 --name) util::require_flag "--name" "${2:-}" || return 1; name="$2"; shift 2 ;;
40 --force) force=true; shift ;;
41 --all) all=true; shift ;;
42 --dry-run) dry_run=true; shift ;;
43 --help) cmd::group::help; return ;;
44 *) log::error "Unknown flag: $1"; return 1 ;;
45 esac
46 done
47
48 [[ -z "$name" && "$all" == "false" ]] && \
49 log::error "Specify --name <group> or --all" && return 1
50
51 # Build list of groups to process
52 local -a groups=()
53 if $all; then
54 while IFS= read -r group_file; do
55 groups+=("$(basename "$group_file" .group)")
56 done < <(find "$(ctx::groups)" -name "*.group" 2>/dev/null | sort)
57 else
58 group::require_exists "$name" || return 1
59 groups=("$name")
60 fi
61
62 local total_removed=0 total_groups=0
63
64 for group_name in "${groups[@]}"; do
65 [[ -z "$group_name" ]] && continue
66
67 # Find stale peers — in group but no .conf file
68 local -a stale=()
69 while IFS= read -r peer_name; do
70 [[ -z "$peer_name" ]] && continue
71 if [[ ! -f "$(ctx::clients)/${peer_name}.conf" ]]; then
72 stale+=("$peer_name")
73 fi
74 done < <(group::peers "$group_name" 2>/dev/null)
75
76 [[ ${#stale[@]} -eq 0 ]] && continue
77
78 (( total_groups++ )) || true
79
80 if ! $force; then
81 printf " Group '%s' has %d stale peer(s): %s\n" \
82 "$group_name" "${#stale[@]}" "${stale[*]}"
83 read -r -p " Remove them? [y/N] " confirm
84 case "$confirm" in
85 [yY]*) ;;
86 *) log::info "Skipped '${group_name}'"; continue ;;
87 esac
88 fi
89
90 local group_file
91 group_file="$(group::path "$group_name")"
92 for peer_name in "${stale[@]}"; do
93 if $dry_run; then
94 printf " \033[2m[dry-run]\033[0m Would remove '%s' from group '%s'\n" \
95 "$peer_name" "$group_name"
96 else
97 json::remove "$group_file" "peers" "$peer_name" 2>/dev/null || true
98 log::debug "Removed stale peer '${peer_name}' from group '${group_name}'"
99 fi
100 (( total_removed++ )) || true
101 done
102 done
103
104 local action="Removed"
105 $dry_run && action="Would remove"
106 log::wg_success "${action} ${total_removed} stale peer(s)..."
107
108 if $all; then
109 if [[ "$total_removed" -eq 0 ]]; then
110 log::wg_warning "No stale peers found in any group"
111 else
112 log::wg_success "${action} ${total_removed} stale peer(s)..."
113 fi
114 fi
115}