|
@ -52,8 +52,7 @@ def print_exception(e): |
|
|
import traceback |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
traceback.print_exc() |
|
|
|
|
|
|
|
|
|
|
|
def __version(): |
|
|
def print_shadowsocks(): |
|
|
|
|
|
version_str = '' |
|
|
version_str = '' |
|
|
try: |
|
|
try: |
|
|
import pkg_resources |
|
|
import pkg_resources |
|
@ -64,37 +63,26 @@ def print_shadowsocks(): |
|
|
version_str = version.version() |
|
|
version_str = version.version() |
|
|
except Exception: |
|
|
except Exception: |
|
|
pass |
|
|
pass |
|
|
print('ShadowsocksR %s' % version_str) |
|
|
return version_str |
|
|
|
|
|
|
|
|
|
|
|
def print_shadowsocks(): |
|
|
|
|
|
print('ShadowsocksR %s' % __version()) |
|
|
|
|
|
|
|
|
def log_shadowsocks_version(): |
|
|
def log_shadowsocks_version(): |
|
|
version_str = '' |
|
|
logging.info('ShadowsocksR %s' % __version()) |
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
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' |
|
|
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): |
|
|
def check_config(config, is_local): |
|
|
if config.get('daemon', None) == 'stop': |
|
|
if config.get('daemon', None) == 'stop': |
|
@ -119,21 +107,21 @@ def check_config(config, is_local): |
|
|
config['server_port'] = int(config['server_port']) |
|
|
config['server_port'] = int(config['server_port']) |
|
|
|
|
|
|
|
|
if config.get('local_address', '') in [b'0.0.0.0']: |
|
|
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']: |
|
|
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'])) |
|
|
(to_str(config['server']), config['server_port'])) |
|
|
if (config.get('method', '') or '').lower() == 'table': |
|
|
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') |
|
|
'like AES-256-CFB') |
|
|
if (config.get('method', '') or '').lower() == 'rc4': |
|
|
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') |
|
|
'like AES-256-CFB') |
|
|
if config.get('timeout', 300) < 100: |
|
|
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'))) |
|
|
int(config.get('timeout'))) |
|
|
if config.get('timeout', 300) > 600: |
|
|
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'))) |
|
|
int(config.get('timeout'))) |
|
|
if config.get('password') in [b'mypassword']: |
|
|
if config.get('password') in [b'mypassword']: |
|
|
logging.error('DON\'T USE DEFAULT PASSWORD! Please change it in your ' |
|
|
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): |
|
|
def get_config(is_local): |
|
|
global verbose |
|
|
global verbose |
|
|
|
|
|
config = {} |
|
|
|
|
|
config_path = None |
|
|
logging.basicConfig(level=logging.INFO, |
|
|
logging.basicConfig(level=logging.INFO, |
|
|
format='%(levelname)-s: %(message)s') |
|
|
format='%(levelname)-s: %(message)s') |
|
|
if is_local: |
|
|
if is_local: |
|
@ -161,11 +150,22 @@ def get_config(is_local): |
|
|
longopts = ['help', 'fast-open', 'pid-file=', 'log-file=', 'workers=', |
|
|
longopts = ['help', 'fast-open', 'pid-file=', 'log-file=', 'workers=', |
|
|
'forbidden-ip=', 'user=', 'manager-address=', 'version'] |
|
|
'forbidden-ip=', 'user=', 'manager-address=', 'version'] |
|
|
try: |
|
|
try: |
|
|
config_path = find_config() |
|
|
|
|
|
optlist, args = getopt.getopt(sys.argv[1:], shortopts, longopts) |
|
|
optlist, args = getopt.getopt(sys.argv[1:], shortopts, longopts) |
|
|
for key, value in optlist: |
|
|
for key, value in optlist: |
|
|
if key == '-c': |
|
|
if key == '-c': |
|
|
config_path = value |
|
|
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: |
|
|
if config_path: |
|
|
logging.info('loading config from %s' % config_path) |
|
|
logging.info('loading config from %s' % config_path) |
|
@ -173,11 +173,9 @@ def get_config(is_local): |
|
|
try: |
|
|
try: |
|
|
config = parse_json_in_str(remove_comment(f.read().decode('utf8'))) |
|
|
config = parse_json_in_str(remove_comment(f.read().decode('utf8'))) |
|
|
except ValueError as e: |
|
|
except ValueError as e: |
|
|
logging.error('found an error in config.json: %s', |
|
|
logging.error('found an error in config.json: %s', str(e)) |
|
|
e.message) |
|
|
|
|
|
sys.exit(1) |
|
|
sys.exit(1) |
|
|
else: |
|
|
|
|
|
config = {} |
|
|
|
|
|
|
|
|
|
|
|
v_count = 0 |
|
|
v_count = 0 |
|
|
for key, value in optlist: |
|
|
for key, value in optlist: |
|
@ -217,15 +215,7 @@ def get_config(is_local): |
|
|
config['user'] = to_str(value) |
|
|
config['user'] = to_str(value) |
|
|
elif key == '--forbidden-ip': |
|
|
elif key == '--forbidden-ip': |
|
|
config['forbidden_ip'] = to_str(value) |
|
|
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': |
|
|
elif key == '-d': |
|
|
config['daemon'] = to_str(value) |
|
|
config['daemon'] = to_str(value) |
|
|
elif key == '--pid-file': |
|
|
elif key == '--pid-file': |
|
@ -235,6 +225,8 @@ def get_config(is_local): |
|
|
elif key == '-q': |
|
|
elif key == '-q': |
|
|
v_count -= 1 |
|
|
v_count -= 1 |
|
|
config['verbose'] = v_count |
|
|
config['verbose'] = v_count |
|
|
|
|
|
else: |
|
|
|
|
|
continue |
|
|
except getopt.GetoptError as e: |
|
|
except getopt.GetoptError as e: |
|
|
print(e, file=sys.stderr) |
|
|
print(e, file=sys.stderr) |
|
|
print_help(is_local) |
|
|
print_help(is_local) |
|
|