87 lines
2.3 KiB
Bash
Executable File
87 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Must run as root
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "🚨 This script must be run as root."
|
|
echo "👉 Please run it using: sudo $0"
|
|
exit 1
|
|
fi
|
|
|
|
DOMAINS_FILE="domains.txt"
|
|
HOSTS_FILE="/etc/hosts"
|
|
TMP_FILE=$(mktemp)
|
|
TMP_HOSTS=$(mktemp)
|
|
cp "$HOSTS_FILE" "$TMP_HOSTS" # Work on a temp copy
|
|
|
|
CURRENT_CATEGORY=""
|
|
declare -a CATEGORY_DOMAINS=()
|
|
|
|
flush_category() {
|
|
[[ -z "$CURRENT_CATEGORY" ]] && return
|
|
|
|
IPV4_COMMENT="$CURRENT_CATEGORY"
|
|
IPV6_COMMENT="${CURRENT_CATEGORY} ipv6"
|
|
|
|
# Only add if not already in file
|
|
add_block() {
|
|
local ip="$1"
|
|
local comment="$2"
|
|
if grep -Fxq "$comment" "$TMP_HOSTS"; then
|
|
# Find insertion point
|
|
END_LINE=$(awk -v cat="$comment" '
|
|
$0 == cat { found=1; next }
|
|
found && $0 ~ /^#/ { exit }
|
|
found { line=NR }
|
|
END { print (line ? line : 0) }
|
|
' "$TMP_HOSTS")
|
|
INSERT_LINE=$((END_LINE + 1))
|
|
for domain in "${CATEGORY_DOMAINS[@]}"; do
|
|
if ! grep -qE "^[[:space:]]*$ip[[:space:]]+$domain\$" "$TMP_HOSTS"; then
|
|
sed -i "${INSERT_LINE}i$ip $domain" "$TMP_HOSTS"
|
|
((INSERT_LINE++))
|
|
fi
|
|
done
|
|
else
|
|
{
|
|
echo ""
|
|
echo "$comment"
|
|
for domain in "${CATEGORY_DOMAINS[@]}"; do
|
|
if ! grep -qE "^[[:space:]]*$ip[[:space:]]+$domain\$" "$TMP_HOSTS"; then
|
|
echo "$ip $domain"
|
|
fi
|
|
done
|
|
} >> "$TMP_HOSTS"
|
|
fi
|
|
}
|
|
|
|
add_block "127.0.0.1" "$IPV4_COMMENT"
|
|
add_block "::1" "$IPV6_COMMENT"
|
|
|
|
# Reset
|
|
CURRENT_CATEGORY=""
|
|
CATEGORY_DOMAINS=()
|
|
}
|
|
|
|
while IFS= read -r line || [ -n "$line" ]; do
|
|
line=$(echo "$line" | sed 's/^[ \t]*//;s/[ \t]*$//')
|
|
[[ -z "$line" ]] && continue
|
|
|
|
if [[ "$line" == \#* ]]; then
|
|
flush_category
|
|
CURRENT_CATEGORY="$line"
|
|
else
|
|
CATEGORY_DOMAINS+=("$line")
|
|
fi
|
|
done < "$DOMAINS_FILE"
|
|
|
|
flush_category
|
|
|
|
# Backup and replace hosts file
|
|
cp "$HOSTS_FILE" "${HOSTS_FILE}.bak"
|
|
cat "$TMP_HOSTS" > "$HOSTS_FILE"
|
|
|
|
echo "✅ Domains have been categorized and added (IPv4 & IPv6) to $HOSTS_FILE."
|
|
|
|
rm "$TMP_FILE" "$TMP_HOSTS"
|
|
|