You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
3.1 KiB

  1. #!/bin/sh
  2. # helper script to resolve domains for adding to banIP-related IPSets
  3. # Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org)
  4. # This is free software, licensed under the GNU General Public License v3.
  5. # (s)hellcheck exceptions
  6. # shellcheck disable=1091,3040
  7. export LC_ALL=C
  8. export PATH="/usr/sbin:/usr/bin:/sbin:/bin"
  9. set -o pipefail
  10. . "/lib/functions.sh"
  11. ban_action="${1}"
  12. ban_src_name="${2}"
  13. ban_src_file="${3}"
  14. ban_tmpbase="$(uci_get banip global ban_tmpbase "/tmp")"
  15. ban_backupdir="$(uci_get banip global ban_backupdir "${ban_tmpbase}/banIP-Backup")"
  16. ban_proto4_enabled="$(uci_get banip global ban_proto4_enabled "0")"
  17. ban_proto6_enabled="$(uci_get banip global ban_proto6_enabled "0")"
  18. ban_ipset_cmd="$(command -v ipset)"
  19. ban_lookup_cmd="$(command -v nslookup)"
  20. ban_logger_cmd="$(command -v logger)"
  21. if [ "${ban_action}" = "start" ] || [ "${ban_action}" = "refresh" ]; then
  22. for proto in "4" "6"; do
  23. if { [ "${proto}" = "4" ] && [ "${ban_proto4_enabled}" = "1" ]; } ||
  24. { [ "${proto}" = "6" ] && [ "${ban_proto6_enabled}" = "1" ]; }; then
  25. gzip -df "${ban_backupdir}/banIP.${ban_src_name}_addon_${proto}.gz" 2>/dev/null
  26. fi
  27. done
  28. fi
  29. if { [ "${ban_proto4_enabled}" = "1" ] && [ ! -s "${ban_backupdir}/banIP.${ban_src_name}_addon_4" ]; } ||
  30. { [ "${ban_proto6_enabled}" = "1" ] && [ ! -s "${ban_backupdir}/banIP.${ban_src_name}_addon_6" ]; }; then
  31. [ -s "${ban_backupdir}/banIP.${ban_src_name}_addon_4" ] && : > "${ban_backupdir}/banIP.${ban_src_name}_addon_4"
  32. [ -s "${ban_backupdir}/banIP.${ban_src_name}_addon_6" ] && : > "${ban_backupdir}/banIP.${ban_src_name}_addon_6"
  33. while read -r domain; do
  34. result="$(
  35. "${ban_lookup_cmd}" "${domain}" 2>/dev/null
  36. printf "%s" "${?}"
  37. )"
  38. if [ "$(printf "%s" "${result}" | tail -1)" = "0" ]; then
  39. ips="$(printf "%s" "${result}" | awk '/^Address[ 0-9]*: /{ORS=" ";print $NF}')"
  40. for ip in ${ips}; do
  41. for proto in "4" "6"; do
  42. if { [ "${proto}" = "4" ] && [ "${ban_proto4_enabled}" = "1" ] && [ -n "$("${ban_ipset_cmd}" -q -n list "${ban_src_name}_${proto}")" ] &&
  43. [ -n "$(printf "%s" "${ip}" | awk '/^(([0-9]{1,3}\.){3}[0-9]{1,3}(\/[0-9]{1,2})?)([[:space:]]|$)/{print $1}')" ]; } ||
  44. { [ "${proto}" = "6" ] && [ "${ban_proto6_enabled}" = "1" ] && [ -n "$("${ban_ipset_cmd}" -q -n list "${ban_src_name}_${proto}")" ] &&
  45. [ -n "$(printf "%s" "${ip}" | awk '/^(([0-9A-f]{0,4}:){1,7}[0-9A-f]{0,4}:?(\/(1?[0-2][0-8]|[0-9][0-9]))?)([[:space:]]|$)/{print $1}')" ]; }; then
  46. printf "%s\n" "add ${ban_src_name}_${proto} ${ip}" >>"${ban_backupdir}/banIP.${ban_src_name}_addon_${proto}"
  47. fi
  48. done
  49. done
  50. fi
  51. done <"${ban_src_file}"
  52. fi
  53. for proto in "4" "6"; do
  54. if [ -n "$("${ban_ipset_cmd}" -q -n list "${ban_src_name}_${proto}")" ] && [ -s "${ban_backupdir}/banIP.${ban_src_name}_addon_${proto}" ]; then
  55. "${ban_ipset_cmd}" -q -! restore <"${ban_backupdir}/banIP.${ban_src_name}_addon_${proto}"
  56. gzip -f "${ban_backupdir}/banIP.${ban_src_name}_addon_${proto}"
  57. fi
  58. done
  59. "${ban_logger_cmd}" -p "info" -t "banIP-resolve [${$}]" "banIP domain import for source '${ban_src_name}' has been finished" 2>/dev/null
  60. rm -f "${ban_src_file}"