diff --git a/autoinstall/2.x/apk/autoinstall.sh b/autoinstall/2.x/apk/autoinstall.sh index dc8e4af..36571a3 100755 --- a/autoinstall/2.x/apk/autoinstall.sh +++ b/autoinstall/2.x/apk/autoinstall.sh @@ -10,9 +10,9 @@ LUCI_APP=1 HTTPS_DNS_PROXY=1 OWRT_VERSION="25.12" -RUAB_VERSION="2.1.10-r1" -RUAB_MOD_LUA_VERSION="2.1.10-r1" -RUAB_LUCI_APP_VERSION="2.1.10-r2" +RUAB_VERSION="2.1.11-r1" +RUAB_MOD_LUA_VERSION="2.1.11-r1" +RUAB_LUCI_APP_VERSION="2.1.11-r1" BASE_URL="https://raw.githubusercontent.com/gSpotx2f/packages-openwrt/master" PKG_DIR="/tmp" diff --git a/autoinstall/2.x/autoinstall.sh b/autoinstall/2.x/autoinstall.sh index bc7882d..8141a41 100755 --- a/autoinstall/2.x/autoinstall.sh +++ b/autoinstall/2.x/autoinstall.sh @@ -10,9 +10,9 @@ LUCI_APP=1 HTTPS_DNS_PROXY=1 OWRT_VERSION="24.10" -RUAB_VERSION="2.1.10-r1" -RUAB_MOD_LUA_VERSION="2.1.10-r1" -RUAB_LUCI_APP_VERSION="2.1.10-r2" +RUAB_VERSION="2.1.11-r1" +RUAB_MOD_LUA_VERSION="2.1.11-r1" +RUAB_LUCI_APP_VERSION="2.1.11-r1" BASE_URL="https://raw.githubusercontent.com/gSpotx2f/packages-openwrt/master" PKG_DIR="/tmp" diff --git a/luci-app-ruantiblock/Makefile b/luci-app-ruantiblock/Makefile index 50f1f57..d2602af 100644 --- a/luci-app-ruantiblock/Makefile +++ b/luci-app-ruantiblock/Makefile @@ -5,8 +5,9 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-ruantiblock -PKG_VERSION:=2.1.10 -PKG_RELEASE:=2 +PKG_VERSION:=2.1.11 +PKG_RELEASE:=1 +PKG_MAINTAINER:=gSpot LUCI_TITLE:=LuCI support for ruantiblock LUCI_DEPENDS:=+ruantiblock LUCI_PKGARCH:=all diff --git a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js index ff9eb44..1c714c8 100644 --- a/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js +++ b/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js @@ -49,7 +49,6 @@ return view.extend({ if(!i.rule) { continue; }; - let set, bytes; i.rule.expr.forEach(e => { if(e.match && e.match.left && e.match.left.payload) { @@ -309,9 +308,8 @@ return view.extend({ user_entries.append( E('tr', { 'class': 'tr' }, [ E('td', { 'class': 'td left', 'style': 'word-wrap:break-word' }, - i.id), - E('td', { 'class': 'td left', - 'id' : 'user_entries_' + i }, + i.id.slice(0, 114) + (i.id.length > 115 ? '...' : '')), + E('td', { 'class': 'td left' }, `CIDR: ${i.cidr}, IP: ${i.ip}, FQDN: ${i.fqdn}`), ]) ); diff --git a/ruantiblock-mod-lua/Makefile b/ruantiblock-mod-lua/Makefile index 06c86ea..5638b2b 100644 --- a/ruantiblock-mod-lua/Makefile +++ b/ruantiblock-mod-lua/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ruantiblock-mod-lua -PKG_VERSION:=2.1.10 +PKG_VERSION:=2.1.11 PKG_RELEASE:=1 PKG_MAINTAINER:=gSpot diff --git a/ruantiblock-mod-py/Makefile b/ruantiblock-mod-py/Makefile index f8a85f8..fdf98e5 100644 --- a/ruantiblock-mod-py/Makefile +++ b/ruantiblock-mod-py/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ruantiblock-mod-py -PKG_VERSION:=2.1.10 +PKG_VERSION:=2.1.11 PKG_RELEASE:=1 PKG_MAINTAINER:=gSpot diff --git a/ruantiblock/Makefile b/ruantiblock/Makefile index 01aea64..eec4569 100644 --- a/ruantiblock/Makefile +++ b/ruantiblock/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ruantiblock -PKG_VERSION:=2.1.10 +PKG_VERSION:=2.1.11 PKG_RELEASE:=1 PKG_MAINTAINER:=gSpot @@ -73,6 +73,7 @@ define Package/$(PKG_NAME)/install $(INSTALL_DATA) ./files/usr/share/ruantiblock/user_instances_common $(1)/usr/share/ruantiblock/user_instances_common $(INSTALL_DIR) $(1)/usr/libexec/ruantiblock $(INSTALL_BIN) ./files/usr/libexec/ruantiblock/ruab_route_check $(1)/usr/libexec/ruantiblock/ruab_route_check + $(INSTALL_BIN) ./files/usr/libexec/ruantiblock/ruab_parser_user_entries $(1)/usr/libexec/ruantiblock/ruab_parser_user_entries $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) ./files/usr/bin/ruantiblock $(1)/usr/bin/ruantiblock endef diff --git a/ruantiblock/files/usr/bin/ruantiblock b/ruantiblock/files/usr/bin/ruantiblock index e1581c6..0f112d5 100755 --- a/ruantiblock/files/usr/bin/ruantiblock +++ b/ruantiblock/files/usr/bin/ruantiblock @@ -228,24 +228,24 @@ export DNSMASQ_DATA_FILE_USER_INSTANCES="${DNSMASQ_CONFDIR}/01-${NAME}_user_inst export DNSMASQ_DATA_FILE="${DNSMASQ_CONFDIR}/02-${NAME}.dnsmasq" ### Utilities -AWK_CMD="awk" +export AWK_CMD="awk" NFT_CMD="$(which nft)" if [ $? -ne 0 ]; then echo " Error! Nftables doesn't exists" >&2 exit 1 fi -LOGGER_CMD="$(which logger)" +export LOGGER_CMD="$(which logger)" if [ $ENABLE_LOGGING = "1" -a $? -ne 0 ]; then echo " Logger doesn't exists" >&2 ENABLE_LOGGING=0 fi -LOGGER_PARAMS="-t ${APP_NAME}" -WGET_CMD="$(which wget)" +export LOGGER_PARAMS="-t ${APP_NAME}" +export WGET_CMD="$(which wget)" if [ $? -ne 0 ]; then echo " Error! Wget doesn't exists" >&2 exit 1 fi -WGET_PARAMS="--no-check-certificate -q -O" +export WGET_PARAMS="--no-check-certificate -q -O" NSLOOKUP_CMD="$(which nslookup)" if [ $? -ne 0 ]; then echo " Error! Nslookup doesn't exists" >&2 @@ -256,6 +256,7 @@ if [ $? -ne 0 ]; then echo " Error! Iproute2 doesn't exists" >&2 exit 1 fi +USER_ENTRIES_PARSER="${MODULES_DIR}/ruab_parser_user_entries" ROUTE_CHECK_EXEC="${MODULES_DIR}/ruab_route_check" export IP_DATA_FILE="${DATA_DIR}/${NAME}.ip" export IP_DATA_FILE_BYPASS="${DATA_DIR}/${NAME}_bypass.ip" @@ -298,7 +299,6 @@ NFT_FUNCTIONS="${SCRIPTS_DIR}/nft_functions" INFO_OUTPUT_FUNCTION="${SCRIPTS_DIR}/info_output" export IP_DATA_FILE_TMP="${IP_DATA_FILE}.tmp" export IP_DATA_FILE_USER_INSTANCES_TMP="${IP_DATA_FILE_USER_INSTANCES}.tmp" -export DNSMASQ_DATA_FILE_TMP="${DNSMASQ_DATA_FILE}.tmp" export DNSMASQ_DATA_FILE_USER_INSTANCES_TMP="${DNSMASQ_DATA_FILE_USER_INSTANCES}.tmp" export DNSMASQ_DATA_FILE_TMP="${DNSMASQ_DATA_FILE}.tmp" export UPDATE_STATUS_FILE_TMP="${UPDATE_STATUS_FILE}.tmp" @@ -313,9 +313,6 @@ INSTANCES_CACHE="${RUN_FILES_DIR}/${NAME}.instances" DL_IPSET_URL="" DL_DMASK_URL="" DL_STAT_URL="" -### for compatibility with v1.x parsers -export NFTSET_CIDR_CFG="$NFTSET_CIDR_STRING_MAIN" -export NFTSET_IP_CFG="$NFTSET_IP_STRING_MAIN" ######################### External functions ########################### @@ -447,11 +444,8 @@ FlushInstancesNftSets() { _name=".${_name}" fi case "$_arg" in - fqdn) - FlushNftSets "${NFTSET_DNSMASQ}${_name}" "${NFTSET_ONION}${_name}" - ;; bllist) - FlushNftSets "${NFTSET_CIDR}${_name}" "${NFTSET_IP}${_name}" "${NFTSET_DNSMASQ}${_name}" + FlushNftSets "${NFTSET_CIDR}${_name}" "${NFTSET_IP}${_name}" "${NFTSET_DNSMASQ}${_name}" "${NFTSET_ONION}${_name}" ;; *) FlushNftSets "${NFTSET_FPROXY}${_name}" "${NFTSET_BLLIST_PROXY}${_name}" "${NFTSET_CIDR}${_name}" "${NFTSET_IP}${_name}" "${NFTSET_DNSMASQ}${_name}" "${NFTSET_ONION}${_name}" @@ -532,7 +526,6 @@ UpdateBllistProxySet() { else _name=".${_name}" fi - FlushNftSets "${NFTSET_BLLIST_PROXY}${_name}" for _host in $(echo "$_urls" | $AWK_CMD ' BEGIN { RS = " "; @@ -746,12 +739,12 @@ AddBypassEntries() { FlushNftSets "$NFTSET_BYPASS_IP" "$NFTSET_BYPASS_FQDN" if [ "$BYPASS_MODE" = "1" ]; then if [ -f "$BYPASS_ENTRIES_FILE" ]; then - $AWK_CMD 'BEGIN { - ip_array[0]; - fqdn_array[0]; + $AWK_CMD ' + BEGIN { + delete ip_array; + delete fqdn_array; } function writeIpList(array, _str) { - _str = ""; for(i in array) { _str = _str i ","; }; @@ -767,9 +760,8 @@ AddBypassEntries() { printf "nftset=/%s/%s#%s\n", val, ENVIRON["NFT_TABLE_DNSMASQ"], ENVIRON["NFTSET_BYPASS_FQDN"] >> ENVIRON["DNSMASQ_DATA_FILE_BYPASS"]; }; function writeFqdnEntries() { - delete fqdn_array[0]; for(i in fqdn_array) { - split(fqdn_array[i], a, " "); + split(i, a, " "); writeDNSData(a[1], a[2]); }; }; @@ -779,12 +771,11 @@ AddBypassEntries() { ip_array[$0]; } else if($0 ~ /^([a-z0-9._-]+[.])*([a-z]{2,}|xn--[a-z0-9]+)([ ][0-9]{1,3}([.][0-9]{1,3}){3}([#][0-9]{2,5})?)?$/) { - fqdn_array[length(fqdn_array)] = $1 " " $2; + fqdn_array[$0]; }; } END { printf "table %s {\n%s", ENVIRON["NFT_TABLE"], ENVIRON["NFTSET_BYPASS_IP_STRING"] >> ENVIRON["IP_DATA_FILE_BYPASS"]; - delete ip_array[0]; if(length(ip_array) > 0) { printf "elements={%s};", writeIpList(ip_array) >> ENVIRON["IP_DATA_FILE_BYPASS"]; }; @@ -795,77 +786,6 @@ AddBypassEntries() { fi } -ParseUserEntries() { - $AWK_CMD -v NFTSET_IP_STRING="$1" -v NFTSET_CIDR_STRING="$2" -v NFTSET_DNSMASQ="$3" \ - -v IP_DATA_FILE="$4" -v DNSMASQ_DATA_FILE="$5" -v USER_ENTRIES_STATUS_FILE="$6" \ - -v ID="$7" -v USER_ENTRIES_DNS="$8" ' - BEGIN { - ip_array[0]; - cidr_array[0]; - fqdn_array[0]; - } - function writeIpList(array, _str) { - _str = ""; - for(i in array) { - _str = _str i ","; - }; - return _str; - }; - function writeDNSData(val, dns) { - if(length(dns) == 0 && length(USER_ENTRIES_DNS) > 0) { - dns = USER_ENTRIES_DNS; - }; - if(length(dns) > 0) { - printf "server=/%s/%s\n", val, dns >> DNSMASQ_DATA_FILE; - }; - printf "nftset=/%s/%s#%s\n", val, ENVIRON["NFT_TABLE_DNSMASQ"], NFTSET_DNSMASQ >> DNSMASQ_DATA_FILE; - }; - function writeFqdnEntries() { - delete fqdn_array[0]; - for(i in fqdn_array) { - split(fqdn_array[i], a, " "); - writeDNSData(a[1], a[2]); - }; - }; - ($0 !~ /^([\040\011]*$|#)/) { - sub("\015", "", $0); - if($0 ~ /^[0-9]{1,3}([.][0-9]{1,3}){3}$/) { - ip_array[$0]; - } - else if($0 ~ /^[0-9]{1,3}([.][0-9]{1,3}){3}[\057][0-9]{1,2}$/) { - cidr_array[$0]; - } - else if($0 ~ /^([a-z0-9._-]+[.])*([a-z]{2,}|xn--[a-z0-9]+)([ ][0-9]{1,3}([.][0-9]{1,3}){3}([#][0-9]{2,5})?)?$/) { - fqdn_array[length(fqdn_array)] = $1 " " $2; - }; - } - END { - ret_code = 0; - if($0 ~ /[0-9]+/) { - ret_code = $0; - }; - delete cidr_array[0]; - delete ip_array[0]; - if(ret_code == 0 && (length(cidr_array) > 0 || length(ip_array) > 0)) { - printf "table %s {\n%s", ENVIRON["NFT_TABLE"], NFTSET_CIDR_STRING >> IP_DATA_FILE; - if(length(cidr_array) > 0) { - printf "elements={%s};", writeIpList(cidr_array) >> IP_DATA_FILE; - }; - printf "}\n%s", NFTSET_IP_STRING >> IP_DATA_FILE; - - if(length(ip_array) > 0) { - printf "elements={%s};", writeIpList(ip_array) >> IP_DATA_FILE; - }; - printf "}\n}\n" >> IP_DATA_FILE; - }; - writeFqdnEntries(); - if(ret_code == 0) { - printf "%s %s %s %s\n", length(cidr_array), length(ip_array), length(fqdn_array), ID >> USER_ENTRIES_STATUS_FILE; - }; - exit ret_code; - }' - -} - AddUserEntries() { local _inst _url _return_code=0 _instance_return_code=0 _attempt=1 _instance_entries_file _ip_data_file_user_instances _dnsmasq_data_file_user_instances _user_entries_status_file _str _update_string @@ -901,42 +821,44 @@ AddUserEntries() { ### Запись для .onion printf "server=/onion/%s\nnftset=/onion/%s#%s\n" "$U_ONION_DNS_ADDR" "$NFT_TABLE_DNSMASQ" "${NFTSET_ONION}.${U_NAME}" >> "$_dnsmasq_data_file_user_instances" fi - if [ -f "$_instance_entries_file" ]; then - { cat "$_instance_entries_file"; printf "\n0\n"; } | ParseUserEntries "$(printf "$NFTSET_IP_PATTERN" "${NFTSET_IP}.${U_NAME}")" "$(printf "$NFTSET_CIDR_PATTERN" "${NFTSET_CIDR}.${U_NAME}")" "${NFTSET_DNSMASQ}.${U_NAME}" "$_ip_data_file_user_instances" "$_dnsmasq_data_file_user_instances" "$_user_entries_status_file" "${U_NAME}:local" "$U_ENTRIES_DNS" - fi - if [ -n "$U_ENTRIES_REMOTE" ]; then + + if [ "$U_ENABLE_ENTRIES_REMOTE_PROXY" = "1" ]; then for _url in $U_ENTRIES_REMOTE do - _instance_return_code=0 - _attempt=1 - while : - do - if [ "$U_ENABLE_ENTRIES_REMOTE_PROXY" = "1" ]; then - UpdateBllistProxySet "$U_NAME" "$_url" - fi - { Download - "$_url"; printf "\n$?\n"; } | ParseUserEntries "$(printf "$NFTSET_IP_PATTERN" "${NFTSET_IP}.${U_NAME}")" "$(printf "$NFTSET_CIDR_PATTERN" "${NFTSET_CIDR}.${U_NAME}")" "${NFTSET_DNSMASQ}.${U_NAME}" "$_ip_data_file_user_instances" "$_dnsmasq_data_file_user_instances" "$_user_entries_status_file" "${U_NAME}:${_url}" "$U_ENTRIES_DNS" - if [ $? -eq 0 ]; then - _instance_return_code=0 - break - else - _instance_return_code=1 - ### STDOUT - echo " User entries download attempt ${_attempt}: failed [${U_NAME}:${_url}]" >&2 - MakeLogRecord "err" "User entries download attempt ${_attempt}: failed [${U_NAME}:${_url}]" - _attempt=$(($_attempt + 1)) - [ $_attempt -gt $USER_ENTRIES_REMOTE_DOWNLOAD_ATTEMPTS ] && break - sleep $USER_ENTRIES_REMOTE_DOWNLOAD_TIMEOUT - fi - done - if [ $_instance_return_code -ne 0 ]; then - _return_code=$_instance_return_code - if [ "$ENABLE_TMP_DOWNLOADS" = "1" ]; then - break 2 - fi - fi + UpdateBllistProxySet "$U_NAME" "$_url" done - if [ "$U_ENABLE_ENTRIES_REMOTE_PROXY" = "1" ]; then - FlushNftSets "${NFTSET_BLLIST_PROXY}.${U_NAME}" + fi + + export U_NAME + export U_ENTRIES_REMOTE + export U_ENTRIES_DNS + export I_NFTSET_CIDR_STRING="$(printf "$NFTSET_CIDR_PATTERN" "${NFTSET_CIDR}.${U_NAME}")" + export I_NFTSET_IP_STRING="$(printf "$NFTSET_IP_PATTERN" "${NFTSET_IP}.${U_NAME}")" + export I_NFTSET_DNSMASQ="${NFTSET_DNSMASQ}.${U_NAME}" + export I_IP_DATA_FILE="$_ip_data_file_user_instances" + export I_DNSMASQ_DATA_FILE="$_dnsmasq_data_file_user_instances" + export I_USER_ENTRIES_STATUS_FILE="$_user_entries_status_file" + export I_INSTANCE_ENTRIES_FILE="$_instance_entries_file" + + $USER_ENTRIES_PARSER + _instance_return_code=$? + + unset I_NFTSET_CIDR_STRING + unset I_NFTSET_IP_STRING + unset I_NFTSET_DNSMASQ + unset I_IP_DATA_FILE + unset I_DNSMASQ_DATA_FILE + unset I_USER_ENTRIES_STATUS_FILE + unset I_INSTANCE_ENTRIES_FILE + + if [ "$U_ENABLE_ENTRIES_REMOTE_PROXY" = "1" ]; then + FlushNftSets "${NFTSET_BLLIST_PROXY}.${U_NAME}" + fi + + if [ $_instance_return_code -ne 0 ]; then + _return_code=$_instance_return_code + if [ "$ENABLE_TMP_DOWNLOADS" = "1" ]; then + break fi fi ClearUserInstanceVars @@ -1139,7 +1061,7 @@ Update() { FlushInstancesNftSets bllist fi GetBlacklistFiles - FlushInstancesNftSets fqdn + FlushInstancesNftSets bllist UpdateBllistSets _return_code=$? RestartDnsmasq diff --git a/ruantiblock/files/usr/libexec/ruantiblock/ruab_parser_user_entries b/ruantiblock/files/usr/libexec/ruantiblock/ruab_parser_user_entries new file mode 100755 index 0000000..ebf552b --- /dev/null +++ b/ruantiblock/files/usr/libexec/ruantiblock/ruab_parser_user_entries @@ -0,0 +1,209 @@ +#!/bin/sh + +echo | $AWK_CMD -v WGET_CMD="$WGET_CMD" -v WGET_PARAMS="$WGET_PARAMS" \ + -v LOGGER_CMD="$LOGGER_CMD" -v LOGGER_PARAMS="$LOGGER_PARAMS" ' + BEGIN { + stderr = "/dev/stderr"; + ENABLE_LOGGING = ENVIRON["ENABLE_LOGGING"]; + ENABLE_TMP_DOWNLOADS = ENVIRON["ENABLE_TMP_DOWNLOADS"]; + sleep = "sleep " ENVIRON["USER_ENTRIES_REMOTE_DOWNLOAD_TIMEOUT"]; + DOWNLOAD_ATTEMPTS = ENVIRON["USER_ENTRIES_REMOTE_DOWNLOAD_ATTEMPTS"]; + attempt_err_pattern = "User entries download attempt %s: failed [%s:%s]"; + U_NAME = ENVIRON["U_NAME"]; + U_ENTRIES_REMOTE = ENVIRON["U_ENTRIES_REMOTE"]; + U_USER_ENTRIES_DNS = ENVIRON["U_ENTRIES_DNS"]; + NFT_TABLE = ENVIRON["NFT_TABLE"]; + NFTSET_CIDR_STRING = ENVIRON["I_NFTSET_CIDR_STRING"]; + NFTSET_IP_STRING = ENVIRON["I_NFTSET_IP_STRING"]; + NFTSET_DNSMASQ = ENVIRON["I_NFTSET_DNSMASQ"]; + NFT_TABLE_DNSMASQ = ENVIRON["NFT_TABLE_DNSMASQ"]; + IP_DATA_FILE = ENVIRON["I_IP_DATA_FILE"]; + DNSMASQ_DATA_FILE = ENVIRON["I_DNSMASQ_DATA_FILE"]; + USER_ENTRIES_STATUS_FILE = ENVIRON["I_USER_ENTRIES_STATUS_FILE"]; + INSTANCE_ENTRIES_FILE = ENVIRON["I_INSTANCE_ENTRIES_FILE"]; + exit_code = 0; + + gsub("\042", "%22", U_ENTRIES_REMOTE); + gsub("\047", "%27", U_ENTRIES_REMOTE); + split(U_ENTRIES_REMOTE, urls, /[\040\011\012]+/); + + delete ip_array; + delete cidr_array; + delete fqdn_array; + delete download_results; + } + function makeLogRecord(level, msg) { + if(ENABLE_LOGGING == 1) { + system(sprintf("%s %s -p \"user.%s\" \"%s\"", LOGGER_CMD, LOGGER_PARAMS, level, msg)); + }; + }; + function writeIpList(array, _str) { + for(i in array) { + _str = _str i ","; + }; + return _str; + }; + function writeDNSData(val, dns) { + if(length(dns) == 0 && length(U_USER_ENTRIES_DNS) > 0) { + dns = U_USER_ENTRIES_DNS; + }; + if(length(dns) > 0) { + printf "server=/%s/%s\n", val, dns >> DNSMASQ_DATA_FILE; + }; + printf "nftset=/%s/%s#%s\n", val, NFT_TABLE_DNSMASQ, NFTSET_DNSMASQ >> DNSMASQ_DATA_FILE; + }; + function writeFqdnEntries() { + for(i in fqdn_array) { + split(i, a, " "); + writeDNSData(a[1], a[2]); + }; + }; + function trimEntry(str) { + sub("\015", "", str); + return str; + }; + function checkEntry(str) { + if (str ~ /^([\040\011]*$|#)/) { + return 0; + } + else if(str ~ /^[0-9]{1,3}([.][0-9]{1,3}){3}$/) { + return 2; + } + else if(str ~ /^[0-9]{1,3}([.][0-9]{1,3}){3}[\057][0-9]{1,2}$/) { + return 1; + } + else if(str ~ /^([a-z0-9._-]+[.])*([a-z]{2,}|xn--[a-z0-9]+)([ ][0-9]{1,3}([.][0-9]{1,3}){3}([#][0-9]{2,5})?)?$/) { + return 3; + }; + }; + function readFile(fpath, fname, _line, _cidr_num, _ip_num, _fqdn_num, _ret) { + _cidr_num = 0; _ip_num = 0; _fqdn_num = 0; + while((getline _line 0) { + _line = trimEntry(_line); + _ret = checkEntry(_line); + if(_ret == 1) { + if(!(_line in cidr_array)) { + cidr_array[_line]; + _cidr_num++; + }; + } + else if(_ret == 2) { + if(!(_line in ip_array)) { + ip_array[_line]; + _ip_num++; + }; + } + else if(_ret == 3) { + if(!(_line in fqdn_array)) { + fqdn_array[_line]; + _fqdn_num++; + }; + }; + }; + close(fpath); + download_results[length(download_results)] = sprintf("%s %s %s %s:%s", + _cidr_num, _ip_num, _fqdn_num, U_NAME, fname); + }; + function downloadFile(url, _ret_code, _wget_call, _cidr_array, _ip_array, _fqdn_array, _val, _ret) { + if(length(url) == 0) { + return 1; + }; + + _ret_code = 1; + _wget_call = sprintf("%s %s - \"%s\"; printf \"\n$?\n\"", WGET_CMD, WGET_PARAMS, url); + + delete _cidr_array; + delete _ip_array; + delete _fqdn_array; + + for(i = 1; i <= DOWNLOAD_ATTEMPTS; i++) { + delete _cidr_array; + delete _ip_array; + delete _fqdn_array; + + while((_wget_call | getline _val) > 0) { + if(_val ~ /^[0-9]{1,3}$/) { + continue; + }; + _val = trimEntry(_val); + _ret = checkEntry(_val); + if(_ret == 1) { + _cidr_array[_val]; + } + else if(_ret == 2) { + _ip_array[_val]; + } + else if(_ret == 3) { + _fqdn_array[_val]; + }; + }; + close(_wget_call); + + if(_val ~ /^[0-9]{1,3}$/) { + _ret_code = _val; + }; + if(_ret_code == 0) { + break; + }; + + makeLogRecord("err", sprintf(attempt_err_pattern, i, U_NAME, url)); + printf(" " attempt_err_pattern "\n", i, U_NAME, url) > stderr; + + if(i >= DOWNLOAD_ATTEMPTS) { + break; + }; + sleep | getline _; + close(sleep); + }; + + if(_ret_code == 0 && (length(_cidr_array) > 0 || length(_ip_array) > 0 || length(_fqdn_array) > 0)) { + for(i in _cidr_array) { + cidr_array[i]; + }; + for(i in _ip_array) { + ip_array[i]; + }; + for(i in _fqdn_array) { + fqdn_array[i]; + }; + }; + + download_results[length(download_results)] = sprintf("%s %s %s %s:%s", + length(_cidr_array), length(_ip_array), length(_fqdn_array), U_NAME, url); + + return _ret_code; + }; + END { + readFile(INSTANCE_ENTRIES_FILE, "local"); + dl_ret_code = 1; + for(i in urls) { + url = urls[i]; + dl_ret_code = downloadFile(url); + if(dl_ret_code != 0) { + exit_code = dl_ret_code; + if(ENABLE_TMP_DOWNLOADS == 1) { + break; + }; + }; + }; + if(ENABLE_TMP_DOWNLOADS != 1 || (ENABLE_TMP_DOWNLOADS == 1 && exit_code == 0)) { + if(length(cidr_array) > 0 || length(ip_array) > 0) { + printf "table %s {\n%s", NFT_TABLE, NFTSET_CIDR_STRING >> IP_DATA_FILE; + if(length(cidr_array) > 0) { + printf "elements={%s};", writeIpList(cidr_array) >> IP_DATA_FILE; + }; + printf "}\n%s", NFTSET_IP_STRING >> IP_DATA_FILE; + if(length(ip_array) > 0) { + printf "elements={%s};", writeIpList(ip_array) >> IP_DATA_FILE; + }; + printf "}\n}\n" >> IP_DATA_FILE; + }; + writeFqdnEntries(); + for(i in download_results) { + print download_results[i] >> USER_ENTRIES_STATUS_FILE; + }; + }; + exit exit_code; + }' + +exit $?