ovpn-lb-socks5/o_manager.py
2020-04-09 15:21:48 -04:00

123 lines
3.9 KiB
Python

import os
from openvpn import Openvpn
import asyncio
from tornado.template import Template
import signal
class OManager:
def __init__(self, base_folder, base_port=8001, loop=None):
self.base_folder = base_folder
self.base_port = base_port
self.ops = []
self.new_idx = 0
self.running_idx = []
self.run_task = []
self.PID = None
if loop:
self.loop = loop
else:
self.loop = asyncio.get_event_loop()
def new_op(self, cfg_fp, name=None, additional_cfg={}):
folder_path = os.path.join(self.base_folder, f"session{self.new_idx}")
if not os.path.isdir(folder_path):
os.makedirs(folder_path)
if not name:
name = f"openvpn-{self.new_idx}"
os.system(f"groupadd vpn{self.new_idx}")
op = Openvpn(cfg_fp, self.new_idx, folder_path,
f"{self.base_port + self.new_idx}", "script.sh.template", "3proxy.cfg.template", name=name,
additional_cfg=additional_cfg)
self.ops.append(op)
self.new_idx += 1
return op
def generate_lb_cfg(self):
lb_cfg_fp = os.path.join(
self.base_folder, "go-socks-lb.yml")
with open("go-socks-lb.yml.template", "r") as template_f:
buf = template_f.read()
template = Template(buf)
items = {
"running_idx": self.running_idx
}
lb_cfg = template.generate(**items)
with open(lb_cfg_fp, "wb") as lb_cfg_f:
lb_cfg_f.write(lb_cfg)
return lb_cfg_fp
def start_op(self, idx):
self.ops[idx].start()
if idx not in self.running_idx:
self.running_idx.append(idx)
self.reset_lb()
def stop_op(self, idx):
self.loop.create_task(self.ops[idx].stop())
if idx in self.running_idx:
self.running_idx.remove(idx)
self.reset_lb()
def get_all_ops(self):
return self.ops
def start_all(self):
for op in self.ops:
op.start()
idx = op.idx
if idx not in self.running_idx:
self.running_idx.append(idx)
self.reset_lb()
def stop_all(self):
for op in self.ops:
op.stop()
self.running_idx = []
self.reset_lb()
def reset_lb(self):
try:
if self.PID:
os.kill(self.PID, signal.SIGINT)
except Exception as err:
print("kill failed:", err)
for task in self.run_task:
task.cancel()
self.pids = []
self.run_task = []
lb_cfg_fp = self.generate_lb_cfg()
if len(self.running_idx):
lb_cmd = ["go-socks-lb/go-socks-lb", "-config",
lb_cfg_fp, "-bind", "0.0.0.0:7000"]
print("lb_cmd", lb_cmd)
self.run_task.append(self.loop.create_task(
self.run_cmd(lb_cmd)))
async def run_cmd(self, cmd):
while True:
print("Manager trying to start go")
proc = await asyncio.create_subprocess_exec(
cmd[0], *cmd[1:],
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
print("Manager started", cmd)
self.proc = proc
self.PID = proc.pid
print(f"pid: {self.PID}")
stdout, stderr = await proc.communicate()
print(f'[{cmd!r} exited with {proc.returncode}]')
if stdout:
print(f'[stdout]\n{stdout.decode()}')
if stderr:
print(f'[stderr]\n{stderr.decode()}')
await asyncio.sleep(5)
if __name__ == "__main__":
folder_fp = "/home/mantao/Desktop/t/"
cfg_fp = "/home/mantao/Desktop/t/TCP_Files/UK2-TCP.ovpn"
om = OManager(folder_fp)
om.new_op(cfg_fp, "op1", {
"auth-user-pass": "/home/mantao/Desktop/t/fast.txt"})