mirror of https://github.com/dnomd343/ProxyC
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.
160 lines
5.5 KiB
160 lines
5.5 KiB
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
import json
|
|
import time
|
|
import requests
|
|
from Builder import Shadowsocks
|
|
from Basis.Logger import logging
|
|
from Basis.Process import Process
|
|
from Basis.Methods import ssMethods
|
|
from Basis.Functions import getAvailablePort
|
|
|
|
ssPassword = ''
|
|
|
|
def loadConfig(serverPort: int, method: str) -> dict: # load basic config option
|
|
config = {
|
|
'server': '127.0.0.1',
|
|
'server_port': serverPort, # type -> int
|
|
'method': method,
|
|
'password': ssPassword,
|
|
}
|
|
return config
|
|
|
|
|
|
def ssRust(serverPort: int, method: str) -> tuple[dict, list]:
|
|
config = loadConfig(serverPort, method)
|
|
return config, ['ss-rust-server', '-v']
|
|
|
|
|
|
def ssLibev(serverPort: int, method: str) -> tuple[dict, list]:
|
|
config = loadConfig(serverPort, method)
|
|
return config, ['ss-libev-server', '-v']
|
|
|
|
|
|
def ssPython(serverPort: int, method: str) -> tuple[dict, list]:
|
|
config = loadConfig(serverPort, method)
|
|
mbedtlsMethods = [
|
|
'aes-128-cfb128',
|
|
'aes-192-cfb128',
|
|
'aes-256-cfb128',
|
|
'camellia-128-cfb128',
|
|
'camellia-192-cfb128',
|
|
'camellia-256-cfb128',
|
|
]
|
|
if config['method'] in mbedtlsMethods: # mbedtls methods should use prefix `mbedtls:`
|
|
config['method'] = 'mbedtls:' + config['method']
|
|
if config['method'] in ['idea-cfb', 'seed-cfb']: # Only older versions of openssl are supported
|
|
config['extra_opts'] = '--libopenssl=libcrypto.so.1.0.0'
|
|
config['shadowsocks'] = 'ss-python-server'
|
|
return config, ['ss-bootstrap-server', '--debug', '-vv']
|
|
|
|
|
|
def ssPythonLegacy(serverPort: int, method: str) -> tuple[dict, list]:
|
|
config = loadConfig(serverPort, method)
|
|
config['shadowsocks'] = 'ss-python-legacy-server'
|
|
return config, ['ss-bootstrap-server', '--debug', '-vv']
|
|
|
|
|
|
def loadTest(serverType: str, clientType: str, method: str, timeout: float) -> None:
|
|
logging.warning('Shadowsocks test -> server = %s | client = %s | method = %s' % (serverType, clientType, method))
|
|
global ssPassword
|
|
if method.startswith('2022-blake3-'):
|
|
ssPassword = 'ZG5vbWQzNDNkbm9tZDM0M2Rub21kMzQzZG5vbWQzNDM=' # base64 encode of 'dnomd343' * 4
|
|
if method == '2022-blake3-aes-128-gcm':
|
|
ssPassword = 'ZG5vbWQzNDNkbm9tZDM0Mw==' # base64 encode of 'dnomd343' * 2
|
|
else:
|
|
ssPassword = 'dnomd343'
|
|
title = '%s_%s_%s' % (serverType, clientType, method)
|
|
workDir = '/tmp/ProxyC'
|
|
serverPort = getAvailablePort()
|
|
socksPort = getAvailablePort()
|
|
proxyInfo = {
|
|
'server': '127.0.0.1',
|
|
'port': serverPort,
|
|
'method': method,
|
|
'passwd': ssPassword,
|
|
'plugin': None
|
|
}
|
|
socksInfo = {
|
|
'addr': '127.0.0.1',
|
|
'port': socksPort
|
|
}
|
|
ssClientLoad = {
|
|
'ss-rust': Shadowsocks.ssRust,
|
|
'ss-libev': Shadowsocks.ssLibev,
|
|
'ss-python': Shadowsocks.ssPython,
|
|
'ss-python-legacy': Shadowsocks.ssPythonLegacy
|
|
}[clientType]
|
|
ssConfig, ssClient = ssClientLoad(proxyInfo, socksInfo, isUdp = False)
|
|
client = Process(workDir, cmd = ssClient + ['-c', os.path.join(workDir, title + '_client.json')], file = {
|
|
'path': os.path.join(workDir, title + '_client.json'),
|
|
'content': json.dumps(ssConfig)
|
|
}, isStart = False)
|
|
|
|
ssServerLoad = {
|
|
'ss-rust': ssRust,
|
|
'ss-libev': ssLibev,
|
|
'ss-python': ssPython,
|
|
'ss-python-legacy': ssPythonLegacy
|
|
}[serverType]
|
|
ssConfig, ssServer = ssServerLoad(serverPort, method)
|
|
server = Process(workDir, cmd = ssServer + ['-c', os.path.join(workDir, title + '_server.json')], file = {
|
|
'path': os.path.join(workDir, title + '_server.json'),
|
|
'content': json.dumps(ssConfig)
|
|
}, isStart = False)
|
|
|
|
client.start()
|
|
server.start()
|
|
time.sleep(timeout)
|
|
errFlag = False
|
|
try:
|
|
request = requests.get(
|
|
'http://baidu.com',
|
|
proxies = {
|
|
'http': 'socks5://127.0.0.1:%i' % socksPort,
|
|
'https': 'socks5://127.0.0.1:%i' % socksPort
|
|
},
|
|
timeout = 10
|
|
)
|
|
request.raise_for_status()
|
|
logging.info('socks5 127.0.0.1:%i -> ok' % socksPort)
|
|
except Exception as exp:
|
|
logging.error('socks5 127.0.0.1:%i -> error' % socksPort)
|
|
logging.error('requests exception\n' + str(exp))
|
|
errFlag = True
|
|
client.quit()
|
|
server.quit()
|
|
if errFlag:
|
|
logging.error('client capture output\n' + str(client.output))
|
|
logging.error('server capture output\n' + str(server.output))
|
|
|
|
|
|
def test_1() -> None:
|
|
for ssType in ssMethods:
|
|
for method in ssMethods[ssType]:
|
|
timeout = 0.1
|
|
if 'python' in ssType: timeout = 0.3
|
|
if 'python-legacy' in ssType:
|
|
timeout = 0.8
|
|
if method == 'table' or method == 'salsa20-ctr': timeout = 2
|
|
loadTest(ssType, ssType, method, timeout)
|
|
|
|
|
|
def test_2() -> None:
|
|
for ssServer in ssMethods:
|
|
for method in ssMethods[ssServer]:
|
|
for ssClient in ssMethods:
|
|
if method not in ssMethods[ssClient]: continue
|
|
timeout = 0.1
|
|
if 'python' in ssServer or 'python' in ssClient: timeout = 0.3
|
|
if method == 'table': timeout = 0.8
|
|
if 'python-legacy' in ssServer or 'python-legacy' in ssClient: timeout = 1
|
|
if method == 'salsa20-ctr': timeout = 3
|
|
loadTest(ssServer, ssClient, method, timeout)
|
|
|
|
|
|
test_1()
|
|
# test_2()
|
|
# loadTest('ss-python-legacy', 'ss-python-legacy', 'salsa20-ctr', 3)
|
|
|