Ostatnio aktywny 1 month ago

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

1 file changed, 208 insertions

gistfile1.txt(stworzono plik)

@@ -0,0 +1,208 @@
1 + function cmd::rule::show() {
2 + local name="" show_peers=true color=false show_resolved=false
3 +
4 + while [[ $# -gt 0 ]]; do
5 + case "$1" in
6 + --name) util::require_flag "--name" "${2:-}" || return 1
7 + name="$2"; shift 2 ;;
8 + --no-peers) show_peers=false; shift ;;
9 + --color) color=true; shift ;;
10 + --resolved) show_resolved=true; shift ;;
11 + --help) cmd::rule::help; return ;;
12 + *) log::error "Unknown flag: $1"; return 1 ;;
13 + esac
14 + done
15 +
16 + [[ -z "$name" ]] && log::error "Missing required flag: --name" && return 1
17 + rule::require_exists "$name" || return 1
18 +
19 + local rule_file
20 + rule_file="$(rule::path "$name")"
21 +
22 + local dns_redirect
23 + dns_redirect=$(rule::get_own "$name" "dns_redirect")
24 + dns_redirect="${dns_redirect:-false}"
25 +
26 + local resolved_dns
27 + resolved_dns=$(rule::get "$name" "dns_redirect")
28 + resolved_dns="${resolved_dns:-false}"
29 +
30 + local dns_display
31 + if [[ "${resolved_dns,,}" == "true" && "${dns_redirect,,}" != "true" ]]; then
32 + dns_display="true (inherited)"
33 + elif [[ "${dns_redirect,,}" == "true" ]]; then
34 + dns_display="true"
35 + else
36 + dns_display="false"
37 + fi
38 +
39 +
40 + log::section "Rule: ${name}"
41 + printf "\n"
42 +
43 + # ── Header info ──────────────────────────────
44 + local desc group dns_redirect
45 + desc=$(json::get "$rule_file" "desc")
46 + group=$(json::get "$rule_file" "group")
47 +
48 + ui::row "Description" "${desc:-—}"
49 + ui::row "Group" "${group:-—}"
50 + ui::row "DNS" "$dns_display"
51 +
52 + # ── Extends section ──────────────────────────
53 + local extends_raw=()
54 + mapfile -t extends_raw < <(json::get "$rule_file" "extends" 2>/dev/null || true)
55 +
56 + if [[ ${#extends_raw[@]} -gt 0 && -n "${extends_raw[0]}" ]]; then
57 + cmd::rule::_show_section "Extends"
58 +
59 + for base_name in "${extends_raw[@]}"; do
60 + [[ -z "$base_name" ]] && continue
61 + printf "\n \033[0;37m↳ %s\033[0m\n" "$base_name"
62 +
63 + # Show resolved entries for this base
64 + local base_allow_ports base_allow_ips base_block_ips base_block_ports base_dns
65 + base_allow_ports=$(rule::get "$base_name" "allow_ports" 2>/dev/null || true)
66 + base_allow_ips=$(rule::get "$base_name" "allow_ips" 2>/dev/null || true)
67 + base_block_ips=$(rule::get "$base_name" "block_ips" 2>/dev/null || true)
68 + base_block_ports=$(rule::get "$base_name" "block_ports" 2>/dev/null || true)
69 + base_dns=$(json::get "$(rule::path "$base_name")" "dns_redirect" 2>/dev/null || true)
70 +
71 + while IFS= read -r e; do
72 + [[ -z "$e" ]] && continue
73 + net::print_entry "+" "$e"
74 + done <<< "$base_allow_ports"
75 +
76 + while IFS= read -r e; do
77 + [[ -z "$e" ]] && continue
78 + net::print_entry "-" "$e"
79 + done <<< "$base_allow_ips"
80 +
81 + while IFS= read -r e; do
82 + [[ -z "$e" ]] && continue
83 + net::print_entry "-" "$e"
84 + done <<< "$base_block_ips"
85 +
86 + while IFS= read -r e; do
87 + [[ -z "$e" ]] && continue
88 + net::print_entry "-" "$e"
89 + done <<< "$base_block_ports"
90 +
91 + [[ "$base_dns" == "true" ]] && \
92 + printf " \033[0;36m↺\033[0m DNS → %s\n" "$(config::dns)"
93 + done
94 + fi
95 +
96 + # ── Own Rules section ─────────────────────────
97 + local own_allow_ports own_allow_ips own_block_ips own_block_ports
98 + own_allow_ports=$(json::get "$rule_file" "allow_ports")
99 + own_allow_ips=$(json::get "$rule_file" "allow_ips")
100 + own_block_ips=$(json::get "$rule_file" "block_ips")
101 + own_block_ports=$(json::get "$rule_file" "block_ports")
102 +
103 + local has_own=false
104 + [[ -n "$own_allow_ports" || -n "$own_allow_ips" || \
105 + -n "$own_block_ips" || -n "$own_block_ports" ]] && has_own=true
106 +
107 + if $has_own; then
108 + if [[ ${#extends_raw[@]} -gt 0 && -n "${extends_raw[0]}" ]]; then
109 + cmd::rule::_show_section "Own Rules"
110 + printf "\n"
111 + while IFS= read -r e; do
112 + [[ -z "$e" ]] && continue
113 + net::print_entry "+" "$e"
114 + done <<< "$own_allow_ports"
115 +
116 + while IFS= read -r e; do
117 + [[ -z "$e" ]] && continue
118 + net::print_entry "+" "$e"
119 + done <<< "$own_allow_ips"
120 +
121 + while IFS= read -r e; do
122 + [[ -z "$e" ]] && continue
123 + net::print_entry "-" "$e"
124 + done <<< "$own_block_ips"
125 +
126 + while IFS= read -r e; do
127 + [[ -z "$e" ]] && continue
128 + net::print_entry "-" "$e"
129 + done <<< "$own_block_ports"
130 +
131 + [[ "$dns_redirect" == "true" ]] && \
132 + printf " \033[0;36m↺\033[0m DNS → %s\n" "$(config::dns)"
133 + else
134 + # No inheritance — use Allow/Block sections
135 + if [[ -n "$own_allow_ports" || -n "$own_allow_ips" ]]; then
136 + cmd::rule::_show_section "Allow"
137 + printf "\n"
138 + while IFS= read -r e; do
139 + [[ -z "$e" ]] && continue
140 + printf " \033[0;32m+\033[0m %s\n" "$e"
141 + done <<< "$own_allow_ports"
142 + while IFS= read -r e; do
143 + [[ -z "$e" ]] && continue
144 + printf " \033[0;32m+\033[0m %s\n" "$e"
145 + done <<< "$own_allow_ips"
146 + fi
147 +
148 + if [[ -n "$own_block_ips" || -n "$own_block_ports" ]]; then
149 + cmd::rule::_show_section "Block"
150 + printf "\n"
151 + while IFS= read -r e; do
152 + [[ -z "$e" ]] && continue
153 + printf " \033[0;31m-\033[0m %s\n" "$e"
154 + done <<< "$own_block_ips"
155 + while IFS= read -r e; do
156 + [[ -z "$e" ]] && continue
157 + printf " \033[0;31m-\033[0m %s\n" "$e"
158 + done <<< "$own_block_ports"
159 + fi
160 +
161 + if [[ "$dns_redirect" == "true" ]]; then
162 + cmd::rule::_show_section "DNS"
163 + printf "\n \033[0;36m↺\033[0m Redirect all DNS → %s\n" "$(config::dns)"
164 + fi
165 + fi
166 + elif [[ ${#extends_raw[@]} -eq 0 || -z "${extends_raw[0]}" ]]; then
167 + printf "\n"
168 + ui::row "Access" "full (no restrictions)"
169 + fi
170 +
171 + # ── Resolved section (optional) ──────────────
172 + if $show_resolved; then
173 + cmd::rule::_show_section "Resolved (applied to peers)"
174 + local res_allow_ports res_allow_ips res_block_ips res_block_ports
175 + res_allow_ports=$(rule::get "$name" "allow_ports")
176 + res_allow_ips=$(rule::get "$name" "allow_ips")
177 + res_block_ips=$(rule::get "$name" "block_ips")
178 + res_block_ports=$(rule::get "$name" "block_ports")
179 +
180 + while IFS= read -r e; do [[ -n "$e" ]] && \
181 + printf " \033[0;32m+\033[0m %s\n" "$e"; done <<< "$res_allow_ports"
182 + while IFS= read -r e; do [[ -n "$e" ]] && \
183 + printf " \033[0;32m+\033[0m %s\n" "$e"; done <<< "$res_allow_ips"
184 + while IFS= read -r e; do [[ -n "$e" ]] && \
185 + printf " \033[0;31m-\033[0m %s\n" "$e"; done <<< "$res_block_ips"
186 + while IFS= read -r e; do [[ -n "$e" ]] && \
187 + printf " \033[0;31m-\033[0m %s\n" "$e"; done <<< "$res_block_ports"
188 + fi
189 +
190 + # ── Peers section ─────────────────────────────
191 + cmd::rule::_show_section "Peers"
192 +
193 + local peer_list=()
194 + mapfile -t peer_list < <(peers::with_rule "$name")
195 + local peer_count=${#peer_list[@]}
196 + ui::row "Assigned" "$peer_count"
197 +
198 + if $show_peers && [[ $peer_count -gt 0 ]]; then
199 + printf "\n"
200 + for peer_name in "${peer_list[@]}"; do
201 + local ip
202 + ip=$(peers::get_ip "$peer_name")
203 + printf " %-28s %s\n" "$peer_name" "$ip"
204 + done
205 + fi
206 +
207 + printf "\n"
208 + }
Nowsze Starsze