Add latest changes

Dieser Commit ist enthalten in:
2025-07-03 20:38:33 +00:00
Ursprung 63f3d92724
Commit 6f6cde65db
129 geänderte Dateien mit 3998 neuen und 1199 gelöschten Zeilen

Datei anzeigen

@@ -15,7 +15,7 @@ def scheduled_backup():
def cleanup_expired_sessions():
"""Clean up expired license sessions"""
"""Clean up expired license sessions - concurrent sessions aware"""
try:
conn = get_connection()
cur = conn.cursor()
@@ -29,11 +29,12 @@ def cleanup_expired_sessions():
result = cur.fetchone()
timeout_seconds = result[0] if result else 60
# Find expired sessions
# Find expired sessions that are still active
cur.execute("""
SELECT id, license_id, hardware_id, ip_address, client_version, started_at
SELECT id, license_id, hardware_fingerprint, ip_address, client_version, started_at, hardware_id, machine_name
FROM license_sessions
WHERE last_heartbeat < CURRENT_TIMESTAMP - INTERVAL '%s seconds'
WHERE ended_at IS NULL
AND last_heartbeat < CURRENT_TIMESTAMP - INTERVAL '%s seconds'
""", (timeout_seconds,))
expired_sessions = cur.fetchall()
@@ -41,19 +42,32 @@ def cleanup_expired_sessions():
if expired_sessions:
logging.info(f"Found {len(expired_sessions)} expired sessions to clean up")
# Count sessions by license before cleanup for logging
license_session_counts = {}
for session in expired_sessions:
license_id = session[1]
if license_id not in license_session_counts:
license_session_counts[license_id] = 0
license_session_counts[license_id] += 1
for session in expired_sessions:
# Log to history
cur.execute("""
INSERT INTO session_history
(license_id, hardware_id, ip_address, client_version, started_at, ended_at, end_reason)
VALUES (%s, %s, %s, %s, %s, CURRENT_TIMESTAMP, 'timeout')
""", (session[1], session[2], session[3], session[4], session[5]))
(license_id, hardware_id, hardware_fingerprint, machine_name, ip_address, client_version, started_at, ended_at, end_reason)
VALUES (%s, %s, %s, %s, %s, %s, %s, CURRENT_TIMESTAMP, 'timeout')
""", (session[1], session[6], session[2], session[7], session[3], session[4], session[5]))
# Delete session
cur.execute("DELETE FROM license_sessions WHERE id = %s", (session[0],))
# Mark session as ended instead of deleting
cur.execute("UPDATE license_sessions SET ended_at = CURRENT_TIMESTAMP, end_reason = 'timeout' WHERE id = %s", (session[0],))
conn.commit()
logging.info(f"Cleaned up {len(expired_sessions)} expired sessions")
# Log cleanup summary
logging.info(f"Cleaned up {len(expired_sessions)} expired sessions from {len(license_session_counts)} licenses")
for license_id, count in license_session_counts.items():
if count > 1:
logging.info(f" License ID {license_id}: {count} sessions cleaned up")
cur.close()
conn.close()