| 29 | |
| 30 | |
| 31 | def main(): |
| 32 | shell.check_python() |
| 33 | |
| 34 | config = shell.get_config(False) |
| 35 | |
| 36 | daemon.daemon_exec(config) |
| 37 | |
| 38 | if config['port_password']: |
| 39 | if config['password']: |
| 40 | logging.warn('warning: port_password should not be used with ' |
| 41 | 'server_port and password. server_port and password ' |
| 42 | 'will be ignored') |
| 43 | else: |
| 44 | config['port_password'] = {} |
| 45 | server_port = config['server_port'] |
| 46 | if type(server_port) == list: |
| 47 | for a_server_port in server_port: |
| 48 | config['port_password'][a_server_port] = config['password'] |
| 49 | else: |
| 50 | config['port_password'][str(server_port)] = config['password'] |
| 51 | |
| 52 | if config.get('manager_address', 0): |
| 53 | logging.info('entering manager mode') |
| 54 | manager.run(config) |
| 55 | return |
| 56 | |
| 57 | tcp_servers = [] |
| 58 | udp_servers = [] |
| 59 | |
| 60 | if 'dns_server' in config: # allow override settings in resolv.conf |
| 61 | dns_resolver = asyncdns.DNSResolver(config['dns_server'], |
| 62 | config['prefer_ipv6']) |
| 63 | else: |
| 64 | dns_resolver = asyncdns.DNSResolver(prefer_ipv6=config['prefer_ipv6']) |
| 65 | |
| 66 | port_password = config['port_password'] |
| 67 | del config['port_password'] |
| 68 | for port, password in port_password.items(): |
| 69 | a_config = config.copy() |
| 70 | a_config['server_port'] = int(port) |
| 71 | a_config['password'] = password |
| 72 | logging.info("starting server at %s:%d" % |
| 73 | (a_config['server'], int(port))) |
| 74 | tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False)) |
| 75 | udp_servers.append(udprelay.UDPRelay(a_config, dns_resolver, False)) |
| 76 | |
| 77 | def run_server(): |
| 78 | def child_handler(signum, _): |
| 79 | logging.warn('received SIGQUIT, doing graceful shutting down..') |
| 80 | list(map(lambda s: s.close(next_tick=True), |
| 81 | tcp_servers + udp_servers)) |
| 82 | signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), |
| 83 | child_handler) |
| 84 | |
| 85 | def int_handler(signum, _): |
| 86 | sys.exit(1) |
| 87 | signal.signal(signal.SIGINT, int_handler) |
| 88 | |