def do_request(self, endpoint, data=None): url = config.API_URL.rstrip('/') + endpoint timeout = 15 headers = {'node-token': config.NODE_TOKEN} if data is None: r = requests.get(url, headers=headers, timeout=timeout) else: r = requests.post(url, json=data, headers=headers, timeout=timeout) return shell.parse_json_in_str(r.text)
def _parse_command(self, data): # commands: # add: {'server_port': 8000, 'password': '******'} # remove: {'server_port': 8000'} data = common.to_str(data) parts = data.split(':', 1) if len(parts) < 2: return data, None command, config_json = parts try: config = shell.parse_json_in_str(config_json) return command, config except Exception as e: logging.error(e) return None
def _parse_command(self, data): # commands: # add: {"server_port": 8000, "password": "******"} # remove: {"server_port": 8000"} data = common.to_str(data) parts = data.split(':', 1) if len(parts) < 2: return data, None command, config_json = parts try: config = shell.parse_json_in_str(config_json) return command, config except Exception as e: logging.error(e) return None
def _parse_command(self, data): # commands: # add: {"server_port": 8000, "password": "******"} # remove: {"server_port": 8000"} data = common.to_str(data) parts = data.split(':', 1) if len(parts) < 2: return data, None command, config_json = parts try: config = shell.parse_json_in_str(config_json) if 'method' in config: config['method'] = common.to_str(config['method']) return command, config except Exception as e: logging.error(e) return None
def ssr(run): config = {} from shadowsocks import local if run: file_path = run else: file_path = 'ssr.json' with open(file_path, 'rb') as f: try: config = parse_json_in_str(remove_comment(f.read().decode('utf8'))) config['password'] = to_bytes(config.get('password', b'')) config['method'] = to_str(config.get('method', 'aes-256-cfb')) config['protocol'] = to_str(config.get('protocol', 'origin')) config['protocol_param'] = to_str(config.get('protocol_param', '')) config['obfs'] = to_str(config.get('obfs', 'plain')) config['obfs_param'] = to_str(config.get('obfs_param', '')) config['port_password'] = config.get('port_password', None) config['additional_ports'] = config.get('additional_ports', {}) config['additional_ports_only'] = config.get( 'additional_ports_only', False) config['timeout'] = int(config.get('timeout', 300)) config['udp_timeout'] = int(config.get('udp_timeout', 120)) config['udp_cache'] = int(config.get('udp_cache', 64)) config['fast_open'] = config.get('fast_open', False) config['workers'] = config.get('workers', 1) config['pid-file'] = config.get('pid-file', '/var/run/shadowsocksr.pid') config['log-file'] = config.get('log-file', '/var/log/shadowsocksr.log') config['verbose'] = config.get('verbose', False) config['connect_verbose_info'] = config.get( 'connect_verbose_info', 0) config['local_address'] = to_str( config.get('local_address', '127.0.0.1')) config['local_port'] = config.get('local_port', 1080) except Exception as e: with open('kiyo.log', 'a', encoding='utf-8') as f: f.write( time.strftime("%Y-%m-%d %H:%M:%S") + ' ' + str(e) + '\n') f.close() local.main(config=config)
def new_runSS(): """An effective way to start shadowsocks server with all the outputs of it redirected into a log file named `shadowsocks.log` under `~/.sspy-mgr/logs`. """ import logging fileHandler = createLoggerFile('shadowsocks') logger = logging.getLogger() logger.addHandler(fileHandler) logger.setLevel(logging.INFO) from shadowsocks import shell, daemon, eventloop, manager logger.info('Start running shadowsock server') shell.check_python() logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') config_path = ssConfigFile() logger.info(tr('Loading configuration from {}').format(config_path)) with open(config_path, 'rb') as f: try: config = shell.parse_json_in_str(f.read().decode('utf8')) except ValueError as e: logger.error("found an error in config.json: {}".format(e.message)) sys.exit(1) config['manager_address'] = ssAddr(True) config['port_password'] = {} config['server_port'] = 0 config['verbose'] = 2 config['method'] = 'aes-256-cfb' daemon.daemon_exec(config) config['port_password'] = {} # server_port = config['server_port'] # if type(server_port) == list: # for a_server_port in server_port: # config['port_password'][a_server_port] = config['password'] # else: # config['port_password'][str(server_port)] = config['password'] logger.info('entering manager mode') manager.run(config)
def new_runSS(): import logging fileHandler = createLoggerFile('shadowsocks') logger = logging.getLogger() logger.addHandler(fileHandler) logger.setLevel(logging.INFO) from shadowsocks import shell, daemon, eventloop, manager logger.info('Start running shadowsock server') shell.check_python() logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') config_path = ssConfigFile() logger.info('loading config from %s' % config_path) with open(config_path, 'rb') as f: try: config = shell.parse_json_in_str(f.read().decode('utf8')) except ValueError as e: logger.error('found an error in config.json: %s', e.message) sys.exit(1) config['manager_address'] = ssAddr(True) config['port_password'] = {} config['server_port'] = 0 config['verbose'] = 2 config['method'] = 'aes-256-cfb' daemon.daemon_exec(config) config['port_password'] = {} # server_port = config['server_port'] # if type(server_port) == list: # for a_server_port in server_port: # config['port_password'][a_server_port] = config['password'] # else: # config['port_password'][str(server_port)] = config['password'] logger.info('entering manager mode') manager.run(config)
def get_ssr_config(is_local, config_path, config={}): if config_path: with open(config_path, 'rb') as f: try: config = shell.parse_json_in_str(f.read().decode('utf8')) except ValueError as e: sys.exit(1) else: config = {} config['password'] = shell.to_bytes(config.get('password', b'')) config['method'] = shell.to_str(config.get('method', 'aes-256-cfb')) config['port_password'] = config.get('port_password', None) config['timeout'] = int(config.get('timeout', 300)) config['fast_open'] = config.get('fast_open', False) config['workers'] = config.get('workers', 1) config['pid-file'] = config.get('pid-file', '/var/run/shadowsocks.pid') config['log-file'] = config.get('log-file', '/var/log/shadowsocks.log') config['verbose'] = config.get('verbose', False) config['local_address'] = shell.to_str(config.get('local_address', '127.0.0.1')) config['local_port'] = config.get('local_port', 1080) if is_local: if config.get('server', None) is None: shell.print_local_help() sys.exit(2) else: config['server'] = shell.to_str(config['server']) else: config['server'] = shell.to_str(config.get('server', '0.0.0.0')) try: config['forbidden_ip'] = \ shell.IPNetwork(config.get('forbidden_ip', '127.0.0.0/8,::1/128')) except Exception as e: sys.exit(2) config['server_port'] = config.get('server_port', 8388) shell.check_config(config, is_local) return config
def _parse_command(self, data): """ 从接收数据中获取控制指令命令和配置信息 :param data: 包含控制指令和配置信息的数据 :return: 如果数据长度少于2,直接返回原数据;如果数据长度等于2,返回command和config """ # commands: # add: {"server_port": 8000, "password": "******"} # remove: {"server_port": 8000"} data = common.to_str(data) parts = data.split(':', 1) if len(parts) < 2: return data, None command, config_json = parts try: config = shell.parse_json_in_str(config_json) return command, config except Exception as e: logging.error(e) return None
def test(): import time import threading import struct from shadowsocks import cryptor logging.basicConfig(level=5, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') enc = [] eventloop.TIMEOUT_PRECISION = 1 def run_server(): config = { 'server': '127.0.0.1', 'local_port': 1081, 'port_password': { '8381': 'foobar1', '8382': 'foobar2' }, 'method': 'aes-256-cfb', 'manager_address': '127.0.0.1:6001', 'timeout': 60, 'fast_open': False, 'verbose': 2 } manager = Manager(config) enc.append(manager) manager.run() t = threading.Thread(target=run_server) t.start() time.sleep(1) manager = enc[0] cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) cli.connect(('127.0.0.1', 6001)) # test add and remove time.sleep(1) cli.send(b'add: {"server_port":7001, "password":"******"}') time.sleep(1) assert 7001 in manager._relays data, addr = cli.recvfrom(1506) assert b'ok' in data cli.send(b'remove: {"server_port":8381}') time.sleep(1) assert 8381 not in manager._relays data, addr = cli.recvfrom(1506) assert b'ok' in data logging.info('add and remove test passed') # test statistics for TCP header = common.pack_addr(b'google.com') + struct.pack('>H', 80) data = cryptor.encrypt_all(b'asdfadsfasdf', 'aes-256-cfb', header + b'GET /\r\n\r\n') tcp_cli = socket.socket() tcp_cli.connect(('127.0.0.1', 7001)) tcp_cli.send(data) tcp_cli.recv(4096) tcp_cli.close() data, addr = cli.recvfrom(1506) data = common.to_str(data) assert data.startswith('stat: ') data = data.split('stat:')[1] stats = shell.parse_json_in_str(data) assert '7001' in stats logging.info('TCP statistics test passed') # test statistics for UDP header = common.pack_addr(b'127.0.0.1') + struct.pack('>H', 80) data = cryptor.encrypt_all(b'foobar2', 'aes-256-cfb', header + b'test') udp_cli = socket.socket(type=socket.SOCK_DGRAM) udp_cli.sendto(data.encode(), ('127.0.0.1', 8382)) tcp_cli.close() data, addr = cli.recvfrom(1506) data = common.to_str(data) assert data.startswith('stat: ') data = data.split('stat:')[1] stats = json.loads(data) assert '8382' in stats logging.info('UDP statistics test passed') manager._loop.stop() t.join()
def test(): import time import threading import struct from shadowsocks import encrypt logging.basicConfig(level=5, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') enc = [] eventloop.TIMEOUT_PRECISION = 1 def run_server(): config = { 'server': '127.0.0.1', 'local_port': 1081, 'port_password': { '8381': 'foobar1', '8382': 'foobar2' }, 'method': 'aes-256-cfb', 'manager_address': '127.0.0.1:6001', 'timeout': 60, 'fast_open': False, 'verbose': 2 } manager = Manager(config) enc.append(manager) manager.run() t = threading.Thread(target=run_server) t.start() time.sleep(1) manager = enc[0] cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) cli.connect(('127.0.0.1', 6001)) # test add and remove time.sleep(1) cli.send(b'add: {"server_port":7001, "password":"******"}') time.sleep(1) assert 7001 in manager._relays data, addr = cli.recvfrom(1506) assert b'ok' in data cli.send(b'remove: {"server_port":8381}') time.sleep(1) assert 8381 not in manager._relays data, addr = cli.recvfrom(1506) assert b'ok' in data logging.info('add and remove test passed') # test statistics for TCP header = common.pack_addr(b'google.com') + struct.pack('>H', 80) data = encrypt.encrypt_all(b'asdfadsfasdf', 'aes-256-cfb', 1, header + b'GET /\r\n\r\n') tcp_cli = socket.socket() tcp_cli.connect(('127.0.0.1', 7001)) tcp_cli.send(data) tcp_cli.recv(4096) tcp_cli.close() data, addr = cli.recvfrom(1506) data = common.to_str(data) assert data.startswith('stat: ') data = data.split('stat:')[1] stats = shell.parse_json_in_str(data) assert '7001' in stats logging.info('TCP statistics test passed') # test statistics for UDP header = common.pack_addr(b'127.0.0.1') + struct.pack('>H', 80) data = encrypt.encrypt_all(b'foobar2', 'aes-256-cfb', 1, header + b'test') udp_cli = socket.socket(type=socket.SOCK_DGRAM) udp_cli.sendto(data, ('127.0.0.1', 8382)) tcp_cli.close() data, addr = cli.recvfrom(1506) data = common.to_str(data) assert data.startswith('stat: ') data = data.split('stat:')[1] stats = json.loads(data) assert '8382' in stats logging.info('UDP statistics test passed') manager._loop.stop() t.join()