增加自动选择name server功能

This commit is contained in:
JrD
2020-09-17 18:08:09 +08:00
parent a9828f265b
commit 171757de64
4 changed files with 132 additions and 11086 deletions
+101 -8
View File
@@ -1,23 +1,24 @@
import json import json
import os import os
import platform
import random
import re import re
import string
import subprocess
import sys import sys
import time import time
import string
import random
import platform
import subprocess
from ipaddress import IPv4Address, ip_address from ipaddress import IPv4Address, ip_address
from pathlib import Path
from stat import S_IXUSR from stat import S_IXUSR
import tenacity import dns
import requests import requests
from pathlib import Path import tenacity
from common.records import Record, RecordCollection
from dns.resolver import Resolver from dns.resolver import Resolver
from common.domain import Domain
from common.database import Database from common.database import Database
from common.domain import Domain
from common.records import Record, RecordCollection
from config import settings from config import settings
from config.log import logger from config.log import logger
@@ -728,3 +729,95 @@ def decode_resp_text(resp):
def sort_by_subdomain(data): def sort_by_subdomain(data):
return sorted(data, key=lambda item: item.get('subdomain')) return sorted(data, key=lambda item: item.get('subdomain'))
def ping(host, path):
"""
:param host:
:param path:
:return:
"""
param = '-n' if platform.system().lower() == 'windows' else '-c'
command = ['ping', param, '3', host]
with open(path, "w") as f:
return subprocess.call(command, stdout=f, stderr=f)
def ping_avg_time(nameserver):
"""
:param nameserver:
:return:
"""
temp_path = settings.temp_save_dir.joinpath('ping')
ping(nameserver, path=temp_path)
with open(temp_path, 'r')as f:
text = f.readlines()[-1]
if '100.0% packet loss' in text:
logger.log('ALERT', f'100.0% packet loss, ping {nameserver} failed.')
return None
elif 'round-trip' in text:
avg_time = re.findall(r'\d+\.\d+', text)[1]
logger.log('INFOR', f'ping {nameserver} average time {avg_time} ms.')
return avg_time
else:
logger.log('ALERT', f'{text}')
return None
def auto_select_nameserver():
""""""
logger.log('INFOR', f'Ping test start, to select nameservers.')
avg_time1 = ping_avg_time('114.114.114.114')
avg_time2 = ping_avg_time('8.8.8.8')
if avg_time1 and avg_time2:
if avg_time1 < avg_time2:
change_nameservers_file('cn')
logger.log('INFOR', f'Ping test finished, use cn nameservers.')
else:
change_nameservers_file('common')
logger.log('INFOR', f'Ping test finished, use common nameservers.')
elif avg_time1 and not avg_time2:
change_nameservers_file('cn')
logger.log('INFOR', f'Ping test finished, use cn nameservers.')
elif not avg_time1 and avg_time1:
change_nameservers_file('common')
logger.log('INFOR', f'Ping test finished, use common nameservers.')
elif not avg_time1 and not avg_time1:
change_nameservers_file('default')
logger.log('INFOR', f'Ping test finished, use default nameservers.')
return
def change_nameservers_file(option):
text = ''
if option == 'cn':
with open(settings.data_storage_dir.joinpath('cn_nameservers.txt'), 'r') as f:
text = f.read()
elif option == 'common':
with open(settings.data_storage_dir.joinpath('common_nameservers.txt'), 'r') as f:
text = f.read()
elif option == 'default':
for n in default_nameserver():
text = '\n'.join(n)
with open(settings.data_storage_dir.joinpath('nameservers.txt'), 'w') as f:
f.write(text)
return
def default_nameserver():
"""
:return: system default nameservers
"""
try:
dns_resolver: Resolver = dns.resolver.Resolver()
return dns_resolver.nameservers
except dns.resolver.NoResolverConfiguration:
logger.log('ERROR', 'Resolver configuration could not be read or specified no nameservers.')
exit(0)
auto_select_nameserver()
+30
View File
@@ -0,0 +1,30 @@
8.8.8.8
8.8.4.4
9.9.9.9
9.9.9.10
149.112.112.112
4.2.2.1
4.2.2.2
4.2.2.3
4.2.2.4
4.2.2.5
4.2.2.6
1.1.1.1
1.0.0.1
1.0.0.2
1.0.0.3
1.0.0.19
208.67.222.222
208.67.220.220
8.26.56.26
8.20.247.20
84.200.69.80
84.200.70.40
185.228.168.9
185.228.169.9
64.6.64.6
64.6.65.6
198.101.242.72
23.253.163.53
176.103.130.130
176.103.130.131
-11078
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -264,6 +264,7 @@ class OneForAll(object):
dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S') dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f'[*] Starting OneForAll @ {dt}\n') print(f'[*] Starting OneForAll @ {dt}\n')
utils.check_env() utils.check_env()
utils.auto_select_nameserver()
if settings.enable_check_version: if settings.enable_check_version:
utils.check_version(version) utils.check_version(version)
logger.log('DEBUG', 'Python ' + utils.python_version()) logger.log('DEBUG', 'Python ' + utils.python_version())