mirror of https://github.com/dnomd343/ProxyC
dnomd343
3 years ago
3 changed files with 81 additions and 6 deletions
@ -0,0 +1,76 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
import os |
||||
|
import copy |
||||
|
|
||||
|
from Builder import Shadowsocks |
||||
|
|
||||
|
from Basis.Logger import logging |
||||
|
from Basis.Process import Process |
||||
|
from Basis.Functions import genFlag, getAvailablePort |
||||
|
|
||||
|
default = { |
||||
|
'workDir': '/tmp/ProxyC', |
||||
|
'bindAddr': '127.0.0.1', |
||||
|
'binDir': '/usr/bin', |
||||
|
} |
||||
|
|
||||
|
|
||||
|
class Builder(object): |
||||
|
""" Build the proxy client process and expose socks5 port. |
||||
|
|
||||
|
Arguments: |
||||
|
proxy: Proxy node information. |
||||
|
|
||||
|
bind: Socks5 proxy bind address. |
||||
|
|
||||
|
workDir: A directory for storing configuration files. |
||||
|
|
||||
|
taskId: Task ID, defaults to 12 random characters length. |
||||
|
|
||||
|
isStart: Start the process after class init complete. |
||||
|
|
||||
|
Attributes: |
||||
|
id, proxyType, proxyInfo, socksAddr, socksPort, output |
||||
|
""" |
||||
|
output = None |
||||
|
|
||||
|
def __loadClient(self, isStart: bool): |
||||
|
loadFunction = { |
||||
|
'ss': Shadowsocks.load, |
||||
|
} |
||||
|
if self.proxyType not in loadFunction: |
||||
|
raise RuntimeError('Unknown proxy type') |
||||
|
logging.info('[%s] Load %s proxy client at %s -> %s' % (self.id, self.proxyType, ( |
||||
|
(('[%s]' if ':' in self.socksAddr else '%s') + ':%i') % (self.socksAddr, self.socksPort) |
||||
|
), str(self.proxyInfo))) |
||||
|
configFile = os.path.join(self.__workDir, self.id + '.json') |
||||
|
command, fileContent, envVar = loadFunction[self.proxyType](self.proxyInfo, { |
||||
|
'addr': self.socksAddr, |
||||
|
'port': self.socksPort, |
||||
|
}, configFile) |
||||
|
envVar['PATH'] = default['binDir'] |
||||
|
fileObject = { |
||||
|
'path': configFile, |
||||
|
'content': fileContent |
||||
|
} |
||||
|
self.__process = Process(self.__workDir, taskId = self.id, |
||||
|
isStart = isStart, cmd = command, env = envVar, file = fileObject) |
||||
|
|
||||
|
def __init__(self, proxy: dict, taskId: str = '', isStart: bool = True, |
||||
|
bind: str = default['bindAddr'], workDir: str = default['workDir']) -> None: |
||||
|
self.id = genFlag(length = 12) if taskId == '' else taskId |
||||
|
self.__workDir = workDir |
||||
|
self.proxyType = proxy['type'] |
||||
|
self.proxyInfo = copy.copy(proxy['info']) |
||||
|
self.socksAddr = bind |
||||
|
self.socksPort = getAvailablePort() |
||||
|
self.__loadClient(isStart) |
||||
|
|
||||
|
def status(self) -> bool: |
||||
|
return self.__process.status() |
||||
|
|
||||
|
def destroy(self) -> None: |
||||
|
self.__process.quit() |
||||
|
self.output = self.__process.output |
Loading…
Reference in new issue