L'appartement

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

lundi, avril 13 2009

Réflexion sur l'externalisation : l'exemple de l'hébergement de vidéo

Quand nous[1] avons décidé le refactoring theatre-contemporain.tv, un débat interne s'est engagé sur l'intérêt de passer ou non par un service tiers (gratuit ou « low cost ») pour héberger les vidéos.

Le site existant depuis 2001 (quand même !) et disposant déjà de plus d'un millier de vidéos, nous avons été démarché par DailyMotion pour héberger nos vidéos chez eux. Entre la simplicité de mise en œuvre de cette solution et l'économie de bande passante réalisée, le choix aurait pu pencher en faveur de l'externalisation chez DM.

La mésaventure du site de vidéos Wat.tv (filiale de TF1) , resté indisponible un bon moment parce que quelqu'un a « oublié » de renouveler le nom de domaine, est cependant assez révélatrice des problèmes que peut poser le modèle du tout hébergé/externalisé[2]

On peut les résumer ainsi :

  • Vous n'avez pas la main sur vos propres contenus
  • Vous devez vous contenter des fonctionnalités offertes par le service tiers. L'aspect "métier" de vos besoins n'est pas pris en compte.
  • Vous ne connaissez pas la pérennité de l'offre du service tiers (Alors que ces derniers jours, on lit ici ou là que Dailymotion et Youtube n'ont pas atteint le seuil de rentabilité, ou que de la pub est de plus en plus insérée dans la vidéo)
  • Vous êtes dépendant des changements d'humeur (et de CGU) du fournisseur que vous avez choisi

Certes, il existe tout de même quelques services qui proposent des contrats d'hébergements de vidéos disposant d'une vrai garantie de service (payants bien entendu), mais là encore, il faut être certain de la pérennité de leurs modèles économiques.

De notre côté, nous avons choisi de faire péter notre bande passante ;) ; Tout est développé/géré/hébergé en interne.

Il persiste un service tiers ; le processus d'encodage des vidéos passe par Heywatch qui propose une API REST très performante et ne fait - finalement - que nous fournir de la puissance de calcul. En fonction du succès, nous envisagerons de gérer le traitement directement sur notre infrastructure.

D'autre part, si Heywatch venait à fermer ou à changer ses conditions, la migration d'un webservice vers un autre resterait assez triviale et ne remettrait pas en cause toute notre conception.

Enfin, le CRIS, qui se positionne comme un "Centre de Ressources" pouvait-il se permettre de faire sous-traiter l'archivage à un service gratuit ou low-cost dont ce n'est pas forcément la vocation ?

Le site a été développé et mis en ligne dans un temps record. Dans 2 semaines, les internautes pourront poster leur vidéos. Finalement pas compliqué de faire un Youtube Like. Prochaine étape, concurrencer Google ;)

Il convient donc de toujours bien peser le pour et le contre d'une externalisation. Même si elle semble souvent plus simple à mettre en oeuvre le gain à postériori n'est pas forcément avantageux !

Notes

[1] L'équipe de CRIS/theatre-contemporain.net

[2] idem d'ailleurs sur Gmail qui a aussi subit quelques soucis

mercredi, avril 8 2009

Quelques conseils pour ne pas voir vos mails finir dans les dossiers Spam

1559606_340_1116081430036-s.jpgSuite à plusieurs questions reçues par mail, voici quelques conseils tirés de mon expérience personnelle pour optimiser vos chances de ne pas voir vos messages finir leur course dans le tant redouté dossier « courrier indésirable » des différents « grands » fournisseurs de services (Yahoo, Gmail, Hotmail et consorts).

  • Avoir un Zonecheck parfait sur son domaine. Ce qui implique notamment - ce point semble important pour Gmail - une adresse postmaster valide et un contact de domaine valide;
  • Signer ses messages sortant avec DKIM et vérifier régulièrement son bon fonctionnement. Cette signature devient réellement essentielle !
  • Configurer correctement SPF (Sender Policy Framework) sur son domaine. Et ne pas oublier les machines qui relaient et autres MX secondaires;
  • Dans la mesure de vos possibilités, demandez à vos correspondant de vous ajouter dans leurs carnets d'adresses et/ou leurs listes blanches. Ceci peux-être particulièrement utile dans le cas d'une lettre d'information. Vous pouvez envisager de glisser dans un de vos mailings une phrase du style « Pour être sur de recevoir nos messages, ajoutez lettre@domain.tld à votre carnet d'adresses »;
  • Pour les newsletters en HTML, n'incluez pas les images dans le message mais linkez sur votre serveur. N'oubliez pas la version alternative pour les webmails qui ne supportent pas HTML;
  • Pour Yahoo et Hotmail, il peux-être intéressant de remplir leurs différents formulaires [1] pour signaler que vos messages sont marqués comme Spam chez eux. La réponse et le résultat ne sont pas garanties. Ils vous préciseront d'ailleurs que ce n'est pas une Whitelist. D'après moi, ça aide quand même;
  • Pour ceux qui ont les moyens et qui aiment se faire racketter, Hotmail utilise également une sorte de whitelist officielle - et bien entendue payante - appelée SenderScore;

Dernière précision, et pas des moindre - ceci est également précisé sur le site de Yahoo - les fournisseurs utilisent également des filtres de réputation. En clair, tant que l'adresse IP de votre serveur n'est pas « connue », le risque de passer à la trappe est plus important.

Pour ce dernier point :

  • oubliez les adresses IP résidentielles
  • louez un serveur sur un réseau « connu »
  • prenez le temps de remplir les formulaires que j'évoquais plus haut

Si vous avez d'autres bonnes pratiques, je suis preneur ;)

Notes

[1] Cherchez sur le site « postmaster » de Yahoo ou sur son équivalent chez Microsoft

jeudi, mars 5 2009

Script pratique : rechercher/remplacer/patcher comme vous voulez

Dans votre vie quotidienne de développeur et/ou d'administrateur système vous êtes sans doute confronté à la nécessité de rechercher et remplacer des motifs par lots.

L'utilisation conjointe d'une multitude d'outils le permettent efficacement sous GNU/Linux : find, grep, sed, awk, perl, diff, patch... Votre éditeur préféré possède sans doute également ce type de fonctionnalité.

Le remplacement doit parfois être assorti d'une vérification visuelle et d'une validation manuelle des différentes occurrences. Si vous changez l'intégralité de vos serveurs de nom dans les fichiers de zone de BIND, vous ne souhaitez sans doute pas qu'un de vos sites à la configuration tordue ne fonctionne plus ?

Partant de ce constat, mon collègue Zas[1] a sympathiquement concocté un script en pure bash habilement nommé search_replace ! C'est un savant mélange de find, sed, awk, diff(color) et patch qui a l'avantage de la simplicité (3 ko tout mouillé).

Comment ça marche ?!

  • On recherche un pattern donné sur un répertoire (exemple, la chaine « ma chaine » sur les fichiers .php du répertoire /var/www)
  • Pour chaque occurrence, un diff - en couleur, si vous avez installé colordiff - et dans le contexte vous permet de visualiser les changements qui seront appliqués
  • A chaque étape, vous choisissez :
    • d'accepter ou pas cette modification et de passer à l'occurrence suivante
    • de modifier manuellement via votre éditeur préféré VIM
    • d'annuler les actions en cours
  • Vous pouvez bien sur choisir de remplacer le tout sans confirmation ni vérification
  • Au final, vous choisissez d'appliquer les modifications ou de garder le patch pour plus tard.
  • Cerise sur le pompon, l'utilisation du patch vous permet de revenir sur les modifications si vous avez tout cassé !

Télécharger search_replace (tar.gz / 3ko)

Notes

[1] Je vous invite à essayer geeqie, co-développé par Zas

mercredi, février 25 2009

Princesse Lego, le film d'animation !

Pour rompre avec l'activité de mon blog proche du vide intersidéral, je vous propose une activité pour occuper vos enfants pendant les week-end pluvieux et froids. La réalisation d'un film d'animation en stop motion avec des Lego.

Voici déjà le rendu final du film réalisé avec mon fiston Hugo

Au cas où vous souhaiteriez tenter l'expérience, je vous détaille la création

Lire la suite...

lundi, janvier 5 2009

Bonne année 2009

Ca, c'est fait ;)

lundi, octobre 20 2008

Script minimaliste : génération des clés DKIM et ajout de l'enregistrement DNS

Un script pour ajouter un domaine dont on veux signer les mails via DKIMproxy. Celui-ci est forcément lié à mon article sur le sujet : "Installer la signature DKIM sur Postfix avec DKIMproxy". Vous pouvez très facilement l'adapter à votre usage.

Que fait ce script :

  • crée la clé publique et la clé privée dans le répertoire keys de DKIMproxy
  • change les droits sur la clé privée
  • sur demande, ajoute l'enregistrement dans le fichier de zone du domaine
  • ajoute les informations qui vont bien dans le fichier sender_map de DKIMproxy

On le lance de la façon suivante

./generate_keys domain.tld

Il faut ensuite incrémenter le numéro de série de la zone, relancer BIND et DKIMproxy.

Le script

#!/bin/bash

# Yves Tannier [grafactory.net] 2008 GPL...

# private/public keys path
PATH_KEYS='/usr/local/dkimproxy/keys'

# sender_map file path
PATH_SENDER_MAP='/usr/local/dkimproxy/sender_map'

# dkimuser
USER_GROUP='dkim:dkim'

# domain on parametre
DOMAIN=$1

# bind file path (optional)
ZONE_PATH="/var/cache/bind/$DOMAIN.hosts"

openssl genrsa -out $PATH_KEYS/$DOMAIN.key 1024
openssl rsa -in $PATH_KEYS/$DOMAIN.key -pubout -out $PATH_KEYS/${DOMAIN}_pub.key

# chg right
chown $USER_GROUP $PATH_KEYS/$DOMAIN.key
chmod 640 $PATH_KEYS/$DOMAIN.key

# Adding DKIM key on BIND Zone ?
echo
echo -n "Add DKIM key on BIND zone file ? ([Y]/n) "
read ans
if [ ! _$ans = _y -o _$ans = _Y ]; then

    # bind file
    echo -n "BIND Zone filename ($ZONE_PATH) : "
    read ${ZONE_PATH_READ}

    if [ ! -z "$ZONE_PATH_READ" ]; then
        ZONE_PATH=${ZONE_PATH_READ}
    fi

    # public key one line
    PUBLIC_KEY=$(cat $PATH_KEYS/${DOMAIN}_pub.key | sed -n '/BEGIN PUBLIC KEY/,/END PUBLIC KEY/p' | sed '/PUBLIC KEY/d' | tr -d '\n')

    # write
    echo
    echo "_domainkey.$DOMAIN.               IN TXT      \"t=y; o=-;\"" >> $ZONE_PATH
    echo "$DOMAIN._domainkey.$DOMAIN.       IN TXT      \"k=rsa; t=s; p=$PUBLIC_KEY\"" >> $ZONE_PATH

fi

SM="$DOMAIN dkim(c=simple,s=$DOMAIN,a=rsa-sha1,key=$PATH_KEYS/$DOMAIN.key), domainkeys(c=nofws,s=$DOMAIN,key=$PATH_KEYS/$DOMAIN.key)"
echo $SM >> $PATH_SENDER_MAP

echo
echo "Please, restart DKIMproxy !"
echo
echo "... And maybe BIND with new serial on $ZONE_PATH !"

Au format compressé : generate_keys.tar.gz

N'hésitez pas à me proposer vos améliorations.

vendredi, avril 11 2008

Script minimaliste : nettoyer une boite aux lettres avec une expression rationnelle

Dans la catégorie des scripts minimalistes (mais néanmoins utiles), je vous propose un petit script qui permet d'effacer, en ligne de commande avec PHP CLI, certains messages d'un compte mail en fonction d'une expression régulière précisée en paramètre et qui matche le sujet du mail.

Par exemple, effacer les centaines de messages de spam qui se trouvent dans une de vos nombreuses boites tant inutiles que nécessaires ;) Autre exemple, j'exécute ce script via un cron pour nettoyer tous ce qui traine dans des boites genre postmaster, abuse (encore que cette dernière n'est pas trop pourrie par le SPAM), et autres bal « no-reply » qu'il reste quand même, pour certaines, nécessaires de consulter tous les ans régulièrement.

C'est un script clairement dédié à de la maintenance. Je vous déconseille de laisser trainer ce code n'importe ou accessible via le web.

Utilisation :

cleanmail -u=nom_utilisateur -p=mot_de_passe -s=imap.mondomain.tld:143 -e="/SPAM/i"

Pour être sur que tous le monde a compris :

  • -u= nom d'utilisateur du compte mail
  • -p= mot de passe du compte mail
  • -s= serveur (pop ou imap). Toutes les options disponibles sur la fonction imap_open de PHP sont disponible
  • -e= expression régulière qui sera « passée » à preg_match

Le script :

#!/usr/bin/php
<?php
// on supprime la limite d'éxecution d'un script php
set_time_limit(0);

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * cleanmail supprimer des mails d'une boite imap avec une pattern définie
 *
 * PHP versions 5
 *
 * LICENSE: Ce programme est un logiciel libre distribue sous licence GNU/GPL
 *
 * @author     Yves Tannier <yvesSANSPAM grafactory.net>
 * @copyright  2008 Yves Tannier
 * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version    0.1.0
 * @link       http://www.grafactory.net
 */


// aide contextuelle
$help_string = "Parametres :
                -u : utilisateur
                -p : mot de passe
                -s : serveur et port (localhost:143, localhost:110, localhost:143/novalidate-cert...)
                -e : expression régulière
                -h, --help : afficher cette aide...\n\n"
;

// recuperer les parametres passe en CLI
foreach($_SERVER['argv'] as $param) {
    // utilisateur
    if(strpos($param,"u=")) {
        $login_imap = str_replace("-u=","",$param);
        continue;
    }
    // mot de passe
    if(strpos($param,"p=")) {
        $passwd_imap = str_replace("-p=","",$param);
        continue;
    }
    // serveur et port
    if(strpos($param,"s=")) {
        $server_imap = str_replace("-s=","",$param);
        continue;
    }
    // expression reguliere
    if(strpos($param,"e=")) {
        $pattern = str_replace('-e=','',$param);
        continue;
    }
    switch($param) {
      case '-h' :
      case '--help' :
        echo $help_string;
        exit();
      case $_SERVER['SCRIPT_NAME'] :
        unset ($_SERVER['argv'][0]);
        break;
      default :
        echo "\nParamètre inconnu : ".$param."\n\n";
        exit();
    }
}

// pas d'argument
if (empty($_SERVER['argv'])) {
    echo "\nVeuillez preciser au moins un paramètre !\n\n";
    echo $help_string;
    exit();
}

// connexion
$mbox = imap_open("{".$server_imap."}INBOX", $login_imap, $passwd_imap)
            or die("Impossible de se connecter : ".imap_last_error());

echo "Connexion...\n";

// recup des headers
$headers = imap_headers($mbox);

// parcourir les messages
if(!empty($headers)) {
    echo "Recherche avec l'expression : ".$pattern."\n";
        $msgnum = 0;
        foreach ($headers as $val) {
            $msgnum = $msgnum + 1;
            $header = imap_headerinfo($mbox, $msgnum);
            $subject = $header->subject;
            if (preg_match($pattern, $subject)) {
                $mailmarked = imap_delete($mbox, $msgnum);
                echo "Message ".$msgnum." supprimé\n";
            }
        }
} else {
    echo "Aucun message dans la boite\n";
}

echo "Fin de la transaction\n";

// quitter et vider en meme temps
imap_close($mbox,CL_EXPUNGE);
?>

Bientôt le même mais en perl ;)

lundi, mars 24 2008

A la découverte de Jelix, l'essayer c'est l'adopter

Logo JelixMalgré tous les avantages que j'ai pu trouver à mon framework mes bouts de codes personnels basés sur plusieurs librairies PEAR, je me suis tourné vers quelques choses de plus "moderne" et plus homogène pour mes nouveaux développements. Après pas mal de recherches et d'essais, mon choix c'est porté sur Jelix.

Ca tombe bien. Un nouveau projet dont les contraintes correspondent parfaitement à l'utilisation de ce framework me permet donc actuellement de me frotter à la bête... Et je ne suis pas déçu !

Je ne vais pas rentrer dans le détail des fonctionnalités mais il y a tous ce qu'on peux rechercher dans un framework PHP5 orienté objet et de classe américaine. Jelix ne pas fait le café comme Symfony (que j'ai essayé également et qui possède de nombreux avantages) et c'est justement pas ce que je lui demande car je souhaite garder la compréhension globale de ce que j'utilise. C'est léger, rapide et extensible. Bref, que du bon pour l'instant ;)

Voici ce que j'en retiens principalement (liste non exhaustive). J'ai précisé, pour mémoire, les équivalents de ce que j'utilisais comme librairies PEAR :

  • ORM puissant. J'utilisais PEAR::MDB2 très efficace aussi. Surtout la gestion transactions
  • système de templates. Beaucoup mieux que PEAR::HTML_Template_Flexy pour lequel la syntaxe dans le template reste assez réduite (exemple : impossible d'utiliser des opérateurs de comparaisons)
  • localisation. PEAR::Translation2 ne m'a jamais réellement séduit.
  • génération de formulaire. Quand on a prit l'habitude d'utiliser PEAR::HTML_Quickform, on recherche forcément quelque chose de similaire.
  • système de cache. Je n'ai pas encore eu la possibilité de comparer avec les performances de PEAR::Cache_Lite mais ça semble équivalent.
  • Quelques modules bien utiles comme la génération de CRUD, le module d'authentification, les acls...

La présentation détaillée et une application de tests sont disponibles sur le site officiel. Il ne vous reste plus qu'à essayer ;)

Si vous aviez l'intention de vous rendre aux Rencontres Mondiales du Logiciel Libre 2008 à Mont-de-Marsan, assistez à la conférence sur Jelix de Laurent Jouanneau et vous en apprendrez encore plus !

mercredi, mars 12 2008

Installer la signature DKIM sur Postfix avec DKIMproxy

Je vous propose dans ce billet l'installation de la signature DKIM sur vos mails sortants. Ceci fait suite à mon billet concernant l'implémentation de DomainKeys avec Postfix et Amavis via Dkfilter.

Dkfilter ne gère en effet que le protocole DomainKeys de Yahoo! maintenant remplacé par DKIM (DomainKeys Identified Mail) , un protocole plus avancé et standardisé par la RFC 4871. Très très brièvement, DKIM permet de « renforcer » l'identité des expéditeurs.

En remplacement de dkfilter, l'auteur de ce programme nous propose DKIMproxy pour gérer la signature DKIM et/ou DomainKeys.

Si vous utilisez Amavis, comme c'est mon cas, sachez quelques petites choses :

  • Il semble que Amavisd-new gère la signature DKIM des mails sortants à partir de la version 2.6.0. Mais sur Debian Etch, nous en sommes à la version 2.4. C'est donc l'intérêt de ce billet. Je n'ai pas testé la version 2.6.0. je ne peux donc pas vous en dire plus.
  • DKIMproxy permet également une vérification des mails entrants. Cette vérification ne nous intéresse pas forcément puisque Amavis propose déjà cette fonctionnalité via Spamassassin qui utilise la librairie perl Mail::DKIM.

Comme pour mon précédent billet, c'est un howto « copié/collé » pour les informaticiens fainéants pressés. J'ai également fais pas mal de copié/collé de l'ancien billet puisque la configuration est sensiblement la même sur de nombreux points.

Lire la suite...

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...

dimanche, février 10 2008

Le déguisement de robot pour carnaval

Le déguisement de robot pour carnavalHistoire de changer un peu, je vous propose un formidable "howto" pour la construction d'un déguisement pour le carnaval de votre enfant (papa geek inside). C'est le déguisement de robot digne d'un film de Ed Wood ("Plan 9 from Outer Space" par exemple). Alors décrochez un peu de votre écran et montrez que vous savez aussi utiliser vos dix doigts pour autre chose qu'un clavier ;)

Lire la suite...

jeudi, janvier 3 2008

Comment remplacer 2007 par 2008 sur Debian Etch

apt-get remove --purge 2007
apt-get install 2008

OK, je sors ! Mais avant je vous souhaite une bonne année 2008 :)

vendredi, novembre 9 2007

Petite mise à jour du script de mass mailing

Mass

C'est une mise à jour mineure. Les fonctionnalités sont les même que celles de la première version

J'ai eu quelques soucis avec la classe Zend_Mail. Lors d'un envoi, suite à une mise à jour de Zend_Mail, je me suis retrouvé avec des groupes de destinataires en copie au lieu d'un envoi unitaire (pas très sérieux !).

J'ai donc utilisé le "bon vieux" PHPMailer. J'en ai aussi profité pour remplacer PEAR::DB par PDO. Ce qui rend le script plus léger et plus simple à installer ;) . Je l'ai également doté d'un fichier de configuration séparé.

Changelog :

  • Utilisation de PHPMailer à la place de Zend_Mail
  • Utilisation de PDO à la place de PEAR::DB
  • Changement esthétique.
  • Un fichier de configuration séparé.

Documentation

Vous devez télécharger PHPMailer, disposer de PHP5 et l'extension PDO.

Pour le reste, la documentation de la première mouture est toujours valable. Vous pouvez également utiliser toutes les options disponibles dans PHPMailer pour adapter ce script à votre convenance (je vous laisse chercher dans le script).

Important : Ce programme est fourni sans aucune garantie même si je l'utilise toutes les semaines pour une newsletter de 30 000 abonnés.

A faire :

  • une option pour préciser le chemin du fichier de configuration
  • en extra, toujours le gros boulot qui consiste à analyser les retours de mail (Delivery Error).

Téléchargement

télécharger le script

dimanche, novembre 4 2007

Installer DomainKeys sur Postfix (Debian Etch, Amavisd-new...)

Mise à jour le 12 mars 2008 : le même billet adapté pour DKIM est disponible : Installer la signature DKIM sur Postfix avec DKIMproxy.

Dans ma lutte incessante pour que mes messages n'aient pas comme destination finale les dossiers "courrier indésirable" des "grands" fournisseurs tels que Yahoo!, Hotmail/MSN, Gmail ect... Je vous propose aujourd'hui l'installation de la signature Domainkeys sur vos mails.

DomainKeys est un protocole de communication créé par Yahoo! (et défini par une RFC 4870). Wikipedia vous donnera un plus d'informations sur le sujet : DomainKeys sur Wikipedia

Même s'il fonctionne totalement et est déployé sur de nombreux serveurs, sachez qu'il est maintenant remplacé par une RFC plus "globale" : DKIM (Domain Keys Identified Mail). J'aborderais les différences et l'implémentation de DKIM dans un autre post.

D'autres liens :

DomainKeys bien reconnu chez Yahoo! (forcément ;)) DomainKeys

Voici la configuration du serveur de messagerie sur lequel se base ce tutoriel :

Nous allons mettre en place la configuration suivante :

postfix -> dkfilter -> postfix -> amavis -> postfix

Dkfilter est un proxy de signature et de vérification des signatures pour DomainKeys.

Ceci peut paraitre un peu lourd en regardant le schéma, mais postfix gère ce type de configuration très bien via les content filter

Comme je suis gentil et que l'informaticien est souvent fainéant, j'ai écris ce howto avec plein de copier/coller ;)

Lire la suite...

mercredi, octobre 31 2007

Connaitre les adresses IP des visiteurs derrière un reverse proxy

Ce qui est pénible quand on héberge un serveur web derrière un reverse proxy, c'est qu'on n'obtient pas, par défaut, les adresses IP réelles des visiteurs mais uniquement l'adresse IP du reverse proxy.

Un logiciel de statistiques qui utilise les logs du serveur web, Awstats par exemple, vous indiquera donc que vous n'avez qu'un seul et unique visiteur (snif !).

Il existe heureusement une solution simple qui se trouve dans la variable d'environnement X-Forwarded-For.

Sur un serveur Apache (sur lighttp, ca sera sensiblement pareil), il faut donc changer la ligne :

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

En :

LogFormat "%{X-Forwarded-For}i - %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Et voilà des jolies statistiques pleines de visiteurs ;)

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 ;)

lundi, septembre 3 2007

Liens symboliques avec Pure-ftpd sur Debian Etch

Une chose manquait cruellement dans le binaire de pure-ftpd sur Debian Sarge : la gestion des liens symboliques. Il fallait passer par des "mount --bind ..." pour arriver à ses fins (cf. la documentation sur le sujet).

Fort heureusement, sur Debian Etch c'est résolu... Encore faut-il le trouver ! Il y a deux binaires pure-ftpd-mysql et pureftp-mysql-virtualchroot (dans mon cas, vous l'aurez deviné, j'utilise le support Mysql).

Pour activer le "virtualchroot", éditez le fichier /ect/default/pure-ftpd-common et ajoutez la ligne

VIRTUALCHROOT=true

Relancez le tout avec /etc/init.d/pure-ftpd-mysql restart

Supprimez vos mount --bind ;)

jeudi, août 23 2007

Si tu respectes pas les RFCs t'es niqué

Une mésaventure m'est arrivée aujourd'hui. Un client me signale que les mails que je lui envois sur sa boîte Gmail n'arrive pas.

Après vérification, ils arrivent en fait directement dans le dossier Spam de son compte Gmail ! Moi un spammeur ! Le comble de l'horreur ;) Pourtant, j'ai blindé le serveur de messagerie avec et le domaine avec SPF et tout le toutim pour éviter ça.

D'ailleurs, Gmail le confirme dans les entêtes :

Received-SPF: pass (google.com: domain of yves@monsuperdomaine.net designates 194.xxx.xxx.xxx as permitted sender) client-ip=194.xxx.xxx.xxx;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of yves@monsuperdomaine.net designates 194.xxx.xxx.xxx as permitted sender) smtp.mail=yves@monsuperdomaine.net

Mais ca ne suffit pas. Mes mails passent directement dans le courrier indésirable de Gmail dès qu'il y a un lien hypertexte dans le message (j'ai justement le lien vers grafactory.net dans ma signature...).

Donc, un mail avec le corps du message suivant arrive dans la boîte de réception :

Salut c'est Yves

Le même avec ma signature va directement dans le dossier Spam :

Salut c'est Yves

--
http://www.grafactory.net

Je vérifie les entête chez Gmail, j'effectue moult essais pour toujours revenir à cette conclusion : un lien hypertexte dans mo message et il est considéré comme Spam.

Mais pourquoi donc l'antispam google ne veut pas de certains de mes messages ? Je suppose que je dois atteindre une note assez élevé dès que j'ajoute un lien dans mon message pour me retrouvé dans les indésirables...

Après fait quelques dizaines d'essais de configuration différentes, quelques incantations et brulé quelques cierges, je me décide à vérifier la configuration de mon domaine et du serveur de messagerie.

Tiens tiens ! DNSReport, me renvoit une erreur "Fatal" : je n'ai pas déclaré d'adresse postmaster sur le domaine grafactory.net.

Je décide de créer le compte postmaster "à tout hasard"... Et c'était bien ça !!! Me voilà de retour dans la boîte de réception de Gmail :)

Moralité, les RFCs, c'est pas pour les chiens ! Particulièrement pour le mail la RFC 1123 et la RFC 2142

mardi, juillet 17 2007

Passage sur Dotclear 2 Beta7

Apparement, il y avait une grosse faille de sécurité chez Dotclear. J'ai donc mis à jour. Pour mon blog, pas de problème. Pour la plateforme multiblogs que je gère, ca a été plus compliqué.

Le moteur utilisé par Dotclear 2 avec Mysql maintenant InnoDB. C'est bien. Il y a des belles contraintes d'intégrité partout ;)

Va savoir pourquoi, l'intégrité n'était plus de mise sur la base multiblogs, il y avait des enregistrements orphelins qui ne faisaient plus référence. J'ai du donc nettoyer un peu :

DELETE FROM `dc_post` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_category` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_link` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_permissions` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_setting` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_spamrule` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_media` WHERE user_id NOT IN (SELECT user_id FROM dc_user);
DELETE FROM `dc_comment` WHERE post_id NOT IN (SELECT post_id FROM dc_post);
DELETE FROM `dc_media` WHERE user_id NOT IN (SELECT user_id FROM dc_user);
DELETE FROM `dc_post_media` WHERE media_id NOT IN (SELECT media_id FROM dc_media);
DELETE FROM `dc_post_media` WHERE post_id NOT IN (SELECT post_id FROM dc_post);

Ca pourrait-être intégré dans le code de Dotclear avant une mise à jour ?!

dimanche, juillet 15 2007

PhpMyAdmin, Vista inside ?

Phpmyadmin Erreur

Une erreur windowsienne :)

- page 1 de 8