mirror of https://github.com/dnomd343/ProxyC
dnomd343
2 years ago
6 changed files with 215 additions and 19 deletions
@ -0,0 +1,154 @@ |
|||
#!/usr/bin/env python3 |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
import os |
|||
import json |
|||
from Tester import Plugin |
|||
from Builder import TrojanGo |
|||
from Basis.Logger import logging |
|||
from Basis.Process import Process |
|||
from Basis.Functions import md5Sum |
|||
from Basis.Functions import genFlag |
|||
from Basis.Methods import trojanGoMethods |
|||
from Basis.Functions import getAvailablePort |
|||
|
|||
settings = { |
|||
'serverBind': '127.0.0.1', |
|||
'clientBind': '127.0.0.1', |
|||
# 'serverBind': '::1', |
|||
# 'clientBind': '::1', |
|||
'workDir': '/tmp/ProxyC', |
|||
'host': '343.re', |
|||
'cert': '/etc/ssl/certs/343.re/fullchain.pem', |
|||
'key': '/etc/ssl/certs/343.re/privkey.pem', |
|||
} |
|||
|
|||
|
|||
# def wsConfig(proxyInfo: dict) -> dict: |
|||
# if proxyInfo['ws'] is None: |
|||
# return {'enabled': False} |
|||
# wsObject = { |
|||
# 'enabled': True, |
|||
# 'path': proxyInfo['ws']['path'] |
|||
# } |
|||
# if proxyInfo['ws']['host'] != '': |
|||
# wsObject['host'] = proxyInfo['ws']['host'] |
|||
# return wsObject |
|||
# |
|||
# |
|||
# def ssConfig(proxyInfo: dict) -> dict: |
|||
# return {**{ |
|||
# 'enabled': False if proxyInfo['ss'] is None else True |
|||
# }, **({} if proxyInfo['ss'] is None else { |
|||
# 'method': proxyInfo['ss']['method'], |
|||
# 'password': proxyInfo['ss']['passwd'], |
|||
# })} |
|||
# |
|||
# |
|||
# def pluginConfig(proxyInfo: dict) -> dict: |
|||
# return {**{ |
|||
# 'enabled': False if proxyInfo['plugin'] is None else True |
|||
# }, **({} if proxyInfo['plugin'] is None else { |
|||
# 'type': 'shadowsocks', |
|||
# 'command': proxyInfo['plugin']['type'], |
|||
# 'option': proxyInfo['plugin']['param'], |
|||
# })} |
|||
|
|||
|
|||
def loadServer(configFile: str, proxyInfo: dict) -> Process: |
|||
trojanGoConfig = { |
|||
'run_type': 'server', |
|||
'local_addr': proxyInfo['server'], |
|||
'local_port': proxyInfo['port'], |
|||
'remote_addr': '127.0.0.1', # remote address are only for shadowsocks fallback (pointless here) |
|||
'remote_port': getAvailablePort(), # random port (will not be used) |
|||
'password': [ |
|||
proxyInfo['passwd'] |
|||
], |
|||
'disable_http_check': True, |
|||
'ssl': { |
|||
'cert': settings['cert'], |
|||
'key': settings['key'] |
|||
}, |
|||
'websocket': TrojanGo.wsConfig(proxyInfo), |
|||
'shadowsocks': TrojanGo.ssConfig(proxyInfo), |
|||
'transport_plugin': TrojanGo.pluginConfig(proxyInfo), |
|||
} |
|||
serverFile = os.path.join(settings['workDir'], configFile) |
|||
return Process(settings['workDir'], cmd = ['trojan-go', '-config', serverFile], file = { |
|||
'path': serverFile, |
|||
'content': json.dumps(trojanGoConfig) |
|||
}, isStart = False) |
|||
|
|||
|
|||
def loadClient(configFile: str, proxyInfo: dict, socksInfo: dict) -> Process: # load client process |
|||
clientFile = os.path.join(settings['workDir'], configFile) |
|||
trojanGoCommand, trojanGoConfig, _ = TrojanGo.load(proxyInfo, socksInfo, clientFile) |
|||
return Process(settings['workDir'], cmd = trojanGoCommand, file = { |
|||
'path': clientFile, |
|||
'content': trojanGoConfig |
|||
}, isStart = False) |
|||
|
|||
|
|||
def loadTest(wsObject: dict or None, ssObject: dict or None, plugin: dict or None = None) -> dict: |
|||
proxyInfo = { # connection info |
|||
'server': settings['serverBind'], |
|||
'port': getAvailablePort(), |
|||
'passwd': genFlag(length = 8), # random password |
|||
'sni': settings['host'], |
|||
'alpn': None, |
|||
'verify': True, |
|||
'ws': wsObject, |
|||
'ss': ssObject, |
|||
} |
|||
socksInfo = { # socks5 interface for test |
|||
'addr': settings['clientBind'], |
|||
'port': getAvailablePort() |
|||
} |
|||
configName = 'trojan-go%s%s%s' % ( |
|||
('' if wsObject is None else '_ws'), |
|||
('' if ssObject is None else '_' + ssObject['method']), |
|||
('' if plugin is None else '_' + md5Sum(plugin['type'] + plugin['caption'])[:8]) |
|||
) |
|||
pluginClient = {'plugin': None if plugin is None else plugin['client']} |
|||
pluginServer = {'plugin': None if plugin is None else plugin['server']} |
|||
testInfo = { # release test info |
|||
'title': 'Trojan-Go test: original' + \ |
|||
('' if ssObject is None else ' (with %s encrypt)' % ssObject['method']) + \ |
|||
('' if wsObject is None else ' (with websocket)') + \ |
|||
('' if plugin is None else ' [%s -> %s]' % (plugin['type'], plugin['caption'])), |
|||
'client': loadClient(configName + '_client.json', {**proxyInfo, **pluginClient}, socksInfo), |
|||
'server': loadServer(configName + '_server.json', {**proxyInfo, **pluginServer}), |
|||
'socks': socksInfo, # exposed socks5 address |
|||
'interface': { |
|||
'addr': proxyInfo['server'], |
|||
'port': proxyInfo['port'], |
|||
} |
|||
} |
|||
if plugin is not None: |
|||
testInfo['server'] = plugin['inject'](testInfo['server'], plugin) |
|||
logging.debug('New trojan-go test -> %s' % testInfo) |
|||
return testInfo |
|||
|
|||
|
|||
def load(): |
|||
pluginTest = [] |
|||
pluginIter = Plugin.load('trojan-go') |
|||
while True: |
|||
try: |
|||
pluginTest.append(next(pluginIter)) # export data of plugin generator |
|||
except StopIteration: |
|||
break |
|||
wsObject = { |
|||
'host': settings['host'], |
|||
'path': '/' + genFlag(length = 6), |
|||
} |
|||
yield loadTest(None, None, None) |
|||
for method in [''] + trojanGoMethods: # different encryption for trojan-go |
|||
ssObject = { |
|||
'method': method, |
|||
'passwd': genFlag(length = 8) |
|||
} |
|||
yield loadTest(wsObject, None if ssObject['method'] == '' else ssObject, None) |
|||
for plugin in pluginTest: # different plugin for trojan-go |
|||
yield loadTest(None, None, plugin) |
Loading…
Reference in new issue