def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') # 关闭所有的socket,lambda表达式一句话搞定 # map(function, sequence[, sequence, ...]) -> list # Return a list of the results of applying the function to the items of the argument sequence(s). list( map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) # 把所有的监听端口添加到事件循环loop中,lambda表达式一句话搞定 list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') list(map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) """ getattr(object, name[, default]) 如果 siganl.SIGQUIT 不存在,即注册 SIGTERM 事件 SIGTERM 终止进程,但终止前会允许 handler 被执行,SIGKILL 不会 SIGQUIT 在 SIGTERM 的基础上,还生成了一份 core dump 文件记录了进程信息 http://programmergamer.blogspot.jp/2013/05/clarification-on-sigint-sigterm-sigkill.html """ signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) # 中断处理函数,如果接受到键盘中断信号,则异常退出 def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: # 定义新事件循环 loop = eventloop.EventLoop() # 添加 dns 解析器到事件循环中 dns_resolver.add_to_loop(loop) # 批量地将所有 tcp_server 和 udp_server 加入事件循环中 list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) # 使守护进程以设置中 user 的名义执行 daemon.set_user(config.get('user', None)) # 启动事件循环 loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') list( map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) # 观察者模式 # epoll/kqueue/select观察着socket的状态,当socket状态发生变化时 # 调用消息处理函数 # 将已经打开的socket注册到EventLoop侦听相应的事件 #print(list(map(lambda x: x * 2 + 10, foo))) # [14, 46, 28, 54, 44, 58, 26, 34, 64] # print ([x * 2 + 10 for x in foo]) # foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) # 启动事件循环,等待shadowsocks客户端的连接 loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def deployProxy(configs, index): config = configs[index] try: logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) udp_server = udprelay.UDPRelay(config, dns_resolver, True) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: raise
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') list( map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') list(map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) pid = os.getpid(); logging.info("pid-file=%s,pid=%d", config['pid-file'], pid); try: with open(config['pid-file'], 'w') as f: f.write(str(pid)); f.close(); except IOError: logging.warn('error on write pid to pid-file..%s, %d', config['pid-file'], pid) sys.exit(1) try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') # map(function, sequence[, sequence, ...]) -> list 将function函数作用到 # sequence中的每一个元素,也就是关掉上面打开的所有的socket list( map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) # 注册SIGQUIT或SIGTERM的信号处理函数,Windows不支持SIGQUIT而Linux支持,所以为了 # 跨平台兼容,此处使用了getattr函数 # 在调用exec前,子进程会继承父进程注册的信号处理action,这里在子进程中重新注册 # 了SIGTERM信号的处理action,不出意外,signal函数会返回上一次注册的action signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) # 为SIGINT注册信号处理函数 def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: loop = eventloop.EventLoop() # 将dns以及之前tcp, udp的socket都注册到epoll事件表中 dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') list(map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) def hup_handler(signum, _): users = shell.get_user_dict(config['users-file']) for tcp_server in tcp_servers: tcp_server.set_users(users) signal.signal(signal.SIGHUP, hup_handler) try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') list(map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: logging.error(e) if config['verbose']: import traceback traceback.print_exc() sys.exit(1)
def main(): shell.check_python() # 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) config = shell.get_config(True) daemon.daemon_exec(config) logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) udp_server = udprelay.UDPRelay(config, dns_resolver, True) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) loop.run()
def main(): shell.check_python() config = shell.get_config(False) daemon.daemon_exec(config) daemon.set_user(config.get('user', None)) thread.start_new_thread(db_transfer.DbTransfer.thread_db, ()) while True: time.sleep(99999)
def main(): # Python 2.6+ or Python3.3+ shell.check_python() # 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) config = shell.get_config(True) if not config.get('dns_ipv6', False): asyncdns.IPV6_CONNECTION_SUPPORT = False # only daemon.daemon_exec(config) logging.info( "local start with protocol[%s] password [%s] method [%s] obfs [%s] obfs_param [%s]" % (config['protocol'], config['password'], config['method'], config['obfs'], config['obfs_param'])) try: logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) # DNS分解器 dns_resolver = asyncdns.DNSResolver() # TCP服务 tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) # UDP服务 udp_server = udprelay.UDPRelay(config, dns_resolver, True) # 将DNS服务、TCP服务、UDP服务加入事件循环 loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) # 预设信号处理函数,接收到正常的退出信号 signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) # SIGINT是键盘ctrl + c signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def main(): shell.check_python() # 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) config = shell.get_config(True) daemon.daemon_exec(config) try: logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(config, dns_resolver, True, stat_callback=stat_handler) a_config = config.copy() if a_config.get('port_password', None): a_config['server_port'] = random.choice( a_config['port_password'].keys()) a_config['password'] = a_config['port_password']\ [a_config['server_port']] udp_server = udprelay.UDPRelay(a_config, dns_resolver, True, stat_callback=stat_handler) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) t = threading.Thread(target=monitor, args=(), name='monitor') t.daemon = True t.start() loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def run_server(): """ 服务器运行 :return: None """ def child_handler(signum, _): """ 子程序要求关闭 :param signum: 信号值 :param _: 不明 :return: None """ logging.warn('received SIGQUIT, doing graceful shutting down..') list( map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): """ 强制退出程序,意义不明 :param signum: 信号值 :param _: 不明 :return: None """ sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: loop = eventloop.EventLoop() # 用addtoloop把dnsresolver添加到eventloop里,当DNSResolver对应的socket有dns解析结果可以读取的时候,eventloop会自动调用其handle_event方法将就绪的socket递给DNSResolver,DNSResolver就可以从其中读取dns应答数据了。 dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def main(): shell.check_python() # 判断python版本 # fix py2exe # hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。 if hasattr(sys, "frozen") and sys.frozen in \ ("windows_exe", "console_exe"): # sys.executable python可执行文件的绝对路径 # os.path.abspath(path) 返回绝对路径 # os.path.dirname(path) 返回文件路径 # os.chdir() 用于改变当前工作目录到指定的路径 p = os.path.dirname(os.path.abspath(sys.executable)) os.chdir(p) # 获取配置字典,包含每个配置项的具体配置值 config = shell.get_config(True) # 根据配置文件当中的关键字daemon决定程序是启动/停止/重启 daemon.daemon_exec(config) try: logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) udp_server = udprelay.UDPRelay(config, dns_resolver, True) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def main(): shell.check_python() # 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) config = shell.get_config(True) if not config.get('dns_ipv6', False): asyncdns.IPV6_CONNECTION_SUPPORT = False daemon.daemon_exec(config) logging.info("local start with protocol[%s] password [%s] method [%s] obfs [%s] obfs_param [%s]" % (config['protocol'], config['password'], config['method'], config['obfs'], config['obfs_param'])) try: logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) udp_server = udprelay.UDPRelay(config, dns_resolver, True) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def main(): # 检查Python版本是否符合要求 shell.check_python() # 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) config = shell.get_config(True) daemon.daemon_exec(config) try: logging.info("starting local at %s:%d" % (config["local_address"], config["local_port"])) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) udp_server = udprelay.UDPRelay(config, dns_resolver, True) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn("received SIGQUIT, doing graceful shutting down..") tcp_server.close(next_tick=True) udp_server.close(next_tick=True) # 注册信号事件,用于结束 local 程序 signal.signal(getattr(signal, "SIGQUIT", signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) # SIGINT external interrupt, usually initiated by the user signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get("user", None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
def main(): # 检查 python 版本 shell.check_python() # 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) config = shell.get_config(True) # 加载配置文件 daemon.daemon_exec(config) # 读取配置文件是否开启进程守护, 仅在UNIX ,Linux 上有效 try: logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver() # 创建dns 查询对象 tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) # 创建 TCP 代理转发对象 udp_server = udprelay.UDPRelay(config, dns_resolver, True) # 创建 UDP 代理转发对象 loop = eventloop.EventLoop() # 创建事件处理对象 # 将dns查询、tcp代理方式转发、udp代理方式转发绑定到事件循环 dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) # "Ctrl + C" 中断指令 def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) loop.run() # 开启事件循环 except Exception as e: shell.print_exception(e) sys.exit(1)
def stopOnUnix(self, ssrDict, *args): ssrDict['daemon'] = 'stop' ssrDict['local_address'] = args[0] ssrDict['local_port'] = args[1] ssrDict['timeout'] = args[2] ssrDict['workers'] = args[3] ssrDict['pid-file'] = args[4] ssrDict['log-file'] = args[5] if not ssrDict.get('dns_ipv6', False): asyncdns.IPV6_CONNECTION_SUPPORT = False try: daemon.daemon_exec(ssrDict) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(ssrDict, dns_resolver, True) udp_server = udprelay.UDPRelay(ssrDict, dns_resolver, True) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logger.info('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): logger.info("ShadowsocksR is stop") sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(ssrDict.get('user', None)) logger.info('ShadowsocksR is start on {0}:{1}'.format(args[0], args[1])) loop.run() except Exception as e: logger.error(e) sys.exit(1)
def daemon_embeded(config): if hasattr(sys, "frozen") and sys.frozen in \ ("windows_exe", "console_exe"): p = os.path.dirname(os.path.abspath(sys.executable)) os.chdir(p) #config = shell.get_config(True) print(config) daemon.daemon_exec(config) logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver() tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) udp_server = udprelay.UDPRelay(config, dns_resolver, True) loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) daemon.set_user(config.get('user', None)) loop.run()
def run_server(): def child_handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') list(map(lambda s: s.close(next_tick=True), tcp_servers + udp_servers)) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), child_handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) try: loop = eventloop.EventLoop() dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) httpApiThread = httpapi.HttpApiThread(loop, dns_resolver) httpApiThread.start() loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)
#exit child process #### NOTICE #### #os.waitpid() will not get exit code using sys.exit(), we need to use os._exit() # sys.exit(0) os._exit(0) else: logging.warn("Invalid action:%s"%action) except Exception,e: logging.warn("Invalid msg:%s, %s"%(msg, e)) try: agent_.register_command_handler(msg_handler)#will create a thread to recv commands dns_resolver.add_to_loop(loop) list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers)) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: logging.error(e) sys.exit(1) def main(): global tcp_servers,udp_servers, dns_resolver, workers, worker_id init_config() need_restart = False if workers > 1: if os.name == 'posix': children = [] is_child = False for i in range(0, workers):
def main(): shell.check_python() # 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) config = shell.get_config(True) logging.warn('!' * 30) if config.has_key('server_info'): if config['server_info'].has_key(config['server']): logging.info( "OK.. [ (ip: %s) (server_port: %s) (password: %s) (server_info: %s) (method: %s) ]" % (config['server'], config['server_port'], config['password'], config['server_info']["%s" % config['server']], config['method'])) else: logging.info( "OK.. [ (ip: %s) (server_port: %s) (password: %s) (method: %s) ]" % (config['server'], config['server_port'], config['password'], config['method'])) else: logging.info( "OK.. [ (ip: %s) (server_port: %s) (password: %s) (method: %s) ]" % (config['server'], config['server_port'], config['password'], config['method'])) logging.warn('!' * 30) time.sleep(1) daemon.daemon_exec(config) try: logging.info("starting local at %s:%d" % (config['local_address'], config['local_port'])) dns_resolver = asyncdns.DNSResolver(config) tcp_server = tcprelay.TCPRelay(config, dns_resolver, True) udp_server = udprelay.UDPRelay(config, dns_resolver, True) loop = eventloop.EventLoop(config) dns_resolver.add_to_loop(loop) tcp_server.add_to_loop(loop) udp_server.add_to_loop(loop) def handler(signum, _): logging.warn('received SIGQUIT, doing graceful shutting down..') tcp_server.close(next_tick=True) udp_server.close(next_tick=True) signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler) def int_handler(signum, _): sys.exit(1) signal.signal(signal.SIGINT, int_handler) daemon.set_user(config.get('user', None)) loop.run() except Exception as e: shell.print_exception(e) sys.exit(1)