  Le HOWTO des onduleurs (UPS)
  Harvey  J.  Stein, hjstein@math.huji.ac.il, 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.

  11..  IInnttrroodduuccttiioonn

  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.

  11..11..  CCoonnttrriibbuutteeuurrss

  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 (hennus@sky.nl.mugnet.org) ;

  +o  Charli (mephistos@impsat1.com.ar) ;

  +o  Ciro Cattuto (Ciro Cattuto) ;

  +o  Nick Christenson (npc@minotaur.jpl.nasa.gov) ;

  +o  Lam Dang (angit@netcom.com) ;

  +o  Markus Eiden (Markus@eiden.de) ;

  +o  Dan Fandrich (dan@fch.wimsey.bc.ca) ;

  +o  Ben Galliart (bgallia@orion.it.luc.edu) ;

  +o  Danny ter Haar (dth@cistron.nl) ;

  +o  Christian G. Holtje (docwhat@uiuc.edu) ;

  +o  Raymond A. Ingles (inglesra@frc.com) ;

  +o  Peter Kammer (pkammer@ics.uci.edu) ;

  +o  Marek Michalkiewicz (ind43@sun1000.ci.pwr.wroc.pl) ;

  +o  Jim Ockers (ockers@umr.edu) ;

  +o  Evgeny Stambulchik (fnevgenv@plasma-gate.weizmann.ac.il) ;

  +o  Clive A. Stubbings (cas@vjet.demon.co.uk) ;

  +o  Miquel van Smoorenburg (miquels@cistron.nl) ;

  +o  Slavik Terletsky (ts@polynet.lviv.ua) ;

  +o  Tom Webster (webster@kaiwan.com).

  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.

  11..22..  AAvveerrttiisssseemmeenntt iimmppoorrttaanntt

  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.

  11..33..  AAuuttrreess ddooccuummeennttss

  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.

  22..  NNoottee iimmppoorrttaannttee ccoonncceerrnnaanntt ll''oobbssoolleesscceennccee ddeess iinnffoorrmmaattiioonnss

  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 ttrreess iimmppoorrttaanntteess 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).--)

  33..  OOnndduulleeuurr bbeettee,, oonndduulleeuurr iinntteelllliiggeenntt

  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.

     OOnndduulleeuurr ""bbeettee""

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

     OOnndduulleeuurr ""iinntteelllliiggeenntt""

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

  44..  LLooggiicciieellss

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

     EEnnhhaanncceedd AAPPCC BBaacckkUUPPSS..ttaarr..ggzz
        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.

     EEnnhhaanncceedd AAPPCC UUPPSSDD--vv11..44..ttaarr..ggzz
        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.

     EEnnhhaanncceedd AAPPCC UUPPSSDD--vv11..44..ttaarr..ggzz
        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.

     ssmmuuppssdd--00..99--11..ii338866..rrppmm

     ssmmuuppssdd--00..99--11..ssrrcc..rrppmm
        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.

     ggeennppoowweerr--11..00..11..ttggzz
        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.

     ppoowweerrdd--22..00..ttaarr..ggzz
        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.

     uuppssdd--11..00..ttggzz
        Un autre _p_o_w_e_r_d de remplacement.  Semble etre  assez  comparable
        en fonctionnalites avec powerd-2.0.tar.gz.

     cchheecckkuuppss..ttaarr
        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".

     bbeessttuuppss--00..99..ttaarr..ggzz
        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.

     LLaannSSaaffee IIIIII
        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).

     aappccuuppssdd--22..88..ttaarr..ggzz
        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.

     ssmmaarrttuuppss--11..11..ttggzz
        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.

     uuppss..ttaarr..ggzz
        Du fichier _._l_s_m :

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

     uussvvdd--22..00..00..ttggzz
        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.

  55..  FFaaiitteess--llee vvoouuss--mmeemmee

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

  55..11..  QQuuee ffaauutt--iill ffaaiirree ((ssoommmmaaiirreemmeenntt)) ??

  +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).

  55..22..  CCoommmmeenntt eesstt--ccee ssuuppppoossee ffoonnccttiioonnnneerr ??

     TTrraavvaaiill ddee ll''oonndduulleeuurr
        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.

     TTrraavvaaiill dduu ccaabbllee
        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)

     TTrraavvaaiill ddee ppoowweerrdd
        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.

     TTrraavvaaiill ddee iinniitt ((eenn pplluuss ddee ttoouutt ccee qquu''iill ffaaiitt ppaarr aaiilllleeuurrss))
        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.

  55..33..  CCoommmmeenntt ccoonnffiigguurreerr ttoouutt ccaa ??

  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  LLaa PPaarrttiiee DDeelliiccaattee..  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 !

  55..44..  AAmmeelliioorraattiioonnss UUttiilliissaatteeuurr

  +o  Bidouillez powerd.c pour surveiller la ligne  indiquant  un  faible
     niveau de batterie.  Dans ce cas, executez un shutdown iimmmmeeddiiaattee ;

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

  66..  NNootteess ssuurr llee mmaatteerriieell

  66..11..  CCoommmmeenntt rreeaalliisseerr uunn ccaabbllee ??

  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 miquels@caution.cistron.nl.mugnet.org Wed Jul 21 14:26:33 1993
     Newsgroups: comp.os.linux
     Subject: Re: Interface onduleur pour Linux ?
     From: miquels@caution.cistron.nl.mugnet.org (Miquel van Smoorenburg)
     Date: Sat, 17 Jul 93 18:03:37
     Distribution: world
     Organization: Cistron Electronics.

     Dans l'article <1993Jul15.184450.5193@excaliber.uucp>
     joel@rac1.wam.umd.edu (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
     >(joel@wam.umd.edu)
     >

     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, <miquels@cistron.nl.mugnet.org>
          Ibmio.com: cannot open CONFIG.SYS: file handle broke off.

          >From danny@caution.cistron.nl.mugnet.org Wed Jul 21 14:27:04 1993
          Newsgroups: comp.os.linux
          Subject: Re: Interface onduleur pour Linux_?
          From: danny@caution.cistron.nl.mugnet.org (Danny ter Haar)
          Date: Mon, 19 Jul 93 11:02:14
          Distribution: world
          Organization: Cistron Electronics.

          Dans l'article <9307174330@caution.cistron.nl.mugnet.org>
          miquels@caution.cistron.nl.mugnet.org (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  <dannyth@hacktic.nl> or <danny@cistron.nl.mugnet.org>
          Robins law #103: 'a couple of lightyears can't part good friends'

  66..22..  AAnnaallyyssee ddee ccaabblleess eett mmooddiiffiiccaattiioonn ddee ppoowweerrdd..cc

  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 <hjstein@math.huji.ac.il>
   *              (mais en realite juste une modification mineure de Miquel van
   *              Smoorenburg's <miquels@drinkel.nl.mugnet.org> 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);
  }
  ______________________________________________________________________

  66..33..  AAssssiiggnneemmeenntt ddeess bbrroocchheess dduu ppoorrtt sseerriiee

  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
  ______________________________________________________________________

  66..44..  CCoorrrreessppoonnddaannccee eennttrree iiooccttll eett RRSS223322

  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.

  77..  QQuuee ffaaiirree ssii ll''oonn nn''eenn ssoorrtt ppaass ??

  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" <inglesra@frc.com>
  To: hjstein@math.huji.ac.il
  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           inglesra@frc.com

   "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

  88..  IInnffoorrmmaattiioonnss ssuurr uunn cceerrttaaiinn nnoommbbrree dd''oonndduulleeuurrss

  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.

  VVeeuuiilllleezz mm''eennvvooyyeerr vvooss eexxppeerriieenncceess ppoouurr lleess iinncclluurree iiccii..

  88..11..  EExxppeerriieenncceess ggeenneerraalleess..

  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.

     AAPPCC ::
        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.

     BBeesstt ::
        Serviables  et  aimables.   Fournissent  le  code  source  et la
        documentation pour les deux modes.

     TTrriipppp LLiittee ::
        Une personne a  dit  que  Tripp  ne  diffuserait  pas  non  plus
        d'information.

     UUppssoonniicc ::
        Quelqu'un  a  dit  qu'Upsonic a discute de details techniques au
        telephone, repondu aux questions par fax  et  est  serviable  en
        general.

  88..22..  AAddvviiccee 11220000 AA

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

  88..33..  nnaammee==""TTrruusstt EEnneerrggyy PPrrootteeccttoorr 440000//660000""

  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

     CCoonnnneexxiioonn PPCC--oonndduulleeuurr
        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.

     LLee ppoorrtt ddee ssiiggnnaauuxx ddee ll''oonndduulleeuurr
        L'assignement des broches du port de signaux DB-9 de  l'onduleur
        est le suivant, comme indique dans le manuel utilisateur :

        bbrroocchhee 22
           Ce  relais  est  ferme  lorsque le courant d'alimentation est
           coupe.

        bbrroocchhee 44
           Masse des broches 2 et 5.

        bbrroocchhee 55
           Ce relais est ferme lorsque  la  batterie  dispose  de  moins
           d'une minute et demi d'autonomie.

        bbrroocchhee 66
           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.

        bbrroocchhee 77
           Masse de la broche 6.

     llee ccaabbllee
        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.

     CCoommmmeenntt ffoonnccttiioonnnnee llee ccaabbllee ??
        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.

     llee ddaaeemmoonn ppoowweerrdd
        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.

     ccoommppiilleerr ppoowweerrdd
        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.

     CCoommmmeenntt ffoonnccttiioonnnnee ppoowweerrdd ??
        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 :

        EEttaatt 00 -- llee ccoouurraanntt eesstt bboonn
           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).

        EEttaatt 11 -- llee ccoouurraanntt eesstt ccoouuppee
           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.

        EEttaatt 22 -- llaa bbaatttteerriiee eesstt ffaaiibbllee
           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.

     UUttiilliisseerr ppoowweerrdd
        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.

     LLee ffiicchhiieerr iinniittttaabb eett lleess ssccrriippttss ddee sshhuuttddoowwnn
        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.

     MMooddiiffiiccaattiioonn ddee iinniittttaabb
        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

     LLeess ssccrriippttss
        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.

     LLee ssccrriipptt dd''aarrrreett ssyysstteemmee
        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

     RReemmaarrqquueess ggeenneerraalleess
        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 !

     RReettoouurr dd''iinnffoorrmmaattiioonnss
        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 :

        ciro@stud.unipg.it

        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.

     IInnffoorrmmaattiioonnss lleeggaalleess
        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

     AAppppeennddiixx AA  --  CCooddee ssoouurrccee dduu ddaaeemmoonn ppoowweerrdd>>

          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 <ciro@stud.unipg.it>
      *
      * Version 1.0 - 31 Mars 1997
      *
      * Ce code est largement fonde sur le powerd.c original de
      * Miquel van Smoorenburg <miquels@drinkel.ow.org>.
      *
      *
      * 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);
     }

  88..44..  TTrruusstt UUPPSS 440000--AA

  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

     ddiissppoonniibbiilliittee
        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.

     ccaabbllee
        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.

     ccoonncclluussiioonn
        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

  88..55..  SSuussttaaiinneerr SS--4400aa

  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

     eennvviirroonnnneemmeenntt
        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.

     ccaabbllee

     +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-------------+
     --+--
      ---
       -

     ffiicchhiieerr uunniippoowweerrdd..hh

     /************************************************************************/
     /* Fichier              : unipowerd.h                                   */
     /* Programme            : unipowerd                   Version: 1.0.0    */
     /* Auteur               : Tom Webster <webster@kaiwan.com>              */
     /* 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                                           */
     /************************************************************************/

     ffiicchhiieerr ggeennppoowweerrdd..hh
        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}}

  88..66..  SSyysstteell

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

  88..77..  DDeelltteecc PPoowweerr,, FFiisskkaarrss PPoowweerr SSyysstteemmss eett EExxiiddee

  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.

  88..88..  OOnndduulleeuurr BBeeaavveerr mmooddeellee UUBB550000

  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.

  88..99..  SSeennddoomm

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

  88..1100..  BBeesstt

  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.

     BBeesstt FFoorrttrreessss aavveecc llee llooggiicciieell ddee BBeesstt
        Mini-Howto des onduleurs Best Power

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

        Version 1.0, 14 aout 1997

  88..1100..11..  AAvveerrttiisssseemmeenntt

  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.

  88..1100..22..  IInnttrroodduuccttiioonn

  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.

  88..1100..33..  IInnssttaallllaattiioonn

  88..1100..33..11..  MMaatteerriieell

  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.

  88..1100..33..22..  LLooggiicciieell

  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 !

  88..1100..33..33..  CCoonncclluussiioonn

  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 sales@bestpower.com et support@bestpower.com.

     BBeesstt FFoorrttrreessss LLII--995500

        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 nautix@community.net :

        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.

     BBeesstt FFeerrrruuppss

        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.

  88..1111..  GGPPSS11000000 dd''AACCCCOODDAATTAA

     >From hennus@sky.nl.mugnet.org Thu Mar 10 15:10:22 1994
     Newsgroups: comp.os.linux.help
     Subject: Re: shutdown automatique avec un onduleur
     From: hennus@sky.nl.mugnet.org (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 <CRAFFERT.94Feb28125452@nostril.lehman.com>,
     Colin Owen Rafferty <craffert@nostril.lehman.com> 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 <craffert@lehman.com>

     Hennus Bergman

  88..1122..  TTrriippppLLiittee BBCC775500LLAANN ((SSttaannddbbyy UUPPSS))

  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

  88..1133..  AAPPCC

  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.

     BBaacckkuupp--UUPPSS

        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.

     UUnn mmeessssaaggee dd''aavveerrttiisssseemmeenntt

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

     BBUUPPSS--HHOOWWTTOO

        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.

        AAtttteennttiioonn !!

        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, <docwhat@uiuc.edu>
          #

            # 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, docwhat@uiuc.edu 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 <docwhat@uiuc.edu>
      *  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 */
     ___________________________________________________________________

     AAuuttrreess iinnffoorrmmaattiioonnss
        (-- (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.

     AAPPCC SSmmaarrtt--UUPPSS

        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  ccoonnttiinnuuee 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...

     AAPPCC SSmmaarrtt--UUPPSS 770000

        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 <Markus@eiden.de>
          Sender: eiden@eiden.de
          To: "Harvey J. Stein" <abel@netvision.net.il>
          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, <miquels@drinkel.cistron.nl>.
      *              Quelques changements mineurs de Markus Eiden, <Markus@Eiden.de>
      *              pour APC-Smart-UPS-powerd.
      *
      * Version:     1.31,  29-Feb-1996.
      *
      * Traduction:  Bernard Choppy (choppy@imaginet.fr)
      *
      *              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
      *              Markus@Eiden.de
      */

     /* 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, Markus@Eiden.de
          #

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

     AAPPCC SSmmaarrtt--UUPPSS 11 440000

        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" <ts@polynet.lviv.ua>
          To: hjstein@math.huji.ac.il
          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 <ts@polynet.lviv.ua>
      * Systeme: FreeBSD
      * Traduction: Bernard Choppy <choppy@imaginet.fr>
      */
     #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:ts@polynet.lviv.ua        #

  99..  CCoommmmeenntt eetteeiinnddrree dd''aauuttrreess mmaacchhiinneess ssuurr llee mmeemmee oonndduulleeuurr ??

  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.

  99..11..  MMeetthhooddee ddee ll''eettaatt dduu ppoorrtt

  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.

  99..22..  MMeetthhooddee dd''eemmiissssiioonn eenn ll''aaiirr

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

  99..33..  MMeetthhooddee dduu ppsseeuuddoo--llooggiinn

  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.

