diff --git a/.gitignore b/.gitignore index 2384878..d59f3eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +config/ + # virtual env env/ diff --git a/README.md b/README.md index f8a2a7c..eb8bafc 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,13 @@ Todos - [x] improve log reading efficiency, potentially using pytailer - [x] remove instance or change configuration - [ ] improve ui using template, move to ajax +- [ ] save and load configurations - [ ] parameterize inline constants - [ ] refractor code - [ ] documentations + +2020/07/25 Sat +- [ ] frontend ui design +- [ ] configuration defination +- [ ] configuration save and load +- [ ] charts: mpld3 \ No newline at end of file diff --git a/olb_web.py b/olb_web.py new file mode 100644 index 0000000..27f8d36 --- /dev/null +++ b/olb_web.py @@ -0,0 +1,127 @@ +import tornado.ioloop +import tornado.web +import json +import argparse +import os +import subprocess +from o_manager import OManager +dir_path = os.path.dirname(os.path.realpath(__file__)) + +ap = argparse.ArgumentParser() +ap.add_argument("-i", "--interface", required=False, + help="interface (default: eth0)", default="eth0") +ap.add_argument("-s", "--session_folder", required=True, + help="path to the session folder") +args = vars(ap.parse_args()) +session_folder = args["session_folder"] +interface = args["interface"] +om = OManager(session_folder, interface) + + +class MainHandler(tornado.web.RequestHandler): + def get(self): + buf = "\n\n" + buf += "\n" + buf += f"ops len: {len(om.instances)}, lb pids: {om.pids}
\n" + if len(om.instances): + for i in om.instances: + op = i["op"] + idx = i["idx"] + weight = i["weight"] + buf += f"op #{idx}, name: {op.name}
\n" + buf += f"status: {op.status}, weight: {weight}
\n" + buf += f"op pids: {op.pids}
\n" + buf += "log:
\n" + buf += "
\n"
+                buf += "\n".join(op.get_log(lines=10))
+                buf += f"\nSpeed: {op.get_latest_speed()}\n"
+                buf += "\nio_stat\n"
+                buf += "\n".join(op.get_io_stat(lines=5))
+                buf += "\nping_stat\n"
+                buf += "\n".join(op.get_ping_stat(lines=5))
+                buf += "\n
\n" + buf += "\n" + self.write(buf) + + +class ConfigsHandeler(tornado.web.RequestHandler): + def get(self): + cfgs = json.loads(open("profiles.json", "r").read()) + buf = "Select one configuration to create.
\n" + for idx, cfg in enumerate(cfgs): + buf += f"{cfg['name']}
\n" + self.write(buf) + + +class CreateInstantceHandler(tornado.web.RequestHandler): + def get(self): + idx = self.get_query_argument("i", None) + if idx != None: + idx = int(idx) + cfgs = json.loads(open("profiles.json", "r").read()) + cfg = cfgs[idx] + om.new_op(cfg["cfg_fp"], cfg["name"], + additional_cfg=cfg["additional_cfg"]) + self.write("create sucess!") + else: + self.write("need idx") + + +class StartInstatnceHandler(tornado.web.RequestHandler): + def get(self): + idx = self.get_query_argument("i", None) + if idx != None: + om.start_op(int(idx)) + self.write("start sucess!") + else: + om.start_all() + self.write("start all") + + +class StopInstatnceHandler(tornado.web.RequestHandler): + def get(self): + idx = self.get_query_argument("i", None) + if idx != None: + om.stop_op(int(idx)) + self.write("stop sucess!") + else: + om.stop_all() + self.write("stop all") + + +class RemoveInstatnceHandler(tornado.web.RequestHandler): + def get(self): + idx = self.get_query_argument("i", None) + if idx != None: + om.remove_op(int(idx)) + self.write("remove sucess!") + else: + om.remove_all_op() + self.write("remove all") + + +class ClearCacheInstatnceHandler(tornado.web.RequestHandler): + def get(self): + om.clear_cache() + + +def make_app(): + return tornado.web.Application([ + (r"/", MainHandler), + (r"/select", ConfigsHandeler), + (r"/create", CreateInstantceHandler), + (r"/start", StartInstatnceHandler), + (r"/stop", StopInstatnceHandler), + (r"/remove", RemoveInstatnceHandler), + (r"/clear_cache", ClearCacheInstatnceHandler), + ]) + + +if __name__ == "__main__": + app = make_app() + app.listen(8000) + proc = subprocess.Popen([os.path.join(dir_path, "iptable_docker.sh"), interface], + stdout=subprocess.PIPE) + outs, errs = proc.communicate() + print(outs.decode()) + tornado.ioloop.IOLoop.current().start() diff --git a/openvpn.py b/openvpn.py index 1eb2706..9d25186 100644 --- a/openvpn.py +++ b/openvpn.py @@ -5,7 +5,7 @@ import asyncio import tempfile import os import time -import openvpn_api +# import openvpn_api import signal import psutil import subprocess @@ -55,7 +55,7 @@ class Openvpn: self.exit_future = None self.additional_cfg = additional_cfg self.run_task = [] - self.openvpn_api = None + # self.openvpn_api = None self.name = name self.pid_fp = None # TODO: update paths function @@ -68,6 +68,9 @@ class Openvpn: else: self.loop = asyncio.get_event_loop() + def load_cfg(self): + pass + def generate_script(self): self.script_fp = os.path.join(self.folder_path, "script.sh") @@ -112,7 +115,7 @@ class Openvpn: cfg = { "dev": self.interface, "dev-type": "tun", # TODO: add code to read dev-type - "management": f"localhost {self.management_port}", + # "management": f"localhost {self.management_port}", # disable management since we are not using it now "log-append": self.log_fp } cfg.update(self.additional_cfg) @@ -267,7 +270,7 @@ class Openvpn: stderr=asyncio.subprocess.PIPE) print("openpvn started") self.proc = proc - for i in range(3): + for _ in range(3): await asyncio.sleep(1) got_pid = False try: