Last active 1 month ago

Revision ca2a298988aa5d0d2dd1d8ff7f13d6c65f732cc5

gistfile1.txt Raw
1function cmd::remove::run() {
2 local name=""
3 local type=""
4 local force=false
5
6 while [[ $# -gt 0 ]]; do
7 case "$1" in
8 --name) name="$2"; shift 2 ;;
9 --type) type="$2"; shift 2 ;;
10 --force) force=true; shift ;;
11 --help) cmd::remove::help; return ;;
12 *)
13 log::error "Unknown flag: $1"
14 cmd::remove::help
15 return 1
16 ;;
17 esac
18 done
19
20 if [[ -z "$name" ]]; then
21 log::error "Missing required flag: --name"
22 cmd::remove::help
23 return 1
24 fi
25
26 name=$(peers::resolve_and_require "$name" "$type") || return 1
27
28 # Confirmation prompt unless --force
29 if ! $force; then
30 read -r -p "Are you sure you want to permanently remove '${name}'? [y/N] " confirm
31 case "$confirm" in
32 [yY][eE][sS]|[yY]) ;;
33 *)
34 log::info "Aborted"
35 return 0
36 ;;
37 esac
38 fi
39
40 log::section "Removing client: ${name}"
41
42 # Extract IP before removing anything
43 local client_ip
44 client_ip=$(grep "^Address" "$(ctx::clients)/${name}.conf" 2>/dev/null | awk '{print $3}' | cut -d'/' -f1)
45
46 local was_blocked=false
47 peers::is_blocked "$name" && was_blocked=true
48
49 # Unapply rule if assigned
50 local assigned_rule
51 assigned_rule=$(peers::get_meta "$name" "rule")
52
53 if [[ -z "$assigned_rule" ]]; then
54 assigned_rule=$(peers::default_rule "$name")
55 fi
56
57 if [[ -n "$assigned_rule" ]] && [[ -n "$client_ip" ]]; then
58 rule::unapply "$assigned_rule" "$client_ip"
59 fi
60
61 # Remove peer from server config
62 peers::remove_from_server "$name" || return 1
63
64 # Remove client config
65 peers::remove_client_config "$name" || return 1
66
67 # Remove keys
68 keys::remove "$name" || return 1
69
70 # Remove block rules only if client was fully blocked
71 if [[ -n "$client_ip" ]] && $was_blocked; then
72 firewall::unblock_all "$client_ip"
73 fi
74
75 firewall::remove_block_file "$name" 2>/dev/null || true
76
77 # If this was a guest type, check if any guests remain
78 # If no guests left, remove guest firewall rules
79 local type
80 type=$(echo "$name" | cut -d'-' -f1)
81 if [[ "$type" == "guest" ]]; then
82 local remaining_guests=0
83 local guest_confs=("$(ctx::clients)"/guest-*.conf)
84
85 if [[ -f "${guest_confs[0]}" ]]; then
86 remaining_guests=${#guest_confs[@]}
87 fi
88
89 if [[ "$remaining_guests" -eq 0 ]]; then
90 firewall::remove_guest_rules
91 log::wg "No guests remaining — removed guest firewall rules"
92 fi
93 fi
94
95 peers::remove_meta "$name" 2>/dev/null || true
96
97 # Reload WireGuard
98 peers::reload || return 1
99
100 log::wg_success "Client removed: ${name}"
101}