You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
3.3 KiB

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import copy
import itertools
from Builder import Brook
from Tester import Settings
from Basis.Logger import logging
from Basis.Process import Process
from Basis.Functions import genFlag
from Basis.Functions import hostFormat
from Basis.Functions import getAvailablePort
def originStream(isUot: bool) -> dict:
return {
'caption': 'original' + (' (UDP over TCP)' if isUot else ''),
'info': {
'type': 'origin',
'uot': isUot,
},
'command': lambda proxyInfo: ['server'] + [ # callback function for loading brook command
'--listen', '%s:%i' % (hostFormat(proxyInfo['server'], v6Bracket = True), proxyInfo['port']),
'--password', proxyInfo['passwd'],
]
}
def loadWsCommand(proxyInfo: dict) -> list: # load start command for brook server
return ([
'wsserver', '--listen', '%s:%i' % (hostFormat(proxyInfo['server'], v6Bracket = True), proxyInfo['port'])
] if proxyInfo['stream']['secure'] is None else [
'wssserver', '--domainaddress', '%s:%i' % (proxyInfo['stream']['host'], proxyInfo['port'])
]) + [
'--path', proxyInfo['stream']['path'],
'--password', proxyInfo['passwd'],
] + ([] if proxyInfo['stream']['secure'] is None else [
'--cert', Settings['cert'],
'--certkey', Settings['key'],
]) + (['--withoutBrookProtocol'] if proxyInfo['stream']['raw'] else [])
def wsStream(isRaw: bool, isSecure: bool):
return {
'caption': 'websocket' + (' (with tls)' if isSecure else '') + (' (without brook)' if isRaw else ''),
'info': {
'type': 'ws',
'host': Settings['host'],
'path': '/' + genFlag(length = 6),
'raw': isRaw,
'secure': {'verify': True} if isSecure else None,
},
'command': loadWsCommand # callback function for loading brook command
}
def loadTest(stream: dict) -> dict:
proxyInfo = {
'server': Settings['serverBind'],
'port': getAvailablePort(),
'passwd': genFlag(),
'stream': stream['info']
}
socksInfo = { # socks5 interface for test
'addr': Settings['clientBind'],
'port': getAvailablePort()
}
clientCommand, _, _ = Brook.load(proxyInfo, socksInfo, '')
serverCommand = ['brook', '--debug', '--listen', ':'] + stream['command'](proxyInfo)
testInfo = { # release test info
'title': 'Brook test: ' + stream['caption'],
'client': Process(Settings['workDir'], cmd = clientCommand, isStart = False),
'server': Process(Settings['workDir'], cmd = serverCommand, isStart = False),
'socks': socksInfo, # exposed socks5 address
'interface': {
'addr': proxyInfo['server'],
'port': proxyInfo['port'],
}
}
logging.debug('New brook test -> %s' % testInfo)
return testInfo
def load():
streams = []
addStream = lambda x: streams.append(copy.deepcopy(x))
for isUot in [False, True]:
addStream(originStream(isUot)) # origin stream test
for isSecure, isRaw in itertools.product([False, True], [False, True]):
addStream(wsStream(isRaw, isSecure)) # websocket stream test
for stream in streams:
yield loadTest(stream)