def parse_options(): version = '' try: import pkg_resources version = pkg_resources.get_distribution('shadowsocks').version except: pass print 'shadowsocks %s' % version KEY = None METHOD = None IPv6 = False config_path = utils.find_config() try: optlist, args = getopt.getopt(sys.argv[1:], 's:p:k: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) try: f = open(config_path, 'rb') 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: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 except getopt.GetoptError: utils.print_server_help() sys.exit(2) return config
def main(): global config_server, config_server_port, config_method, config_fast_open, \ config_timeout logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') version = '' try: import pkg_resources version = pkg_resources.get_distribution('shadowsocks').version except: pass print 'shadowsocks %s' % version config_path = utils.find_config() try: optlist, args = getopt.getopt(sys.argv[1:], 's:p:k:m:c:t:', ['fast-open', 'workers:']) 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:p:k:m:c:t:', ['fast-open', 'workers=']) 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 == '-t': config['timeout'] = value elif key == '--fast-open': config['fast_open'] = True elif key == '--workers': config['workers'] = value except getopt.GetoptError: utils.print_server_help() sys.exit(2) config_server = config['server'] config_server_port = config['server_port'] config_key = config['password'] config_method = config.get('method', None) config_port_password = config.get('port_password', None) config_timeout = int(config.get('timeout', 300)) config_fast_open = config.get('fast_open', False) config_workers = config.get('workers', 1) if not config_key and not config_path: sys.exit('config not specified, please read ' 'https://github.com/clowwindy/shadowsocks') utils.check_config(config) if config_port_password: if config_server_port or config_key: logging.warn('warning: port_password should not be used with ' 'server_port and password. server_port and password ' 'will be ignored') else: config_port_password = {} config_port_password[str(config_server_port)] = config_key encrypt.init_table(config_key, config_method) addrs = socket.getaddrinfo(config_server, int(8387)) if not addrs: logging.error('cant resolve listen address') sys.exit(1) ThreadingTCPServer.address_family = addrs[0][0] tcp_servers = [] udp_servers = [] for port, key in config_port_password.items(): tcp_server = ThreadingTCPServer((config_server, int(port)), Socks5Server) tcp_server.key = key tcp_server.method = config_method tcp_server.timeout = int(config_timeout) logging.info("starting server at %s:%d" % tuple(tcp_server.server_address[:2])) tcp_servers.append(tcp_server) udp_server = udprelay.UDPRelay(config_server, int(port), None, None, key, config_method, int(config_timeout), False) udp_servers.append(udp_server) def run_server(): for tcp_server in tcp_servers: threading.Thread(target=tcp_server.serve_forever).start() for udp_server in udp_servers: udp_server.start() if int(config_workers) > 1: if os.name == 'posix': children = [] is_child = False for i in xrange(0, int(config_workers)): r = os.fork() if r == 0: logging.info('worker started') is_child = True run_server() break else: children.append(r) if not is_child: def handler(signum, frame): for pid in children: os.kill(pid, signum) os.waitpid(pid, 0) sys.exit() import signal signal.signal(signal.SIGTERM, handler) # master for tcp_server in tcp_servers: tcp_server.server_close() for udp_server in udp_servers: udp_server.close() for child in children: os.waitpid(child, 0) else: logging.warn('worker is only available on Unix/Linux') run_server() else: run_server()
def main(): global config_server, config_server_port, config_method, config_fast_open logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') version = '' try: import pkg_resources version = pkg_resources.get_distribution('shadowsocks').version except: pass print 'shadowsocks %s' % version config_path = utils.find_config() try: optlist, args = getopt.getopt(sys.argv[1:], 's:p:k:m:c:', ['fast-open']) 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:p:k:m:c:', ['fast-open']) 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 == '--fast-open': config['fast_open'] = True except getopt.GetoptError: utils.print_server_help() sys.exit(2) config_server = config['server'] config_server_port = config['server_port'] config_key = config['password'] config_method = config.get('method', None) config_port_password = config.get('port_password', None) config_timeout = config.get('timeout', 600) config_fast_open = config.get('fast_open', False) if not config_key and not config_path: sys.exit('config not specified, please read ' 'https://github.com/clowwindy/shadowsocks') utils.check_config(config) if config_port_password: if config_server_port or config_key: logging.warn('warning: port_password should not be used with ' 'server_port and password. server_port and password ' 'will be ignored') else: config_port_password = {} config_port_password[str(config_server_port)] = config_key encrypt.init_table(config_key, config_method) addrs = socket.getaddrinfo(config_server, int(8387)) if not addrs: logging.error('cant resolve listen address') sys.exit(1) ThreadingTCPServer.address_family = addrs[0][0] for port, key in config_port_password.items(): server = ThreadingTCPServer((config_server, int(port)), Socks5Server) server.key, server.method, server.timeout = key, config_method,\ int(config_timeout) logging.info("starting server at %s:%d" % tuple(server.server_address[:2])) threading.Thread(target=server.serve_forever).start() udprelay.UDPRelay(config_server, int(port), None, None, key, config_method, int(config_timeout), False).start()
def main(): global config_server, config_server_port, config_method, config_fast_open, \ config_timeout logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') version = '' try: import pkg_resources version = pkg_resources.get_distribution('shadowsocks').version except: pass print 'shadowsocks %s' % version config_path = utils.find_config() try: optlist, args = getopt.getopt(sys.argv[1:], 's:p:k:m:c:t:', ['fast-open', 'workers:']) 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:p:k:m:c:t:', ['fast-open', 'workers=']) 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 == '-t': config['timeout'] = value elif key == '--fast-open': config['fast_open'] = True elif key == '--workers': config['workers'] = value except getopt.GetoptError: utils.print_server_help() sys.exit(2) config_server = config['server'] config_server_port = config['server_port'] config_key = config['password'] config_method = config.get('method', None) config_port_password = config.get('port_password', None) config_timeout = int(config.get('timeout', 300)) config_fast_open = config.get('fast_open', False) config_workers = config.get('workers', 1) if not config_key and not config_path: sys.exit('config not specified, please read ' 'https://github.com/clowwindy/shadowsocks') utils.check_config(config) if config_port_password: if config_server_port or config_key: logging.warn('warning: port_password should not be used with ' 'server_port and password. server_port and password ' 'will be ignored') else: config_port_password = {} config_port_password[str(config_server_port)] = config_key encrypt.init_table(config_key, config_method) addrs = socket.getaddrinfo(config_server, int(8387)) if not addrs: logging.error('cant resolve listen address') sys.exit(1) ThreadingTCPServer.address_family = addrs[0][0] tcp_servers = [] udp_servers = [] for port, key in config_port_password.items(): tcp_server = ThreadingTCPServer((config_server, int(port)), Socks5Server) tcp_server.key = key tcp_server.method = config_method tcp_server.timeout = int(config_timeout) logging.info("starting server at %s:%d" % tuple(tcp_server.server_address[:2])) tcp_servers.append(tcp_server) udp_server = udprelay.UDPRelay(config_server, int(port), None, None, key, config_method, int(config_timeout), False) udp_servers.append(udp_server) def run_server(): for tcp_server in tcp_servers: threading.Thread(target=tcp_server.serve_forever).start() for udp_server in udp_servers: udp_server.start() if int(config_workers) > 1: if os.name == 'posix': children = [] is_child = False for i in xrange(0, int(config_workers)): r = os.fork() if r == 0: logging.info('worker started') is_child = True run_server() break else: children.append(r) if not is_child: def handler(signum, frame): for pid in children: os.kill(pid, signum) os.waitpid(pid, 0) sys.exit() import signal signal.signal(signal.SIGTERM, handler) # master for tcp_server in tcp_servers: tcp_server.server_close() for udp_server in udp_servers: udp_server.close() for child in children: os.waitpid(child, 0) else: logging.warn('worker is only available on Unix/Linux') run_server() else: run_server()
def main(): logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') version = '' try: import pkg_resources version = pkg_resources.get_distribution('shadowsocks').version except: pass print 'shadowsocks %s' % version KEY = None METHOD = None IPv6 = False config_path = utils.find_config() try: optlist, args = getopt.getopt(sys.argv[1:], 's:p:k: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) logging.info('loading config from %s' % config_path) else: config = {} 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 except getopt.GetoptError: utils.print_server_help() sys.exit(2) 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') 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()