Compteur de téléchargements Python

Version 14.1 par Mélodie le 2026/05/08 09:15

Compteur de téléchargements Python

Objectif

Mettre en place un compteur automatique de téléchargements pour les fichiers ISO hébergés sur downloads.linuxvillage.org, avec :

  • parsing quotidien des logs Apache
  • dédoublonnage par IP + fichier + jour (pour éviter les faux multiples liés aux requêtes HTTP 206 des téléchargements repris)
  • cumul des compteurs mois par mois dans un fichier JSON
  • génération automatique d'une page publique listant les ISOs disponibles
  • génération automatique d'une page de statistiques mensuelles privée

Prérequis

  • Python 3 installé (/usr/bin/python3)
  • Accès root au serveur
  • Logs Apache disponibles sous /var/log/apache2/downloads-ssl-access.log*
  • Paquet cron installé : apt install cron

Installation du script

Créer le répertoire et y déposer le script (pièce jointe à cette page, à renommer sans le .txt final) :

mkdir -p /opt/download_stats
# déposer download_stats.py dans ce répertoire
chmod 750 /opt/download_stats/download_stats.py

Structure du répertoire .stats

Le script crée et gère automatiquement le répertoire caché .stats à la racine de l'espace de téléchargements :

mkdir /var/www/file-server/.stats

Ce répertoire contiendra :

  • counts.json : historique cumulatif des compteurs mensuels
  • index.html : page de statistiques privée

La page de statistiques est accessible à l'URL :
https://downloads.linuxvillage.org/.stats/

Cette URL est accessible mais n'est pas référencée publiquement.

Configuration du cron

En tant que root :

crontab -e

Ajouter la ligne suivante (exécution quotidienne à 01h00 UTC) :

0 1 * * * /usr/bin/python3 /opt/download_stats/download_stats.py

Remise à zéro du JSON

En cas de besoin (changement de structure, réinitialisation des compteurs) :

echo '{}' > /var/www/file-server/.stats/counts.json
/usr/bin/python3 /opt/download_stats/download_stats.py

Pages générées

Le script génère deux pages HTML à chaque exécution :

Page publique
/var/www/file-server/index.html → liste les ISOs présents avec leur taille, leur date de mise en ligne, et les liens vers les sommes de contrôle (.md5, .sha512). Le contenu est détecté automatiquement par scan du répertoire. La page respecte la charte graphique de https://linuxvillage.org (couleurs, fontes, mise en page).
Page de statistiques (privée)
/var/www/file-server/.stats/index.html → tableau des téléchargements mois par mois, avec total par fichier et total général.

Logique du script

Parsing des logs
Le script parcourt tous les fichiers downloads-ssl-access.log* (y compris les fichiers gzippés issus de la rotation). Seules les requêtes GET et HEAD sur les fichiers .iso avec code HTTP 200 ou 206 sont retenues.
Dédoublonnage
Pour chaque ligne retenue, une clé (ip, fichier, jour) est construite. Si cette clé a déjà été vue dans la même passe, la ligne est ignorée. Cela évite de compter plusieurs fois un téléchargement repris qui génère de multiples requêtes 206.
Structure JSON mensuelle
Les compteurs sont stockés par fichier et par mois (YYYY-MM). À chaque exécution, le script fusionne les nouveaux compteurs avec l'historique en prenant le maximum entre les deux valeurs → ce qui préserve les données antérieures à la fenêtre de rétention des logs (14 jours) sans créer de double-comptage.
Scan du répertoire
La liste des fichiers affichés sur les pages HTML est construite dynamiquement à chaque exécution. L'ajout d'une nouvelle version ISO ne nécessite aucune intervention manuelle.

Pièce jointe

Le fichier download_stats.py.txt joint à cette page est le script Python source.
À renommer en download_stats.py après téléchargement, puis :

chmod 750 /opt/download_stats/download_stats.py