You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							75 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							75 lines
						
					
					
						
							2.3 KiB
						
					
					
				| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| # | |
| # Copyright 2012-2015 clowwindy | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may | |
| # not use this file except in compliance with the License. You may obtain | |
| # a copy of the License at | |
| # | |
| #     http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
| # License for the specific language governing permissions and limitations | |
| # under the License. | |
| 
 | |
| from __future__ import absolute_import, division, print_function, \ | |
|     with_statement | |
| 
 | |
| import sys | |
| import os | |
| import logging | |
| import signal | |
| 
 | |
| sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../')) | |
| from shadowsocks import utils, daemon, eventloop, tcprelay, udprelay, asyncdns | |
| 
 | |
| 
 | |
| def main(): | |
|     utils.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 = utils.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) | |
|         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: | |
|         logging.error(e) | |
|         if config['verbose']: | |
|             import traceback | |
|             traceback.print_exc() | |
|         sys.exit(1) | |
| 
 | |
| if __name__ == '__main__': | |
|     main()
 | |
| 
 |