feat(traffic): add per-IP daily traffic tracking with 20GB limit for uploads and downloads
This commit is contained in:
62
database.py
62
database.py
@@ -1,7 +1,7 @@
|
||||
import sqlite3
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
from config import DATABASE
|
||||
from config import DATABASE, DAILY_TRAFFIC_LIMIT
|
||||
|
||||
def get_db():
|
||||
conn = sqlite3.connect(DATABASE)
|
||||
@@ -22,6 +22,16 @@ def init_db():
|
||||
expires_at TIMESTAMP NOT NULL
|
||||
)
|
||||
''')
|
||||
conn.execute('''
|
||||
CREATE TABLE IF NOT EXISTS ip_traffic (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
ip TEXT NOT NULL,
|
||||
date TEXT NOT NULL,
|
||||
upload_bytes INTEGER NOT NULL DEFAULT 0,
|
||||
download_bytes INTEGER NOT NULL DEFAULT 0,
|
||||
UNIQUE(ip, date)
|
||||
)
|
||||
''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
@@ -59,3 +69,53 @@ def cleanup_expired():
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return len(expired)
|
||||
|
||||
def get_client_ip(request):
|
||||
if 'X-Forwarded-For' in request.headers:
|
||||
return request.headers['X-Forwarded-For'].split(',')[0].strip()
|
||||
if 'X-Real-IP' in request.headers:
|
||||
return request.headers['X-Real-IP'].strip()
|
||||
return request.remote_addr
|
||||
|
||||
def add_upload_traffic(ip, bytes_count):
|
||||
today = datetime.utcnow().strftime('%Y-%m-%d')
|
||||
conn = get_db()
|
||||
conn.execute('''
|
||||
INSERT INTO ip_traffic (ip, date, upload_bytes, download_bytes)
|
||||
VALUES (?, ?, ?, 0)
|
||||
ON CONFLICT(ip, date) DO UPDATE SET upload_bytes = upload_bytes + ?
|
||||
''', (ip, today, bytes_count, bytes_count))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
def add_download_traffic(ip, bytes_count):
|
||||
today = datetime.utcnow().strftime('%Y-%m-%d')
|
||||
conn = get_db()
|
||||
conn.execute('''
|
||||
INSERT INTO ip_traffic (ip, date, upload_bytes, download_bytes)
|
||||
VALUES (?, ?, 0, ?)
|
||||
ON CONFLICT(ip, date) DO UPDATE SET download_bytes = download_bytes + ?
|
||||
''', (ip, today, bytes_count, bytes_count))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
def get_daily_traffic(ip):
|
||||
today = datetime.utcnow().strftime('%Y-%m-%d')
|
||||
conn = get_db()
|
||||
row = conn.execute(
|
||||
'SELECT upload_bytes, download_bytes FROM ip_traffic WHERE ip = ? AND date = ?',
|
||||
(ip, today)
|
||||
).fetchone()
|
||||
conn.close()
|
||||
if row:
|
||||
return row['upload_bytes'], row['download_bytes']
|
||||
return 0, 0
|
||||
|
||||
def is_traffic_exceeded(ip, additional_bytes, direction='upload'):
|
||||
upload, download = get_daily_traffic(ip)
|
||||
total = upload + download
|
||||
if direction == 'upload':
|
||||
total += additional_bytes
|
||||
else:
|
||||
total += additional_bytes
|
||||
return total > DAILY_TRAFFIC_LIMIT
|
||||
|
||||
Reference in New Issue
Block a user