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 @@ + + + + \ No newline at end of file diff --git a/src/static/app/src/components/peerDetailsModalComponents/peerSessions.vue b/src/static/app/src/components/peerDetailsModalComponents/peerSessions.vue index 84c06859..70afe8b1 100644 --- a/src/static/app/src/components/peerDetailsModalComponents/peerSessions.vue +++ b/src/static/app/src/components/peerDetailsModalComponents/peerSessions.vue @@ -78,8 +78,11 @@ const emits = defineEmits(['selectDate']) -
- {{ today.format('YYYY-MM')}} +
+ + +
+ {{ today.format('YYYY / MM')}}