From ffffbd4542404e51d7d5844c69c4fe7814c7250a Mon Sep 17 00:00:00 2001 From: thomashuang Date: Sat, 22 Feb 2014 02:03:56 +0800 Subject: [PATCH 1/5] main: refact the main method to class, make it easy to read and modify --- shadowsocks/local.py | 194 ++++++++++++++++++++++++++---------------- shadowsocks/server.py | 186 ++++++++++++++++++++++++++-------------- 2 files changed, 239 insertions(+), 141 deletions(-) diff --git a/shadowsocks/local.py b/shadowsocks/local.py index b3061e6..8170558 100755 --- a/shadowsocks/local.py +++ b/shadowsocks/local.py @@ -64,6 +64,7 @@ class ThreadingTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): class Socks5Server(SocketServer.StreamRequestHandler): + def getServer(self): aPort = REMOTE_PORT aServer = SERVER @@ -77,7 +78,8 @@ class Socks5Server(SocketServer.StreamRequestHandler): r = re.match(r'^(.*)\:(\d+)$', aServer) if r: # support config like "server": "123.123.123.1:8381" - # or "server": ["123.123.123.1:8381", "123.123.123.2:8381", "123.123.123.2:8382"] + # or "server": ["123.123.123.1:8381", "123.123.123.2:8381", + # "123.123.123.2:8382"] aServer = r.group(1) aPort = int(r.group(2)) return (aServer, aPort) @@ -164,90 +166,132 @@ class Socks5Server(SocketServer.StreamRequestHandler): logging.warn(e) -def main(): - global SERVER, REMOTE_PORT, KEY, METHOD +class ShadowSocksServer(object): - logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s %(levelname)-8s %(message)s', - datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') + def __init__(self): - # fix py2exe - if hasattr(sys, "frozen") and sys.frozen in \ - ("windows_exe", "console_exe"): - p = os.path.dirname(os.path.abspath(sys.executable)) - os.chdir(p) - version = '' - try: - import pkg_resources - version = pkg_resources.get_distribution('shadowsocks').version - except: - pass - print 'shadowsocks %s' % version + self.options = self.default_options() - KEY = None - METHOD = None - LOCAL = '' - IPv6 = False + def default_options(self): + return { + "server":"127.0.0.1", + "server_port":8388, + "local_port":1081, + "password":"Keep Your Password", + "timeout":60, + "method":"aes-128-cfb", + "IPv6": False + } - config_path = utils.find_config() - optlist, args = getopt.getopt(sys.argv[1:], 's:b:p:k:l:m:c:6') - for key, value in optlist: - if key == '-c': - config_path = value - if config_path: - logging.info('loading config from %s' % config_path) - with open(config_path, 'rb') as f: - try: - config = json.load(f) - except ValueError as e: - logging.error('found an error in config.json: %s', e.message) - sys.exit(1) - else: - config = {} - optlist, args = getopt.getopt(sys.argv[1:], 's:b:p:k:l:m:c:6') - for key, value in optlist: - if key == '-p': - config['server_port'] = int(value) - elif key == '-k': - config['password'] = value - elif key == '-l': - config['local_port'] = int(value) - elif key == '-s': - config['server'] = value - elif key == '-m': - config['method'] = value - elif key == '-b': - config['local'] = value - elif key == '-6': - IPv6 = True + def serve_forever(self): + self.set_logging() + self.run_info() + self.set_options() + self.check_config() - SERVER = config['server'] - REMOTE_PORT = config['server_port'] - PORT = config['local_port'] - KEY = config['password'] - METHOD = config.get('method', None) - LOCAL = config.get('local', '') + SERVER = self.options['server'] + REMOTE_PORT = self.options['server_port'] + PORT = self.options['local_port'] + KEY = self.options['password'] + METHOD = self.options.get('method', None) + LOCAL = self.options.get('local', '') + + encrypt.init_table(KEY, METHOD) - if not KEY and not config_path: - sys.exit('config not specified, please read https://github.com/clowwindy/shadowsocks') + try: + if self.options['IPv6']: + ThreadingTCPServer.address_family = socket.AF_INET6 + server = ThreadingTCPServer((LOCAL, PORT), Socks5Server) + logging.info("starting local at %s:%d" % + tuple(server.server_address[:2])) + server.serve_forever() + except socket.error, e: + logging.error(e) + except KeyboardInterrupt: + server.shutdown() + sys.exit(0) + self.server.serve_forever() - utils.check_config(config) + def check_config(self): + utils.check_config(self.options) + + def set_logging(self): + logfmt = '[%%(levelname)s] %s%%(message)s' % '%(name)s - ' + config = lambda x: logging.basicConfig(level=x, format='[%(asctime)s] ' + logfmt, datefmt='%Y%m%d %H:%M:%S') + if self.options.get('debug'): + config(logging.DEBUG) + else: + config(logging.INFO) + # logging.basicConfig(level=logging.DEBUG, + # format='%(asctime)s %(levelname)-8s %(message)s', + # datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') + + def set_options(self): + config_path = self._find_options() + config = self._parse_file_options(config_path) + config = self._parse_cmd_options(config) + self.options.update(config) + + def _parse_file_options(self, config_path): + if config_path: + logging.info('loading config from %s' % config_path) + with open(config_path, 'rb') as f: + try: + config = json.load(f) + except ValueError as e: + logging.error( + 'found an error in config.json: %s', e.message) + sys.exit(1) + else: + config = {} + + return config + + def _find_options(self): + config_path = utils.find_config() + print config_path + optlist, args = getopt.getopt(sys.argv[1:], 's:b:p:k:l:m:c:6') + for key, value in optlist: + if key == '-c': + config_path = value + return config_path + + def _parse_cmd_options(self, config): + optlist, args = getopt.getopt(sys.argv[1:], 's:b:p:k:l:m:c:6') + for key, value in optlist: + if key == '-p': + config['server_port'] = int(value) + elif key == '-k': + self.options['password'] = value + elif key == '-l': + config['local_port'] = int(value) + elif key == '-s': + config['server'] = value + elif key == '-m': + config['method'] = value + elif key == '-b': + config['local'] = value + elif key == '-6': + config['IPv6'] = True + return config + + def run_info(self): + + if hasattr(sys, "frozen") and sys.frozen in \ + ("windows_exe", "console_exe"): + p = os.path.dirname(os.path.abspath(sys.executable)) + os.chdir(p) + version = '' + try: + import pkg_resources + version = pkg_resources.get_distribution('shadowsocks').version + except: + pass + logging.info('shadowsocks %s' % version) - encrypt.init_table(KEY, METHOD) - try: - if IPv6: - ThreadingTCPServer.address_family = socket.AF_INET6 - server = ThreadingTCPServer((LOCAL, PORT), Socks5Server) - logging.info("starting local at %s:%d" % tuple(server.server_address[:2])) - server.serve_forever() - except socket.error, e: - logging.error(e) - except KeyboardInterrupt: - server.shutdown() - sys.exit(0) if __name__ == '__main__': - main() + ShadowSocksServer().serve_forever() diff --git a/shadowsocks/server.py b/shadowsocks/server.py index d045d5e..168a98c 100755 --- a/shadowsocks/server.py +++ b/shadowsocks/server.py @@ -125,85 +125,139 @@ class Socks5Server(SocketServer.StreamRequestHandler): except socket.error, e: logging.warn(e) -def main(): - logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s %(levelname)-8s %(message)s', - datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') +class ShadowSocksServer(object): + + def __init__(self): + + self.options = self.default_options() + + def default_options(self): + return { + "server":"127.0.0.1", + "server_port":8388, + "local_port":1081, + "password":"Keep Your Password", + "timeout":60, + "method":"aes-128-cfb", + "IPv6": False + } - version = '' - try: - import pkg_resources - version = pkg_resources.get_distribution('shadowsocks').version - except: - pass - print 'shadowsocks %s' % version - KEY = None - METHOD = None - IPv6 = False + def serve_forever(self): - config_path = utils.find_config() - optlist, args = getopt.getopt(sys.argv[1:], 's:p:k:m:c:6') - for key, value in optlist: - if key == '-c': - config_path = value + self.set_logging() + self.run_info() + self.set_options() + self.check_config() - if config_path: - logging.info('loading config from %s' % config_path) - with open(config_path, 'rb') as f: - try: - config = json.load(f) - except ValueError as e: - logging.error('found an error in config.json: %s', e.message) - sys.exit(1) - logging.info('loading config from %s' % config_path) - else: - config = {} + SERVER = self.options['server'] + PORT = self.options['server_port'] + KEY = self.options['password'] + METHOD = self.options.get('method', None) + PORTPASSWORD = self.options.get('port_password', None) + TIMEOUT = self.options.get('timeout', 600) - optlist, args = getopt.getopt(sys.argv[1:], 's:p:k:m:c:6') - for key, value in optlist: - if key == '-p': - config['server_port'] = int(value) - elif key == '-k': - config['password'] = value - elif key == '-s': - config['server'] = value - elif key == '-m': - config['method'] = value - elif key == '-6': - IPv6 = True + if PORTPASSWORD: + if PORT or KEY: + logging.warn('warning: port_password should not be used with server_port and password. server_port and password will be ignored') + else: + PORTPASSWORD = {} + PORTPASSWORD[str(PORT)] = KEY - SERVER = config['server'] - PORT = config['server_port'] - KEY = config['password'] - METHOD = config.get('method', None) - PORTPASSWORD = config.get('port_password', None) - TIMEOUT = config.get('timeout', 600) - if not KEY and not config_path: - sys.exit('config not specified, please read https://github.com/clowwindy/shadowsocks') + encrypt.init_table(KEY, METHOD) + if self.options['IPv6']: + ThreadingTCPServer.address_family = socket.AF_INET6 + for port, key in PORTPASSWORD.items(): + server = ThreadingTCPServer((SERVER, int(port)), Socks5Server) + server.key, server.method, server.timeout = key, METHOD, int(TIMEOUT) + logging.info("starting server at %s:%d" % tuple(server.server_address[:2])) + threading.Thread(target=server.serve_forever).start() + + def check_config(self): + utils.check_config(self.options) + + def set_logging(self): + logfmt = '[%%(levelname)s] %s%%(message)s' % '%(name)s - ' + config = lambda x: logging.basicConfig(level=x, format='[%(asctime)s] ' + logfmt, datefmt='%Y%m%d %H:%M:%S') + if self.options.get('debug'): + config(logging.DEBUG) + else: + config(logging.INFO) + # logging.basicConfig(level=logging.DEBUG, + # format='%(asctime)s %(levelname)-8s %(message)s', + # datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') + + def set_options(self): + config_path = self._find_options() + config = self._parse_file_options(config_path) + config = self._parse_cmd_options(config) + self.options.update(config) + + def _parse_file_options(self, config_path): + if config_path: + logging.info('loading config from %s' % config_path) + with open(config_path, 'rb') as f: + try: + config = json.load(f) + except ValueError as e: + logging.error( + 'found an error in config.json: %s', e.message) + sys.exit(1) + else: + config = {} + + return config + + def _find_options(self): + config_path = utils.find_config() + print config_path + optlist, args = getopt.getopt(sys.argv[1:], 's:b:p:k:l:m:c:6') + for key, value in optlist: + if key == '-c': + config_path = value + return config_path + + def _parse_cmd_options(self, config): + optlist, args = getopt.getopt(sys.argv[1:], 's:b:p:k:l:m:c:6') + for key, value in optlist: + if key == '-p': + config['server_port'] = int(value) + elif key == '-k': + self.options['password'] = value + elif key == '-l': + config['local_port'] = int(value) + elif key == '-s': + config['server'] = value + elif key == '-m': + config['method'] = value + elif key == '-b': + config['local'] = value + elif key == '-6': + config['IPv6'] = True + return config + + def run_info(self): + + if hasattr(sys, "frozen") and sys.frozen in \ + ("windows_exe", "console_exe"): + p = os.path.dirname(os.path.abspath(sys.executable)) + os.chdir(p) + version = '' + try: + import pkg_resources + version = pkg_resources.get_distribution('shadowsocks').version + except: + pass + logging.info('shadowsocks %s' % version) + - utils.check_config(config) - if PORTPASSWORD: - if PORT or KEY: - logging.warn('warning: port_password should not be used with server_port and password. server_port and password will be ignored') - else: - PORTPASSWORD = {} - PORTPASSWORD[str(PORT)] = KEY - encrypt.init_table(KEY, METHOD) - if IPv6: - ThreadingTCPServer.address_family = socket.AF_INET6 - for port, key in PORTPASSWORD.items(): - server = ThreadingTCPServer((SERVER, int(port)), Socks5Server) - server.key, server.method, server.timeout = key, METHOD, int(TIMEOUT) - logging.info("starting server at %s:%d" % tuple(server.server_address[:2])) - threading.Thread(target=server.serve_forever).start() if __name__ == '__main__': try: - main() + ShadowSocksServer().serve_forever() except socket.error, e: logging.error(e) From 8b69df61e7ec6f0d957a2a2d4a004d43b21af304 Mon Sep 17 00:00:00 2001 From: thomashuang Date: Sat, 22 Feb 2014 02:07:29 +0800 Subject: [PATCH 2/5] main: fix pep8 style --- shadowsocks/local.py | 22 ++++++++++------------ shadowsocks/server.py | 37 +++++++++++++++++++------------------ 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/shadowsocks/local.py b/shadowsocks/local.py index 8170558..fe42459 100755 --- a/shadowsocks/local.py +++ b/shadowsocks/local.py @@ -174,17 +174,15 @@ class ShadowSocksServer(object): def default_options(self): return { - "server":"127.0.0.1", - "server_port":8388, - "local_port":1081, - "password":"Keep Your Password", - "timeout":60, - "method":"aes-128-cfb", - "IPv6": False + "server": "127.0.0.1", + "server_port": 8388, + "local_port": 1081, + "password": "Keep Your Password", + "timeout": 60, + "method": "aes-128-cfb", + "IPv6": False } - - def serve_forever(self): self.set_logging() self.run_info() @@ -197,7 +195,7 @@ class ShadowSocksServer(object): KEY = self.options['password'] METHOD = self.options.get('method', None) LOCAL = self.options.get('local', '') - + encrypt.init_table(KEY, METHOD) try: @@ -219,7 +217,8 @@ class ShadowSocksServer(object): def set_logging(self): logfmt = '[%%(levelname)s] %s%%(message)s' % '%(name)s - ' - config = lambda x: logging.basicConfig(level=x, format='[%(asctime)s] ' + logfmt, datefmt='%Y%m%d %H:%M:%S') + config = lambda x: logging.basicConfig(level=x, + format='[%(asctime)s] ' + logfmt, datefmt='%Y%m%d %H:%M:%S') if self.options.get('debug'): config(logging.DEBUG) else: @@ -292,6 +291,5 @@ class ShadowSocksServer(object): logging.info('shadowsocks %s' % version) - if __name__ == '__main__': ShadowSocksServer().serve_forever() diff --git a/shadowsocks/server.py b/shadowsocks/server.py index 168a98c..4228d4f 100755 --- a/shadowsocks/server.py +++ b/shadowsocks/server.py @@ -63,6 +63,7 @@ class ThreadingTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): class Socks5Server(SocketServer.StreamRequestHandler): + def handle_tcp(self, sock, remote): try: fdset = [sock, remote] @@ -95,7 +96,8 @@ class Socks5Server(SocketServer.StreamRequestHandler): def handle(self): try: - self.encryptor = encrypt.Encryptor(self.server.key, self.server.method) + self.encryptor = encrypt.Encryptor( + self.server.key, self.server.method) sock = self.connection iv_len = self.encryptor.iv_len() if iv_len: @@ -125,6 +127,7 @@ class Socks5Server(SocketServer.StreamRequestHandler): except socket.error, e: logging.warn(e) + class ShadowSocksServer(object): def __init__(self): @@ -133,17 +136,15 @@ class ShadowSocksServer(object): def default_options(self): return { - "server":"127.0.0.1", - "server_port":8388, - "local_port":1081, - "password":"Keep Your Password", - "timeout":60, - "method":"aes-128-cfb", - "IPv6": False + "server": "127.0.0.1", + "server_port": 8388, + "local_port": 1081, + "password": "Keep Your Password", + "timeout": 60, + "method": "aes-128-cfb", + "IPv6": False } - - def serve_forever(self): self.set_logging() @@ -160,19 +161,21 @@ class ShadowSocksServer(object): if PORTPASSWORD: if PORT or KEY: - logging.warn('warning: port_password should not be used with server_port and password. server_port and password will be ignored') + logging.warn( + 'warning: port_password should not be used with server_port and password. server_port and password will be ignored') else: PORTPASSWORD = {} PORTPASSWORD[str(PORT)] = KEY - encrypt.init_table(KEY, METHOD) if self.options['IPv6']: ThreadingTCPServer.address_family = socket.AF_INET6 for port, key in PORTPASSWORD.items(): server = ThreadingTCPServer((SERVER, int(port)), Socks5Server) - server.key, server.method, server.timeout = key, METHOD, int(TIMEOUT) - logging.info("starting server at %s:%d" % tuple(server.server_address[:2])) + server.key, server.method, server.timeout = key, METHOD, int( + TIMEOUT) + logging.info("starting server at %s:%d" % + tuple(server.server_address[:2])) threading.Thread(target=server.serve_forever).start() def check_config(self): @@ -180,7 +183,8 @@ class ShadowSocksServer(object): def set_logging(self): logfmt = '[%%(levelname)s] %s%%(message)s' % '%(name)s - ' - config = lambda x: logging.basicConfig(level=x, format='[%(asctime)s] ' + logfmt, datefmt='%Y%m%d %H:%M:%S') + config = lambda x: logging.basicConfig(level=x, + format='[%(asctime)s] ' + logfmt, datefmt='%Y%m%d %H:%M:%S') if self.options.get('debug'): config(logging.DEBUG) else: @@ -253,9 +257,6 @@ class ShadowSocksServer(object): logging.info('shadowsocks %s' % version) - - - if __name__ == '__main__': try: ShadowSocksServer().serve_forever() From 4e598810fde5d713c4aec6d0cfe3b42edd8563a9 Mon Sep 17 00:00:00 2001 From: thomashuang Date: Sat, 22 Feb 2014 02:14:26 +0800 Subject: [PATCH 3/5] Beauty the logging format and and logger handle for debug and --- shadowsocks/encrypt.py | 7 ++++--- shadowsocks/local.py | 22 ++++++++++++---------- shadowsocks/server.py | 21 +++++++++++---------- shadowsocks/utils.py | 7 ++++--- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/shadowsocks/encrypt.py b/shadowsocks/encrypt.py index 09a6db6..f3c2d24 100644 --- a/shadowsocks/encrypt.py +++ b/shadowsocks/encrypt.py @@ -26,6 +26,7 @@ import string import struct import logging +logger = logging.getLogger('encrypt') def random_string(length): import M2Crypto.Rand @@ -53,7 +54,7 @@ def init_table(key, method=None): try: __import__('M2Crypto') except ImportError: - logging.error('M2Crypto is required to use encryption other than default method') + logger.error('M2Crypto is required to use encryption other than default method') sys.exit(1) if not method: global encrypt_table, decrypt_table @@ -63,7 +64,7 @@ def init_table(key, method=None): try: Encryptor(key, method) # make an Encryptor to test if the settings if OK except Exception as e: - logging.error(e) + logger.error(e) sys.exit(1) @@ -140,7 +141,7 @@ class Encryptor(object): self.cipher_iv = iv[:m[1]] # this iv is for cipher, not decipher return M2Crypto.EVP.Cipher(method.replace('-', '_'), key, iv, op, key_as_bytes=0, d='md5', salt=None, i=1, padding=1) - logging.error('method %s not supported' % method) + logger.error('method %s not supported' % method) sys.exit(1) def encrypt(self, buf): diff --git a/shadowsocks/local.py b/shadowsocks/local.py index fe42459..a7da88b 100755 --- a/shadowsocks/local.py +++ b/shadowsocks/local.py @@ -48,6 +48,8 @@ import encrypt import utils +logger = logging.getLogger('local') + def send_all(sock, data): bytes_sent = 0 while True: @@ -126,7 +128,7 @@ class Socks5Server(SocketServer.StreamRequestHandler): data = self.rfile.read(4) or '\x00' * 4 mode = ord(data[1]) if mode != 1: - logging.warn('mode != 1') + logger.warn('mode != 1') return addrtype = ord(data[3]) addr_to_send = data[3] @@ -143,7 +145,7 @@ class Socks5Server(SocketServer.StreamRequestHandler): addr = socket.inet_ntop(socket.AF_INET6, addr_ip) addr_to_send += addr_ip else: - logging.warn('addr_type not supported') + logger.warn('addr_type not supported') # not supported return addr_port = self.rfile.read(2) @@ -157,13 +159,13 @@ class Socks5Server(SocketServer.StreamRequestHandler): aServer, aPort = self.getServer() remote = socket.create_connection((aServer, aPort)) self.send_encrypt(remote, addr_to_send) - logging.info('connecting %s:%d' % (addr, port[0])) + logger.info('connecting %s:%d' % (addr, port[0])) except socket.error, e: - logging.warn(e) + logger.warn(e) return self.handle_tcp(sock, remote) except socket.error, e: - logging.warn(e) + logger.warn(e) class ShadowSocksServer(object): @@ -202,11 +204,11 @@ class ShadowSocksServer(object): if self.options['IPv6']: ThreadingTCPServer.address_family = socket.AF_INET6 server = ThreadingTCPServer((LOCAL, PORT), Socks5Server) - logging.info("starting local at %s:%d" % + logger.info("starting local at %s:%d" % tuple(server.server_address[:2])) server.serve_forever() except socket.error, e: - logging.error(e) + logger.error(e) except KeyboardInterrupt: server.shutdown() sys.exit(0) @@ -235,12 +237,12 @@ class ShadowSocksServer(object): def _parse_file_options(self, config_path): if config_path: - logging.info('loading config from %s' % config_path) + logger.info('loading config from %s' % config_path) with open(config_path, 'rb') as f: try: config = json.load(f) except ValueError as e: - logging.error( + logger.error( 'found an error in config.json: %s', e.message) sys.exit(1) else: @@ -288,7 +290,7 @@ class ShadowSocksServer(object): version = pkg_resources.get_distribution('shadowsocks').version except: pass - logging.info('shadowsocks %s' % version) + logger.info('shadowsocks %s' % version) if __name__ == '__main__': diff --git a/shadowsocks/server.py b/shadowsocks/server.py index 4228d4f..1e2d780 100755 --- a/shadowsocks/server.py +++ b/shadowsocks/server.py @@ -46,6 +46,7 @@ import getopt import encrypt import utils +logger = logging.getLogger('server') def send_all(sock, data): bytes_sent = 0 @@ -113,19 +114,19 @@ class Socks5Server(SocketServer.StreamRequestHandler): self.decrypt(self.rfile.read(16))) else: # not supported - logging.warn('addr_type not supported, maybe wrong password') + logger.warn('addr_type not supported, maybe wrong password') return port = struct.unpack('>H', self.decrypt(self.rfile.read(2))) try: - logging.info('connecting %s:%d' % (addr, port[0])) + logger.info('connecting %s:%d' % (addr, port[0])) remote = socket.create_connection((addr, port[0])) except socket.error, e: # Connection refused - logging.warn(e) + logger.warn(e) return self.handle_tcp(sock, remote) except socket.error, e: - logging.warn(e) + logger.warn(e) class ShadowSocksServer(object): @@ -161,7 +162,7 @@ class ShadowSocksServer(object): if PORTPASSWORD: if PORT or KEY: - logging.warn( + logger.warn( 'warning: port_password should not be used with server_port and password. server_port and password will be ignored') else: PORTPASSWORD = {} @@ -174,7 +175,7 @@ class ShadowSocksServer(object): server = ThreadingTCPServer((SERVER, int(port)), Socks5Server) server.key, server.method, server.timeout = key, METHOD, int( TIMEOUT) - logging.info("starting server at %s:%d" % + logger.info("starting server at %s:%d" % tuple(server.server_address[:2])) threading.Thread(target=server.serve_forever).start() @@ -201,12 +202,12 @@ class ShadowSocksServer(object): def _parse_file_options(self, config_path): if config_path: - logging.info('loading config from %s' % config_path) + logger.info('loading config from %s' % config_path) with open(config_path, 'rb') as f: try: config = json.load(f) except ValueError as e: - logging.error( + logger.error( 'found an error in config.json: %s', e.message) sys.exit(1) else: @@ -254,11 +255,11 @@ class ShadowSocksServer(object): version = pkg_resources.get_distribution('shadowsocks').version except: pass - logging.info('shadowsocks %s' % version) + logger.info('shadowsocks %s' % version) if __name__ == '__main__': try: ShadowSocksServer().serve_forever() except socket.error, e: - logging.error(e) + logger.error(e) diff --git a/shadowsocks/utils.py b/shadowsocks/utils.py index 237ad88..178bc35 100644 --- a/shadowsocks/utils.py +++ b/shadowsocks/utils.py @@ -4,6 +4,7 @@ import os import logging +logger = logging.getLogger('utils') def find_config(): config_path = 'config.json' @@ -16,7 +17,7 @@ def find_config(): def check_config(config): if config.get('server', '') in ['127.0.0.1', 'localhost']: - logging.warn('Server is set to "%s", maybe it\'s not correct' % config['server']) - logging.warn('Notice server will listen at %s:%s' % (config['server'], config['server_port'])) + logger.warn('Server is set to "%s", maybe it\'s not correct' % config['server']) + logger.warn('Notice server will listen at %s:%s' % (config['server'], config['server_port'])) if (config.get('method', '') or '').lower() == 'rc4': - logging.warn('RC4 is not safe; please use a safer cipher, like AES-256-CFB') + logger.warn('RC4 is not safe; please use a safer cipher, like AES-256-CFB') From 308865730930c2f5a9b4f0afccb47f887c068056 Mon Sep 17 00:00:00 2001 From: thomashuang Date: Sat, 22 Feb 2014 02:41:26 +0800 Subject: [PATCH 4/5] Fix kep default options consistent --- shadowsocks/local.py | 12 ++++++------ shadowsocks/server.py | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/shadowsocks/local.py b/shadowsocks/local.py index a7da88b..d2e6bcd 100755 --- a/shadowsocks/local.py +++ b/shadowsocks/local.py @@ -176,12 +176,12 @@ class ShadowSocksServer(object): def default_options(self): return { - "server": "127.0.0.1", - "server_port": 8388, - "local_port": 1081, - "password": "Keep Your Password", - "timeout": 60, - "method": "aes-128-cfb", + "server":"localhost", + "server_port":8388, + "local_port":1080, + "password":"barfoo!", + "timeout":600, + "method":"table" "IPv6": False } diff --git a/shadowsocks/server.py b/shadowsocks/server.py index 1e2d780..ccbb50a 100755 --- a/shadowsocks/server.py +++ b/shadowsocks/server.py @@ -137,12 +137,12 @@ class ShadowSocksServer(object): def default_options(self): return { - "server": "127.0.0.1", - "server_port": 8388, - "local_port": 1081, - "password": "Keep Your Password", - "timeout": 60, - "method": "aes-128-cfb", + "server":"localhost", + "server_port":8388, + "local_port":1080, + "password":"barfoo!", + "timeout":600, + "method":"table" "IPv6": False } From 5dcaba7a16c54731272944da4d98c64927e95ae4 Mon Sep 17 00:00:00 2001 From: thomashuang Date: Sat, 22 Feb 2014 02:58:29 +0800 Subject: [PATCH 5/5] Fixed not defined global SERVER, REMOTE_PORT, KEY, METHOD, and the default options --- shadowsocks/local.py | 4 +++- shadowsocks/server.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/shadowsocks/local.py b/shadowsocks/local.py index d2e6bcd..a8ac1cd 100755 --- a/shadowsocks/local.py +++ b/shadowsocks/local.py @@ -181,11 +181,13 @@ class ShadowSocksServer(object): "local_port":1080, "password":"barfoo!", "timeout":600, - "method":"table" + "method":"table", "IPv6": False } def serve_forever(self): + global SERVER, REMOTE_PORT, KEY, METHOD + self.set_logging() self.run_info() self.set_options() diff --git a/shadowsocks/server.py b/shadowsocks/server.py index ccbb50a..fade4ee 100755 --- a/shadowsocks/server.py +++ b/shadowsocks/server.py @@ -142,7 +142,7 @@ class ShadowSocksServer(object): "local_port":1080, "password":"barfoo!", "timeout":600, - "method":"table" + "method":"table", "IPv6": False }