From e84616f5f5f2575628717753bb19102f014cbf09 Mon Sep 17 00:00:00 2001 From: Galonza Peter Date: Sun, 24 Oct 2021 00:56:34 +0300 Subject: [PATCH 1/8] added the ability to change the path for files to be saved --- src/dashboard.py | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/dashboard.py b/src/dashboard.py index 99a4c19..b1c6819 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -6,6 +6,8 @@ Under Apache-2.0 License # Python Built-in Library import os +import sys + from flask import Flask, request, render_template, redirect, url_for, session, abort, jsonify import subprocess from datetime import datetime, date, time, timedelta @@ -24,7 +26,10 @@ from icmplib import ping, multiping, traceroute, resolve, Host, Hop # Dashboard Version dashboard_version = 'v2.3.1' # Dashboard Config Name -dashboard_conf = 'wg-dashboard.ini' +configuration_path = os.getenv('CONFIGURATION_PATH', '.') +db_path = os.path.join(configuration_path, 'db') +dashboard_conf = os.path.join(configuration_path, 'wg-dashboard.ini') +sys.exit() # Upgrade Required update = "" # Flask App Configuration @@ -261,7 +266,7 @@ def get_allowed_ip(config_name, db, peers, conf_peer_data): # Look for new peers from WireGuard def get_all_peers_data(config_name): - db = TinyDB('db/' + config_name + '.json') + db = TinyDB(os.path.join(db_path, config_name + '.json')) peers = Query() conf_peer_data = read_conf_file(config_name) config = get_dashboard_conf() @@ -325,7 +330,7 @@ Frontend Related Functions # Search for peers def get_peers(config_name, search, sort_t): get_all_peers_data(config_name) - db = TinyDB('db/' + config_name + '.json') + db = TinyDB(os.path.join(db_path, config_name + ".json")) peer = Query() if len(search) == 0: result = db.all() @@ -363,7 +368,7 @@ def get_conf_listen_port(config_name): # Get configuration total data def get_conf_total_data(config_name): - db = TinyDB('db/' + config_name + '.json') + db = TinyDB(os.path.join(db_path, config_name + ".json")) upload_total = 0 download_total = 0 for i in db.all(): @@ -439,7 +444,7 @@ def checkKeyMatch(private_key, public_key, config_name): if result['status'] == 'failed': return result else: - db = TinyDB('db/' + config_name + '.json') + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() match = db.search(peers.id == result['data']) if len(match) != 1 or result['data'] != public_key: @@ -449,7 +454,7 @@ def checkKeyMatch(private_key, public_key, config_name): # Check if there is repeated allowed IP def check_repeat_allowed_IP(public_key, ip, config_name): - db = TinyDB('db/' + config_name + '.json') + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() peer = db.search(peers.id == public_key) if len(peer) != 1: @@ -816,7 +821,7 @@ def switch(config_name): # Add peer @app.route('/add_peer/', methods=['POST']) def add_peer(config_name): - db = TinyDB("db/" + config_name + ".json") + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() data = request.get_json() public_key = data['public_key'] @@ -866,7 +871,7 @@ def add_peer(config_name): def remove_peer(config_name): if get_conf_status(config_name) == "stopped": return "Your need to turn on " + config_name + " first." - db = TinyDB("db/" + config_name + ".json") + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() data = request.get_json() delete_key = data['peer_id'] @@ -897,7 +902,7 @@ def save_peer_setting(config_name): DNS = data['DNS'] allowed_ip = data['allowed_ip'] endpoint_allowed_ip = data['endpoint_allowed_ip'] - db = TinyDB("db/" + config_name + ".json") + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() if len(db.search(peers.id == id)) == 1: check_ip = check_repeat_allowed_IP(id, allowed_ip, config_name) @@ -947,7 +952,7 @@ def save_peer_setting(config_name): def get_peer_name(config_name): data = request.get_json() id = data['id'] - db = TinyDB("db/" + config_name + ".json") + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() result = db.search(peers.id == id) db.close() @@ -981,7 +986,7 @@ def check_key_match(config_name): def download(config_name): print(request.headers.get('User-Agent')) id = request.args.get('id') - db = TinyDB("db/" + config_name + ".json") + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() get_peer = db.search(peers.id == id) config = get_dashboard_conf() @@ -1039,7 +1044,7 @@ Dashboard Tools Related @app.route('/get_ping_ip', methods=['POST']) def get_ping_ip(): config = request.form['config'] - db = TinyDB('db/' + config + '.json') + db = TinyDB(os.path.join(db_path, config + ".json")) html = "" for i in db.all(): html += '' @@ -1099,8 +1104,8 @@ Dashboard Initialization """ def init_dashboard(): # Set Default INI File - if not os.path.isfile("wg-dashboard.ini"): - conf_file = open("wg-dashboard.ini", "w+") + if not os.path.isfile(dashboard_conf): + conf_file = open(dashboard_conf, "w+") config = configparser.ConfigParser(strict=False) config.read(dashboard_conf) # Defualt dashboard account setting @@ -1166,7 +1171,7 @@ if __name__ == "__main__": init_dashboard() update = check_update() config = configparser.ConfigParser(strict=False) - config.read('wg-dashboard.ini') + config.read(dashboard_conf) app_ip = config.get("Server", "app_ip") app_port = config.get("Server", "app_port") wg_conf_path = config.get("Server", "wg_conf_path") From 1d2c468d037e2fe63aac19598312058c79d5bd3d Mon Sep 17 00:00:00 2001 From: Galonza Peter Date: Sun, 24 Oct 2021 01:51:04 +0300 Subject: [PATCH 2/8] fixed, when database does not create, if no directory --- src/dashboard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dashboard.py b/src/dashboard.py index b1c6819..c4d1cee 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -28,6 +28,7 @@ dashboard_version = 'v2.3.1' # Dashboard Config Name configuration_path = os.getenv('CONFIGURATION_PATH', '.') db_path = os.path.join(configuration_path, 'db') +os.mkdir(db_path) dashboard_conf = os.path.join(configuration_path, 'wg-dashboard.ini') sys.exit() # Upgrade Required From 06cedec0907b64d12ea68488d6f0496d58c22f84 Mon Sep 17 00:00:00 2001 From: Galonza Peter Date: Sun, 24 Oct 2021 01:58:59 +0300 Subject: [PATCH 3/8] mistake --- src/dashboard.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dashboard.py b/src/dashboard.py index c4d1cee..f136350 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -30,7 +30,6 @@ configuration_path = os.getenv('CONFIGURATION_PATH', '.') db_path = os.path.join(configuration_path, 'db') os.mkdir(db_path) dashboard_conf = os.path.join(configuration_path, 'wg-dashboard.ini') -sys.exit() # Upgrade Required update = "" # Flask App Configuration From bed08109fadc750c67cb5d2921a08e895157225c Mon Sep 17 00:00:00 2001 From: Galonza Peter Date: Sun, 24 Oct 2021 02:10:20 +0300 Subject: [PATCH 4/8] not needed --- src/dashboard.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dashboard.py b/src/dashboard.py index f136350..22d5152 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -6,7 +6,6 @@ Under Apache-2.0 License # Python Built-in Library import os -import sys from flask import Flask, request, render_template, redirect, url_for, session, abort, jsonify import subprocess From 7ad65956c9f018c373452721d2ed2000caca2f16 Mon Sep 17 00:00:00 2001 From: Galonza Peter Date: Sun, 24 Oct 2021 12:45:08 +0300 Subject: [PATCH 5/8] fixed, if dir is exists --- src/dashboard.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dashboard.py b/src/dashboard.py index 22d5152..c9a2c47 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -27,7 +27,8 @@ dashboard_version = 'v2.3.1' # Dashboard Config Name configuration_path = os.getenv('CONFIGURATION_PATH', '.') db_path = os.path.join(configuration_path, 'db') -os.mkdir(db_path) +if not os.path.isdir(db_path): + os.mkdir(db_path) dashboard_conf = os.path.join(configuration_path, 'wg-dashboard.ini') # Upgrade Required update = "" From 8cc71913b376564c138d674222af4188cc935d12 Mon Sep 17 00:00:00 2001 From: Galonza Peter Date: Sun, 26 Dec 2021 23:17:19 +0300 Subject: [PATCH 6/8] fixed read configuration after merge --- src/dashboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dashboard.py b/src/dashboard.py index 5a3b1e2..bc3f06e 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -1269,7 +1269,7 @@ else: init_dashboard() update = check_update() config = configparser.ConfigParser(strict=False) - config.read('wg-dashboard.ini') + config.read(dashboard_conf) app_ip = config.get("Server", "app_ip") app_port = config.get("Server", "app_port") wg_conf_path = config.get("Server", "wg_conf_path") From c75854cb7b655907ee42569e1da00352625d7a72 Mon Sep 17 00:00:00 2001 From: Galonza Peter Date: Mon, 27 Dec 2021 00:32:53 +0300 Subject: [PATCH 7/8] fixed after merge --- src/dashboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dashboard.py b/src/dashboard.py index bc3f06e..9417914 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -1026,7 +1026,7 @@ def check_key_match(config_name): def generate_qrcode(config_name): id = request.args.get('id') sem.acquire() - db = TinyDB('db/' + config_name + '.json') + db = TinyDB(os.path.join(db_path, config_name + ".json")) peers = Query() get_peer = db.search(peers.id == id) config = get_dashboard_conf() From d254b4cc39a8f6cc055facabb09e364a75d94199 Mon Sep 17 00:00:00 2001 From: Donald Cheng Hong Zou Date: Mon, 27 Dec 2021 21:01:02 -0500 Subject: [PATCH 8/8] Finishing v3.0 --- .gitignore | 1 + src/dashboard.py | 45 +++++--- src/static/js/configuration.js | 39 +++++-- src/templates/configuration.html | 191 +++++++++++++++++++++++++++++-- src/templates/footer.html | 4 +- src/templates/get_conf.html | 40 +------ src/templates/header.html | 2 +- src/wgd.sh | 8 +- 8 files changed, 250 insertions(+), 80 deletions(-) diff --git a/.gitignore b/.gitignore index 85eed07..5afb0ba 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ private_key.txt public_key.txt venv/** log/** +release/* diff --git a/src/dashboard.py b/src/dashboard.py index 07959e6..41387c9 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -223,10 +223,8 @@ def get_allowed_ip(config_name, db, peers, conf_peer_data): # Look for new peers from WireGuard def get_all_peers_data(config_name): - sem.acquire() - + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') - peers = Query() conf_peer_data = read_conf_file(config_name) config = get_dashboard_conf() @@ -283,7 +281,10 @@ def get_all_peers_data(config_name): toc = time.perf_counter() print(f"Finish fetching data in {toc - tic:0.4f} seconds") db.close() - sem.release() + try: + sem.release() + except RuntimeError as e: + pass """ Frontend Related Functions @@ -291,7 +292,7 @@ Frontend Related Functions # Search for peers def get_peers(config_name, search, sort_t): get_all_peers_data(config_name) - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peer = Query() @@ -335,7 +336,7 @@ def get_conf_listen_port(config_name): # Get configuration total data def get_conf_total_data(config_name): - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') upload_total = 0 @@ -414,7 +415,7 @@ def checkKeyMatch(private_key, public_key, config_name): if result['status'] == 'failed': return result else: - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() @@ -431,7 +432,7 @@ def checkKeyMatch(private_key, public_key, config_name): # Check if there is repeated allowed IP def check_repeat_allowed_IP(public_key, ip, config_name): - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() @@ -754,7 +755,8 @@ def conf(config_name): def get_conf(config_name): config_interface = read_conf_file_interface(config_name) search = request.args.get('search') - if len(search) == 0: search = "" + if len(search) == 0: + search = "" search = urllib.parse.unquote(search) config = configparser.ConfigParser(strict=False) config.read(dashboard_conf) @@ -772,15 +774,20 @@ def get_conf(config_name): "public_key": get_conf_pub_key(config_name), "listen_port": get_conf_listen_port(config_name), "running_peer": get_conf_running_peer_number(config_name), - "conf_address": conf_address + "conf_address": conf_address, + "wg_ip": config.get("Peers","remote_endpoint"), + "sort_tag": sort, + "dashboard_refresh_interval": int(config.get("Server", "dashboard_refresh_interval")), + "peer_display_mode": peer_display_mode } if conf_data['status'] == "stopped": conf_data['checked'] = "nope" else: conf_data['checked'] = "checked" print(config.get("Peers","remote_endpoint")) - return render_template('get_conf.html', conf_data=conf_data, wg_ip=config.get("Peers","remote_endpoint"), sort_tag=sort, - dashboard_refresh_interval=int(config.get("Server", "dashboard_refresh_interval")), peer_display_mode=peer_display_mode) + return jsonify(conf_data) + # return render_template('get_conf.html', conf_data=conf_data, wg_ip=config.get("Peers","remote_endpoint"), sort_tag=sort, + # dashboard_refresh_interval=int(config.get("Server", "dashboard_refresh_interval")), peer_display_mode=peer_display_mode) # Turn on / off a configuration @app.route('/switch/', methods=['GET']) @@ -805,7 +812,7 @@ def switch(config_name): # Add peer @app.route('/add_peer/', methods=['POST']) def add_peer(config_name): - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() @@ -875,7 +882,7 @@ def add_peer(config_name): def remove_peer(config_name): if get_conf_status(config_name) == "stopped": return "Your need to turn on " + config_name + " first." - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() @@ -911,7 +918,7 @@ def save_peer_setting(config_name): DNS = data['DNS'] allowed_ip = data['allowed_ip'] endpoint_allowed_ip = data['endpoint_allowed_ip'] - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() @@ -984,7 +991,7 @@ def save_peer_setting(config_name): def get_peer_name(config_name): data = request.get_json() id = data['id'] - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() @@ -1020,7 +1027,7 @@ def check_key_match(config_name): @app.route("/qrcode/", methods=['GET']) def generate_qrcode(config_name): id = request.args.get('id') - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() get_peer = db.search(peers.id == id) @@ -1060,7 +1067,7 @@ def generate_qrcode(config_name): def download(config_name): print(request.headers.get('User-Agent')) id = request.args.get('id') - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config_name + '.json') peers = Query() get_peer = db.search(peers.id == id) @@ -1123,7 +1130,7 @@ Dashboard Tools Related @app.route('/get_ping_ip', methods=['POST']) def get_ping_ip(): config = request.form['config'] - sem.acquire() + sem.acquire(timeout=1) db = TinyDB('db/' + config + '.json') html = "" for i in db.all(): diff --git a/src/static/js/configuration.js b/src/static/js/configuration.js index a765487..7d6a4b4 100644 --- a/src/static/js/configuration.js +++ b/src/static/js/configuration.js @@ -303,7 +303,7 @@ $("body").on("change", "#sort_by_dropdown", function (){ headers:{"Content-Type": "application/json"}, url: "/update_dashboard_sort", success: function (res){ - location.reload() + load_data($('#search_peer_textbox').val()) } }) }) @@ -336,26 +336,41 @@ function copyToClipboard(element) { // Update Interval $("body").on("click", ".update_interval", function(){ - $.ajax({ - method:"POST", - data: "interval="+$(this).attr("refresh-interval"), - url: "/update_dashboard_refresh_interval", - success: function (res){ - location.reload() - } - }) - }); + $(".interval-btn-group button").removeClass("active"); + $(this).addClass("active"); + $.ajax({ + method:"POST", + data: "interval="+$(this).data("refresh-interval"), + url: "/update_dashboard_refresh_interval", + success: function (res){ + + load_data($('#search_peer_textbox').val()) + } + }) +}); $("body").on("click", ".refresh", function (){ load_data($('#search_peer_textbox').val()); }); // Switch display mode $("body").on("click", ".display_mode", function(){ + $(".display-btn-group button").removeClass("active"); + $(this).addClass("active"); + let display_mode = $(this).data("display-mode"); $.ajax({ method:"GET", - url: "/switch_display_mode/"+$(this).attr("display-mode"), + url: "/switch_display_mode/"+$(this).data("display-mode"), success: function (res){ - location.reload() + // load_data($('#search_peer_textbox').val()) + if (display_mode === "list"){ + Array($(".peer_list").children()).forEach(function(child){ + $(child).removeClass().addClass("col-12"); + }) + }else{ + Array($(".peer_list").children()).forEach(function(child){ + $(child).removeClass().addClass("col-sm-6 col-lg-4"); + }) + } } }) }) \ No newline at end of file diff --git a/src/templates/configuration.html b/src/templates/configuration.html index b1a881b..3f4612e 100644 --- a/src/templates/configuration.html +++ b/src/templates/configuration.html @@ -1,4 +1,4 @@ - + {% with title=title%} {% include "header.html"%} {% endwith %} @@ -11,7 +11,103 @@ -
+
+
+
+
+
+
+ CONFIGURATION +

{{ title }}

+
+
+ ACTION
+
+ +
+
+
+ STATUS +
+
+
+ CONNECTED PEERS +
+
+
+ TOTAL DATA USAGE +
+
+
+ TOTAL RECEIVED +
+
+
+ TOTAL SENT +
+
+
+
+ + PUBLIC KEY + CLICK TO COPY + +
+
+
+ LISTEN PORT +
+
+
+ ADDRESS +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+ + + + + +
+
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+