晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/cpguard/app/scripts/ |
| Current File : //opt/cpguard/app/scripts/fw_list.sh |
#!/bin/bash
# Run nft list ruleset and suppress long element lists
nft list ruleset | awk '
BEGIN {
in_set = 0
in_elements = 0
element_count = 0
buffer = ""
elements_buffer = ""
}
# Match the start of a set definition
/^[[:space:]]+(set) / {
# Flush any previous set
if (in_set) {
flush_set()
}
# Start new set
in_set = 1
in_elements = 0
element_count = 0
buffer = $0 "\n"
elements_buffer = ""
next
}
# Match lines that are part of set definition (indented)
/^[[:space:]]+/ {
if (!in_set) {
print
next
}
# Set properties
if ($1 == "type" || $1 == "flags" || $1 == "auto-merge" || $1 == "size" || $1 == "timeout" || $1 == "gc-interval" || $1 == "policy" || $1 == "comment") {
buffer = buffer $0 "\n"
next
}
# Start of elements
if ($1 == "elements") {
in_elements = 1
match($0, /^[[:space:]]+/)
indent = substr($0, 1, RLENGTH)
buffer = buffer indent
next
}
# Inside elements block
if (in_elements) {
# Check for closing brace of elements first
if ($0 ~ /^[[:space:]]+}[[:space:]]*$/) {
# Store the closing brace separately
elements_closing_brace = $0
next
}
# Store elements lines
elements_buffer = elements_buffer $0 "\n"
# Count elements - count actual IPs/entries, not commas
gsub(/^[[:space:]]+/, "", $0) # Remove leading whitespace
gsub(/[[:space:]]+$/, "", $0) # Remove trailing whitespace
gsub(/,$/, "", $0) # Remove trailing comma
if ($0 ~ /[0-9a-fA-F:.]|"/ && $0 !~ /^[[:space:]]*$/) {
# Split by comma and count non-empty entries
n = split($0, items, /,[[:space:]]*/)
for (i = 1; i <= n; i++) {
gsub(/^[[:space:]]+/, "", items[i])
gsub(/[[:space:]]+$/, "", items[i])
if (items[i] != "") {
element_count++
}
}
}
next
}
# Closing brace of set
if ($0 ~ /^[[:space:]]+}[[:space:]]*$/) {
flush_set()
print $0
# Reset for next set
in_set = 0
in_elements = 0
element_count = 0
buffer = ""
elements_buffer = ""
elements_closing_brace = ""
next
}
buffer = buffer $0 "\n"
next
}
# Match any other line (non-indented) - table/chain definitions, rules, etc.
{
# Flush any pending set
if (in_set) {
flush_set()
in_set = 0
in_elements = 0
element_count = 0
buffer = ""
elements_buffer = ""
elements_closing_brace = ""
}
print
}
function flush_set() {
if (in_elements && element_count > 0) {
printf "%s", buffer
if (element_count <= 50) {
# Show all elements
printf "elements = {\n"
printf "%s", elements_buffer
# Get indentation from closing brace
match(elements_closing_brace, /^[[:space:]]+/)
ind = substr(elements_closing_brace, 1, RLENGTH)
printf "%s\t\t \033[33m# Total: %d entries\033[0m\n", ind, element_count
print elements_closing_brace
} else {
# Show first 20 elements
printf "elements = {\n"
# Parse and print first 20 elements
split(elements_buffer, lines, "\n")
printed = 0
for (i = 1; i <= length(lines) && printed < 20; i++) {
if (lines[i] ~ /[0-9a-fA-F:.]|"/) {
line = lines[i]
# Extract indentation
match(line, /^[[:space:]]+/)
ind = substr(line, 1, RLENGTH)
rest = substr(line, RLENGTH + 1)
# Remove trailing comma and whitespace
gsub(/,[[:space:]]*$/, "", rest)
split(rest, items, /,[[:space:]]*/)
for (j = 1; j <= length(items) && printed < 20; j++) {
gsub(/^[[:space:]]+/, "", items[j])
gsub(/[[:space:]]+$/, "", items[j])
if (items[j] != "") {
if (printed > 0) printf ",\n"
printf "%s%s", ind, items[j]
printed++
}
}
}
}
# Get indentation from closing brace
match(elements_closing_brace, /^[[:space:]]+/)
ind = substr(elements_closing_brace, 1, RLENGTH)
printf ",\n%s\t\t \033[36m# +%d entries...\033[0m\n", ind, element_count - printed
printf "%s\t\t \033[33m# Total: %d entries\033[0m\n", ind, element_count
print elements_closing_brace
}
} else if (in_elements && element_count == 0) {
printf "%s", buffer
printf "elements = { }\n"
} else {
printf "%s", buffer
}
}
END {
if (in_set) {
flush_set()
}
}
' |