L'appartement

Aller au contenu | Aller au menu | Aller à la recherche

Le codage

Pep, ne me tue parceque je fais une section php et pas une section shellscript, une c++ ;-) Je savais quoi mettre !

Fil des billets - Fil des commentaires

mercredi, février 27 2008

Un script de monitoring ultra simpliste

Loin de Nagios et de ses innombrables possibilités, voici un script bash minimaliste pour tester la disponibilité d'une machine ou plusieurs machines via un ping et recevoir, en cas de non réponse, les alertes par SMS[1] et/ou mail. Le principe est le suivant :

  • on teste toutes les X minutes la disponibilité des hôtes
  • si une machine est détectée down, on le note dans un fichier temporaire
  • si 5 minutes après la machine est toujours down, on lance les alertes
  • quand la machine est de nouveau up, on renvoi un mail (pas de SMS dans ce cas)

Pour configurer le script, il suffit de préciser les variables commentées au début du fichier.

#!/bin/bash

# pingTest par Yves et Thierry
# http://www.grafactory.net/blog/
# 2008 / Licence LGPL

# les hotes a tester
HOSTS="domain.tld autredomaine.tld"

# sujets des mails
SUBJECT="machine down"
SUBJECT_UP="machine up"

# envoyer un SMS via tm4b.com
EMAILID="moi@domain.tld"
TELID="XXXXX"
PASSWD="XXXXX"

# envoyer un simple mail
EMAILSIMPLE="moi@domain.tld"

# nombre test
COUNT=4

for myHost in $HOSTS
do
    if ! ping -q -c $COUNT $myHost >> /dev/null
    # elle est KO
    then
        if [ ! -f /tmp/mail.$myHost ]
        # on n est pas encore au courant
        then
            if [ -f /tmp/ping.$myHost ]
                # elle etait KO cinq minutes avant, faut prevenir
            then
                # envoyer un SMS
                echo "To - $TELID\nFrom - $TELID\nMessage - La machine $myHost ne repond plus a $(date)\nPassword - $PASSWD" |\
                mail -s "[$myHost] $SUBJECT" $EMAILID
                # envoyer un mail normal
                echo "La machine $myHost ne repond plus a $(date)" |\
                mail -s "[$myHost] $SUBJECT" $EMAILSIMPLE
                #  creer le fichier pour indiquer que le mail a ete envoye
                touch /tmp/mail.$myHost
            fi
            touch /tmp/ping.$myHost
        fi
    else
        # elle n est pas KO
        if [ -f /tmp/ping.$myHost ]
        then
            rm /tmp/ping.$myHost
        fi
        if [ -f /tmp/mail.$myHost ]
        then
            rm /tmp/mail.$myHost
            # renvoyer un mail
            echo "La machine $myHost repond a nouveau a $(date)" |\
            mail -s "[$myHost] $SUBJECT_UP" $EMAILSIMPLE
        fi
    fi
done

Dans la crontab, on ajoute la ligne suivante (ici, un test toute les 5 minutes).

# faire un test de ping toutes les 5 min
*/5 * * * * /usr/local/sbin/pingtest >> /dev/null

(on suppose donc ici que le script est installé dans /usr/local/sbin/)

Toutes les améliorations sont les bienvenues ;)

Notes

[1] Pour recevoir les alertes par SMS, j'utilise le service Email to SMS de TM4B . Les SMS peuvent être de prépayés via PayPal à un tarif très intéressant. Cette société propose aussi un API très complet pour l'envoi de SMS depuis un programme, un site Web...

lundi, septembre 10 2007

Recherche Fulltext et InnoDB avec Mysql

Logo MysqlLes avantages de l'utilisation du moteur de stockage InnoDB par rapport à MysIsam sur une base de données Mysql (à partir de la version 5.02) sont non négligeables sur certains projets. Il permet l'utilisation :

  • de contraintes d'intégrité (Foreign Key ect...)
  • de triggers (déclencheurs en français dans le texte).
  • de procédures stockées
  • ...

Un inconvénient est, par contre, particulièrement pénalisant dès qu'on envisage un moteur de recherche en "texte intégral". Il est en effet impossible de créer des index FULLTEXT avec le moteur InnoDB ! L'utilisation des MATCH et autres joyeusetés est donc impossible. Le classement pertinent des résultats devient plus compliqué à mettre en oeuvre.

Je me suis retrouvé confronté à ce problème récemment et voici comment je l'ai contourné. Je résume, pour l'exemple, en une unique table, ma structure de données qui en compte quelques dizaines.

J'ai donc une table "texts" qui utilise InnoDB avec quelques champs dont le "title" sur lequel je souhaite faire les recherches (la clé primaire s'appelle "idtext").

J'ai créé une table "searchs_texts" avec le moteur MyIsam, deux champs - idtext/title - et un index FULLTEXT sur le champ "title".

Cette table contient, vous l'aurez compris, l'exacte correspondance des champs idtext/title de la table texts.

Reste à tenir à jour cette table sans modifier le code de tous le site. Les triggers vont nous être bien utile pour ça :

Un pour l'INSERT :

CREATE TRIGGER trigger_insert_texts
AFTER INSERT ON texts
FOR EACH ROW
INSERT INTO searchs_texts SET idtext=NEW.idtext, title=NEW.title;


Un pour l'UPDATE :

CREATE TRIGGER trigger_update_texts
AFTER UPDATE ON texts
FOR EACH ROW
UPDATE searchs_texts SET title=NEW.title WHERE idtext=OLD.idtext;


Et enfin, un pour le DELETE :

CREATE TRIGGER trigger_delete_texts
AFTER DELETE ON texts
FOR EACH ROW
DELETE FROM searchs_texts WHERE idtext=OLD.idtext;

Et voilà. Le tour est joué ! Maintenant, votre moteur de recherche pourra utiliser tous ce qui est disponible et bientôt concurrencer Google ;)

vendredi, avril 13 2007

Le plein de navigateurs

Voilà un petit truc qui évite d'avoir plein de machines virtuelles pour tester vos sites sur IE6+IE7+IE5+Opéra+Firefox ect... Une compilation de navigateur qui se lance en "standalone" sous Winchose. (je n'ai pas Win mais j'ai au moins une VM de test)

Standalone et Portable browser

N'oubliez quand même pas de tester sous Safari, Konqueror, Epiphany et Lynx ;)

jeudi, octobre 5 2006

Une nouveauté pas web 2.0 de Google

Un truc sympa du maxi Google - à première vue. il faut voir à l'usage - : le moteur de recherche sur du code source. C'est Google Codesearch. Ca change des trucs web 20.0 ;)

D'après ce qu'on peux lire ici ou là, il n'y aurait pas de liens sponsorisés sur ce moteur... Pour combien de temps ? Quand on voit la foultitude de sites de "développeurs" sans aucun contenu réel et qui ne font que pomper des listes de diffusions (voir carrément des articles d'autres sites)... Tout ça, bien entendu, entouré d'un maximum de publicité, on peux se poser la question...

C'est quand même à tester !

jeudi, octobre 27 2005

Le PHP est loin d'être mort

La mode est à Ruby. Il faut programmer en Ruby pour être un vrai geek de la programmation. Ruby On Rails par çi, Ruby machin par là... C'est vrai que ça a l'air bien mais c'est à se demander si PHP n'est pas un langage de "hasbeen". Il semble en être autrement si on en croit cet article paru sur ZDnet et intitulé Oracle et IBM professionnalisent PHP. Le titre est quand même un peu mal choisi : comme si on avait attendu IBM et Oracle pour que PHP soit un langage pro !

samedi, juillet 2 2005

Du Ajax plein les yeux... XmlHttpRequest inside

La rumeur court sur la planète Webdesign, il paraît que le futur des applications Web passera peut-être par "Ajax". Mais que se cache t'il donc derrière ce nom de produit ménager ?! En tout cas mon avis est fait après quelques lectures non dénuées d'intérêts et quelques mises en applications des exemples donnés : c'est sans doute vrai qu'une petite révolution est en marche !

Google Mail ou encore Google Suggest, par exemple, sont déjà basés sur ce système et le nombre de sites qui utilisent cette technologie ne fait qu'augmenter de jour en jour.

C'est vrai qu'à la vue des possibilités offertes par ce système on peux imaginer beaucoup de mise en pratique. Avant d'en arriver là, voici un article que Bruno m'avait signalé et qui résume très bien le mode de fonctionnement des applications Web utilisant cette technologie. Si vous n'êtes pas un parfait bilingue, je vous conseille quand même de vous attarder sur le schéma explicatif...

Après avoir lu cet article, vous voudrez bien évidement connaître toutes les possibilités offertes par Ajax, et vous y essayer. C'est là qu'un petit tour dans la partie "demo" du site consacré à OpenRico - Une classe justement à cette fabuleuse technologie - vous permettra définitivement d'être convaincu que vos applications vont s'enrichir de cette nouveauté !

De mon côté, après l'avoir très modestement éprouvée sur le moteur de recherche par référence du site de La Crosse Technology, j'ai récidivé sur Theatre-contemporain.net.

Je me suis déjà attaqué à la page des éditeurs. Pour cet exemple, j'ai utilisé la classe découverte sur ce blog de qwix trouvé par hasard et qui semble être le fait d'un blogueur bisontin. Je vous livre donc tel quel, brut de décoffrage, le bout de source qui va bien :

Quelques extrait de la page qui contient la liste nominative :

// appel à la classe
// fonction javascript
<script type="text/javascript" language="javascript">
    function chargeFichier(id) {
        // Création de l'objet
        var XHR = new XHRConnection();
        // Zone a remplir
        XHR.setRefreshArea('zonedetail'+id);
        // Chargement de la page
        XHR.sendAndLoad("details-editeur.php?idedit="+id, "GET");
        return true;
    }
</script>
<?php
// boucle depuis la base de données
    while ($row = $result->fetchRow()) {
        $country =& $db->getOne("SELECT ".$lang." FROM ".$table_paysth." WHERE id='".$row['country']."' ");
            echo "<li><a href=\"javascript:;\" onclick=\"chargeFichier(".$row['id'].");\">".$row['organisation']."</a> - ".$row['city']." (".$country.")";
            echo "<div id=\"zonedetail".$row'id'."\"></div>";
            echo "</li>";
    }
... ect
?>

Extrait de la page qui contient les détails :

<?php
 echo "<div class=\"maisonseditions\">";
       echo "<div style=\"font-size: 10px; text-align: right;\"><a href=\"javascript:;\" onclick=\"document.getElementById('zonedetail".$row'id'."').innerHTML = '';\">x
fermer</a></div>";
... ici les infos détaillées ....
       echo "</div>";
?>

Pour être sur que tout le monde à compris : la page editeurs.html ne charge que la liste nominative. Ensuite chaque clic sur le nom d'un éditeur fait appel au données le concernant. Léger et efficace, seulement quelques octets de données sont appelés à chaque fois depuis le serveur.

Sur ma lancée, j'ai aussi utilisé Ajax sur la page du calendrier afin d'éviter de charger les importantes et longues listes déroulantes du moteur de recherche avancé à chaque chargement de la page "calendrier" (couplé à un système de cache c'est bien rapide).

Alors pas convaincu par l'intitulé de l'article cité plus haut : "Ajax: A New Approach to Web Applications" ?

samedi, mars 26 2005

Rotation des logs après l'analyse statistique

Je me suis pas mal pris la tête sur ce problème. Il s'agit d'archiver les logs brut du serveur web Apache compressés en gzip, toutes les nuits après la génération des statistiques par AWStats. Ceci pour une historisation des journaux qui laisse la possibilité de, par exemple, recalculer les statistiques annuelles avec autre choses que AWStats.

La solution est en fait assez simple : il suffit de préciser à logrotate qu'il doit exécuter un script avant d'archiver. Voici donc la configuration de logrotate sur le serveur en question :

     /home/web/*/logs*/access_log {
         notifempty
         daily
         rotate 31
         compress
         sharedscripts
         prerotate
             /home/cgi-stats/tools/awstats_updateall.pl now -awstatsprog=/home/cgi-stats/awstats.pl -configdir=/home/cgi-stats/
         endscript
         postrotate
             /usr/bin/killall -HUP httpd
         endscript
     }
     
     /home/web/*/logs*/error_log {
        notifempty
        weekly
        rotate 4
        compress
        postrotate
             /usr/bin/killall -HUP httpd
        endscript
     }

Pour comprendre l'utilisation des jokers (*), voici comment sont organisés les fichiers du serveur web :

/home/web/domaine.tld/logs/acces_log
/home/web/domain.tld/logs/error_log

Enfin, le script awstats_updateall.pl permet de lancer l'analyse statistique pour tous les domaines en même temps.

Pour le détail sur logrotate, je vous renvois au man ;) . Et on me souffle dans l'oreillette que cronolog est aussi une solution intéressante... A voir !

lundi, janvier 31 2005

Une nouvelle réalisation pour La Crosse Technology

Il faut bien que je me congratule un peu ;) Mon premier site vraiment, réellement et entièrement en XHTML strict et en CSS. Bon il y a quelques parties en Flash mais c'est pas moi qui est insisté. Il manque aussi un bonne intégration des "accesskey" , j'ai encore quelques soucis pour des javascript qui ne sont pas "compliant" plus quelques autres détails. Enfin c'est déjà bien sous Lynx, lecteur écran, palm, Pocket PC (netscape 4, s'abstenir).

C'est un site codé avec les fabuleuses classes PEAR et notamment la classe DB (je peux donc le passer sous Oracle ou Postgree en changeant 2 lignes). J'ai placé un petit gadget sympa : moteur de recherche avec autocomplétion sur la page "produits" (trouvé sur ici. marche avec un backend xml). Le site est en 3 langues SVP merci ;)

J'ai failli oublier de donner l'adresse : http://www.lacrossetechnology.fr

mercredi, mars 17 2004

Faille de sécurité dans SPIP

J'ai eu quelques sueurs froides quand j'ai recu l'info : une faille de sécurité dans mon CMS (Content Management System) préféré !!! Heureusement l'upgrade vers une version plus récente est d'une simplicité déconcertante. Ouf, c'est bien foutu. La nouvelle version n'écrase que les fichiers de SPIP et non pas ceux créés par le webdesigner ou les fichiers contenant les informations de configuration propre au site (une idée simple... si on y pense).

Dans mon cas, le souci a plus été que j'avais bidouillé le code de SPIP sur le site du snuasfp-fsu pour répondre au besoin du client concernant notamment la création d'un espace membre. Il a donc fallu que j'upgrade aussi mes modifications ;)

En même pas 1 heure, tout était fini !

Longue vie à SPIP.

vendredi, novembre 28 2003

Nouveau site codé avec les standards

J'ai enfin codé un site entièrement ou presque en Xhtml 1.0 et CSS2 ! Ce ne fut pas une mince affaire et ré-apprendre à faire un site sans utiliser les tables a été vraiment difficle pour moi. J'ai essayé de respecter sur la plupart des pages publiques de ce site tout les fameux standards, y compris ceux de l'accessibilité. Il reste encore pas mal de boulot tout de même pour arriver au top du top. Je dois, par exemple, créer des feuilles de style alternative pour l'impression et les vieilles versions de Netscape (je hais Netscape 4 :( ), réorganiser la disposition des informations quand il n'y a pas de feuille de style... Bref encore des heures à passer pour respecter ces foutus standard qui ont pourtant un intérêt certain et ne cesserons d'en avoir plus dans les années à venir. La portabilité du site sur toute plateforme et tout navigateur est un des argument qui me plait parmis tant d'autres (Plus d'infos sur les standards sur openweb.eu.org).

Le site en question s'appelle Théâtre et Traduction

mercredi, novembre 26 2003

Suite des cours avec Bruno

Les cours avec Bruno se poursuivent dans la bonne humeur habituelle. Voici un petit résumé de la session d'hier soir qui n'a durée "que" jusqu'à minuit... 2 heures du matin pour Bruno qui était motivé ;)

Bruno avec donc réussi à installer SPIP sur sa machine (voir ce blog). Après un tour d'horizon du fonctionnement de SPIP : la gestion des squelettes, le cache, les feuilles de styles... Nous avons procédé à un petit exercice qui ne requiert que quelques minutes : l'installation de DotClear ! Bruno à ensuite commencé la mise en forme de son site et la création des liens hypertextes de DotClear vers les multitudes de pages de son serveur...

Une fois le DotClear installé, il manquait la galerie pour les photos de la famille :)

Nous avons donc commencé l'installation de Gallery (voir ce blog). Et là, le Nobru repris la main sur sa RedHat 7.3 pour compiler les librairies nécessaires au bon fonctionnement de ce script (ça vaudra une explication détaillée de l'installation de ce programme dans les semaines à venir).

Voilà donc ce qu'il y a maintenant sur slam.dyndns.org

  • Une vieille page d'accueil
  • Un SPIP avec squelettes en CSS2 (enfin presque)
  • Un PHPMyadmin (c'est mieux que en mode console)
  • un Eskuel (au moins y a le choix du gestionnaire de BDD)
  • Un DotClear (sans contenu pour le moment)
  • Une galerie de photos (Gallery)
  • Des pages de statistiques avec Webalizer (faudra mettre Awstats)

ça commence à faire du monde ! La suite dans le prochain épisode.