Code source wiki de Compteur de téléchargements Python
Afficher les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| 1 | = Compteur de téléchargements Python = | ||
| 2 | |||
| 3 | == Objectif == | ||
| 4 | |||
| 5 | Mettre en place un compteur automatique de téléchargements pour les fichiers ISO hébergés sur ##downloads.linuxvillage.org##, avec : | ||
| 6 | |||
| 7 | * parsing quotidien des logs Apache | ||
| 8 | * dédoublonnage par IP + fichier + jour (pour éviter les faux multiples liés aux requêtes HTTP 206 des téléchargements repris) | ||
| 9 | * cumul des compteurs mois par mois dans un fichier JSON | ||
| 10 | * génération automatique d'une page publique listant les ISOs disponibles | ||
| 11 | * génération automatique d'une page de statistiques mensuelles privée | ||
| 12 | |||
| 13 | == Prérequis == | ||
| 14 | |||
| 15 | * Python 3 installé (##/usr/bin/python3##) | ||
| 16 | * Accès root au serveur | ||
| 17 | * Logs Apache disponibles sous ##/var/log/apache2/downloads-ssl-access.log*## | ||
| 18 | * Paquet ##cron## installé : ##apt install cron## | ||
| 19 | |||
| 20 | == Installation du script == | ||
| 21 | |||
| 22 | Créer le répertoire et y déposer le script (pièce jointe à cette page, à renommer sans le ##.txt## final) : | ||
| 23 | |||
| 24 | {{code language="bash"}} | ||
| 25 | mkdir -p /opt/download_stats | ||
| 26 | # déposer download_stats.py dans ce répertoire | ||
| 27 | chmod 750 /opt/download_stats/download_stats.py | ||
| 28 | {{/code}} | ||
| 29 | |||
| 30 | == Structure du répertoire .stats == | ||
| 31 | |||
| 32 | Le script crée et gère automatiquement le répertoire caché ##.stats## à la racine de l'espace de téléchargements : | ||
| 33 | |||
| 34 | {{code language="bash"}} | ||
| 35 | mkdir /var/www/file-server/.stats | ||
| 36 | {{/code}} | ||
| 37 | |||
| 38 | Ce répertoire contiendra : | ||
| 39 | |||
| 40 | * ##counts.json## — historique cumulatif des compteurs mensuels | ||
| 41 | * ##index.html## — page de statistiques privée | ||
| 42 | |||
| 43 | La page de statistiques est accessible à l'URL : | ||
| 44 | ##https:~/~/downloads.linuxvillage.org/.stats/## | ||
| 45 | |||
| 46 | Cette URL est accessible mais n'est pas référencée publiquement. | ||
| 47 | |||
| 48 | == Configuration du cron == | ||
| 49 | |||
| 50 | En tant que root : | ||
| 51 | |||
| 52 | {{code language="bash"}} | ||
| 53 | crontab -e | ||
| 54 | {{/code}} | ||
| 55 | |||
| 56 | Ajouter la ligne suivante (exécution quotidienne à 01h00 UTC) : | ||
| 57 | |||
| 58 | {{code language="bash"}} | ||
| 59 | 0 1 * * * /usr/bin/python3 /opt/download_stats/download_stats.py | ||
| 60 | {{/code}} | ||
| 61 | |||
| 62 | == Remise à zéro du JSON == | ||
| 63 | |||
| 64 | En cas de besoin (changement de structure, réinitialisation des compteurs) : | ||
| 65 | |||
| 66 | {{code language="bash"}} | ||
| 67 | echo '{}' > /var/www/file-server/.stats/counts.json | ||
| 68 | /usr/bin/python3 /opt/download_stats/download_stats.py | ||
| 69 | {{/code}} | ||
| 70 | |||
| 71 | == Pages générées == | ||
| 72 | |||
| 73 | Le script génère deux pages HTML à chaque exécution : | ||
| 74 | |||
| 75 | ; Page publique | ||
| 76 | : ##/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). | ||
| 77 | |||
| 78 | ; Page de statistiques (privée) | ||
| 79 | : ##/var/www/file-server/.stats/index.html## — tableau des téléchargements mois par mois, avec total par fichier et total général. | ||
| 80 | |||
| 81 | == Logique du script == | ||
| 82 | |||
| 83 | ; Parsing des logs | ||
| 84 | : 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. | ||
| 85 | |||
| 86 | ; Dédoublonnage | ||
| 87 | : 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. | ||
| 88 | |||
| 89 | ; Structure JSON mensuelle | ||
| 90 | : 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. | ||
| 91 | |||
| 92 | ; Scan du répertoire | ||
| 93 | : 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. | ||
| 94 | |||
| 95 | == Pièce jointe == | ||
| 96 | |||
| 97 | Le fichier ##download_stats.py.txt## joint à cette page est le script Python source. | ||
| 98 | À renommer en ##download_stats.py## après téléchargement, puis : | ||
| 99 | |||
| 100 | {{code language="bash"}} | ||
| 101 | chmod 750 /opt/download_stats/download_stats.py | ||
| 102 | {{/code}} |