Add latest changes
Dieser Commit ist enthalten in:
97
v2_adminpanel/utils/device_monitoring.py
Normale Datei
97
v2_adminpanel/utils/device_monitoring.py
Normale Datei
@@ -0,0 +1,97 @@
|
||||
"""Device limit monitoring utilities"""
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from db import get_connection
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def check_device_limits():
|
||||
"""Check all licenses for device limit violations"""
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
try:
|
||||
# Find licenses approaching or exceeding device limits
|
||||
cur.execute("""
|
||||
SELECT
|
||||
l.id,
|
||||
l.license_key,
|
||||
l.device_limit,
|
||||
COUNT(DISTINCT dr.id) as device_count,
|
||||
c.name as customer_name,
|
||||
c.email as customer_email
|
||||
FROM licenses l
|
||||
LEFT JOIN device_registrations dr ON dr.license_id = l.id AND dr.is_active = true
|
||||
LEFT JOIN customers c ON c.id = l.customer_id
|
||||
WHERE l.is_active = true
|
||||
GROUP BY l.id, l.license_key, l.device_limit, c.name, c.email
|
||||
HAVING COUNT(DISTINCT dr.id) >= l.device_limit * 0.8 -- 80% threshold
|
||||
ORDER BY (COUNT(DISTINCT dr.id)::float / l.device_limit) DESC
|
||||
""")
|
||||
|
||||
warnings = []
|
||||
for row in cur.fetchall():
|
||||
license_id, license_key, device_limit, device_count, customer_name, customer_email = row
|
||||
usage_percent = (device_count / device_limit) * 100 if device_limit > 0 else 0
|
||||
|
||||
warning = {
|
||||
'license_id': license_id,
|
||||
'license_key': license_key,
|
||||
'customer_name': customer_name or 'Unknown',
|
||||
'customer_email': customer_email or 'No email',
|
||||
'device_limit': device_limit,
|
||||
'device_count': device_count,
|
||||
'usage_percent': round(usage_percent, 1),
|
||||
'status': 'exceeded' if device_count > device_limit else 'warning'
|
||||
}
|
||||
warnings.append(warning)
|
||||
|
||||
if device_count > device_limit:
|
||||
logger.warning(f"License {license_key} exceeded device limit: {device_count}/{device_limit}")
|
||||
|
||||
return warnings
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error checking device limits: {e}")
|
||||
return []
|
||||
finally:
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
def get_device_usage_stats():
|
||||
"""Get overall device usage statistics"""
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
try:
|
||||
# Get overall stats
|
||||
cur.execute("""
|
||||
SELECT
|
||||
COUNT(DISTINCT l.id) as total_licenses,
|
||||
COUNT(DISTINCT dr.id) as total_devices,
|
||||
SUM(l.device_limit) as total_device_limit,
|
||||
COUNT(DISTINCT CASE WHEN dr.last_seen_at > NOW() - INTERVAL '24 hours' THEN dr.id END) as active_24h,
|
||||
COUNT(DISTINCT CASE WHEN dr.last_seen_at > NOW() - INTERVAL '7 days' THEN dr.id END) as active_7d
|
||||
FROM licenses l
|
||||
LEFT JOIN device_registrations dr ON dr.license_id = l.id AND dr.is_active = true
|
||||
WHERE l.is_active = true
|
||||
""")
|
||||
|
||||
stats = cur.fetchone()
|
||||
|
||||
return {
|
||||
'total_licenses': stats[0] or 0,
|
||||
'total_devices': stats[1] or 0,
|
||||
'total_device_limit': stats[2] or 0,
|
||||
'usage_percent': round((stats[1] / stats[2] * 100) if stats[2] > 0 else 0, 1),
|
||||
'active_24h': stats[3] or 0,
|
||||
'active_7d': stats[4] or 0,
|
||||
'timestamp': datetime.now().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting device usage stats: {e}")
|
||||
return {}
|
||||
finally:
|
||||
cur.close()
|
||||
conn.close()
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren