docs: add standardized comments to all services (Python, Go, Bash)

- Add docs/commenting-standard.md defining per-language comment standards
  (Go godoc, Python PEP-257, C Doxygen, Bash header blocks, SQL banners)

- services/dashboard: 100% docstring coverage (100/100 functions)
  - All FastAPI route handlers, helpers, classes, and models documented
  - Language: French (project convention)

- services/bot-detector: 100% docstring coverage (53/53 symbols)
  - bot_detector.py: 14 functions + module docstring
  - anubis/fetch_rules.py: 9 functions

- shared/python/ja4_common: full docstrings on ClickHouseClient (7 methods)
  and ClickHouseSettings class

- services/correlator: 24 godoc comments added across 6 Go files
  - correlation_service.go: 10 private helpers
  - unixsocket/source.go: 6 parsing/socket helpers
  - correlated_log.go: 4 field extraction helpers
  - orchestrator.go, logger.go, main.go: 4 comments

- services/correlator/scripts/audit-architecture.sh: standardized header block

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
toto
2026-04-07 21:32:29 +02:00
parent 12d60975da
commit 3dfeba860b
22 changed files with 388 additions and 10 deletions

View File

@ -72,6 +72,7 @@ UA_PARENT_OVERRIDE: dict[str, str] = {}
# ──────────────────────────────────────────────────────────────────────────────
def _fetch_url(url: str, timeout: int = 15) -> str | None:
"""Télécharge le contenu d'une URL en texte UTF-8. Retourne None en cas d'erreur réseau."""
try:
with urllib.request.urlopen(url, timeout=timeout) as resp:
return resp.read().decode("utf-8")
@ -81,6 +82,7 @@ def _fetch_url(url: str, timeout: int = 15) -> str | None:
def fetch_yaml_url(url: str) -> list | dict | None:
"""Télécharge et désérialise un fichier YAML depuis une URL. Retourne None si inaccessible."""
content = _fetch_url(url)
if content:
return yaml.safe_load(content)
@ -334,6 +336,7 @@ def collect_all_rules() -> tuple[list, list, list, list]:
# ──────────────────────────────────────────────────────────────────────────────
def get_ch_client():
"""Crée et retourne un client ClickHouse configuré depuis les variables d'environnement."""
return clickhouse_connect.get_client(
host=os.environ.get("CLICKHOUSE_HOST", "clickhouse"),
database=os.environ.get("CLICKHOUSE_DB_PROCESSING", os.environ.get("CLICKHOUSE_DB", "ja4_processing")),
@ -346,6 +349,10 @@ DB_PROC = os.environ.get("CLICKHOUSE_DB_PROCESSING", os.environ.get("CLICKHOUSE_
def insert_ua_rules(client, rules: list[dict]) -> None:
"""Tronque et remplace la table anubis_ua_rules avec les règles User-Agent fournies.
Le format cible est REGEXP_TREE (colonnes id, parent_id, regexp, keys[], values[]).
"""
if not rules:
print("[INFO] Aucune règle UA.")
return
@ -366,6 +373,7 @@ def insert_ua_rules(client, rules: list[dict]) -> None:
def insert_ip_rules(client, rules: list[dict]) -> None:
"""Tronque et remplace la table anubis_ip_rules avec les règles CIDR/IP fournies."""
if not rules:
print("[INFO] Aucune règle IP.")
return
@ -381,6 +389,7 @@ def insert_ip_rules(client, rules: list[dict]) -> None:
def insert_asn_rules(client, rules: list[dict]) -> None:
"""Tronque et remplace la table anubis_asn_rules avec les règles ASN fournies."""
if not rules:
print("[INFO] Aucune règle ASN.")
return
@ -392,6 +401,7 @@ def insert_asn_rules(client, rules: list[dict]) -> None:
def insert_country_rules(client, rules: list[dict]) -> None:
"""Tronque et remplace la table anubis_country_rules avec les règles pays fournies."""
if not rules:
print("[INFO] Aucune règle pays.")
return
@ -403,6 +413,7 @@ def insert_country_rules(client, rules: list[dict]) -> None:
def reload_dicts(client) -> None:
"""Recharge les quatre dictionnaires ClickHouse Anubis après mise à jour des tables sources."""
dicts = [
f"{DB_PROC}.dict_anubis_ua",
f"{DB_PROC}.dict_anubis_ip",
@ -422,6 +433,7 @@ def reload_dicts(client) -> None:
# ──────────────────────────────────────────────────────────────────────────────
def print_summary(ua_rules, ip_rules, asn_rules, country_rules):
"""Affiche un résumé lisible des règles collectées (UA, IP, ASN, pays) sur la sortie standard."""
print("\n── Règles UA ──")
by_cat: dict[str, list] = {}
for r in ua_rules:
@ -460,6 +472,7 @@ def print_summary(ua_rules, ip_rules, asn_rules, country_rules):
# ──────────────────────────────────────────────────────────────────────────────
def main() -> None:
"""Point d'entrée principal : collecte les règles Anubis et les charge dans ClickHouse."""
print("[INFO] Collecte des règles Anubis depuis GitHub…")
ua_rules, ip_rules, asn_rules, country_rules = collect_all_rules()