save and load config

This commit is contained in:
mantaohuang 2020-08-03 12:36:29 -04:00
parent edc9b2f510
commit e3e0c47e2b
4 changed files with 57 additions and 229 deletions

View File

@ -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):

View File

@ -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", {})

View File

@ -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
View File

@ -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():