Le HOWTO des onduleurs (UPS)
 Harvey  J.  Stein, [email protected], Berger Financial
 Research, Ltd.  adaptation francaise B.Choppy, 10 mai 1998
 v2.42, 18 novembre 1997

 Ce document vous aidera  a  connecter  un  onduleur  sur  une  machine
 Linux...   si  vous  avez  de la chance ...  Copyright (c) 1994, 1995,
 1996, 1997 Harvey J. Stein.  Vous pouvez utiliser  ce  document  comme
 vous  l'entendez, tant qu'il reste intact.  En particulier, cette note
 (ainsi que les contributions ci-dessous) doit rester intouchee.  NdT :
 La  traduction  de ce HOWTO est particulierement delicate, en ce qu'il
 integre de  nombreux  messages  echanges  sur  InterNet  reproduits  a
 l'identique.  Autant que possible, on aura conserve le sens general de
 ces  messages,  sans  toutefois  les  reproduire  systematiquement  en
 entier, leur lecture en devenant vite fastidieuse.  Dans certains cas,
 une partie en anglais est conservee, en particulier dans les  en-tetes
 de  messages.   Les  noms  de  signaux et broches de connexion ont ete
 traduits, mais leur  abreviation  originelle  conserve  (par  exemple,
 DCD  :  Detection  de  porteuse).  Une copie de la notice originale de
 copyright est conservee, y compris dans les  sources  des  programmes.
 Le  traducteur  attire  l'attention  de  ses  lecteurs  sur  le risque
 d'erreur introduite lors de la traduction des commentaires et messages
 dans  les programmes source, pouvant rendre ceux-ci impossibles a com-
 piler ou inutilisables.  La reference en ce cas est,  comme  toujours,
 la  version originelle du document (en anglais).  Version originale de
 la notice de copyright : You may use this document as you see fit,  as
 long as it remains intact.  In particular, this notice (along with the
 contributions below) must remain untouched.

 11..  IInnttrroodduuccttiioonn

 Ce HOWTO concerne la connexion d'un onduleur sur  un  PC  sous  Linux.
 L'idee  est  d'etablir  la  connexion  de telle sorte que Linux puisse
 s'arreter proprement lorsque le courant s'arrete.

 Cela  inclut  la  reference  a  des  paquetages  logiciels   existants
 facilitant  l'etablissement  de  ce  genre  de  communications,  et la
 maniere dont celles-ci sont realisees.  Ce dernier point  est  souvent
 superfetatoire si vous pouvez trouver un paquetage tout configure pour
 votre onduleur.  Sinon, il vous faudra lire ce qui suit.

 Dans une large mesure, le present document est encore  plus  redondant
 que  lorsque  j'en  ai  ecrit la premiere version en 1994.  Toutes les
 informations de base ont toujours ete presentes dans les pages de  man
 de  _p_o_w_e_r_d  fournies  avec le paquetage _S_y_s_V_i_n_i_t.  Alors qu'en 1994 il
 arrivait souvent que les distributions ne comportent meme pas lesdites
 pages de man, je ne crois pas que ce soit encore le cas.

 De  plus,  lorsque  j'ai  ecrit  la  premiere  version de ce Howto, il
 n'existait aucun autre logiciel que _p_o_w_e_r_d pour la communication et le
 controle  entre  Linux  et  les  onduleurs.   Maintenant, il existe un
 certain  nombre  de  paquetages  de  controle  d'onduleurs   dans   le
 repertoire UPS de Sunsite.

 Malgre tout, je continue a maintenir le Howto des onduleurs.  Pourquoi
 donc ?  Eh bien :

 +o  une seconde source d'informations peut aider a la comprehension  de
    la  methode  de  connexion de Linux a un onduleur, meme s'il s'agit
    simplement de la meme information, ecrite differemment ;

 +o  le HOWTO peut servir de repository pour les donnees specifiques des
    onduleurs  - de nombreux onduleurs ne sont pas encore geres par les
    paquetages generaux ;
 +o  le HOWTO contient des details supplementaires qui  ne  se  trouvent
    pas dans d'autres documents ;

 +o  ce document semble avoir maintenant sa vie propre.  La necessite de
    creation d'un Howto  se  fait  sentir  clairement.   Il  est  moins
    evident de definir l'instant ou il doive etre mis en sommeil.

 11..11..  CCoonnttrriibbuutteeuurrss

 Je  suis  debiteur  a  vie  de  ceux  dont  j'ai  recu  de l'aide, des
 suggestions, ainsi que des donnees specifiques d'onduleurs.  La  liste
 inclut :

 +o  Hennus Bergman ([email protected]) ;

 +o  Charli ([email protected]) ;

 +o  Ciro Cattuto (Ciro Cattuto) ;

 +o  Nick Christenson ([email protected]) ;

 +o  Lam Dang ([email protected]) ;

 +o  Markus Eiden ([email protected]) ;

 +o  Dan Fandrich ([email protected]) ;

 +o  Ben Galliart ([email protected]) ;

 +o  Danny ter Haar ([email protected]) ;

 +o  Christian G. Holtje ([email protected]) ;

 +o  Raymond A. Ingles ([email protected]) ;

 +o  Peter Kammer ([email protected]) ;

 +o  Marek Michalkiewicz ([email protected]) ;

 +o  Jim Ockers ([email protected]) ;

 +o  Evgeny Stambulchik ([email protected]) ;

 +o  Clive A. Stubbings ([email protected]) ;

 +o  Miquel van Smoorenburg ([email protected]) ;

 +o  Slavik Terletsky ([email protected]) ;

 +o  Tom Webster ([email protected]).

 Notez  que  les  adresses  e-mail  apparaissant  dans  les extraits de
 courriers ci-apres peuvent  etre  obsoletes.   Ce  qui  precede  l'est
 propablement  aussi,  mais quelques-unes sont plus recentes que ce qui
 se trouve plus bas.

 Mes excuses aussi a quiconque j'aie oublie de citer dans cette  liste.
 Envoyez-moi un e-mail et je vous ajouterai.

 11..22..  AAvveerrttiisssseemmeenntt iimmppoorrttaanntt

 Je  ne  peux  reellement  pas  garantir  que  quelque  partie  de ceci
 fonctionne pour vous.  Connecter un onduleur a un ordinateur peut etre
 un  travail  d'astuce.   L'un  ou l'autre, ou les deux peuvent bruler,
 exploser, mettre le feu, ou commencer la  Troisieme  Guerre  Mondiale.
 De  plus,  je  n'ai  une  experience  directe que de l'onduleur Advice
 1200 A, et je n'ai pas eu a fabriquer de cable.  Donc, _S_O_Y_E_Z  _P_R_U_D_E_N_T_,
 _R_A_S_S_E_M_B_L_E_Z   _T_O_U_T_E   _L_'_I_N_F_O_R_M_A_T_I_O_N   _P_O_S_S_I_B_L_E   _S_U_R   _V_O_T_R_E  _O_N_D_U_L_E_U_R_.
 _R_E_F_L_E_C_H_I_S_S_E_Z _D_'_A_B_O_R_D_.  _N_E _C_R_O_Y_E_Z _P_A_S _A _P_R_I_O_R_I _C_E _Q_U_E _V_O_U_S _L_I_S_E_Z _I_C_I _N_I
 _A_I_L_L_E_U_R_S.

 D'un  autre  cote,  j'ai  reussi  a  tout  faire  fonctionner avec mes
 onduleurs, sans beaucoup d'informations  des  constructeurs,  et  sans
 faire fumer quoi que ce soit, donc c'est possible.

 11..33..  AAuuttrreess ddooccuummeennttss

 Ce  document ne traite pas des fonctions et possibilites generales des
 onduleurs.  Pour ce genre d'informations, voyez la Foire Aux Questions
 La     FAQ    UPS.     Elle    peut    aussi    etre    trouvee    sur
 ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/answers/UPS-faq.  Elle
 est maintenue par Nick Christenson, mais semble n'avoir pas ete mise a
 jour depuis 1995.  Si vous lui  envoyez  un  e-mail,  il  souhaiterait
 qu'apparaisse  _U_P_S  ou  _U_P_S  _F_A_Q ou quelque chose de similaire dans la
 ligne Subject de votre message.

 Il y a aussi de plus en plus de constructeurs d'onduleurs present  sur
 le  Net.  Certains d'entre aux fournissent reellement des informations
 utiles sur leur site Web.   Une  liste  pratique  des  sites  web  des
 constructeurs  est  disponible  sur Repertoire des onduleurs.  Le meme
 site propose aussi une FAQ des onduleurs.

 22..  NNoottee iimmppoorrttaannttee ccoonncceerrnnaanntt ll''oobbssoolleesscceennccee ddeess iinnffoorrmmaattiioonnss

 Je viens de decouvrir qu'une partie de la documentation ci-dessous est
 obsolete.   En  particulier,  le  daemon  _i_n_i_t  fourni avec le dernier
 paquetage sysinit est plus sophistique que ce que j'ai  decrit.   Bien
 qu'il  semble que la compatibilite ascendante soit assuree pour ce qui
 est ecrit ici, il apparait que  certaines  fonctions  non  documentees
 sont ttrreess iimmppoorrttaanntteess pour la gestion des onduleurs.

 Le  mecanisme  de  controle indique ci-apres permet seulement a _p_o_w_e_r_d
 d'envoyer a _i_n_i_t un des messages _p_o_w_e_r_f_a_i_l ou _p_o_w_e_r_o_k.   _i_n_i_t  execute
 une  commande lorsqu'il recoit _p_o_w_e_r_f_a_i_l et une autre lorsqu'il recoit
 _p_o_w_e_r_o_k.  Cela complexifie la logique de _p_o_w_e_r_d pour  la  gestion  des
 signaux de batterie faible et autres sortes de situations speciales.

 Les  nouvelles  versions  d'_i_n_i_t (depuis la version 2.58, apparemment)
 sont plus sophistiquees.  Il est possible de leur demander  d'executer
 un  script  parmi  _t_r_o_i_s.   Ainsi, _i_n_i_t peut avoir un script _p_o_w_e_r_f_a_i_l
 pour traiter une coupure  de  courant,  un  script  _p_o_w_e_r_f_a_i_l_n_o_w  pour
 realiser  un  arret  immediat  et  un script _p_o_w_e_r_o_k pour bloquer tout
 arret en cours.  C'est nettement plus propre que  les  circonvolutions
 necessaires avec le mecanisme detaille plus bas.

 Bien  qu'une  grande  partie  du  document  soit fondee sur l'ancienne
 methode de communication avec _i_n_i_t, je viens d'ajouter deux  nouvelles
 sections  dans  lesquelles  les auteurs utilisent la nouvelle methode.
 Il s'agit de ``Trust Energy Protector 400/600'' et APC Smart-UPS  700.
 La  premiere  est  particulierement detaillee.  Les deux comportent un
 _p_o_w_e_r_d_._c qui demande a _i_n_i_t un shutdown immediat lorsqu'un  signal  de
 batterie  faible  est  recu,  ainsi  que les lignes correspondantes de
 _/_e_t_c_/_i_n_i_t_t_a_b.  Pour tout le reste, je peux juste vous dire de regarder
 dans le code source de _i_n_i_t.

 Aussi,  pour  autant  que  je  sache, de nombreux paquetages cites ci-
 dessous utilisent aussi la nouvelle methode de communication.

 (-- NdT : Il semble que  la  plupart  des  contributeurs  a  ce  Howto
 s'appuient sur le redemarrage de l'ordinateur (/sbin/reboot), couple a
 une temporisation, pour realiser l'extinction  de  l'onduleur.   Cette
 methode  semble  hasardeuse.   Le  traducteur  propose  humblement  au
 lecteur d'etudier la possibilite  de  remplacer  la  relance  complete
 (reboot)  par  un  arret  systeme propre (shutdown -h) ou moins propre
 (halt).  Cette  methode  permet  d'eviter  totalement  le  risque  que
 l'onduleur  s'arrete  "trop  tard"  dans  le processus de demarrage de
 l'ordinateur  (i.e.   lorsque  les  systemes  de  fichiers  sont  deja
 montes).--)

 33..  OOnndduulleeuurr bbeettee,, oonndduulleeuurr iinntteelllliiggeenntt

 Les onduleurs peuvent se classer dans deux categories : "intelligents"
 ou "betes".  La difference entre les  deux  reside  dans  la  quantite
 d'informations  que  l'on peut obtenir de et le niveau de controle que
 l'on peut exercer sur l'onduleur.

    OOnndduulleeuurr ""bbeettee""

    +o  se connecte a l'ordinateur par le port serie ;

    +o  utilise les lignes  de  controle  modem  pour  communiquer  avec
       celui-ci ;

    +o  peut indiquer si le courant est present ou non ;

    +o  peut typiquement indiquer si la batterie est faible ;

    +o  accepte   habituellement   un   ordre  d'arret  de  la  part  de
       l'ordinateur.

    OOnndduulleeuurr ""iinntteelllliiggeenntt""

    +o  se connecte a l'ordinateur par le port serie ;

    +o  communique avec celui-ci par transfert de donnees normal sur  le
       port serie ;

    +o  dispose  typiquement  d'une  sorte  de  langage de commandes que
       l'ordinateur peut utiliser pour obtenir  diverses  informations,
       positionner  certains  parametres de fonctionnement et controler
       l'onduleur (pour arreter celui-ci, par exemple).

 Habituellement, les onduleurs intelligents peuvent fonctionner en mode
 bete.   C'est utile, car pour autant que je sache, les entreprises qui
 construisent les onduleurs les  plus  populaires  (notamment  APC)  ne
 diffusent  leur  protocole  de  communication  qu'aux  entreprises qui
 signent un accord de confidentialite.

 Autant que je sache, les seuls onduleurs intelligents avec lesquels il
 soit  simple  de  communiquer sont ceux faits par Best.  De plus, Best
 documente completement le mode intelligent (ainsi que le mode bete) et
 fournit le source de programmes qui communiquent avec leurs onduleurs.
 Tous  les  paquetages   indiques   dans   la   section   ``Logiciels''
 communiqueront avec les onduleurs en mode bete.  C'est tout ce dont on
 a reellement besoin.  Ceux specifiques  des  onduleurs  APC  annoncent
 diverses  possibilites  d'utilisation  en mode intelligent, mais je ne
 sais pas exactement ce qu'ils permettent.  Une implementation complete
 vous  affichera  une  fenetre  avec  toutes sortes de jauges affichant
 diverses statistiques de l'onduleur, telles  que  charge,  temperature
 interieure,  historique  des coupures, voltages d'entree et de sortie,
 etc.   Il  semble  que  le  paquetage  _s_m_u_p_s_d_-_0_._9_-_1_._i_3_8_6_._r_p_m  (section
 ``Logiciels''  se  rapproche  de  cela.   Je  ne suis pas sur pour les
 autres.

 Le reste de ce document est essentiellement limite a la  configuration
 de  votre  systeme  avec  un onduleur bete.  L'idee generale est a peu
 pres la meme  avec  un  onduleur  intelligent,  mais  les  details  de
 fonctionnement  de  _p_o_w_e_r_d et le type de cable sont differents pour un
 onduleur intelligent.

 44..  LLooggiicciieellss

 Fondamentalement, tout ce qu'il vous faut est  un  executable  _p_o_w_e_r_d,
 habituellement place dans _/_s_b_i_n_/_p_o_w_e_r_d.  Il fait habituellement partie
 du  paquetage  _S_y_s_V_i_n_i_t.   Pour  autant  que  je  sache,  toutes   les
 distributions  actuelles  de  Linux contiennent une version recente de
 _S_y_s_V_i_n_i_t.  Les versions tres anciennes ne comportaient pas _p_o_w_e_r_d.

 Le seul probleme que vous puissiez rencontrer est que votre  cable  ne
 corresponde  pas a la configuration de _p_o_w_e_r_d, auquel cas vous devrez,
 soit rebrocher votre cable, soit trouver une copie de _p_o_w_e_r_d_._c  et  le
 modifier  pour  le faire fonctionner avec votre cable.  Ou, pour cela,
 vous pouvez toujours utiliser l'un des paquetages  suivants,  dont  de
 nombreux permettent la configuration du cable.

 Comme  indique,  une  alternative  au _p_o_w_e_r_d du paquetage _S_y_s_V_i_n_i_t est
 l'utilisation de  l'un  des  paquetages  disponibles  maintenant.   il
 existe de nombreux paquetages qui aident a configurer la communication
 entre  l'ordinateur  et  un  onduleur.   Aucun  d'entre  eux   n'etait
 disponible  lorsque  j'ai  ecrit ce Howto pour la premiere fois, c'est
 pourquoi j'ai eu a l'ecrire.  En fait, il y a de  bonnes  chances  que
 vous  puissiez  utiliser  l'un  de  ces paquetages logiciels et eviter
 totalement le present Howto !

 Au 15 mars 1997 a peu pres, le repertoire  UPS  de  Sunsite  disposait
 d'un  certain  nombre  de  paquetages.   D'autres sites semblent avoir
 aussi des paquetages de  controle  d'onduleurs.   Voici  ce  que  j'ai
 trouve (tous sur Sunsite sauf deux) :

    EEnnhhaanncceedd AAPPCC BBaacckkUUPPSS..ttaarr..ggzz
       Un  paquetage  de controle des onduleurs intelligents APC Smart-
       UPS.  Il semble  suivre  basiquement  le  BUPS-Howto  (Back-UPS-
       Howto,  inclus ci-apres), mais semble aussi disposer d'une sorte
       de signal de batterie faible.

    EEnnhhaanncceedd AAPPCC UUPPSSDD--vv11..44..ttaarr..ggzz
       Le fichier _._l_s_m dit  qu'il  s'agit  du  meme  paquetage  que  le
       precedent,   sous  forme  de  _._t_a_r_._g_z  dans  un  _._t_a_r_._g_z  !   La
       documentation est legere.  Il semble  gerer  les  onduleurs  APC
       dans  les  deux  modes bete et intelligent, mais je ne peux m'en
       assurer.

    EEnnhhaanncceedd AAPPCC UUPPSSDD--vv11..44..ttaarr..ggzz
       Un autre paquetage de  controle  des  onduleurs  APC  Smart-UPS.
       Semble  inclure  une  sorte  de support maitre/esclave (i.e. une
       machine en previent une autre de s'arreter  lorsque  le  courant
       est  coupe).  Semble utiliser les onduleurs en mode intelligent,
       par opposition a la bascule des lignes modem.

    ssmmuuppssdd--00..99--11..ii338866..rrppmm

    ssmmuuppssdd--00..99--11..ssrrcc..rrppmm
       L'auteur ( David E. Myers) ecrit :

       smupsd surveille un APC Smart-UPS[TM] sous  Red  Hat[TM]  Linux.
       Si   le  courant  est  coupe,  smupsd  arretera  le  systeme  et
       l'onduleur de maniere correcte.

       smupsd a les fonctionnalites suivantes :

    +o  arret du systeme et de  l'onduleur  en  fonction  de  la  charge
       residuelle de ce dernier ou du temps ecoule depuis la coupure de
       courant ;

    +o  surveillance des parametres de l'onduleur en temps  reel  depuis
       toute  machine  a l'aide du programme graphique upsmon, ecrit en
       JavaTM ;

    +o  trace des parametres de l'onduleur dans un fichier pour  analyse
       et edition ;

    +o  mode  maitre/esclave  permettant  a  des  systemes  additionnels
       partageant le meme onduleur de lire les parametres  de  celui-ci
       sur la machine qui lui est connectee par port serie ;

    +o  controle  des acces reseau a l'aide du fichier _/_e_t_c_/_h_o_s_t_s_._a_l_l_o_w.

    ggeennppoowweerr--11..00..11..ttggzz
       Un  paquetage  general  de  gestion  d'onduleurs.   Inclut   des
       configurations  pour  beaucoup d'onduleurs - deux pour TrippLite
       et trois pour APC.  Contient une bonne  documentation.   Un  bon
       achat.

    ppoowweerrdd--22..00..ttaarr..ggzz
       Un  _p_o_w_e_r_d  de  remplacement  de celui du paquetage _S_y_s_V_i_n_i_t.  A
       l'oppose des commentaires de la documentation, il ne semble  pas
       avoir  ete fusionne avec ce dernier (du moins jusqu'a la version
       2.62).  Ses avantages resident dans le fait  qu'il  puisse  agir
       comme   serveur  pour  d'autres  _p_o_w_e_r_d  tournant  sur  d'autres
       machines (lorsque plusieurs machines d'un  reseau  partagent  le
       meme  onduleur) et etre configure par le biais d'un fichier - le
       source ne necessite donc ni edition ni recompilation.

    uuppssdd--11..00..ttggzz
       Un autre _p_o_w_e_r_d de remplacement.  Semble etre  assez  comparable
       en fonctionnalites avec powerd-2.0.tar.gz.

    cchheecckkuuppss..ttaarr
       Ce  paquetage  est  destine  a controler les onduleurs Best.  Il
       provient directement du site Web de Best.  Comporte des binaires
       pour  de  nombreux  _u_n_i_x  mais,  plus  important, inclut le code
       source, il est donc possible de l'essayer sous Linux, et s'il ne
       fonctionne  pas,  de  tenter  de  le corriger.  Le source inclut
       aussi bien les "controles de  base  (basic  checkups)"  que  les
       "controles  avances  (advanced  checkups)"  qui sont un peu plus
       sophistiques - ils declenchent un  shutdown  lorsque  l'onduleur
       indique  une  duree d'alimentation restante de X minutes, plutot
       qu'au bout de  Y  minutes  apres  la  coupure  de  courant.   Le
       programme  de  controles  avances  declenche  aussi sur diverses
       alarmes telles  que  "temperature  ambiante  elevee",  "batterie
       proche  du  minimum", "tension de sortie faible" ou "alarme test
       declenchee par l'utilisateur".

    bbeessttuuppss--00..99..ttaarr..ggzz
       Un paquetage qui peut bien se trouver sur Sunsite a l'instant ou
       vous  lisez  ceci.   C'est une paire de modules de communication
       qui travaillent  avec  les  onduleurs  Best  Ferrups.   Il  gere
       l'onduleur  en  mode  intelligent.   Il inter-opere correctement
       avec _p_o_w_e_r_d_-_2_._0 - utile si vous avez un gros Ferrups pour toutes
       les machines d'un reseau.

       Note  :  ce  paquetage  doit encore etre charge vers Sunsite. Je
       continue a presser l'auteur de le finir et de le  charger,  mais
       il doit encore en trouver le temps.

    LLaannSSaaffee IIIIII
       Deltec  Electronics  (et  Exide)  vendent  un paquetage logiciel
       appele LanSafe III.  Il existe une version Linux.  Il est fourni
       avec  leurs  onduleurs.   Ils disent qu'il fonctionne aussi avec
       d'autres onduleurs (en mode bete).

    aappccuuppssdd--22..88..ttaarr..ggzz
       L'auteur (Andre Hedrick) ecrit :

       apcupsd-2.1.tar.gz remplace Enhanced_APC_UPSD.tar.gz.

       C'est un paquetage tres complet pour les onduleurs APC.  Il gere
       toute leur gamme.  J'ai maintenant ajoute un mode intelligent au
       paquetage et un support pour les cables APC ou maison  si  aucun
       cable APC n'est gere.

    ssmmaarrttuuppss--11..11..ttggzz
       Du fichier _._l_s_m :

       Un  powerd  et  un utilitaire graphique sous X11 qui vous montre
       les voltages, frequences, pourcentages de charge  et  niveau  de
       batterie   en   temps   reel.    Les  protocoles  "Safeware"  et
       "Tripplite" sont geres.  Source et binaires ELF.

    uuppss..ttaarr..ggzz
       Du fichier _._l_s_m :

       Programme  qui  interagit   avec   les   sauvegardes   batteries
       (onduleurs Powerbox).

    uussvvdd--22..00..00..ttggzz
       Du fichier _._l_s_m :

       uvsd  est un daemon qui surveille l'etat d'un onduleur et reagit
       aux changements d'etats (coupure de courant, retour du  courant,
       batterie  faible).   Vous  pouvez ecrire vos propres scripts qui
       sont appeles dans ces cas.  Il ne necessite _p_a_s SysVinit.
 Notez que j'ai seulement jete un coup d'oeil aux  paquetages.   Je  ne
 les    ai    pas    utilises.     Nous   etions   proches   d'utiliser
 bestups-0.9.tar.gz et powerd-2.0.tar.gz mais nous  ne  l'avons  jamais
 fait.

 55..  FFaaiitteess--llee vvoouuss--mmeemmee

 Ce  chapitre  est  specifiquement  destine  au  controle des onduleurs
 betes.  Neammoins, une grande partie  du  processus  est  a  peu  pres
 identique  pour  les onduleurs intelligents.  La principale difference
 reside  dans  la  maniere  dont  le  daemon  (typiquement  _p_o_w_e_r_d)  de
 surveilance communique avec l'onduleur.

 Avant de faire quoi que ce soit, je suggere l'algorithme suivant :

 +o  parcourir ce document ;

 +o  telecharger  et  etudier  tous  les paquetages qui semblent adaptes
    specifiquement a son onduleur ;

 +o  telecharger et etudier les paquetages plus generiques.   Notes  que
    certains  d'entre eux sont en fait plus puissants, mieux documentes
    et plus faciles d'emploi que leurs equivalents specifiques ;

 +o  si les choses ne se passent pas bien ou si certains points  restent
    obscurs, lire le present document avec attention et bidouiller avec
    ardeur et precaution...

 55..11..  QQuuee ffaauutt--iill ffaaiirree ((ssoommmmaaiirreemmeenntt)) ??

 +o  brancher l'ordinateur sur l'onduleur ;

 +o  connecter le port serie de l'ordinateur a l'onduleur avec un  cable
    special ;

 +o  lancer _p_o_w_e_r_d (ou un de ses equivalents) sur l'ordinateur ;

 +o  configurer  _i_n_i_t pour realiser quelque chose de raisonnable sur les
    evenements _p_o_w_e_r_f_a_i_l et _p_o_w_e_r_o_k (comme lancer un _s_h_u_t_d_o_w_n  et  tuer
    tout _s_h_u_t_d_o_w_n en cours respectivement, par exemple).

 55..22..  CCoommmmeenntt eesstt--ccee ssuuppppoossee ffoonnccttiioonnnneerr ??

    TTrraavvaaiill ddee ll''oonndduulleeuurr
       Lorsque  le courant s'arrete, l'onduleur continue d'alimenter le
       PC et signale l'arret du courant par bascule d'un relais ou d'un
       optocoupleur sur son port de controle.

    TTrraavvaaiill dduu ccaabbllee
       Le  cable  est  concu  de  telle  maniere que lorsque l'onduleur
       bascule  ledit  relais,  cela  monte  un  signal   de   controle
       particulier  de  la  ligne  serie (typiquement _D_C_D, detection de
       porteuse)

    TTrraavvaaiill ddee ppoowweerrdd
       Le  daemon  _p_o_w_e_r_d  controle  le  port  serie.    Il   maintient
       leves/baisses  les  signaux  de  controle  du  port  serie  dont
       l'onduleur a besoin (typiquement _D_T_R, Terminal de Donnees  Pret,
       doit  rester  leve,  et touts les signaux qui coupent l'onduleur
       doivent etre maintenus baisses).  Lorsque _p_o_w_e_r_d voit le  signal
       de   controle   de   l'onduleur   monter,  il  ecrit  FAIL  dans
       /etc/powerstatus et envoie un signal SIGPWR au process _i_n_i_t (les
       anciennes   versions   de   _p_o_w_e_r_d   et   _i_n_i_t   ecrivent   dans
       /etc/powerfail).  Lorsque le signal de  controle  redescend,  il
       ecrit  OK  dans  /etc/powerstatus  et  envoie un signal SIGPWR a
       _i_n_i_t.

    TTrraavvaaiill ddee iinniitt ((eenn pplluuss ddee ttoouutt ccee qquu''iill ffaaiitt ppaarr aaiilllleeuurrss))
       Lorsqu'il   recoit   un   signal   SIGPWR,   il   regarde   dans
       /etc/powerstatus.    Si   celui-ci  contient  FAIL,  il  execute
       l'entree powerfail du fichier /etc/inittab.  S'il  contient  OK,
       il execute l'entree powerokwait de inittab.

 55..33..  CCoommmmeenntt ccoonnffiigguurreerr ttoouutt ccaa ??

 Ce  qui  suit  presuppose  que vous disposez d'un cable qui fonctionne
 correctement avec _p_o_w_e_r_d.   Si  vous  n'en  etes  pas  sur,  voyez  la
 section : ``Analyse de cables et modification de powerd.c'' pour toute
 information sur les  cables  mal  decrits  et  la  reconfiguration  de
 _p_o_w_e_r_d.   Les  sections  ``Assignement  des broches du port serie'' et
 ``Correspondance entre ioctl et RS232'' seront aussi utiles.

 Si vous devez  fabriquer  un  cable,  voyez  la  section  :  ``Comment
 realiser  un  cable ?''  pour les details generaux, et la sous-section
 de :  ``Informations  sur  un  certain  nombre  d'onduleurs''  qui  se
 rapporte  a  votre  onduleur.   Cette derniere peut aussi contenir des
 informations sur les cables fournis par le constructeur.  Vous voudrez
 probablement  parcourir toute la section ``Informations sur un certain
 nombre d'onduleurs'' car  chaque  section  contient  quelques  details
 supplementaires generalement utiles.

 +o  Editez /etc/inittab. Placez-y quelque chose de ce genre :

      # Que faire si le courant s'arrete
      # (arreter le systeme et vider la batterie :) :
      pf::powerfail:/etc/powerfailscript +5

      # Si le courant revient avant la fin du shutdown, arreter celui-ci
      pg:0123456:powerokwait:/etc/powerokscript

 +o  Ecrivez les scripts /etc/powerfailscript et /etc/powerokscript pour
    arreter le systeme  apres  cinq  minutes,  ou  mener  toute  action
    appropriee,  et  tuer  le  shutdown  en  cours, respectivement.  En
    fonction de votre version de shutdown, cela sera, soit  si  trivial
    que  vous n'aurez meme pas a ecrire de script, soit un script d'une
    ligne _b_a_s_h, quelque chose du genre :

 kill `ps -aux | grep "shutdown" | grep -v grep | awk '{print $2}'`

 et vous conserverez les scripts (au cas ou cela ne vous arriverait pas
 dans  un  parfait  etat, la premiere apostrophe sur la ligne ci-dessus
 est une quote inversee, la seconde et la troisieme sont  des  apostro-
 phes, et la derniere est aussi une quote inversee).

 +o  Dites a _i_n_i_t de relire le fichier inittab avec :

      telinit q

 +o  Editez rc.local pour lancer _p_o_w_e_r_d lors du lancement.  Syntaxe :

      powerd <ligne>

 Remplacez  <ligne>  par  le  port serie modem sur lequel sera connecte
 l'onduleur, comme dans : /dev/cua1.

 +o  Connectez le port serie du PC a celui de l'onduleur.   NE  BRANCHEZ
    PAS ENCORE LE PC SUR L'ONDULEUR.

 +o  Branchez une lampe sur l'onduleur.

 +o  Allumez l'onduleur et la lampe.

 +o  Lancez _p_o_w_e_r_d.

 +o  Testez la configuration :

 +o  Debranchez l'onduleur.

 +o  Controlez que la lampe reste allumee,

 +o  Controlez que /etc/powerfailscript est lance,

 +o  Controlez que le shutdown est lance.

 +o  Rebranchez l'onduleur.

 +o  Controlez que la lampe reste allumee,

 +o  Controlez que /etc/powerokscript est lance,

 +o  Controlez que /etc/powerfailscript n'est pas lance,

 +o  Controlez que le shutdown est bien arrete.

 +o  Redebranchez l'onduleur. Laissez-le debranche et verifiez que le PC
    s'arrete proprement dans un delai correct.

 +o  LLaa PPaarrttiiee DDeelliiccaattee..  Une fois que tout semble correct,  arretez  le
    PC et branchez-le sur l'onduleur.  Lancez un script qui synchronise
    le  disque  dur  toutes  les  secondes  ou  a  peu   pres   (sync).
    Simultanement,  lancez  un  second  script  qui execute un find sur
    votre disque entier.  Le premier sert  a  rendre  l'operation  plus
    sure,   et   le  second,  a  consommer  le  maximum  de  puissance.
    Maintenant, tirez sur la prise de l'onduleur, verifiez une fois  de
    plus  que  le  PC  est  lance, et attendez.  Assurez-vous que le PC
    s'arrete correctement avant  que  la  batterie  soit  vide.   C'est
    dangereux,  car si la batterie n'assure pas le delai d'arret du PC,
    vous pouvez vous retrouver avec un systeme de fichiers corrompu, et
    peut-etre  meme  la  perte  de  tous  vos  fichiers.   Vous devriez
    probablement realiser une sauvegarde complete  avant  ce  test,  et
    positionner un delai de shutdown tres court pour commencer.

 Felicitations  !   Vous  avez  maintenant un PC sous Linux protege par
 onduleur qui va s'arreter proprement lors d'une coupure de courant !

 55..44..  AAmmeelliioorraattiioonnss UUttiilliissaatteeuurr

 +o  Bidouillez powerd.c pour surveiller la ligne  indiquant  un  faible
    niveau de batterie.  Dans ce cas, executez un shutdown iimmmmeeddiiaattee ;

 +o  Modifiez  la  procedure de shutdown, afin que lorsqu'elle s'execute
    dans des conditions de coupure de courant, elle eteigne  l'onduleur
    apres avoir effectue tout le necessaire.

 66..  NNootteess ssuurr llee mmaatteerriieell

 66..11..  CCoommmmeenntt rreeaalliisseerr uunn ccaabbllee ??

 Cette  section est juste composee de messages que j'ai vus sur le Net.
 Je ne l'ai pas realise, donc  je  ne  peux  parler  d'experience.   Si
 quelqu'un le peut, qu'il ecrive cette section pour moi :).  Voir aussi
 le  message  concernant  le  GPS1000   dans   la   section   ``GPS1000
 d'ACCODATA''  pour  ne  pas citer toutes les donnees specifiques de la
 section ``Informations sur un certain nombre d'onduleurs''

    >From [email protected] Wed Jul 21 14:26:33 1993
    Newsgroups: comp.os.linux
    Subject: Re: Interface onduleur pour Linux ?
    From: [email protected] (Miquel van Smoorenburg)
    Date: Sat, 17 Jul 93 18:03:37
    Distribution: world
    Organization: Cistron Electronics.

    Dans l'article <[email protected]>
    [email protected] (Joel M. Hoffman) ecrit_:
    >Je ne vais pas tarder a acheter un onduleur, et ai remarque que certains
    >d'entre eux ont des interfaces reseau pour prevenir celui-ci lorsque le
    >courant est coupe.
    >
    >Y a-t-il une telle interface pour Linux ?
    >
    >Merci..
    >
    >-Joel
    >([email protected])
    >

    Lorsque je travaillais sur la derniere version de SysVinit (2.4
    actuellement), j'ai eu temporairement un onduleur sur mon ordinateur,
    donc j'ai ajoute le support de celui-ci.
    Tu as peut-etre vu que dans le dernier fichier d'en-tete <signal.h>,
    il y a maintenant un #define SIGPWR 30 :-).
    Malgre tout, je n'avais pas une telle interface speciale,
    mais la sortie de nombreux onduleurs est juste un relais qui s'ouvre ou se
    ferme en cas de coupure de courant.
    J'ai reflechi a une methode simple pour connecter ca sur la ligne DCD du
    port serie.
    Dans le paquetage SysVinit, il y a un demon appele "powerd" qui garde
    un oeil sur cette ligne serie et envoie SIGPWR a init lorsque l'etat
    change, pour qu'init puisse faire quelque chose (comme arreter le systeme
    dans les 5 minutes).
    La methode de connexion de l'onduleur a la ligne serie est decrite dans le
    source "powerd.c", mais je vais le dessiner ici pour explications_:

                         +------------------------o  DTR
                         |
                       +---+
                       |   | resistance
                       |   | 10 kilo-Ohm
                       |   |
                       +---+                              Vers le port serie
                         |
           +-----o-------+------------------------o  DCD
           |             |
           o  relais     |
         \     de l'     |
          \   onduleur   |
           |             |
           +-----o-------+------------------------o  GND

    Joli dessin, hein ?

    J'espere que cela peut etre utile.
    SysVinit peut etre trouve sur sunsite (et tsx-11 probablement) dans
    SysVinit2.4.tar.z

    Mike.

 --

         Miquel van Smoorenburg, <[email protected]>
         Ibmio.com: cannot open CONFIG.SYS: file handle broke off.

         >From [email protected] Wed Jul 21 14:27:04 1993
         Newsgroups: comp.os.linux
         Subject: Re: Interface onduleur pour Linux_?
         From: [email protected] (Danny ter Haar)
         Date: Mon, 19 Jul 93 11:02:14
         Distribution: world
         Organization: Cistron Electronics.

         Dans l'article <[email protected]>
         [email protected] (Miquel van Smoorenburg) ecrit :
         >La methode de connexion de l'onduleur a la ligne serie est decrite dans le
         >source "powerd.c", mais je vais le dessiner ici pour explications_:

         Le dessin n'etait pas vraiment clair, utilisez plutot celui-ci !
         >
         >                     +------------------------o  DTR
         >                     |
         >                   +---+
         >                   |   | resistance
         >                   |   | 10 kilo-Ohm
         >                   |   |
         >                   +---+                            Vers le port serie
         >                     |
         >       +-----o-------+------------------------o  DCD
         >       |
         >       o  relais
         >     \     de l'
         >      \   onduleur
         >       |
         >       +-----o--------------------------------o  GND
         >

         Le DTR est maintenu haut.
         Lorsque le courant de l'onduleur s'arrete, le relais se ferme.
         L'ordinateur controle la descente de la ligne DCD.
         Lorsque cela arrive, il lance une sequence shutdown...

         _____
         Danny

         --
         <=====================================================================>
         Danny ter Haar  <[email protected]> or <[email protected]>
         Robins law #103: 'a couple of lightyears can't part good friends'

 66..22..  AAnnaallyyssee ddee ccaabblleess eett mmooddiiffiiccaattiioonn ddee ppoowweerrdd..cc

 Essayez d'obtenir la documentation  des  cables  que  votre  revendeur
 d'onduleurs fournit. En particulier, recherchez :

 +o  quelles lignes doivent etre maintenues hautes ;

 +o  quelle(s) ligne(s) eteint(gnent) l'onduleur ;

 +o  quelles lignes l'onduleur modifie pour indiquer que :

 +o  le courant est coupe,

 +o  la batterie est faible.

 Il  vous  faut  ensuite  modifier powerd.c en consequence, ou utiliser
 l'un   des   paquetages   configurables   cites   plus   haut    (voir
 _g_e_n_p_o_w_e_r_-_1_._0_._1_._t_g_z,  _p_o_w_e_r_-_2_._0_._t_a_r_._g_z  ou _u_p_s_d_-_1_._0_._t_g_z decrits dans la
 section ``Logiciels''.  Si vous utilisez l'un des  paquetages,  suivez
 les  instruction correspondantes.  Si vous voulez bidouiller powerd.c,
 lisez ce qui suit.

 Si vous avez des problemes pour obtenir les informations precitees, ou
 si  vous  voulez  juste  les  controler (une _b_o_n_n_e idee), le programme
 suivant peut vous y aider.  C'est une version bidouillee de  powerd.c.
 Il  vous  permet de positionner les signaux du port depuis la ligne de
 commande, puis il controle le port, en affichant  l'etat  des  signaux
 chaque  seconde.   Je  l'ai  utilise  en  "upscheck  /dev/cua1 2" (par
 exemple) pour monter le deuxieme bit (_D_T_R) et  descendre  les  autres.
 Le  nombre en base 2 indique les bits a monter, ainsi par exemple pour
 monter les bits 1, 2 et 3 (et descendre les autres), utilisez 7.  Voir
 le code pour les details.

 Voici  le  programme  (non  teste) upscheck.c.  Il n'est pas teste car
 j'ai modifie la version que j'avais utilisee au depart pour le  rendre
 plus  clair,  et  que  je  ne  peux tester la nouvelle version pour le
 moment.

 NdT : La traduction des commentaires  et  messages  peut  aussi  avoir
 altere le comportement du programme.

 ______________________________________________________________________
 /*
  * upscheck     Controle comment l'ordinateur et l'onduleur communiquent
  *
  * Usage:       upscheck <peripherique> <bits a monter>
  *              Par exemple, upscheck /dev/cua4 4 pour monter le bit 3 et
  *              controler /dev/cua4.
  *
  * Author:      Harvey J. Stein <[email protected]>
  *              (mais en realite juste une modification mineure de Miquel van
  *              Smoorenburg's <[email protected]> powerd.c
  *
  * Version:     1.0 19940802
  *
  */
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <signal.h>

 /* Programme principal. */
 int main(int argc, char **argv)
 {
   int fd;

 /*  Ces parametres TIOCM_* sont definis dans <linux/termios.h>, qui  */
 /*  est inclus indirectement ici.                                    */
   int dtr_bit = TIOCM_DTR;
   int rts_bit = TIOCM_RTS;
   int set_bits;
   int flags;
   int status, oldstat = -1;
   int count = 0;
   int pc;

   if (argc < 2) {
         fprintf(stderr, "Usage: upscheck <peripherique> <bits-a-positionner>\n");
         exit(1);
   }

   /* Ouvre le peripherique a controler. */
   if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
     fprintf(stderr, "upscheck: %s: %s\n", argv[1], sys_errlist[errno]);
     exit(1);}

   /* Recupere les bits a positionner sur la ligne de commande */
   sscanf(argv[2], "%d", &set_bits);

   while (1) {
     /* Positionne les bits specifies sur la ligne de commande (et */
     /* seulement eux).                                            */
     ioctl(fd, TIOCMSET, &set_bits);
     fprintf(stderr, "Positionnement de %o.\n", set_bits);

     sleep(1);

     /* Recupere les bits actuellement positionnes */
     ioctl(fd, TIOCMGET, &flags);
     fprintf(stderr, "Les signaux sont %o.\n", flags);

 /*  Piochez ici en changeant TIOM_CTS par un autre TIOCM jusqu'a   */
 /*  ce que le programme detecte que le courant est coupe lorsque   */
 /*  vous debranchez l'onduleur. Ensuite, vous saurez comment       */
 /*  modifier powerd.c                                              */
     if (flags & TIOCM_CTS)
       {
         pc = 0 ;
         fprintf(stderr, "Le courant est la.\n");
       }
     else
       {
         pc = pc + 1 ;
         fprintf(stderr, "Le courant est coupe.\n");
       }
     }

   close(fd);
 }
 ______________________________________________________________________

 66..33..  AAssssiiggnneemmeenntt ddeess bbrroocchheess dduu ppoorrtt sseerriiee

 La section qui precede presuppose la connaissance de la correspondance
 entre les signaux de terminal et les broches du port serie.  Voici une
 reference  de cette correspondance, reprise du document de David Tal :
 "Cables et connecteurs frequemment utilises".  J'inclus  un  diagramme
 illustrant  les  connecteurs,  et une table donnant la corresopondance
 entre les numeros de broches et les signaux de ligne de terminal.

 Si vous avez besoin  d'une  reference  generale  sur  le  brochage  de
 cables,  celle  de David Tal en est une bonne, mais je n'arrive plus a
 localiser ce document sur le Net.  Mais j'ai trouve un  bon  livre  de
 remplacement, c'est The Hardware Book.

 NdT  :  si  un  lecteur  francais  veut proposer une reference dans la
 langue de Moliere, qu'il n'hesite pas a me contacter.

 Autres sites utiles :

 +o  Yost Serial Device Wiring Standard qui  contient  des  informations
    interessantes sur les connecteurs RJ-45 et les cables quatre paires
    pour toutes les connexions serie ;

 +o  Stokely consulting pour  l'information  generale  sur  Unix  et  en
    particulier leur Unix Serial Port Resources ;

 +o  Unix  Workstation System Administration Education Certification qui
    contient : RS-232: Connectors and Cables.

 Incidemment, il semble que le paquetage Linuxdoc-sgml ne formate  plus
 les tableaux tres bien en sortie _h_t_m_l.  Si vous voulez pouvoir lire la
 table qui suit, vous devrez probablement vous referer a la version _D_V_I
 ou texte simple du present document.

 |       |         |        |       |         |          |                                           |
 |DB-25  |  DB-9   |  Nom   |  EIA  |  CCITT  |  DTE-DCE |  Description                              |
 |Broche |  Broche |        |       |         |          |                                           |
 +-------+---------+--------+-------+---------+----------+-------------------------------------------+
 |1      |         |  FG    |  AA   |  101    |  ---     | Masse de chassis GND                      |
 |2      |  3      |  TD    |  BA   |  103    |  --->    | Donnees transmises, TxD                   |
 |3      |  2      |  RD    |  BB   |  104    |  <---    |  Donnees recues, RxD                      |
 |4      |  7      |  RTS   |  CA   |  105    |  --->    | Requete pour envoyer                      |
 |5      |  8      |  CTS   |  CB   |  106    |  <---    |  Pret a envoyer                           |
 |6      |  6      |  DSR   |  CC   |  107    |  <---    |  Jeu de donnees pret                      |
 |7      |  5      |  SG    |  AB   |  102    |  ----    | Masse de signal, GND                      |
 |8      |  1      |  DCD   |  CF   |  109    |  <---    |  Detection de porteuse                    |
 |9      |         |  --    |  --   |  -      |  -       | Tension positive continue de test         |
 |10     |         |  --    |  --   |  -      |  -       | Tension negative continue de test         |
 |11     |         |  QM    |  --   |  -      |  <---    |  Mode d'egalisation                       |
 |12     |         |  SDCD  |  SCF  |  122    |  <---    |  Detection de porteuse secondaire         |
 |13     |         |  SCTS  |  SCB  |  121    |  <---    |  Pret a envoyer secondaire                |
 |14     |         |  STD   |  SBA  |  118    |  --->    | Donnees transmise secondaires             |
 |15     |         |  TC    |  DB   |  114    |  <---    |  Signal d'horloge de l'emetteur           |
 |16     |         |  SRD   |  SBB  |  119    |  <---    |  Signal d'horloge secondaire du recepteur |
 |17     |         |  RC    |  DD   |  115    |  --->    | Signal d'horloge du recepteur             |
 |18     |         |  DCR   |  --   |  -      |  <---    |  Horloge divisee du recepteur             |
 |19     |         |  SRTS  |  SCA  |  120    |  --->    | Requete pour emettre secondaire           |
 |20     |  4      |  DTR   |  CD   |  108.2  |  --->    | Terminal de donnees pret                  |
 |21     |         |  SQ    |  CG   |  110    |  <---    |  Detection de qualite de signal           |
 |22     |  9      |  RI    |  CE   |  125    |  <---    |  Indicateur de sonnerie                   |
 |23     |         |  --    |  CH   |  111    |  --->    | Selecteur de vitesse de donnees           |
 |24     |         |  --    |  CI   |  112    |  <---    |  Selecteur de vitesse de donnees          |
 |25     |         |  TC    |  DA   |  113    |  <---    |  Horloge transmise                        |

     Assignement des broches de port serie (RS-232C), DB-25 et DB-9
 ______________________________________________________________________
         1                         13         1         5
       _______________________________      _______________
       \  . . . . . . . . . . . . .  /      \  . . . . .  /    Connecteurs
        \  . . . . . . . . . . . .  /        \  . . . .  /     RS-232 vus de
         ---------------------------          -----------      l'arriere de
         14                      25            6       9       l'ordinateur

    DTE : Equipement terminal de donnees (i.e. ordinateur)
    DCE : Equipement de communication de donnees (i.e. modem)
    RxD : Donnees recues; 1 est transmis "bas", 0 "haut"
    TxD : Donnees envoyees; 1 est transmis "bas", 0 "haut"
    DTR : DTE annonce qu'il est alimente et pret a communiquer
    DSR : DCE annonce qu'il est pret a communiquer; "bas" raccroche le modem
    RTS : DTE demande a DCE la permission d'envoyer des donnees
    CTS : DCE agree la RTS
    RI  : DCE indique au DTE qu'il tente d'etablir une connexion
    DCD : DCE annonce qu'une connexion est etablie
 ______________________________________________________________________

 66..44..  CCoorrrreessppoonnddaannccee eennttrree iiooccttll eett RRSS223322

 Puisque  vous  pouvez  aussi  devoir  modifier powerd.c pour monter et
 descendre les signaux corrects, vous pouvez  aussi  avoir  besoin  des
 valeurs  numeriques  des  differents signaux de terminal.  Ils peuvent
 etre trouves dans /usr/include/linux/termios.h, mais  sont  reproduits
 ici  comme  reference.   Puisqu'ils peuvent etre sujets a changements,
 vous auriez avantage a les verifier avec ledit fichier.

      ______________________________________________________________________
      /* lignes modem */
      #define TIOCM_LE        0x001
      #define TIOCM_DTR       0x002
      #define TIOCM_RTS       0x004
      #define TIOCM_ST        0x008
      #define TIOCM_SR        0x010
      #define TIOCM_CTS       0x020
      #define TIOCM_CAR       0x040
      #define TIOCM_RNG       0x080
      #define TIOCM_DSR       0x100
      #define TIOCM_CD        TIOCM_CAR
      #define TIOCM_RI        TIOCM_RNG
      ______________________________________________________________________

 Notez que la troisieme colonne est en hexadecimal.

 77..  QQuuee ffaaiirree ssii ll''oonn nn''eenn ssoorrtt ppaass ??

 Voici une nouvelle solution pour le  controle  lorsque  l'onduleur  et
 l'ordinateur ne s'entendent pas.  Je dois dire qu'a chaque fois que je
 lis cela, je suis effare de l'intelligence de cette solution.

 From: " Raymond A. Ingles" <[email protected]>
 To: [email protected]
 Subject: UPS HOWTO tip
 Date: Mon, 24 Feb 1997 11:48:32 -0500 (EST)

 Je ne sais pas si d'autres trouveront ca utile, mais je pense pouvoir
 diffuser ceci pour inclusion possible dans le HOWTO. Merci de maintenir
 un HOWTO que je trouve si utile !

 --------------------

 Ma fiancee m'a offert un onduleur, un Tripp-Lite 400, je crois.
 Il etait le bienvenu et semble fonctionner comme prevu, mais malheureusement,
 ne dispose pas d'interface serie pour prevenir l'ordinateur d'une coupure
 de courant.
 Il semble prevu pour une utilisation personnelle quand l'ordinateur ne
 reste pas seul.

 Evidemment, cela etait inacceptable et j'ai commence a travailler sur un
 systeme de surveillance de ligne, en imaginant ouvrir la boite et voir
 comment ajouter le hard que le constructeur avait omis. J'ai alors realise
 qu'il y avait une solution plus simple et moins chere (bien qu'un peu moins
 dotee en fonctionnalites).

 J'avais un vieux modem 2 400 baud que je n'utilisais pas, que j'ai branche
 sur un port serie inutilise de l'ordinateur. Je l'ai ensuite branche sur une
 prise anti-surtensions, elle-meme branchee sur la prise murale.
 J'ai configure powerd avec les options suivantes :

 ----
 serialline   /dev/ttyS1
 monitor      DCD
 failwhen     low
 ----

 Maintenant, lorsque le courant est coupe (ou, bien que cela ne soit pas
 arrive recemment, lorsque je debranche le parasurtenseur pour tester la
 configuration), le modem tombe mais l'onduleur commence a alimenter
 l'ordinateur.
 Lorsque powerd se rend compte que le modem a descendu DCD, il declenche la
 sequence powerfail.

 Evidemment, il y a certaines limitations.
 Il n'est pas possible de faire indiquer par le modem que la batterie est
 faible, etc.
 On peut seulement indiquer que le courant est coupe.
 Maintenant, ce n'est pas cher et je deteste laisser un equipement
 informatique inutilise.
 Ces temps-ci, il est possible d'avoir un modem 2 400 baud quasi gratuitement.

 Je continue a conseiller un onduleur avec des possibilites de communication
 completes, mais si l'on est coince avec un qui n'en a pas, cela peut au
 moins etre utile.

   Sincerement,

 Ray Ingles           (810) 377-7735           [email protected]

  "Anybody who has ever seen a photograph showing the kind of damage that
 a trout traveling that fast can inflict on the human skull knows that
 such photographs are very valuable. I paid $20 for mine." - Dave Barry

 88..  IInnffoorrmmaattiioonnss ssuurr uunn cceerrttaaiinn nnoommbbrree dd''oonndduulleeuurrss

 Cette  section  contient  des  informations  specifiques  de  certains
 onduleurs.  Ce que je souhaiterais serait de disposer des informations
 sur le port de controle de l'onduleur (ce que fait chaque broche et ce
 qu'elle attend qui soit fait), sur le cable fourni par le constructeur
 (ce qu'il connecte et ou), ainsi qu'une version modifiee  de  powerd.c
 qui  fonctionne  avec  l'onduleur.   Ce  que j'ai actuellement est une
 description a peu pres  complete  de  chaque  onduleur.   Je  voudrais
 essayer  d'affiner  chaque  information,  mais comme je ne peux tester
 chaque onduleur, il est difficile de decider exactement de ce qui  est
 necessaire.   De  plus,  chaque  onduleur  semble avoir quelques trucs
 supplementaires qui sont  bien  decrits  par  les  auteurs  de  chaque
 section.   Ainsi, pour l'heure, je laisse tout en place.  Tout pour un
 HOWTO epais.

 VVeeuuiilllleezz mm''eennvvooyyeerr vvooss eexxppeerriieenncceess ppoouurr lleess iinncclluurree iiccii..

 88..11..  EExxppeerriieenncceess ggeenneerraalleess..

 J'ai conserve les commentaires des gens, mais n'ai pas  encore  obtenu
 la permission de les inclure ici.  Voici un sommaire general de ce que
 j'ai entendu dire.

    AAPPCC ::
       Ne donneront pas d'informations sur leur mode "intelligent" sans
       votre  signature d'un accord de confidentialite.  Donc, les gens
       sont forces d'utiliser leurs onduleurs  "intelligents"  en  mode
       "bete",  comme souligne plus bas.  Diverses tentatives de retro-
       ingenierie  ont  ete  soldees  par  des  niveaux   de   reussite
       differents.

    BBeesstt ::
       Serviables  et  aimables.   Fournissent  le  code  source  et la
       documentation pour les deux modes.

    TTrriipppp LLiittee ::
       Une personne a  dit  que  Tripp  ne  diffuserait  pas  non  plus
       d'information.

    UUppssoonniicc ::
       Quelqu'un  a  dit  qu'Upsonic a discute de details techniques au
       telephone, repondu aux questions par fax  et  est  serviable  en
       general.

 88..22..  AAddvviiccee 11220000 AA

 Onduleurs  d'Advice  Electronics, Tel Aviv, Israel (Tout leur materiel
 porte une etiquette a leur nom).

 Specification des broches du port de controle.

 +o  2 - Coupure de courant.

 +o  5 - Batterie faible.

 +o  6 - Extinction de l'onduleur.

 +o  4 - Masse commune des broches 2, 5 et 6.

 Ils m'ont aussi donne le dessin suivant qui ne m'a servi a rien,  mais
 peut vous etre utile si vous souhaitez fabriquer vous-meme un cable :

      ______________________________________________________________________
               2 ----------+
                           |
                           \
                            \|
                             |--------------
                            /|
                          \/      <--- Le "\/" indique le type de ce
                          |            transistor. J'ai oublie ce que
                          |            cela veut dire, mais ce n'est
                       +-----+         pas fondamental.
                      /  /  /

               5 ----------+
                           |
                           \
                            \|
                             |--------------
                            /|
                          \/
                          |
                          |
                       +-----+
                      /  /  /

                             +-------------
                             |
                             /
                    10K    |/
               6 --\/\/\/--|
                           |\
                             \/
                             |
                             |
                          +-----+
                         /  /  /

               4 ----------+
                           |
                           |
                        +-----+
                       /  /  /

      ______________________________________________________________________

 Cable fourni.

 Ils m'ont d'abord donne un cable qui appartenait a un paquetage DOS de
 controle de l'onduleur appele RUPS.  Je l'ai utilise pour  les  tests.
 Une  fois  ceux-ci  satisfaisants,  ils  m'ont  donne  un cable qu'ils
 utilisent pour les serveurs Netware connectes  a  des  onduleurs.   Il
 fonctionnait a l'identique.  Voici les details :

 +o  DTR - Alimentation du cable (powerd.c doit le monter) ;

 +o  CTS - Courant present (descend quand le courant est coupe) ;

 +o  DSR - Batterie faible (descend lorsque la batterie faiblit) ;

 +o  RTS - Extinction de l'onduleur (a monter pour eteindre).

 (le  powerd.c  inclus  dans SysVinit place ou laisse RTS haut, causant
 l'arret de l'onduleur immediatement lors du lancement de powerd !)

 88..33..  nnaammee==""TTrruusstt EEnneerrggyy PPrrootteeccttoorr 440000//660000""

 Cette  section  n'est  pas  utile  seulement  pour  le  Trust   Energy
 Protector.  Elle illustre les nouvelles fonctionnalites d'_i_n_i_t.

 Comment utiliser un Trust Energy Protector 400/650 sous Linux ?

 par Ciro Cattuto

 Version 1.0 - 31 mars 1997

    CCoonnnneexxiioonn PPCC--oonndduulleeuurr
       Le  Trust  Energy  Protector  400/650  est  equipe  d'un port de
       signaux.  A  l'aide  d'un  cable  adapte,  il  est  possible  de
       connecter  celui-ci sur un ordinateur pour reagir aux evenements
       concernant l'alimentation electrique.

    LLee ppoorrtt ddee ssiiggnnaauuxx ddee ll''oonndduulleeuurr
       L'assignement des broches du port de signaux DB-9 de  l'onduleur
       est le suivant, comme indique dans le manuel utilisateur :

       bbrroocchhee 22
          Ce  relais  est  ferme  lorsque le courant d'alimentation est
          coupe.

       bbrroocchhee 44
          Masse des broches 2 et 5.

       bbrroocchhee 55
          Ce relais est ferme lorsque  la  batterie  dispose  de  moins
          d'une minute et demi d'autonomie.

       bbrroocchhee 66
          L'utilisateur peut envoyer un signal haut (+5V a +12V) durant
          plus d'une  milliseconde  pour  eteindre  l'onduleur.   Cette
          option  ne  peut  etre  activee  que  durant  une  coupure de
          courant.

       bbrroocchhee 77
          Masse de la broche 6.

    llee ccaabbllee
       Voici le cable que j'ai utilise  pour  connecter  l'onduleur  au
       port serie de mon ordinateur.

              cote ordinateur (DB-15)                         cote onduleur (DB-9)
              ====================================================================

               6 DSR --+                                [R] = resistance 10 kohm
                       |
              20 DTR --+----+
                       |    |
                      [R]  [R]                                             +--- 7
                       |    |                                              |
               8 DCD --+----|--------------           ---------------------|--- 2
                            |                                              |
               7 GND -------|--------------           ---------------------+--- 4
                            |                 ...
               5 CTS -------+--------------           ------------------------- 5

               2 TX  ----------------------           ------------------------- 6

              ====================================================================

    Pour  un  port  serie  DB-9,  les  broches  6,  20,  8,  7,  5 et 2
    correspondent respectivement aux broches 6, 4, 1, 5, 8 et 3.

    CCoommmmeenntt ffoonnccttiioonnnnee llee ccaabbllee ??
       L'ordinateur monte  DTR  et  verifie  que  DSR  soit  haut  pour
       s'assurer  que  le cable soit connecte a l'ordinateur.  Tant que
       le courant est la, DCD et CTS sont hauts tous les deux (a  cause
       des resistances).

       Lorsque le courant est coupe, le relais entre les broches 2 et 4
       de l'onduleur se ferme, et DCD descend pour signaler la coupure.

       De meme, lorsque les batteries sont faibles, le relais entre les
       broches 5 et 4 se ferme, faisant descendre CTS.

       Durant  une  coupure  de  courant,  l'ordinateur  peut  eteindre
       l'onduleur  en  montant TX durant 1 ms au moins.  Cela peut etre
       realise aisement en envoyant un octet 0xFF au  port  serie  avec
       une vitesse faible.

    llee ddaaeemmoonn ppoowweerrdd
       Pour utiliser les informations disponibles sur le port serie, il
       faut utiliser un programme  qu  surveille  celui-ci,  decode  le
       signal   et   envoie   les   messages   appropries   au  systeme
       d'exploitation, en l'occurence au processus  init.   Ce  dernier
       peut  executer  des  scripts  et  programmes  concus  pour gerer
       (proprement !) l'evenement de coupure de courant.

    ccoommppiilleerr ppoowweerrdd
       En annexe A se trouve le code de powerd, le daemon que j'utilise
       pour  surveiller  le  Trust  Energy  Protector 400/650.  Pour le
       compiler, il faut le source du paquetage SysVinit (j'ai  utilise
       celui   de   sysvinit-2.60).   Ecrasez  simplement  le  powerd.c
       d'origine et compilez-le.

    CCoommmmeenntt ffoonnccttiioonnnnee ppoowweerrdd ??
       Des le demarrage, _p_o_w_e_r_d ouvre le peripherique serie connecte  a
       l'onduleur  et  monte  DTR.   Ensuite,  il forke un daemon et se
       termine en laissant celui-ci tourner.  Le daemon _p_o_w_e_r_d peut  se
       trouver dans l'un des trois etats suivants :

       EEttaatt 00 -- llee ccoouurraanntt eesstt bboonn
          Dans  cet  etat, _p_o_w_e_r_d lit le port serie toutes les T0_SLEEP
          secondes (voir les lignes #define au debut du  code  source).
          Si  DCD  descend,  _p_o_w_e_r_d bascule en etat 1.  Si CTS descend,
          _p_o_w_e_r_d bascule en etat 2 (cela ne doit  pas  arriver  si  DCD
          n'est pas descendu avant, mais j'ai prefere assurer le coup).

       EEttaatt 11 -- llee ccoouurraanntt eesstt ccoouuppee
          Une coupure de courant a ete detectee.  DCD est bas et _p_o_w_e_r_d
          lit  le  port de l'onduleur toutes les T1_SLEEP secondes.  Si
          DCD remonte, il bascule en etat 0.  Si CTS tombe, il  bascule
          en etat 2.

       EEttaatt 22 -- llaa bbaatttteerriiee eesstt ffaaiibbllee
          La batterie de l'onduleur est faible.  Le daemon _p_o_w_e_r_d reste
          dans cet etat.

       A chaque changement d'etat de _p_o_w_e_r_d, il previent  le  processus
       _i_n_i_t   afin   que   l'action  appropriee  soit  effectuee.   Ces
       evenements sont traces a l'aide du systeme de trace  du  systeme
       d'exploitation (NdT : _s_y_s_l_o_g_d).

       Si  DSR est bas, c'est qu'il y a un probleme au niveau du cable.
       _p_o_w_e_r_d continue a surveiller la ligne DSR et envoit  un  message
       d'avertissement toutes les deux minutes au systeme de trace.

    UUttiilliisseerr ppoowweerrdd
       Le   daemon   _p_o_w_e_r_d   doit   etre   lance   par   les   scripts
       d'initialisation durant le demarrage du  systeme.   J'ai  ajoute
       les lignes suivantes dans mon script /etc/rc.d/rc.local :

         # Ajout du support de l'onduleur
         echo "Demarrage du processus powerd..."
         rm -f /etc/turnUPSoff
         stty -crtscts speed 75 < /dev/cua3 > /dev/null
         if [ -x /usr/sbin/powerd ]
         then
                 /usr/sbin/powerd /dev/cua3
         fi

    En  premier,  on efface (si necessaire) le fichier /etc/turnUPSoff.
    Celui-ci est utilise par le script de shutdown (/etc/rc.d/rc.0 dans
    mon  cas)  pour  decider s'il faut arreter l'onduleur ou non.  Voir
    plus bas pour plus d'informations.

    Ensuite,  on  desactive  le  controle  de  flux  materiel  sur   le
    peripherique  serie  connecte  a  l'onduleur  et  on  positionne la
    vitesse a 75 bauds.  Maintenant, nous sommes sur que le  signal  TX
    restera haut suffisamment longtemps pour arreter l'onduleur si nous
    envoyons un caractere 0xFF au port  serie  (a  nouveau,  voir  plus
    bas).
    Enfin,  nous  lancons  le  daemon _p_o_w_e_r_d en lui indiquant le port a
    surveiller.  Notez que nous n'avons pas a lire de caracteres sur ce
    port,  donc pas d'inquietude en cas de conflit d'interruptions - il
    n'aura aucune influence.

    LLee ffiicchhiieerr iinniittttaabb eett lleess ssccrriippttss ddee sshhuuttddoowwnn
       Le processus _p_o_w_e_r_d tourne maintenant, et il enverra des signaux
       a  init  en  cas  de  coupure  de  courant.   Il faut maintenant
       configurer le systeme afin qu'il puisse reagir de maniere  utile
       lorsque ces signaux sont recus.

    MMooddiiffiiccaattiioonn ddee iinniittttaabb
       Ajoutez  les  lignes  suivantes  a  proximite  du debut de votre
       fichier /etc/inittab :

         # Quoi faire lorsque le courant est coupe (shutdown temporise)
         pf::powerfail:/etc/powerfail_script

         # Si le courant revient avant le shutdown, arreter celui-ci
         pg::powerokwait:/etc/powerokay_script

         # Si la batterie de l'onduleur est faible, faire un shutdown immediat
         pc::powerfailnow:/etc/powerfailnow_script

    LLeess ssccrriippttss
       Les    scripts     powerfail_script,     powerokay_script     et
       powerfailnow_script  sont executes lorsque _i_n_i_t recoit le signal
       correspondant.  Il ont la responsabilite d'arreter le systeme de
       maniere  propre  ou  d'arreter un shutdown en cours au cas ou le
       courant  reviendrait.    Voici   les   scripts   que   j'utilise
       actuellement :

       /etc/powerfail_script

         #!/bin/sh
         /bin/sync
         /usr/bin/sleep 10m
         kill -9 `ps auxw | \
                  grep "shutdown" | \
                  grep -v grep | \
                  awk '{print $2}'` >/etc/turnUPSoff
         /sbin/shutdown -t30 -h +3 "Coupure de courant"

    Mon  Trust  Energy  Protector 400 n'alimente que l'ordinateur, j'ai
    donc une reserve de courant assez importante.   Dans  mon  secteur,
    les  coupures  de  courant  ne durent souvent que quelques minutes,
    donc le systeme reagit a celles-ci de  la  maniere  suivante  :  Il
    attent  10  minutes (habituellement, le courant revient avant) puis
    arrete le systeme, en laissant aux utilisateurs le temps de  fermer
    leurs  applications  et  de  se  deconnecter.   Avant d'executer la
    commande _s_h_u_t_d_o_w_n, je verifie qu'il n'y a pas d'autre  shutdown  en
    cours.   Je  cree  aussi  le  fichier  /etc/turnUPSoff  afin que le
    systeme arrete l'onduleur.
    /etc/powerokay_script

         #!/bin/sh
         kill    `ps auxw | \
                  grep "powerfail_script" | \
                  grep -v grep | \
                  awk '{print $2}'`
         kill -9 `ps auxw | \
                  grep "shutdown" | \
                  grep -v grep | \
                  awk '{print $2}'`
         rm -f /etc/turnUPSoff

    Si le courant revient, on tue le script  _p_o_w_e_r_f_a_i_l___s_c_r_i_p_t  et  tout
    _s_h_u_t_d_o_w_n en cours.  On n'oublie pas de supprimer /etc/turnUPSoff.

    /etc/powerfailnow_script

         #!/bin/sh
         kill -9 `ps auxw | \
                  grep "shutdown" | \
                  grep -v grep | \
                  awk '{print $2}'` >/etc/turnUPSoff
         /sbin/shutdown -h now "Batterie de l'onduleur faible. ARRET IMMEDIAT."

    Si  la  batterie  faiblit, on s'assure qu'aucun _s_h_u_t_d_o_w_n ne soit en
    cours, on cree le fichier /etc/turnUPSoff puis on arrete le systeme
    immediatement.

    LLee ssccrriipptt dd''aarrrreett ssyysstteemmee
       Lorsque  l'arret  du  systeme  est  effectue,  on  peut  arreter
       l'onduleur en montant le signal TX du  port  serie  durant  plus
       d'une  milliseconde.   Celui-ci  est deja configure correctement
       par  la  commande  stty  du  script  rc.local.   Si  le  fichier
       /etc/turnUPSoff  est  present,  on envoit l'octet 0xFF (tous les
       bits a 1) sur le port serie.

       Pour cela, on ajoute les lignes suivantes autour de  la  fin  du
       script  d'arret  (/etc/rc.d/rc.0  dans  mon cas).  L'emplacement
       correct depend de la maniere dont le systeme est configure, mais
       il  doit pouvoir se situer avant la commande _e_c_h_o qui affiche le
       message "System is halted".

         # Est-on dans un cas de coupure de courant ?
         if [ -f /etc/turnUPSoff ]
         then
                 echo "Arret de l'onduleur"
                 sleep 5
                 echo -e "\377" >/dev/cua3
                 exit 1
         fi

    RReemmaarrqquueess ggeenneerraalleess
       Ce document contient des choses que j'ai apprises en tentant  de
       configurer _m_o_n systeme Linux avec le Trust Energy Protector 400.
       Certaines  informations   (le   chemin   d'acces   aux   scripts
       d'initialisation,  par  exemple)  peuvent etre specifiques a mon
       systeme, et il  vous  faudra  vraisemblablement  faire  quelques
       adaptations.  Neammoins, j'espere que ce document sera une trace
       utile pour ceux qui essaieront d'utiliser un onduleur de ce type
       sous  Linux.  Si vous rencontrez des difficultes, recherchez des
       informations plus generales dans le reste de  ce  Howto.   Bonne
       chance !

    RReettoouurr dd''iinnffoorrmmaattiioonnss
       J'apprecierais  enormement tout retour d'informations concernant
       ce document, afin de pouvoir affiner celui-ci et y  corriger  de
       possibles erreurs (je sais que l'anglais que j'utilise n'est pas
       excellent, mais apres tout, je suis italien ! (-- NdT  :  On  se
       demande quelquefois s'il faut vraiment tout traduire :-))--)

       ).   Envoyez  tout  commentaire/suggestion/critique  a l'adresse
       suivante :

       [email protected]

       Si vous rencontrez des  problemes  d'utilisation  de  l'onduleur
       Trust  Energy Protector 400/650 sous Linux, vous pouvez aussi me
       contacter.  J'essaierai de vous aider.

    IInnffoorrmmaattiioonnss lleeggaalleess
       Je n'ai aucune relation avec Trust Networking Products.

       L'information  contenue  dans  ce  document  est  livree  "telle
       quelle".  Vous pouvez l'utiliser a vos risques et perils.  Je ne
       puis etre tenu responsable d'un quelconque dommage ni  perte  de
       donnees  resultant  de l'utilisation du code ni des informations
       donnees ici.

       Ciro Cattuto

    AAppppeennddiixx AA  --  CCooddee ssoouurrccee dduu ddaaeemmoonn ppoowweerrdd>>

         powerd.c

    /*
     * powerd       Recoit les evenements de coupure de courant
     *              depuis un Trust Energy Protector 400/650
     *              et previent init
     *
     * Usage:       powerd <port serie>
     *
     * Author:      Ciro Cattuto <[email protected]>
     *
     * Version 1.0 - 31 Mars 1997
     *
     * Ce code est largement fonde sur le powerd.c original de
     * Miquel van Smoorenburg <[email protected]>.
     *
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * as published by the Free Software Foundation; either version
     * 2 of the License, or (at your option) any later version.
     *
     * Ce programme est un logiciel libre ; vous pouvez le distribuer
     * et/ou le modifier selon les termes de la Licence Publique Generale
     * GNU publiee par la Free Software Foundation version 2 ou (comme
     * vous le voulez) toute version ulterieure.
     *
     */

    /* etat 0 - le courant est la */
    #define T0_SLEEP        10      /* intervalle de lecture du port en
                                       secondes                                */
    #define T0_DCD          3       /* duree avec DCD monte avant de realiser
                                       une action                              */
    #define T0_CTS          3       /* duree avec CTS monte avant de realiser
                                       une action                              */
    /* etat 1 - le courant est coupe */
    #define T1_SLEEP        2       /* intervalle de lecture du port           */
    #define T1_DCD          3       /* idem    T0_DCD                          */
    #define T1_CTS          3       /* idem    T0_CTS                          */

    #define DSR_SLEEP       2
    #define DSR_TRIES       60

    /* On utilise le nouveau mode de communication avec init. */
    #define NEWINIT

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/ioctl.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <signal.h>
    #include <syslog.h>
    #include <string.h>
    #include 'paths.h'
    #ifdef NEWINIT
    #include 'initreq.h'
    #endif

    #ifndef SIGPWR
    #  define SIGPWR SIGUSR1
    #endif

    #ifdef NEWINIT
    void alrm_handler()
    {
    }
    #endif

    /* Dire a init que le courant est coupe (1), revenu (0) ou que
       les batteries de l'onduleur sont faibles (2). */
    void powerfail(int event)
    {
      int fd;
    #ifdef NEWINIT
      struct init_request req;

      /* On remplit la structure necessaire */
      memset(&req, 0, sizeof(req));
      req.magic = INIT_MAGIC;
      switch (event)
            {
            case 0:
                    req.cmd = INIT_CMD_POWEROK;
                    break;
            case 1:
                    req.cmd = INIT_CMD_POWERFAIL;
                    break;
            case 2:
            default:
                    req.cmd = INIT_CMD_POWERFAILNOW;
            }

      /* On ouvre le fifo (avec timeout) */
      signal(SIGALRM, alrm_handler);
      alarm(3);
      if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0
                    && write(fd, &req, sizeof(req)) == sizeof(req)) {
            close(fd);
            return;
      }
      /* On revient a l'ancienne methode... */
    #endif

      /* On cree un fichier info pour init */
      unlink(PWRSTAT);
      if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
      switch (event)
            {
            case 0:
                    write(fd, 'OK\n', 3);
                    break;

            case 1:
                    write(fd, 'FAIL\n', 5);
                    break;

            case 2:
            default:
                    write(fd, 'LOW\n', 4);
                    break;
            }
      close(fd);
      }

      kill(1, SIGPWR);
    }

    /* Programme principal. */
    int main(int argc, char *argv[])
    {
      int fd;
      int dtr_bit = TIOCM_DTR;
      int flags;
      int DCD, CTS;
      int status = -1;
      int DCD_count = 0, CTS_count = 0;
      int tries;

      if (argc < 2) {
            fprintf(stderr, 'Usage: powerd <peripherique>\n');
            exit(1);
      }

      /* On demarre syslog. */
      openlog('powerd', LOG_CONS|LOG_PERROR, LOG_DAEMON);

      /* On ouvre le port a surveiller. */
      if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
            syslog(LOG_ERR, '%s: %s', argv[1], sys_errlist[errno]);
            closelog();
            exit(1);
      }

      /* La ligne est ouverte, donc DTR est haut.
         On le force tout de meme pour plus de surete */
      ioctl(fd, TIOCMBIS, &dtr_bit);

      /* On passe en daemon. */
      switch(fork()) {
            case 0: /* Fils */
                    closelog();
                    setsid();
                    break;
            case -1: /* Erreur */
                    syslog(LOG_ERR, 'Impossible de forker.');
                    closelog();
                    exit(1);
            default: /* Pere */
                    closelog();
                    exit(0);
      }

      /* On relance syslog. */
      openlog('powerd', LOG_CONS, LOG_DAEMON);

      /* Maintenant, on echantillonne la ligne DCD */
      while(1) {
            /* On lit le statut. */
            ioctl(fd, TIOCMGET, &flags);

            /* On controle la connexion.
               DSR doit etre haut */
            tries = 0;
            while((flags & TIOCM_DSR) == 0) {
                    /* On continue a essayer, et on previent
                       toutes les deux minutes */
                    if ((tries % DSR_TRIES) == 0)
                        syslog(LOG_ALERT, 'Erreur de connexion onduleur');
                    sleep(DSR_SLEEP);
                    tries++;
                    ioctl(fd, TIOCMGET, &flags);
            }
            if (tries > 0)
                    syslog(LOG_ALERT, 'Connexion onduleur OK');

            /* On calcule l'etat en cours. */
            DCD = flags & TIOCM_CAR;
            CTS = flags & TIOCM_CTS;

            if (status == -1)
                    {
                    status = (DCD != 0) ? 0 : 1;
                    if (DCD == 0)
                            {
                            syslog(LOG_ALERT, 'Coupure de courant. Onduleur actif.');
                            powerfail(1);
                            }
                    }

            switch (status)
                    {
                    case 0:
                            if ((DCD != 0) && (CTS != 0))
                                    {
                                    DCD_count = 0;
                                    CTS_count = 0;
                                    sleep(T0_SLEEP);
                                    continue;
                                    }
                            if (DCD == 0)
                                    DCD_count++;
                            if (CTS == 0)
                                    CTS_count++;
                            if ((DCD_count < T0_DCD) && (CTS_count < T0_CTS))
                                    {
                                    sleep(1);
                                    continue;
                                    }
                            if (CTS_count == T0_CTS)
                                    {
                                    status = 2;
                                    syslog(LOG_ALERT, 'Batteries faibles !');
                                    break;
                                    }
                            status = 1;
                            DCD_count = 0;
                            syslog(LOG_ALERT, 'Coupure de courant. Onduleur actif.');
                            break;

                    case 1:
                            if ((DCD == 0) && (CTS != 0))
                                    {
                                    DCD_count = 0;
                                    CTS_count = 0;
                                    sleep(T1_SLEEP);
                                    continue;
                                    }
                            if (DCD != 0)
                                    DCD_count++;
                            if (CTS == 0)
                                    CTS_count++;
                            if ((DCD_count < T1_DCD) && (CTS_count < T1_CTS))
                                    {
                                    sleep(1);
                                    continue;
                                    }
                            if (CTS_count == T1_CTS)
                                    {
                                    status = 2;
                                    syslog(LOG_ALERT, 'Batteries faibles !');
                                    break;
                                    }
                            status = 0;
                            DCD_count = 0;
                            CTS_count = 0;
                            syslog(LOG_ALERT, 'Courant present.');
                            break;

                    case 2:
                            sleep(1);
                            continue;

                    default:
                            break;
                    }

            powerfail(status);
      }
      /* N'arrive jamais */
      return(0);
    }

 88..44..  TTrruusstt UUPPSS 440000--AA

 J'ai recu un message a propos du Trust UPS 400-A.  Je ne sais  pas  si
 c'est le meme que le Trust Energy Protector 400, donc voici le message
 (-- (NdT : le texte qui suit a ete reformate.  Le  document  d'origine
 comporte une copie de courrier electronique)--)

  :

 Marcel Amerlaan

 16 juillet 1997

    ddiissppoonniibbiilliittee
       Cet  onduleur ne semble plus etre fabrique par son constructeur,
       mais cela ne veut pas dire qu'il ne soit plus disponible :  j'ai
       achete le mien tres peu cher il y a seulement un mois.  De plus,
       cette entreprise reetiquette souvent ses produits.

    ccaabbllee
       Il est facile a fabriquer  a  l'aide  du  cable  d'origine  pour
       powerd et de la documentation de Trust.

       Il presente deux ameliorations :

    +o  indication de batterie faible ;

    +o  extinction de l'onduleur.

    Type               : "pleur"
    Cable power        : {TIOCM_DTR, 0}
    Inverter Kill      : {TIOCM_RTS, 1}
    Inverter Kill Time : 5
    Power Check        : {TIOCM_CTS, 0}
    Battery Check      : {TIOCM_CAR, 0}
    Cable Check        : {TIOCM_RI,  0}

    La  fonction  "cable  check"  n'est  pas utilisee car l'onduleur ne
    semble pas la reconnaitre.

    ccoonncclluussiioonn
       Voila tout  ce  que  je  crois  savoir.   Si  vous  voulez  plus
       d'informations   sur   l'onduleur,  le  cable  ou  le  logiciel,
       contactez-moi.

       Et souvenez-vous que tout ce qui est decrit ici fonctionne  pour
       moi mais je ne garantis pas que ce soit le cas pour vous.

         Marcel Ammerlaan
         CEO Pleursoft (cela explique le nom du cable, n'est-ce pas :-)
         Pays Bas

 88..55..  SSuussttaaiinneerr SS--4400aa

 Informations sur le Sustainer S-40a (-- (NdT : le texte qui suit a ete
 reformate. Le  document  d'origine  comporte  une  copie  de  courrier
 electronique)--)

  :

 Evgeny Stambulchik

 10 septembre 1995

    eennvviirroonnnneemmeenntt
       Sustainer  S-40a  avec  le paquetage unipower (recemment renomme
       genpower), cable maison (cf. infra).  J'ai envoye une  copie  de
       tout  ca  a  Tom Webster, l'auteur du paquetage, et cela devrait
       apparaitre dans la nouvelle version.

    ccaabbllee

    +o  Note : les  broches  d'arret  indiquees  dans  la  documentation
       technique  (4  et  6)  sont incorrectes. Les bonnes sont 6 et 7,
       comme sur le schema joitnt ;

    +o  Note 2 : les broches cote  PC  entre  parenthese  sont  pour  un
       connecteur 25 broches, les autres pour un 9 broches.

                 COTE ONDULEUR                         COTE LINUX

                   2 COUPURE DE COURANT                         1 (8)
              +----o----------------------------+------------------o  DCD
              |                                 |
              o                                 |
               /                                |
              /                                 |
              |    4 MASSE COMMUNE              |               5 (7)
              +----o-------------+--------------|------------------o  GND
              |                  |              |
              \                  |              |
               \                 |              |
              o                  |              |
              |    5 BATTERIE    | FAIBLE       |               8 (5)
              +----o-------------|--------------|--------+---------o  CTS
                                 |              |        |
                                 |            +-+-+    +-+-+
                                 |            |   |    |   |
                                 | Resistances|   |    |   |
                                 |            |   |    |   |
                                 | 3 x 10 kohm|   |    |   |
                                 |            +-+-+    +-+-+
                                 |              |        |      4 (20)
                                 |              +--------+---------o  DTR
                                 |
     |             6 ARRET DE    | L'ONDULEUR    +-------+      7 (4)
     +-+       +---o-------------|---------------+       +---------o  RTS
       \       |                 |               +-------+
        \|    -+-                |
         | <- \ /                |
        /|    -+-                |
      /        |   7             |
      |        +---o-------------+
    --+--
     ---
      -

    ffiicchhiieerr uunniippoowweerrdd..hh

    /************************************************************************/
    /* Fichier              : unipowerd.h                                   */
    /* Programme            : unipowerd                   Version: 1.0.0    */
    /* Auteur               : Tom Webster <[email protected]>              */
    /* Creation             : 1994/04/20                                    */
    /* Modification         : Tom Webster                 Date: 1995/04/09  */
    /* Modification         : Evgeny Stambulchik (pour onduleur Sustainer)  */
    /*                                                                      */
    /* Compilation          : GCC 2.5.8                                     */
    /* Compilateur          : Linux 1.0.9                                   */
    /* ANSI C Compatible    : Non                                           */
    /* POSIX Compatible     : Oui ?                                         */
    /*                                                                      */
    /* But                  : Fichier d'entete pour unipowerd.              */
    /*                      : Contient les informations de configuration    */
    /*                      : de unipowerd. Editez ce fichier comme indique */
    /*                      : pour activer les fonctionnalites et ajuster   */
    /*                      : unipowerd pour votre onduleur.                */
    /*                                                                      */
    /* Copyright            : GNU Copyleft                                  */
    /************************************************************************/

    /* Lignes de controle RS232                       */
    /*                                                */
    /*                                            D D */
    /*                                            T C */
    /* Macro           Anglais                    E E */
    /* ---------------------------------------------- */
    /* TIOCM_DTR       DTR - Data Terminal Ready  --> */
    /* TIOCM_RTS       RTS - Ready to send        --> */
    /* TIOCM_CTS       CTS - Clear To Send        <-- */
    /* TIOCM_CAR       DCD - Data Carrier Detect  <-- */
    /* TIOCM_RNG       RI  - Ring Indicator       <-- */
    /* TIOCM_DSR       DSR - Data Signal Ready    <-- */

    #define HIGH            (1)
    #define LOW             0
    #define PWRSTAT         '/etc/powerstatus'
    #define UPSSTAT         '/etc/upsstatus'

    /* CABLEPOWER est la ligne qui alimente le cable  */
    /* pour la surveillance normale.                  */
    #define CABLEPOWER      TIOCM_DTR

    #define POWERBIT        TIOCM_CAR
    #define POWEROK         HIGH

    /* CABLECHECK vaut 1 pour surveiller la batterie ??*/
    /* CABELCHECK vaut 0 pour ne rien surveiller       */
    #define CABLECHECK      0
    #define CABLEBIT        TIOCM_RNG
    #define CABLEOK         HIGH

    /* BATTCHECK vaut 1 pour surveiller la batterie    */
    /* BATTCHECK vaut 0 pour ne rien surveiller        */
    #define BATTCHECK       1
    #define BATTBIT         TIOCM_CTS
    #define BATTOK          HIGH

    /* INVERTERKILL vaut 1 pour gerer l'arret de l'onduleur   */
    /* INVERTERKILL vaut 0 pour ne rien gerer.                */
    /* INVERTERBIT est la ligne qui eteint l'onduleur en      */
    /*    mode powerfail.                                     */
    /* INVERTERTIME est la duree en secondes de maintien haut */
    /* de la ligne INVERTERBIT en haut pour eteindre.         */
    #define INVERTERKILL    1
    #define INVERTERBIT     TIOCM_RTS
    #define INVERTERTIME    5

    /************************************************************************/
    /* Fin du fichier unipowerd.c                                           */
    /************************************************************************/

    ffiicchhiieerr ggeennppoowweerrdd..hh
       Pour la nouvelle version du logiciel (_g_e_n_p_o_w_e_r_d), je pense qu'il
       faut ajouter la ligne suivante :

         /* Evgeny's Sustainer S-40A */
         {'sustainer', {TIOCM_DTR,0}, {TIOCM_RTS,1}, 5, {TIOCM_CAR,0}, {TIOCM_CTS,0},
         {0,0}}

 88..66..  SSyysstteell

 Une autre  entreprise  israelienne.   Je  ne  leur  ai  jamais  achete
 d'onduleur,  mais  il  m'ont  for aimablement fourni une documentation
 detaillee sur leur port  de  communication.   Il  devrait  etre  assez
 facile de controler leur onduleur.  Leur numero de telephone est :

 972-8-409-019 (fax 972-8-407-216).

 88..77..  DDeelltteecc PPoowweerr,, FFiisskkaarrss PPoowweerr SSyysstteemmss eett EExxiiddee

 Fiskars  est une holding finnoise, anciennement proprietaire de Deltec
 Power.  En mars 1996, Fiskars a vendu Deltec Power a Exide.   A  cette
 date, Deltec Power etait l'un des plus gros constructeurs d'onduleurs.

 Avec Fiskars, Deltec fabriquait les PowerServers 10, 20, 30 et 40.  La
 page web de Deltec Power en mentionne d'autres.

 Exide  joint maintenant un logiciel de controle avec ses onduleurs qui
 fonctionne sous Linux.   Ils  vendent  aussi  celui-ci  separement  et
 affirment qu'il fonctionne avec d'autres onduleurs aussi.

 J'aimerais avoir des nouvelles de gens qui utilisent ce logiciel.

 Voici l'annonce qu'ils m'ont envoyee par e-mail :

 Exide Electronics annonce Lansafe III, logiciel de gestion d'onduleurs
 sous Linux.

 Lansafe III est une application de gestion d'onduleurs.   Elle  permet
 l'arret  automatique du systeme en cas de coupure de courant de longue
 duree qui depasserait l'autonomie de la batterie de l'onduleur.

 Lansafe III permet les messages "broadcast" et  l'envoi  de  courriers
 electroniques  en  fonction  des  reglages  utilisateur.   La sequence
 d'arret peut aussi etre parametree.

 Lansafe III fonctionne avec la plus grande partie des onduleurs  Exide
 Electronics.   Il  permet  aussi  l'arret  automatique simple avec des
 onduleurs d'autres constructeurs.

 Lansafe III pour Linux fonctionne sur les systemes Linux a base Intel.
 Deux interfaces sont fournies : mode caracteres et X11/Motif.

 Lansafe III fonctionne sur toutes les plateformes majeures de systemes
 d'exploitation : Linux, IBM  AIX,  HP  UX,  Digital  Unix,  SCO  Unix,
 Solaris,  SunOS,  AT&T  Unix,  toutes  les  plateformes Windows, OS/2,
 Novell et Macintosh en particulier.

 Lansafe III est fourni avec les onduleurs Exide suivant :

 +o  OneUPS Plus ;

 +o  NetUPS ;

 +o  PowerWare Prestige ;

 +o  PowerWare Profile ;

 +o  PowerWare Plus 5xx.

 Il est aussi fourni avec les onduleurs FPS Power Systems :

 +o  PowerRite Plus ;

 +o  PowerRite Max ;

 +o  PowerWorks A30 ;

 +o  PowerWorks A40 ;

 +o  series 9 000 ;

 +o  series 10 000.

 Il est aussi possible d'acquerir une licence logicielle  separee  pour
 l'utilisation  d'un  onduleur  plus ancien ou d'un autre constructeur.
 Les  licences  simples  sont  a  USD  149,  des  licences  site   sont
 disponibles.

 Pour tout detail, visitez nos sites web : www.exide.com,

 www.fiskarsUPS.com et www.deltecpower.com

 Accessoirement,    lorsque    j'ai    tente    de   me   connecter   a
 www.fiskarsUPS.com, il m'a ete demande une identification et un mot de
 passe.

 88..88..  OOnndduulleeuurr BBeeaavveerr mmooddeellee UUBB550000

 Dan Fandrich ecrit :

 Je  pense  avoir  reussi a faire fonctionner mon vieil onduleur Beaver
 modele UB500  avec  genpower.   L'interface  utilise  des  niveaux  de
 tension  compatibles RS-232, donc l'installation est simple.  Ily a un
 connecteur DB-9 femelle a l'arriere qui se connecte  directement  dans
 un port serie DB-9 de PC a l'aide d'un cable droit.

 Les interrupteurs DIP permettent quelques ajustements.  Pour emuler le
 type d'onduleurs apc1-nt de genpower,  ils  doivent  etre  positionnes
 comme suit :
 +o  1 on (CTS = coupure de courant) ;

 +o  2 off (CTS = batterie faible) ;

 +o  3 off (DSR = coupure de courant) ;

 +o  4 off (DSR = batterie faible) ;

 +o  5 off (CD = coupure de courant) ;

 +o  6 on (CD = batterie faible) ;

 +o  7 off (RI = coupure de courant) ;

 +o  8 off (RI = batterie faible) ;

 +o  9 on (DTR = extinction) ;

 +o  10 off (RTS = extinction).

 Les interrupteurs forment des groupes de paires adjacentes pour chaque
 broche de sortie.  Ils sont exclusifs mutuellement - ne tentez pas  de
 positionner  ON  les  5  et  6 ensemble, par exemple, ou vous ferez un
 court-circuit entre les signaux coupure de courant et batterie faible.

 C'est  tout  ce  qu'il  y  a a dire.  Vous pouvez ajouter cela a votre
 documentation.

 88..99..  SSeennddoomm

 Charli ecrit :

 J'ai connecte un onduleur Seldom avec powerd.  Peut-etre  que  ce  qui
 suit sera utile avec d'autres onduleurs.

 J'ai utilise le diagramme de la page de man de _p_o_w_e_r_d :

            9 broches  25 broches

      DTR       4         20       ----------
                                    |       >
      DSR       6          6       --       < 10k
                                            >
      DCD       1          8       -------------------
                                                  relais
      GND       5          7       -------------------

 En  fait, l'onduleur seldom n'utilise pas de relais mais quelque chose
 d'autre et fonctionne dans un sens, _m_a_i_s _p_a_s _d_a_n_s _l_'_a_u_t_r_e.  Si donc le
 cable ne fonctionne pas, il faut essayer d'inverser les broches sur le
 "relais".

 88..1100..  BBeesstt

 L'information sur les onduleurs Best est disponible sur le site web de
 Best  Power.   Leur  site  contient  un paquetage checkup.tar (section
 ``Logiciels'') de communication avec leurs onduleurs,  aussi  bien  en
 modes  intelligent  que  bate, fourni en sources, donc compilable sous
 Linux.

    BBeesstt FFoorrttrreessss aavveecc llee llooggiicciieell ddee BBeesstt
       Mini-Howto des onduleurs Best Power

       par Michael Stutz et http://dsl.org/m.

       Version 1.0, 14 aout 1997

 88..1100..11..  AAvveerrttiisssseemmeenntt

 Copyright 1997 Michael Stutz (-- NdT : la traduction de ce  paragraphe
 est  fournie  a  titre indicatif au lecteur.  Se reporter a la version
 originale pour les termes exacts.--)  ; cette information est libre  ;
 elle  peut  etre  redistribuee  et/ou  modifiee selon les termes de la
 Licence Publique Generale GNU (GPL) version 2 ou (a votre  preference)
 ulterieure,  pour autant que la presente phrase soit conservee ; cette
 information est fournie SANS AUCUNE GARANTIE ; sans meme  de  garantie
 implicite  d'adaptation a un besoin particulier ; se reporter a la GPL
 de GNU pour plus de details.

 88..1100..22..  IInnttrroodduuccttiioonn

 Best Power est constructeur d'onduleurs  de  haute  qualite,  et  leur
 serie  Fortress  est  particulierement bien adaptee a des utilisateurs
 habituels de Linux.  Bien que ses produits ne soient actuellement  pas
 aussi  bon  marche  que certains autres (comme ceux d'APC), Best Power
 fournit le code source de son logiciel et a ete tres reactif quant aux
 questions posees par des utilisateurs de Linux.  De plus, son materiel
 semble choisi souvent par les consommateurs, ce qui  en  fait  un  bon
 choix pour les utilisateurs de Linux.

 Ce  document  decrit  l'installation d'un onduleur Best Power Fortress
 (le modele utilise est un 660a de 1996 accompagne de son  CD-ROM)  sur
 une machine Linux.

 88..1100..33..  IInnssttaallllaattiioonn

 88..1100..33..11..  MMaatteerriieell

 Installez  l'onduleur  comme indique par les instructions.  Les series
 _F_o_r_t_r_e_s_s de Best Power sont fournies avec un cable  RS-232  destine  a
 etre connecte a un port serie libre a l'ariere de l'ordinateur.

 88..1100..33..22..  LLooggiicciieell

 Voici  ce  qui  differe  du  manuel,  qui ne contient pas actuellement
 d'instructions  specifiques  pour  Linux.   En  revanche,  le   CD-ROM
 d'accompagnement   conient   avec   le  code  source  du  logiciel  de
 l'onduleur, ce qui en rend la mise en  oeuvre triviale.

 Pour realiser celle-ci, suivez les etapes ci-dessous, et  utilisez  le
 manuel   comme   reference  pour  avoir  une  vue  d'ensemble  sur  le
 fonctionnement general du logiciel.  J'ai pris  la  liberte  de  faire
 quelques  modifications dans ce HOWTO sur la configuration du logiciel
 _F_o_r_t_r_e_s_s pour Unix d'une maniere qui  me  semble  plus  adaptee  a  un
 systeme Linux.  Par exemple, j'ai elimine la necessite d'un repertoire
 /etc/best, et place les executables dans /usr/local/bin qui me  semble
 un endroit plus approprie.

 +o  D'abord, creez le script "upsdown" destine a etre execute lors d'un
    arret secteur.  Celui-ci va arreter le systeme :

      cat > /etc/upsdown <<EOF
      #!/bin/sh
      shutdown -h now < /dev/console &
      EOF

 +o  Maintenant, creez les repertoires pour la documentation et le  code
    source :

      mkdir /usr/doc/best
      mkdir /usr/local/src/best

 +o  Montez  le CD-ROM, et desarchivez le fichier unix/checkups.tar dans
    un repertoire temporaire :

      cd /tmp
      tar /cdrom/unix/checkups.tar

 +o  Allez dans le repertoire etc/best/advanced qui doit avoir ete  cree
    dans le repertoire temporaire a partir de l'archive ;

 +o  Copiez la documentation et les fichiers script a leurs emplacements
    idoines dans le systeme :

      cp README /usr/doc/best
      cp manual.txt /usr/doc/best
      cp bestsend /etc
      cp source/*.c /usr/local/src/best

 +o  Nettoyez le chantier dans le repertoire temporaire et  compilez  le
    logiciel :

 cd /usr/local/src/best
 rm -R /tmp/etc
 gcc -o checkups checkups.c
 gcc -o mftalk mftalk.c
 mv checkups /usr/local/sbin
 mv mftalk /usr/local/sbin

 +o  Testez  l'onduleur.   Remplacez  ttySx  par  le port serie de votre
    choix.  Si votre connexion est bonne, vous devriez voir  une  ligne
    de caraceres s'imprimer a l'ecran :

      mftalk /dev/ttySx

 +o  Rendez  le  programme  checkups  executable  au  demarrage  pour le
    tester.  Cela peut etre realise d'un  certain  nombre  de  manieres
    differents  (decrites  dans  le  manuel).   Celle que j'ai utilisee
    consiste a ajouter une ligne dans /etc/inittab :

      ups:234:once:/usr/local/sbin/checkups -c500 /dev/ttyS1

 +o  Testez le tout.  Supprimez l'alimentation secteur de l'onduleur  en
    retirant  le  fusible  de l'onduleur, et attendez quelques minutes.
    Le logiciel affiche un message  d'alerte  puis  arrete  le  systeme
    apres quelques instants.

 +o  Si  cela  fonctionne,  retirez  l'option -c500 de la ligne de votre
    inittab (qui en gros implique d'arreter le systeme systematiquement
    au  lieu  de ne le faire que lorsque le courant est coupe), et vous
    pouvez rouler !

 88..1100..33..33..  CCoonncclluussiioonn

 Toute suggestion permettant d'ameliorer ce document ou les  techniques
 qui  y  sont  decrites  est  la bienvenue.  A l'instant ou j'ecris ces
 lignes, _B_e_s_t _P_o_w_e_r semblait interesse par l'inclusion de  la  presente
 information   ou   d'une   autre  dans  la  sienne  afin  d'aider  les
 utilisateurs de Linux par rapport  a  ses  produits,  il  s'agit  donc
 reellement d'une entreprise a promouvoir.  Vous pouvez lui transmettre
 vos impressions a [email protected] et [email protected].

    BBeesstt FFoorrttrreessss LLII--995500

       Quelques commentaires  sur  le  _B_e_s_t  _F_o_r_t_r_e_s_s,  de  Leonard  N.
       Zubkoff,  message du 25 mai 1995 dans comp.os.linux.hardware (--
       (NdT : le texte qui suit a ete reformate. Le document  d'origine
       comporte une copie de message de forum)--)

        :
       Citation de [email protected] :

       D'accord  avec ce que dit Craig.  APC a ete tres peu cooperatif,
       mais je n'ai que de bonnes choses a dire  sur  Best.   J'utilise
       son modele LI 660 ; 660 VA, des tas d'indications sur le panneau
       frontal, etc.  Le logiciel CheckUPS est  en  option  payante  et
       necessite quelques bidouillages pour entrer dans mons systeme de
       fichiers FSSTND-ise (NdT : File System STaNDard, le standard  de
       repartition  des  elements  dans  les repertoires preconise pour
       Linux) (les repertoires et noms de fichiers  sont  en  dur  pour
       SunOS  4.1.x).   Je  serai heureux de vous envoyer mes diffs, si
       vous les voulez (j'adore quand un constructeur fournit le source
       en tant que pratique commerciale normale !!).

       Le  logiciel  CheckUPS  est  limite,  cependant,  a realiser des
       arrets automagiques (NdT : automagic dans le texte).  L'onduleur
       peut  fournir  des tas d'informations sur son etat ; CheckUPS ne
       controle que "Si le courant est coupe, combien de  temps  reste-
       t'il d'autonomie a la batterie ?".

       Best  suit  aussi  ses  questionnaires  de satisfaction clients.
       J'ai indique ma deception que CheckUPS ne dispose pas de plus de
       fonctions  d'interrogation  (comme  le  voltage  en  entree,  en
       sortie, le pourcentage de charge, etc.) qui sont disponibles  en
       entree.   J'ai  demande  les specifications de l'interface ; ils
       ont  dit  :  "bien  sur"  et  me  l'ont  envoye  en   2   jours,
       gracieusement.   Un  controleur d'etat de l'onduleur complet est
       dans ma casserole de derriere.  Quelqu'un voit-il une utilite  a
       ce genre d'utilitaire ?

       Reponse de Leonard N. Zubkoff :

       Laissez-moi  ajouter  une  autre recommandation pour Best Power.
       Je viens d'acheter un Fortress LI-950, mais  j'ai  decline  leur
       offre  logicielle  pour  CheckUPS.   Contrairement  a  certaines
       autres gammes, un simple cable trois fils suffit a connecter  le
       Fortress  a  un  port serie -- pas besoin de montage "pull-up" a
       faire dans le cable.  Quelques minutes de bidouillage et j'avais
       un  programme  qui  fait a la fois daemon d'arret systeme et qui
       coupe le courant de sortie ensuite lorsque le systeme est arrete
       durant une periode sur batterie.

       Je  pourrais  eventuellement  utiliser le mode de communications
       serie plus intelligent plutot que le simple mode de contact,  et
       j'ai donc demande la documentation au support technique de Best,
       et il est arrive  aujourd'hui,  une  semaine  apres  mon  appel.
       Apres  avoir etudie celle-ci, je deciderai si une interface plus
       intelligente est reellement interessante, en particulier puisque
       dans  certains  cas  j'aurais  besoin d'arreter deux machines en
       reseau partageant l'onduleur.

       Leonard.

    BBeesstt FFeerrrruuppss

       En complement a la documentation et au logiciel sur le site  web
       de    _B_e_s_t,    vous   pouvez   aussi   utiliser   le   paquetage
       bestups-0.9.tar.gz (section  ``Logiciel'').   Nous  avons  juste
       commence a le tester avec notre _F_e_r_r_u_p_s 5 kVA.

       L'idee  de base est qu'il y a deux modules.  L'un qui recoit des
       demandes d'information du port reseau, les relaie a  l'onduleur,
       et  renvoit  les  resultats.  Le second module parle au premier,
       interprete les resultats, et repond OK ou FAIL.

       C'est suffisant pour que le paquetage powerd-2.0.tar.gz (section
       ``Logiciel'') fasse le reste.

       Les details se trouvent dans le paquetage lui-meme.

       Par  ailleurs,  notre  _F_e_r_r_u_p_s  5 kVA a fonctionne sans histoire
       pour nos 10 ordinateurs et  30 ecrans.

 88..1111..  GGPPSS11000000 dd''AACCCCOODDAATTAA

    >From [email protected] Thu Mar 10 15:10:22 1994
    Newsgroups: comp.os.linux.help
    Subject: Re: shutdown automatique avec un onduleur
    From: [email protected] (Hennus Bergman)
    Date: Tue, 1 Mar 1994 22:17:45 GMT
    Distribution: world
    Organization: The Organization For Removal Of On-Screen Logos

    Dans l'article <[email protected]>,
    Colin Owen Rafferty <[email protected]> ecrit :
    >Je suis pret a acheter un onduleur pour ma machine, et j'en
    >voudrais un qui sache faire un "auto-shutdown".
    >
    Je viens d'en acheter un vraiment pas cher :-)
    C'est un GPS1000 d'ACCODATA. Tout le monde connait la bonne qualite
    de leur production (je n'ai pas d'actions chez eux :-() ?

    >Je suppose que tous ont une sorte de connexion serie qui previent le
    >systeme de cela.
    >
    Je l'ai pris a part pour trouver comment il fonctionnait. Il y avait
    trois optocoupleurs (deux sorties, une entree) connectes sur un connecteur
    a 9 broches a l'arriere. L'un s'allume lorsque le courant est coupe, et
    s'eteint lorsque ce dernier revient. Durant ce temps, on peut utiliser
    l'"entree" pour arreter la batterie (il relache le relais de puissance).
    Le troisieme est une sorte d'acquittement de la commande d'arret. Je
    pense que l'interface de mon onduleur a ete concue pour etre connectee
    a des niveaux TTL, mais avec quelques resistances il peut etre connecte a
    un port serie. Il est branche de telle sorte qu'avec un port RS-232 on
    ne puisse utiliser les deux optocoupleurs de sortie; mais l'acquittement
    de la commande d'arret n'est pas vraiment necessaire. On peut se conten-
    ter de celui qui est important (Notez qu'il est possible de faire fumer
    la partie transistor des optocoupleurs avec des niveaux RS-232 si on
    le branche mal). ;-)

    J'esperais etre capable de le connecter a mon port de jeux inutilise,
    mais ce dernier n'a pas de sortie, n'est-ce pas_?
    Je vais probablement finir par mettre un port parallele supplementaire
    pour ca.

    Tous les onduleurs n'utilisent pas d'optocoupleurs, certains se contentent
    de simple relais, qui sont moins difficiles a connecter, mais bien sur,
    pas aussi `elegants'.

    >Quelqu'un a-t-il ecrit un paquetage qui surveille l'onduleur et effectue
    >un shutdown (ou similaire) lorsque le courant s'arrete ?
    SysVinit-2.4 (et probablement 2.5 aussi bien) a un demon `powerd' qui
    surveille le port serie en continu et previent init quand CD (Detection
    de porteuse) tombe. Init active ensuite un shutdown avec un delai. Si le
    courant revient apres quelques minutes, le shutdown est arrete. Tres beau.
    Le seul probleme que j'aie eu avec est qu'il ne dit pas a l'onduleur de
    s'arreter lorsque le shutdown est fini. Il attend simplement la avec une
    invite root. Je vais probablement ecrire un petit programme pour l'arreter
    >depuis /etc/brc. RSN.

    >    Colin Rafferty, Lehman Brothers <[email protected]>

    Hennus Bergman

 88..1122..  TTrriippppLLiittee BBCC775500LLAANN ((SSttaannddbbyy UUPPSS))

 Tom  Webster,  l'auteur  du  paquetage  _g_e_n_p_o_w_e_r,   m'a   envoye   des
 informations  sur  le  _T_r_i_p_p_L_i_t_e  _B_C_7_5_0_L_A_N.  Si vous avez l'un d'entre
 eux, c'est probablement le meilleur paquetage pour commencer.

 Mais pour etre exhaustif, voici le  diagramme  de  brochage  du  cable
 (realise par tatonnements, et sans documentation) :

             Onduleur              Systeme
               DB-25               DB-25
                 1 <-------------->  1       Masse

                 2 <-------------->  4       Coupure de secteur
                 8 <-------------->  8       Circuit de detection

                 3 <-------------->  2       Inverseur d'arret
                20 <--------------> 22       Circuit

 88..1133..  AAPPCC

 Si  la  plethore  de  paquetages  pour  APC  cites  plus  haut ne vous
 permettent pas de demarrer, il est possible que la  section  qui  suit
 soit d'une certaine utilite.

    BBaacckkuupp--UUPPSS

       Il  semble qu'il y ait une certaine controverse sur la fiabilite
       des informations indiquees ici sur les APC Back-UPS, donc, soyez
       prudent.    Je   preface   cette   section   avec   un   message
       d'avertissement que j'ai recu.  Il peut ne pas prendre tout  son
       sens  tant  que le reste de la section n'est pas lu, mais ainsi,
       au moins vous aves plus de chances de le voir.  Et,  a  nouveau,
       comme  je  n'ai  aucun  onduleur  APC,  je  ne  peux verifier la
       fiabilite d'aucun de ces messages.

    UUnn mmeessssaaggee dd''aavveerrttiisssseemmeenntt

       Message de Marek Michalkiewicz sur le BUPS-HOWTO (-- (NdT  :  le
       texte  qui  suit a ete reformate. Le document d'origine comporte
       une copie de courrier electronique)--)

        :

       Si vous voulez connecter un  onduleur  APC  Back-UPS  sur  votre
       machine Linux, ce qui suit peut vous interesser.

       Il  y  a un bon BUPS-HOWTO qui decrit comment le faire.  Mais il
       comporte un "bug".

       Le signal RTS du port serie est utilise pour arreter l'onduleur.
       Celui-ci  ne  s'arretera  que  s'il  travaille sur batterie.  Le
       manuel indique que le le signal  d'arret  doit  durer  au  moins
       0,5ms.  Mais un temps inferieur est suffisant, au moins pour mon
       propre APC Back-UPS 600.

       L'utilisation de RTS peut etre dangereuse, car  ce  dernier  est
       monte  a  l'ouverture du peripherique.  Le programme backupsd le
       redescend ensuite, mais il reste haut un moment.  Cela coupe  le
       courant  lors  du  premier  lancement  de  backupsd s'il y a une
       coupure secteur a ce  moment  precis.   Cela  peut  arriver  par
       exemple  si  l'onduleur  est  eteint, et que le courant revienne
       seulement pour un moment.

       Soit il faut lancer backupsd avant de  monter  les  systemes  de
       fichiers  en  lecture/ecriture, soit (de preference) utiliser TX
       (broche 3) plutot que RTS (broche 7)  pour  eteindre  l'onduleur
       (la  numerotation est pour un DB-9).  On peut utiliser ioctl(fd,
       TCSBRKP, 10); pour monter TX pendant une seconde,  par  exemple.
       L'utilisation  de TX doit etre plus sure.  Je posterai peut-etre
       les diff si le temps me le permet...

    BBUUPPSS--HHOOWWTTOO

       Luminated Software Group Presente

       HOWTO utilisation d'onduleurs _B_a_c_k_-_U_P_S  (d'_A_P_C)  (pour  proteger
       votre systeme Linux)

       Version: 1.01  BETA

       Document  de : Christian G. Holtje Information sur le cablage et
       aide : Ben Galliart

       Adaptation francaise : Bernard Choppy

       Ce document est place dans le Domaine Public  a  une  condition.
       Celle-ci  est  que  ce  qui appartient a Cesar revienne a Cesar.
       Modifiez ceci autant que vous voulez, rappelez  juste  que  nous
       avons travaille dessus.

       AAtttteennttiioonn !!

       Ni  moi, ni aucun de ceux qui on ecrit ou aide a ce document, ne
       garantissons    quoi    que    ce    soit     concernant     ces
       textes/sources/indications.   Si quoi que ce soit est endommage,
       nous n'y sommes POUR RIEN !  Cela  fonctionne  POUR  AUTANT  QUE
       NOUS  LE  SACHIONS,  mais  nous  pouvons avoir fait des erreurs.
       Donc, soyez prudent !

       (-- NdT : Le  document  d'origine  contient  des  references  de
       pieces  detachees  Radio-Shack,  qui  etaient distribuees par le
       reseau Tandy  en  France.   Ce  reseau  n'existe  plus,  et  les
       references  ont donc ete supprimees de la version francaise.  Le
       lecteur neammoins interesse pourra  se  reporter  a  la  version
       anglaise du present document.--)

       Bien,  vous  venez  juste  d'acheter (ou vous allez le faire) un
       _B_a_c_k_-_U_P_S d'_A_P_C (d'autres modeles pourront  peut-etre  beneficier
       de ces informations, avec peu ou pas de modifications, mais nous
       ne savons pas).  Vous avez jete un coup d'oeil au prix du couple
       logiciel/cable  _P_o_w_e_r_-_C_h_u_t_e,  et  n'etes  pas  sur que le jeu en
       vaille la chandelle.  Bien, j'ai fait mon propre cable,  et  mon
       propre  logiciel  et je les utilise pour arreter automatiquement
       mon systeme Linux lors d'une coupure secteur.  Vous savez quoi ?
       Vous pouvez aussi !

       *** Le Cable ***
       C'etait  la  partie la plus difficile a imaginer (je m'y connais
       peu en hardware, donc Ben a fait le plus gros du travail).  Pour
       en  fabriquer  un,  vous  devez  acheter  ce qui suit chez votre
       marchand d'electronique du coin :

    +o  1 connecteur a souder subminiature male DB-9 ;

    +o  1 connecteur a souder subminiature femelle DB-9 ;

    +o  2 boitiers pour les connecteurs ci-dessus (vendus separement  en
       general) ;

    +o  Du cable multi-brins (pas du mono-brin).

       Il vous faut aussi, mais vous pourrez peut-etre l'emprunter :

    +o  un fer a souder ;

    +o  de la soudure.

       Ok...  Voici comment connecter le tout !

       Ces  diagrammes  montrent  le cote ARRIERE (celui ou vous soudez
       les cables sur les broches).  Les lettres V, R et B representent
       les  couleurs  des  cables  que  j'ai utilises, et facilitent la
       distinction des lignes (-- (Note  :  j'utilise  la  numerotation
       standard RS-232 (pour autant qu'on puisse dire)--)

       Le   manuel   de  l'_A_P_C  utilise  une  numerotation  differente.
       Ignorez-la !  Utilisez la notre...  Je l'ai  deja  changee  pour
       vous !).

            ---------------------     Cote Male (vers l'onduleur)
             \  B   R  *  *  * /
               \  *  *  *  V  /
                 ------------

            ---------------------     Cote femelle (vers le port COM)
             \  R   *  *  *  V /
               \  *  B  *  *  /
                 ------------

    Pour ceux qui preferent les chiffres :

               Male         Femelle
         ---------------------------------------
                 1             7        Bleu
                 2             1        Rouge
                 9             5        Vert

    ----  Complement  :  Utilisation  des broches RS-232 ! ---- Puisque
    nous avons eu a trouver cette information :

    Depuis  l'ARRIERE  (cote  soudure),  les  broches  sont  numerotees
    ainsi :

            ---------------------
             \  1   2  3  4  5 /
               \  6  7  8  9  /
                 ------------

    Les broches signifient

                 Numero  Nom                     Abreviation (parfois prefixee par D)
                 1       Detection de porteuse           CD
                 2       Reception de donnees            RD
                 3       Transmission de donnees         TD(?)
                 4       Terminal de donnees pret        DTR
                 5       Masse de signal                 Gnd
                 6       Jeu de donnees pret             DSR
                 7       Demande pour envoyer            RTS(?)
                 8       Pret a envoyer                  CS
                 9       Indicateur de sonnerie          RI

    Ce  que  nous  avons  fait etait la connexion de la ligne RS-232 de
    l'onduleur "Fail Output" sur CD, le chassis de l'onduleur sur  Gnd,
    et  l'entree "Shut Down" sur RTS.  Facile, maintenant qu'on vous le
    dit, non ?

    Je n'ai aucune idee du comportement du logiciel ci-dessous, si vous
    achetez le cable d'APC.  Il peut fonctionner, ou non.

    *** Le Logiciel ***

    J'utilise  le  paquetage  _S_y_s_V_I_n_i_t  de  Miquel van Smoorenburg pour
    Linux (voir a la fin pour emplacements, remerciements, adresses  E-
    mail,  etc.).   Je  ne  sais  ce qui doit etre change pour utiliser
    l'init de quelqu'un d'autre, mais je sais que ce  code  (qui  suit)
    fonctionne  avec  celui  de  Miquel.   Simplement ainsi je remercie
    comme je le dois.   J'ai  regarde  dans  le  code  de  Miquel  pour
    comprendre  comment ioctl() fonctionnait.  Si je n'avais pas eu cet
    exemple, j'aurais eu des problemes.  J'ai aussi utilise la  routine
    powerfail()  (telle  quelle,  je crois), puisqu'elle doit interagir
    avec init, j'ai pense qu'il devait savoir ca  mieux  que  moi.   Le
    fichier  .c  est  a  la  fin de ce document, et necessite seulement
    d'etre copie/colle.  Pour cela, supprimez simplement  tout  ce  qui
    n'est  pas  du  code.  Ce document doit se terminer par la ligne /*
    Fin de Fichier */...  Coupez le reste.

    Ce programme peut, soit etre  lance  comme  daemon  pour  controler
    l'etat  de  l'onduleur  et  l'indiquer a init, soit etre lance pour
    envoyer  la  commande   kill-power   (coupure   d'alimentation)   a
    l'onduleur.  L'alimentation ne sera coupee que s'il y a un probleme
    secteur et que l'onduleur est sur batteries.  Une fois  le  courant
    revenu, il se rallume.

    Pour le lancer comme demon, entrez simplement :

    backupsd /dev/backups

    /dev/backups  est un lien vers /dev/cua0 (COM 1, pour les DOSseurs)
    actuellement.  La beaute du lien est que je n'ai qu'a le refaire si
    je passe sur COM 2 ou COM 3.

    Ensuite,  si  le  secteur  s'arrete,  init lancera les commandes de
    powerwait.  Un exemple (qui vient de mon /etc/inittab) :

         #Voici les actions de coupure de courant
         pf::powerwait:/etc/rc.d/rc.power start
         po::powerokwait:/etc/rc.d/rc.power stop

    Powerwait sera lance si le  courant  baisse,  et  powerokwait  s'il
    revient.

    Voici mon rc.power complet :

         ___________________________________________________________________
         #! /bin/sh
         #
         # rc.power      Ce fichier est execute par init en cas de coupure de courant
         #
         # Version :     @(#)/etc/rc.d/rc.power   1.50    1994-08-10
         #
         # Auteur :      Christian Holtje, <[email protected]>
         #

           # Definit le chemin
           PATH=/sbin:/etc:/bin:/usr/bin:/sbin/dangerous

           # Regarde comment nous avons ete appele
           case "$1" in
                 start)
                         echo "Attention - probleme d'alimentation secteur." | wall
                         # Sauvegarde le niveau de fonctionnement actuel
                         ps | gawk '{ if (($5 == "init") && ($1 == "1")) print $6 }' \
                                  | cut -f2 -d[ | cut -f1 -d] \
                                  > /tmp/run.level.power
                         /sbin/shutdown -h +1m
                         ;;
                 stop)
                         echo "Alimentation secteur revenue." | wall
                         echo "Tentative d'arret du shutdown." | wall
                         shutdown -c
                         ;;
                 *)
                         echo "Usage:  $0 [start|stop]"
                         exit 1
                         ;;
           esac
         ___________________________________________________________________

    Pas  mal,  non ?  En fait, il y a un petit probleme, la...  Je n'ai
    pas eu le temps de le trouver...  S'il  y  a  un  gourou  "sh"  par
    ici...

    J'ai  laisse  un  petit  detail  de  cote,  c'est  de  faire couper
    l'alimentation par l'onduleur si le PC est  arrete  courant  coupe.
    Cela  est  realise  en ajoutant la ligne suivante a la fin de votre
    script halt :

           /sbin/backupsd /dev/backups killpower

    Cela va simplement couper l'alimentation si le secteur est coupe.

    *** Tester le tout ***

    C'est juste une petite section pour vous dire :

    SOYEZ PRUDENT !

    Je vous recommande la sauvegarde  de  vos  partitions  Linux,  avec
    plusieurs  sync  avant  de  tester,  et  d'etre prudent en general.
    Evidemment, je ne fais que vous le recommander.  Je  n'ai  pas  ete
    prudent  du tout, et j'ai eu a nettoyer ma partition plusieurs fois
    pendant les tests de ma configuration.  Mais  celle-ci  fonctionne.
    :-)

    *** Ou l'obtenir ***

    Le  SysVInit  de  Miquel  van  Smoorenburg's  peut se trouver sur :
    SysVinit-2.50.tgz

    et une correction pour certains shell bash se trouve juste a cote :
    SysVinit-2.50.patch1

    Pour  ce  qui  est  d'obtenir ce HOWTO, vous pouvez m'envoyer un E-
    mail, [email protected] avec pour sujet :'request'  et  le  mot-clef
    'backups'  dans le corps du message : Demande du HOWTO original (il
    est possible que j'automatise cela, et d'autres choses).

    *** Section des remerciements qui sont dus ***

    Merci a :

    +o  Miquel van Smoorenburg pour son superbe  paquetage  _S_y_s_V_I_n_i_t  et
       son powerd.c qui m'ont beaucoup aides ;

    +o  Christian  Holtje  Documentation backupsd.c (ce qui n'est pas de
       Miquel) rc.power ;

    +o  Ben Galliart Le cable, informations sur le  standard  RS-232  et
       astuces bruyantes (non rapportees ici).

    ___________________________________________________________________
    /*  backupsd.c -- Simple daemon pour lire les signaux de coupure de
     *                courant d'un onduleur Back-UPS (d'APC).
     *
     *  Certaines parties proviennent du powerd.c de Miquel van Smoorenburg
     *  D'autres sont originales de Christian Holtje <[email protected]>
     *  Je crois qu'on peut dire que c'est dans le Domaine Public, simplement
     *  n'oubliez pas de citer les auteurs originaux, la ou c'est necessaire.
     *
     *  Avertissement : Nous ne garantissons RIEN de ce logiciel, ni
     *                  n'assumons aucune responsabilite concernant son
     *                  utilisation, bonne ou mauvaise.
     */

    #include <sys/types.h>
    #include <sys/ioctl.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <signal.h>

    /* C'est le fichier necessaire pour SysVInit */
    #define PWRSTAT         "/etc/powerstatus"

    void powerfail(int fail);

    /* Programme principal */
    int main(int argc, char **argv)
    {
      int fd;
      int killpwr_bit = TIOCM_RTS;
      int flags;
      int status, oldstat = -1;
      int count = 0;

      if (argc < 2) {
            fprintf(stderr, "Usage: %s <peripherique> [killpower]\n", argv[0]);
            exit(1);
      }

      /* Ouverture du port */
      if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
            fprintf(stderr, "%s : %s : %s\n", argv[0], argv[1], sys_errlist[errno]);
            exit(1);
      }

      if ( argc >= 3  && (strcmp(argv[2], "killpower")==0) )
          {
              /* Coupons l'alimentation */
              fprintf(stderr, "%s : Tentative de coupure d'alimentation !\n",
                      argv[0] );
              ioctl(fd, TIOCMBIS, &killpwr_bit);
              /* Hmmm... Si vous avez une coupure d'alimentation, */
              /* ce code ne sera jamais execute */
              exit(0);
          }
      else
          /* Puisqu'il ne faut pas couper l'alimentation, il faut restaurer */
          /* RTS (killpwr_bit) */
          ioctl(fd, TIOCMBIC, &killpwr_bit);

    /* Passe en demon. */
      switch(fork()) {
      case 0: /* Je suis le fils */
                    setsid();
                    break;
      case -1: /* Passage demon manque */
                    fprintf(stderr, "%s : fork impossible.\n", argv[0]);
                    exit(1);
      default: /* Je suis le pere */
                    exit(0);
      }

      /* Maintenant, on scrute la ligne DCD */
      while(1) {
          ioctl(fd, TIOCMGET, &flags);
          status = (flags & TIOCM_CD);
          /* Si DCD est monte, le secteur est coupe */
          if (oldstat == 0 && status != 0) {
              count++;
              if (count > 3) powerfail(0);
              else { sleep(1); continue; }
          }
          /* Si DCD est redescendu, le secteur est revenu */
          if (oldstat > 0 && status == 0) {
              count++;
              if (count > 3) powerfail(1);
              else { sleep(1); continue; }
          }
          /* Reinit du compteur, sauvegarde de l'etat et sleep 2 secondes */
          count = 0;
          oldstat = status;
          sleep(2);
      }
      /* Erreur ! (ne doit pas arriver) */
      return(1);
    }

    /* Signale a init que le courant est coupe ou revenu */
    void powerfail(ok)
    int ok;
    {
      int fd;

      /* Cree le fichier necessaire a init pour shutdown/abandon */
      unlink(PWRSTAT);
      if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
            if (ok)
                    write(fd, "OK\n", 3);
            else
                    write(fd, "FAIL\n", 5);
            close(fd);
      }
      kill(1, SIGPWR);
    }

    /* Fin de Fichier */
    ___________________________________________________________________

    AAuuttrreess iinnffoorrmmaattiioonnss
       (-- (NdT : Le document original comporte de nombreuses copies de
       courriers electroniques a ce point. Le traducteur  s'est  permis
       d'en  realiser  une  synthese  plus courte et, il l'espere, plus
       facile a utiliser)--)

       Message   de   Jim   Ockers   du   12    janvier    1995    dans
       comp.os.linux.hardware :

       Selon  la base de connaissances (_K_n_o_w_l_e_d_g_e_B_a_s_e) de _M_i_c_r_o_s_o_f_t, il
       semble que la broche 5 du connecteur des onduleurs _A_P_C  _B_a_c_k_-_U_P_S
       et  _S_m_a_r_t_-_U_P_S (teste avec un _B_a_c_k_-_U_P_S _4_0_0 sous _W_i_n_d_o_w_s _N_T) monte
       un  signal  "batterie  faible"  deux  minutes  au  moins   avant
       l'epuisement de la batterie.

       Ce  signal  est  au niveau "TTL collecteur ouvert", et peut etre
       ramene aux niveaux RS-232 selon le schema suivant :

             Broche 5                 Broche 8
                       +---------+
                o------| 10 kOhm |-------o
                       +---------+

    Par ailleurs, le manuel de l'onduleur stipule que la broche commune
    a  utiliser est la 4 (et non la 9, meme si celles-ci sont branchees
    ensemble).

    Message de Peter Kammer du 7 octobre 1996 :

    Les schemas de brochage  sont  inverses  en  ce  qui  concerne  les
    connecteurs  males  :  en  effet,  les  broches  sont numerotees de
    maniere inverse sur les  connecteurs  males  et  femelles  (puisque
    leurs sens s'opposent lors du brancement).  Il faut donc considerer
    que les schemas pour les connecteurs males sont vus cote  exterieur
    et  non  cote  interieur  (soudure),  contrairement  a  ce  qui est
    indique.

    Par ailleurs, il existe un document de reference technique pour les
    onduleurs _B_a_c_k_-_U_P_S qui se trouve sur le site web d'_A_P_C.

    Message de Troy Muller du 6 avril 1997 :

    L'onduleur  _B_a_c_k_-_U_P_S  _P_r_o  _6_5_0  fonctionne  avec  le cable standard
    d'_A_P_C.  La reference du  cable  est  940-023A  et  le  logicel  est
    _E_n_h_a_n_c_e_d___A_P_C___B_a_c_k_U_P_S.   Ce  logiciel  envoit  des  messages globaux
    toutes les deux secondes, mais un eu de  bidouillage  de  dowalll.c
    permet de limiter cette fonction.

    AAPPCC SSmmaarrtt--UUPPSS

       De  nombreuses  personnes ont un APC Smart UPS.  Il semble qu'il
       existe  des   paquetages   pour   utiliser   ceux-ci   en   mode
       "intelligent"   (voir   les   paquetages  mentionnes  plus  haut
       Enhanced_APC_UPSD-v1.4.tar.gz,        apcd-0.5.tar.gz         et
       smupsd-0.7-1.i386.rpm  decrits  dans  la section ``Logiciels'').
       Je ne sais pas ce que vaut le support  pour  chacun  d'eux.   Il
       semble  qu'_A_P_C  ccoonnttiinnuuee a refuser de publier son protocole pour
       le mode "intelligent" sans un  accord  de  non-diffusion,  ainsi
       tout le monde a du faire de la retro-ingenierie dessus.

       Le  consensus  general  est  d'investr dans une gamme qui publie
       cette information, comme _B_e_s_t.

       Une autre possibilite est d'utiliser la version du  logiciel  de
       controle  d'onduleurs  _P_o_w_e_r_c_h_u_t_e  d'_A_P_C  pour  _S_C_O  _U_n_i_x via le
       paquetage de compatibilite _i_B_C_S.  Clive A. Stubbings me dit  que
       cela  fonctionne  bien  apres  quelques  ajustements  du  script
       d'installation.   Il  dit  que  le   seul   probleme   est   que
       "l'interface  graphique  semble  avoir des problemes a controler
       des onduleurs a-travers le reseau".

       Si vous possedez un _A_P_C _S_m_a_r_t_-_U_P_S et que vous n'arriviez  pas  a
       le  faire  fonctionner  en  mode  intelligent  avec aucun de ces
       logiciels, vous pouvez malgre tout  encore  l'utiliser  en  mode
       bete.   Les  sections  qui  suivent  detaillent cette procedure.
       J'ai recu, en particulier, des messages concernant  les  modeles
       _6_0_0,  _7_0_0  et  _1_4_0_0.   Il  vous  faudra  probablement bidouiller
       powerd.c comme indique dans la section ``Analyse  de  cables  et
       modification de powerd.c''.

       Message de Lam Dang du 19 aout 1994 dans comp.os.lnux.misc :

       Realisation du cable pour un _A_P_C _S_m_a_r_t_-_U_P_S _m_o_d_e_l_e _6_0_0.

       Le  cable  est  a  realiser entre un connecteur DB-9 femelle sur
       l'onduleur et un DB-25 male sur  l'ordinateur.   Le  boitier  du
       DB-25  est assez grand pour contenir un regulateur de tension et
       deux resistances.  L'interface entre le connecteur de l'onduleur
       et celui du PC est ainsi :

                 Onduleur (DB-9)         PC (DB-25)

                 1 (Extinction)           20 (DTR)
                 3 (Coupure de secteur)    5 (CTS)
                 4 (Commun)                7 (GND)
                 5 (Batterie faible)       8 (DCD)
                 9 (Masse chassis)         1 (Chassis Ground)

    Vous pouvez utiliser la broche 6 de l'onduleur au lieu de la broche
    3 (elles sont inverses l'une de l'autre).  La complication  est  de
    monter les broches collecteur ouvert 3 (ou 6) et 5 de l'onduleur.

    Ce modele APC fournit une sortie non regulee de 24 V continu sur la
    broche 8.  La tension de sortie est disponible tout  le  temps  (au
    moins  un  peu  apres que le signal de batterie faible soit monte).
    L'intensite est limitee a 40mA.   Pour  monter,  la  broche  8  est
    l'alimentation  d'un regulateur de tension de +5V.  La sortie de ce
    regulateur passe dans deux resistances de  4,7kohm.   L'autre  bout
    d'une  resistance  connecte  les  broches 3 (Coupure de courant) de
    l'onduleur et 5 du PC (CTS).  Celle de l'autre resistance  connecte
    les  broches  5  de  l'onduleur (Batterie faible) et 8 du PC (DCD).
    Les deux resistances consomment environ 2 mA lorsqu'elles sont a la
    masse.

    Lorsque  l'onduleur  est  alimente,  les broches 5 (CTS) et 8 (DCD)
    cote PC doivent etre tres proches de 5V, et  monter  la  broche  20
    pendant  5  secondes ne doit avoir aucun effet.  Lorsque l'onduleur
    passe sur batteries, la broche 5 (CTS) doit tomber a 0V, la  broche
    8  (DCD)  doit  rester  a  l'identique a 5V, et monter la broche 20
    (DTR) en court-circuitant les broches 8 et 20,  par  exemple,  doit
    eteindre l'onduleur apres environ 15 secondes.

    Lorsque  la  diode  "Low  Battery"  du panneau frontal s'allume, la
    broche 8 (DCD) doit descendre a 0V aussi.
    Les tensions de l'interface onduleur sont NEGATIVES pour la coupure
    de  secteur  (sur la broche 3 de l'onduleur) et la batterie faible,
    et POSITIVE pour l'arret a distance.  Les parametres de ligne serie
    comme la vitesse n'ont aucune importance.

    Liste du materiel necessaire :

    +o  un boitier DB-9 ;

    +o  un connecteur sub-DB-25 femelle ;

    +o  un regulateur de tension 7805 +5Vdc ;

    +o  deux resistances de 4,7kohm ;

    +o  un carte a composants perforee ;

    +o  un cable avec au moins un connecteur 9 broches male.

       Et de plus :

    +o  un multimetre ;

    +o  un fer a souder;

    +o  quelques heures...

    AAPPCC SSmmaarrtt--UUPPSS 770000

       Voici  quelques  details  sur le fonctionnement du modele 700 en
       mode bete, qui presente une utilisation  futee  d'un  transistor
       place  dans  le cable qui eteint l'onduleur lorsque l'ordinateur
       est eteint.

         From: Markus Eiden <[email protected]>
         Sender: [email protected]
         To: "Harvey J. Stein" <[email protected]>
         Subject: Re: APC Smart-UPS
         Date: Sun, 30 Mar 1997 16:21:05 +0200

    J'utilise un APC Smart-UPS 700 pour mon systeme Linux sur une carte
    ASUS.

    Pour  utiliser  quelques possibilites de l'onduleur, il faut quatre
    choses :

    1) faire un cable RS-232 avec une petite interface ; 2)  le  source
    du powerd du paquetage sysvinit (j'utilise la version 2.6 de Miquel
    van Smoorenburg). Il faut ensuite modifier ce powerd ;  3)  changer
    /etc/inittab  ; 4) faire un script qui lance certaines commandes si
    le courant est coupe ou si la batterie est faible.

    Quelques possibilites :

    Lorsque le secteur est coupe, un script est lance et une entree est
    faite dans syslog.

    Si  la  batterie  est  faible, un autre script est lance (qui arete
    l'ordinateur, evidemment) et une entree est faite dans syslog.

    Si  l'ordinateur  est  arrete  et  que  le  courant  l'est   aussi,
    l'onduleur sera arrete a son tour.

    1) D'abord le cable :

    Si l'on jette un coup d'oeil a l'arriere de l'onduleur, on y trouve
    un connecteur femelle comme celui-ci :

                      8             1: Eteint l'onduleur lorsque le courant est coupe
                                       et que la broche 1 est haute.
              X   X   X   X         3: Descend en cas de coupure de curant.
            X   X   X   X   X       4: Masse
                                    5: Descend en cas de baisse de la batterie.
            1       3   4   5       8: +24V

    D'un autre cote, l'arriere du PC presente un connecteur male  comme
    celui-ci :

                  8       6         1: DCD
              X   X   X   X         4: DTR
            X   X   X   X   X       5: GND
            5   4           1       6: DSR
                                    8: CTS

    Il faut realiser l'interface suivant entre ces connecteurs :

     PC                                                           UPS

                                             #------------------  (8)
                                             |
                                            470 Ohm
                                             |
               #-----#-----#-----#-----#-----#----- ca. 9-12V
               |     |     |     |     |     |
               47    3.3   3.3   3.3   1     470
               kOhm  kOhm  kOhm  kOhm  kOhm  Ohm
               |     |     |     |     |     |
     (8) ------------------------#     |     |
               |     |     |           |     |
     (6) ------------#------------------------------------------- (5)
               |           |           |     |
     (1) ------------------#------------------------------------- (3)
               |                       |     |
               |                      C#------------------------- (1)
               |                      -|     |
               |                    B/       |
     (4) ------#-----12kOhm---------|        |
                                     \>E     |
                                     |       |
     (5)-----------------------------#-------#------------------- (4)

    +o  j'utilise un transistor "BC140", mais a peut pres n'importe quel
       transistor NPN devrait faire l'affaire ;-)

    +o  Le transistor fonctionne  comme  "inverseur".   Si  l'on  eteint
       l'ordinateur  ET  que  le  courant  est coupe, la broche 4 du PC
       descend et  la  broche  1  de  l'onduleur  monte.   Cela  eteint
       l'nduleur pour economiser la batterie.

       2) Le source de _p_o_w_e_r_d

       J'ai juste retouche tres peu le source (donc c'est en fait celui
       de Miquel).

       (a) Emet une "alerte" vers syslogd si la broche 8  du  PC  (DCD)
       est basse (c'est qu'alors, le cable n'est pas connecte) ;

       (b)  DCD  descendu  a  zero  -> le courant est coupe -> appel de
       powerfail(0) -> envoi de INIT_CMD_POWERFAIL au processus init ;

       (c)  DCD  remonte  ->  le  courant  est  revenu  ->   appel   de
       powerfail(1) -> envoi de INIT_CMD_POWEROK au processus init ;

       (d)  DSR  et  DCD descendus a zero -> le courant est coupe et la
       batterie  est  faible  >  appel  de  powerfail(2)  ->  envoi  de
       INIT_CMD_POWERFAILNOW au processus init.

       Et voila.

    /*
     * powerd       Surveille la ligne DCD d'un port serie connecte a un
     *              onduleur. Si le courant est coupe, previent init.
     *              Si le courant revient, previent init encore.
     *              Tant que le courant est la, DCD doit etre "haut". Lorsque
     *              le courant est coupe, DCD doit descendre.
     *              Powerd maintient DTR haut, donc en branchant une resistance
     *              de 10 kOhm entre DCD et DTR, l'onduleur ou un simple relais
     *              peuvent descendre DCD a la masse.
     *              Il faut aussi brancher DSR et DTR ensemble. Ainsi, powerd
     *              peut controler ici et la que DSR soit haut, et il sait donc
     *              que l'onduleur est connecte !!
     *
     * Usage:       powerd /dev/cua4 (ou tout autre port serie).
     *
     * Auteur:      Miquel van Smoorenburg, <[email protected]>.
     *              Quelques changements mineurs de Markus Eiden, <[email protected]>
     *              pour APC-Smart-UPS-powerd.
     *
     * Version:     1.31,  29-Feb-1996.
     *
     * Traduction:  Bernard Choppy ([email protected])
     *
     *              Ce programme fut developpe initialement pour mon employeur
     *                      ** Cistron Electronics **
     *              qui a autorise la distribution de celui-ci pour un usage
     *              generalise.
     *
     *              Copyright 1991-1996 Cistron Electronics.
     *
     *
     *              This program is free software; you can redistribute it and/or
     *              modify it under the terms of the GNU General Public License
     *              as published by the Free Software Foundation; either version
     *              2 of the License, or (at your option) any later version.
     *
     *              Ce programme est un logiciel libre ; vous pouvez le diffuser
     *              et/ou modifier selon les termes de la GPL (GNU Public License)
     *              de la Free Software Foundation; au choix dans la version 2 de
     *              cette licence, ou (a votre choix) toute autre version.
     *
     *              Modifications mineures pour APC-powerd par Markus Eiden
     *              [email protected]
     */

    /* Utilisation de la nouvelle methode de communication avec init */
    #define NEWINIT

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/ioctl.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <signal.h>
    #include <syslog.h>
    #include <string.h>
    #include "paths.h"
    #ifdef NEWINIT
    #include "initreq.h"
    #endif

    #ifndef SIGPWR
    #  define SIGPWR SIGUSR1
    #endif

    #ifdef NEWINIT
    void alrm_handler()
    {
    }
    #endif

    /* Avise init du changement d'etat du courant */
    void powerfail(ok)
    int ok;
    {
      int fd;
    #ifdef NEWINIT
      struct init_request req;

      /* Remplissage de la structure de requete */
      memset(&req, 0, sizeof(req));
      req.magic = INIT_MAGIC;

      /* INIT_CMD_* sont definis dans initreq.h                 *
       * Jetez un coup d'oeil a init.c et /etc/inittab          *
       *                                                        *
       * ok=0 -> INIT_CMD_POWERFAIL      -> powerwait           *
       * ok=1 -> INIT_CMD_POWEROK        -> powerokwait         *
       * ok=2 -> INIT_CMD_POWERFAILNOW   -> powerfailnow        */

      switch (ok) {
        case 0 : req.cmd = INIT_CMD_POWERFAIL;
                 /* Coupure -> alerte */
                 break;
        case 1 : req.cmd = INIT_CMD_POWEROK;
                 /* Retour du courant -> arrete l'alerte */
                 break;
        case 2 : req.cmd = INIT_CMD_POWERFAILNOW;
                 /* Coupure et batterie faible -> arret systeme */
                 break;
                 }

      /* Ouvre le fifo (avec timeout) */
      signal(SIGALRM, alrm_handler);
      alarm(3);
      if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0
                    && write(fd, &req, sizeof(req)) == sizeof(req)) {
            close(fd);
            return;
      }
      /* On en revient a l'ancienne methode... */
    #endif

      /* Creaton d'un fichier info pour init */
      unlink(PWRSTAT);
      if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
            if (ok)
                    write(fd, "OK\n", 3);
            else
                    write(fd, "FAIL\n", 5);
            close(fd);
      }
      kill(1, SIGPWR);
    }

    /* Programme principal */
    int main(int argc, char **argv)
    {
      int fd;
      int dtr_bit = TIOCM_DTR;
      int flags;
      int status, oldstat = -1;
      int count = 0;
      int tries = 0;
      int powerfailed = 0;
      int rebootnow   = 0;

      if (argc < 2) {
            fprintf(stderr, "Usage: powerd <port>\n");
            exit(1);
      }

      /* Lancement de syslog */
      openlog("powerd", LOG_CONS|LOG_PERROR, LOG_DAEMON);

      /* Ouverture du port a surveiller */
      if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
            syslog(LOG_ERR, "%s: %s", argv[1], sys_errlist[errno]);
            closelog();
            exit(1);
      }

      /* Port ouvert, DTR doit etre haut. On le force tout de meme...*/

      /* Fonctionnement : Batterie faible -> Arret -> DTR descend -> *
       * transistor ouvert -> La broche d'arret onduleur monte ->    *
       * l'onduleur s'arrete apres 20 s environ. S'il y a une coupu- *
       * re et que l'ordinateur est eteint, l'onduleur s'arrete.     *
       * Si le courant revient, l'onduleur s'allume, l'ordinateur    *
       * demarre, et powerd est lance.                               *
       *                                                             */

      ioctl(fd, TIOCMBIS, &dtr_bit);

      /* Passe en daemon. */
      switch(fork()) {
            case 0: /* Fils */
                    closelog();
                    setsid();
                    break;
            case -1: /* Erreur */
                    syslog(LOG_ERR, "impossible de forker.");
                    closelog();
                    exit(1);
            default: /* Pere */
                    closelog();
                    exit(0);
      }

      /* Relance syslog. */
      openlog("powerd", LOG_CONS, LOG_DAEMON);

       syslog(LOG_INFO, "APCpowerd demarre...");

      /* On surveille DCD */
      while(1) {
            /* Lecture de l'etat. */
            ioctl(fd, TIOCMGET, &flags);

            /* Controle de connexion : CTS doit etre haut */
            tries = 0;
            /* TIOCM_*- Se reporter a  .../ams/termios.h */
            while((flags & TIOCM_CTS) == 0) {
                    /* On continue a essayer, et alerte toutes les 2 minutes */
                    if ((tries % 60) == 0)
                        syslog(LOG_ALERT, "Onduleur non connecte");
                    sleep(2);
                    tries++;
                    ioctl(fd, TIOCMGET, &flags);
            }
            if (tries > 0)
                    syslog(LOG_ALERT, "Onduleur reconnecte");

            /* Calcule l'etat en cours */
            status = (flags & TIOCM_CAR);

            /* Si DCD est passe a zero, le courant a ete coupe */
            if (oldstat != 0 && status == 0) {
                    count++;
                    if (count > 3) {
                            powerfailed = 1;
                            powerfail(0);
                            }
                    else {
                            sleep(1);
                            continue;
                    }
            }
            /* Si DCD remonte, le courant est revenu. */
            if (oldstat == 0 && status > 0) {
                    count++;
                    if (count > 3) {
                            powerfailed = 0;

                            /* eigentlich unnoetig: */
                            rebootnow = 0;

                            powerfail(1);
                            }
                    else {
                            sleep(1);
                            continue;
                    }
            }

            /* Batterie faible et courant coupe ? */
            if (rebootnow==0)
            if (powerfailed==1)
            if ((flags & TIOCM_DSR) == 0)
            {
               rebootnow=1;
               powerfail(2);

            }

            /* Reinitialisation, stockage de l'etat et attente 2s. */
            count = 0;
            oldstat = status;
            sleep(2);
      }
      /* N'arrive jamais */
      return(0);
    }

    3) Modifier inittab

    init recoit les commandes INIT_CMD et lance les scripts idoines :

         pf::powerwait:/sbin/init.d/powerfail    start
         pn::powerfailnow:/sbin/init.d/powerfail now
         po::powerokwait:/sbin/init.d/powerfail  stop

    Ce  qui signifie, par exemple : si le courant est coupe (powerwait,
    lancer le script /sbin/init.d/powerfail avec le parametre  "start".

    4) Le script powerfail

         #! /bin/sh
         # Copyright (c) 1997 Markus Eiden, [email protected]
         #

         case "$1" in
             start)
                 echo "LE COURANT EST COUPE !" | wall
                 logger "Coupure de courant"
                 ;;
             now)
                 echo "BATTERIE FAIBLE ! Arret systeme dans une minute" | wall
                 logger "Batterie faible, arret systeme dans une minute"
                 sync
                 /sbin/shutdown -r -t 5 +1
                 ;;
             stop)
                 echo "LE COURANT EST REVENU !!" | wall
                 logger "Courant retabli"

                 /sbin/shutdown -c >/dev/null 2>/dev/null

                 ;;
           *)
                 echo "Usage: $0 {start|now|stop}"
                 exit 1
                 ;;
         esac

         exit 0

    Eh bien, cela devrait etre simple ;-)

    Vous  voila  pret maintenant, mais restez prudent : cela fonctionne
    pour moi, mais je ne peux evidemment pas garantir que quoi  que  ce
    soit de cela fonctionne pour vous.

    Un  petit  conseil  pour  finir  : si /sbin/init.d/powerfail arrete
    votre PC, DTR descend,  donc  la  broche  d'arret  (cote  onduleur)
    monte.   Des  cet  instant,  il  faut  entre  20  et  30 secondes a
    l'onduleur  pour  s'arreter.    C'est   de   votre   responsabilite
    d'empecher votre machine Linux de redemarrer durant ces 20 secondes
    (en particulier, de monter les volumes disque).  Cela ne fut pas un
    probleme pour mon systeme.

    Quatre  methodes  simples  permettent  d'empecher Linux de demarrer
    rapidement :

       1. le BIOS doit realiser certaines routines (comme identifier le
          nombre  de  pistes  de votre lecteur de disquettes si vous en
          avez un) ;

       2. LILO peut etre configure pour attendre s'il est installe ;

       3. il peut ne rien y avoir a faire (comme dans mons cas) ;

       4. il est  possible  d'acheter  plus  de  memoire  afin  que  le
          decompte  dure 30 secondes.  Cela doit correspondre environ a
          1 024 Mo ;-).

    AAPPCC SSmmaarrtt--UUPPSS 11 440000

       Autre jour, autre APC.  Voici pour le _S_m_a_r_t_-_U_P_S _1 _4_0_0,  en  mode
       bete.

         From: "Slavik Terletsky" <[email protected]>
         To: [email protected]
         Subject: my contribution to UPS HOWTO
         Date: Mon, 27 Jan 1997 21:10:16 +0000

    Daemon d'onduleur pour FreeBSD (2.1.5 - teste).

    Schema de branchement :

         Onduleur (broche, nom)          PC (broche, nom)
         ----------------------          ---------------------
         1 Arret                 >----------->   4 Terminal pret
         2 Courant Coupe         >----------->   8 Pret a emettre
         4 Commun                >----------->   5 Masse
         5 Batterie faible       >----------+>   1 Detection de porteuse
         8 Batterie (+24V)       >-|10kOhm|-+

    Description

    Usage: upsd <device> [wait [script]]

    device  - device name upsd interacts thru (e.g. /dev/cuaa1)
    wait    - time (secs) to wait before running script, (default value 0 sec).
    script  - system shutdown script (default /etc/rc.shutdown).

    Fonctionnement :

    upsd  enregistre tous les changements d'etat de l'onduleur (courant
    present ou absent, batterie faible ou bonne).  Lorsque  le  courant
    est  absent  et  que  la batterie est faible, upsd active le signal
    d'arret de l'onduleur, attend le nombre de secondes indique sur  la
    ligne de commande, et lance le script d'arret.

    Exemple de script :

         #!/bin/sh
         # Le script est execute lorsque le systeme s'arrete

         PATH=/sbin:/bin:/usr/sbin:/usr/bin

         echo "ARRET IMMEDIAT DU SYSTEME" | wall

         reboot

    Source d'upsd :

    /* daemon d'onduleur
     * Copyright 1997 Slavik Terletsky. All rights reserved.
     * Auteur: Slavik Terletsky <[email protected]>
     * Systeme: FreeBSD
     * Traduction: Bernard Choppy <[email protected]>
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <syslog.h>
    #include <unistd.h>
    #include <varargs.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <sys/uio.h>
    #include <sys/types.h>
    #include <sys/ioctl.h>
    #include <sys/ttycom.h>

    int status;
    int wait = 0;
    FILE *fd;
    char *scr = "/etc/rc.shutdown";
    char *idf = "/var/run/upsd.pid";

    void upsterm();
    void upsdown(int);

    int main(int argc, char *argv[]) {
     int pd;
     int zero = 0;
     char d5, d6, d7;
     char low = 0;
     char pow = 1;

     /* controle des arguments */
     switch(argc) {
     case  4:
     scr = argv[3];
     case  3:
     wait = atoi(argv[2]);
     case  2:
     break;
     default:
     fprintf(stderr, "usage: %s <port> [temporisation [script]]\n", argv[0]);
     exit(1);
     }

     /* controle de l'existence du script */
     if(!(fd = fopen(scr, "r"))) {
     fprintf(stderr, "fopen: %s: %s\n", scr, sys_errlist[errno]);
     exit(1);
     }
     fclose(fd);

     /* controle si upsd s'execute deja */
     if(fd = fopen(idf, "r")) {
     fprintf(stderr, "fopen: le fichier %s existe deja\n", idf);
     exit(1);
     }

     /* passe en daemon */
     switch(fork()) {
     case -1:       /* erreur */
     fprintf(stderr, "fork: %s\n", sys_errlist[errno]);
     exit(1);
     case  0:       /* fils */
     break;
     default:       /* pere */
     exit(0);
     }

     /* sauvegarde du pid */
     if(!(fd = fopen(idf, "w"))) {
     fprintf(stderr, "fopen: %s: %s\n", idf, sys_errlist[errno]);
     exit(1);
     }
     fprintf(fd, "%d\n", (int)getpid());
     fclose(fd);

     /* ouverture du port a surveiller */
     if((pd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
     fprintf(stderr, "open: %s: %s\n", argv[1], sys_errlist[errno]);
     exit(1);
     }

     /* le daemon fonctionne */
     openlog("upsd", LOG_PID, LOG_DAEMON);
     syslog(LOG_INFO, "daemon demarre");

     /* reaction au signal */
     (void)signal(SIGTERM, upsterm);

     /* surveillance du port */
     while(1) {
     /* reinitialisation des bits */
     if(ioctl(pd, TIOCMSET, &zero) < 0) {
      fprintf(stderr, "ioctl: %s\n", sys_errlist[errno]);
      exit(1);
     }

     /* lecture de l'etat du port */
     if(ioctl(pd, TIOCMGET, &status) < 0) {
      fprintf(stderr, "ioctl: %s\n", sys_errlist[errno]);
      exit(1);
     }

     /* determination de l'etat */
     d5 = status & 0x20;
     d6 = status & 0x40;
     d7 = status & 0x80;

     /* courant present */
     if(!(d7 + d5)) {
      if(!pow) {
       syslog(LOG_CRIT, "courant present");
       pow = 1;
      }
     /* courant coupe */
     } else {
      if(pow) {
       syslog(LOG_CRIT, "courant coupe");
       pow = 0;
      }
     }

     /* batterie faible */
     if(!d6 && !low) {
      syslog(LOG_ALERT, "batterie faible");
      low = 1;

      /* arret onduleur */
      if(!pow) {
       upsdown(pd);
      }
     }

     /* batterie ok */
     if(d6 && low) {
      syslog(LOG_CRIT, "batterie ok");
      low = 0;
     }

     sleep(1);
     }

     /* jamais atteint */
     return 0;

    }

    void upsterm() {
     /* message de trace de fin */
     syslog(LOG_INFO, "arret du daemon");

     /* effacement du fichier de pid */
     unlink(idf);

     exit(0);
    }

    void upsdown(int pd) {
     /* message de trace d'arret */
     syslog(LOG_ALERT, "arret du systeme");

     /* effacement du fichier de pid */
     unlink(idf);

     /* mesure de securite : vidange des tampons d'ecriture */
     system("/bin/sync");
     system("/bin/sync");
     system("/bin/sync");

     /* arret de l'onduleur */
     status = TIOCM_DTR;
     if(ioctl(pd, TIOCMSET, &status) < 0) {
     fprintf(stderr, "ioctl: %s\n", sys_errlist[errno]);
     exit(1);
     }

     /* attente puis lancement du script */
     sleep(wait);
     system(scr);
    }
    # Slavik Terletsky      # University "Lvivska Poytechnika" #
    # Network Administrator # mailto:[email protected]        #

 99..  CCoommmmeenntt eetteeiinnddrree dd''aauuttrreess mmaacchhiinneess ssuurr llee mmeemmee oonndduulleeuurr ??

 Certaines personnes (y  compris  moi-meme),  ont  plusieurs  PC  Linux
 connectes sur un onduleur.  Un PC controle l'onduleur et doit eteindre
 les autres PC lorsque le secteur est coupe.

 Nous supposons que les PC peuvent communiquer sur un reseau.  Appelons
 le  PC  qui  surveille  l'onduleur  le  maitre,  et les autres PC, les
 esclaves.

 Dans les temps anciens, cela necessitait une amusante programmation.

 Maintenant, la meilleure chose a faire semble etre de trouver l'un des
 paquetages  powerd-2.0.tar.gz  ou  upsd-1.0.tgz  cites  a  la  section
 ``Logiciels'' et de suivre les instructions.  Les deux  sont  capables
 de  fonctionner  sur  les  esclaves dans un mode qui les connecte a un
 processus powerd ou upsd s'executant sur le maitre pour  lui  demander
 l'etat  de  l'onduleur.   Certains des paquetages specifiques pour APC
 semblent disposer aussi de cette fonctionnalite.

 Neammoins, si votre reseau n'est pas sur, vous  pouvez  etre  amene  a
 souhaiter  plus de securite dans ce montage, puisqu'il est possible de
 "pirater" un powerd esclave pour lui faire croire que le  courant  est
 coupe.

 Une autre possibilite est d'utiliser le protocole SNMP (Simple Network
 Management Protocol - protocole simplifie d'administration de reseau).
 Le  detail  de  l'utilisation de SNMP depasse le cadre de ce document,
 pour ne pas dire que cela me depasse tout court actuellement.

 99..11..  MMeetthhooddee ddee ll''eettaatt dduu ppoorrtt

 Configurez un port sur le maitre qui, lorsqu'on y est connecte, envoie
 soit "OK", soit "FAIL", soit "BATLOW" lorsque le courant est la, qu'il
 est coupe, ou que la batterie est faible, respectivement. Montez  cela
 sur  le  port 13 (le port time) sur lequel vous pouvez faire un telnet
 et recevoir l'heure locale.

 Montez sur les esclaves une version de _p_o_w_e_r_d qui lit ce  port  plutot
 que de controler une ligne serie.

 Je  pense  que  c'est  probablement  la  meilleure  methode,  et  j'ai
 l'intention d'upgrader mes systemes pour l'utiliser.

 99..22..  MMeetthhooddee dd''eemmiissssiioonn eenn ll''aaiirr

 Identique a la  section  ``Methode  de  l'etat  du  port'',  mais  par
 emission d'un message broadcast Ethernet signifiant l'evenement.

 Cela  peut  avoir  des  implications  de securite, puisqu'il peut etre
 {{spoofed}}

 99..33..  MMeetthhooddee dduu ppsseeuuddoo--llooggiinn

 Configurez les pseudo-login sur les esclaves avec les noms powerok  et
 powerfail,   tous   les   deux   avec   le   meme   UID.   Faites   de
 /etc/powerokscript   le    shell    du    user    powerok,    et    de
 /etc/powerfailscript celui du user powerfail. Sur le maitre, faites en
 sorte que le script /etc/powerokscript  fasse  un  rlogin  sur  chaque
 esclave en tant que user powerok et que le script /etc/powerfailscript
 fasse un rlogin en tant que powerfail sur chaque  esclave.  Placez  un
 fichier  powerfail  pour  autoriser  le  root du master a entrer comme
 users powerok et powerfail sur chaque esclave.

 C'est le systeme que  j'utilise  actuellement.  Malheureusement,  j'ai
 quelques  difficultes  a  faire  que les login distants s'executent et
 rendent la main sans se  bloquer.  Il  faudrait  probablement  que  le
 script /etc/powerfailscript fasse les rsh sur les esclaves en tache de
 fond pour lui eviter de bloquer. Neammoins, je n'ai jamais  obtenu  de
 login  correct  en  tache  de  fond. J'ai meme essaye des combinaisons
 complexes comme faire se loger toto sur l'esclave. Tout  ce  que  j'ai
 utilise  avait  des  problemes et se trouvait bloque par un entree tty
 (ou sortie, je ne m'en rappelle plus).

 En plus, cela peut creer des trous de securite.