Ostatnio aktywny 1 month ago

nuno zrewidował ten Gist 1 month ago. Przejdź do rewizji

1 file changed, 115 insertions

gistfile1.txt(stworzono plik)

@@ -0,0 +1,115 @@
1 + function 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 +
33 + function 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 + }
Nowsze Starsze