From 508e81b66c1d3d1e94aee601635683f8a92eb588 Mon Sep 17 00:00:00 2001 From: remittor Date: Thu, 15 Jan 2026 22:02:34 +0300 Subject: [PATCH] diag: Add support resolve ip via specific dns --- .../resources/view/zapret/diagnost.js | 20 +++++++ zapret/dwc.sh | 52 +++++++++++++------ 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/luci-app-zapret/htdocs/luci-static/resources/view/zapret/diagnost.js b/luci-app-zapret/htdocs/luci-static/resources/view/zapret/diagnost.js index 33af4b9..4c9e433 100644 --- a/luci-app-zapret/htdocs/luci-static/resources/view/zapret/diagnost.js +++ b/luci-app-zapret/htdocs/luci-static/resources/view/zapret/diagnost.js @@ -30,6 +30,11 @@ return baseclass.extend({ this.appendLog('Original sources: https://github.com/hyperion-cs/dpi-checkers'); this.appendLog('WEB-version: https://hyperion-cs.github.io/dpi-checkers/ru/tcp-16-20/'); let cmd = [ fn_dwc_sh ]; + let resolve_dns = document.getElementById('cfg_resolve_dns'); + let dns_ip = resolve_dns.options[resolve_dns.selectedIndex].text; + if (dns_ip && dns_ip != 'default') { + cmd.push(...[ '-d', dns_ip.trim() ]); + } let log = '/tmp/'+tools.appName+'_dwc.log'; let callback = this.execAndReadCallback; let wnd = this; @@ -60,6 +65,19 @@ return baseclass.extend({ { this.pkg_arch = pkg_arch; + let DNS_LIST = [ '8.8.8.8', '1.1.1.1' ]; + let dns_list = [ ]; + dns_list.push( E('option', { value: 'dns_default' }, [ 'default' ] ) ); + for (let id = 0; id < DNS_LIST.length; id++) { + let dns_ipaddr = '' + DNS_LIST[id]; + let val = 'dns_' + dns_ipaddr.replace(/\./g, "_"); + dns_list.push( E('option', { value: val }, [ dns_ipaddr ] )); + } + let resolve_dns = E('label', [ + _('Resolve IP-Addr via') + ': ', + E('select', { id: 'cfg_resolve_dns' }, dns_list) + ]); + this.logArea = E('textarea', { 'id': 'widget.modal_content', 'readonly': true, @@ -84,6 +102,8 @@ return baseclass.extend({ ui.showModal(_('Diagnostics'), [ E('div', { 'class': 'cbi-section' }, [ + resolve_dns, + E('br'), E('br'), this.logArea, ]), E('div', { 'class': 'right' }, [ diff --git a/zapret/dwc.sh b/zapret/dwc.sh index eb29301..c61e183 100644 --- a/zapret/dwc.sh +++ b/zapret/dwc.sh @@ -1,10 +1,18 @@ #!/bin/sh # Copyright (c) 2026 remittor -. /opt/zapret/comfunc.sh - ZAP_TMP_DIR=/tmp/zapret_dwc +opt_dig= +opt_test= + +while getopts "d:t" opt; do + case $opt in + d) opt_dig="$OPTARG";; + t) opt_test="true";; + esac +done + rm -rf $ZAP_TMP_DIR CURL_TIMEOUT=5 @@ -27,6 +35,16 @@ if ! echo "$CURL_INFO" | grep -q 'https'; then return 11 fi +if [ "$opt_dig" != "" ]; then + if ! command -v dig >/dev/null 2>&1; then + echo "ERROR: package \"bind-dig\" not installed!" + return 12 + fi + [ "$opt_dig" = "@" ] && opt_dig='8.8.8.8' + [ "$opt_dig" = "8" ] && opt_dig='8.8.8.8' + [ "$opt_dig" = "1" ] && opt_dig='1.1.1.1' +fi + #echo 'Original sources: https://github.com/hyperion-cs/dpi-checkers' #echo 'WEB-version: https://hyperion-cs.github.io/dpi-checkers/ru/tcp-16-20/' @@ -102,21 +120,25 @@ while IFS='|' read -r ID TAG COUNTRY PROVIDER TIMES URL; do #echo "TAG=$TAG , COUNTRY=$COUNTRY , PROVIDER=$PROVIDER , DOMAIN=$DOMAIN , URL=$URL" FNAME="$ZAP_TMP_DIR/$ID3=$TAG=$PROVIDER" ( - DST_IP="???" - if [ "$DST_IP" = "" ]; then + DST_IP= + RESOLVE_OPT= + if [ "$opt_dig" != "" ]; then + DST_IP=$( dig +time=2 +retry=1 @$opt_dig +short "$DOMAIN" 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -n1 ) + else CURL_TIMEOUTS="--connect-timeout 5 --max-time 6 --speed-time 5 --speed-limit 1" - #DST_IP=$( curl -4 -I -s $CURL_TIMEOUTS -o /dev/null -w '%{remote_ip}\n' "$URL" ) + DST_IP=$( curl -4 -I -s $CURL_TIMEOUTS -o /dev/null -w '%{remote_ip}\n' "$URL" ) if [ -z "$DST_IP" ]; then DST_IP=$( curl -4 -s $CURL_TIMEOUTS -o /dev/null -r 0-0 -w '%{remote_ip}\n' "$URL" ) fi - if [ -z "$DST_IP" ]; then - DST_IP="$( ping -c1 "$DOMAIN" 2>/dev/null | sed -n '1s/.*(\([0-9.]*\)).*/\1/p')" - fi fi - echo "$URL" > "$FNAME.url" + if [ "$DST_IP" = "" ]; then + DST_IP=$( ping -c1 "$DOMAIN" 2>/dev/null | sed -n '1s/.*(\([0-9.]*\)).*/\1/p' ) + fi + [ "$DST_IP" != "" ] && RESOLVE_OPT="--resolve $DOMAIN:443:$DST_IP" echo "$DST_IP" > "$FNAME.ip" - RESOLVE_OPT="--resolve $DOMAIN:443:$DST_IP" + echo "$URL" > "$FNAME.url" curl "$URL" \ + $RESOLVE_OPT \ --connect-timeout $CURL_CON_TIMEOUT \ --max-time $CURL_TIMEOUT \ --speed-time $CURL_SPEED_TIME \ @@ -140,12 +162,10 @@ printf '%s\n' "$ZAP_TMP_DIR"/*.txt | sort | while IFS= read -r file; do FNAME="$ZAP_TMP_DIR/$FNAME" BODY_SIZE=0 [ -f "$FNAME.body" ] && BODY_SIZE=$( wc -c < "$FNAME.body" ) + IPADDR="x.x.x.x" + [ -s "$FNAME.ip" ] && IPADDR=$( cat "$FNAME.ip" ) status= - if [ ! -f "$FNAME.ip" ]; then - status="ERROR: cannot get IP-Addr" - elif [ ! -s "$FNAME.ip" ]; then - status="ERROR: cannot get ip-addr" - elif [ ! -f "$FNAME.hdr" ]; then + if [ ! -f "$FNAME.hdr" ]; then status="ERROR: cannot Get Headers" elif [ ! -s "$FNAME.hdr" ]; then status="ERROR: cannot get headers" @@ -160,7 +180,7 @@ printf '%s\n' "$ZAP_TMP_DIR"/*.txt | sort | while IFS= read -r file; do status="[ OK ]" fi fi - printf '%12s / %-13s: %s \n' "$TAG" "$PROVIDER" "$status" + printf '%12s / %-15s / %-13s: %s \n' "$TAG" "$IPADDR" "$PROVIDER" "$status" echo "$BODY_SIZE" > "$FNAME.size" done