gistfile1.txt
· 2.8 KiB · Text
Brut
#!/usr/bin/env bash
# ============================================
# Lifecycle
# ============================================
function cmd::rename::on_load() {
flag::register --name
flag::register --type
flag::register --new-name
flag::register --new-type
}
# ============================================
# Help
# ============================================
function cmd::rename::help() {
cat <<EOF
Usage: wgctl rename --name <name> --new-name <new-name>
Rename an existing WireGuard client.
The client IP and keys are preserved, only the name changes.
Options:
--name <name> Current client name (e.g. phone-phone-nuno)
--new-name <name> New client name (e.g. phone-nuno)
Examples:
wgctl rename --name phone-phone-nuno --new-name phone-nuno
wgctl mv --name laptop-old --new-name laptop-nuno
EOF
}
# ============================================
# Run
# ============================================
function cmd::rename::run() {
local name=""
local type=""
local new_name=""
local new_type=""
while [[ $# -gt 0 ]]; do
case "$1" in
--name) name="$2"; shift 2 ;;
--type) type="$2"; shift 2 ;;
--new-name) new_name="$2"; shift 2 ;;
--new-type) new_type="$2"; shift 2 ;;
--help) cmd::rename::help; return ;;
*)
log::error "Unknown flag: $1"
cmd::rename::help
return 1
;;
esac
done
if [[ -z "$name" ]]; then
log::error "Missing required flag: --name"
cmd::rename::help
return 1
fi
if [[ -z "$new_name" ]]; then
log::error "Missing required flag: --new-name"
cmd::rename::help
return 1
fi
name=$(peers::resolve_and_require "$name" "$type") || return 1
new_name=$(peers::resolve_name "$new_name" "$new_type") || return 1
local dir
dir="$(ctx::clients)"
if [[ ! -f "${dir}/${name}.conf" ]]; then
log::error "Client not found: ${name}"
return 1
fi
if [[ -f "${dir}/${new_name}.conf" ]]; then
log::error "Client already exists: ${new_name}"
return 1
fi
log::section "Renaming client: ${name} → ${new_name}"
cmd::rename::_rename_files "$name" "$new_name"
# Reload WireGuard
peers::reload
log::wg_success "Client renamed: ${name} → ${new_name}"
}
function cmd::rename::_rename_files() {
local name="${1:-}" new_name="${2:-}"
local dir
dir="$(ctx::clients)"
mv "${dir}/${name}.conf" "${dir}/${new_name}.conf"
mv "${dir}/${name}_private.key" "${dir}/${new_name}_private.key"
mv "${dir}/${name}_public.key" "${dir}/${new_name}_public.key"
sed -i "s/^# ${name}$/# ${new_name}/" "$(config::config_file)"
block::rename "$name" "$new_name"
local old_meta new_meta
old_meta=$(peers::meta_path "$name")
new_meta=$(peers::meta_path "$new_name")
[[ -f "$old_meta" ]] && mv "$old_meta" "$new_meta"
}
| 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 | 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 | |
| 98 | function 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 | } |