Última actividad 1 month ago

gistfile1.txt Sin formato
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 new_name=$(peers::resolve_name "$new_name" "$new_type") || return 1
74
75 local dir
76 dir="$(ctx::clients)"
77
78 if [[ ! -f "${dir}/${name}.conf" ]]; then
79 log::error "Client not found: ${name}"
80 return 1
81 fi
82
83 if [[ -f "${dir}/${new_name}.conf" ]]; then
84 log::error "Client already exists: ${new_name}"
85 return 1
86 fi
87
88 log::section "Renaming client: ${name} → ${new_name}"
89
90 cmd::rename::_rename_files "$name" "$new_name"
91
92 # Reload WireGuard
93 peers::reload
94
95 log::wg_success "Client renamed: ${name} → ${new_name}"
96}
97
98function cmd::rename::_rename_files() {
99 local name="${1:-}" new_name="${2:-}"
100 local dir
101 dir="$(ctx::clients)"
102
103 mv "${dir}/${name}.conf" "${dir}/${new_name}.conf"
104 mv "${dir}/${name}_private.key" "${dir}/${new_name}_private.key"
105 mv "${dir}/${name}_public.key" "${dir}/${new_name}_public.key"
106
107 sed -i "s/^# ${name}$/# ${new_name}/" "$(config::config_file)"
108
109 block::rename "$name" "$new_name"
110
111 local old_meta new_meta
112 old_meta=$(peers::meta_path "$name")
113 new_meta=$(peers::meta_path "$new_name")
114 [[ -f "$old_meta" ]] && mv "$old_meta" "$new_meta"
115}