diff --git a/shadowsocks/shell.py b/shadowsocks/shell.py old mode 100644 new mode 100755 index 755263d..2fb268a --- a/shadowsocks/shell.py +++ b/shadowsocks/shell.py @@ -52,8 +52,7 @@ def print_exception(e): import traceback traceback.print_exc() - -def print_shadowsocks(): +def __version(): version_str = '' try: import pkg_resources @@ -64,37 +63,26 @@ def print_shadowsocks(): version_str = version.version() except Exception: pass - print('ShadowsocksR %s' % version_str) + return version_str + +def print_shadowsocks(): + print('ShadowsocksR %s' % __version()) def log_shadowsocks_version(): - version_str = '' - try: - import pkg_resources - version_str = pkg_resources.get_distribution('shadowsocks').version - except Exception: - try: - from shadowsocks import version - version_str = version.version() - except Exception: - pass - logging.info('ShadowsocksR %s' % version_str) + logging.info('ShadowsocksR %s' % __version()) -def find_config(): - config_path = 'user-config.json' - if os.path.exists(config_path): - return config_path - config_path = os.path.join(os.path.dirname(__file__), '../', 'user-config.json') - if os.path.exists(config_path): - return config_path +def find_config(): + user_config_path = 'user-config.json' config_path = 'config.json' - if os.path.exists(config_path): - return config_path - config_path = os.path.join(os.path.dirname(__file__), '../', 'config.json') - if os.path.exists(config_path): - return config_path - return None + def sub_find(file_name): + if os.path.exists(file_name): + return file_name + file_name = os.path.join(os.path.abspath('..'), file_name) + return file_name if os.path.exists(file_name) else None + + return sub_find(user_config_path) or sub_find(config_path) def check_config(config, is_local): if config.get('daemon', None) == 'stop': @@ -119,21 +107,21 @@ def check_config(config, is_local): config['server_port'] = int(config['server_port']) if config.get('local_address', '') in [b'0.0.0.0']: - logging.warn('warning: local set to listen on 0.0.0.0, it\'s not safe') + logging.warning('warning: local set to listen on 0.0.0.0, it\'s not safe') if config.get('server', '') in ['127.0.0.1', 'localhost']: - logging.warn('warning: server set to listen on %s:%s, are you sure?' % + logging.warning('warning: server set to listen on %s:%s, are you sure?' % (to_str(config['server']), config['server_port'])) if (config.get('method', '') or '').lower() == 'table': - logging.warn('warning: table is not safe; please use a safer cipher, ' + logging.warning('warning: table is not safe; please use a safer cipher, ' 'like AES-256-CFB') if (config.get('method', '') or '').lower() == 'rc4': - logging.warn('warning: RC4 is not safe; please use a safer cipher, ' + logging.warning('warning: RC4 is not safe; please use a safer cipher, ' 'like AES-256-CFB') if config.get('timeout', 300) < 100: - logging.warn('warning: your timeout %d seems too short' % + logging.warning('warning: your timeout %d seems too short' % int(config.get('timeout'))) if config.get('timeout', 300) > 600: - logging.warn('warning: your timeout %d seems too long' % + logging.warning('warning: your timeout %d seems too long' % int(config.get('timeout'))) if config.get('password') in [b'mypassword']: logging.error('DON\'T USE DEFAULT PASSWORD! Please change it in your ' @@ -149,7 +137,8 @@ def check_config(config, is_local): def get_config(is_local): global verbose - + config = {} + config_path = None logging.basicConfig(level=logging.INFO, format='%(levelname)-s: %(message)s') if is_local: @@ -161,11 +150,22 @@ def get_config(is_local): longopts = ['help', 'fast-open', 'pid-file=', 'log-file=', 'workers=', 'forbidden-ip=', 'user=', 'manager-address=', 'version'] try: - config_path = find_config() optlist, args = getopt.getopt(sys.argv[1:], shortopts, longopts) for key, value in optlist: if key == '-c': config_path = value + elif key in ('-h', '--help'): + print_help(is_local) + sys.exit(0) + elif key == '--version': + print_shadowsocks() + sys.exit(0) + else: + continue + + if config_path is None: + config_path = find_config() + if config_path: logging.info('loading config from %s' % config_path) @@ -173,11 +173,9 @@ def get_config(is_local): try: config = parse_json_in_str(remove_comment(f.read().decode('utf8'))) except ValueError as e: - logging.error('found an error in config.json: %s', - e.message) + logging.error('found an error in config.json: %s', str(e)) sys.exit(1) - else: - config = {} + v_count = 0 for key, value in optlist: @@ -217,15 +215,7 @@ def get_config(is_local): config['user'] = to_str(value) elif key == '--forbidden-ip': config['forbidden_ip'] = to_str(value) - elif key in ('-h', '--help'): - if is_local: - print_local_help() - else: - print_server_help() - sys.exit(0) - elif key == '--version': - print_shadowsocks() - sys.exit(0) + elif key == '-d': config['daemon'] = to_str(value) elif key == '--pid-file': @@ -235,6 +225,8 @@ def get_config(is_local): elif key == '-q': v_count -= 1 config['verbose'] = v_count + else: + continue except getopt.GetoptError as e: print(e, file=sys.stderr) print_help(is_local)