diff --git a/package/ctcgfw/luci-app-autoipsetadder/Makefile b/package/ctcgfw/luci-app-autoipsetadder/Makefile new file mode 100644 index 0000000000..06ee48de1e --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/Makefile @@ -0,0 +1,64 @@ +# Copyright (C) 2018-2019 Lienol +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-autoipsetadder +PKG_VERSION:=1.0 +PKG_RELEASE:=6 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-autoipsetadder + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI Support for autoipsetadder + PKGARCH:=all + DEPENDS:= +coreutils-stdbuf +httping +curl +endef + +define Package/luci-app-autoipsetadder/description + LuCI support for autoipsetadder +endef + +define Build/Prepare +endef + +define Build/Compile +endef + +define Package/luci-app-autoipsetadder/conffiles +/etc/config/autoipsetadder +endef + +define Package/luci-app-autoipsetadder/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + cp -pR ./luasrc/* $(1)/usr/lib/lua/luci + $(INSTALL_DIR) $(1)/ + cp -pR ./root/* $(1)/ +endef + +define Package/luci-app-autoipsetadder/postinst +#!/bin/sh + /etc/init.d/autoipsetadder enable >/dev/null 2>&1 + /etc/init.d/autoipsetadder start + rm -f /tmp/luci-indexcache + rm -f /tmp/luci-modulecache/* +exit 0 +endef + +define Package/luci-app-autoipsetadder/prerm +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + /etc/init.d/autoipsetadder disable + /etc/init.d/autoipsetadder stop +fi +exit 0 +endef + +$(eval $(call BuildPackage,luci-app-autoipsetadder)) diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua b/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua new file mode 100644 index 0000000000..d14215327a --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua @@ -0,0 +1,46 @@ +module("luci.controller.autoipsetadder",package.seeall) +local io = require "io" +local fs=require"nixio.fs" +local sys=require"luci.sys" +local uci=require"luci.model.uci".cursor() +function index() + entry({"admin","services","autoipsetadder"},firstchild(),_("autoipsetadder"),30).dependent=true + entry({"admin","services","autoipsetadder","autoipsetadder"},cbi("autoipsetadder"),_("Base Setting"),1) + entry({"admin","services","autoipsetadder","status"},call("act_status")).leaf=true + entry({"admin", "services", "autoipsetadder", "getlog"}, call("get_log")) + entry({"admin", "services", "autoipsetadder", "dodellog"}, call("do_del_log")) + entry({"admin", "services", "autoipsetadder", "debugip"}, call("do_debug_ip")) +end + +function act_status() + local e={} + e.running=luci.sys.call("pgrep -f /usr/bin/autoipsetadder/autoaddlist.sh >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end +function do_del_log() +local logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log" +nixio.fs.writefile(logfile,"") +luci.http.prepare_content("application/json") +luci.http.write('') +end +function do_debug_ip() +luci.http.prepare_content("text/plain; charset=utf-8") +local a=sys.exec("/usr/bin/autoipsetadder/debugip.sh") +if (a=="") then +a="noproblem" +end +luci.http.write(a) +end +function get_log() + local logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log" + luci.http.prepare_content("text/plain; charset=utf-8") + local fdp=tonumber(fs.readfile("/var/run/lucilogpos_ipset")) or 0 + local f=io.open(logfile, "r+") + f:seek("set",fdp) + local a=f:read(2048000) or "" + fdp=f:seek() + fs.writefile("/var/run/lucilogpos_ipset",tostring(fdp)) + f:close() + luci.http.write(a) +end \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua b/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua new file mode 100644 index 0000000000..d9ec55504d --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua @@ -0,0 +1,97 @@ +require("luci.sys") +require("luci.util") +local fs=require"nixio.fs" +local uci=require"luci.model.uci".cursor() +local m,s,o +m = Map("autoipsetadder", translate("ipsetautoadder")) +m.description = translate("自动将联不通的域名加入ipset") +m:section(SimpleSection).template = "autoipsetadder/status" + +s = m:section(TypedSection, "autoipsetadder") +s.anonymous=true +s.addremove=false +---- enable +o = s:option(Flag, "enabled", translate("启用")) +o.default = 0 +o.rmempty = false +---- logview +o=s:option(TextValue, "show", "日志") +o.template = "autoipsetadder/check" +---- logpath +o = s:option(Value, "logfile", translate("Runtime log file")) +o.datatype = "string" +o.default="/tmp/addlist.log" +o.optional = false +o.validate=function(self, value) +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!log file is a dir" + else + m.message ="error!log file is a dir" + end + return nil +end +return value +end +---- dnsmasq log +o = s:option(Value, "dnslogfile", translate("dnsmasq log file")) +o.datatype = "string" +o.optional = false +o.default="/tmp/dnsmasq.log" +o.validate=function(self, value) +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!log file is a dir" + else + m.message ="error!log file is a dir" + end + return nil +end +return value +end +---- crontab +o = s:option(MultiValue, "crontab", translate("Crontab task"),translate("Please change time and args in crontab")) +o:value("autodeldnslog",translate("Auto del dnsmasq log")) +o:value("autotaillog",translate("Auto tail runtime log")) +o.widget = "checkbox" +o.default = "autodeldnslog autotaillog" +o.rmempty= true + +o = s:option(MultiValue, "config", translate("the way add to gfwlist")) +o:value("nochina",translate("no china ip")) +o:value("pingadd",translate("5ping loss1-4")) +o:value("packetpass",translate("packet >12 pass")) +o.widget = "checkbox" +o.default = "nochina pingadd packetpass" +o.rmempty=true +---- apply +nixio.fs.writefile("/var/run/lucilogpos_ipset","0") +function m.on_commit(map) + local ucitracktest=uci:get("autoipsetadder","autoipsetadder","ucitracktest") + if ucitracktest=="1" then + return + elseif ucitracktest=="0" then + io.popen("/etc/init.d/autoipsetadder reload &") + else + if (fs.access("/var/run/AdGucitest")) then + uci:set("autoipsetadder","autoipsetadder","ucitracktest","0") + io.popen("/etc/init.d/autoipsetadder reload &") + else + fs.writefile("/var/run/AdGucitest","") + if (ucitracktest=="2") then + uci:set("autoipsetadder","autoipsetadder","ucitracktest","1") + else + uci:set("autoipsetadder","autoipsetadder","ucitracktest","2") + end + end + uci:save("autoipsetadder") + uci:commit("autoipsetadder") + end +end +return m diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm new file mode 100644 index 0000000000..651d93d46f --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm @@ -0,0 +1,62 @@ +<%+cbi/valueheader%> +<%uci=require"luci.model.uci".cursor()%> +<%nixio=require"nixio"%> + +<%if uci:get("autoipsetadder","autoipsetadder","enabled")=="1" then%> + +<%:reverse%> + + + + + + + +<%end%> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm new file mode 100644 index 0000000000..b9f123d6f1 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
\ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder new file mode 100644 index 0000000000..5110d5260b --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder @@ -0,0 +1,2 @@ +config autoipsetadder 'autoipsetadder' + option enabled '0' diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder new file mode 100755 index 0000000000..d4c4ea4cc1 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder @@ -0,0 +1,125 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 + +START=99 +STOP=01 +CRON_FILE=/etc/crontabs/root +CONFIGURATION=autoipsetadder +EXTRA_COMMANDS="test_crontab" +EXTRA_HELP=" + test_crontab" +set_dnsmasq_log() +{ + sed -i '/log-facility/d' /etc/dnsmasq.conf + sed -i '/log-queries/d' /etc/dnsmasq.conf + uci set dhcp.@dnsmasq[0].logfacility='/tmp/dnsmasq.log' + uci delete dhcp.@dnsmasq[0].logqueries + echo log-queries >> /etc/dnsmasq.conf + uci commit dhcp + /etc/init.d/dnsmasq reload +} + +stop_dnsmasq_log() +{ + sed -i '/log-queries/d' /etc/dnsmasq.conf + uci delete dhcp.@dnsmasq[0].logfacility + uci commit dhcp + /etc/init.d/dnsmasq reload +} + +reload_service() +{ + rm -f /var/run/AdGucitest 2>/dev/null + procd_kill $CONFIGURATION + kill $(cat /var/run/autoipsetadder.pid) + start +} + +start_service() { + # Reading config + config_load "${CONFIGURATION}" + mkdir -p /tmp/run/autoipsetadder + local enabled + config_get_bool enabled $CONFIGURATION enabled 0 + do_crontab + if [ "$enabled" == "1" ]; then + set_dnsmasq_log + procd_open_instance + procd_set_param respawn + # pass config to script on start + procd_set_param command sh /usr/bin/autoipsetadder/autoaddlist.sh + procd_close_instance + echo "autoipsetadder turn on" + echo "enabled=$enabled" + else + stop_dnsmasq_log + echo "autoipsetadder turn off" + echo "enabled=$enabled" + fi +} + +stop_service() +{ + config_load "${CONFIGURATION}" + stop_dnsmasq_log + do_crontab + kill $(cat /var/run/autoipsetadder.pid) + echo "autoipsetadder turn off" + echo "enabled="$enabled"" +} +do_crontab(){ + config_get_bool enabled $CONFIGURATION enabled 0 + config_get logfile $CONFIGURATION logfile "/tmp/addlist.log" + config_get dnslogfile $CONFIGURATION dnslogfile "/tmp/dnsmasq.log" + config_get crontab $CONFIGURATION crontab "" + cronreload=0 + findstr="echo qingkong > $dnslogfile" + default="0 * * * * echo qingkong > $dnslogfile" + [ -n "$lastdnslogfile" ] && findstr="echo qingkong > $lastdnslogfile" && [ "$lastdnslogfile" != "$dnslogfile" ] && replace="${lastdnslogfile//\//\\/}/${dnslogfile//\//\\/}" + [ "$enabled" == "0" ] || [ "${crontab//autodeldnslog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + [ "$lastdnslogfile" != "$dnslogfile" ] && uci set autoipsetadder.autoipsetadder.lastdnslogfile="$dnslogfile" && commit=1 + + findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* $logfile" + default="0 0 * * * /usr/bin/autoipsetadder/tailto.sh 2000 $logfile" + [ -n "$lastlogfile" ] && findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* $lastlogfile" && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}" + [ "$enabled" == "0" ] || [ "${crontab//autotaillog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set autoipsetadder.autoipsetadder.lastlogfile="$logfile" && commit=1 + + [ "$cronreload" -gt 0 ] && /etc/init.d/cron restart + [ "$commit" -gt 0 ] && uci commit autoipsetadder +} +crontab_editor(){ + local testline reload + local line="$(grep "$findstr" $CRON_FILE)" + [ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace="" + if [ "${line:0:1}" != "#" ]; then + if [ $cronenable -eq 1 ]; then + [ -z "$line" ] && line="$default" && reload="1" + if [ -n "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + elif [ -n "$line" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "#$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + else + if [ $cronenable -eq 1 ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "${line:1}" >> $CRON_FILE + cronreload=$((cronreload+1)) + elif [ -z "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + fi + fi +} +test_crontab(){ +config_load "${CONFIGURATION}" +do_crontab +} diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder new file mode 100755 index 0000000000..d1a8ee4577 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@autoipsetadder[-1] + add ucitrack autoipsetadder + set ucitrack.@autoipsetadder[-1].init=autoipsetadder + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh new file mode 100755 index 0000000000..0fddc1d44a --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh @@ -0,0 +1,164 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +logfile=$(uci get autoipsetadder.autoipsetadder.logfile) +[ -z "$logfile" ] && logfile="/tmp/addlist.log" +dnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile) +[ -z "$logfile" ] && dnslogfile="/tmp/dnsmasq.log" +config=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null) +[ "${config//nochina/}" == "$config" ] && nochina="0" || nochina="1" +[ "${config//packetpass/}" == "$config" ] && packetpass="0" || packetpass="1" +( stdbuf -oL tail -F $dnslogfile & echo $! >/var/run/autoipsetadder.pid ) | awk -v nochina="$nochina" -v packetpass="$packetpass" -F "[, ]+" '/reply/{ +ip=$8; +if (ip=="" || ip=="127.0.0.1"|| ip=="0.0.0.0") +{ +next; +} +if (index(ip,"")!=0) +{ +if (cname==1) +{ + next; +} +cname=1; +domain=$6; +#第一次cname时锁定域名,防止解析cname对其改动 +next; +} +#以上获得上行是否为cname,本行不是cname执行以下内容 +#lastdomain记录上次非cname的域名,与本次域名对比 +if(lastdomain!=$6){ + for (ipindex in ipcache) + { + delete ipcache[ipindex]; + } + ipcount=0; + createpid=1; +#上行非cname,并且不是同cname解析域名的多个ip,更新域名,清理同域名免试flag +if (cname!=1) +{ + domain=$6; + testall=0; +}} +ipcount++; +cname=0; +lastdomain=$6 +#去除非ipv4 +if (index(ip,".")==0) +{ + next; +} +#不重复探测ip +if (!(ip in a)) +{ +#包数>12的同域名放过 +if (passdomain==domain) +{ + print(ip" "domain" pass by same domain ok"); + a[ip]=domain; + next; +} +if (nochina==1){ +"ipset test china "ip" 2>&1"| getline ipset; +close("ipset test china "ip" 2>&1"); +if (index(ipset,"Warning")!=0){ + print("china "ip" pass"); + a[ip]=domain; + next; +}} +"ipset test gfwlist "ip" 2>&1"| getline ipset; +close("ipset test gfwlist "ip" 2>&1"); +if (index(ipset,"Warning")!=0){ + print("gfwlist "ip" pass"); + a[ip]=domain; + next; + } + +#ip压入缓存,用于未检测到443/80的缓存 +ipcache[ipcount]=ip; +if (testall==0){ + tryhttps=0; + tryhttp=0; + #探测 nf_conntrack 的443/80 + while ("grep "ip" /proc/net/nf_conntrack"| getline ret > 0) + { + split(ret, b," +"); + split(b[11], pagnum,"="); + #包数>12的放过 + if (packetpass==1 && pagnum[2]>12) + { + print("pass by packets="pagnum[2]" "ip" "domain); + for (ipindex in ipcache) + { + a[ipcache[ipindex]]=domain; + delete ipcache[ipindex]; + } + passdomain=domain; + close("grep "ip" /proc/net/nf_conntrack"); + ipcount--; + next; + } + if (b[8]=="dst="ip) + { + if (b[10]=="dport=443"){ + tryhttps=1; + break; + } + else if (b[10]=="dport=80"){ + tryhttp=1; + } + } + } + close("grep "ip" /proc/net/nf_conntrack"); +}else{ + if (testall==443) + { + tryhttps=1 + }else{ + tryhttp=1 + } +} +if (tryhttps==1) +{ if (createpid==1) + { + print "">"/tmp/run/autoipsetadder/"domain + close("/tmp/run/autoipsetadder/"domain); + print("create"domain); + print(ip" "domain" 443"ipcount-1); + a[ip]=domain; + #正在使用的ip用最大延迟,最后探测,减少打断tcp的可能 + system("/usr/bin/autoipsetadder/testip.sh "ip" "domain" 443 "ipcount-1" &"); + delete ipcache[ipcount]; + createpid=0; + } + #未检测到443/80同域名缓存的ip进行测试,ipindex-1为测试延迟时间 + for (ipindex in ipcache){ + print(ipcache[ipindex]" "domain" 443 "ipindex-1); + a[ipcache[ipindex]]=domain; + system("/usr/bin/autoipsetadder/testip.sh "ipcache[ipindex]" "domain" 443 "ipindex-1" &"); + delete ipcache[ipindex]; + } + #后续同域名ip免nf_conntrack测试 + testall=443; +} +else if (tryhttp==1) +{ + if (createpid==1) + { + print "">"/tmp/run/autoipsetadder/"domain + close("/tmp/run/autoipsetadder/"domain); + print("create"domain); + print(ip" "domain" 80 "ipcount-1); + a[ip]=domain; + system("/usr/bin/autoipsetadder/testip.sh "ip" "domain" 80 "ipcount-1" &"); + delete ipcache[ipcount]; + createpid=0; + } + for (ipindex in ipcache){ + print(ipcache[ipindex]" "domain" 80 "ipindex-1); + a[ipcache[ipindex]]=domain; + system("/usr/bin/autoipsetadder/testip.sh "ipcache[ipindex]" "domain" 80 "ipindex-1" &"); + delete ipcache[ipindex]; + } + testall=80; +}} +}' >> $logfile \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh new file mode 100755 index 0000000000..177ef65740 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh @@ -0,0 +1,56 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +dlchina=$1; +logfile=$(uci get autoipsetadder.autoipsetadder.logfile) +[ -z "$logfile" ] && logfile="/tmp/addlist.log" + +dnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile) +[ -z "$logfile" ] && dnslogfile="/tmp/dnsmasq.log" + + +ipset list gfwlist | awk -v dlchina="$dlchina" -v dnslogfile="$dnslogfile" -v logfile="$logfile" '{ +if (index($0,".")==0) +{ + next; +} +if ($0=="127.0.0.1") {system("ipset d gfwlist 127.0.0.1");next;} +"ipset test whitelist "$0" 2>&1"| getline ipset; +close("ipset test whitelist "$0" 2>&1"); + if (index(ipset,"Warning")==0){ + white=0; + }else{ + white=1; + } + "ipset test china "$0" 2>&1"| getline ipset; + close("ipset test china "$0" 2>&1"); + if (index(ipset,"Warning")!=0){ + china=1; + } + else{ + china=0; + } + if (white==1) + { + if (china==0) + { + print("warning white ip not china"$0); + ret=system("grep "$0" "logfile); + if (ret!=0) + { + ret=system("grep "$0" "dnslogfile); + } + } + }else if (china==1) + { + print("warning china ip not white"$0); + ret=system("grep "$0" "logfile) + if (ret!=0) + { + ret=system("grep "$0" "dnslogfile); + } + if (dlchina) + { + system("ipset del gfwlist "$0); + } + } +}' \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh new file mode 100755 index 0000000000..ab70e3a6ef --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh @@ -0,0 +1,4 @@ +#!/bin/sh +tail -n $1 "$2" > /var/run/tailtmp +cat /var/run/tailtmp > "$2" +rm /var/run/tailtmp \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh new file mode 100755 index 0000000000..dcdda2ddd1 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh @@ -0,0 +1,182 @@ +#!/bin/sh +config=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null) +[ "${config//pingadd/}" == "$config" ] && pingadd="0" || pingadd="1" +echo $* | awk -v pingadd="$pingadd" '{ +if ($4=="") +{ +wait=0; +}else +{wait=$4;} +system("sleep "wait); +ERRNO=""; +pidfile="/tmp/run/autoipsetadder/"$2 +getline drop< pidfile; +close(pidfile); +if (ERRNO) { +addlist=0; +print("bypass"$1" "$2); +next;} +if ($3=="443") +{ +cmd=("httping -c 1 -t 4 -l "$2" --divert-connect "$1); +} +else if ($3=="80") +{ +cmd=("httping -c 1 -t 4 "$2" --divert-connect "$1); +} +addlist=0; +slow=0; +while ((cmd | getline ret) > 0) +{ + if (addlist!=0) + { + continue; + } + else if (index(ret,"short read")!=0) + { + if (system("httping -q -c 1 -t 4 -l "$2" --divert-connect "$1)==0) + { + addlist=-1; + break; + }else{ + print("doname rst autoaddip "$1" "$2); + addlist=1; + } + } + else if (index(ret,"timeout")!=0) + { + while ((cmd | getline ret) > 0) + { + if (index(ret,"timeout")!=0) + { + print("direct so slow autoaddip "$1" "$2); + addlist=1; + slow=1; + } + } + }else if (index(ret,"SSL handshake error: (null)")!=0) + { + if(system("curl -m 10 --resolve "$2":443:"$1" https://"$2" -o /dev/null 2>/dev/null")==0){ + addlist=-1; + break; + } + }else if (index(ret,"Connection refused")!=0){ + print("direct Connection refused autoaddip"$1" "$2); + addlist=1; + } +} +close(cmd); + +if (addlist!=1) +{ + if (addlist==0){ + split(ret, c,"[ /]+"); + print(c[6]); + if (c[6]=="failed,"){ + print("can not connect autoaddip "$1" "$2); + addlist=1; + } + else if (c[6]+0>10000) + { + print("direct ssl so slow autoaddip "$1" "$2); + addlist=1; + }else{ + addlist=-1;} + } + if (addlist==-1 && pingadd==1) + { + while (("ping -c 5 -q -A "$1 | getline ret) > 0) + { + if (index(ret,"packet loss")!=0) + { + split(ret, p,"[ ]+"); + if (p[4]>0 && p[4]<5) + { + print("ping packet loss autoaddip "$1" "$2); + pingloss=1; + addlist=1; + }else{pingloss=0;} + break; + } + } + close("ping -c 5 -q "$1); + } +} +ERRNO=""; +if (pingloss!=1){ + getline drop< pidfile; + close(pidfile); +} +if (ERRNO) {addlist=0;next;} +if (addlist==1){ +system("ipset add gfwlist "$1); +while ((cmd | getline ret) > 0) +{ + if (addlist==1) + { + if (index(ret,"short read")!=0) + { + system("ipset del gfwlist "$1); + print("doname proxy rst autodelip "$1" "$2); + addlist=-2; + } + else if (index(ret,"SSL handshake error: (null)")!=0) + { + if(system("curl -m 10 --resolve "$2":443:"$1" https://"$2" -o /dev/null 2>/dev/null")==0) + { + addlist=2; + } + } + } +} +close(cmd); +if (addlist==1){ + split(ret, c,"[ /]+"); + print(c[6]); + if (c[6]=="failed,") + { + system("ipset del gfwlist "$1); + print("proxy can not connect autodelip "$1" "$2); + addlist=-2; + }else{ + addlist=2; + } +} +} +}END{ +if (addlist==2) +{ if (pingloss==0){ + ERRNO=""; + getline drop< pidfile; + if (ERRNO) { + system("ipset del gfwlist "$1); + print("cancel add myself "$1" "$2" due to one ip success direct"); + }else{ + print $1"\n">>pidfile; + } + close(pidfile);} +}else if (addlist==-1) +{ + print($1" "$2" direct success"); + while ((getline ret< pidfile) > 0) + { + if (ret!=""){ + system("ipset del gfwlist "ret); + print("cancel add someone "ret" "$2" due to me"$1" success direct"); + } + } + close(pidfile); + system("rm "pidfile" 2>/dev/null"); + print($1" del "$2); +}else if (addlist==-2) +{ + system("sleep 10"); + while ((getline ret< pidfile) > 0) + { + if (ret!=""){ + system("ipset add gfwlist "$1); + print("add "ret" "$2" due to one ip success proxy"); + break;} + } + close(pidfile); +}}' \ No newline at end of file