mirror of https://github.com/dnomd343/ProxyC
dnomd343
3 years ago
1 changed files with 150 additions and 0 deletions
@ -0,0 +1,150 @@ |
|||||
|
#!/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, isLegacy: bool = False) -> tuple[dict, list]: |
||||
|
config = loadConfig(serverPort, method) |
||||
|
return config, ['ss-rust-server', '-v'] |
||||
|
|
||||
|
|
||||
|
def ssLibev(serverPort: int, method: str, isLegacy: bool = False) -> tuple[dict, list]: |
||||
|
config = loadConfig(serverPort, method) |
||||
|
return config, ['ss-libev-legacy-server' if isLegacy else 'ss-libev-server', '-v'] |
||||
|
|
||||
|
|
||||
|
def ssPython(serverPort: int, method: str, isLegacy: bool = False) -> 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 not isLegacy: # only for latest version |
||||
|
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-legacy-server' if isLegacy else 'ss-python-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 = None |
||||
|
if 'rust' in clientType: ssClientLoad = Shadowsocks.ssRust |
||||
|
if 'libev' in clientType: ssClientLoad = Shadowsocks.ssLibev |
||||
|
if 'python' in clientType: ssClientLoad = Shadowsocks.ssPython |
||||
|
ssConfig, ssClient = ssClientLoad(proxyInfo, socksInfo, isUdp = False, isLegacy = 'legacy' in clientType) |
||||
|
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 = None |
||||
|
if 'rust' in serverType: ssServerLoad = ssRust |
||||
|
if 'libev' in serverType: ssServerLoad = ssLibev |
||||
|
if 'python' in serverType: ssServerLoad = ssPython |
||||
|
ssConfig, ssServer = ssServerLoad(serverPort, method, 'legacy' in serverType) |
||||
|
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', |
||||
|
# 'http://8.210.148.24', |
||||
|
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: |
||||
|
if ssType == 'all': continue |
||||
|
for method in ssMethods[ssType]: |
||||
|
loadTest(ssType, ssType, method, 0.3) |
||||
|
|
||||
|
|
||||
|
def test_2() -> None: |
||||
|
for ssServer in ssMethods: |
||||
|
if ssServer == 'all': continue |
||||
|
for method in ssMethods[ssServer]: |
||||
|
for ssClient in ssMethods: |
||||
|
if ssClient == 'all': continue |
||||
|
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 |
||||
|
loadTest(ssServer, ssClient, method, timeout) |
||||
|
|
||||
|
|
||||
|
# test_1() |
||||
|
# test_2() |
||||
|
loadTest('ss-rust', 'ss-python', 'table', 1) |
Loading…
Reference in new issue