#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import json import itertools from Builder import Hysteria from Utils.Logger import logger from Utils.Tester import Settings from Utils.Process import Process from Utils.Constant import hysteriaProtocols from Utils.Common import hostFormat, genFlag, getAvailablePort def loadServer(configFile: str, hysteriaConfig: dict) -> Process: serverFile = os.path.join(Settings['workDir'], configFile) return Process(Settings['workDir'], cmd = ['hysteria', '-c', serverFile, 'server'], file = { 'path': serverFile, 'content': json.dumps(hysteriaConfig) }, isStart = False) def loadClient(configFile: str, proxyInfo: dict, socksInfo: dict) -> Process: clientFile = os.path.join(Settings['workDir'], configFile) hysteriaCommand, hysteriaConfig, _ = Hysteria.load(proxyInfo, socksInfo, clientFile) return Process(Settings['workDir'], cmd = hysteriaCommand, file = { 'path': clientFile, 'content': hysteriaConfig }, isStart = False) def loadTest(protocol: str, isObfs: bool, isAuth: bool) -> dict: proxyInfo = { 'type': 'hysteria', 'server': Settings['serverBind'], 'port': getAvailablePort(), 'protocol': protocol, 'obfs': None, 'passwd': None, 'up': 10, 'down': 50, 'sni': Settings['host'], 'alpn': None, 'verify': True, } socksInfo = { # socks5 interface for test 'addr': Settings['clientBind'], 'port': getAvailablePort() } serverConfig = { 'listen': '%s:%i' % (hostFormat(proxyInfo['server'], v6Bracket = True), proxyInfo['port']), 'protocol': proxyInfo['protocol'], 'cert': Settings['cert'], 'key': Settings['key'], } configName = 'hysteria_' + protocol caption = 'Hysteria protocol ' + protocol if isObfs: configName += '_obfs' caption += ' (with obfs)' proxyInfo['obfs'] = genFlag(length = 8) serverConfig['obfs'] = proxyInfo['obfs'] if isAuth: configName += '_auth' caption += ' (with auth)' proxyInfo['passwd'] = genFlag(length = 8) serverConfig['auth'] = { 'mode': 'passwords', 'config': [proxyInfo['passwd']] } testInfo = { 'caption': caption, 'client': loadClient(configName + '_client.json', proxyInfo, socksInfo), 'server': loadServer(configName + '_server.json', serverConfig), 'socks': socksInfo, # exposed socks5 address 'interface': { 'addr': proxyInfo['server'], 'port': proxyInfo['port'], } } logger.debug('New Hysteria test -> %s' % testInfo) return testInfo def load(): for protocol, isObfs, isAuth in itertools.product(hysteriaProtocols, [False, True], [False, True]): yield loadTest(protocol, isObfs, isAuth) logger.info('Hysteria test yield complete')