最終更新 1 month ago

nuno revised this gist 1 month ago. Go to revision

1 file changed, 127 insertions

rename.command.sh(file created)

@@ -0,0 +1,127 @@
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-phone-nuno)
27 + --new-name <name> New client name (e.g. phone-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=""
41 + local type=""
42 + local new_name=""
43 + local new_type=""
44 +
45 + while [[ $# -gt 0 ]]; do
46 + case "$1" in
47 + --name) name="$2"; shift 2 ;;
48 + --type) type="$2"; shift 2 ;;
49 + --new-name) new_name="$2"; shift 2 ;;
50 + --new-type) new_type="$2"; shift 2 ;;
51 + --help) cmd::rename::help; return ;;
52 + *)
53 + log::error "Unknown flag: $1"
54 + cmd::rename::help
55 + return 1
56 + ;;
57 + esac
58 + done
59 +
60 + if [[ -z "$name" ]]; then
61 + log::error "Missing required flag: --name"
62 + cmd::rename::help
63 + return 1
64 + fi
65 +
66 + if [[ -z "$new_name" ]]; then
67 + log::error "Missing required flag: --new-name"
68 + cmd::rename::help
69 + return 1
70 + fi
71 +
72 + name=$(peers::resolve_and_require "$name" "$type") || return 1
73 +
74 + # Resolve new name if provided
75 + if [[ -n "$new_name" || -n "$new_type" ]]; then
76 + # If only new_type provided, keep same base name
77 + if [[ -z "$new_name" ]]; then
78 + new_name=$(echo "$name" | cut -d'-' -f2-)
79 + fi
80 + new_name=$(peers::resolve_name "$new_name" "$new_type") || return 1
81 + fi
82 +
83 + local dir
84 + dir="$(ctx::clients)"
85 +
86 + if [[ ! -f "${dir}/${name}.conf" ]]; then
87 + log::error "Client not found: ${name}"
88 + return 1
89 + fi
90 +
91 + if [[ -f "${dir}/${new_name}.conf" ]]; then
92 + log::error "Client already exists: ${new_name}"
93 + return 1
94 + fi
95 +
96 + log::section "Renaming client: ${name} → ${new_name}"
97 +
98 + # Rename client files
99 + mv "${dir}/${name}.conf" "${dir}/${new_name}.conf"
100 + mv "${dir}/${name}_private.key" "${dir}/${new_name}_private.key"
101 + mv "${dir}/${name}_public.key" "${dir}/${new_name}_public.key"
102 +
103 + log::fs_write "Renamed client files"
104 +
105 + # Update comment in wg0.conf
106 + sed -i "s/^# ${name}$/# ${new_name}/" "$(config::config_file)"
107 +
108 + log::fs_write "Updated server config"
109 +
110 + # Update block file if exists
111 + local block_file
112 + block_file="$(ctx::block::path "${name}.block")"
113 + if [[ -f "$block_file" ]]; then
114 + mv "$block_file" "$(ctx::block::path "${new_name}.block")"
115 + log::fs_write "Renamed block file"
116 + fi
117 +
118 + local old_meta new_meta
119 + old_meta=$(peers::meta_path "$name")
120 + new_meta=$(peers::meta_path "$new_name")
121 + [[ -f "$old_meta" ]] && mv "$old_meta" "$new_meta"
122 +
123 + # Reload WireGuard
124 + peers::reload
125 +
126 + log::wg_success "Client renamed: ${name} → ${new_name}"
127 + }
Newer Older