Add latest changes
Dieser Commit ist enthalten in:
@@ -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()
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren