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: