最終更新 1 month ago

nuno revised this gist 1 month ago. Go to revision

1 file changed, 113 insertions

gistfile1.txt(file created)

@@ -0,0 +1,113 @@
1 + #!/usr/bin/env bash
2 +
3 + # ============================================
4 + # Lifecycle
5 + # ============================================
6 +
7 + function 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 +
18 + function cmd::rename::help() {
19 + cat <<EOF
20 + Usage: wgctl rename --name <name> --new-name <new-name>
21 +
22 + Rename an existing WireGuard client.
23 + The client IP and keys are preserved, only the name changes.
24 +
25 + Options:
26 + --name <name> Current client name (e.g. phone-nuno)
27 + --new-name <name> New client name (e.g. laptop-nuno)
28 +
29 + Examples:
30 + wgctl rename --name phone-phone-nuno --new-name phone-nuno
31 + wgctl mv --name laptop-old --new-name laptop-nuno
32 + EOF
33 + }
34 +
35 + # ============================================
36 + # Run
37 + # ============================================
38 +
39 + function 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 +
96 + function 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 + }
Newer Older