mirror of
https://github.com/donaldzou/WGDashboard.git
synced 2024-11-22 15:20:09 +01:00
pylint warnings
This commit is contained in:
parent
d0ad4e05bf
commit
c7bf30e18e
299
src/dashboard.py
299
src/dashboard.py
@ -13,9 +13,10 @@ import secrets
|
|||||||
import subprocess
|
import subprocess
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
import re
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from datetime import datetime, time, timedelta
|
from datetime import datetime, timedelta
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
|
||||||
# PIP installed library
|
# PIP installed library
|
||||||
@ -26,14 +27,15 @@ from icmplib import ping, traceroute
|
|||||||
from tinydb import TinyDB, Query
|
from tinydb import TinyDB, Query
|
||||||
|
|
||||||
# Import other python files
|
# Import other python files
|
||||||
from util import *
|
from util import regex_match, check_DNS, check_Allowed_IPs, check_remote_endpoint,\
|
||||||
|
check_IP_with_range, clean_IP_with_range
|
||||||
|
|
||||||
# Dashboard Version
|
# Dashboard Version
|
||||||
dashboard_version = 'v3.0'
|
DASHBOARD_VERSION = 'v3.0'
|
||||||
# Dashboard Config Name
|
# Dashboard Config Name
|
||||||
dashboard_conf = 'wg-dashboard.ini'
|
DASHBOARD_CONF = 'wg-dashboard.ini'
|
||||||
# Upgrade Required
|
# Upgrade Required
|
||||||
update = ""
|
UPDATE = None
|
||||||
# Flask App Configuration
|
# Flask App Configuration
|
||||||
app = Flask("WGDashboard")
|
app = Flask("WGDashboard")
|
||||||
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 5206928
|
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 5206928
|
||||||
@ -53,12 +55,12 @@ def get_dashboard_conf():
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
|
||||||
def set_dashboard_conf(config):
|
def set_dashboard_conf(config):
|
||||||
with open(dashboard_conf, "w") as conf_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as conf_object:
|
||||||
config.write(conf_object)
|
config.write(conf_object)
|
||||||
|
|
||||||
|
|
||||||
@ -89,10 +91,10 @@ def get_conf_running_peer_number(config_name):
|
|||||||
data_usage = data_usage.decode("UTF-8").split()
|
data_usage = data_usage.decode("UTF-8").split()
|
||||||
count = 0
|
count = 0
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
b = timedelta(minutes=2)
|
time_delta = timedelta(minutes=2)
|
||||||
for i in range(int(len(data_usage) / 2)):
|
for _ in range(int(len(data_usage) / 2)):
|
||||||
minus = now - datetime.fromtimestamp(int(data_usage[count + 1]))
|
minus = now - datetime.fromtimestamp(int(data_usage[count + 1]))
|
||||||
if minus < b:
|
if minus < time_delta:
|
||||||
running += 1
|
running += 1
|
||||||
count += 2
|
count += 2
|
||||||
return running
|
return running
|
||||||
@ -101,14 +103,14 @@ def get_conf_running_peer_number(config_name):
|
|||||||
# Read [Interface] section from configuration file
|
# Read [Interface] section from configuration file
|
||||||
def read_conf_file_interface(config_name):
|
def read_conf_file_interface(config_name):
|
||||||
conf_location = wg_conf_path + "/" + config_name + ".conf"
|
conf_location = wg_conf_path + "/" + config_name + ".conf"
|
||||||
with open(conf_location, 'r') as file_object:
|
with open(conf_location, 'r', encoding='utf-8') as file_object:
|
||||||
file = file_object.read().split("\n")
|
file = file_object.read().split("\n")
|
||||||
data = {}
|
data = {}
|
||||||
for i in range(len(file)):
|
for i in file:
|
||||||
if not regex_match("#(.*)", file[i]):
|
if not regex_match("#(.*)", i):
|
||||||
if len(file[i]) > 0:
|
if len(i) > 0:
|
||||||
if file[i] != "[Interface]":
|
if i != "[Interface]":
|
||||||
tmp = re.split(r'\s*=\s*', file[i], 1)
|
tmp = re.split(r'\s*=\s*', i, 1)
|
||||||
if len(tmp) == 2:
|
if len(tmp) == 2:
|
||||||
data[tmp[0]] = tmp[1]
|
data[tmp[0]] = tmp[1]
|
||||||
return data
|
return data
|
||||||
@ -118,24 +120,24 @@ def read_conf_file_interface(config_name):
|
|||||||
def read_conf_file(config_name):
|
def read_conf_file(config_name):
|
||||||
# Read Configuration File Start
|
# Read Configuration File Start
|
||||||
conf_location = wg_conf_path + "/" + config_name + ".conf"
|
conf_location = wg_conf_path + "/" + config_name + ".conf"
|
||||||
with open(conf_location, 'r') as file_object:
|
with open(conf_location, 'r', encoding='utf-8') as file_object:
|
||||||
file = file_object.read().split("\n")
|
file = file_object.read().split("\n")
|
||||||
conf_peer_data = {
|
conf_peer_data = {
|
||||||
"Interface": {},
|
"Interface": {},
|
||||||
"Peers": []
|
"Peers": []
|
||||||
}
|
}
|
||||||
peers_start = 0
|
peers_start = 0
|
||||||
for i in range(len(file)):
|
for i in file:
|
||||||
if not regex_match("#(.*)", file[i]):
|
if not regex_match("#(.*)", i):
|
||||||
if file[i] == "[Peer]":
|
if i == "[Peer]":
|
||||||
peers_start = i
|
peers_start = i
|
||||||
break
|
break
|
||||||
else:
|
|
||||||
if len(file[i]) > 0:
|
if len(i) > 0:
|
||||||
if file[i] != "[Interface]":
|
if i != "[Interface]":
|
||||||
tmp = re.split(r'\s*=\s*', file[i], 1)
|
tmp = re.split(r'\s*=\s*', i, 1)
|
||||||
if len(tmp) == 2:
|
if len(tmp) == 2:
|
||||||
conf_peer_data['Interface'][tmp[0]] = tmp[1]
|
conf_peer_data['Interface'][tmp[0]] = tmp[1]
|
||||||
conf_peers = file[peers_start:]
|
conf_peers = file[peers_start:]
|
||||||
peer = -1
|
peer = -1
|
||||||
for i in conf_peers:
|
for i in conf_peers:
|
||||||
@ -145,7 +147,7 @@ def read_conf_file(config_name):
|
|||||||
conf_peer_data["Peers"].append({})
|
conf_peer_data["Peers"].append({})
|
||||||
elif peer > -1:
|
elif peer > -1:
|
||||||
if len(i) > 0:
|
if len(i) > 0:
|
||||||
tmp = re.split('\s*=\s*', i, 1)
|
tmp = re.split(r'\s*=\s*', i, 1)
|
||||||
if len(tmp) == 2:
|
if len(tmp) == 2:
|
||||||
conf_peer_data["Peers"][peer][tmp[0]] = tmp[1]
|
conf_peer_data["Peers"][peer][tmp[0]] = tmp[1]
|
||||||
|
|
||||||
@ -164,20 +166,22 @@ def get_latest_handshake(config_name, db, peers):
|
|||||||
data_usage = data_usage.decode("UTF-8").split()
|
data_usage = data_usage.decode("UTF-8").split()
|
||||||
count = 0
|
count = 0
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
b = timedelta(minutes=2)
|
time_delta = timedelta(minutes=2)
|
||||||
for i in range(int(len(data_usage) / 2)):
|
for _ in range(int(len(data_usage) / 2)):
|
||||||
minus = now - datetime.fromtimestamp(int(data_usage[count + 1]))
|
minus = now - datetime.fromtimestamp(int(data_usage[count + 1]))
|
||||||
if minus < b:
|
if minus < time_delta:
|
||||||
status = "running"
|
status = "running"
|
||||||
else:
|
else:
|
||||||
status = "stopped"
|
status = "stopped"
|
||||||
if int(data_usage[count + 1]) > 0:
|
if int(data_usage[count + 1]) > 0:
|
||||||
db.update({"latest_handshake": str(minus).split(".")[0], "status": status},
|
db.update({"latest_handshake": str(minus).split(".", maxsplit=1)[0], "status": status},
|
||||||
peers.id == data_usage[count])
|
peers.id == data_usage[count])
|
||||||
else:
|
else:
|
||||||
db.update({"latest_handshake": "(None)", "status": status}, peers.id == data_usage[count])
|
db.update({"latest_handshake": "(None)", "status": status}, peers.id == data_usage[count])
|
||||||
count += 2
|
count += 2
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Get transfer from all peers of a configuration
|
# Get transfer from all peers of a configuration
|
||||||
def get_transfer(config_name, db, peers):
|
def get_transfer(config_name, db, peers):
|
||||||
@ -189,7 +193,7 @@ def get_transfer(config_name, db, peers):
|
|||||||
return "stopped"
|
return "stopped"
|
||||||
data_usage = data_usage.decode("UTF-8").split()
|
data_usage = data_usage.decode("UTF-8").split()
|
||||||
count = 0
|
count = 0
|
||||||
for i in range(int(len(data_usage) / 3)):
|
for _ in range(int(len(data_usage) / 3)):
|
||||||
cur_i = db.search(peers.id == data_usage[count])
|
cur_i = db.search(peers.id == data_usage[count])
|
||||||
total_sent = cur_i[0]['total_sent']
|
total_sent = cur_i[0]['total_sent']
|
||||||
total_receive = cur_i[0]['total_receive']
|
total_receive = cur_i[0]['total_receive']
|
||||||
@ -215,6 +219,8 @@ def get_transfer(config_name, db, peers):
|
|||||||
|
|
||||||
count += 3
|
count += 3
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Get endpoint from all peers of a configuration
|
# Get endpoint from all peers of a configuration
|
||||||
def get_endpoint(config_name, db, peers):
|
def get_endpoint(config_name, db, peers):
|
||||||
@ -226,10 +232,12 @@ def get_endpoint(config_name, db, peers):
|
|||||||
return "stopped"
|
return "stopped"
|
||||||
data_usage = data_usage.decode("UTF-8").split()
|
data_usage = data_usage.decode("UTF-8").split()
|
||||||
count = 0
|
count = 0
|
||||||
for i in range(int(len(data_usage) / 2)):
|
for _ in range(int(len(data_usage) / 2)):
|
||||||
db.update({"endpoint": data_usage[count + 1]}, peers.id == data_usage[count])
|
db.update({"endpoint": data_usage[count + 1]}, peers.id == data_usage[count])
|
||||||
count += 2
|
count += 2
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Get allowed ips from all peers of a configuration
|
# Get allowed ips from all peers of a configuration
|
||||||
def get_allowed_ip(db, peers, conf_peer_data):
|
def get_allowed_ip(db, peers, conf_peer_data):
|
||||||
@ -377,10 +385,8 @@ def get_conf_total_data(config_name):
|
|||||||
# Get configuration status
|
# Get configuration status
|
||||||
def get_conf_status(config_name):
|
def get_conf_status(config_name):
|
||||||
ifconfig = dict(ifcfg.interfaces().items())
|
ifconfig = dict(ifcfg.interfaces().items())
|
||||||
if config_name in ifconfig.keys():
|
|
||||||
return "running"
|
return "running" if config_name in ifconfig.keys() else "stopped"
|
||||||
else:
|
|
||||||
return "stopped"
|
|
||||||
|
|
||||||
|
|
||||||
# Get all configuration as a list
|
# Get all configuration as a list
|
||||||
@ -402,9 +408,9 @@ def get_conf_list():
|
|||||||
|
|
||||||
# Generate private key
|
# Generate private key
|
||||||
def gen_private_key():
|
def gen_private_key():
|
||||||
with open('private_key.txt') as file_object:
|
with open('private_key.txt', encoding='utf-8') as file_object:
|
||||||
private_key = file_object.readline().strip()
|
private_key = file_object.readline().strip()
|
||||||
with open('public_key.txt') as file_object:
|
with open('public_key.txt', encoding='utf-8') as file_object:
|
||||||
public_key = file_object.readline().strip()
|
public_key = file_object.readline().strip()
|
||||||
data = {"private_key": private_key, "public_key": public_key}
|
data = {"private_key": private_key, "public_key": public_key}
|
||||||
os.remove('private_key.txt')
|
os.remove('private_key.txt')
|
||||||
@ -414,10 +420,10 @@ def gen_private_key():
|
|||||||
|
|
||||||
# Generate public key
|
# Generate public key
|
||||||
def gen_public_key(private_key):
|
def gen_public_key(private_key):
|
||||||
with open('private_key.txt', 'w') as file_object:
|
with open('private_key.txt', 'w', encoding='utf-8') as file_object:
|
||||||
file_object.write(private_key)
|
file_object.write(private_key)
|
||||||
try:
|
try:
|
||||||
with open('public_key.txt') as file_object:
|
with open('public_key.txt', encoding='utf-8') as file_object:
|
||||||
public_key = file_object.readline().strip()
|
public_key = file_object.readline().strip()
|
||||||
os.remove('private_key.txt')
|
os.remove('private_key.txt')
|
||||||
os.remove('public_key.txt')
|
os.remove('public_key.txt')
|
||||||
@ -428,28 +434,28 @@ def gen_public_key(private_key):
|
|||||||
|
|
||||||
|
|
||||||
# Check if private key and public key match
|
# Check if private key and public key match
|
||||||
def checkKeyMatch(private_key, public_key, config_name):
|
def f_check_key_match(private_key, public_key, config_name):
|
||||||
result = gen_public_key(private_key)
|
result = gen_public_key(private_key)
|
||||||
if result['status'] == 'failed':
|
if result['status'] == 'failed':
|
||||||
return result
|
return result
|
||||||
else:
|
|
||||||
sem.acquire()
|
|
||||||
|
|
||||||
db = TinyDB('db/' + config_name + '.json')
|
sem.acquire()
|
||||||
peers = Query()
|
|
||||||
match = db.search(peers.id == result['data'])
|
db = TinyDB('db/' + config_name + '.json')
|
||||||
if len(match) != 1 or result['data'] != public_key:
|
peers = Query()
|
||||||
db.close()
|
match = db.search(peers.id == result['data'])
|
||||||
sem.release()
|
if len(match) != 1 or result['data'] != public_key:
|
||||||
return {'status': 'failed', 'msg': 'Please check your private key, it does not match with the public key.'}
|
db.close()
|
||||||
else:
|
sem.release()
|
||||||
db.close()
|
return {'status': 'failed', 'msg': 'Please check your private key, it does not match with the public key.'}
|
||||||
sem.release()
|
|
||||||
return {'status': 'success'}
|
db.close()
|
||||||
|
sem.release()
|
||||||
|
return {'status': 'success'}
|
||||||
|
|
||||||
|
|
||||||
# Check if there is repeated allowed IP
|
# Check if there is repeated allowed IP
|
||||||
def check_repeat_allowed_IP(public_key, ip, config_name):
|
def check_repeat_allowed_ip(public_key, ip, config_name):
|
||||||
sem.acquire()
|
sem.acquire()
|
||||||
|
|
||||||
db = TinyDB('db/' + config_name + '.json')
|
db = TinyDB('db/' + config_name + '.json')
|
||||||
@ -457,16 +463,16 @@ def check_repeat_allowed_IP(public_key, ip, config_name):
|
|||||||
peer = db.search(peers.id == public_key)
|
peer = db.search(peers.id == public_key)
|
||||||
if len(peer) != 1:
|
if len(peer) != 1:
|
||||||
return {'status': 'failed', 'msg': 'Peer does not exist'}
|
return {'status': 'failed', 'msg': 'Peer does not exist'}
|
||||||
else:
|
|
||||||
existed_ip = db.search((peers.id != public_key) & (peers.allowed_ip == ip))
|
existed_ip = db.search((peers.id != public_key) & (peers.allowed_ip == ip))
|
||||||
if len(existed_ip) != 0:
|
if len(existed_ip) != 0:
|
||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
return {'status': 'failed', 'msg': "Allowed IP already taken by another peer."}
|
return {'status': 'failed', 'msg': "Allowed IP already taken by another peer."}
|
||||||
else:
|
|
||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
return {'status': 'success'}
|
return {'status': 'success'}
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -478,10 +484,10 @@ Flask Functions
|
|||||||
@app.before_request
|
@app.before_request
|
||||||
def auth_req():
|
def auth_req():
|
||||||
conf = configparser.ConfigParser(strict=False)
|
conf = configparser.ConfigParser(strict=False)
|
||||||
conf.read(dashboard_conf)
|
conf.read(DASHBOARD_CONF)
|
||||||
req = conf.get("Server", "auth_req")
|
req = conf.get("Server", "auth_req")
|
||||||
session['update'] = update
|
session['update'] = UPDATE
|
||||||
session['dashboard_version'] = dashboard_version
|
session['dashboard_version'] = DASHBOARD_VERSION
|
||||||
if req == "true":
|
if req == "true":
|
||||||
if '/static/' not in request.path and \
|
if '/static/' not in request.path and \
|
||||||
request.endpoint != "signin" and \
|
request.endpoint != "signin" and \
|
||||||
@ -499,6 +505,8 @@ def auth_req():
|
|||||||
'update_app_ip_port', 'update_wg_conf_path']:
|
'update_app_ip_port', 'update_wg_conf_path']:
|
||||||
return redirect(url_for("index"))
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Sign In / Sign Out
|
Sign In / Sign Out
|
||||||
@ -528,17 +536,17 @@ def signout():
|
|||||||
@app.route('/auth', methods=['POST'])
|
@app.route('/auth', methods=['POST'])
|
||||||
def auth():
|
def auth():
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
password = hashlib.sha256(request.form['password'].encode())
|
password = hashlib.sha256(request.form['password'].encode())
|
||||||
if password.hexdigest() == config["Account"]["password"] \
|
if password.hexdigest() == config["Account"]["password"] \
|
||||||
and request.form['username'] == config["Account"]["username"]:
|
and request.form['username'] == config["Account"]["username"]:
|
||||||
session['username'] = request.form['username']
|
session['username'] = request.form['username']
|
||||||
config.clear()
|
config.clear()
|
||||||
return redirect(url_for("index"))
|
return redirect(url_for("index"))
|
||||||
else:
|
|
||||||
session['message'] = "Username or Password is incorrect."
|
session['message'] = "Username or Password is incorrect."
|
||||||
config.clear()
|
config.clear()
|
||||||
return redirect(url_for("signin"))
|
return redirect(url_for("signin"))
|
||||||
|
|
||||||
|
|
||||||
@app.route('/', methods=['GET'])
|
@app.route('/', methods=['GET'])
|
||||||
@ -560,7 +568,7 @@ def settings():
|
|||||||
message = ""
|
message = ""
|
||||||
status = ""
|
status = ""
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
if "message" in session and "message_status" in session:
|
if "message" in session and "message_status" in session:
|
||||||
message = session['message']
|
message = session['message']
|
||||||
status = session['message_status']
|
status = session['message_status']
|
||||||
@ -585,10 +593,10 @@ def update_acct():
|
|||||||
session['message_status'] = "danger"
|
session['message_status'] = "danger"
|
||||||
return redirect(url_for("settings"))
|
return redirect(url_for("settings"))
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
config.set("Account", "username", request.form['username'])
|
config.set("Account", "username", request.form['username'])
|
||||||
try:
|
try:
|
||||||
with open(dashboard_conf, "w") as config_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as config_object:
|
||||||
config.write(config_object)
|
config.write(config_object)
|
||||||
config.clear()
|
config.clear()
|
||||||
session['message'] = "Username update successfully!"
|
session['message'] = "Username update successfully!"
|
||||||
@ -606,7 +614,7 @@ def update_acct():
|
|||||||
@app.route('/update_peer_default_config', methods=['POST'])
|
@app.route('/update_peer_default_config', methods=['POST'])
|
||||||
def update_peer_default_config():
|
def update_peer_default_config():
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
if len(request.form['peer_endpoint_allowed_ip']) == 0 or \
|
if len(request.form['peer_endpoint_allowed_ip']) == 0 or \
|
||||||
len(request.form['peer_global_DNS']) == 0 or \
|
len(request.form['peer_global_DNS']) == 0 or \
|
||||||
len(request.form['peer_remote_endpoint']) == 0:
|
len(request.form['peer_remote_endpoint']) == 0:
|
||||||
@ -653,7 +661,7 @@ def update_peer_default_config():
|
|||||||
config.set("Peers", "peer_global_DNS", dns_addresses)
|
config.set("Peers", "peer_global_DNS", dns_addresses)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(dashboard_conf, "w") as conf_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as conf_object:
|
||||||
config.write(conf_object)
|
config.write(conf_object)
|
||||||
session['message'] = "Peer Default Settings update successfully!"
|
session['message'] = "Peer Default Settings update successfully!"
|
||||||
session['message_status'] = "success"
|
session['message_status'] = "success"
|
||||||
@ -670,13 +678,13 @@ def update_peer_default_config():
|
|||||||
@app.route('/update_pwd', methods=['POST'])
|
@app.route('/update_pwd', methods=['POST'])
|
||||||
def update_pwd():
|
def update_pwd():
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
if hashlib.sha256(request.form['currentpass'].encode()).hexdigest() == config.get("Account", "password"):
|
if hashlib.sha256(request.form['currentpass'].encode()).hexdigest() == config.get("Account", "password"):
|
||||||
if hashlib.sha256(request.form['newpass'].encode()).hexdigest() == hashlib.sha256(
|
if hashlib.sha256(request.form['newpass'].encode()).hexdigest() == hashlib.sha256(
|
||||||
request.form['repnewpass'].encode()).hexdigest():
|
request.form['repnewpass'].encode()).hexdigest():
|
||||||
config.set("Account", "password", hashlib.sha256(request.form['repnewpass'].encode()).hexdigest())
|
config.set("Account", "password", hashlib.sha256(request.form['repnewpass'].encode()).hexdigest())
|
||||||
try:
|
try:
|
||||||
with open(dashboard_conf, "w") as conf_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as conf_object:
|
||||||
config.write(conf_object)
|
config.write(conf_object)
|
||||||
session['message'] = "Password update successfully!"
|
session['message'] = "Password update successfully!"
|
||||||
session['message_status'] = "success"
|
session['message_status'] = "success"
|
||||||
@ -703,10 +711,10 @@ def update_pwd():
|
|||||||
@app.route('/update_app_ip_port', methods=['POST'])
|
@app.route('/update_app_ip_port', methods=['POST'])
|
||||||
def update_app_ip_port():
|
def update_app_ip_port():
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
config.set("Server", "app_ip", request.form['app_ip'])
|
config.set("Server", "app_ip", request.form['app_ip'])
|
||||||
config.set("Server", "app_port", request.form['app_port'])
|
config.set("Server", "app_port", request.form['app_port'])
|
||||||
with open(dashboard_conf, "w") as config_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as config_object:
|
||||||
config.write(config_object)
|
config.write(config_object)
|
||||||
config.clear()
|
config.clear()
|
||||||
os.system('bash wgd.sh restart')
|
os.system('bash wgd.sh restart')
|
||||||
@ -716,9 +724,9 @@ def update_app_ip_port():
|
|||||||
@app.route('/update_wg_conf_path', methods=['POST'])
|
@app.route('/update_wg_conf_path', methods=['POST'])
|
||||||
def update_wg_conf_path():
|
def update_wg_conf_path():
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
config.set("Server", "wg_conf_path", request.form['wg_conf_path'])
|
config.set("Server", "wg_conf_path", request.form['wg_conf_path'])
|
||||||
with open(dashboard_conf, "w") as config_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as config_object:
|
||||||
config.write(config_object)
|
config.write(config_object)
|
||||||
config.clear()
|
config.clear()
|
||||||
session['message'] = "WireGuard Configuration Path Update Successfully!"
|
session['message'] = "WireGuard Configuration Path Update Successfully!"
|
||||||
@ -734,14 +742,14 @@ def update_dashbaord_sort():
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
sort_tag = ['name', 'status', 'allowed_ip']
|
sort_tag = ['name', 'status', 'allowed_ip']
|
||||||
if data['sort'] in sort_tag:
|
if data['sort'] in sort_tag:
|
||||||
config.set("Server", "dashboard_sort", data['sort'])
|
config.set("Server", "dashboard_sort", data['sort'])
|
||||||
else:
|
else:
|
||||||
config.set("Server", "dashboard_sort", 'status')
|
config.set("Server", "dashboard_sort", 'status')
|
||||||
with open(dashboard_conf, "w") as config_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as config_object:
|
||||||
config.write(config_object)
|
config.write(config_object)
|
||||||
config.clear()
|
config.clear()
|
||||||
return "true"
|
return "true"
|
||||||
@ -751,9 +759,9 @@ def update_dashbaord_sort():
|
|||||||
@app.route('/update_dashboard_refresh_interval', methods=['POST'])
|
@app.route('/update_dashboard_refresh_interval', methods=['POST'])
|
||||||
def update_dashboard_refresh_interval():
|
def update_dashboard_refresh_interval():
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
config.set("Server", "dashboard_refresh_interval", str(request.form['interval']))
|
config.set("Server", "dashboard_refresh_interval", str(request.form['interval']))
|
||||||
with open(dashboard_conf, "w") as config_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as config_object:
|
||||||
config.write(config_object)
|
config.write(config_object)
|
||||||
config.clear()
|
config.clear()
|
||||||
return "true"
|
return "true"
|
||||||
@ -761,9 +769,9 @@ def update_dashboard_refresh_interval():
|
|||||||
|
|
||||||
# Configuration Page
|
# Configuration Page
|
||||||
@app.route('/configuration/<config_name>', methods=['GET'])
|
@app.route('/configuration/<config_name>', methods=['GET'])
|
||||||
def conf(config_name):
|
def configuration(config_name):
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
conf_data = {
|
conf_data = {
|
||||||
"name": config_name,
|
"name": config_name,
|
||||||
"status": get_conf_status(config_name),
|
"status": get_conf_status(config_name),
|
||||||
@ -774,7 +782,7 @@ def conf(config_name):
|
|||||||
else:
|
else:
|
||||||
conf_data['checked'] = "checked"
|
conf_data['checked'] = "checked"
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
config_list = get_conf_list()
|
config_list = get_conf_list()
|
||||||
if config_name not in [conf['conf'] for conf in config_list]:
|
if config_name not in [conf['conf'] for conf in config_list]:
|
||||||
return render_template('index.html', conf=get_conf_list())
|
return render_template('index.html', conf=get_conf_list())
|
||||||
@ -796,10 +804,10 @@ def get_conf(config_name):
|
|||||||
search = ""
|
search = ""
|
||||||
search = urllib.parse.unquote(search)
|
search = urllib.parse.unquote(search)
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
sort = config.get("Server", "dashboard_sort")
|
sort = config.get("Server", "dashboard_sort")
|
||||||
peer_display_mode = config.get("Peers", "peer_display_mode")
|
peer_display_mode = config.get("Peers", "peer_display_mode")
|
||||||
if "Address" not in config_interface.keys():
|
if "Address" not in config_interface:
|
||||||
conf_address = "N/A"
|
conf_address = "N/A"
|
||||||
else:
|
else:
|
||||||
conf_address = config_interface['Address']
|
conf_address = config_interface['Address']
|
||||||
@ -864,7 +872,7 @@ def add_peer(config_name):
|
|||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
return "Please fill in all required box."
|
return "Please fill in all required box."
|
||||||
if type(keys) != list:
|
if not isinstance(keys, list):
|
||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
return config_name + " is not running."
|
return config_name + " is not running."
|
||||||
@ -922,25 +930,25 @@ def remove_peer(config_name):
|
|||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
delete_key = data['peer_id']
|
delete_key = data['peer_id']
|
||||||
keys = get_conf_peer_key(config_name)
|
keys = get_conf_peer_key(config_name)
|
||||||
if type(keys) != list:
|
if not isinstance(keys, list):
|
||||||
return config_name + " is not running."
|
return config_name + " is not running."
|
||||||
if delete_key not in keys:
|
if delete_key not in keys:
|
||||||
db.close()
|
db.close()
|
||||||
return "This key does not exist"
|
return "This key does not exist"
|
||||||
else:
|
|
||||||
try:
|
try:
|
||||||
subprocess.run(f"wg set {config_name} peer {delete_key} remove",
|
subprocess.run(f"wg set {config_name} peer {delete_key} remove",
|
||||||
check=True, shell=True, capture_output=True, stderr=subprocess.STDOUT)
|
check=True, shell=True, capture_output=True, stderr=subprocess.STDOUT)
|
||||||
subprocess.run("wg-quick save " + config_name,
|
subprocess.run("wg-quick save " + config_name,
|
||||||
check=True, shell=True, capture_output=True, stderr=subprocess.STDOUT)
|
check=True, shell=True, capture_output=True, stderr=subprocess.STDOUT)
|
||||||
db.remove(peers.id == delete_key)
|
db.remove(peers.id == delete_key)
|
||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
return "true"
|
return "true"
|
||||||
except subprocess.CalledProcessError as exc:
|
except subprocess.CalledProcessError as exc:
|
||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
return exc.output.strip()
|
return exc.output.strip()
|
||||||
|
|
||||||
|
|
||||||
# Save peer settings
|
# Save peer settings
|
||||||
@ -958,7 +966,7 @@ def save_peer_setting(config_name):
|
|||||||
db = TinyDB('db/' + config_name + '.json')
|
db = TinyDB('db/' + config_name + '.json')
|
||||||
peers = Query()
|
peers = Query()
|
||||||
if len(db.search(peers.id == id)) == 1:
|
if len(db.search(peers.id == id)) == 1:
|
||||||
check_ip = check_repeat_allowed_IP(id, allowed_ip, config_name)
|
check_ip = check_repeat_allowed_ip(id, allowed_ip, config_name)
|
||||||
if not check_IP_with_range(endpoint_allowed_ip):
|
if not check_IP_with_range(endpoint_allowed_ip):
|
||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
@ -976,7 +984,7 @@ def save_peer_setting(config_name):
|
|||||||
sem.release()
|
sem.release()
|
||||||
return jsonify({"status": "failed", "msg": "Persistent Keepalive format is not correct."})
|
return jsonify({"status": "failed", "msg": "Persistent Keepalive format is not correct."})
|
||||||
if private_key != "":
|
if private_key != "":
|
||||||
check_key = checkKeyMatch(private_key, id, config_name)
|
check_key = f_check_key_match(private_key, id, config_name)
|
||||||
if check_key['status'] == "failed":
|
if check_key['status'] == "failed":
|
||||||
db.close()
|
db.close()
|
||||||
sem.release()
|
sem.release()
|
||||||
@ -1054,7 +1062,7 @@ def check_key_match(config_name):
|
|||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
private_key = data['private_key']
|
private_key = data['private_key']
|
||||||
public_key = data['public_key']
|
public_key = data['public_key']
|
||||||
return jsonify(checkKeyMatch(private_key, public_key, config_name))
|
return jsonify(f_check_key_match(private_key, public_key, config_name))
|
||||||
|
|
||||||
|
|
||||||
@app.route("/qrcode/<config_name>", methods=['GET'])
|
@app.route("/qrcode/<config_name>", methods=['GET'])
|
||||||
@ -1145,22 +1153,23 @@ def download(config_name):
|
|||||||
return app.response_class((yield result),
|
return app.response_class((yield result),
|
||||||
mimetype='text/conf',
|
mimetype='text/conf',
|
||||||
headers={"Content-Disposition": "attachment;filename=" + filename + ".conf"})
|
headers={"Content-Disposition": "attachment;filename=" + filename + ".conf"})
|
||||||
else:
|
|
||||||
db.close()
|
db.close()
|
||||||
return redirect("/configuration/" + config_name)
|
return redirect("/configuration/" + config_name)
|
||||||
|
|
||||||
|
|
||||||
# Switch peer displate mode
|
# Switch peer displate mode
|
||||||
@app.route('/switch_display_mode/<mode>', methods=['GET'])
|
@app.route('/switch_display_mode/<mode>', methods=['GET'])
|
||||||
def switch_display_mode(mode):
|
def switch_display_mode(mode):
|
||||||
if mode in ['list', 'grid']:
|
if mode in ['list', 'grid']:
|
||||||
config.read(dashboard_conf)
|
config = configparser.ConfigParser(strict=False)
|
||||||
|
config.read(DASHBOARD_CONF)
|
||||||
config.set("Peers", "peer_display_mode", mode)
|
config.set("Peers", "peer_display_mode", mode)
|
||||||
with open(dashboard_conf, "w") as config_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as config_object:
|
||||||
config.write(config_object)
|
config.write(config_object)
|
||||||
return "true"
|
return "true"
|
||||||
else:
|
|
||||||
return "false"
|
return "false"
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -1239,9 +1248,9 @@ Dashboard Initialization
|
|||||||
def init_dashboard():
|
def init_dashboard():
|
||||||
# Set Default INI File
|
# Set Default INI File
|
||||||
if not os.path.isfile("wg-dashboard.ini"):
|
if not os.path.isfile("wg-dashboard.ini"):
|
||||||
open("wg-dashboard.ini", "w")
|
open("wg-dashboard.ini", "w", encoding='utf-8')
|
||||||
config = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
config.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
# Defualt dashboard account setting
|
# Defualt dashboard account setting
|
||||||
if "Account" not in config:
|
if "Account" not in config:
|
||||||
config['Account'] = {}
|
config['Account'] = {}
|
||||||
@ -1261,8 +1270,8 @@ def init_dashboard():
|
|||||||
config['Server']['app_port'] = '10086'
|
config['Server']['app_port'] = '10086'
|
||||||
if 'auth_req' not in config['Server']:
|
if 'auth_req' not in config['Server']:
|
||||||
config['Server']['auth_req'] = 'true'
|
config['Server']['auth_req'] = 'true'
|
||||||
if 'version' not in config['Server'] or config['Server']['version'] != dashboard_version:
|
if 'version' not in config['Server'] or config['Server']['version'] != DASHBOARD_VERSION:
|
||||||
config['Server']['version'] = dashboard_version
|
config['Server']['version'] = DASHBOARD_VERSION
|
||||||
if 'dashboard_refresh_interval' not in config['Server']:
|
if 'dashboard_refresh_interval' not in config['Server']:
|
||||||
config['Server']['dashboard_refresh_interval'] = '60000'
|
config['Server']['dashboard_refresh_interval'] = '60000'
|
||||||
if 'dashboard_sort' not in config['Server']:
|
if 'dashboard_sort' not in config['Server']:
|
||||||
@ -1282,7 +1291,7 @@ def init_dashboard():
|
|||||||
config['Peers']['peer_MTU'] = "1420"
|
config['Peers']['peer_MTU'] = "1420"
|
||||||
if 'peer_keep_alive' not in config['Peers']:
|
if 'peer_keep_alive' not in config['Peers']:
|
||||||
config['Peers']['peer_keep_alive'] = "21"
|
config['Peers']['peer_keep_alive'] = "21"
|
||||||
with open(dashboard_conf, "w") as config_object:
|
with open(DASHBOARD_CONF, "w", encoding='utf-8') as config_object:
|
||||||
config.write(config_object)
|
config.write(config_object)
|
||||||
config.clear()
|
config.clear()
|
||||||
|
|
||||||
@ -1292,36 +1301,38 @@ def check_update():
|
|||||||
Dashboard check update
|
Dashboard check update
|
||||||
"""
|
"""
|
||||||
|
|
||||||
conf = configparser.ConfigParser(strict=False)
|
config = configparser.ConfigParser(strict=False)
|
||||||
conf.read(dashboard_conf)
|
config.read(DASHBOARD_CONF)
|
||||||
data = urllib.request.urlopen("https://api.github.com/repos/donaldzou/WGDashboard/releases").read()
|
data = urllib.request.urlopen("https://api.github.com/repos/donaldzou/WGDashboard/releases").read()
|
||||||
output = json.loads(data)
|
output = json.loads(data)
|
||||||
release = []
|
release = []
|
||||||
for i in output:
|
for i in output:
|
||||||
if not i["prerelease"]:
|
if not i["prerelease"]:
|
||||||
release.append(i)
|
release.append(i)
|
||||||
if conf.get("Server", "version") == release[0]["tag_name"]:
|
if config.get("Server", "version") == release[0]["tag_name"]:
|
||||||
return "false"
|
result = "false"
|
||||||
else:
|
else:
|
||||||
return "true"
|
result = "true"
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
init_dashboard()
|
init_dashboard()
|
||||||
update = check_update()
|
UPDATE = check_update()
|
||||||
config = configparser.ConfigParser(strict=False)
|
configuration_settings = configparser.ConfigParser(strict=False)
|
||||||
config.read('wg-dashboard.ini')
|
configuration_settings.read('wg-dashboard.ini')
|
||||||
app_ip = config.get("Server", "app_ip")
|
app_ip = configuration_settings.get("Server", "app_ip")
|
||||||
app_port = int(config.get("Server", "app_port"))
|
app_port = int(configuration_settings.get("Server", "app_port"))
|
||||||
wg_conf_path = config.get("Server", "wg_conf_path")
|
wg_conf_path = configuration_settings.get("Server", "wg_conf_path")
|
||||||
config.clear()
|
configuration_settings.clear()
|
||||||
app.run(host=app_ip, debug=False, port=app_port)
|
app.run(host=app_ip, debug=False, port=app_port)
|
||||||
else:
|
else:
|
||||||
init_dashboard()
|
init_dashboard()
|
||||||
update = check_update()
|
UPDATE = check_update()
|
||||||
config = configparser.ConfigParser(strict=False)
|
configuration_settings = configparser.ConfigParser(strict=False)
|
||||||
config.read('wg-dashboard.ini')
|
configuration_settings.read('wg-dashboard.ini')
|
||||||
app_ip = config.get("Server", "app_ip")
|
app_ip = configuration_settings.get("Server", "app_ip")
|
||||||
app_port = config.get("Server", "app_port")
|
app_port = configuration_settings.get("Server", "app_port")
|
||||||
wg_conf_path = config.get("Server", "wg_conf_path")
|
wg_conf_path = configuration_settings.get("Server", "wg_conf_path")
|
||||||
config.clear()
|
configuration_settings.clear()
|
||||||
|
Loading…
Reference in New Issue
Block a user