add 3proxy managing
This commit is contained in:
parent
99b8f3dfba
commit
7e5a19c74d
11
3proxy.cfg.template
Normal file
11
3proxy.cfg.template
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/local/bin/3proxy
|
||||||
|
nserver 8.8.8.8
|
||||||
|
nscache 65536
|
||||||
|
timeouts 1 5 30 60 180 1800 15 60
|
||||||
|
log {{proxy_log_fp}} D
|
||||||
|
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
|
||||||
|
archiver rar rar a -df -inul %A %F
|
||||||
|
rotate 30
|
||||||
|
auth none
|
||||||
|
|
||||||
|
socks -p{{port}} -a
|
||||||
1
go-socks-lb/.gitignore
vendored
1
go-socks-lb/.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
|
go-socks-lb
|
||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
|
|||||||
Binary file not shown.
@ -18,7 +18,7 @@ class OManager:
|
|||||||
if not name:
|
if not name:
|
||||||
name = f"openvpn-{self.idx}"
|
name = f"openvpn-{self.idx}"
|
||||||
op = Openvpn(cfg_fp, self.idx, folder_path,
|
op = Openvpn(cfg_fp, self.idx, folder_path,
|
||||||
f"{self.base_port + self.idx}", "script.sh.template", name=name,
|
f"{self.base_port + self.idx}", "script.sh.template", "3proxy.cfg.template", name=name,
|
||||||
additional_cfg=additional_cfg)
|
additional_cfg=additional_cfg)
|
||||||
self.ops.append(op)
|
self.ops.append(op)
|
||||||
self.idx += 1
|
self.idx += 1
|
||||||
|
|||||||
55
openvpn.py
55
openvpn.py
@ -41,13 +41,13 @@ RUNNING = "running"
|
|||||||
|
|
||||||
|
|
||||||
class Openvpn:
|
class Openvpn:
|
||||||
def __init__(self, cfg_fp, idx, folder_path, management_port, template_fp, name=None, additional_cfg={}, loop=None):
|
def __init__(self, cfg_fp, idx, folder_path, management_port, template_fp, proxycfg_template_fp, name=None, additional_cfg={}, loop=None):
|
||||||
self.cfg_fp = cfg_fp
|
self.cfg_fp = cfg_fp
|
||||||
self.idx = idx
|
self.idx = idx
|
||||||
self.interface = f"tun{idx}"
|
self.interface = f"tun{idx}"
|
||||||
self.folder_path = folder_path
|
self.folder_path = folder_path
|
||||||
self.management_port = management_port
|
self.management_port = management_port
|
||||||
self.PID = 0
|
self.pids = []
|
||||||
self.status = IDLE
|
self.status = IDLE
|
||||||
self.proc = None
|
self.proc = None
|
||||||
self.exit_future = None
|
self.exit_future = None
|
||||||
@ -60,6 +60,7 @@ class Openvpn:
|
|||||||
self.io_stat_fp = os.path.join(self.folder_path, "io_stat.txt")
|
self.io_stat_fp = os.path.join(self.folder_path, "io_stat.txt")
|
||||||
self.ping_stat_fp = os.path.join(self.folder_path, "ping_stat.txt")
|
self.ping_stat_fp = os.path.join(self.folder_path, "ping_stat.txt")
|
||||||
self.template_fp = template_fp
|
self.template_fp = template_fp
|
||||||
|
self.proxycfg_template_fp = proxycfg_template_fp
|
||||||
if loop:
|
if loop:
|
||||||
self.loop = loop
|
self.loop = loop
|
||||||
else:
|
else:
|
||||||
@ -86,6 +87,24 @@ class Openvpn:
|
|||||||
os.chmod(self.script_fp, st.st_mode | stat.S_IEXEC)
|
os.chmod(self.script_fp, st.st_mode | stat.S_IEXEC)
|
||||||
return self.script_fp
|
return self.script_fp
|
||||||
|
|
||||||
|
def generate_proxycfg(self):
|
||||||
|
# TODO: refactor code: proess manager
|
||||||
|
proxycfg_fp = os.path.join(
|
||||||
|
self.folder_path, "3proxy.cfg")
|
||||||
|
|
||||||
|
with open(self.proxycfg_template_fp, "r") as template_f:
|
||||||
|
buf = template_f.read()
|
||||||
|
template = Template(buf)
|
||||||
|
proxy_log_fp = os.path.join(self.folder_path, "proxy_log.txt")
|
||||||
|
items = {
|
||||||
|
"proxy_log_fp": proxy_log_fp,
|
||||||
|
"port": f"{1080 + self.idx}"
|
||||||
|
}
|
||||||
|
proxycfg = template.generate(**items)
|
||||||
|
with open(proxycfg_fp, "wb") as proxycfg_f:
|
||||||
|
proxycfg_f.write(proxycfg)
|
||||||
|
return proxycfg_fp
|
||||||
|
|
||||||
def get_cfg(self):
|
def get_cfg(self):
|
||||||
self.log_fp = os.path.join(self.folder_path, "log.txt")
|
self.log_fp = os.path.join(self.folder_path, "log.txt")
|
||||||
cfg = {
|
cfg = {
|
||||||
@ -110,10 +129,15 @@ class Openvpn:
|
|||||||
self.status = RUNNING
|
self.status = RUNNING
|
||||||
config_fp = self.generate_config_file()
|
config_fp = self.generate_config_file()
|
||||||
script_fp = self.generate_script()
|
script_fp = self.generate_script()
|
||||||
cmd = " ".join(["openvpn", "--config", config_fp, "--route-noexec",
|
proxycfg_fp = self.generate_config_file()
|
||||||
|
openvpn_cmd = " ".join(["openvpn", "--config", config_fp, "--route-noexec",
|
||||||
"--route-up", script_fp, "--script-security",
|
"--route-up", script_fp, "--script-security",
|
||||||
"2", "--mute-replay-warnings"]) # TODO: remove --mute-replay-warnings
|
"2", "--mute-replay-warnings"]) # TODO: remove --mute-replay-warnings
|
||||||
self.run_task.append(self.loop.create_task(self.run(cmd)))
|
self.run_task.append(self.loop.create_task(
|
||||||
|
self.run_cmd(openvpn_cmd, group="openvpn")))
|
||||||
|
proxy_cmd = " ".join(["3proxy", proxycfg_fp])
|
||||||
|
self.run_task.append(self.loop.create_task(
|
||||||
|
self.run_cmd(proxy_cmd, group=f"vpn{self.idx}")))
|
||||||
self.run_task.append(self.loop.create_task(self.monitor_task()))
|
self.run_task.append(self.loop.create_task(self.monitor_task()))
|
||||||
|
|
||||||
def get_log(self):
|
def get_log(self):
|
||||||
@ -130,8 +154,9 @@ class Openvpn:
|
|||||||
|
|
||||||
async def stop(self):
|
async def stop(self):
|
||||||
if self.status == RUNNING:
|
if self.status == RUNNING:
|
||||||
|
for pid in self.pids:
|
||||||
try:
|
try:
|
||||||
os.kill(self.PID, signal.SIGINT)
|
os.kill(pid, signal.SIGINT)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
print("kill failed:", err)
|
print("kill failed:", err)
|
||||||
|
|
||||||
@ -208,18 +233,17 @@ class Openvpn:
|
|||||||
print("monitoring error:", e)
|
print("monitoring error:", e)
|
||||||
await asyncio.sleep(5)
|
await asyncio.sleep(5)
|
||||||
|
|
||||||
async def run(self, cmd, group="openvpn"):
|
async def run_cmd(self, cmd, group):
|
||||||
print(f"run: {cmd}")
|
print(f"run: {cmd}")
|
||||||
self.exit_future = asyncio.Future()
|
|
||||||
while self.status == RUNNING:
|
while self.status == RUNNING:
|
||||||
print("create proc")
|
print("create proc")
|
||||||
print(self.status)
|
print(self.status)
|
||||||
self.pid_fp = os.path.join(self.folder_path, "pid.txt")
|
pid_fp = os.path.join(self.folder_path, f"{cmd[0]}_pid.txt")
|
||||||
try:
|
try:
|
||||||
os.remove(self.pid_fp)
|
os.remove(pid_fp)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
shell = f"sg {group} -c \"echo \\$\\$ > {self.pid_fp}; exec {cmd}\""
|
shell = f"sg {group} -c \"echo \\$\\$ > {pid_fp}; exec {cmd}\""
|
||||||
print(shell)
|
print(shell)
|
||||||
proc = await asyncio.create_subprocess_shell(
|
proc = await asyncio.create_subprocess_shell(
|
||||||
shell,
|
shell,
|
||||||
@ -231,7 +255,7 @@ class Openvpn:
|
|||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
got_pid = False
|
got_pid = False
|
||||||
try:
|
try:
|
||||||
self.PID = int(open(self.pid_fp, "r").read())
|
PID = int(open(pid_fp, "r").read())
|
||||||
got_pid = True
|
got_pid = True
|
||||||
except:
|
except:
|
||||||
got_pid = False
|
got_pid = False
|
||||||
@ -240,9 +264,8 @@ class Openvpn:
|
|||||||
if not got_pid:
|
if not got_pid:
|
||||||
print("error, cannot get pid")
|
print("error, cannot get pid")
|
||||||
break
|
break
|
||||||
self.openvpn_api = openvpn_api.VPN(
|
print(f"pid: {PID}")
|
||||||
'localhost', int(self.management_port))
|
self.pids.append(PID)
|
||||||
print(f"pid: {self.PID}")
|
|
||||||
stdout, stderr = await proc.communicate()
|
stdout, stderr = await proc.communicate()
|
||||||
print(f'[{cmd!r} exited with {proc.returncode}]')
|
print(f'[{cmd!r} exited with {proc.returncode}]')
|
||||||
if stdout:
|
if stdout:
|
||||||
@ -250,13 +273,11 @@ class Openvpn:
|
|||||||
if stderr:
|
if stderr:
|
||||||
print(f'[stderr]\n{stderr.decode()}')
|
print(f'[stderr]\n{stderr.decode()}')
|
||||||
await asyncio.sleep(5)
|
await asyncio.sleep(5)
|
||||||
self.exit_future.set_result(True)
|
|
||||||
self.status = IDLE
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
folder_fp = "/home/mantao/Desktop/t/"
|
folder_fp = "/home/mantao/Desktop/t/"
|
||||||
cfg_fp = "/home/mantao/Desktop/t/TCP_Files/UK2-TCP.ovpn"
|
cfg_fp = "/home/mantao/Desktop/t/TCP_Files/UK2-TCP.ovpn"
|
||||||
o1 = Openvpn(cfg_fp, 0, folder_fp, 8001, "script.sh.template", additional_cfg={
|
o1 = Openvpn(cfg_fp, 0, folder_fp, 8001, "script.sh.template", "3proxy.cfg", additional_cfg={
|
||||||
"auth-user-pass": "/home/mantao/Desktop/t/fast.txt"})
|
"auth-user-pass": "/home/mantao/Desktop/t/fast.txt"})
|
||||||
# o1.start()
|
# o1.start()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user