mirror of
https://github.com/donaldzou/WGDashboard.git
synced 2024-11-06 16:00:28 +01:00
Merge pull request #340 from donaldzou/v4.0-alpine-linux
V4.0 alpine linux
This commit is contained in:
commit
c012b8c4a5
197
src/dashboard.py
197
src/dashboard.py
@ -442,6 +442,8 @@ class WireguardConfiguration:
|
|||||||
return self.message
|
return self.message
|
||||||
|
|
||||||
def __init__(self, name: str = None, data: dict = None):
|
def __init__(self, name: str = None, data: dict = None):
|
||||||
|
print(f"[WGDashboard] Initialized Configuration: {name}")
|
||||||
|
|
||||||
self.__parser: configparser.ConfigParser = configparser.ConfigParser(strict=False)
|
self.__parser: configparser.ConfigParser = configparser.ConfigParser(strict=False)
|
||||||
self.__parser.optionxform = str
|
self.__parser.optionxform = str
|
||||||
self.__configFileModifiedTime = None
|
self.__configFileModifiedTime = None
|
||||||
@ -589,82 +591,92 @@ class WireguardConfiguration:
|
|||||||
for i in restricted:
|
for i in restricted:
|
||||||
self.RestrictedPeers.append(Peer(i, self))
|
self.RestrictedPeers.append(Peer(i, self))
|
||||||
|
|
||||||
|
def configurationFileChanged(self) :
|
||||||
|
mt = os.path.getmtime(os.path.join(WG_CONF_PATH, f'{self.Name}.conf'))
|
||||||
|
changed = self.__configFileModifiedTime is None or self.__configFileModifiedTime != mt
|
||||||
|
self.__configFileModifiedTime = mt
|
||||||
|
return changed
|
||||||
|
|
||||||
def __getPeers(self):
|
def __getPeers(self):
|
||||||
|
|
||||||
mt = os.path.getmtime(os.path.join(WG_CONF_PATH, f'{self.Name}.conf'))
|
if self.configurationFileChanged():
|
||||||
# if self.__configFileModifiedTime is None or self.__configFileModifiedTime != mt:
|
self.Peers = []
|
||||||
self.Peers = []
|
with open(os.path.join(WG_CONF_PATH, f'{self.Name}.conf'), 'r') as configFile:
|
||||||
with open(os.path.join(WG_CONF_PATH, f'{self.Name}.conf'), 'r') as configFile:
|
p = []
|
||||||
p = []
|
pCounter = -1
|
||||||
pCounter = -1
|
content = configFile.read().split('\n')
|
||||||
content = configFile.read().split('\n')
|
try:
|
||||||
try:
|
peerStarts = content.index("[Peer]")
|
||||||
peerStarts = content.index("[Peer]")
|
content = content[peerStarts:]
|
||||||
content = content[peerStarts:]
|
for i in content:
|
||||||
for i in content:
|
if not regex_match("#(.*)", i) and not regex_match(";(.*)", i):
|
||||||
if not regex_match("#(.*)", i) and not regex_match(";(.*)", i):
|
if i == "[Peer]":
|
||||||
if i == "[Peer]":
|
pCounter += 1
|
||||||
pCounter += 1
|
p.append({})
|
||||||
p.append({})
|
p[pCounter]["name"] = ""
|
||||||
p[pCounter]["name"] = ""
|
else:
|
||||||
else:
|
if len(i) > 0:
|
||||||
if len(i) > 0:
|
split = re.split(r'\s*=\s*', i, 1)
|
||||||
split = re.split(r'\s*=\s*', i, 1)
|
if len(split) == 2:
|
||||||
if len(split) == 2:
|
p[pCounter][split[0]] = split[1]
|
||||||
p[pCounter][split[0]] = split[1]
|
|
||||||
|
|
||||||
if regex_match("#Name# = (.*)", i):
|
if regex_match("#Name# = (.*)", i):
|
||||||
split = re.split(r'\s*=\s*', i, 1)
|
split = re.split(r'\s*=\s*', i, 1)
|
||||||
print(split)
|
print(split)
|
||||||
if len(split) == 2:
|
if len(split) == 2:
|
||||||
p[pCounter]["name"] = split[1]
|
p[pCounter]["name"] = split[1]
|
||||||
|
|
||||||
|
for i in p:
|
||||||
|
if "PublicKey" in i.keys():
|
||||||
|
checkIfExist = sqlSelect("SELECT * FROM '%s' WHERE id = ?" % self.Name,
|
||||||
|
((i['PublicKey']),)).fetchone()
|
||||||
|
if checkIfExist is None:
|
||||||
|
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 ""
|
||||||
|
}
|
||||||
|
sqlUpdate(
|
||||||
|
"""
|
||||||
|
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:
|
||||||
|
sqlUpdate("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)}")
|
||||||
|
else:
|
||||||
|
self.Peers.clear()
|
||||||
|
checkIfExist = sqlSelect("SELECT * FROM '%s'" % self.Name).fetchall()
|
||||||
|
for i in checkIfExist:
|
||||||
|
self.Peers.append(Peer(i, self))
|
||||||
|
|
||||||
for i in p:
|
|
||||||
if "PublicKey" in i.keys():
|
|
||||||
checkIfExist = sqlSelect("SELECT * FROM '%s' WHERE id = ?" % self.Name,
|
|
||||||
((i['PublicKey']),)).fetchone()
|
|
||||||
if checkIfExist is None:
|
|
||||||
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 ""
|
|
||||||
}
|
|
||||||
sqlUpdate(
|
|
||||||
"""
|
|
||||||
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:
|
|
||||||
sqlUpdate("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):
|
def addPeers(self, peers: list):
|
||||||
for p in peers:
|
for p in peers:
|
||||||
@ -803,12 +815,11 @@ class WireguardConfiguration:
|
|||||||
else:
|
else:
|
||||||
status = "stopped"
|
status = "stopped"
|
||||||
if int(latestHandshake[count + 1]) > 0:
|
if int(latestHandshake[count + 1]) > 0:
|
||||||
sqldb.execute("UPDATE '%s' SET latest_handshake = ?, status = ? WHERE id= ?" % self.Name
|
sqlUpdate("UPDATE '%s' SET latest_handshake = ?, status = ? WHERE id= ?" % self.Name
|
||||||
, (str(minus).split(".", maxsplit=1)[0], status, latestHandshake[count],))
|
, (str(minus).split(".", maxsplit=1)[0], status, latestHandshake[count],))
|
||||||
else:
|
else:
|
||||||
sqldb.execute("UPDATE '%s' SET latest_handshake = 'No Handshake', status = ? WHERE id= ?" % self.Name
|
sqlUpdate("UPDATE '%s' SET latest_handshake = 'No Handshake', status = ? WHERE id= ?" % self.Name
|
||||||
, (status, latestHandshake[count],))
|
, (status, latestHandshake[count],))
|
||||||
sqldb.commit()
|
|
||||||
count += 2
|
count += 2
|
||||||
|
|
||||||
|
|
||||||
@ -1284,16 +1295,20 @@ def _regexMatch(regex, text):
|
|||||||
return pattern.search(text) is not None
|
return pattern.search(text) is not None
|
||||||
|
|
||||||
|
|
||||||
def _getConfigurationList() -> [WireguardConfiguration]:
|
def _getConfigurationList():
|
||||||
configurations = {}
|
# configurations = {}
|
||||||
for i in os.listdir(WG_CONF_PATH):
|
for i in os.listdir(WG_CONF_PATH):
|
||||||
if _regexMatch("^(.{1,}).(conf)$", i):
|
if _regexMatch("^(.{1,}).(conf)$", i):
|
||||||
i = i.replace('.conf', '')
|
i = i.replace('.conf', '')
|
||||||
try:
|
try:
|
||||||
configurations[i] = WireguardConfiguration(i)
|
if i in WireguardConfigurations.keys():
|
||||||
|
if WireguardConfigurations[i].configurationFileChanged():
|
||||||
|
WireguardConfigurations[i] = WireguardConfiguration(i)
|
||||||
|
else:
|
||||||
|
WireguardConfigurations[i] = WireguardConfiguration(i)
|
||||||
except WireguardConfiguration.InvalidConfigurationFileException as e:
|
except WireguardConfiguration.InvalidConfigurationFileException as e:
|
||||||
print(f"{i} have an invalid configuration file.")
|
print(f"{i} have an invalid configuration file.")
|
||||||
return configurations
|
|
||||||
|
|
||||||
|
|
||||||
def _checkIPWithRange(ip):
|
def _checkIPWithRange(ip):
|
||||||
@ -1354,8 +1369,7 @@ def _generatePrivateKey() -> [bool, str]:
|
|||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
return False, None
|
return False, None
|
||||||
|
|
||||||
|
def _getWireguardConfigurationAvailableIP(configName: str, all: bool = False) -> tuple[bool, list[str]] | tuple[bool, None]:
|
||||||
def _getWireguardConfigurationAvailableIP(configName: str) -> tuple[bool, list[str]] | tuple[bool, None]:
|
|
||||||
if configName not in WireguardConfigurations.keys():
|
if configName not in WireguardConfigurations.keys():
|
||||||
return False, None
|
return False, None
|
||||||
configuration = WireguardConfigurations[configName]
|
configuration = WireguardConfigurations[configName]
|
||||||
@ -1387,8 +1401,9 @@ def _getWireguardConfigurationAvailableIP(configName: str) -> tuple[bool, list[s
|
|||||||
if h not in existedAddress:
|
if h not in existedAddress:
|
||||||
availableAddress.append(ipaddress.ip_network(h).compressed)
|
availableAddress.append(ipaddress.ip_network(h).compressed)
|
||||||
count += 1
|
count += 1
|
||||||
if network.version == 6 and count > 255:
|
if not all:
|
||||||
break
|
if network.version == 6 and count > 255:
|
||||||
|
break
|
||||||
return True, availableAddress
|
return True, availableAddress
|
||||||
|
|
||||||
return False, None
|
return False, None
|
||||||
@ -1534,7 +1549,7 @@ def API_SignOut():
|
|||||||
|
|
||||||
@app.route(f'{APP_PREFIX}/api/getWireguardConfigurations', methods=["GET"])
|
@app.route(f'{APP_PREFIX}/api/getWireguardConfigurations', methods=["GET"])
|
||||||
def API_getWireguardConfigurations():
|
def API_getWireguardConfigurations():
|
||||||
# WireguardConfigurations = _getConfigurationList()
|
_getConfigurationList()
|
||||||
return ResponseObject(data=[wc for wc in WireguardConfigurations.values()])
|
return ResponseObject(data=[wc for wc in WireguardConfigurations.values()])
|
||||||
|
|
||||||
|
|
||||||
@ -1841,17 +1856,7 @@ def API_addPeers(configName):
|
|||||||
if i not in availableIps[1]:
|
if i not in availableIps[1]:
|
||||||
return ResponseObject(False, f"This IP is not available: {i}")
|
return ResponseObject(False, f"This IP is not available: {i}")
|
||||||
|
|
||||||
config.addPeers([{"id": public_key, "allowed_ip": ''.join(allowed_ips)}])
|
config.addPeers([{"id": public_key, "allowed_ip": ','.join(allowed_ips)}])
|
||||||
# subprocess.check_output(
|
|
||||||
# f"wg set {config.Name} peer {public_key} allowed-ips {''.join(allowed_ips)}",
|
|
||||||
# shell=True, stderr=subprocess.STDOUT)
|
|
||||||
# if len(preshared_key) > 0:
|
|
||||||
# subprocess.check_output(
|
|
||||||
# f"wg set {config.Name} peer {public_key} preshared-key {preshared_key}",
|
|
||||||
# shell=True, stderr=subprocess.STDOUT)
|
|
||||||
# subprocess.check_output(
|
|
||||||
# f"wg-quick save {config.Name}", shell=True, stderr=subprocess.STDOUT)
|
|
||||||
# config.getPeersList()
|
|
||||||
found, peer = config.searchPeer(public_key)
|
found, peer = config.searchPeer(public_key)
|
||||||
if found:
|
if found:
|
||||||
return peer.updatePeer(name, private_key, preshared_key, dns_addresses, ",".join(allowed_ips),
|
return peer.updatePeer(name, private_key, preshared_key, dns_addresses, ",".join(allowed_ips),
|
||||||
@ -2188,7 +2193,7 @@ _, WG_CONF_PATH = DashboardConfig.GetConfig("Server", "wg_conf_path")
|
|||||||
|
|
||||||
|
|
||||||
WireguardConfigurations: dict[str, WireguardConfiguration] = {}
|
WireguardConfigurations: dict[str, WireguardConfiguration] = {}
|
||||||
WireguardConfigurations = _getConfigurationList()
|
_getConfigurationList()
|
||||||
|
|
||||||
def startThreads():
|
def startThreads():
|
||||||
bgThread = threading.Thread(target=backGroundThread)
|
bgThread = threading.Thread(target=backGroundThread)
|
||||||
|
Loading…
Reference in New Issue
Block a user