Ultima attività 1 month ago

gistfile1.txt Raw
1function cmd::rule::assign() {
2 local name="" peer="" type=""
3 while [[ $# -gt 0 ]]; do
4 case "$1" in
5 --name) name="$2"; shift 2 ;;
6 --peer) peer="$2"; shift 2 ;;
7 --type) type="$2"; shift 2 ;;
8 --help) cmd::rule::help; return ;;
9 *)
10 log::error "Unknown flag: $1"
11 return 1
12 ;;
13 esac
14 done
15
16 if [[ -z "$name" || -z "$peer" ]]; then
17 log::error "Missing required flags: --name and --peer"
18 return 1
19 fi
20
21 rule::require_exists "$name" || return 1
22
23 # Support --type for peer resolution
24 peer=$(peers::resolve_and_require "$peer" "$type") || return 1
25
26 # Unapply existing rule first if any
27 local existing_rule
28 existing_rule=$(peers::get_meta "$peer" "rule")
29
30 local ip
31 ip=$(peers::get_ip "$peer")
32 log::debug "rule::assign: peer=$peer ip=$ip"
33 [[ -z "$ip" ]] && log::error "Could not resolve IP for: $peer" && return 1
34
35 log::debug "assign: peer=$peer ip=$ip clients=$(ctx::clients)"
36
37 if [[ -n "$existing_rule" && "$existing_rule" != "$name" ]]; then
38 rule::unapply "$existing_rule" "$ip"
39 log::wg "Removed existing rule '${existing_rule}' from: ${peer}"
40 fi
41
42 rule::apply "$name" "$ip"
43
44 log::wg_success "Assigned rule '${name}' to: ${peer}"
45}