diff --git a/README.md b/README.md index 1d45e57..b3de95f 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ - Rewrote the backend into a REST API structure - Improved SQL query efficient - Removed all templates, except for `index.html` where it will load the Vue.js app. + - Parsing names in `.conf` + - Minimized the need to read `.conf`, only when any `.conf` is modified - **🥘 New Experimental Features** - **Cross-Server Access**: Now you can access other servers that installed `v4` of WGDashboard through API key. diff --git a/src/dashboard.py b/src/dashboard.py index c299497..f96b3c7 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -5,6 +5,7 @@ import configparser import hashlib import ipaddress import json +import traceback # Python Built-in Library import os import secrets @@ -421,6 +422,7 @@ class WireguardConfiguration: def __init__(self, name: str = None, data: dict = None): self.__parser: configparser.ConfigParser = configparser.ConfigParser(strict=False) self.__parser.optionxform = str + self.__configFileModifiedTime = None self.Status: bool = False self.Name: str = "" @@ -565,79 +567,83 @@ class WireguardConfiguration: self.RestrictedPeers.append(Peer(i, self)) def __getPeers(self): - self.Peers = [] - with open(os.path.join(WG_CONF_PATH, f'{self.Name}.conf'), 'r') as configFile: - p = [] - pCounter = -1 - content = configFile.read().split('\n') - try: - peerStarts = content.index("[Peer]") - content = content[peerStarts:] - for i in content: - if not regex_match("#(.*)", i) and not regex_match(";(.*)", i): - if i == "[Peer]": - pCounter += 1 - p.append({}) - p[pCounter]["name"] = "" - else: - if len(i) > 0: - split = re.split(r'\s*=\s*', i, 1) - if len(split) == 2: - p[pCounter][split[0]] = split[1] + + mt = os.path.getmtime(os.path.join(WG_CONF_PATH, f'{self.Name}.conf')) + if self.__configFileModifiedTime is None or self.__configFileModifiedTime != mt: + self.Peers = [] + with open(os.path.join(WG_CONF_PATH, f'{self.Name}.conf'), 'r') as configFile: + p = [] + pCounter = -1 + content = configFile.read().split('\n') + try: + peerStarts = content.index("[Peer]") + content = content[peerStarts:] + for i in content: + if not regex_match("#(.*)", i) and not regex_match(";(.*)", i): + if i == "[Peer]": + pCounter += 1 + p.append({}) + p[pCounter]["name"] = "" + else: + if len(i) > 0: + split = re.split(r'\s*=\s*', i, 1) + if len(split) == 2: + p[pCounter][split[0]] = split[1] + + if regex_match("#Name# = (.*)", i): + split = re.split(r'\s*=\s*', i, 1) + print(split) + if len(split) == 2: + p[pCounter]["name"] = split[1] - if regex_match("#Name# = (.*)", i): - split = re.split(r'\s*=\s*', i, 1) - print(split) - if len(split) == 2: - p[pCounter]["name"] = split[1] - - for i in p: - if "PublicKey" in i.keys(): - checkIfExist = sqldb.cursor().execute("SELECT * FROM '%s' WHERE id = ?" % self.Name, - ((i['PublicKey']),)).fetchone() - if checkIfExist is None: - print(i) - newPeer = { - "id": i['PublicKey'], - "private_key": "", - "DNS": DashboardConfig.GetConfig("Peers", "peer_global_DNS")[1], - "endpoint_allowed_ip": DashboardConfig.GetConfig("Peers", "peer_endpoint_allowed_ip")[ - 1], - "name": i.get("name"), - "total_receive": 0, - "total_sent": 0, - "total_data": 0, - "endpoint": "N/A", - "status": "stopped", - "latest_handshake": "N/A", - "allowed_ip": i.get("AllowedIPs", "N/A"), - "cumu_receive": 0, - "cumu_sent": 0, - "cumu_data": 0, - "traffic": [], - "mtu": DashboardConfig.GetConfig("Peers", "peer_mtu")[1], - "keepalive": DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1], - "remote_endpoint": DashboardConfig.GetConfig("Peers", "remote_endpoint")[1], - "preshared_key": i["PresharedKey"] if "PresharedKey" in i.keys() else "" - } - print(newPeer) - sqldb.cursor().execute( - """ - INSERT INTO '%s' - VALUES (:id, :private_key, :DNS, :endpoint_allowed_ip, :name, :total_receive, :total_sent, - :total_data, :endpoint, :status, :latest_handshake, :allowed_ip, :cumu_receive, :cumu_sent, - :cumu_data, :mtu, :keepalive, :remote_endpoint, :preshared_key); - """ % self.Name - , newPeer) - sqldb.commit() - self.Peers.append(Peer(newPeer, self)) - else: - sqldb.cursor().execute("UPDATE '%s' SET allowed_ip = ? WHERE id = ?" % self.Name, - (i.get("AllowedIPs", "N/A"), i['PublicKey'],)) - sqldb.commit() - self.Peers.append(Peer(checkIfExist, self)) - except Exception as e: - print(f"[WGDashboard] {self.Name} Error: {str(e)}") + for i in p: + if "PublicKey" in i.keys(): + checkIfExist = sqldb.cursor().execute("SELECT * FROM '%s' WHERE id = ?" % self.Name, + ((i['PublicKey']),)).fetchone() + if checkIfExist is None: + print(i) + newPeer = { + "id": i['PublicKey'], + "private_key": "", + "DNS": DashboardConfig.GetConfig("Peers", "peer_global_DNS")[1], + "endpoint_allowed_ip": DashboardConfig.GetConfig("Peers", "peer_endpoint_allowed_ip")[ + 1], + "name": i.get("name"), + "total_receive": 0, + "total_sent": 0, + "total_data": 0, + "endpoint": "N/A", + "status": "stopped", + "latest_handshake": "N/A", + "allowed_ip": i.get("AllowedIPs", "N/A"), + "cumu_receive": 0, + "cumu_sent": 0, + "cumu_data": 0, + "traffic": [], + "mtu": DashboardConfig.GetConfig("Peers", "peer_mtu")[1], + "keepalive": DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1], + "remote_endpoint": DashboardConfig.GetConfig("Peers", "remote_endpoint")[1], + "preshared_key": i["PresharedKey"] if "PresharedKey" in i.keys() else "" + } + print(newPeer) + sqldb.cursor().execute( + """ + INSERT INTO '%s' + VALUES (:id, :private_key, :DNS, :endpoint_allowed_ip, :name, :total_receive, :total_sent, + :total_data, :endpoint, :status, :latest_handshake, :allowed_ip, :cumu_receive, :cumu_sent, + :cumu_data, :mtu, :keepalive, :remote_endpoint, :preshared_key); + """ % self.Name + , newPeer) + sqldb.commit() + self.Peers.append(Peer(newPeer, self)) + else: + sqldb.cursor().execute("UPDATE '%s' SET allowed_ip = ? WHERE id = ?" % self.Name, + (i.get("AllowedIPs", "N/A"), i['PublicKey'],)) + sqldb.commit() + self.Peers.append(Peer(checkIfExist, self)) + except Exception as e: + print(f"[WGDashboard] {self.Name} Error: {str(e)}") + self.__configFileModifiedTime = mt def addPeers(self, peers: list): for p in peers: @@ -782,7 +788,8 @@ class WireguardConfiguration: , (status, latestHandshake[count],)) sqldb.commit() count += 2 - + + def getPeersTransfer(self): if not self.getStatus(): self.toggleConfiguration() @@ -797,6 +804,7 @@ class WireguardConfiguration: "SELECT total_receive, total_sent, cumu_receive, cumu_sent, status FROM '%s' WHERE id= ? " % self.Name, (data_usage[i][0],)).fetchone() if cur_i is not None: + cur_i = dict(cur_i) total_sent = cur_i['total_sent'] total_receive = cur_i['total_receive'] cur_total_sent = float(data_usage[i][2]) / (1024 ** 3) @@ -812,17 +820,20 @@ class WireguardConfiguration: self.Name, (cumulative_receive, cumulative_sent, cumulative_sent + cumulative_receive, data_usage[i][0],)) + sqldb.commit() total_sent = 0 total_receive = 0 - + print(data_usage[i][0]) _, p = self.searchPeer(data_usage[i][0]) if p.total_receive != total_receive or p.total_sent != total_sent: sqldb.cursor().execute( "UPDATE '%s' SET total_receive = ?, total_sent = ?, total_data = ? WHERE id = ?" % self.Name, (total_receive, total_sent, total_receive + total_sent, data_usage[i][0],)) + sqldb.commit() except Exception as e: - print("Error: " + str(e)) + traceback.print_exc() + print(f"[WGDashboard] {self.Name} Error: {str(e)} {str(e.__traceback__)}") def getPeersEndpoint(self): if not self.getStatus():