mirror of
https://github.com/donaldzou/WGDashboard.git
synced 2025-06-27 16:56:57 +00:00
commit
02f7eb0c82
@ -25,7 +25,7 @@ from modules.PeerJob import PeerJob
|
||||
from modules.SystemStatus import SystemStatus
|
||||
SystemStatus = SystemStatus()
|
||||
|
||||
DASHBOARD_VERSION = 'v4.2.3'
|
||||
DASHBOARD_VERSION = 'v4.2.2'
|
||||
|
||||
CONFIGURATION_PATH = os.getenv('CONFIGURATION_PATH', '.')
|
||||
DB_PATH = os.path.join(CONFIGURATION_PATH, 'db')
|
||||
@ -432,6 +432,7 @@ class WireguardConfiguration:
|
||||
original = [l.rstrip("\n") for l in f.readlines()]
|
||||
try:
|
||||
start = original.index("[Interface]")
|
||||
|
||||
# Clean
|
||||
for i in range(start, len(original)):
|
||||
if original[i] == "[Peer]":
|
||||
@ -444,7 +445,7 @@ class WireguardConfiguration:
|
||||
setattr(self, key, False)
|
||||
else:
|
||||
setattr(self, key, "")
|
||||
|
||||
|
||||
# Set
|
||||
for i in range(start, len(original)):
|
||||
if original[i] == "[Peer]":
|
||||
@ -458,10 +459,7 @@ class WireguardConfiguration:
|
||||
setattr(self, key, StringToBoolean(value))
|
||||
else:
|
||||
if len(getattr(self, key)) > 0:
|
||||
if key not in ["PostUp", "PostDown", "PreUp", "PreDown"]:
|
||||
setattr(self, key, f"{getattr(self, key)}, {value}")
|
||||
else:
|
||||
setattr(self, key, f"{getattr(self, key)}; {value}")
|
||||
setattr(self, key, f"{getattr(self, key)}, {value}")
|
||||
else:
|
||||
setattr(self, key, value)
|
||||
except ValueError as e:
|
||||
@ -472,12 +470,11 @@ class WireguardConfiguration:
|
||||
self.Status = self.getStatus()
|
||||
|
||||
def __dropDatabase(self):
|
||||
existingTables = [self.Name, f'{self.Name}_restrict_access', f'{self.Name}_transfer', f'{self.Name}_deleted']
|
||||
# existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
||||
existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
||||
for t in existingTables:
|
||||
sqlUpdate("DROP TABLE '%s'" % t)
|
||||
sqlUpdate("DROP TABLE '%s'" % t['name'])
|
||||
|
||||
# existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
||||
existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
||||
|
||||
def createDatabase(self, dbName = None):
|
||||
if dbName is None:
|
||||
@ -807,9 +804,6 @@ class WireguardConfiguration:
|
||||
return ResponseObject(False, "Failed to save configuration through WireGuard")
|
||||
|
||||
self.getPeers()
|
||||
|
||||
if numOfDeletedPeers == 0 and numOfFailedToDeletePeers == 0:
|
||||
return ResponseObject(False, "No peer(s) to delete found", responseCode=404)
|
||||
|
||||
if numOfDeletedPeers == len(listOfPublicKeys):
|
||||
return ResponseObject(True, f"Deleted {numOfDeletedPeers} peer(s)")
|
||||
@ -951,8 +945,7 @@ class WireguardConfiguration:
|
||||
},
|
||||
"ConnectedPeers": len(list(filter(lambda x: x.status == "running", self.Peers))),
|
||||
"TotalPeers": len(self.Peers),
|
||||
"Protocol": self.Protocol,
|
||||
"Table": self.Table,
|
||||
"Protocol": self.Protocol
|
||||
}
|
||||
|
||||
def backupConfigurationFile(self) -> tuple[bool, dict[str, str]]:
|
||||
@ -1054,7 +1047,7 @@ class WireguardConfiguration:
|
||||
dataChanged = False
|
||||
with open(self.configPath, 'r') as f:
|
||||
original = [l.rstrip("\n") for l in f.readlines()]
|
||||
allowEdit = ["Address", "PreUp", "PostUp", "PreDown", "PostDown", "ListenPort", "Table"]
|
||||
allowEdit = ["Address", "PreUp", "PostUp", "PreDown", "PostDown", "ListenPort"]
|
||||
if self.Protocol == 'awg':
|
||||
allowEdit += ["Jc", "Jmin", "Jmax", "S1", "S2", "H1", "H2", "H3", "H4"]
|
||||
start = original.index("[Interface]")
|
||||
@ -1211,15 +1204,15 @@ AmneziaWG Configuration
|
||||
"""
|
||||
class AmneziaWireguardConfiguration(WireguardConfiguration):
|
||||
def __init__(self, name: str = None, data: dict = None, backup: dict = None, startup: bool = False):
|
||||
self.Jc = ""
|
||||
self.Jmin = ""
|
||||
self.Jmax = ""
|
||||
self.S1 = ""
|
||||
self.S2 = ""
|
||||
self.H1 = ""
|
||||
self.H2 = ""
|
||||
self.H3 = ""
|
||||
self.H4 = ""
|
||||
self.Jc = 0
|
||||
self.Jmin = 0
|
||||
self.Jmax = 0
|
||||
self.S1 = 0
|
||||
self.S2 = 0
|
||||
self.H1 = 1
|
||||
self.H2 = 2
|
||||
self.H3 = 3
|
||||
self.H4 = 4
|
||||
|
||||
super().__init__(name, data, backup, startup, wg=False)
|
||||
|
||||
@ -1244,7 +1237,6 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
||||
},
|
||||
"ConnectedPeers": len(list(filter(lambda x: x.status == "running", self.Peers))),
|
||||
"TotalPeers": len(self.Peers),
|
||||
"Table": self.Table,
|
||||
"Protocol": self.Protocol,
|
||||
"Jc": self.Jc,
|
||||
"Jmin": self.Jmin,
|
||||
@ -1442,7 +1434,7 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
||||
f.write(p['preshared_key'])
|
||||
|
||||
subprocess.check_output(
|
||||
f"{self.Protocol} set {self.Name} peer {p['id']} allowed-ips {p['allowed_ip'].replace(' ', '')}{f' preshared-key {uid}' if presharedKeyExist else ''}",
|
||||
f"{self.Protocol} set {self.Name} peer {p['id']} allowed-ips {p['allowed_ip'].replace(' ', '')}{f' preshared-key {uid}' if presharedKeyExist else ''} advanced-security {p['advanced_security']}",
|
||||
shell=True, stderr=subprocess.STDOUT)
|
||||
if presharedKeyExist:
|
||||
os.remove(uid)
|
||||
@ -1721,7 +1713,7 @@ PersistentKeepalive = {str(self.keepalive)}
|
||||
f.write(preshared_key)
|
||||
newAllowedIPs = allowed_ip.replace(" ", "")
|
||||
updateAllowedIp = subprocess.check_output(
|
||||
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if pskExist else 'preshared-key /dev/null'}",
|
||||
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if pskExist else 'preshared-key /dev/null'} advanced-security {advanced_security}",
|
||||
shell=True, stderr=subprocess.STDOUT)
|
||||
|
||||
if pskExist: os.remove(uid)
|
||||
@ -2442,7 +2434,7 @@ def API_updatePeerSettings(configName):
|
||||
allowed_ip, endpoint_allowed_ip, mtu, keepalive)
|
||||
|
||||
return peer.updatePeer(name, private_key, preshared_key, dns_addresses,
|
||||
allowed_ip, endpoint_allowed_ip, mtu, keepalive, "off")
|
||||
allowed_ip, endpoint_allowed_ip, mtu, keepalive, data.get('advanced_security', 'off'))
|
||||
|
||||
return ResponseObject(False, "Peer does not exist")
|
||||
|
||||
@ -2471,11 +2463,11 @@ def API_deletePeers(configName: str) -> ResponseObject:
|
||||
peers = data['peers']
|
||||
if configName in WireguardConfigurations.keys():
|
||||
if len(peers) == 0:
|
||||
return ResponseObject(False, "Please specify one or more peers", status_code=400)
|
||||
return ResponseObject(False, "Please specify one or more peers")
|
||||
configuration = WireguardConfigurations.get(configName)
|
||||
return configuration.deletePeers(peers)
|
||||
|
||||
return ResponseObject(False, "Configuration does not exist", status_code=404)
|
||||
return ResponseObject(False, "Configuration does not exist")
|
||||
|
||||
@app.post(f'{APP_PREFIX}/api/restrictPeers/<configName>')
|
||||
def API_restrictPeers(configName: str) -> ResponseObject:
|
||||
@ -2612,7 +2604,7 @@ def API_addPeers(configName):
|
||||
"endpoint_allowed_ip": endpoint_allowed_ip,
|
||||
"mtu": mtu,
|
||||
"keepalive": keep_alive,
|
||||
"advanced_security": "off"
|
||||
"advanced_security": data.get("advanced_security", "off")
|
||||
})
|
||||
if addedCount == bulkAddAmount:
|
||||
break
|
||||
@ -2682,7 +2674,7 @@ def API_addPeers(configName):
|
||||
"DNS": dns_addresses,
|
||||
"mtu": mtu,
|
||||
"keepalive": keep_alive,
|
||||
"advanced_security": "off"
|
||||
"advanced_security": data.get("advanced_security", "off")
|
||||
}]
|
||||
)
|
||||
return ResponseObject(status=status, message=result['message'], data=result['peers'])
|
||||
@ -2960,7 +2952,7 @@ def API_isTotpEnabled():
|
||||
@app.get(f'{APP_PREFIX}/api/Welcome_GetTotpLink')
|
||||
def API_Welcome_GetTotpLink():
|
||||
if not DashboardConfig.GetConfig("Account", "totp_verified")[1]:
|
||||
DashboardConfig.SetConfig("Account", "totp_key", pyotp.random_base32(), True)
|
||||
DashboardConfig.SetConfig("Account", "totp_key", pyotp.random_base32())
|
||||
return ResponseObject(
|
||||
data=pyotp.totp.TOTP(DashboardConfig.GetConfig("Account", "totp_key")[1]).provisioning_uri(
|
||||
issuer_name="WGDashboard"))
|
||||
@ -3137,7 +3129,9 @@ def peerJobScheduleBackgroundThread():
|
||||
def gunicornConfig():
|
||||
_, app_ip = DashboardConfig.GetConfig("Server", "app_ip")
|
||||
_, app_port = DashboardConfig.GetConfig("Server", "app_port")
|
||||
return app_ip, app_port
|
||||
_, certfile = DashboardConfig.GetConfig("Server", "certfile")
|
||||
_, keyfile = DashboardConfig.GetConfig("Server", "keyfile")
|
||||
return app_ip, app_port, certfile, keyfile
|
||||
|
||||
def ProtocolsEnabled() -> list[str]:
|
||||
from shutil import which
|
||||
|
@ -2,17 +2,19 @@ import os.path
|
||||
import dashboard, configparser
|
||||
from datetime import datetime
|
||||
global sqldb, cursor, DashboardConfig, WireguardConfigurations, AllPeerJobs, JobLogger
|
||||
app_host, app_port = dashboard.gunicornConfig()
|
||||
app_host, app_port, certfile, keyfile = dashboard.gunicornConfig()
|
||||
date = datetime.today().strftime('%Y_%m_%d_%H_%M_%S')
|
||||
|
||||
def post_worker_init(worker):
|
||||
dashboard.startThreads()
|
||||
|
||||
worker_class = 'gthread'
|
||||
workers = 1
|
||||
threads = 1
|
||||
workers = 4
|
||||
threads = 4
|
||||
bind = f"{app_host}:{app_port}"
|
||||
daemon = True
|
||||
certfile = f"{certfile}"
|
||||
keyfile = f"{keyfile}"
|
||||
pidfile = './gunicorn.pid'
|
||||
wsgi_app = "dashboard:app"
|
||||
accesslog = f"./log/access_{date}.log"
|
||||
|
Loading…
x
Reference in New Issue
Block a user