182 lines
4.1 KiB
Bash
Executable File
182 lines
4.1 KiB
Bash
Executable File
#!/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);
|
|
}}' |