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)
Beispiel #2
0
 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
Beispiel #3
0
 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
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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()
Beispiel #11
0
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()