Ostatnio aktywny 1 month ago

nuno zrewidował ten Gist 1 month ago. Przejdź do rewizji

1 file changed, 101 insertions

gistfile1.txt(stworzono plik)

@@ -0,0 +1,101 @@
1 + function 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 + }
Nowsze Starsze