Résolution de bugs

This commit is contained in:
oussi
2026-04-13 16:12:42 +02:00
parent da51482cbd
commit 8c59a1ab31

View File

@@ -1,5 +1,6 @@
"""Suivi des utilisateurs connectes a Amadea via parsing des logs."""
import gzip
import glob
import os
import re
@@ -16,11 +17,57 @@ _ISOFT_LOGIN_RE = re.compile(
)
def _read_log_file(filepath):
"""Lit un fichier log, supporte .log et .log.gz."""
try:
if filepath.endswith('.gz'):
with gzip.open(filepath, 'rt', encoding='utf-8', errors='ignore') as f:
return f.read()
else:
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
return f.read()
except (PermissionError, OSError):
return None
def _log_files_for_date(log_path, prefix, date_str):
"""Retourne les fichiers de logs pour un prefixe et une date donnes, tries par index."""
"""Retourne les fichiers de logs pour un prefixe et une date donnes, tries par index.
Essai 1 : fichiers avec la date dans le nom (ex: awevents_26-04-13_1.log).
Essai 2 : si aucun fichier trouve, cherche sans date dans le nom et filtre
par date de modification du fichier (ex: serveur HDS).
"""
def is_valid(f):
return f.endswith('.log') or f.endswith('.log.gz')
def sort_key(f):
m = re.search(r'_(\d+)\.log(\.gz)?$', f)
return int(m.group(1)) if m else 0
# Essai 1 : date dans le nom
pattern = os.path.join(log_path, f"{prefix}_{date_str}_*")
files = [f for f in glob.glob(pattern) if not f.endswith('.zip')]
return sorted(files, key=lambda f: int(re.search(r'_(\d+)\.[^.]+$', f).group(1)))
files = [f for f in glob.glob(pattern) if is_valid(f)]
if files:
return sorted(files, key=sort_key)
# Essai 2 : sans date dans le nom, filtrer par date de modification
try:
target_date = datetime.strptime(date_str, "%y-%m-%d").date()
except ValueError:
return []
fallback_pattern = os.path.join(log_path, f"{prefix}_*")
files = []
for f in glob.glob(fallback_pattern):
if not is_valid(f):
continue
try:
mtime = os.path.getmtime(f)
if datetime.fromtimestamp(mtime).date() == target_date:
files.append(f)
except OSError:
continue
return sorted(files, key=sort_key)
class UserMonitor:
@@ -90,21 +137,17 @@ class UserMonitor:
hourly = {h: set() for h in range(24)}
for filepath in awevents_files:
try:
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
for line in f:
content = _read_log_file(filepath)
if content:
for line in content.splitlines():
self._parse_awevents_line(line, users, cutoff_24h, hourly)
except (PermissionError, OSError):
continue
isoft_files = _log_files_for_date(log_path, "isoft", date_str)
for filepath in isoft_files:
try:
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
for line in f:
content = _read_log_file(filepath)
if content:
for line in content.splitlines():
self._parse_isoft_line(line, users)
except (PermissionError, OSError):
continue
self._compute_statuses(users, thresholds, now)
@@ -213,9 +256,10 @@ class UserMonitor:
continue
hourly = {h: set() for h in range(24)}
for filepath in files:
try:
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
for line in f:
content = _read_log_file(filepath)
if not content:
continue
for line in content.splitlines():
m = re.match(
r'^(\d{4}-\d{2}-\d{2} (\d{2}):\d{2}:\d{2}).*login=([^,]+),',
line
@@ -225,8 +269,6 @@ class UserMonitor:
login = m.group(3).strip()
if login:
hourly[hour].add(login)
except (PermissionError, OSError):
continue
max_concurrent = max((len(v) for v in hourly.values()), default=0)
result.append({"date": day.isoformat(), "count": max_concurrent})
return result