之前写的一个自动查找,检验可用的×××_gate服务器.
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import re
import os
import imaplib
import email
import sys
import base64
import tempfile
import subprocess
import time
#-----------------------------------------------------------------------------
***_gate = []
mail_user = 'test@gmail.com'
mail_pass = '123123'
mail_ser = 'imap.gmail.com'
***_tmp_dir = "/tmp/***"
***_ser_config_dir = ***_tmp_dir + "/config"
***_ser_list = ***_ser_config_dir + "/***.list"
***_ser_wget = ***_tmp_dir + "/***_wget.tmp"
***_ser_old = "/etc/***gate/***_ser.list"
***_bad_ser = "/etc/***gate/bad_ser.list"
dns_gfw = ["118.5.49.6","128.121.126.139","159.106.121.75","169.132.13.103","188.5.4.96","189.163.17.5","192.67.198.6","197.4.4.12","202.106.1.2","202.181.7.85","203.161.230.171","203.98.7.65","207.12.88.98","208.56.31.43","209.145.54.50","209.220.30.174","209.36.73.33","209.85.229.138","211.94.66.147","213.169.251.35","216.221.188.182","216.234.179.13","23.89.5.60","243.185.187.39","249.129.46.48","253.157.14.165","37.61.54.158","4.36.66.178","46.82.174.68","49.2.123.56","54.76.135.1","59.24.3.173","64.33.88.161","64.33.99.47","64.66.163.251","65.104.202.252","65.160.219.113","66.45.252.237","72.14.205.104","72.14.205.99","74.125.127.102","74.125.155.102","74.125.39.102","74.125.39.113","77.4.7.92","78.16.49.15","8.7.198.45","93.46.8.89"]
#-----------------------------------------------------------------------------
def write_file(filename, content):
f = open(filename, 'w')
f.write(content)
f.close()
def getMail():
try:
imapServer = imaplib.IMAP4_SSL(mail_ser, 993)
imapServer.login(mail_user, mail_pass)
imapServer.select()
#Message statues = 'All,Unseen,Seen,Recent,Answered, Flagged'
resp, items = imapServer.search(None, "Unseen")
number = 1
website = ''
for i in items[0].split():
#get information of email
resp, mailData = imapServer.fetch(i, "(RFC822)")
mailText = mailData[0][1]
msg = email.message_from_string(mailText)
website = re.findall('http://[a-zA-Z0-9.:-]*/', str(msg))
if website == '':
continue
else:
break
return list(set(website))
imapServer.close()
imapServer.logout()
except:
print "MAIL SERVER ERROR"
return []
def check_wget(filename, filesize):
if not os.path.exists(filename):
return False
else:
if os.path.getsize(filename) != int(filesize):
os.system('rm -f %s' % filename)
return False
else:
return True
def get_***_list(filename, config_dir, host_list):
filea = open(filename,'r')
lines = filea.readlines()
hostname = {}
for i in lines:
if not str.startswith(i,'v'):
continue
try:
tmp = i.split(',')
result = base64.decodestring(tmp[-1])
result = result.replace('\r\n','\n')
if tmp[1] in bad_***_ser.keys():
continue
hostname[tmp[1]] = ''
write_file(config_dir + "/" + tmp[1] + ".o***", result)
except:
pass
return hostname
filea.close()
def del_tmp_exit():
#os.system('rm -f %s' % ***_ser_wget)
#os.system('rm -rf %s' % tmp_file)
sys.exit()
def check_***_old_ser(filename, content='', del_bad = False):
tmp = {}
if content == '': # read *** ser list
if os.path.getsize(filename) != 0:
f = open(filename,'r')
for i in f:
tmp[i.strip()] = ''
f.close()
return(tmp.keys())
else:
return []
else: # write *** ser list
if os.path.getsize(filename) != 0:
f = open(filename,'r')
for i in f:
tmp[i.strip()] = ''
f.close()
if del_bad:
if content in tmp:
del tmp[content.strip()]
else:
tmp[content.strip()] = ''
write_file(filename,"\n".join(tmp.keys()))
else:
write_file(filename,content.strip())
def check_***_status():
child = subprocess.Popen("ping -c 4 twitter.com", shell=True, stdout=subprocess.PIPE)
child.wait()
log = child.stdout.read()
if re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", log):
if re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", log)[0].strip() in dns_gfw:
return False
else:
if re.findall("\d%", log)[0].strip() == "0%":
return True
else:
return False
else: # can't ping dst
return False
def check_***_connect():
tun = subprocess.Popen("ip a | grep tun | wc -l", shell=True,stdout=subprocess.PIPE)
if int(tun.stdout.read()) == 0:
return False
else:
return True
def ***_connect(ip):
os.system('(open*** --client --config %s --route-noexec> /dev/null 2>&1 &)' % ip)
def status_check(ser): #, child):
time.sleep(11)
if check_***_connect():
print "××× Connect OK"
try:
subprocess.call(["/etc/init.d/nscd", "restart"])
except:
subprocess.call(["/etc/init.d/dns-clean", "restart"])
return check_***_status()
else:
return False
def ***_check_net():
child2 = subprocess.Popen("wget -T 5 -t 2 --spider https://twitter.com 2>&1 | grep Length", shell=True, stdout=subprocess.PIPE)
child2.wait()
if child2.stdout.read().strip() == '':
return True
else:
return False
def read_ini(filename):
tmp = {}
if os.path.exists(filename):
f = open(filename, 'r')
for i in f:
tmp[i.strip()] = ''
f.close()
else:
os.system('touch %s' % filename)
return tmp
def ***_check_line():
ping_child = subprocess.Popen('ping -c 4 twitter.com', shell=True, stdout=subprocess.PIPE)
ping_child.wait()
try:
ping_value = ping_child.stdout.read().split('\n')[-2].split('/')[-3]
print "Ping avg is %s" % ping_value
if float(ping_value) < 400:
return False
else:
return True
except:
return True
def ***_tun_ip():
tun = subprocess.Popen("ip r | grep tun | awk '{print $1}'", shell=True,stdout=subprocess.PIPE)
tun.wait()
return tun.stdout.read()
def ***_route(remote_ser):
os.system('route del 199.59.150.39')
os.system('route add %s gw 192.168.100.1' % remote_ser)
os.system('route add -net 0.0.0.0 gw %s' % remote_ser)
os.system('route add -net 128.0.0.0 gw %s' % remote_ser)
#-----------------------------------------------------------------------------
if os.getuid() != 0:
print "Please Run As Root!"
del_tmp_exit()
bad_***_ser = read_ini(***_bad_ser)
if not os.path.exists(***_ser_list):
os.system('rm -rf %s' % ***_tmp_dir)
else:
curr_ser = check_***_old_ser(***_ser_list)
if len(curr_ser) == 0:
os.system('rm -rf %s' % ***_tmp_dir)
if os.path.exists(***_tmp_dir):
for ser in curr_ser:
if ser.strip() in bad_***_ser.keys():
continue
print "Current Test SERVER %s" % ser.strip()
***_connect(***_ser_config_dir + "/" + ser.strip() + ".o***")
if status_check(ser.strip()): #, ***_child):
route_ip = ***_tun_ip()
os.system('route add 199.59.150.39 gw %s' % route_ip)
print "Current Useable Server %s" % ser.strip()
ok_times = 0
for j in range(1,11):
time.sleep(60)
if ***_check_net():
bad_***_ser[ser] = ''
os.system('rm -f %s' % ***_ser_config_dir + "/" + ser.strip() + ".o***")
break
if ***_check_line():
bad_***_ser[ser] = ''
os.system('rm -f %s' % ***_ser_config_dir + "/" + ser.strip() + ".o***")
break
ok_times += 1
print "wget twitter.com %s times OK" % j
if ok_times == 10:
***_route(route_ip)
break
else:
os.system('rm -f %s' % ***_ser_config_dir + "/" + ser.strip() + ".o***")
bad_***_ser[ser] = ''
os.system("for i in $(ps aux | grep %s | grep -v grep | awk '{print $2}'); do kill -9 $i; done" % ser.strip())
time.sleep(3)
if len(bad_***_ser) != 0:
new_list = list(set(curr_ser).difference(set(bad_***_ser.keys())))
write_file(***_bad_ser, "\n".join(bad_***_ser.keys()))
if len(curr_ser) == 0:
os.chdir('/tmp')
os.system('rm -rf %s' % ***_tmp_dir)
del_tmp_exit()
else:
write_file(***_ser_list, "\n".join(new_list))
del_tmp_exit()
else:
***_gate = getMail()
os.mkdir(***_tmp_dir)
os.chdir(***_tmp_dir)
os.mkdir(***_ser_config_dir)
if len(***_gate) == 0:
print "Can't Get ××× Mirror Site"
if not os.path.exists(***_ser_old):
os.system("mkdir /etc/***gate")
os.system("touch %s" % ***_ser_old)
del_tmp_exit()
if raw_input("Use Old Mirror Server? [y|n] ").lower().strip() == 'y':
***_gate = check_***_old_ser(***_ser_old)
if ***_gate == []:
print "Can't Get ××× Mirror Site And No Old Server"
del_tmp_exit()
else:
del_tmp_exit()
wget_ok = 0
for i in ***_gate:
# csv list htt://www.***gate.net/api/iphone/
if "***gate" in i:
continue
wget_file_size = os.popen("wget -T 5 -t 2 --spider %sapi/iphone/ 2>&1 | grep Length" % i).read()
if wget_file_size.strip() == '':
check_***_old_ser(***_ser_old, i, True)
continue
wget_file_size = wget_file_size.strip().split()[1]
if wget_ok == 1:
continue
else:
child = subprocess.Popen('wget -T 5 -t 2 -q %sapi/iphone/ -O %s' % (i, ***_ser_wget),shell=True)
child.wait()
if check_wget(***_ser_wget, wget_file_size):
print "Current Mirrors Useable Is %s" % i
check_***_old_ser(***_ser_old, i)
wget_ok == 1
if not os.path.exists(***_ser_wget):
print "Wget File ERROR!"
del_tmp_exit()
***_ser_list_tmp = get_***_list(***_ser_wget, ***_ser_config_dir, ***_ser_list)
for ser in ***_ser_list_tmp:
if ser.strip() in bad_***_ser.keys():
continue
print "Current Test SERVER %s" % ser.strip()
***_connect(***_ser_config_dir + "/" + ser.strip() + ".o***")
if status_check(ser.strip()): #, ***_child):
route_ip = ***_tun_ip()
os.system('route add 199.59.150.39 gw %s' % route_ip)
print "Current Useable Server %s" % ser.strip()
ok_times = 0
for j in range(1,11):
time.sleep(60)
if ***_check_net():
bad_***_ser[ser] = ''
os.system('rm -f %s' % ***_ser_config_dir + "/" + ser.strip() + ".o***")
break
if ***_check_line():
bad_***_ser[ser] = ''
os.system('rm -f %s' % ***_ser_config_dir + "/" + ser.strip() + ".o***")
break
ok_times += 1
print "wget twitter.com %s times OK" % j
if ok_times == 10:
***_route(route_ip)
break
else:
os.system('rm -f %s' % ***_ser_config_dir + "/" + ser.strip() + ".o***")
bad_***_ser[ser] = ''
os.system("for i in $(ps aux | grep %s | grep -v grep | awk '{print $2}'); do kill -9 $i; done" % ser.strip())
time.sleep(3)
if len(bad_***_ser) != 0:
for i in bad_***_ser:
if i in ***_ser_list_tmp:
del ***_ser_list_tmp[i]
write_file(***_bad_ser, "\n".join(bad_***_ser.keys()))
if len(***_ser_list) == 0:
os.chdir('/tmp')
os.system('rm -rf %s' % ***_tmp_dir)
else:
write_file(***_ser_list, "\n".join(***_ser_list_tmp.keys()))
print "××× TEST OK"
del_tmp_exit()
转载于:https://blog.51cto.com/abian/1606156