Articles

Exécuter une commande sur plusieurs serveurs

Comme il m'arrive de plus en plus souvent de devoir exécuter une commande sur plusieurs serveurs Linux, je devais trouver une solution efficace et élégante pour éviter de lancer n fois un ssh NomServeuri MAcommande. Bien entendu cette solution existe déjà elle s'appelle DSH pour distributed shell (ou dancer shell ) et un fois installé elle permet de lancer un : dsh -a -M -c -- geos-config --version pour connaitre la version de geos installé sur chaque serveur l'option -a indique que l'on veut lancer la commande sur toutes les machines se trouvant dans /etc/dsh/machines.list l'option -c indique que l'on veut lancer la commande en mode concurrent l'option -M préfixe la sortie des commandes avec le nom du serveur qui a envoyé la réponse le fichier /etc/dsh/dsh.conf permet de configurer les valeurs par défaut de certaines options Cet outil est une source d'efficacité extraordinaire quand on a plusieurs serveurs et bien sur comme toujours pour un outil puis...

Compter le nombre de codes HTTP dans des fichiers logs avec awk

Image
Aujourd'hui je devais sortir rapidement la liste des différents codes HTTP de tous les fichiers logs IIS. Comme expliqué dans mon post précédent j'ai un fichier par jour et environ 16 GB de fichiers logs sur une année... Dans un fichier log pour un serveur web il y a en général un code indiquant le status de l'opération réalisée. Ainsi dans IIS on peut utiliser un format de log W3C qui affichera la colonne sc-status pour le Http status code ainsi que la colonne sc-substatus. Mon but est de parcourir tous les fichiers logs et de calculer le nombre de fois que l'on trouve chacun de ces status code. On pourrait le faire avec du perl, mais je préfère aujourd'hui essayer awk présent sur toutes les bonnes distros Linux en standard. awk ou le plus répandu et moderne gawk est un outil formidable pour traiter très rapidement des gros volumes de données au format texte. Commençons par un exemple simple : je veux trouver toutes les lignes du log ou le code d'état HTTP es...

Analyse de fichiers Log en perl

Quand il faut analyser de grandes quantité de données sous format texte tel que des fichiers logs, Perl est d'une aide inappréciable. Voici un joli "perl oneliner" qui va calculer le nombre de hits par user login dans un log IIS perl -ne 'unless (/^#.*$/) {@e=split(/ /,$_); $Login{uc($e[8])}++;} END{foreach $key (sort keys %Login){printf(qq(%-25s %i\n),$key,$Login{$key}); } }' 2007/ex070106.log 2007/ex070107.log |sort -k 2nr >DistinctsLogins200701.txt Analysons un peu cette ligne de commande: perl -ne : on lance perl avec les option -n qui rajoute une boucle while ( ) {...} implicite et l'option -e qui permet justement d'exécuter une commande cf doc perl en ligne 'unless (/^#.*$/) { : viens maintenant le début du programme perl, en l'occurrence on dit que tant qu'on est pas dans une ligne de commentaire on va faire quelque chose se trouvant après l'accolade ouvrante. En effet dans les fichiers logs une ligne commentaire commence p...

Downloader un fichier sur le net sous Win32

Il est parfois nécessaire de récupérer un ou plusieurs fichiers sur le net en ligne de commande sous Microsoft. Pour cela il suffit d'utiliser l'excellent curl compilé pour cette plateforme. Ensuite de quoi il faut penser à utiliser un utilisateur null avec l'option -u ":" . Ainsi cela force curl à utiliser les credentials du compte courant, c'est à dire le user qui est connecté. Chez moi au final cela donne curl --anyauth -u ":" -x "" --netrc http://www.test.com/logs/ l'option -x "" annule une evt variable d'environnement définissant un proxy, elle est utile par exemple quand vous ne voulez pas utilisez le proxy parceque votre serveur est dans votre réseau local (et pas sur internet) A vous de voir si vous en avez besoin ou pas selon les cas.

Trouver la date de hier en Perl

Pour récupérer la date de hier en Perl, toujours en une ligne: perl -e '($d,$m,$y)= (localtime)[3..5];printf("%04d-%02d-%02d",$y+1900 ,$m+1,$d-1)' retournera : 2007-07-09 S'il s'agit de conserver cette chaine pour par exemple downloader un fichier log il suffit d'utiliser sprintf #!/usr/bin/perl ($d,$m,$y)= (localtime)[3..5]; $yesterday=sprintf("%04d-%02d-%02d",$y+1900 ,$m+1,$d-1); print $yesterday;

Récuperer tous les hyperliens d'une page web

c'est trop beau pour pas le signaler, en une ligne afficher la liste de tous les hyperliens sur une page web curl --anyauth --netrc http://yourweb/yourpage.htm |perl -ne 'while (m/HREF=["]([^"]+)/gi) {print "$1\n";} '

Vista? Voyons un peu plus loin que le bout de notre nez

Aujourd'hui la société Micro$oft lance à grand coup de millions de dollars son "nouvel" OS. Quand un journaliste a demandé s'il était vrai que la société allait investir plus d'un demi-milliard de dollars pour la promotion de son produit Vista le big boss a joué son joker et n'a pas voulu démantir... Posons nous la question si aujourd'hui avec les problèmes et la misère qu'il y a sur la planète s'il est raisonnable qu'une société investisse autant pour la promotion que pour la manufacture d'un produit. Pour la petite histoire il y a quelques anées pour le lancement de Windows NT 4 Micro£oft avaient déjà reconnu à l'époque que le budget promo était identique au coûts de dev. Si un vendeur d'aspirateurs vous annonçait la même chose fièrement en essayant de vous fourguez son tout dernier produit contre la modique somme de 450US$ vous feriez quoi ? Probable que vous éclateriez de rire et que vous iriez achetez un aspirateur à la concur...
Premier test de Google Docs & Spreadsheets ! Bon et bien voilà le premier test d'utilisation d'un service de plus de Google à savoir l'éditeur en ligne de document et de tableaux... Il faut avouer que la perspective de pouvoir utiliser un traitement de texte et un tableur indépendamment de la plate-forme sur laquelle on se trouve est assez sympathique. Et puis le fait de pouvoir rédiger un document dans une interface conviviale et le poster dans un blog c'est bien pratique. On verra à l'usage...

QEMU un PC dans ton PC

Après un essai de vmware sur ma Linux Gentoo Box, et vu que je n'étais pas chaud pour lacher 190$ j'ai décidé de tester QEMU Et ben ça marche super bien, sur gentoo il y a un HOWTO de disponible. En gros après le traditionnel emerge il faut faire un : qemu-img create disk.img 10G qui va créer un fichier disque pour votre bécanne virtuelle, puis après avoir mis dans votre lecteur CD une galette de chez M$ vous pouvez sans autre lancer : qemu -localtime -hda disk.img -cdrom /dev/cdrom -boot d -m 256 -win2k-hack et c'est parti pour l'installation de l'OS du père Bill sur votre bécanne virtuelle Quand c'est terminé (l'installation) vous pouvez éteindre votre bécanne virtuelle. Dorénavant pour lancer votre Bécanne M$ sur Linux il vous suffirea de taper : qemu -localtime -hda disk.img -m 256 Sur ma bécanne gentoo j'ai rajouté les 4 paquetages suivants dans /etc/portage/package.keywords pour avoir les dernières versions app-emulation/qemu-user ~x86 app-emul...

Comment ajouter un séparateur de millier (en 1line)

c'est trop beau, c'est du perl et c'est en une seule ligne : perl -pi.original -e "s/(? ))/'/g unless /2006/" default.html et avec ça tous les chiffres du fichier html passé en paramètre vont recevoir un joli séparateur de milliers. Et ne plus on a une copie de sécurité qui se crée au cas zou... Ainsi j'avais des lignes du style : <FONT SIZE="-1">644303595217</FONT> qui deviennent <FONT SIZE="-1">644'303'595'217</FONT> c'est juste pur , c'est juste du perl !

Modifer une variable dans n fichiers de configs INI

Hier, j'ai finalisé la config d'un serveur de secours Linux Opteron pour notre guichet cartographique. Il s'appuye sur l'excellent produit Mapserver ainsi que sur le non moins excellent framework php Cartoweb de CamptoCamp ! J'utilise rsync pour la synchronisation et j'ai été confronté à un chtit problème, sur mon deuxième serveur au vu des versions de apache et php que j'avais utilisé il me fallait charger la dll php_mapscript.so au niveau du php.ini. Du coup il me fallait modifier tous les sites cartographiques de mon serveur au niveau d'un fichier de config nommé server.ini. Je devais modifier dans tous ces fichiers la valeur d'une variable nommée disablePHPModuleCheck, est la passer de false à true. Donc en résumé j'avais n fichiers server.ini à chercher dans une arborescence complexe démarrant dans "/data/dataweb/web/" puis il me fallait éditer chacun de ces fichiers pour passer la valeur de la variable " disablePHPModuleC...

Trouver des fichiers contenant une regular expression

L'autre jour je devais parcourir toute une arborescence de fichiers pour trouver tous les fichiers de type CSS ayant un style utilisant l'attribut url("cheminrelatif/fichierimage.png") et ou il manquait le premier guillemet. Avec la combinaison des commandes find,egrep et surtout xargs j'ai pu trouver les fichiers en question tout de suite : find . -name '*.css' |xargs egrep -lr 'url\([^"]+"\)'

Les commandes "shell bash" sont trop belles !

Quand on administre des serveurs, ou quand on programme on a souvent des petits problèmes à résoudre en relation avec un certain nombre de fichiers ou une crackée de paramètres. Et franchement la connaissance du shell est un outil qui fait gagner beaucoup de temps. Un des problèmes qui vient souvent c'est un truc du style : pour chacun de ces trucs fait ça avec le truc... Et la boucle for est salvatrice, Ainsi je veux lancer un script ou une commande avec un paramètre différent qui se trouve être dans un fichier ListeParam.txt : for i in `cat ListeParam.txt` ; do (./MonScript.sh $i) ; done Et voilà ! mon script va se lancer autant de fois qu'il y a de lignes dans le fichier ListeParam.txt Simple, efficace, juste BÔ ! J'avais par exemple cette liste de noms de 352 tables SQL ListeTables.txt et un script php qui devait analyser la table sous MSSQL et généer du code pour la créer sous PostgreSql GenPgSqlCreate.php et bien avec un rapide : for i in `cat ListeTables.tx...

Traiter des valeurs avec perl dans un log

Il m'arrive régulièrement d'automatiser des tâches avec des scripts en perl ou en bash. Typiquement voici un exemple de petit script qui va effectuer une syncronisation avec rsync et garder une trace dans un log de tout problèmes éventuel. #!/usr/bin/bash RSYNC="/usr/bin/rsync" OPTS="-va --stats --partial --partial-dir=tmp --safe-links --no-implied-dirs --timeout=300 --exclude-from=rsync_excluded.txt" SRC1="rsync://myserver.mydomain.org/mydirectory/" DST1="mylocal_directory/" echo "Started update at" `date` >> $0.log 2>&1 logger -t rsync "re-rsyncing witm my remote rsync directory" ${RSYNC} ${OPTS} ${SRC1} ${DST1} >> $0.log 2>&1 echo "End: "`date` >> $0.log 2>&1 Okay, maintenant après quelque mois d'exploitation vous vous retrouverez avec un fichier contenant beaucoup d'informations. Si vous voulez récupérez une partie, et seulement une partie un petit bout de ...

Obtenir la liste des paquetages "ebuilds" sous Gentoo

Image
Quand on utilise la distribution Gentoo sur plusieurs serveurs comme c'est le cas en ce qui me concerne, il peut être intéressant de retrouver rapidement la liste des paquetages wue l'on emerger par le passé. Bien sur certain dirons qu'il suffit de regarder le contenu du "world" et faire un : less /var/lib/portage/world pour voir la liste des paquetages installé expressement sur cette machine... Sauf que bien souvent on aimerait bien avoir un peu plus d'informations, c'est pour cela que j'utilise les outils du paquetage gentoolkit notamment l'utilitaire qpkg qui permet d'obtenir des informations sur un paquetages précis. Donc vous pouvez installer le paquetage gentoolkit avec un : emerge -v gentoolkit puis ensuite vous puvez voir tout ce qui a été installé en lançant un : equery f gentoolkit ce qui va vous lister les fichiers contenus dans le paquetage en question. Comme le but de toute l'opération était de pouvoir ressortir plus d'on...

Dans la jungle des blogs !

Image
Waouhh, il est très difficile de comprendre la logique de google, j'en étais à ma Xième tentative d'enregistrement de mon blog sur google quand j'ai commencé à sérieusement me demander si le moteur d'indexation de «Gogol» n'était pas un peu inspiré de la logique floue voire du mouvement brownien... En effet il semble parfois impossible de faire fonctionner ce maudit moteur pour qu'il indexe mon blog. Damned ! Je commence sérieusement à douter de l'engin, il faut que je me veille avant de basculer dans le côté obscur de la Force... Du coup j'ai voulu vérifier au niveau des autres blogs comment cela se passe, et dans mes pérégrinations je suis tombé sur blogwise que je trouve assez cool. L'idée d'indexer et de classer des blogs uniquement me semble être une tâche titanesque, il y a quasiment 40'000 blogs sur ce site, mais comment assuré un minimum de pertinence. Et dans le genre débile on a les plus de 6'176'200 blogs annoncés comme in...

Perl : Comment afficher des "gros" chiffres avec un séparateur de milliers ?

Hummm quand il s'agit de lire des très grand chifres à l'écran, il n'est pas très pratique de devoir compter à la main sur l'écran les groupes de milliers... Et donc un séprateur de millier prend tout son sens : 1'456'987 est plus lisible que 1456987 ! c'est ainsi que Perl devient votre petit à petit votre alié quotidien. Car à l'aide des expressions régulières et de l'opérateur de substitution il est très facile d'obtenir l'effet escompté en 3 lignes ! En éxécutant le code ci-dessous on obtient . My personal fortune is 1'234'567 US$ #!/usr/bin/perl -w use strict; my $test = "My personal fortune is 1234567 US\$"; print PrintStringWithThousandSeparator($test); sub PrintStringWithThousandSeparator { my $Newtext = $_[0]; $Newtext =~ s/(? return $Newtext; }

ReverseProxy avec Apache

Quand on veut permettre à un utilisateur lambda d'accèder sur un reseau public d'accèder à des informations sur un site web 192.168.50.120 situé dans un réseau privé, deux possibiliés s'offre à nous: On peut prendre un serveur Linux et avec deux cartes réseau : une côté publique - eth0[10.163.200.9], une côté privé - eth1[192.168.50 77]) l'utiliser comme un Firewall avec les iptables et une règle DNAT pour ouvrir un port sur l'interface publique du firewall qui redirigera les demandes sur le serveur web du réseau privé exemple: echo 1> /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.163.200.9 --dport 80 -j DNAT --to-destination 192.168.50.120 Ou on peut configurer un reverse proxy avec Apache ou Squid sur le Firewall Dans le deuxieme cas on a plus de souplesse car on peut intervenir sur chaque url par exemple avec mod_rewite mais tout d'abord la config nécess...

Du code portable Win32-Linux

Pour obtenir très rapidement du code utilisant du graphisme et fonctionnant aussi bien sous Linux que sous Microsoft, je dois dire que le couple OpenGL /GLUT reste des valeurs sures à mes yeux. Ainsi le code ci-après fonctionne et se compile pil-poil sous win32 et sous Linux: /* My First GLUT chtit bout de code pour compiler sous linux : gcc -o cgglut01 cgglut01.cpp -lglut -lX11 -lGL -lGLU */ #include void display(void) { glClear (GL_COLOR_BUFFER_BIT); // draw blue rectangle with corners at // (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) glColor3f (0.0, 0.0, 1.0); glBegin(GL_POLYGON); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); // start processing buffered OpenGL routines glFlush (); } void init (void) { glClearColor (0.0, 0.0, 0.0, 0.0);// select clearing color background /* initialize viewing values */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrt...

Apache - Action : la magie de l'interception

Image
En utilisant Apache et avec des clients IE on tombe parfois sur des abérations à la MiKro$oft! Par exemple ce fichier pdf qui plantait IE alors qu'il s'ouvre parfaitement bien dans Firefox le même genre de mésaventure pouvant se produire avec des fichiers tiff, et qui n'a pas connu la joie du rennomage d'un fichier CGI sur un serveur web de Programme.pl ou Programme.cgi en Programme.txt afin que IE veuille bien ne pas tenter le download mais se contenter d'afficher le texte retourné.... Bien souvent tout cela est souvent du à la méthode pour le moins peu ortodoxe de Microsoft de traiter les headers Content-type ( voici une excelente page explique la saga IE sur ce point... ) Quand je dit traiter comprenez ignorer , ainsi sur MSDN Microsoft nous explique que : ..If the server-provided MIME type is either known or ambiguous, the buffer is scanned in an attempt to verify or obtain a MIME type from the actual content. If a positive match is found (one of the hard-co...