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

rename.command.sh Исходник
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-phone-nuno)
27 --new-name <name> New client name (e.g. phone-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=""
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}
128