save and load config
This commit is contained in:
parent
edc9b2f510
commit
e3e0c47e2b
14
o_manager.py
14
o_manager.py
@ -47,6 +47,18 @@ class OManager:
|
||||
self.lb1_pm = ProcessManager(restart_interval=5, loop=self.loop)
|
||||
self.lb2_pm = ProcessManager(restart_interval=5, loop=self.loop)
|
||||
|
||||
def load_instance_config(self, instance_config):
|
||||
"""
|
||||
[
|
||||
ovpn_config
|
||||
]
|
||||
"""
|
||||
for ovpn_config in instance_config:
|
||||
self.new_op(ovpn_config)
|
||||
|
||||
def serialize_instance_config(self):
|
||||
return [i["op"].export_cfg() for i in self.instances]
|
||||
|
||||
@property
|
||||
def pids(self):
|
||||
return [self.lb1_pm.pid, self.lb2_pm.pid]
|
||||
@ -207,7 +219,7 @@ class OManager:
|
||||
if not instance:
|
||||
return
|
||||
instance["op"].start()
|
||||
instance["weight"] = 1
|
||||
instance["weight"] = 0
|
||||
self.reset_lb()
|
||||
|
||||
def stop_op(self, idx):
|
||||
|
||||
@ -82,6 +82,9 @@ class Openvpn:
|
||||
self.load_cfg(ovpn_config, env_config)
|
||||
|
||||
def load_cfg(self, ovpn_config, env_config):
|
||||
self.ovpn_config = ovpn_config
|
||||
self.env_config = env_config
|
||||
|
||||
self.cfg_fp = ovpn_config["cfg_fp"]
|
||||
self.name = ovpn_config["name"]
|
||||
self.additional_cfg = ovpn_config.get("additional_cfg", {})
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||
<title>Openvpn Load Balancing Socks5 Server</title>
|
||||
<title>OLBS Dashboard</title>
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
|
||||
<meta name="msapplication-TileColor" content="#206bc4" />
|
||||
<meta name="theme-color" content="#206bc4" />
|
||||
@ -37,161 +37,6 @@
|
||||
</head>
|
||||
|
||||
<body class="antialiased">
|
||||
<aside class="navbar navbar-vertical navbar-expand-lg navbar-dark">
|
||||
<div class="container">
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-menu">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<a href="." class="navbar-brand navbar-brand-autodark">
|
||||
Dashboard
|
||||
</a>
|
||||
<div class="navbar-nav flex-row d-lg-none">
|
||||
<div class="nav-item dropdown d-none d-md-flex mr-3">
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar-menu">
|
||||
<ul class="navbar-nav pt-lg-3">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" href="./index.html">
|
||||
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
|
||||
fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" />
|
||||
<polyline points="5 12 3 12 12 3 21 12 19 12" />
|
||||
<path d="M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7" />
|
||||
<path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6" /></svg>
|
||||
</span>
|
||||
<span class="nav-link-title">
|
||||
Home
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#navbar-base" data-toggle="dropdown" role="button"
|
||||
aria-expanded="false">
|
||||
<span class="nav-link-icon d-md-none d-lg-inline-block"><svg xmlns="http://www.w3.org/2000/svg"
|
||||
class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"
|
||||
fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" />
|
||||
<rect x="4" y="4" width="6" height="5" rx="2" />
|
||||
<rect x="4" y="13" width="6" height="7" rx="2" />
|
||||
<rect x="14" y="4" width="6" height="7" rx="2" />
|
||||
<rect x="14" y="15" width="6" height="5" rx="2" /></svg>
|
||||
</span>
|
||||
<span class="nav-link-title">
|
||||
Connections
|
||||
</span>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-columns dropdown-menu-columns-2">
|
||||
<li>
|
||||
<a class="dropdown-item" href="./empty.html">
|
||||
Empty page
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./blank.html">
|
||||
Blank page
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./buttons.html">
|
||||
Buttons
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./cards.html">
|
||||
Cards
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./dropdowns.html">
|
||||
Dropdowns
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./icons.html">
|
||||
Icons
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./modals.html">
|
||||
Modals
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./maps.html">
|
||||
Maps
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./maps-vector.html">
|
||||
Vector maps
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./navigation.html">
|
||||
Navigation
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./charts.html">
|
||||
Charts
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./tables.html">
|
||||
Tables
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./calendar.html">
|
||||
Calendar
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./carousel.html">
|
||||
Carousel
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="./lists.html">
|
||||
Lists
|
||||
</a>
|
||||
</li>
|
||||
<li class="dropright">
|
||||
<a class="dropdown-item dropdown-toggle" href="#sidebar-authentication" data-toggle="dropdown"
|
||||
role="button" aria-expanded="false">
|
||||
Authentication
|
||||
</a>
|
||||
<div class="dropdown-menu">
|
||||
<a href="./sign-in.html" class="dropdown-item">Sign in</a>
|
||||
<a href="./sign-up.html" class="dropdown-item">Sign up</a>
|
||||
<a href="./forgot-password.html" class="dropdown-item">Forgot password</a>
|
||||
<a href="./terms-of-service.html" class="dropdown-item">Terms of service</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="dropright">
|
||||
<a class="dropdown-item dropdown-toggle" href="#sidebar-error" data-toggle="dropdown" role="button"
|
||||
aria-expanded="false">
|
||||
Error pages
|
||||
</a>
|
||||
<div class="dropdown-menu">
|
||||
<a href="./400.html" class="dropdown-item">400 page</a>
|
||||
<a href="./401.html" class="dropdown-item">401 page</a>
|
||||
<a href="./403.html" class="dropdown-item">403 page</a>
|
||||
<a href="./404.html" class="dropdown-item">404 page</a>
|
||||
<a href="./500.html" class="dropdown-item">500 page</a>
|
||||
<a href="./503.html" class="dropdown-item">503 page</a>
|
||||
<a href="./maintenance.html" class="dropdown-item">Maintenance page</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
<div class="page">
|
||||
<div class="content">
|
||||
<div class="container-xl">
|
||||
@ -200,80 +45,37 @@
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<h2 class="page-title">
|
||||
Home
|
||||
Openvpn Load Balancing Socks5 Server
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row row-deck row-cards">
|
||||
|
||||
|
||||
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card card-sm">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<span class="bg-blue text-white stamp mr-3"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||
stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" />
|
||||
<path d="M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2" />
|
||||
<path d="M12 3v3m0 12v3" /></svg>
|
||||
</span>
|
||||
<div class="mr-3 lh-sm">
|
||||
<div class="strong">
|
||||
132 Sales
|
||||
</div>
|
||||
<div class="text-muted">12 waiting payments</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card card-sm">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<span class="bg-green text-white stamp mr-3"><svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||
width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||
stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" />
|
||||
<circle cx="9" cy="19" r="2" />
|
||||
<circle cx="17" cy="19" r="2" />
|
||||
<path d="M3 3h2l2 12a3 3 0 0 0 3 2h7a3 3 0 0 0 3 -2l1 -7h-15.2" /></svg>
|
||||
</span>
|
||||
<div class="mr-3 lh-sm">
|
||||
<div class="strong">
|
||||
78 Orders
|
||||
</div>
|
||||
<div class="text-muted">32 shipped</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card card-sm">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<div class="mr-3">
|
||||
<div class="chart-sparkline chart-sparkline-square" id="sparkline-67"></div>
|
||||
</div>
|
||||
<div class="mr-3 lh-sm">
|
||||
<div class="strong">
|
||||
1,352 Members
|
||||
</div>
|
||||
<div class="text-muted">163 registered today</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="col-lg-12">
|
||||
<div class="card card-sm">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<div class="mr-3 lh-sm">
|
||||
<div class="strong">
|
||||
132 Comments
|
||||
</div>
|
||||
<div class="text-muted">16 waiting</div>
|
||||
<button type="button" class="btn btn-outline-success" onclick="add_new_instance()">Add New
|
||||
Instance</button>
|
||||
</div>
|
||||
<div class="ml-auto">
|
||||
<div class="chart-sparkline chart-sparkline-square" id="sparkline-68"></div>
|
||||
<div class="mr-3 lh-sm">
|
||||
<button type="button" class="btn btn-outline-secondary" onclick="start_all()">Start All</button>
|
||||
</div>
|
||||
<div class="mr-3 lh-sm">
|
||||
<div class="strong">
|
||||
<button type="button" class="btn btn-outline-secondary" onclick="stop_all()">Stop All</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mr-3 lh-sm">
|
||||
<div class="strong">
|
||||
<button type="button" class="btn btn-outline-danger" onclick="remove_all()">Remove All</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mr-3 lh-sm">
|
||||
<div class="strong">
|
||||
<button type="button" class="btn btn-outline-info" onclick="save_current_config()">Save Current
|
||||
Config</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -344,14 +146,10 @@
|
||||
<div class="container">
|
||||
<div class="row text-center align-items-center flex-row-reverse">
|
||||
<div class="col-lg-auto ml-lg-auto">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item"><a href="" class="link-secondary"></a></li>
|
||||
<li class="list-inline-item"><a href="" class="link-secondary"></a></li>
|
||||
<li class="list-inline-item"><a href="" target="_blank" class="link-secondary"></a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
|
||||
2020
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
17
test.py
17
test.py
@ -4,6 +4,7 @@ import json
|
||||
import argparse
|
||||
import os
|
||||
import subprocess
|
||||
import logging
|
||||
from o_manager import OManager
|
||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
@ -17,6 +18,15 @@ session_folder = args["session_folder"]
|
||||
interface = args["interface"]
|
||||
om = OManager(session_folder, interface)
|
||||
|
||||
root = os.path.dirname(__file__)
|
||||
instance_config_fp = os.path.join(root, "config/instances.json")
|
||||
|
||||
try:
|
||||
instance_config = json.load(open(instance_config_fp, "r"))
|
||||
om.load_instance_config(instance_config)
|
||||
except Exception as err:
|
||||
logging.warn(f"Cannot load instances config: {err}")
|
||||
|
||||
|
||||
class MainHandler(tornado.web.RequestHandler):
|
||||
def get(self):
|
||||
@ -115,7 +125,12 @@ class ClearCacheInstatnceHandler(tornado.web.RequestHandler):
|
||||
om.clear_cache()
|
||||
|
||||
|
||||
root = os.path.dirname(__file__)
|
||||
class SaveConfig(tornado.web.RequestHandler):
|
||||
def get(self):
|
||||
instances = om.serialize_instance_config()
|
||||
with open(os.path.join(root), instance_config_fp, "w") as f:
|
||||
f.write(json.dumps(instances))
|
||||
self.write("OK")
|
||||
|
||||
|
||||
def make_app():
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user