Que faire quand on a un serveur à faire fonctionner avec un modem ADSL, ou câble, qui plante rarement, mais qui plante quand même de temps en temps, surtout, merci Murphy, quand on n'est pas physiquement présent ? Vu qu'il se passe souvent des semaines avant qu'il ne plante, ça serait dommage de le jeter pour ça...
La solution, c'est de se débrouiller pour que le serveur se rende compte de lui même que le modem vient de se vautrer, et de lui donner les moyens d'interrompre momentanément son alimentation, ce qui est plutot facile a faire puisque le serveur a des ports série. On a appelé le montage "MGA", accronime de "Modem Gardien Angel" parce que sur le coup on n'a rien trouvé de mieux ;)
Les tensions d'un port série rs232 d'un PC sont en général de -12V pour un 1, et +12V pour un 0. Ça à été facile de vérifier que l'etat "normal" de la pin de contrôle que l'on va utiliser est un -12V. Voila donc le schema, il a été facile à faire vu la simplicité du montage :
(outch, blanc sur fond noir, ça fait mal aux yeux)
Le montage a été fait sur une plaquette de veroboard, et une diode éléctroluminescente a été rajoutée en serie avec la resistance R2. Si DTR est à un niveau bas, la diode D3 est passante et Q1 (un NPN classique genre 547 ou 237 suffit) est bloqué. Si DTR est a un niveau haut, D3 est bloquée, et Q1 est saturé, ce qui va faire coller le relai et entrainer la coupure de l'alimentation du modem. La diode D1 est une diode de roue libre qui empéche la surtension causée par le relai au bloquage de Q1. Normalement, ça doit être une diode rapide, mais j'ai mis une 4148 toute bête ;) Le relai peut couper qu'un seul des deux fils, mais le contact doit être normalement fermé pour que le montage laisse le modem sous tension dans l'etat "normal", faire attention de ne pas inverser la polarité à ce niveau là, je ne sais pas si ces bêtes sont solides, j'ai pas essayé :)
Le +12V pourra être piqué depuis l'alimentation de la machine qui sert de serveur, même si on a préférés ici mettre une pile de 9V, ça suffisait a faire coller le relais de façon fiable, et le montage ne demande aucun courant sauf pendant 2 secondes tout les 36 du mois. Après realisation, ça donne ça :
(les dernieres phases de test)
Il ne reste plus qu'a intercaler ce truc dans l'alimentation du modem et de le connecter sur le port serie (ttyS0) du serveur, et... C'est là que mon boulot s'arrete ;) En effet, on etait deux : un pour le logiciel, et un pour le hard (moi). Il a quand même été d'accord pour que je publie le programme (mgad), mais en soulignant que c'est une version alpha ;) Il faut fping et gcc. En bref, ça ping le modem toutes les deux secondes, et au second ping raté, le modem est considéré planté et son alimentation est coupée deux secondes. L'ensemble est assez rapide (détection+resynchro) pour que l'on ne change pas d'IP quand ça arrive (en général, on s'en en aperçoit même pas), ce qui est assez génial quand même :)
(Et avec un boitier, c'est mieux)
Ce que l'on peut voir avec ps :
USER %CPU STAT TIME COMMAND root 0.0 0.5 May06 /usr/local/bin/mgad root 0.0 1.6 22:28 \_ sh -c fping -c 1 -t 2000 192.168.2.254 >/dev/null 2>/dev/null root 1.0 0.8 22:28 \_ fping -c 1 -t 2000 192.168.2.254
Extrait de /var/log/mgad.log :
[19:24:25 2005-04-22] Le modem est fonctionnel [22:44:05 2005-05-05] Problème détecté... [22:44:05 2005-05-05] Il s'agit d'un plantage modem [22:44:05 2005-05-05] Reset du modem [22:44:17 2005-05-05] Le modem est fonctionnel