function cmd::inspect::_blocks_info() { local name="${1:-}" block::has_file "$name" || return 0 local blocked_direct blocked_direct=$(block::is_blocked_direct "$name") local blocked_groups blocked_groups=$(block::get_groups "$name") local rules_output rules_output=$(block::get_rules "$name") # Skip if truly empty if [[ "$blocked_direct" != "true" ]] && \ ui::empty "$blocked_groups" && \ ui::empty "$rules_output"; then block::cleanup "$name" # clean up stale empty file return 0 fi # Count rules for header local rule_count=0 while IFS= read -r line; do [[ -n "$line" ]] && (( rule_count++ )) || true done <<< "$rules_output" # Build header like firewall: Blocks (+N) local header_counts="" [[ "$rule_count" -gt 0 ]] && header_counts=" (${rule_count})" [[ "$blocked_direct" == "true" || -n "$blocked_groups" ]] && \ header_counts="${header_counts} 🚫" cmd::inspect::_section "Blocks${header_counts}" printf "\n" [[ "$blocked_direct" == "true" ]] && \ printf " \033[1;31m🚫\033[0m blocked directly\n" [[ -n "$blocked_groups" ]] && \ printf " \033[1;31m🚫\033[0m blocked by groups: %s\n" "$blocked_groups" block::format_rules "$name" return 0 } function cmd::inspect::_firewall_info() { local name="${1:-}" local ip ip=$(peers::get_ip "$name") local total=0 accepts=0 drops=0 local rules_output=() while IFS= read -r line; do [[ -z "$line" ]] && continue (( total++ )) || true [[ "$line" =~ ACCEPT ]] && (( accepts++ )) || true [[ "$line" =~ DROP ]] && (( drops++ )) || true rules_output+=("$line") done < <(fw::forward_rules_for_ip "$ip" | grep -v NFLOG) ui::empty "${rules_output[*]}" && return 0 printf "\n \033[0;37m── Firewall (%s %s) \033[0m%s\n\n" \ "$(color::green "+${accepts}")" \ "$(color::red "-${drops}")" \ "$(printf '\033[0;37m─%.0s' {1..28})" fw::list_peer_rules "$ip" false return 0 }