Salut à tous ! Je suis une grosse bite en PHP, c'est assez sévère. Mais comme je suis débrouillard, j'arrive toujours à mes fins.
Bref, je voulais partager avec vous un bout de code que j'ai écrit tout à l'heure qui permet de rechercher un terme dans ses logs afin d'en connaitre le nombre d'occurrence. Je suis probablement le seul pélo à avoir besoin de ça, mais moi j'aime bien. Par exemple, combien de fois a été téléchargé tel fichier ? On recherche le nom du fichier et hop ! Evidemment on est limité par le temps des logs, et on ne peut pas savoir sur une année ou sur tout le temps. J'imagine que ca existe, avec un fichier d'incrémentation par exemple (tiens, idée ?), mais c'est pas le but ici.
C'est vraiment pas grand chose, mais je me dit que ca peut donner des idées, ou aider quelqu'un qui débute.
Je vous en prie, critiquez, améliorez, discutez !
Maintenant, pour le code bash : c'est le code écrit sur une ligne qui est passé à shell_exec() dans le code php. Je l'ai mis ici sur plusieurs lignes pour plus de lisibilité. Le code va rechercher dans vos logs serveur.
Il pourrait bien être différent pour vous, il faut l'adapter, mais l'idée est là :
@Saka/Mactux : il existe pas des balises genre [php] pour avoir la coloration et tout ?
Enfin, "désolé" pour les commentaires de codes en anglais, mais c'est comme ça que je fais, même quand ce n'est que pour moi.
Je vous invite tous à faire comme moi et à balancer vos de scripts, même pourris. Perso j'aime lire des scripts courts et bien commenté, c'est ce qui m'aide le plus !
Précisions : d'aucuns pourraient penser que le fait de passer de l'user input directement à un shell_exec pourraient être dangereux sans contrôle, mais j'ai fait quelques tests, et je n'ai pas trouvé de valeurs qui fasse planter le truc. Les guillemets sont échapées automatiquement, et un pipe fait planter mais ne permet pas d'en faire plus. Et de toute façon c'est planqué sur mon site, personne n'y a accès.
Exemple en image :
Dans cet exemple, je sais qu'il y a eu 168 accès aux différents fichiers flv de mon serveur. Je pourrais bien sur être plus précis en mettant le nom d'une seule vidéo. Si j'ai blackout le truc, c'est pour éviter les malins qui rechercheraient en boucle des chaines de caractères de plusieurs milliers de caractères.
Bref, je voulais partager avec vous un bout de code que j'ai écrit tout à l'heure qui permet de rechercher un terme dans ses logs afin d'en connaitre le nombre d'occurrence. Je suis probablement le seul pélo à avoir besoin de ça, mais moi j'aime bien. Par exemple, combien de fois a été téléchargé tel fichier ? On recherche le nom du fichier et hop ! Evidemment on est limité par le temps des logs, et on ne peut pas savoir sur une année ou sur tout le temps. J'imagine que ca existe, avec un fichier d'incrémentation par exemple (tiens, idée ?), mais c'est pas le but ici.
C'est vraiment pas grand chose, mais je me dit que ca peut donner des idées, ou aider quelqu'un qui débute.
Je vous en prie, critiquez, améliorez, discutez !
Code:
<?php $search = $_GET['search']; // Read variable from URL if ($search == "") { // If var $search is empty, $search = "No search entered"; // give it a value $num ="0"; // and this one too, that avoid doing stuff for nothing } else { $num = shell_exec("cd ~/logs/; cp ./access.log.*.gz ~/comax/logs; cp ./access.log.current ~/comax/logs; cd ~/comax/logs; cd ~/comax/logs; gunzip -f ./*.gz; cat ./* | grep -a -i $search | awk 'END {print NR}'; rm ./*"); // Yeah, I love bash. If there is another way, let me know. I'll develop that later on, but it's quite easy. } ?> // we're pretty much done. <html> // obviously... <head></head> <body> <FORM NAME ="test" METHOD ="GET" ACTION = "countme.php"> <!-- we use GET method because that's how $serch is read. Could have been POST too though. Action is the page that will be loaded. This designates the very page we're on in this case. --> <INPUT TYPE = 'text' VALUE ='<? echo("$search"); ?>' NAME = 'search'><!-- value is what's in the textbox, so it's prettier if it dynamically change with the search so that it doesn't default everytime. Name = search is important, that's what is used for the URL --> <INPUT TYPE = 'Submit'> <!-- just to have a button, but useless really. Just for pretty stuff. --> </FORM> <div id ='display'>There are <? echo("$num"); ?> results for <? echo("$search"); ?>.</div> </body> </html>
Il pourrait bien être différent pour vous, il faut l'adapter, mais l'idée est là :
Code:
#! /bin/bash cd ~/logs/ # Go to home folder, then logs cp ./access.log.*.gz ~/comax/logs #we can't work in that folder, so we copy over to a place where we can. cp ./access.log.current ~/comax/logs #same. Make sure destination folder exists. I didn't mkdir because it already exists for me. cd ~/comax/logs #Go to our working folder gunzip -f ./*.gz #Unzip everything in the folder cat ./* | # read everything and pipe to... grep -a -i $search | #grep, that will search vor the php variable we defined in the php script, and pipe to... awk 'END {print NR}' #awk, that will count how many lines there are, in the end to avoid massive useless output. rm ./* #delete all that shit. #That not very pretty, but it does its job !
Enfin, "désolé" pour les commentaires de codes en anglais, mais c'est comme ça que je fais, même quand ce n'est que pour moi.
Je vous invite tous à faire comme moi et à balancer vos de scripts, même pourris. Perso j'aime lire des scripts courts et bien commenté, c'est ce qui m'aide le plus !
Précisions : d'aucuns pourraient penser que le fait de passer de l'user input directement à un shell_exec pourraient être dangereux sans contrôle, mais j'ai fait quelques tests, et je n'ai pas trouvé de valeurs qui fasse planter le truc. Les guillemets sont échapées automatiquement, et un pipe fait planter mais ne permet pas d'en faire plus. Et de toute façon c'est planqué sur mon site, personne n'y a accès.
Exemple en image :
Dans cet exemple, je sais qu'il y a eu 168 accès aux différents fichiers flv de mon serveur. Je pourrais bien sur être plus précis en mettant le nom d'une seule vidéo. Si j'ai blackout le truc, c'est pour éviter les malins qui rechercheraient en boucle des chaines de caractères de plusieurs milliers de caractères.
Commentaire