diff --git a/src/dashboard.py b/src/dashboard.py
index db3ab53b..c948c64c 100644
--- a/src/dashboard.py
+++ b/src/dashboard.py
@@ -891,6 +891,31 @@ def API_getConfigurationInfo():
"configurationRestrictedPeers": WireguardConfigurations[configurationName].getRestrictedPeersList()
})
+@app.get(f'{APP_PREFIX}/api/getPeerHistoricalEndpoints')
+def API_GetPeerHistoricalEndpoints():
+ configurationName = request.args.get("configurationName")
+ id = request.args.get('id')
+ if not configurationName or not id:
+ return ResponseObject(False, "Please provide configurationName and id")
+ fp, p = WireguardConfigurations.get(configurationName).searchPeer(id)
+ if fp:
+ result = p.getEndpoints()
+ geo = {}
+ try:
+ r = requests.post(f"http://ip-api.com/batch?fields=city,country,lat,lon,query",
+ data=json.dumps([x['endpoint'] for x in result]))
+ d = r.json()
+
+
+ except Exception as e:
+ return ResponseObject(data=result, message="Failed to request IP address geolocation. " + str(e))
+
+ return ResponseObject(data={
+ "endpoints": p.getEndpoints(),
+ "geolocation": d
+ })
+ return ResponseObject(False, "Peer does not exist")
+
@app.get(f'{APP_PREFIX}/api/getPeerSessions')
def API_GetPeerSessions():
configurationName = request.args.get("configurationName")
diff --git a/src/modules/AmneziaWireguardConfiguration.py b/src/modules/AmneziaWireguardConfiguration.py
index b4c1824c..8f7de89e 100644
--- a/src/modules/AmneziaWireguardConfiguration.py
+++ b/src/modules/AmneziaWireguardConfiguration.py
@@ -159,6 +159,15 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
sqlalchemy.Column('Info', sqlalchemy.Text),
extend_existing=True
)
+
+ self.peersHistoryEndpointTable = sqlalchemy.Table(
+ f'{dbName}_history_endpoint', self.metadata,
+ sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
+ sqlalchemy.Column('endpoint', sqlalchemy.String(255), nullable=False),
+ sqlalchemy.Column('time',
+ (sqlalchemy.DATETIME if self.DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else sqlalchemy.TIMESTAMP)),
+ extend_existing=True
+ )
self.metadata.create_all(self.engine)
diff --git a/src/modules/Peer.py b/src/modules/Peer.py
index 926056e4..e95bb717 100644
--- a/src/modules/Peer.py
+++ b/src/modules/Peer.py
@@ -236,6 +236,20 @@ class Peer:
return False
return True
+ def getEndpoints(self):
+ result = []
+ with self.configuration.engine.connect() as conn:
+ result = conn.execute(
+ db.select(
+ self.configuration.peersHistoryEndpointTable.c.endpoint
+ ).group_by(
+ self.configuration.peersHistoryEndpointTable.c.endpoint
+ ).where(
+ self.configuration.peersHistoryEndpointTable.c.id == self.id
+ )
+ ).mappings().fetchall()
+ return list(result)
+
def getTraffics(self, interval: int = 30, startDate: datetime.datetime = None, endDate: datetime.datetime = None):
if startDate is None and endDate is None:
endDate = datetime.datetime.now()
diff --git a/src/modules/WireguardConfiguration.py b/src/modules/WireguardConfiguration.py
index c2f55e67..c3b1cace 100644
--- a/src/modules/WireguardConfiguration.py
+++ b/src/modules/WireguardConfiguration.py
@@ -452,11 +452,9 @@ class WireguardConfiguration:
self.peersTable.columns.id == i['PublicKey']
)
)
-
tmpList.append(Peer(tempPeer, self))
except Exception as e:
print(f"[WGDashboard] {self.Name} getPeers() Error: {str(e)}")
-
else:
with self.engine.connect() as conn:
existingPeers = conn.execute(self.peersTable.select()).mappings().fetchall()
diff --git a/src/static/app/src/components/configurationComponents/peerDetailsModal.vue b/src/static/app/src/components/configurationComponents/peerDetailsModal.vue
index e4ef54bc..e49b2cb2 100644
--- a/src/static/app/src/components/configurationComponents/peerDetailsModal.vue
+++ b/src/static/app/src/components/configurationComponents/peerDetailsModal.vue
@@ -1,8 +1,7 @@
+
+
+
+
+
+
+
+
+
+ Endpoint
+ Geolocation
+
+
+
+
+ {{ endpoint.endpoint }}
+
+
+ {{ getGeolocation(endpoint.endpoint) }}
+
+