Files
OutFleet/main.py

151 lines
4.7 KiB
Python
Raw Normal View History

2023-09-25 01:19:50 +03:00
import yaml
import logging
from datetime import datetime
2023-09-25 03:53:08 +03:00
import random
import string
2023-09-25 01:19:50 +03:00
from flask import Flask, render_template, request, url_for, redirect
from lib import Server
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%d-%m-%Y %H:%M:%S')
log = logging.getLogger('OutlineFleet')
SERVERS = list()
2023-09-25 03:53:08 +03:00
CLIENTS = list()
2023-09-25 01:19:50 +03:00
app = Flask(__name__)
def format_timestamp(ts):
2023-09-25 03:53:08 +03:00
return datetime.fromtimestamp(ts // 1000).strftime('%Y-%m-%d %H:%M:%S')
def random_string(length=12):
letters = string.ascii_letters + string.digits
return ''.join(random.choice(letters) for i in range(length))
2023-09-25 01:19:50 +03:00
def update_state():
global SERVERS
2023-09-25 03:53:08 +03:00
global CLIENTS
2023-09-25 01:19:50 +03:00
SERVERS = list()
2023-09-25 03:53:08 +03:00
CLIENTS = list()
2023-09-25 01:19:50 +03:00
config = dict()
try:
with open("config.yaml", "r") as file:
config = yaml.safe_load(file)
except:
with open("config.yaml", "w"):
pass
if config:
2023-09-25 03:53:08 +03:00
servers = config.get('servers', list())
for server_id, server_config in servers.items():
server = Server(url=server_config["url"], cert=server_config["cert"], comment=server_config["comment"])
2023-09-25 01:19:50 +03:00
SERVERS.append(server)
log.info("Server found: %s", server.info()["name"])
2023-09-25 03:53:08 +03:00
CLIENTS = config.get('clients', list())
2023-09-25 01:19:50 +03:00
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render_template(
'index.html',
SERVERS=SERVERS,
nt=request.args.get('nt'),
nl=request.args.get('nl'),
selected_server=request.args.get('selected_server'),
2023-09-25 03:53:08 +03:00
add_server=request.args.get('add_server', None),
format_timestamp=format_timestamp,
)
2023-09-25 01:19:50 +03:00
else:
server = request.form['server_id']
server = next((item for item in SERVERS if item.info()["server_id"] == server), None)
server.apply_config(request.form)
update_state()
2023-09-25 03:53:08 +03:00
return redirect(
url_for('index', nt="Updated Outline VPN Server", selected_server=request.args.get('selected_server')))
2023-09-25 01:19:50 +03:00
2023-09-25 03:53:08 +03:00
@app.route('/clients', methods=['GET', 'POST'])
def clients():
2023-09-25 01:19:50 +03:00
if request.method == 'GET':
2023-09-25 03:53:08 +03:00
return render_template(
'clients.html',
SERVERS=SERVERS,
CLIENTS=CLIENTS,
nt=request.args.get('nt'),
nl=request.args.get('nl'),
selected_client=request.args.get('selected_client'),
add_client=request.args.get('add_client', None),
format_timestamp=format_timestamp)
2023-09-25 01:19:50 +03:00
else:
2023-09-25 03:53:08 +03:00
server = request.form['server_id']
server = next((item for item in SERVERS if item.info()["server_id"] == server), None)
server.apply_config(request.form)
update_state()
return redirect(
url_for('index', nt="Updated Outline VPN Server", selected_server=request.args.get('selected_server')))
@app.route('/add_server', methods=['POST'])
def add_server():
if request.method == 'post':
2023-09-25 01:19:50 +03:00
with open("config.yaml", "r") as file:
config = yaml.safe_load(file) or {}
servers = config.get('servers', dict())
try:
new_server = Server(url=request.form['url'], cert=request.form['cert'], comment=request.form['comment'])
except:
return redirect(url_for('index', nt="Couldn't access Outline VPN Server", nl="error"))
servers[new_server.data["server_id"]] = {
'name': new_server.data["name"],
'url': new_server.data["url"],
'comment': new_server.data["comment"],
'cert': request.form['cert']
}
config["servers"] = servers
with open("config.yaml", "w") as file:
yaml.safe_dump(config, file)
update_state()
return redirect(url_for('index', nt="Added Outline VPN Server"))
2023-09-25 03:53:08 +03:00
@app.route('/add_client', methods=['POST'])
def add_client():
if request.method == 'POST':
with open("config.yaml", "r") as file:
config = yaml.safe_load(file) or {}
clients = config.get('clients', dict())
user_id = request.form.get('user_id', random_string())
clients[user_id] = {
'name': request.form.get('name'),
'comment': request.form.get('comment'),
'servers': request.form.getlist('servers')
}
config["clients"] = clients
with open("config.yaml", "w") as file:
yaml.safe_dump(config, file)
for server in SERVERS:
if server.data["server_id"] in request.form.getlist('servers'):
log.info("%s", server.create_key(request.form.get('name')))
update_state()
return redirect(url_for('index', nt="User has been added"))
2023-09-25 01:19:50 +03:00
if __name__ == '__main__':
update_state()
app.run()