improve analytics

This commit is contained in:
lelo 2025-03-23 15:32:16 +01:00
parent 40ddea4d42
commit 9d744e7948
3 changed files with 31 additions and 67 deletions

View File

@ -179,24 +179,20 @@ def dashboard():
WHERE timestamp >= ?
GROUP BY ip_address
ORDER BY count DESC
LIMIT 20
LIMIT 1000
''', (start.isoformat(),))
ip_rows = cursor.fetchall()
# Initialize GeoIP2 reader once for efficiency
reader = geoip2.database.Reader('GeoLite2-City.mmdb')
ip_data = []
location_data = []
for ip, count in ip_rows:
country, city = lookup_location(ip, reader)
ip_data.append(dict(ip=ip, count=count, country=country, city=city))
location_data.append(dict(count=count, country=country, city=city))
reader.close()
# Aggregate by city (ignoring entries without a city)
city_counts = {}
for entry in ip_data:
if entry['city']:
city_counts[entry['city']] = city_counts.get(entry['city'], 0) + entry['count']
city_data = [dict(city=city, count=count) for city, count in city_counts.items()]
# Sort by count in descending order and take the top 20
location_data.sort(key=lambda x: x['count'], reverse=True)
location_data = location_data[:20]
# Summary stats using separate SQL queries
cursor.execute('SELECT COUNT(*) FROM file_access_log WHERE timestamp >= ?', (start.isoformat(),))
@ -219,8 +215,7 @@ def dashboard():
top_files_data=top_files_data,
user_agent_data=user_agent_data,
referrer_data=referrer_data,
ip_data=ip_data,
city_data=city_data,
location_data=location_data,
total_accesses=total_accesses,
unique_files=unique_files,
unique_ips=unique_ips)

View File

@ -41,7 +41,7 @@
<div class="col-md-4">
<div class="card text-white bg-info">
<div class="card-body">
<h5 class="card-title">Total Accesses</h5>
<h5 class="card-title">Alle Downloads</h5>
<p class="card-text">{{ total_accesses }}</p>
</div>
</div>
@ -49,7 +49,7 @@
<div class="col-md-4">
<div class="card text-white bg-success">
<div class="card-body">
<h5 class="card-title">Unique Files</h5>
<h5 class="card-title">eindeutige Dateien</h5>
<p class="card-text">{{ unique_files }}</p>
</div>
</div>
@ -57,7 +57,7 @@
<div class="col-md-4">
<div class="card text-white bg-warning">
<div class="card-body">
<h5 class="card-title">Unique IPs</h5>
<h5 class="card-title">eindeutige Nutzer</h5>
<p class="card-text">{{ unique_ips }}</p>
</div>
</div>
@ -70,7 +70,7 @@
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">Access Trend</h5>
<h5 class="card-title">Downloads</h5>
<canvas id="accessTrendChart"></canvas>
</div>
</div>
@ -79,7 +79,7 @@
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">Top Files Accessed</h5>
<h5 class="card-title">Häufig geladene Dateien</h5>
<canvas id="topFilesChart"></canvas>
</div>
</div>
@ -88,7 +88,7 @@
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">User Agent Distribution</h5>
<h5 class="card-title">Verwendete Endgeräte</h5>
<canvas id="userAgentChart"></canvas>
</div>
</div>
@ -97,7 +97,7 @@
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">Referrer Distribution</h5>
<h5 class="card-title">Verteilung auf Ordner</h5>
<canvas id="referrerChart"></canvas>
</div>
</div>
@ -107,58 +107,27 @@
<!-- New Section: IP Address Access Data -->
<div class="card">
<div class="card-header">
IP Address Access Distribution
Verteilung der Zugriffe
</div>
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>IP Address</th>
<th>Access Count</th>
<th>City</th>
<th>Country</th>
<th>Anzahl Downloads</th>
<th>Stadt</th>
<th>Land</th>
</tr>
</thead>
<tbody>
{% for ip in ip_data %}
{% for loc in location_data %}
<tr>
<td>{{ ip.ip }}</td>
<td>{{ ip.count }}</td>
<td>{{ ip.city }}</td>
<td>{{ ip.country }}</td>
<td>{{ loc.count }}</td>
<td>{{ loc.city }}</td>
<td>{{ loc.country }}</td>
</tr>
{% else %}
<tr>
<td colspan="4">No IP access data available for the selected timeframe.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<!-- New Section: Aggregated City Access Data -->
<div class="card">
<div class="card-header">
City Access Distribution
</div>
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>City</th>
<th>Access Count</th>
</tr>
</thead>
<tbody>
{% for city in city_data %}
<tr>
<td>{{ city.city }}</td>
<td>{{ city.count }}</td>
</tr>
{% else %}
<tr>
<td colspan="2">No city access data available for the selected timeframe.</td>
<td colspan="4">No access data available for the selected timeframe.</td>
</tr>
{% endfor %}
</tbody>
@ -169,7 +138,7 @@
<!-- Detailed Table of Top File Accesses -->
<div class="card mb-4">
<div class="card-header">
Detailed File Access Data
Detailierte Dateizugriffe (Top 20)
</div>
<div class="card-body">
<table class="table table-striped">
@ -214,7 +183,7 @@
data: {
labels: dailyAccessData.map(item => item.date),
datasets: [{
label: 'Access Count',
label: 'Download Count',
data: dailyAccessData.map(item => item.count),
borderWidth: 2,
fill: true
@ -224,8 +193,8 @@
responsive: true,
plugins: { legend: { position: 'top' } },
scales: {
x: { title: { display: true, text: 'Date' } },
y: { title: { display: true, text: 'Access Count' } }
x: { title: { display: true, text: 'Datum' } },
y: { title: { display: true, text: 'Download Count' } }
}
}
});
@ -237,7 +206,7 @@
data: {
labels: topFilesData.map(item => item.full_path),
datasets: [{
label: 'Access Count',
label: 'Download Count',
data: topFilesData.map(item => item.access_count),
borderWidth: 1
}]
@ -247,8 +216,8 @@
responsive: true,
plugins: { legend: { display: false } },
scales: {
x: { title: { display: true, text: 'Access Count' } },
y: { title: { display: true, text: 'File Path' } }
x: { title: { display: true, text: 'Download Count' } },
y: { title: { display: true, text: '' } }
}
}
});

View File

@ -21,7 +21,7 @@
</header>
<div class="container">
<div id="content">Bitte den Link aus der Telegram-Gruppe erneut anklicken.</div>
<div id="content">Du hast keine gültigen Links im Speicher.<br>Bitte den Link aus der Telegram-Gruppe erneut anklicken.</div>
</div>
</body>
</html>