
                         Le HOWTO des onduleurs (UPS)

Harvey J. Stein, hjstein@math.huji.ac.il, Berger Financial Research, Ltd.
adaptation franaise B.Choppy, 10 mai 1998

   v2.42, 18 novembre 1997
     _________________________________________________________________

   _Ce document vous aidera  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 intouche. NdT : La
   traduction de ce HOWTO est particulierement dlicate, en ce qu'il
   intgre de nombreux messages changs sur InterNet reproduits 
   l'identique. Autant que possible, on aura conserv le sens gnral de
   ces messages, sans toutefois les reproduire systmatiquement en
   entier, leur lecture en devenant vite fastidieuse. Dans certains cas,
   une partie en anglais est conserve, en particulier dans les en-ttes
   de messages. Les noms de signaux et broches de connexion ont t
   traduits, mais leur abrviation originelle conserv (par exemple,
   DCD : Dtection de porteuse). Une copie de la notice originale de
   copyright est conserve, 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  compiler ou
   inutilisables. La rfrence 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. Introduction

   Ce HOWTO concerne la connexion d'un onduleur sur un PC sous Linux.
   L'ide est d'tablir la connexion de telle sorte que Linux puisse
   s'arrter proprement lorsque le courant s'arrte.

   Cela inclut la rfrence  des paquetages logiciels existants
   facilitant l'tablissement de ce genre de communications, et la
   manire dont celles-ci sont ralises. Ce dernier point est souvent
   superftatoire si vous pouvez trouver un paquetage tout configur pour
   votre onduleur. Sinon, il vous faudra lire ce qui suit.

   Dans une large mesure, le prsent document est encore plus redondant
   que lorsque j'en ai crit la premire version en 1994. Toutes les
   informations de base ont toujours t prsentes dans les pages de man
   de _powerd_ fournies avec le paquetage _SysVinit_. Alors qu'en 1994 il
   arrivait souvent que les distributions ne comportent mme pas lesdites
   pages de man, je ne crois pas que ce soit encore le cas.

   De plus, lorsque j'ai crit la premire version de ce Howto, il
   n'existait aucun autre logiciel que _powerd_ pour la communication et
   le contrle entre Linux et les onduleurs. Maintenant, il existe un
   certain nombre de paquetages de contrle d'onduleurs dans le
   rpertoire UPS de Sunsite.

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

     * une seconde source d'informations peut aider  la comprhension de
       la mthode de connexion de Linux  un onduleur, mme s'il s'agit
       simplement de la mme information, crite diffremment ;
     * le HOWTO peut servir de repository pour les donnes spcifiques
       des onduleurs - de nombreux onduleurs ne sont pas encore grs par
       les paquetages gnraux ;
     * le HOWTO contient des dtails supplmentaires qui ne se trouvent
       pas dans d'autres documents ;
     * ce document semble avoir maintenant sa vie propre. La ncessit de
       cration d'un Howto se fait sentir clairement. Il est moins
       vident de dfinir l'instant o il doive tre mis en sommeil.

1.1 Contributeurs

   Je suis dbiteur  vie de ceux dont j'ai reu de l'aide, des
   suggestions, ainsi que des donnes spcifiques d'onduleurs. La liste
   inclut :

     * Hennus Bergman (hennus@sky.nl.mugnet.org) ;
     * Charli (mephistos@impsat1.com.ar) ;
     * Ciro Cattuto (Ciro Cattuto) ;
     * Nick Christenson (npc@minotaur.jpl.nasa.gov) ;
     * Lam Dang (angit@netcom.com) ;
     * Markus Eiden (Markus@eiden.de) ;
     * Dan Fandrich (dan@fch.wimsey.bc.ca) ;
     * Ben Galliart (bgallia@orion.it.luc.edu) ;
     * Danny ter Haar (dth@cistron.nl) ;
     * Christian G. Holtje (docwhat@uiuc.edu) ;
     * Raymond A. Ingles (inglesra@frc.com) ;
     * Peter Kammer (pkammer@ics.uci.edu) ;
     * Marek Michalkiewicz (ind43@sun1000.ci.pwr.wroc.pl) ;
     * Jim Ockers (ockers@umr.edu) ;
     * Evgeny Stambulchik (fnevgenv@plasma-gate.weizmann.ac.il) ;
     * Clive A. Stubbings (cas@vjet.demon.co.uk) ;
     * Miquel van Smoorenburg (miquels@cistron.nl) ;
     * Slavik Terletsky (ts@polynet.lviv.ua) ;
     * Tom Webster (webster@kaiwan.com).

   Notez que les adresses e-mail apparaissant dans les extraits de
   courriers ci-aprs peuvent tre obsoltes. Ce qui prcde l'est
   propablement aussi, mais quelques-unes sont plus rcentes que ce qui
   se trouve plus bas.

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

1.2 Avertissement important

   Je ne peux rellement pas garantir que quelque partie de ceci
   fonctionne pour vous. Connecter un onduleur  un ordinateur peut tre
   un travail d'astuce. L'un ou l'autre, ou les deux peuvent brler,
   exploser, mettre le feu, ou commencer la Troisime Guerre Mondiale. De
   plus, je n'ai une exprience directe que de l'onduleur Advice 1200 A,
   et je n'ai pas eu  fabriquer de cble. Donc, _SOYEZ PRUDENT,
   RASSEMBLEZ TOUTE L'INFORMATION POSSIBLE SUR VOTRE ONDULEUR.
   REFLECHISSEZ D'ABORD. NE CROYEZ PAS A PRIORI CE QUE VOUS LISEZ ICI NI
   AILLEURS_.

   D'un autre ct, j'ai russi  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.3 Autres documents

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

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

2. Note importante concernant l'obsolescence des informations

   Je viens de dcouvrir qu'une partie de la documentation ci-dessous est
   obsolte. En particulier, le daemon _init_ fourni avec le dernier
   paquetage sysinit est plus sophistiqu que ce que j'ai dcrit. Bien
   qu'il semble que la compatibilit ascendante soit assure pour ce qui
   est crit ici, il apparat que certaines fonctions non documentes
   sont _trs importantes_ pour la gestion des onduleurs.

   Le mcanisme de contrle indiqu ci-aprs permet seulement  _powerd_
   d'envoyer  _init_ un des messages _powerfail_ ou _powerok_. _init_
   excute une commande lorsqu'il reoit _powerfail_ et une autre
   lorsqu'il reoit _powerok_. Cela complexifie la logique de _powerd_
   pour la gestion des signaux de batterie faible et autres sortes de
   situations spciales.

   Les nouvelles versions d'_init_ (depuis la version 2.58, apparemment)
   sont plus sophistiques. Il est possible de leur demander d'excuter
   un script parmi _trois_. Ainsi, _init_ peut avoir un script _powerfail_
   pour traiter une coupure de courant, un script _powerfailnow_ pour
   raliser un arrt immdiat et un script _powerok_ pour bloquer tout
   arrt en cours. C'est nettement plus propre que les circonvolutions
   ncessaires avec le mcanisme dtaill plus bas.

   Bien qu'une grande partie du document soit fonde sur l'ancienne
   mthode de communication avec _init_, je viens d'ajouter deux
   nouvelles sections dans lesquelles les auteurs utilisent la nouvelle
   mthode. Il s'agit de Trust Energy Protector 400/600 et APC Smart-UPS
   700. La premire est particulirement dtaille. Les deux comportent
   un _powerd.c_ qui demande  _init_ un shutdown immdiat lorsqu'un
   signal de batterie faible est reu, ainsi que les lignes
   correspondantes de _/etc/inittab_. Pour tout le reste, je peux juste
   vous dire de regarder dans le code source de _init_.

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

     NdT : Il semble que la plupart des contributeurs  ce Howto
     s'appuient sur le redmarrage de l'ordinateur (/sbin/reboot),
     coupl  une temporisation, pour raliser l'extinction de
     l'onduleur. Cette mthode semble hasardeuse. Le traducteur propose
     humblement au lecteur d'tudier la possibilit de remplacer la
     relance complte (reboot) par un arrt systme propre (shutdown -h)
     ou moins propre (halt). Cette mthode permet d'viter totalement le
     risque que l'onduleur s'arrte "trop tard" dans le processus de
     dmarrage de l'ordinateur (i.e. lorsque les systmes de fichiers
     sont dj monts).

3. Onduleur bte, onduleur intelligent

   Les onduleurs peuvent se classer dans deux catgories : "intelligents"
   ou "btes". La diffrence entre les deux rside dans la quantit
   d'informations que l'on peut obtenir de et le niveau de contrle que
   l'on peut exercer sur l'onduleur.

   _Onduleur "bte"_

          + se connecte  l'ordinateur par le port srie ;
          + utilise les lignes de contrle modem pour communiquer avec
            celui-ci ;
          + peut indiquer si le courant est prsent ou non ;
          + peut typiquement indiquer si la batterie est faible ;
          + accepte habituellement un ordre d'arrt de la part de
            l'ordinateur.

   _Onduleur "intelligent"_

          + se connecte  l'ordinateur par le port srie ;
          + communique avec celui-ci par transfert de donnes normal sur
            le port srie ;
          + dispose typiquement d'une sorte de langage de commandes que
            l'ordinateur peut utiliser pour obtenir diverses
            informations, positionner certains paramtres de
            fonctionnement et contrler l'onduleur (pour arrter
            celui-ci, par exemple).

   Habituellement, les onduleurs intelligents peuvent fonctionner en mode
   bte. 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 confidentialit.

   Autant que je sache, les seuls onduleurs intelligents avec lesquels il
   soit simple de communiquer sont ceux faits par Best. De plus, Best
   documente compltement le mode intelligent (ainsi que le mode bte) et
   fournit le source de programmes qui communiquent avec leurs onduleurs.

   Tous les paquetages indiqus dans la section Logiciels communiqueront
   avec les onduleurs en mode bte. C'est tout ce dont on a rellement
   besoin. Ceux spcifiques des onduleurs APC annoncent diverses
   possibilits d'utilisation en mode intelligent, mais je ne sais pas
   exactement ce qu'ils permettent. Une implmentation complte vous
   affichera une fentre avec toutes sortes de jauges affichant diverses
   statistiques de l'onduleur, telles que charge, temprature intrieure,
   historique des coupures, voltages d'entre et de sortie, etc. Il
   semble que le paquetage _smupsd-0.9-1.i386.rpm_ (section Logiciels se
   rapproche de cela. Je ne suis pas sr pour les autres.

   Le reste de ce document est essentiellement limit  la configuration
   de votre systme avec un onduleur bte. L'ide gnrale est  peu prs
   la mme avec un onduleur intelligent, mais les dtails de
   fonctionnement de _powerd_ et le type de cble sont diffrents pour un
   onduleur intelligent.

4. Logiciels

   Fondamentalement, tout ce qu'il vous faut est un excutable _powerd_,
   habituellement plac dans _/sbin/powerd_. Il fait habituellement
   partie du paquetage _SysVinit_. Pour autant que je sache, toutes les
   distributions actuelles de Linux contiennent une version rcente de
   _SysVinit_. Les versions trs anciennes ne comportaient pas _powerd_.

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

   Comme indiqu, une alternative au _powerd_ du paquetage _SysVinit_ est
   l'utilisation de l'un des paquetages disponibles maintenant. il existe
   de nombreux paquetages qui aident  configurer la communication entre
   l'ordinateur et un onduleur. Aucun d'entre eux n'tait disponible
   lorsque j'ai crit ce Howto pour la premire fois, c'est pourquoi j'ai
   eu  l'crire. En fait, il y a de bonnes chances que vous puissiez
   utiliser l'un de ces paquetages logiciels et viter totalement le
   prsent Howto !

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

   _Enhanced APC BackUPS.tar.gz_
          Un paquetage de contrle des onduleurs intelligents APC
          Smart-UPS. Il semble suivre basiquement le BUPS-Howto
          (Back-UPS-Howto, inclus ci-aprs), mais semble aussi disposer
          d'une sorte de signal de batterie faible.

   _Enhanced APC UPSD-v1.4.tar.gz_
          Le fichier _.lsm_ dit qu'il s'agit du mme paquetage que le
          prcdent, sous forme de _.tar.gz_ dans un _.tar.gz_ ! La
          documentation est lgre. Il semble grer les onduleurs APC
          dans les deux modes bte et intelligent, mais je ne peux m'en
          assurer.

   _Enhanced APC UPSD-v1.4.tar.gz_
          Un autre paquetage de contrle des onduleurs APC Smart-UPS.
          Semble inclure une sorte de support matre/esclave (i.e. une
          machine en prvient une autre de s'arrter lorsque le courant
          est coup). Semble utiliser les onduleurs en mode intelligent,
          par opposition  la bascule des lignes modem.

   _smupsd-0.9-1.i386.rpm_

   _smupsd-0.9-1.src.rpm_
          L'auteur ( David E. Myers) crit :

          smupsd surveille un APC Smart-UPS[TM] sous Red Hat[TM] Linux.
          Si le courant est coup, smupsd arrtera le systme et
          l'onduleur de manire correcte.

          smupsd a les fonctionnalits suivantes :

          + arrt du systme et de l'onduleur en fonction de la charge
            rsiduelle de ce dernier ou du temps coul depuis la coupure
            de courant ;
          + surveillance des paramtres de l'onduleur en temps rel
            depuis toute machine  l'aide du programme graphique upsmon,
            crit en JavaTM] ;
          + trace des paramtres de l'onduleur dans un fichier pour
            analyse et dition ;
          + mode matre/esclave permettant  des systmes additionnels
            partageant le mme onduleur de lire les paramtres de
            celui-ci sur la machine qui lui est connecte par port
            srie ;
          + contrle des accs rseau  l'aide du fichier
            _/etc/hosts.allow_.

   _genpower-1.0.1.tgz_
          Un paquetage gnral 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.

   _powerd-2.0.tar.gz_
          Un _powerd_ de remplacement de celui du paquetage _SysVinit_. A
          l'oppos des commentaires de la documentation, il ne semble pas
          avoir t fusionn avec ce dernier (du moins jusqu' la version
          2.62). Ses avantages rsident dans le fait qu'il puisse agir
          comme serveur pour d'autres _powerd_ tournant sur d'autres
          machines (lorsque plusieurs machines d'un rseau partagent le
          mme onduleur) et tre configur par le biais d'un fichier - le
          source ne ncessite donc ni dition ni recompilation.

   _upsd-1.0.tgz_
          Un autre _powerd_ de remplacement. Semble tre assez comparable
          en fonctionnalits avec powerd-2.0.tar.gz.

   _checkups.tar_
          Ce paquetage est destin  contrler les onduleurs Best. Il
          provient directement du site Web de Best. Comporte des binaires
          pour de nombreux _unix_ 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 "contrles de base (basic checkups)" que les
          "contrles avancs (advanced checkups)" qui sont un peu plus
          sophistiqus - ils dclenchent un shutdown lorsque l'onduleur
          indique une dure d'alimentation restante de X minutes, plutt
          qu'au bout de Y minutes aprs la coupure de courant. Le
          programme de contrles avancs dclenche aussi sur diverses
          alarmes telles que "temprature ambiante leve", "batterie
          proche du minimum", "tension de sortie faible" ou "alarme test
          dclenche par l'utilisateur".

   _bestups-0.9.tar.gz_
          Un paquetage qui peut bien se trouver sur Sunsite  l'instant
          o vous lisez ceci. C'est une paire de modules de communication
          qui travaillent avec les onduleurs Best Ferrups. Il gre
          l'onduleur en mode intelligent. Il inter-opre correctement
          avec _powerd-2.0_ - utile si vous avez un gros Ferrups pour
          toutes les machines d'un rseau.

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

   _LanSafe III_
          Deltec Electronics (et Exide) vendent un paquetage logiciel
          appel 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 bte).

   _apcupsd-2.8.tar.gz_
          L'auteur ( Andre Hedrick) crit :

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

          C'est un paquetage trs complet pour les onduleurs APC. Il gre
          toute leur gamme. J'ai maintenant ajout un mode intelligent au
          paquetage et un support pour les cbles APC ou maison si aucun
          cble APC n'est gr.

   _smartups-1.1.tgz_
          Du fichier _.lsm_ :

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

   _ups.tar.gz_
          Du fichier _.lsm_ :

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

   _usvd-2.0.0.tgz_
          Du fichier _.lsm_ :

          uvsd est un daemon qui surveille l'tat d'un onduleur et ragit
          aux changements d'tats (coupure de courant, retour du courant,
          batterie faible). Vous pouvez crire vos propres scripts qui
          sont appels dans ces cas. Il ne ncessite _pas_ SysVinit.

   Notez que j'ai seulement jet un coup d'oeil aux paquetages. Je ne les
   ai pas utiliss. Nous tions proches d'utiliser bestups-0.9.tar.gz et
   powerd-2.0.tar.gz mais nous ne l'avons jamais fait.

5. Faites-le vous-mme

   Ce chapitre est spcifiquement destin au contrle des onduleurs
   btes. Nammoins, une grande partie du processus est  peu prs
   identique pour les onduleurs intelligents. La principale diffrence
   rside dans la manire dont le daemon (typiquement _powerd_) de
   surveilance communique avec l'onduleur.

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

     * parcourir ce document ;
     * tlcharger et tudier tous les paquetages qui semblent adapts
       spcifiquement  son onduleur ;
     * tlcharger et tudier les paquetages plus gnriques. Notes que
       certains d'entre eux sont en fait plus puissants, mieux documents
       et plus faciles d'emploi que leurs quivalents spcifiques ;
     * si les choses ne se passent pas bien ou si certains points restent
       obscurs, lire le prsent document avec attention et bidouiller
       avec ardeur et prcaution...

5.1 Que faut-il faire (sommairement) ?

     * brancher l'ordinateur sur l'onduleur ;
     * connecter le port srie de l'ordinateur  l'onduleur avec un cble
       spcial ;
     * lancer _powerd_ (ou un de ses quivalents) sur l'ordinateur ;
     * configurer _init_ pour raliser quelque chose de raisonnable sur
       les vnements _powerfail_ et _powerok_ (comme lancer un _shutdown_
       et tuer tout _shutdown_ en cours respectivement, par exemple).

5.2 Comment est-ce suppos fonctionner ?

   _Travail de l'onduleur_
          Lorsque le courant s'arrte, l'onduleur continue d'alimenter le
          PC et signale l'arrt du courant par bascule d'un relais ou
          d'un optocoupleur sur son port de contrle.

   _Travail du cble_
          Le cble est conu de telle manire que lorsque l'onduleur
          bascule ledit relais, cela monte un signal de contrle
          particulier de la ligne srie (typiquement _DCD_, dtection de
          porteuse)

   _Travail de powerd_
          Le daemon _powerd_ contrle le port srie. Il maintient
          levs/baisss les signaux de contrle du port srie dont
          l'onduleur a besoin (typiquement _DTR_, Terminal de Donnes
          Prt, doit rester lev, et touts les signaux qui coupent
          l'onduleur doivent tre maintenus baisss). Lorsque _powerd_
          voit le signal de contrle de l'onduleur monter, il crit FAIL
          dans /etc/powerstatus et envoie un signal SIGPWR au process
          _init_ (les anciennes versions de _powerd_ et _init_ crivent
          dans /etc/powerfail). Lorsque le signal de contrle redescend,
          il crit OK dans /etc/powerstatus et envoie un signal SIGPWR 
          _init_.

   _Travail de init (en plus de tout ce qu'il fait par ailleurs)_
          Lorsqu'il reoit un signal SIGPWR, il regarde dans
          /etc/powerstatus. Si celui-ci contient FAIL, il excute
          l'entre powerfail du fichier /etc/inittab. S'il contient OK,
          il excute l'entre powerokwait de inittab.

5.3 Comment configurer tout a ?

   Ce qui suit prsuppose que vous disposez d'un cble qui fonctionne
   correctement avec _powerd_. Si vous n'en tes pas sr, voyez la
   section : Analyse de cbles et modification de powerd.c pour toute
   information sur les cbles mal dcrits et la reconfiguration de
   _powerd_. Les sections Assignement des broches du port srie et
   Correspondance entre ioctl et RS232 seront aussi utiles.

   Si vous devez fabriquer un cble, voyez la section : Comment raliser
   un cble ? pour les dtails gnraux, et la sous-section de :
   Informations sur un certain nombre d'onduleurs qui se rapporte  votre
   onduleur. Cette dernire peut aussi contenir des informations sur les
   cbles fournis par le constructeur. Vous voudrez probablement
   parcourir toute la section Informations sur un certain nombre
   d'onduleurs car chaque section contient quelques dtails
   supplmentaires gnralement utiles.

     * 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

     * Ecrivez les scripts /etc/powerfailscript et /etc/powerokscript
       pour arrter le systme aprs cinq minutes, ou mener toute action
       approprie, et tuer le shutdown en cours, respectivement. En
       fonction de votre version de shutdown, cela sera, soit si trivial
       que vous n'aurez mme pas  crire de script, soit un script d'une
       ligne _bash_, quelque chose du genre :

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

       et vous conserverez les scripts (au cas o cela ne vous arriverait
       pas dans un parfait tat, la premire apostrophe sur la ligne
       ci-dessus est une quote inverse, la seconde et la troisime sont
       des apostrophes, et la dernire est aussi une quote inverse).
     * Dites  _init_ de relire le fichier inittab avec :

telinit q

     * Editez rc.local pour lancer _powerd_ lors du lancement. Syntaxe :

powerd <ligne>

       Remplacez <ligne> par le port srie modem sur lequel sera connect
       l'onduleur, comme dans : /dev/cua1.
     * Connectez le port srie du PC  celui de l'onduleur. NE BRANCHEZ
       PAS ENCORE LE PC SUR L'ONDULEUR.
     * Branchez une lampe sur l'onduleur.
     * Allumez l'onduleur et la lampe.
     * Lancez _powerd_.
     * Testez la configuration :
          + Dbranchez l'onduleur.
               o Contrlez que la lampe reste allume,
               o Contrlez que /etc/powerfailscript est lanc,
               o Contrlez que le shutdown est lanc.
          + Rebranchez l'onduleur.
               o Contrlez que la lampe reste allume,
               o Contrlez que /etc/powerokscript est lanc,
               o Contrlez que /etc/powerfailscript n'est pas lanc,
               o Contrlez que le shutdown est bien arrt.
          + Redbranchez l'onduleur. Laissez-le dbranch et vrifiez que
            le PC s'arrte proprement dans un dlai correct.
          + _La Partie Dlicate._ Une fois que tout semble correct,
            arrtez le PC et branchez-le sur l'onduleur. Lancez un script
            qui synchronise le disque dur toutes les secondes ou  peu
            prs (sync). Simultanment, lancez un second script qui
            excute un find sur votre disque entier. Le premier sert 
            rendre l'opration plus sre, et le second,  consommer le
            maximum de puissance. Maintenant, tirez sur la prise de
            l'onduleur, vrifiez une fois de plus que le PC est lanc, et
            attendez. Assurez-vous que le PC s'arrte correctement avant
            que la batterie soit vide. C'est dangereux, car si la
            batterie n'assure pas le dlai d'arrt du PC, vous pouvez
            vous retrouver avec un systme de fichiers corrompu, et
            peut-tre mme la perte de tous vos fichiers. Vous devriez
            probablement raliser une sauvegarde complte avant ce test,
            et positionner un dlai de shutdown trs court pour
            commencer.

   Flicitations ! Vous avez maintenant un PC sous Linux protg par
   onduleur qui va s'arrter proprement lors d'une coupure de courant !

5.4 Amliorations Utilisateur

     * Bidouillez powerd.c pour surveiller la ligne indiquant un faible
       niveau de batterie. Dans ce cas, excutez un shutdown
       _immediate_ ;
     * Modifiez la procdure de shutdown, afin que lorsqu'elle s'excute
       dans des conditions de coupure de courant, elle teigne l'onduleur
       aprs avoir effectu tout le ncessaire.

6. Notes sur le matriel

6.1 Comment raliser un cble ?

   Cette section est juste compose de messages que j'ai vus sur le Net.
   Je ne l'ai pas ralis, donc je ne peux parler d'exprience. Si
   quelqu'un le peut, qu'il crive cette section pour moi :). Voir aussi
   le message concernant le GPS1000 dans la section GPS1000 d'ACCODATA
   pour ne pas citer toutes les donnes spcifiques 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'espre 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.2 Analyse de cbles et modification de powerd.c

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

     * quelles lignes doivent tre maintenues hautes ;
     * quelle(s) ligne(s) teint(gnent) l'onduleur ;
     * quelles lignes l'onduleur modifie pour indiquer que :
          + le courant est coup,
          + la batterie est faible.

   Il vous faut ensuite modifier powerd.c en consquence, ou utiliser
   l'un des paquetages configurables cits plus haut (voir
   _genpower-1.0.1.tgz_, _power-2.0.tar.gz_ ou _upsd-1.0.tgz_ dcrits 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 problmes pour obtenir les informations prcites, ou
   si vous voulez juste les contrler (une _bonne_ ide), le programme
   suivant peut vous y aider. C'est une version bidouille de powerd.c.
   Il vous permet de positionner les signaux du port depuis la ligne de
   commande, puis il contrle le port, en affichant l'tat des signaux
   chaque seconde. Je l'ai utilis en "upscheck /dev/cua1 2" (par
   exemple) pour monter le deuxime bit (_DTR_) et descendre les autres.
   Le nombre en base 2 indique les bits  monter, ainsi par exemple pour
   monter les bits 1, 2 et 3 (et descendre les autres), utilisez 7. Voir
   le code pour les dtails.

   Voici le programme (non test) upscheck.c. Il n'est pas test car j'ai
   modifi la version que j'avais utilise au dpart 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
   altr 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.3 Assignement des broches du port srie

   La section qui prcde prsuppose la connaissance de la correspondance
   entre les signaux de terminal et les broches du port srie. Voici une
   rfrence de cette correspondance, reprise du document de David Tal :
   "Cbles et connecteurs frquemment utiliss". J'inclus un diagramme
   illustrant les connecteurs, et une table donnant la corresopondance
   entre les numros de broches et les signaux de ligne de terminal.

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

   NdT : si un lecteur franais veut proposer une rfrence dans la
   langue de Molire, qu'il n'hsite pas  me contacter.

   Autres sites utiles :
     * Yost Serial Device Wiring Standard qui contient des informations
       intressantes sur les connecteurs RJ-45 et les cbles quatre
       paires pour toutes les connexions srie ;
     * Stokely consulting pour l'information gnrale sur Unix et en
       particulier leur Unix Serial Port Resources ;
     * 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 trs bien en sortie _html_. Si vous voulez pouvoir lire
   la table qui suit, vous devrez probablement vous rfrer  la version
   _DVI_ ou texte simple du prsent 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   --->    Donnes transmises, TxD
  3      2      RD   BB  104   <---    Donnes reues, RxD
  4      7      RTS  CA  105   --->    Requte pour envoyer
  5      8      CTS  CB  106   <---    Prt  envoyer
  6      6      DSR  CC  107   <---    Jeu de donnes prt
  7      5      SG   AB  102   ----    Masse de signal, GND
  8      1      DCD  CF  109   <---    Dtection de porteuse
  9             --   --  -     -       Tension positive continue de test
  10            --   --  -     -       Tension ngative continue de test
  11            QM   --  -     <---    Mode d'galisation
  12            SDCD SCF 122   <---    Dtection de porteuse secondaire
  13            SCTS SCB 121   <---    Prt  envoyer secondaire
  14            STD  SBA 118   --->    Donnes transmise secondaires
  15            TC   DB  114   <---    Signal d'horloge de l'metteur
  16            SRD  SBB 119   <---    Signal d'horloge secondaire du rcepteur
  17            RC   DD  115   --->    Signal d'horloge du rcepteur
  18            DCR  --  -     <---    Horloge divise du rcepteur
  19            SRTS SCA 120   --->    Requte pour mettre secondaire
  20     4      DTR  CD  108.2 --->    Terminal de donnes prt
  21            SQ   CG  110   <---    Dtection de qualit de signal
  22     9      RI   CE  125   <---    Indicateur de sonnerie
  23            --   CH  111   --->    Slecteur de vitesse de donnes
  24            --   CI  112   <---    Slecteur de vitesse de donnes
  25            TC   DA  113   <---    Horloge transmise

     _CAPTION:_ Assignement des broches de port srie (RS-232C), DB-25 et
                                    DB-9
     _________________________________________________________________

        1                         13         1         5
      _______________________________      _______________
      \  . . . . . . . . . . . . .  /      \  . . . . .  /    Connecteurs
       \  . . . . . . . . . . . .  /        \  . . . .  /     RS-232 vus de
        ---------------------------          -----------      l'arrire de
        14                      25            6       9       l'ordinateur

   DTE : Equipement terminal de donnes (i.e. ordinateur)
   DCE : Equipement de communication de donnes (i.e. modem)
   RxD : Donnes reues; 1 est transmis "bas", 0 "haut"
   TxD : Donnes envoyes; 1 est transmis "bas", 0 "haut"
   DTR : DTE annonce qu'il est aliment et prt  communiquer
   DSR : DCE annonce qu'il est prt  communiquer; "bas" raccroche le modem
   RTS : DTE demande  DCE la permission d'envoyer des donnes
   CTS : DCE agre la RTS
   RI  : DCE indique au DTE qu'il tente d'tablir une connexion
   DCD : DCE annonce qu'une connexion est tablie
     _________________________________________________________________

6.4 Correspondance entre ioctl et RS232

   Puisque vous pouvez aussi devoir modifier powerd.c pour monter et
   descendre les signaux corrects, vous pouvez aussi avoir besoin des
   valeurs numriques des diffrents signaux de terminal. Ils peuvent
   tre trouvs dans /usr/include/linux/termios.h, mais sont reproduits
   ici comme rfrence. Puisqu'ils peuvent tre sujets  changements,
   vous auriez avantage  les vrifier 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 troisime colonne est en hexadcimal.

7. Que faire si l'on n'en sort pas ?

   Voici une nouvelle solution pour le contrle lorsque l'onduleur et
   l'ordinateur ne s'entendent pas. Je dois dire qu' chaque fois que je
   lis cela, je suis effar 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. Informations sur un certain nombre d'onduleurs

   Cette section contient des informations spcifiques de certains
   onduleurs. Ce que je souhaiterais serait de disposer des informations
   sur le port de contrle de l'onduleur (ce que fait chaque broche et ce
   qu'elle attend qui soit fait), sur le cble fourni par le constructeur
   (ce qu'il connecte et o), ainsi qu'une version modifie de powerd.c
   qui fonctionne avec l'onduleur. Ce que j'ai actuellement est une
   description  peu prs complte de chaque onduleur. Je voudrais
   essayer d'affiner chaque information, mais comme je ne peux tester
   chaque onduleur, il est difficile de dcider exactement de ce qui est
   ncessaire. De plus, chaque onduleur semble avoir quelques trucs
   supplmentaires qui sont bien dcrits par les auteurs de chaque
   section. Ainsi, pour l'heure, je laisse tout en place. Tout pour un
   HOWTO pais.

   _Veuillez m'envoyer vos expriences pour les inclure ici._

8.1 Expriences gnrales.

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

   _APC :_
          Ne donneront pas d'informations sur leur mode "intelligent"
          sans votre signature d'un accord de confidentialit. Donc, les
          gens sont forcs d'utiliser leurs onduleurs "intelligents" en
          mode "bte", comme soulign plus bas. Diverses tentatives de
          rtro-ingnierie ont t soldes par des niveaux de russite
          diffrents.

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

   _Tripp Lite :_
          Une personne a dit que Tripp ne diffuserait pas non plus
          d'information.

   _Upsonic :_
          Quelqu'un a dit qu'Upsonic a discut de dtails techniques au
          tlphone, rpondu aux questions par fax et est serviable en
          gnral.

8.2 Advice 1200 A

   Onduleurs d'Advice Electronics, Tel Aviv, Isral (Tout leur matriel
   porte une tiquette  leur nom).

   Spcification des broches du port de contrle.

     * 2 - Coupure de courant.
     * 5 - Batterie faible.
     * 6 - Extinction de l'onduleur.
     * 4 - Masse commune des broches 2, 5 et 6.

   Ils m'ont aussi donn le dessin suivant qui ne m'a servi  rien, mais
   peut vous tre utile si vous souhaitez fabriquer vous-mme un cble :
       ______________________________________________________________

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


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


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


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

   Cble fourni.

   Ils m'ont d'abord donn un cble qui appartenait  un paquetage DOS de
   contrle de l'onduleur appel RUPS. Je l'ai utilis pour les tests.
   Une fois ceux-ci satisfaisants, ils m'ont donn un cble qu'ils
   utilisent pour les serveurs Netware connects  des onduleurs. Il
   fonctionnait  l'identique. Voici les dtails :

     * DTR - Alimentation du cble (powerd.c doit le monter) ;
     * CTS - Courant prsent (descend quand le courant est coup) ;
     * DSR - Batterie faible (descend lorsque la batterie faiblit) ;
     * RTS - Extinction de l'onduleur ( monter pour teindre).

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

8.3 name="Trust Energy Protector 400/600"

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

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

   par Ciro Cattuto

   Version 1.0 - 31 mars 1997

   _Connexion PC-onduleur_
          Le Trust Energy Protector 400/650 est quip d'un port de
          signaux. A l'aide d'un cble adapt, il est possible de
          connecter celui-ci sur un ordinateur pour ragir aux vnements
          concernant l'alimentation lectrique.

   _Le port de signaux de l'onduleur_
          L'assignement des broches du port de signaux DB-9 de l'onduleur
          est le suivant, comme indiqu dans le manuel utilisateur :

        _broche 2_
                Ce relais est ferm lorsque le courant d'alimentation est
                coup.

        _broche 4_
                Masse des broches 2 et 5.

        _broche 5_
                Ce relais est ferm lorsque la batterie dispose de moins
                d'une minute et demi d'autonomie.

        _broche 6_
                L'utilisateur peut envoyer un signal haut (+5V  +12V)
                durant plus d'une milliseconde pour teindre l'onduleur.
                Cette option ne peut tre active que durant une coupure
                de courant.

        _broche 7_
                Masse de la broche 6.

   _le cble_
          Voici le cble que j'ai utilis pour connecter l'onduleur au
          port srie 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 srie DB-9, les broches 6, 20, 8, 7, 5 et 2
          correspondent respectivement aux broches 6, 4, 1, 5, 8 et 3.

   _Comment fonctionne le cble ?_
          L'ordinateur monte DTR et vrifie que DSR soit haut pour
          s'assurer que le cble soit connect  l'ordinateur. Tant que
          le courant est l, DCD et CTS sont hauts tous les deux ( cause
          des rsistances).

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

          De mme, 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 teindre
          l'onduleur en montant TX durant 1 ms au moins. Cela peut tre
          ralis aisment en envoyant un octet 0xFF au port srie avec
          une vitesse faible.

   _le daemon powerd_
          Pour utiliser les informations disponibles sur le port srie,
          il faut utiliser un programme qu surveille celui-ci, dcode le
          signal et envoie les messages appropris au systme
          d'exploitation, en l'occurence au processus init. Ce dernier
          peut excuter des scripts et programmes conus pour grer
          (proprement !) l'vnement de coupure de courant.

   _compiler powerd_
          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
          utilis celui de sysvinit-2.60). Ecrasez simplement le powerd.c
          d'origine et compilez-le.

   _Comment fonctionne powerd ?_
          Ds le dmarrage, _powerd_ ouvre le priphrique srie connect
           l'onduleur et monte DTR. Ensuite, il forke un daemon et se
          termine en laissant celui-ci tourner. Le daemon _powerd_ peut
          se trouver dans l'un des trois tats suivants :

        _Etat 0 - le courant est bon_
                Dans cet tat, _powerd_ lit le port srie toutes les
                T0_SLEEP secondes (voir les lignes #define au dbut du
                code source). Si DCD descend, _powerd_ bascule en tat 1.
                Si CTS descend, _powerd_ bascule en tat 2 (cela ne doit
                pas arriver si DCD n'est pas descendu avant, mais j'ai
                prfr assurer le coup).

        _Etat 1 - le courant est coup_
                Une coupure de courant a t dtecte. DCD est bas et
                _powerd_ lit le port de l'onduleur toutes les T1_SLEEP
                secondes. Si DCD remonte, il bascule en tat 0. Si CTS
                tombe, il bascule en tat 2.

        _Etat 2 - la batterie est faible_
                La batterie de l'onduleur est faible. Le daemon _powerd_
                reste dans cet tat.

          A chaque changement d'tat de _powerd_, il prvient le
          processus _init_ afin que l'action approprie soit effectue.
          Ces vnements sont tracs  l'aide du systme de trace du
          systme d'exploitation (NdT : _syslogd_).

          Si DSR est bas, c'est qu'il y a un problme au niveau du cble.
          _powerd_ continue  surveiller la ligne DSR et envoit un
          message d'avertissement toutes les deux minutes au systme de
          trace.

   _Utiliser powerd_
          Le daemon _powerd_ doit tre lanc par les scripts
          d'initialisation durant le dmarrage du systme. J'ai ajout
          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 ncessaire) le fichier
          /etc/turnUPSoff. Celui-ci est utilis par le script de shutdown
          (/etc/rc.d/rc.0 dans mon cas) pour dcider s'il faut arrter
          l'onduleur ou non. Voir plus bas pour plus d'informations.

          Ensuite, on dsactive le contrle de flux matriel sur le
          priphrique srie connect  l'onduleur et on positionne la
          vitesse  75 bauds. Maintenant, nous sommes sr que le signal
          TX restera haut suffisamment longtemps pour arrter l'onduleur
          si nous envoyons un caractre 0xFF au port srie ( nouveau,
          voir plus bas).

          Enfin, nous lanons le daemon _powerd_ en lui indiquant le port
           surveiller. Notez que nous n'avons pas  lire de caractres
          sur ce port, donc pas d'inquitude en cas de conflit
          d'interruptions - il n'aura aucune influence.

   _Le fichier inittab et les scripts de shutdown_
          Le processus _powerd_ tourne maintenant, et il enverra des
          signaux  init en cas de coupure de courant. Il faut maintenant
          configurer le systme afin qu'il puisse ragir de manire utile
          lorsque ces signaux sont reus.

   _Modification de inittab_
          Ajoutez les lignes suivantes  proximit du dbut 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

   _Les scripts_
          Les scripts powerfail_script, powerokay_script et
          powerfailnow_script sont excuts lorsque _init_ reoit le
          signal correspondant. Il ont la responsabilit d'arrter le
          systme de manire propre ou d'arrter un shutdown en cours au
          cas o 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 rserve de courant assez importante. Dans mon
          secteur, les coupures de courant ne durent souvent que quelques
          minutes, donc le systme ragit  celles-ci de la manire
          suivante : Il attent 10 minutes (habituellement, le courant
          revient avant) puis arrte le systme, en laissant aux
          utilisateurs le temps de fermer leurs applications et de se
          dconnecter. Avant d'excuter la commande _shutdown_, je
          vrifie qu'il n'y a pas d'autre shutdown en cours. Je cre
          aussi le fichier /etc/turnUPSoff afin que le systme arrte
          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 _powerfail_script_ et
          tout _shutdown_ 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 _shutdown_ ne soit
          en cours, on cre le fichier /etc/turnUPSoff puis on arrte le
          systme immdiatement.

   _Le script d'arrt systme_
          Lorsque l'arrt du systme est effectu, on peut arrter
          l'onduleur en montant le signal TX du port srie durant plus
          d'une milliseconde. Celui-ci est dj configur correctement
          par la commande stty du script rc.local. Si le fichier
          /etc/turnUPSoff est prsent, on envoit l'octet 0xFF (tous les
          bits  1) sur le port srie.

          Pour cela, on ajoute les lignes suivantes autour de la fin du
          script d'arrt (/etc/rc.d/rc.0 dans mon cas). L'emplacement
          correct dpend de la manire dont le systme est configur,
          mais il doit pouvoir se situer avant la commande _echo_ 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

   _Remarques gnrales_
          Ce document contient des choses que j'ai apprises en tentant de
          configurer _mon_ systme Linux avec le Trust Energy Protector
          400. Certaines informations (le chemin d'accs aux scripts
          d'initialisation, par exemple) peuvent tre spcifiques  mon
          systme, et il vous faudra vraisemblablement faire quelques
          adaptations. Nammoins, j'espre que ce document sera une trace
          utile pour ceux qui essaieront d'utiliser un onduleur de ce
          type sous Linux. Si vous rencontrez des difficults, recherchez
          des informations plus gnrales dans le reste de ce Howto.
          Bonne chance !

   _Retour d'informations_
          J'apprcierais normment 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 aprs tout, je suis italien !

     NdT : On se demande quelquefois s'il faut vraiment tout traduire
     :-))

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

          ciro@stud.unipg.it

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

   _Informations lgales_
          Je n'ai aucune relation avec Trust Networking Products.

          L'information contenue dans ce document est livre "telle
          quelle". Vous pouvez l'utiliser  vos risques et prils. Je ne
          puis tre tenu responsable d'un quelconque dommage ni perte de
          donnes rsultant de l'utilisation du code ni des informations
          donnes ici.

          Ciro Cattuto

   _Appendix A - Code source du daemon powerd>_

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.4 Trust UPS 400-A

   J'ai reu un message  propos du Trust UPS 400-A. Je ne sais pas si
   c'est le mme que le Trust Energy Protector 400, donc voici le message

     (NdT : le texte qui suit a t reformat. Le document d'origine
     comporte une copie de courrier lectronique)

    :

   Marcel Amerlaan

   16 juillet 1997

   _disponibilit_
          Cet onduleur ne semble plus tre fabriqu par son constructeur,
          mais cela ne veut pas dire qu'il ne soit plus disponible : j'ai
          achet le mien trs peu cher il y a seulement un mois. De plus,
          cette entreprise rtiquette souvent ses produits.

   _cble_
          Il est facile  fabriquer  l'aide du cble d'origine pour
          powerd et de la documentation de Trust.

          Il prsente deux amliorations :

          + indication de batterie faible ;
          + 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 utilise car l'onduleur ne
          semble pas la reconnatre.

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

          Et souvenez-vous que tout ce qui est dcrit 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.5 Sustainer S-40a

   Informations sur le Sustainer S-40a

     (NdT : le texte qui suit a t reformat. Le document d'origine
     comporte une copie de courrier lectronique)

    :

   Evgeny Stambulchik

   10 septembre 1995

   _environnement_
          Sustainer S-40a avec le paquetage unipower (rcemment renomm
          genpower), cble maison (cf. infra). J'ai envoy une copie de
          tout a  Tom Webster, l'auteur du paquetage, et cela devrait
          apparatre dans la nouvelle version.

   _cble_

          + Note : les broches d'arrt indiques dans la documentation
            technique (4 et 6) sont incorrectes. Les bonnes sont 6 et 7,
            comme sur le schma joitnt ;
          + Note 2 : les broches ct PC entre parenthse 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-------------+
--+--
 ---
  -

   _fichier unipowerd.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                                           */
/************************************************************************/

   _fichier genpowerd.h_
          Pour la nouvelle version du logiciel (_genpowerd_), 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.6 Systel

   Une autre entreprise isralienne. Je ne leur ai jamais achet
   d'onduleur, mais il m'ont for aimablement fourni une documentation
   dtaille sur leur port de communication. Il devrait tre assez facile
   de contrler leur onduleur. Leur numro de tlphone est :

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

8.7 Deltec Power, Fiskars Power Systems et Exide

   Fiskars est une holding finnoise, anciennement propritaire de Deltec
   Power. En mars 1996, Fiskars a vendu Deltec Power  Exide. A cette
   date, Deltec Power tait 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 contrle avec ses onduleurs qui
   fonctionne sous Linux. Ils vendent aussi celui-ci sparment 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 envoye 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'arrt automatique du systme en cas de coupure de courant de longue
   dure qui dpasserait l'autonomie de la batterie de l'onduleur.

   Lansafe III permet les messages "broadcast" et l'envoi de courriers
   lectroniques en fonction des rglages utilisateur. La squence
   d'arrt peut aussi tre paramtre.

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

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

   Lansafe III fonctionne sur toutes les plateformes majeures de systmes
   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 :
     * OneUPS Plus ;
     * NetUPS ;
     * PowerWare Prestige ;
     * PowerWare Profile ;
     * PowerWare Plus 5xx.

   Il est aussi fourni avec les onduleurs FPS Power Systems :
     * PowerRite Plus ;
     * PowerRite Max ;
     * PowerWorks A30 ;
     * PowerWorks A40 ;
     * sries 9 000 ;
     * sries 10 000.

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

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

   www.fiskarsUPS.com et www.deltecpower.com

   Accessoirement, lorsque j'ai tent de me connecter 
   www.fiskarsUPS.com, il m'a t demand une identification et un mot de
   passe.

8.8 Onduleur Beaver modle UB500

   Dan Fandrich crit :

   Je pense avoir russi  faire fonctionner mon vieil onduleur Beaver
   modle 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  l'arrire qui se connecte directement dans
   un port srie DB-9 de PC  l'aide d'un cble droit.

   Les interrupteurs DIP permettent quelques ajustements. Pour muler le
   type d'onduleurs apc1-nt de genpower, ils doivent tre positionns
   comme suit :

     * 1 on (CTS = coupure de courant) ;
     * 2 off (CTS = batterie faible) ;
     * 3 off (DSR = coupure de courant) ;
     * 4 off (DSR = batterie faible) ;
     * 5 off (CD = coupure de courant) ;
     * 6 on (CD = batterie faible) ;
     * 7 off (RI = coupure de courant) ;
     * 8 off (RI = batterie faible) ;
     * 9 on (DTR = extinction) ;
     * 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  dire. Vous pouvez ajouter cela  votre
   documentation.

8.9 Sendom

   Charli crit :

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

   J'ai utilis le diagramme de la page de man de _powerd_ :

      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, _mais pas dans l'autre_. Si donc
   le cble ne fonctionne pas, il faut essayer d'inverser les broches sur
   le "relais".

8.10 Best

   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 bte, fourni en sources, donc compilable sous Linux.

   _Best Fortress avec le logiciel de Best_
          Mini-Howto des onduleurs Best Power

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

          Version 1.0, 14 aot 1997

  Avertissement

   Copyright 1997 Michael Stutz

     NdT : la traduction de ce paragraphe est fournie  titre indicatif
     au lecteur. Se reporter  la version originale pour les termes
     exacts.

    ; cette information est libre ; elle peut tre redistribue et/ou
   modifie selon les termes de la Licence Publique Gnrale GNU (GPL)
   version 2 ou ( votre prfrence) ultrieure, pour autant que la
   prsente phrase soit conserve ; cette information est fournie SANS
   AUCUNE GARANTIE ; sans mme de garantie implicite d'adaptation  un
   besoin particulier ; se reporter  la GPL de GNU pour plus de dtails.

  Introduction

   Best Power est constructeur d'onduleurs de haute qualit, et leur
   srie Fortress est particulirement bien adapte  des utilisateurs
   habituels de Linux. Bien que ses produits ne soient actuellement pas
   aussi bon march que certains autres (comme ceux d'APC), Best Power
   fournit le code source de son logiciel et a t trs ractif quant aux
   questions poses par des utilisateurs de Linux. De plus, son matriel
   semble choisi souvent par les consommateurs, ce qui en fait un bon
   choix pour les utilisateurs de Linux.

   Ce document dcrit l'installation d'un onduleur Best Power Fortress
   (le modle utilis est un 660a de 1996 accompagn de son CD-ROM) sur
   une machine Linux.

  Installation

  Matriel

   Installez l'onduleur comme indiqu par les instructions. Les sries
   _Fortress_ de Best Power sont fournies avec un cble RS-232 destin 
   tre connect  un port srie libre  l'arire de l'ordinateur.

  Logiciel

   Voici ce qui diffre du manuel, qui ne contient pas actuellement
   d'instructions spcifiques 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 raliser celle-ci, suivez les tapes ci-dessous, et utilisez le
   manuel comme rfrence pour avoir une vue d'ensemble sur le
   fonctionnement gnral du logiciel. J'ai pris la libert de faire
   quelques modifications dans ce HOWTO sur la configuration du logiciel
   _Fortress_ pour Unix d'une manire qui me semble plus adapte  un
   systme Linux. Par exemple, j'ai limin la ncessit d'un rpertoire
   /etc/best, et plac les excutables dans /usr/local/bin qui me semble
   un endroit plus appropri.

     * D'abord, crez le script "upsdown" destin  tre excut lors
       d'un arrt secteur. Celui-ci va arrter le systme :

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

     * Maintenant, crez les rpertoires pour la documentation et le code
       source :

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

     * Montez le CD-ROM, et dsarchivez le fichier unix/checkups.tar dans
       un rpertoire temporaire :

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

     * Allez dans le rpertoire etc/best/advanced qui doit avoir t cr
       dans le rpertoire temporaire  partir de l'archive ;
     * Copiez la documentation et les fichiers script  leurs
       emplacements idoines dans le systme :

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

     * Nettoyez le chantier dans le rpertoire 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

     * Testez l'onduleur. Remplacez ttySx par le port srie de votre
       choix. Si votre connexion est bonne, vous devriez voir une ligne
       de caracres s'imprimer  l'cran :

mftalk /dev/ttySx

     * Rendez le programme checkups excutable au dmarrage pour le
       tester. Cela peut tre ralis d'un certain nombre de manires
       diffrents (dcrites dans le manuel). Celle que j'ai utilise
       consiste  ajouter une ligne dans /etc/inittab :

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

     * 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 arrte le systme
       aprs quelques instants.
     * Si cela fonctionne, retirez l'option -c500 de la ligne de votre
       inittab (qui en gros implique d'arrter le systme
       systmatiquement au lieu de ne le faire que lorsque le courant est
       coup), et vous pouvez rouler !

  Conclusion

   Toute suggestion permettant d'amliorer ce document ou les techniques
   qui y sont dcrites est la bienvenue. A l'instant o j'cris ces
   lignes, _Best Power_ semblait intress par l'inclusion de la prsente
   information ou d'une autre dans la sienne afin d'aider les
   utilisateurs de Linux par rapport  ses produits, il s'agit donc
   rellement d'une entreprise  promouvoir. Vous pouvez lui transmettre
   vos impressions  sales@bestpower.com et support@bestpower.com.

   _Best Fortress LI-950_
          Quelques commentaires sur le _Best Fortress_, de Leonard N.
          Zubkoff, message du 25 mai 1995 dans comp.os.linux.hardware

     (NdT : le texte qui suit a t reformat. 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 t trs peu coopratif,
          mais je n'ai que de bonnes choses  dire sur Best. J'utilise
          son modle LI 660 ; 660 VA, des tas d'indications sur le
          panneau frontal, etc. Le logiciel CheckUPS est en option
          payante et ncessite quelques bidouillages pour entrer dans
          mons systme de fichiers FSSTND-is (NdT : File System
          STaNDard, le standard de rpartition des lments dans les
          rpertoires prconis pour Linux) (les rpertoires 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 limit, cependant,  raliser des
          arrts automagiques (NdT : automagic dans le texte). L'onduleur
          peut fournir des tas d'informations sur son tat ; CheckUPS ne
          contrle que "Si le courant est coup, combien de temps
          reste-t'il d'autonomie  la batterie ?".

          Best suit aussi ses questionnaires de satisfaction clients.
          J'ai indiqu ma dception que CheckUPS ne dispose pas de plus
          de fonctions d'interrogation (comme le voltage en entre, en
          sortie, le pourcentage de charge, etc.) qui sont disponibles en
          entre. J'ai demand les spcifications de l'interface ; ils
          ont dit : "bien sr" et me l'ont envoy en 2 jours,
          gracieusement. Un contrleur d'tat de l'onduleur complet est
          dans ma casserole de derrire. Quelqu'un voit-il une utilit 
          ce genre d'utilitaire ?

          Rponse de Leonard N. Zubkoff :

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

          Je pourrais ventuellement utiliser le mode de communications
          srie plus intelligent plutt que le simple mode de contact, et
          j'ai donc demand la documentation au support technique de
          Best, et il est arriv aujourd'hui, une semaine aprs mon
          appel. Aprs avoir tudi celle-ci, je dciderai si une
          interface plus intelligente est rellement intressante, en
          particulier puisque dans certains cas j'aurais besoin d'arrter
          deux machines en rseau partageant l'onduleur.

          Leonard.

   _Best Ferrups_
          En complment  la documentation et au logiciel sur le site web
          de _Best_, vous pouvez aussi utiliser le paquetage
          bestups-0.9.tar.gz (section Logiciel). Nous avons juste
          commenc  le tester avec notre _Ferrups_ 5 kVA.

          L'ide de base est qu'il y a deux modules. L'un qui reoit des
          demandes d'information du port rseau, les relaie  l'onduleur,
          et renvoit les rsultats. Le second module parle au premier,
          interprte les rsultats, et rpond OK ou FAIL.

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

          Les dtails se trouvent dans le paquetage lui-mme.

          Par ailleurs, notre _Ferrups_ 5 kVA a fonctionn sans histoire
          pour nos 10 ordinateurs et  30 crans.

8.11 GPS1000 d'ACCODATA

   >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 prt  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 connat 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  part pour trouver comment il fonctionnait. Il y avait
   trois optocoupleurs (deux sorties, une entree) connectes sur un connecteur
    9 broches  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.12 TrippLite BC750LAN (Standby UPS)

   Tom Webster, l'auteur du paquetage _genpower_, m'a envoy des
   informations sur le _TrippLite BC750LAN_. Si vous avez l'un d'entre
   eux, c'est probablement le meilleur paquetage pour commencer.

   Mais pour tre exhaustif, voici le diagramme de brochage du cble
   (ralis par ttonnements, 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.13 APC

   Si la plthore de paquetages pour APC cits plus haut ne vous
   permettent pas de dmarrer, il est possible que la section qui suit
   soit d'une certaine utilit.

   _Backup-UPS_
          Il semble qu'il y ait une certaine controverse sur la fiabilit
          des informations indiques ici sur les APC Back-UPS, donc,
          soyez prudent. Je prface 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,  nouveau,
          comme je n'ai aucun onduleur APC, je ne peux vrifier la
          fiabilit d'aucun de ces messages.

   _Un message d'avertissement_
          Message de Marek Michalkiewicz sur le BUPS-HOWTO

     (NdT : le texte qui suit a t reformat. Le document d'origine
     comporte une copie de courrier lectronique)

           :

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

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

          Le signal RTS du port srie est utilis pour arrter
          l'onduleur. Celui-ci ne s'arrtera que s'il travaille sur
          batterie. Le manuel indique que le le signal d'arrt doit durer
          au moins 0,5ms. Mais un temps infrieur est suffisant, au moins
          pour mon propre APC Back-UPS 600.

          L'utilisation de RTS peut tre dangereuse, car ce dernier est
          mont  l'ouverture du priphrique. 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  ce moment prcis. Cela peut arriver par
          exemple si l'onduleur est teint, et que le courant revienne
          seulement pour un moment.

          Soit il faut lancer backupsd avant de monter les systmes de
          fichiers en lecture/criture, soit (de prfrence) utiliser TX
          (broche 3) plutt que RTS (broche 7) pour teindre l'onduleur
          (la numrotation 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 sre. Je posterai peut-tre
          les diff si le temps me le permet...

   _BUPS-HOWTO_
          Luminated Software Group Prsente

          HOWTO utilisation d'onduleurs _Back-UPS_ (d'_APC_) (pour
          protger votre systme Linux)

          Version: 1.01 BETA

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

          Adaptation franaise : Bernard Choppy

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

          _Attention !_

          Ni moi, ni aucun de ceux qui on crit ou aid  ce document, ne
          garantissons quoi que ce soit concernant ces
          textes/sources/indications. Si quoi que ce soit est endommag,
          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 rfrences de pices
     dtachees Radio-Shack, qui etaient distribues par le rseau Tandy
     en France. Ce reseau n'existe plus, et les rfrences ont donc t
     supprimes de la version franaise. Le lecteur nammoins intress
     pourra se reporter  la version anglaise du prsent document.

          Bien, vous venez juste d'acheter (ou vous allez le faire) un
          _Back-UPS_ d'_APC_ (d'autres modles pourront peut-tre
          bnficier de ces informations, avec peu ou pas de
          modifications, mais nous ne savons pas). Vous avez jet un coup
          d'oeil au prix du couple logiciel/cble _Power-Chute_, et
          n'tes pas sr que le jeu en vaille la chandelle. Bien, j'ai
          fait mon propre cble, et mon propre logiciel et je les utilise
          pour arrter automatiquement mon systme Linux lors d'une
          coupure secteur. Vous savez quoi ? Vous pouvez aussi !

          *** Le Cble ***

          C'tait la partie la plus difficile  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'lectronique du coin :

          + 1 connecteur  souder subminiature mle DB-9 ;
          + 1 connecteur  souder subminiature femelle DB-9 ;
          + 2 botiers pour les connecteurs ci-dessus (vendus sparement
            en gnral) ;
          + Du cble multi-brins (pas du mono-brin).

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

          + un fer  souder ;
          + de la soudure.

          Ok... Voici comment connecter le tout !

          Ces diagrammes montrent le ct ARRIERE (celui o vous soudez
          les cbles sur les broches). Les lettres V, R et B reprsentent
          les couleurs des cbles que j'ai utiliss, et facilitent la
          distinction des lignes

     (Note : j'utilise la numrotation standard RS-232 (pour autant
     qu'on puisse dire)

          . Le manuel de l'_APC_ utilise une numrotation diffrente.
          Ignorez-la ! Utilisez la ntre... Je l'ai dj change pour
          vous !).

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


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

          Pour ceux qui prfrent les chiffres :

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

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

          Depuis l'ARRIERE (ct soudure), les broches sont numrotes
          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 tait la connexion de la ligne RS-232 de
          l'onduleur "Fail Output" sur CD, le chssis de l'onduleur sur
          Gnd, et l'entre "Shut Down" sur RTS. Facile, maintenant qu'on
          vous le dit, non ?

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

          *** Le Logiciel ***

          J'utilise le paquetage _SysVInit_ de Miquel van Smoorenburg
          pour Linux (voir  la fin pour emplacements, remerciements,
          adresses E-mail, etc.). Je ne sais ce qui doit tre chang 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 regard dans le code de Miquel
          pour comprendre comment ioctl() fonctionnait. Si je n'avais pas
          eu cet exemple, j'aurais eu des problmes. J'ai aussi utilis
          la routine powerfail() (telle quelle, je crois), puisqu'elle
          doit interagir avec init, j'ai pens qu'il devait savoir a
          mieux que moi. Le fichier .c est  la fin de ce document, et
          ncessite seulement d'tre copi/coll. 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 tre lanc comme daemon pour contrler
          l'tat de l'onduleur et l'indiquer  init, soit tre lanc pour
          envoyer la commande kill-power (coupure d'alimentation) 
          l'onduleur. L'alimentation ne sera coupe que s'il y a un
          problme secteur et que l'onduleur est sur batteries. Une fois
          le courant revenu, il se rallume.

          Pour le lancer comme dmon, entrez simplement :

backupsd /dev/backups

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

          Ensuite, si le secteur s'arrte, 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 lanc 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 problme, l... Je n'ai
          pas eu le temps de le trouver... S'il y a un gourou "sh" par
          ici...

          J'ai laiss un petit dtail de ct, c'est de faire couper
          l'alimentation par l'onduleur si le PC est arrt courant
          coup. Cela est ralis en ajoutant la ligne suivante  la fin
          de votre script halt :

  /sbin/backupsd /dev/backups killpower

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

          *** 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'tre prudent en gnral.
          Evidemment, je ne fais que vous le recommander. Je n'ai pas t
          prudent du tout, et j'ai eu  nettoyer ma partition plusieurs
          fois pendant les tests de ma configuration. Mais celle-ci
          fonctionne. :-)

          *** O 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 
          ct : 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 ds ***

          Merci  :

          + Miquel van Smoorenburg pour son superbe paquetage _SysVInit_
            et son powerd.c qui m'ont beaucoup aids ;
          + Christian Holtje Documentation backupsd.c (ce qui n'est pas
            de Miquel) rc.power ;
          + Ben Galliart Le cble, informations sur le standard RS-232 et
            astuces bruyantes (non rapportes 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 responsabilit 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 */
       ______________________________________________________________

   _Autres informations_

     (NdT : Le document original comporte de nombreuses copies de
     courriers lectroniques  ce point. Le traducteur s'est permis d'en
     raliser une synthse plus courte et, il l'espre, plus facile 
     utiliser)

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

          Selon la base de connaissances (_KnowledgeBase_) de
          _Microsoft_, il semble que la broche 5 du connecteur des
          onduleurs _APC Back-UPS_ et _Smart-UPS_ (test avec un
          _Back-UPS 400_ sous _Windows NT_) monte un signal "batterie
          faible" deux minutes au moins avant l'puisement de la
          batterie.

          Ce signal est au niveau "TTL collecteur ouvert", et peut tre
          ramen aux niveaux RS-232 selon le schma suivant :


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

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

          Message de Peter Kammer du 7 octobre 1996 :

          Les schmas de brochage sont inverss en ce qui concerne les
          connecteurs mles : en effet, les broches sont numrotes de
          manire inverse sur les connecteurs mles et femelles (puisque
          leurs sens s'opposent lors du brancement). Il faut donc
          considrer que les schmas pour les connecteurs mles sont vus
          ct extrieur et non ct intrieur (soudure), contrairement 
          ce qui est indiqu.

          Par ailleurs, il existe un document de rfrence technique pour
          les onduleurs _Back-UPS_ qui se trouve sur le site web d'_APC_.

          Message de Troy Muller du 6 avril 1997 :

          L'onduleur _Back-UPS Pro 650_ fonctionne avec le cble standard
          d'_APC_. La rfrence du cble est 940-023A et le logicel est
          _Enhanced_APC_BackUPS_. Ce logiciel envoit des messages globaux
          toutes les deux secondes, mais un eu de bidouillage de
          dowalll.c permet de limiter cette fonction.

   _APC Smart-UPS_
          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 mentionns plus haut
          Enhanced_APC_UPSD-v1.4.tar.gz, apcd-0.5.tar.gz et
          smupsd-0.7-1.i386.rpm dcrits dans la section Logiciels). Je ne
          sais pas ce que vaut le support pour chacun d'eux. Il semble
          qu'_APC_ _continue_  refuser de publier son protocole pour le
          mode "intelligent" sans un accord de non-diffusion, ainsi tout
          le monde a d faire de la rtro-ingnirie dessus.

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

          Une autre possibilit est d'utiliser la version du logiciel de
          contrle d'onduleurs _Powerchute_ d'_APC_ pour _SCO Unix_ via
          le paquetage de compatibilit _iBCS_. Clive A. Stubbings me dit
          que cela fonctionne bien aprs quelques ajustements du script
          d'installation. Il dit que le seul problme est que
          "l'interface graphique semble avoir des problmes  contrler
          des onduleurs -travers le rseau".

          Si vous possdez un _APC Smart-UPS_ et que vous n'arriviez pas
           le faire fonctionner en mode intelligent avec aucun de ces
          logiciels, vous pouvez malgr tout encore l'utiliser en mode
          bte. Les sections qui suivent dtaillent cette procdure. J'ai
          reu, en particulier, des messages concernant les modles
          _600_, _700_ et _1400_. Il vous faudra probablement bidouiller
          powerd.c comme indiqu dans la section Analyse de cbles et
          modification de powerd.c.

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

          Ralisation du cble pour un _APC Smart-UPS modle 600_.

          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 modle APC fournit une sortie non regule de 24 V continu
          sur la broche 8. La tension de sortie est disponible tout le
          temps (au moins un peu aprs que le signal de batterie faible
          soit mont). L'intensite est limitee a 40mA. Pour monter, la
          broche 8 est l'alimentation d'un rgulateur de tension de +5V.
          La sortie de ce rgulateur 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 aliment, les broches 5 (CTS) et 8 (DCD)
          ct PC doivent tre trs 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 
          0V, la broche 8 (DCD) doit rester  l'identique  5V, et monter
          la broche 20 (DTR) en court-circuitant les broches 8 et 20, par
          exemple, doit teindre l'onduleur aprs environ 15 secondes.

          Lorsque la diode "Low Battery" du panneau frontal s'allume, la
          broche 8 (DCD) doit descendre  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'arrt  distance. Les
          paramtres de ligne srie comme la vitesse n'ont aucune
          importance.

          Liste du materiel necessaire :

          + un botier DB-9 ;
          + un connecteur sub-DB-25 femelle ;
          + un rgulateur de tension 7805 +5Vdc ;
          + deux rsistances de 4,7kohm ;
          + un carte  composants perfore ;
          + un cble avec au moins un connecteur 9 broches mle.

          Et de plus :

          + un multimtre ;
          + un fer  souder;
          + quelques heures...

   _APC Smart-UPS 700_
          Voici quelques dtails sur le fonctionnement du modle 700 en
          mode bte, qui prsente une utilisation fute d'un transistor
          plac dans le cble qui teint l'onduleur lorsque l'ordinateur
          est teint.

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 systme Linux sur une
          carte ASUS.

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

          1) faire un cble 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 coup ou si la batterie
          est faible.

          Quelques possibilits :

          Lorsque le secteur est coup, un script est lanc et une entre
          est faite dans syslog.

          Si la batterie est faible, un autre script est lanc (qui arte
          l'ordinateur, videmment) et une entre est faite dans syslog.

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

          1) D'abord le cble :

          Si l'on jette un coup d'oeil  l'arrire 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 ct, l'arrire du PC prsente un connecteur mle
          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 raliser 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)

          + j'utilise un transistor "BC140", mais  peut prs n'importe
            quel transistor NPN devrait faire l'affaire ;-)
          + Le transistor fonctionne comme "inverseur". Si l'on teint
            l'ordinateur ET que le courant est coup, la broche 4 du PC
            descend et la broche 1 de l'onduleur monte. Cela teint
            l'nduleur pour conomiser la batterie.

          2) Le source de _powerd_

          J'ai juste retouch trs 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 cble n'est pas connect) ;

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

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

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

          Et voil.

/*
 * 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  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 reoit 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 coup
          (powerwait, lancer le script /sbin/init.d/powerfail avec le
          paramtre "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 tre simple ;-)

          Vous voil prt maintenant, mais restez prudent : cela
          fonctionne pour moi, mais je ne peux videmment pas garantir
          que quoi que ce soit de cela fonctionne pour vous.

          Un petit conseil pour finir : si /sbin/init.d/powerfail arrte
          votre PC, DTR descend, donc la broche d'arrt (ct onduleur)
          monte. Ds cet instant, il faut entre 20 et 30 secondes 
          l'onduleur pour s'arrter. C'est de votre responsabilit
          d'empcher votre machine Linux de redmarrer durant ces 20
          secondes (en particulier, de monter les volumes disque). Cela
          ne fut pas un problme pour mon systme.

          Quatre mthodes simples permettent d'empcher Linux de dmarrer
          rapidement :

    1. le BIOS doit raliser certaines routines (comme identifier le
       nombre de pistes de votre lecteur de disquettes si vous en avez
       un) ;
    2. LILO peut tre configur pour attendre s'il est install ;
    3. il peut ne rien y avoir  faire (comme dans mons cas) ;
    4. il est possible d'acheter plus de mmoire afin que le dcompte
       dure 30 secondes. Cela doit correspondre environ  1 024 Mo ;-).

   _APC Smart-UPS 1 400_

   Autre jour, autre APC. Voici pour le _Smart-UPS 1 400_, en mode bte.

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

   Schma 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'tat de l'onduleur (courant
   prsent ou absent, batterie faible ou bonne). Lorsque le courant est
   absent et que la batterie est faible, upsd active le signal d'arrt de
   l'onduleur, attend le nombre de secondes indiqu sur la ligne de
   commande, et lance le script d'arrt.

   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. Comment eteindre d'autres machines sur le mme onduleur ?

   Certaines personnes (y compris moi-mme), ont plusieurs PC Linux
   connects sur un onduleur. Un PC contrle l'onduleur et doit teindre
   les autres PC lorsque le secteur est coup.

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

   Dans les temps anciens, cela ncessitait une amusante programmation.

   Maintenant, la meilleure chose  faire semble tre de trouver l'un des
   paquetages powerd-2.0.tar.gz ou upsd-1.0.tgz cits  la section
   Logiciels et de suivre les instructions. Les deux sont capables de
   fonctionner sur les esclaves dans un mode qui les connecte  un
   processus powerd ou upsd s'excutant sur le matre pour lui demander
   l'tat de l'onduleur. Certains des paquetages spcifiques pour APC
   semblent disposer aussi de cette fonctionnalit.

   Nammoins, si votre rseau n'est pas sr, vous pouvez tre amen 
   souhaiter plus de scurit dans ce montage, puisqu'il est possible de
   "pirater" un powerd esclave pour lui faire croire que le courant est
   coup.

   Une autre possibilit est d'utiliser le protocole SNMP (Simple Network
   Management Protocol - protocole simplifi d'administration de rseau).
   Le dtail de l'utilisation de SNMP dpasse le cadre de ce document,
   pour ne pas dire que cela me dpasse tout court actuellement.

9.1 Mthode de l'tat du port

   Configurez un port sur le matre qui, lorsqu'on y est connect, envoie
   soit "OK", soit "FAIL", soit "BATLOW" lorsque le courant est l, qu'il
   est coup, 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 _powerd_ qui lit ce port plutt
   que de contrler une ligne srie.

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

9.2 Mthode d'mission en l'air

   Identique  la section Mthode de l'tat du port, mais par mission
   d'un message broadcast Ethernet signifiant l'vnement.

   Cela peut avoir des implications de scurit, puisqu'il peut tre
   {{spoofed}}

9.3 Mthode du pseudo-login

   Configurez les pseudo-login sur les esclaves avec les noms powerok et
   powerfail, tous les deux avec le mme UID. Faites de
   /etc/powerokscript le shell du user powerok, et de
   /etc/powerfailscript celui du user powerfail. Sur le matre, 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 .rhosts sur chaque esclave dans le rpertoire par dfaut de
   powerok et powerfail pour autoriser le root du master  entrer comme
   users powerok et powerfail sur chaque esclave.

   C'est le systme que j'utilise actuellement. Malheureusement, j'ai
   quelques difficults  faire que les login distants s'excutent et
   rendent la main sans se bloquer. Il faudrait probablement que le
   script /etc/powerfailscript fasse les rsh sur les esclaves en tche de
   fond pour lui viter de bloquer. Nammoins, je n'ai jamais obtenu de
   login correct en tche de fond. J'ai mme essay des combinaisons
   complexes comme faire se loger toto sur l'esclave. Tout ce que j'ai
   utilis avait des problmes et se trouvait bloqu par un entre tty
   (ou sortie, je ne m'en rappelle plus).

   En plus, cela peut crer des trous de scurit.
