From 413076cf264093617e577ba7468e8e1c770c3f08 Mon Sep 17 00:00:00 2001 From: duc_tin Date: Wed, 11 Nov 2015 16:07:04 +0900 Subject: [PATCH] improve stability, allow filter for multi ports --- config.py | 252 ++++++++++++++++++++++++----------------------- ui_elements.py | 29 ++++-- vpn_indicator.py | 3 +- vpnproxy_cli.py | 90 ++++++++++------- vpnproxy_tui.py | 149 +++++++++++++++------------- 5 files changed, 289 insertions(+), 234 deletions(-) diff --git a/config.py b/config.py index 4e9bd86..8b709c8 100644 --- a/config.py +++ b/config.py @@ -3,7 +3,7 @@ __author__ = "duc_tin" __copyright__ = "Copyright 2015+, duc_tin" __license__ = "GPLv2" -__version__ = "1.0" +__version__ = "1.25" __maintainer__ = "duc_tin" __email__ = "nguyenbaduc.tin@gmail.com" @@ -11,6 +11,7 @@ import re import sys import socket +from collections import OrderedDict def ctext(text, color): @@ -35,127 +36,136 @@ def ctext(text, color): return tformat + text + ENDC -def get_input(config_path, option): - if option[0] in ['c', 'config']: - proxy, port, ip, sort_by, use_proxy, s_country, s_port, fix_dns, dns, verbose = read_config(config_path) - - while 1: - print ctext('\n Current settings:', 'B') - print ctext(' 1. Proxy address:', 'yB'), proxy, ctext('\t2. port: ', 'yB'), port - print ctext(' 3. Use proxy:', 'yB'), use_proxy - print ctext(' 4. Sort servers by:', 'yB'), sort_by - print ctext(' 5. Country filter:', 'yB'), s_country, ctext('\t\t6. VPN server\'s port: ', 'yB'), s_port - print ctext(' 7. Fix dns leaking:', 'yB'), fix_dns - print ctext(' 8. DNS list: ', 'yB'), dns - print ctext(' 9. Show openvpn log:', 'B'), verbose - - user_input = raw_input('\nCommand or Enter to fetch server list: ') - if user_input == '': - print 'Process to vpn server list' - write_config(config_path, proxy, port, ip, sort_by, use_proxy, s_country, s_port, fix_dns, dns, verbose) - return - elif user_input == '1': - proxy = raw_input('Your http_proxy:') - ip = socket.gethostbyname(proxy) - elif user_input == '2': - user_input = 'abc' - while not user_input.strip().isdigit(): - user_input = raw_input('Http proxy\'s port (eg: 8080): ') - port = user_input - - elif user_input == '3': - while user_input.lower() not in ['y', 'n', 'yes', 'no']: - user_input = raw_input('Use proxy to connect to vpn? (yes|no): ') - else: - use_proxy = 'no' if user_input in 'no' else 'yes' - - elif user_input == '4': - while user_input not in ['speed', 'ping', 'score', 'up time', 'uptime']: - user_input = raw_input('Sort servers by (speed | ping | score | up time): ') - sort_by = 'up time' if user_input == 'uptime' else user_input - - elif user_input == '5': - while not re.match('^[a-z ]*$', user_input.lower().strip()): - user_input = raw_input('Country\'s name (eg: all(default), jp, japan):') - else: - s_country = 'all' if not user_input else user_input.lower() - - elif user_input == '6': - user_input = 'abc' - while not user_input.strip().isdigit(): - user_input = raw_input('VPN server\'s port (eg: 995): ') - if not user_input or 'all' == user_input: break - s_port = user_input if user_input else 'all' - - elif user_input == '7': - while user_input.lower() not in ['y', 'n', 'yes', 'no']: - user_input = raw_input('Fix DNS:') - else: - fix_dns = 'no' if user_input in 'no' else 'yes' - - elif user_input == '8': - print 'Default DNS are 8.8.8.8, 84.200.69.80, 208.67.222.222' - user_input='@' - while not re.match('[a-zA-Z0-9., ]*$', user_input.strip()): - user_input = raw_input('DNS server(s) with "," separated or Enter to use default:') - if user_input: - dns = user_input.replace(' ', '').split(',') - else: - dns = '8.8.8.8, 84.200.69.80, 208.67.222.222' - - elif user_input == '9': - while user_input.lower() not in ['y', 'n', 'yes', 'no']: - user_input = raw_input('Use proxy to connect to vpn? (yes|no): ') - else: - verbose = 'no' if user_input in 'no' else 'yes' - - elif user_input in ['q', 'quit', 'exit']: - print ctext('Goodbye'.center(40), 'gB') - sys.exit(0) - else: - print 'Invalid input' +def get_input(s, option): + """ + :type s: Setting + """ - else: + if option[0] not in ['c', 'config']: print 'Wrong argument. Do you mean "config" or "restore" ?' + return + + while 1: + proxy, port, ip, sort_by, use_proxy, s_country, s_port, fix_dns, dns, verbose = s[:] + print ctext('\n Current settings:', 'B') + print ctext(' 1. Proxy address:', 'yB'), proxy, ctext('\t2. port: ', 'yB'), port + print ctext(' 3. Use proxy:', 'yB'), use_proxy + print ctext(' 4. Sort servers by:', 'yB'), sort_by + print ctext(' 5. Country filter:', 'yB'), s_country, ctext('\t\t6. VPN server\'s port: ', 'yB'), s_port + print ctext(' 7. Fix dns leaking:', 'yB'), fix_dns + print ctext(' 8. DNS list: ', 'yB'), dns + print ctext(' 9. Show openvpn log:', 'B'), verbose + + user_input = raw_input('\nCommand or Enter to fetch server list: ') + if user_input == '': + print 'Process to vpn server list' + s.write() + return + elif user_input == '1': + s.proxy['address'] = raw_input('Your http_proxy:') + s.proxy['ip'] = socket.gethostbyname(proxy) + elif user_input == '2': + user_input = 'abc' + while not user_input.strip().isdigit(): + user_input = raw_input('Http proxy\'s port (eg: 8080): ') + s.proxy['port'] = user_input + + elif user_input == '3': + while user_input.lower() not in ['y', 'n', 'yes', 'no']: + user_input = raw_input('Use proxy to connect to vpn? (yes|no): ') + else: + s.proxy['use proxy'] = 'no' if user_input in 'no' else 'yes' + + elif user_input == '4': + while user_input not in ['speed', 'ping', 'score', 'up time', 'uptime']: + user_input = raw_input('Sort servers by (speed | ping | score | up time): ') + s.sort['key'] = 'up time' if user_input == 'uptime' else user_input + + elif user_input == '5': + while not re.match('^[a-z ]*$', user_input.lower().strip()): + user_input = raw_input('Country\'s name (eg: all(default), jp, japan):') + else: + s.filter['country'] = 'all' if not user_input else user_input.lower() + + elif user_input == '6': + user_input = 'abc' + while not user_input.strip().isdigit(): + user_input = raw_input('VPN server\'s port (eg: 995): ') + if not user_input or 'all' == user_input: break + s.filter['port'] = user_input if user_input else 'all' + + elif user_input == '7': + while user_input.lower() not in ['y', 'n', 'yes', 'no']: + user_input = raw_input('Fix DNS:') + else: + s.dns['fix_dns'] = 'no' if user_input in 'no' else 'yes' + + elif user_input == '8': + print 'Default DNS are 8.8.8.8, 84.200.69.80, 208.67.222.222' + user_input = '@' + while not re.match('[a-zA-Z0-9., ]*$', user_input.strip()): + user_input = raw_input('DNS server(s) with "," separated or Enter to use default:') + if user_input: + s.dns['dns'] = user_input.replace(' ', '').split(',') + else: + s.dns['dns'] = '8.8.8.8, 84.200.69.80, 208.67.222.222' + + elif user_input == '9': + while user_input.lower() not in ['y', 'n', 'yes', 'no']: + user_input = raw_input('Show openvpn log: ') + else: + s.openvpn['verbose'] = 'no' if user_input in 'no' else 'yes' + + elif user_input in ['q', 'quit', 'exit']: + print ctext('Goodbye'.center(40), 'gB') + sys.exit(0) + else: + print 'Invalid input' + + +class Setting: + def __init__(self, path): + self.path = path + self.parser = ConfigParser.SafeConfigParser() + + self.proxy = OrderedDict([('use proxy', 'no'), ('address', ''), + ('port', ''), + ('ip', '')]) + + self.sort = {'key': 'score'} + + self.filter = OrderedDict([('country', 'all'), ('port', 'all')]) + + self.dns = OrderedDict([('fix_dns', 'yes'), ('dns', '8.8.8.8')]) + + self.openvpn = {'verbose': 'yes'} + + self.sections = OrderedDict([('proxy', self.proxy), + ('sort', self.sort), + ('country_filter', self.filter), + ('DNS_leak', self.dns), + ('openvpn', self.openvpn)]) + + def __getitem__(self, index): + data = [] + for sec in self.sections.values(): + data += sec.values() + + return data[index] + + def write(self): + for sect in self.sections: + if not self.parser.has_section(sect): + self.parser.add_section(sect) + for content in self.sections[sect]: + self.parser.set(sect, content, self.sections[sect][content]) + + with open(self.path, 'w+') as configfile: + self.parser.write(configfile) + def load(self): + self.parser.read(self.path) -def read_config(config_path): - parser = ConfigParser.SafeConfigParser() - parser.read(config_path) - use_proxy = parser.get('proxy', 'use proxy') - proxy = parser.get('proxy', 'address') - port = parser.get('proxy', 'port') - ip = parser.get('proxy', 'ip') - sort_by = parser.get('sort', 'key') - s_country = parser.get('country_filter', 'country') - s_port = parser.get('country_filter', 'port') - fix_dns = parser.get('DNS_leak', 'fix_dns') - dns = parser.get('DNS_leak', 'dns') - verbose = parser.get('openvpn', 'verbose') - return proxy, port, ip, sort_by, use_proxy, s_country, s_port, fix_dns, dns, verbose - - -def write_config(config_path, proxy, port, ip, parameter, use_proxy, s_country, s_port, fix_dns, dns, verbose='no'): - parser = ConfigParser.SafeConfigParser() - parser.add_section('proxy') - parser.set('proxy', 'use proxy', use_proxy) - parser.set('proxy', 'address', proxy) - parser.set('proxy', 'port', port) - parser.set('proxy', 'ip', ip) - - parser.add_section('sort') - parser.set('sort', 'key', parameter) - - parser.add_section('country_filter') - parser.set('country_filter', 'country', s_country) - parser.set('country_filter', 'port', s_port) - - parser.add_section('DNS_leak') - parser.set('DNS_leak', 'fix_dns', fix_dns) - parser.set('DNS_leak', 'dns', dns) - - parser.add_section('openvpn') - parser.set('openvpn', 'verbose', verbose) - - with open(config_path, 'w+') as configfile: - parser.write(configfile) \ No newline at end of file + for sect in self.sections: + for content in self.sections[sect]: + self.sections[sect][content] = self.parser.get(sect, content) diff --git a/ui_elements.py b/ui_elements.py index 9f764c2..7bfd08f 100644 --- a/ui_elements.py +++ b/ui_elements.py @@ -3,11 +3,12 @@ __author__ = "duc_tin" __copyright__ = "Copyright 2015+, duc_tin" __license__ = "GPLv2" -__version__ = "1.1" +__version__ = "1.25" __maintainer__ = "duc_tin" __email__ = "nguyenbaduc.tin@gmail.com" import urwid +import re # -----------------------------------------------here we go------------------------------------------------------------- @@ -111,8 +112,7 @@ def __init__(self, key=None, value=''): self.trigger = key info = urwid.Text("'ESC' to clear, leave blank or 'all' for all country and port", 'center') self.country = urwid.Edit(('attention', u' \N{BULLET} Country: '), edit_text=value[0], wrap='clip') - self.port = urwid.IntEdit(('attention', u' \N{BULLET} Port : '), default=value[1]) - self.port.set_wrap_mode('clip') + self.port = urwid.Edit(('attention', u' \N{BULLET} Port : '), edit_text=value[1], wrap='clip') exit_but = urwid.Padding(urwid.Button('OKay'.center(8), self.item_callback), 'center', 12) filter_ = [urwid.AttrMap(wid, None, 'popbgs') for wid in (self.country, self.port, exit_but)] @@ -132,11 +132,19 @@ def item_callback(self, Button, data=None): self.port.set_edit_text('all') port = 'all' self._emit("close") - elif port != 'all' and not 0 <= int(port) <= 65535: + + elif port != 'all' and not set(port) <= set(' 0123456789'): self.port.set_edit_text('Invalid number!') + return else: - self.chosen = country, port - self._emit("close") + for p in re.findall(r'\d+', port): + if p == 'Invalid number!': return + if p != 'all' and not 0 <= int(p) <= 65535: + self.port.set_edit_text('Invalid number!') + return + + self.chosen = country, port + self._emit("close") def keypress(self, size, key): position = self.pile.focus_position @@ -190,10 +198,15 @@ def item_callback(self, Button, data=None): port = self.input_port.edit_text addr = self.input_addr.edit_text.replace('http://', '') if self.yn == 'yes': + if not addr: + addr = 'Invalid Address!' + self.input_addr.set_edit_text('Invalid Address!') + if not port: + port = 'Invalid number!' + self.input_port.set_edit_text('Invalid number!') if 'Invalid' in addr + port: return - if not addr or not port: - self.input_addr.set_edit_text('Invalid Address!') + if not 0 <= int(port) <= 65535: self.input_port.set_edit_text('Invalid number!') else: diff --git a/vpn_indicator.py b/vpn_indicator.py index e23ce43..23a1002 100755 --- a/vpn_indicator.py +++ b/vpn_indicator.py @@ -154,8 +154,7 @@ def run(self, *args): def reload(self, data_in): if data_in: - if len(data_in) < 25: - print data_in + print data_in[:12] self.last_recv = data_in.split(';') if 'connected' in data_in: diff --git a/vpnproxy_cli.py b/vpnproxy_cli.py index 2e3bae7..f6a917f 100755 --- a/vpnproxy_cli.py +++ b/vpnproxy_cli.py @@ -3,7 +3,7 @@ __author__ = "duc_tin" __copyright__ = "Copyright 2015+, duc_tin" __license__ = "GPLv2" -__version__ = "1.20" +__version__ = "1.25" __maintainer__ = "duc_tin" __email__ = "nguyenbaduc.tin@gmail.com" @@ -58,7 +58,7 @@ def __init__(self, data): self.proto = 'tcp' if '\r\nproto tcp\r\n' in self.config_data else 'udp' port = re.findall('remote .+ \d+', self.config_data) if not port: - self.port = '0' + self.port = '1' else: self.port = port[0].split()[-1] @@ -77,7 +77,8 @@ def __str__(self): speed = self.speed / 1000. ** 2 uptime = datetime.timedelta(milliseconds=int(self.uptime)) uptime = re.split(',|\.', str(uptime))[0] - txt = [self.country_short, str(self.ping), '%.2f' % speed, uptime, self.logPolicy, str(self.score), self.proto, self.port] + txt = [self.country_short, str(self.ping), '%.2f' % speed, uptime, self.logPolicy, str(self.score), self.proto, + self.port] txt = [dta.center(spaces[ind + 1]) for ind, dta in enumerate(txt)] return ''.join(txt) @@ -99,7 +100,8 @@ def get_data(): print ' Check your proxy setting' if not err1 and '100% packet loss' in res1: print ctext('Warning:', 'yB') + ctext('Proxy not response to ping', 'y') - print ctext("Either proxy's security not allow it to response to ping packet\n or proxy itself is dead", 'y') + print ctext("Either proxy's security not allow it to response to ping packet\n or proxy itself is dead", + 'y') proxies = { 'http': 'http://' + proxy + ':' + port, @@ -211,29 +213,29 @@ def vpn_manager(ovpn): finally: dns_manager('restore') - # ---------------------------- Main -------------------------------- # get config file path path = os.path.realpath(sys.argv[0]) config_file = os.path.split(path)[0] + '/config.ini' +cfg = Setting(config_file) args = sys.argv[1:] # get proxy from config file if os.path.exists(config_file): + cfg.load() if len(args): # process commandline arguments if args[0] in ['r', 'restore']: dns_manager('restore') else: - get_input(config_file, args) - - proxy, port, ip, sort_by, use_proxy, s_country, s_port, dns_fix, dns, verbose = read_config(config_file) + get_input(cfg, args) else: - print '\n' + '_'*12 + ctext(' First time config ', 'gB') + '_'*12 + '\n' + print '\n' + '_' * 12 + ctext(' First time config ', 'gB') + '_' * 12 + '\n' print "If you don't know what to do, just press Enter to use default option\n" - use_proxy = 'no' if raw_input(ctext('Do you need proxy to connect? ', 'B')+'[yes|no(default)]:') in 'no' else 'yes' - if use_proxy == 'yes': + cfg.proxy['use_proxy'] = 'no' if raw_input( + ctext('Do you need proxy to connect? ', 'B') + '[yes|no(default)]:') in 'no' else 'yes' + if cfg.proxy['use_proxy'] == 'yes': print ' Input your http proxy such as ' + ctext('www.abc.com:8080', 'pB') while 1: try: @@ -243,34 +245,44 @@ def vpn_manager(ovpn): if not 0 <= int(port) <= 65535: raise ValueError except ValueError: - print ctext(' Error: Http proxy must in format ', 'r')+ctext('address:port', 'B') + print ctext(' Error: Http proxy must in format ', 'r') + ctext('address:port', 'B') print ' Where ' + ctext('address', 'B') + ' is in form of www.abc.com or 123.321.4.5' print ' ' + ctext('port', 'B') + ' is a number in range 0-65535' else: + cfg.proxy['address'] = proxy + cfg.proxy['port'] = port + cfg.proxy['ip'] = ip break - else: - proxy, port, ip = '', '', '' - - sort_by = raw_input(ctext('\nSort servers by ', 'B') + '[speed (default) | ping | score | up time]: ') - if sort_by not in ['speed', 'ping', 'score', 'up time']: - sort_by = 'speed' - - s_country = raw_input(ctext('\nFilter server by country ','B') + '[eg: all (default), jp, japan]: ') - if not s_country: - s_country = 'all' - - dns_fix = 'yes' if raw_input(ctext('\nFix DNS leaking ', 'B') + '[yes (default) | no] : ') in 'yes' else 'no' - dns = '' - if dns_fix == 'yes': - dns = raw_input(' DNS server or Enter to use 8.8.8.8 (google): ') - if not dns: - dns = '8.8.8.8, 84.200.69.80, 208.67.222.222' - verbose = 'no' if 'n' in raw_input(ctext('Write openvpn log? [yes (default)| no]: ', 'B')) else 'yes' - write_config(self.config_file, proxy, port, ip, sort_by, use_proxy, s_country, 'all', dns_fix, dns, verbose) - print '\n' + '_'*12 + ctext(' Config done', 'gB') + '_'*12 + '\n' + cfg.sort['key'] = raw_input(ctext('\nSort servers by ', 'B') + '[speed (default) | ping | score | up time]: ') + if cfg.sort['key'] not in ['speed', 'ping', 'score', 'up time']: + cfg.sort['key'] = 'speed' + + cfg.filter['country'] = raw_input( + ctext('\nFilter server by country ', 'B') + '[eg: all (default), jp, japan]: ') + if not cfg.filter['country']: + cfg.filter['country'] = 'all' + + cfg.dns['fix_dns'] = 'yes' if raw_input( + ctext('\nFix DNS leaking ', 'B') + '[yes (default) | no] : ') in 'yes' else 'no' + if cfg.dns['fix_dns'] == 'yes': + cfg.dns['dns'] = raw_input(' DNS server or Enter to use 8.8.8.8 (google): ') + if not cfg.dns['dns']: + cfg.dns['dns'] = '8.8.8.8, 84.200.69.80, 208.67.222.222' + + cfg.openvpn['verbose'] = 'no' if 'n' in raw_input( + ctext('Write openvpn log? [yes (default)| no]: ', 'B')) else 'yes' + + cfg.write() + print '\n' + '_' * 12 + ctext(' Config done', 'gB') + '_' * 12 + '\n' # ------------------- check_dependencies: ---------------------- +use_proxy, proxy, port, ip = cfg.proxy.values() +sort_by = cfg.sort.values()[0] +s_country, s_port = cfg.filter.values() +dns_fix, dns = cfg.dns.values() +verbose = cfg.openvpn.values()[0] + required = {'openvpn': 0, 'python-requests': 0, 'resolvconf': 0} try: @@ -330,11 +342,17 @@ def vpn_manager(ovpn): if user_input.strip().lower() in ['q', 'quit', 'exit']: print ctext('Goodbye'.center(40), 'gB') sys.exit() - elif user_input.strip().lower() in 'refresh': + elif user_input.strip().lower() in ('r', 'refresh'): ranked, vpn_list = refresh_data() - elif user_input.strip().lower() in 'config': - get_input(config_file, [user_input]) - proxy, port, ip, sort_by, use_proxy, s_country, s_port, dns_fix, dns, verbose = read_config(config_file) + elif user_input.strip().lower() in ('c', 'config'): + get_input(cfg, [user_input]) + + use_proxy, proxy, port, ip = cfg.proxy.values() + sort_by = cfg.sort.values()[0] + s_country, s_port = cfg.filter.values() + dns_fix, dns = cfg.dns.values() + verbose = cfg.openvpn.values()[0] + ranked, vpn_list = refresh_data() elif re.findall(r'^\d+$', user_input.strip()) and int(user_input) < server_sum: chose = int(user_input) diff --git a/vpnproxy_tui.py b/vpnproxy_tui.py index 942f70c..27efe09 100755 --- a/vpnproxy_tui.py +++ b/vpnproxy_tui.py @@ -3,7 +3,7 @@ __author__ = "duc_tin" __copyright__ = "Copyright 2015+, duc_tin" __license__ = "GPLv2" -__version__ = "1.20" +__version__ = "1.25" __maintainer__ = "duc_tin" __email__ = "nguyenbaduc.tin@gmail.com" @@ -98,6 +98,7 @@ class Connection: def __init__(self): self.path = os.path.realpath(sys.argv[0]) self.config_file = os.path.split(self.path)[0] + '/config.ini' + self.cfg = Setting(self.config_file) self.args = sys.argv[1:] self.debug = [] @@ -119,29 +120,40 @@ def __init__(self): # get proxy from config file if not os.path.exists(self.config_file): self.first_config() + + self.cfg.load() if len(self.args): # process commandline arguments if self.args[0] in ['r', 'restore']: self.dns_manager('restore') else: - get_input(self.config_file, self.args) - - self.configs = read_config(self.config_file) - self.proxy, self.port, self.ip = self.configs[0:3] - self.sort_by = self.configs[3] - self.use_proxy = self.configs[4] - self.filters['Country'] = self.configs[5] - self.filters['Port'] = self.configs[6] - self.dns_fix = self.configs[7] - self.dns = self.configs[8] - self.verbose = self.configs[9] + get_input(self.cfg, self.args) + + self.use_proxy, self.proxy, self.port, self.ip = ['']*4 + self.sort_by, self.filters, self.dns_fix, self.dns = ['']*4 + self.verbose = '' + self.reload() + + def reload(self): + self.use_proxy, self.proxy, self.port, self.ip = self.cfg.proxy.values() + self.sort_by = self.cfg.sort.values()[0] + self.filters = self.cfg.filter + self.dns_fix, self.dns = self.cfg.dns.values() + self.verbose = self.cfg.openvpn.values()[0] + + def rewrite(self, section, **contents): + for key in contents: + self.cfg.sections[section][key] = contents[key] + self.cfg.write() + self.reload() def first_config(self): print '\n' + '_' * 12 + ctext(' First time config ', 'gB') + '_' * 12 + '\n' print "If you don't know what to do, just press Enter to use default option\n" - use_proxy = 'no' if raw_input( + + self.cfg.proxy['use_proxy'] = 'no' if raw_input( ctext('Do you need proxy to connect? ', 'B') + '[yes|no(default)]:') in 'no' else 'yes' - if use_proxy == 'yes': + if self.cfg.proxy['use_proxy'] == 'yes': print ' Input your http proxy such as ' + ctext('www.abc.com:8080', 'pB') while 1: try: @@ -155,27 +167,31 @@ def first_config(self): print ' Where ' + ctext('address', 'B') + ' is in form of www.abc.com or 123.321.4.5' print ' ' + ctext('port', 'B') + ' is a number in range 0-65535' else: + self.cfg.proxy['address'] = proxy + self.cfg.proxy['port'] = port + self.cfg.proxy['ip'] = ip break - else: - proxy, port, ip = '', '', '' - - sort_by = raw_input(ctext('\nSort servers by ', 'B') + '[speed (default) | ping | score | up time]: ') - if sort_by not in ['speed', 'ping', 'score', 'up time']: - sort_by = 'speed' - - country = raw_input(ctext('\nFilter server by country ', 'B') + '[eg: all (default), jp, japan]: ') - if not country: - country = 'all' - - dns_fix = 'yes' if raw_input(ctext('\nFix DNS leaking ', 'B') + '[yes (default) | no] : ') in 'yes' else 'no' - dns = '' - if dns_fix == 'yes': - dns = raw_input(' DNS server or Enter to use 8.8.8.8 (google): ') - if not dns: - dns = '8.8.8.8, 84.200.69.80, 208.67.222.222' - verbose = 'no' if 'n' in raw_input(ctext('Write openvpn log?', 'B') + '[yes (default)| no]: ') else 'yes' - write_config(self.config_file, proxy, port, ip, sort_by, use_proxy, country, 'all', dns_fix, dns, verbose) + self.cfg.sort['key'] = raw_input(ctext('\nSort servers by ', 'B') + '[speed (default) | ping | score | up time]: ') + if self.cfg.sort['key'] not in ['speed', 'ping', 'score', 'up time']: + self.cfg.sort['key'] = 'speed' + + self.cfg.filter['country'] = raw_input( + ctext('\nFilter server by country ', 'B') + '[eg: all (default), jp, japan]: ') + if not self.cfg.filter['country']: + self.cfg.filter['country'] = 'all' + + self.cfg.dns['fix_dns'] = 'yes' if raw_input( + ctext('\nFix DNS leaking ', 'B') + '[yes (default) | no] : ') in 'yes' else 'no' + if self.cfg.dns['fix_dns'] == 'yes': + self.cfg.dns['dns'] = raw_input(' DNS server or Enter to use 8.8.8.8 (google): ') + if not self.cfg.dns: + self.cfg.dns['dns'] = '8.8.8.8, 84.200.69.80, 208.67.222.222' + + self.cfg.openvpn['verbose'] = 'no' if 'n' in raw_input( + ctext('Write openvpn log? [yes (default)| no]: ', 'B')) else 'yes' + + self.cfg.write() print '\n' + '_' * 12 + ctext(' Config done', 'gB') + '_' * 12 + '\n' def get_data(self): @@ -244,13 +260,13 @@ def get_data(self): def refresh_data(self): # fetch data from vpngate.net self.get_data() - if self.filters['Country'] != 'all': - name = self.filters['Country'] + if self.filters['country'] != 'all': + name = self.filters['country'] self.vpndict = dict([vpn for vpn in self.vpndict.items() if re.search(r'\b%s\b' % name, vpn[1].country_long.lower() + ' ' + vpn[1].country_short.lower())]) - if self.filters['Port'] != 'all': - port = self.filters['Port'] + if self.filters['port'] != 'all': + port = self.filters['port'] self.vpndict = dict([vpn for vpn in self.vpndict.items() if vpn[1].port in port]) if self.sort_by == 'speed': @@ -514,7 +530,7 @@ def input_handler(self, Edit, key_ls=None): elif key == 'enter': self.printf('') text = self.input.get_edit_text().lower() - if 'Invalid' in text: + if 'invalid' in text: self.input.set_edit_text('') elif text.isdigit(): @@ -528,7 +544,7 @@ def input_handler(self, Edit, key_ls=None): self.input.set_edit_text('No such server!') self.input.set_edit_pos(len(self.input.get_edit_text())) - elif text.lower() in ['r', 'refresh']: + elif text in ['r', 'refresh']: screen.get_data_status = 'call' self.input.set_edit_text('') elif 'restore' in text: @@ -629,24 +645,16 @@ def update_GUI(self): self.table[i + 1].original_widget.set_attr_map({None: 'failed'}) def setting(self, key=None): - proxy = self.ovpn.proxy - port = self.ovpn.port - ip = self.ovpn.ip - use_proxy = self.ovpn.use_proxy - - sort_by = self.ovpn.sort_by - s_country = self.ovpn.filters['Country'] - s_port = self.ovpn.filters['Port'] - fix_dns = self.ovpn.dns_fix - dns = self.ovpn.dns + use_proxy, proxy, port, ip = self.ovpn.cfg.proxy.values() + sort_by = self.ovpn.cfg.sort['key'] + s_country, s_port = self.ovpn.cfg.filter.values() + dns_fix, dns = self.ovpn.cfg.dns.values() - verbose = self.ovpn.verbose - - config_data = [use_proxy, fix_dns, s_country+' '+s_port, sort_by] + config_data = [use_proxy, dns_fix, s_country[0:4]+' '+s_port, sort_by] labels = ['Proxy: ', 'DNS fix: ', 'Filter: ', 'Sort by: '] buttons = ['F2', 'F3', 'F4', 'F5'] popup = [PopUpProxy, PopUpDNS, PopUpCountry, PopUpSortBy] - param = [(use_proxy, proxy, port), (fix_dns, dns), (s_country, s_port), sort_by] + param = [(use_proxy, proxy, port), (dns_fix, dns), (s_country, s_port), sort_by] pop_size = [(0, 1, 39, 6), (0, 1, 35, 5), (0, 1, 35, 7), (7, 1, 12, 6)] if not key: @@ -665,34 +673,40 @@ def setting(self, key=None): index = int(key[1:]) - 2 if key == 'f2': - yn = self.sets.contents[index][0].result[0] + yn = config_data[index] = self.sets.contents[index][0].result[0] proxy, port = self.sets.contents[index][0].result[1:] - - use_proxy = self.ovpn.use_proxy = config_data[index] = yn - self.ovpn.proxy, self.ovpn.port = proxy, port + proxy_ = {'use proxy': yn, 'address': proxy, 'port': port, 'ip': ip} + self.ovpn.rewrite('proxy', **proxy_) tex = [('button', buttons[index]), ('attention', labels[index]), config_data[index]] self.sets[index].set_text(tex) elif key == 'f3': - yn = self.sets.contents[index][0].result[0] - dns = self.ovpn.dns = self.sets.contents[index][0].result[1] + yn = config_data[index] = self.sets.contents[index][0].result[0] + dns = self.sets.contents[index][0].result[1] - fix_dns = self.ovpn.dns_fix = config_data[index] = yn + dns_ = {'fix_dns': yn, 'dns': dns} + self.ovpn.rewrite('DNS_leak', **dns_) tex = [('button', buttons[index]), ('attention', labels[index]), config_data[index]] self.sets[index].set_text(tex) elif key == 'f4': - s_country = self.ovpn.filters['Country'] = config_data[index] = self.sets.contents[index][0].result[0] - s_port = self.ovpn.filters['Port'] = self.sets.contents[index][0].result[1] - tex = [('button', buttons[index]), ('attention', labels[index]), config_data[index][0:4]+' '+s_port] + self.ovpn.filters['country'] = config_data[index] = self.sets.contents[index][0].result[0] + self.ovpn.filters['port'] = self.sets.contents[index][0].result[1] + s_c_p = self.ovpn.filters['country'][0:4] + ' ' + self.ovpn.filters['port'][0:4] + self.ovpn.reload() + self.ovpn.cfg.write() + + tex = [('button', buttons[index]), ('attention', labels[index]), s_c_p] self.sets[index].set_text(tex) self.input.set_edit_text('refresh') self.input.set_edit_pos(len('refresh')) elif key == 'f5': - sort_by = self.ovpn.sort_by = config_data[index] = self.sets.contents[index][0].result + sort_by = config_data[index] = self.sets.contents[index][0].result + self.ovpn.rewrite('sort', key=sort_by) + tex = [('button', buttons[index]), ('attention', labels[index]), config_data[index]] self.sets[index].set_text(tex) self.input.set_edit_text('refresh') @@ -700,7 +714,9 @@ def setting(self, key=None): elif key == 'f10': yn = self.ovpn.verbose - verbose = self.ovpn.verbose = 'no' if yn == 'yes' else 'yes' + verbose = 'no' if yn == 'yes' else 'yes' + self.ovpn.rewrite('openvpn', verbose=verbose) + self.ovpn.messages['debug'].appendleft(time.asctime() + ': Logging is turned ' + ('off' if yn == 'yes' else 'on')) self.status(self.ovpn.messages) @@ -708,8 +724,7 @@ def setting(self, key=None): elif key == 'f7': pass - config_path = self.ovpn.config_file - write_config(config_path, proxy, port, ip, sort_by, use_proxy, s_country, s_port, fix_dns, dns, verbose) + self.ovpn.cfg.write() def status(self, msg=None): self.logger(msg)