Последняя активность 1 month ago

Версия 158778d85405d4b3454c91a0ea4e7bd3e5df796f

gistfile1.txt Исходник
1#!/usr/bin/env bash
2
3# ============================================
4# Lifecycle
5# ============================================
6
7function cmd::rename::on_load() {
8 flag::register --name
9 flag::register --type
10 flag::register --new-name
11 flag::register --new-type
12}
13
14# ============================================
15# Help
16# ============================================
17
18function cmd::rename::help() {
19 cat <<EOF
20Usage: wgctl rename --name <name> --new-name <new-name>
21
22Rename an existing WireGuard client.
23The client IP and keys are preserved, only the name changes.
24
25Options:
26 --name <name> Current client name (e.g. phone-nuno)
27 --new-name <name> New client name (e.g. laptop-nuno)
28
29Examples:
30 wgctl rename --name phone-phone-nuno --new-name phone-nuno
31 wgctl mv --name laptop-old --new-name laptop-nuno
32EOF
33}
34
35# ============================================
36# Run
37# ============================================
38
39function cmd::rename::run() {
40 local name="" type="" new_name="" new_type=""
41
42 while [[ $# -gt 0 ]]; do
43 case "$1" in
44 --name) name="$2"; shift 2 ;;
45 --type) type="$2"; shift 2 ;;
46 --new-name) new_name="$2"; shift 2 ;;
47 --new-type) new_type="$2"; shift 2 ;;
48 --help) cmd::rename::help; return ;;
49 *)
50 log::error "Unknown flag: $1"
51 cmd::rename::help
52 return 1
53 ;;
54 esac
55 done
56
57 if [[ -z "$name" ]]; then
58 log::error "Missing required flag: --name"
59 cmd::rename::help
60 return 1
61 fi
62
63 if [[ -z "$new_name" ]]; then
64 log::error "Missing required flag: --new-name"
65 cmd::rename::help
66 return 1
67 fi
68
69 name=$(peers::resolve_and_require "$name" "$type") || return 1
70 new_name=$(peers::resolve_name "$new_name" "$new_type") || return 1
71
72 local dir
73 dir="$(ctx::clients)"
74
75 if [[ ! -f "${dir}/${name}.conf" ]]; then
76 log::error "Client not found: ${name}"
77 return 1
78 fi
79
80 if [[ -f "${dir}/${new_name}.conf" ]]; then
81 log::error "Client already exists: ${new_name}"
82 return 1
83 fi
84
85 log::section "Renaming client: ${name} → ${new_name}"
86
87 cmd::rename::_rename_files "$name" "$new_name"
88 peers::reload
89
90 # Update identity entry after successful rename
91 identity::rename_peer "$name" "$new_name"
92
93 log::wg_success "Client renamed: ${name} → ${new_name}"
94}
95
96function cmd::rename::_rename_files() {
97 local name="${1:-}" new_name="${2:-}"
98 local dir
99 dir="$(ctx::clients)"
100
101 mv "${dir}/${name}.conf" "${dir}/${new_name}.conf"
102 mv "${dir}/${name}_private.key" "${dir}/${new_name}_private.key"
103 mv "${dir}/${name}_public.key" "${dir}/${new_name}_public.key"
104
105 sed -i "s/^# ${name}$/# ${new_name}/" "$(config::config_file)"
106
107 block::rename "$name" "$new_name"
108
109 local old_meta new_meta
110 old_meta=$(peers::meta_path "$name")
111 new_meta=$(peers::meta_path "$new_name")
112 [[ -f "$old_meta" ]] && mv "$old_meta" "$new_meta"
113}