gistfile1.txt
· 3.4 KiB · Text
原始文件
function cmd::group::rename() {
local name="" new_name=""
while [[ $# -gt 0 ]]; do
case "$1" in
--name) util::require_flag "--name" "${2:-}" || return 1; name="$2"; shift 2 ;;
--new-name) util::require_flag "--new-name" "${2:-}" || return 1; new_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
[[ -z "$new_name" ]] && log::error "Missing required flag: --new-name" && return 1
group::require_exists "$name" || return 1
if group::exists "$new_name"; then
log::error "Group already exists: ${new_name}"
return 1
fi
local old_file new_file
old_file="$(group::path "$name")"
new_file="$(group::path "$new_name")"
# Update name field in file
json::set "$old_file" "name" "\"$new_name\""
mv "$old_file" "$new_file"
log::wg_success "Group renamed: ${name} → ${new_name}"
}
function cmd::group::purge_stale() {
local name="" force=false all=false
local dry_run=false
while [[ $# -gt 0 ]]; do
case "$1" in
--name) util::require_flag "--name" "${2:-}" || return 1; name="$2"; shift 2 ;;
--force) force=true; shift ;;
--all) all=true; shift ;;
--dry-run) dry_run=true; shift ;;
--help) cmd::group::help; return ;;
*) log::error "Unknown flag: $1"; return 1 ;;
esac
done
[[ -z "$name" && "$all" == "false" ]] && \
log::error "Specify --name <group> or --all" && return 1
# Build list of groups to process
local -a groups=()
if $all; then
while IFS= read -r group_file; do
groups+=("$(basename "$group_file" .group)")
done < <(find "$(ctx::groups)" -name "*.group" 2>/dev/null | sort)
else
group::require_exists "$name" || return 1
groups=("$name")
fi
local total_removed=0 total_groups=0
for group_name in "${groups[@]}"; do
[[ -z "$group_name" ]] && continue
# Find stale peers — in group but no .conf file
local -a stale=()
while IFS= read -r peer_name; do
[[ -z "$peer_name" ]] && continue
if [[ ! -f "$(ctx::clients)/${peer_name}.conf" ]]; then
stale+=("$peer_name")
fi
done < <(group::peers "$group_name" 2>/dev/null)
[[ ${#stale[@]} -eq 0 ]] && continue
(( total_groups++ )) || true
if ! $force; then
printf " Group '%s' has %d stale peer(s): %s\n" \
"$group_name" "${#stale[@]}" "${stale[*]}"
read -r -p " Remove them? [y/N] " confirm
case "$confirm" in
[yY]*) ;;
*) log::info "Skipped '${group_name}'"; continue ;;
esac
fi
local group_file
group_file="$(group::path "$group_name")"
for peer_name in "${stale[@]}"; do
if $dry_run; then
printf " \033[2m[dry-run]\033[0m Would remove '%s' from group '%s'\n" \
"$peer_name" "$group_name"
else
json::remove "$group_file" "peers" "$peer_name" 2>/dev/null || true
log::debug "Removed stale peer '${peer_name}' from group '${group_name}'"
fi
(( total_removed++ )) || true
done
done
local action="Removed"
$dry_run && action="Would remove"
log::wg_success "${action} ${total_removed} stale peer(s)..."
if $all; then
if [[ "$total_removed" -eq 0 ]]; then
log::wg_warning "No stale peers found in any group"
else
log::wg_success "${action} ${total_removed} stale peer(s)..."
fi
fi
}
| 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 | } |