diff --git a/3proxy.cfg.template b/3proxy.cfg.template new file mode 100644 index 0000000..c6b2509 --- /dev/null +++ b/3proxy.cfg.template @@ -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 diff --git a/go-socks-lb/.gitignore b/go-socks-lb/.gitignore index 0026861..9680c05 100644 --- a/go-socks-lb/.gitignore +++ b/go-socks-lb/.gitignore @@ -1,3 +1,4 @@ +go-socks-lb # Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a diff --git a/go-socks-lb/go-socks-lb b/go-socks-lb/go-socks-lb deleted file mode 100755 index af7c7e9..0000000 Binary files a/go-socks-lb/go-socks-lb and /dev/null differ diff --git a/o_manager.py b/o_manager.py index 2d57aca..79cdfab 100644 --- a/o_manager.py +++ b/o_manager.py @@ -18,7 +18,7 @@ class OManager: if not name: name = f"openvpn-{self.idx}" 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) self.ops.append(op) self.idx += 1 diff --git a/openvpn.py b/openvpn.py index 1e157f5..2e62fd1 100644 --- a/openvpn.py +++ b/openvpn.py @@ -41,13 +41,13 @@ RUNNING = "running" 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.idx = idx self.interface = f"tun{idx}" self.folder_path = folder_path self.management_port = management_port - self.PID = 0 + self.pids = [] self.status = IDLE self.proc = 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.ping_stat_fp = os.path.join(self.folder_path, "ping_stat.txt") self.template_fp = template_fp + self.proxycfg_template_fp = proxycfg_template_fp if loop: self.loop = loop else: @@ -86,6 +87,24 @@ class Openvpn: os.chmod(self.script_fp, st.st_mode | stat.S_IEXEC) 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): self.log_fp = os.path.join(self.folder_path, "log.txt") cfg = { @@ -110,10 +129,15 @@ class Openvpn: self.status = RUNNING config_fp = self.generate_config_file() script_fp = self.generate_script() - cmd = " ".join(["openvpn", "--config", config_fp, "--route-noexec", - "--route-up", script_fp, "--script-security", - "2", "--mute-replay-warnings"]) # TODO: remove --mute-replay-warnings - self.run_task.append(self.loop.create_task(self.run(cmd))) + proxycfg_fp = self.generate_config_file() + openvpn_cmd = " ".join(["openvpn", "--config", config_fp, "--route-noexec", + "--route-up", script_fp, "--script-security", + "2", "--mute-replay-warnings"]) # TODO: remove --mute-replay-warnings + 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())) def get_log(self): @@ -130,10 +154,11 @@ class Openvpn: async def stop(self): if self.status == RUNNING: - try: - os.kill(self.PID, signal.SIGINT) - except Exception as err: - print("kill failed:", err) + for pid in self.pids: + try: + os.kill(pid, signal.SIGINT) + except Exception as err: + print("kill failed:", err) self.status = IDLE for task in self.run_task: @@ -208,18 +233,17 @@ class Openvpn: print("monitoring error:", e) await asyncio.sleep(5) - async def run(self, cmd, group="openvpn"): + async def run_cmd(self, cmd, group): print(f"run: {cmd}") - self.exit_future = asyncio.Future() while self.status == RUNNING: print("create proc") 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: - os.remove(self.pid_fp) + os.remove(pid_fp) except: pass - shell = f"sg {group} -c \"echo \\$\\$ > {self.pid_fp}; exec {cmd}\"" + shell = f"sg {group} -c \"echo \\$\\$ > {pid_fp}; exec {cmd}\"" print(shell) proc = await asyncio.create_subprocess_shell( shell, @@ -231,7 +255,7 @@ class Openvpn: await asyncio.sleep(1) got_pid = False try: - self.PID = int(open(self.pid_fp, "r").read()) + PID = int(open(pid_fp, "r").read()) got_pid = True except: got_pid = False @@ -240,9 +264,8 @@ class Openvpn: if not got_pid: print("error, cannot get pid") break - self.openvpn_api = openvpn_api.VPN( - 'localhost', int(self.management_port)) - print(f"pid: {self.PID}") + print(f"pid: {PID}") + self.pids.append(PID) stdout, stderr = await proc.communicate() print(f'[{cmd!r} exited with {proc.returncode}]') if stdout: @@ -250,13 +273,11 @@ class Openvpn: if stderr: print(f'[stderr]\n{stderr.decode()}') await asyncio.sleep(5) - self.exit_future.set_result(True) - self.status = IDLE if __name__ == "__main__": folder_fp = "/home/mantao/Desktop/t/" 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"}) # o1.start()