このページは大阪弁化フィルタによって翻訳生成されたんですわ。

翻訳前ページへ


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

pages de man de powerd fournies avec le paquetage SysVinit. Alors qu'en 1994 il arrivait souvent que les distributions ne comportent m麥e pas lesdites pages de man, je ne crois pas que ce soit encore le cas.

De plus, lorsque j'ai 馗rit la premi鑽e version de ce Howto, il n'existait aucun autre logiciel que powerd pour la communication et le contr?e entre Linux et les onduleurs. Maintenant, il existe un certain nombre de paquetages de contr?e d'onduleurs dans le r駱ertoire UPS La liste inclut :

Notez que les adresses e-mail apparaissant dans les extraits de courriers ci-apr鑚 peuvent 黎re obsol鑼es. Ce qui pr馗鐡e l'est propablement aussi, mais quelques-unes sont plus Autres documents

Ce document ne traite pas des fonctions et possibilit駸 g駭駻ales des onduleurs. Pour ce genre d'informations, voyez la Foire Aux Questions La FAQ UPS. Elle peut aussi 黎re trouv馥 sur ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/answers/UPS-faq. Elle est maintenue par

Il y a aussi de plus en plus de constructeurs d'onduleurs pr駸ent sur le Net. Certains d'entre aux fournissent r馥llement des informations utiles sur leur site Web. Une liste pratique des sites web des constructeurs est disponible sur R駱ertoire des onduleurs. Le m麥e site propose aussi une FAQ des onduleurs.

2. Note importante concernant l'obsolescence des informations

Je viens de d馗ouvrir qu'une partie de la documentation ci-dessous est obsol鑼e. En particulier, le daemon init fourni avec le dernier init ex馗ute une commande lorsqu'il re輟it powerfail et une autre lorsqu'il re輟it powerok. Cela complexifie la logique de powerd pour la gestion des signaux de batterie faible et autres sortes de situations sp馗iales.

Les nouvelles versions d'init (depuis la version 2.58, apparemment) sont plus sophistiqu馥s. Il est possible de leur demander d'ex馗uter un script parmi trois. Ainsi, init peut avoir un script powerfail pour traiter une

Bien qu'une grande partie du document soit fond馥 sur l'ancienne m騁hode de communication avec init, je viens d'ajouter deux nouvelles sections dans lesquelles les auteurs utilisent la nouvelle m騁hode. Il s'agit de Trust Energy Protector 400/600 et 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 cit駸 ci-dessous utilisent aussi la nouvelle m騁hode de communication.

  • communique avec celui-ci par transfert de donn馥s normal sur le port s駻ie ;
  • dispose typiquement d'une sorte de langage de commandes que l'ordinateur peut utiliser pour obtenir diverses informations, positionner certains param鑼res de fonctionnement et contr?er l'onduleur (pour arr黎er celui-ci, par exemple).
  • Habituellement, les onduleurs intelligents peuvent fonctionner en mode b黎e. C'est utile, car pour autant que je sache, les entreprises qui construisent simple de communiquer sont ceux faits par Best. De plus, Best documente compl鑼ement le mode intelligent (ainsi que le mode b黎e) et fournit le source de programmes qui communiquent avec leurs onduleurs.

    Tous les paquetages indiqu駸 dans la section Logiciels communiqueront avec les onduleurs en mode b黎e. C'est tout ce dont on a r馥llement besoin. Ceux sp馗ifiques des onduleurs APC annoncent diverses possibilit駸 d'utilisation en mode intelligent, mais je ne sais pas exactement ce qu'ils permettent. Une impl駑entation compl鑼e vous affichera une fen黎re avec toutes sortes de jauges affichant diverses statistiques de l'onduleur, telles que charge, temp駻ature int駻ieure, historique des coupures, voltages d'entr馥 et de sortie, etc. Pour autant que je sache, toutes les distributions actuelles de Linux contiennent une version r馗ente de SysVinit. Les versions tr鑚 anciennes ne comportaient pas powerd.

    Le seul probl鑪e que vous puissiez rencontrer est que votre c稈le ne Enhanced APC BackUPS.tar.gz

    Un paquetage de contr?e des onduleurs intelligents APC Smart-UPS. Il semble suivre basiquement le BUPS-Howto (Back-UPS-Howto, inclus ci-apr鑚), 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 m麥e paquetage que le pr馗馘ent, sous forme de .tar.gz dans un .tar.gz ! La documentation est l馮鑽e. Il semble g駻er les onduleurs APC dans les deux modes b黎e et intelligent, mais je ne peux m'en assurer.

    bascule des lignes modem.

    smupsd-0.9-1.i386.rpm
    smupsd-0.9-1.src.rpm

    L'auteur ( David E. Myers) 馗rit :

    smupsd surveille un APC Smart-UPS[TM] sous Red Hat[TM] Linux.

    genpower-1.0.1.tgz

    Un paquetage g駭駻al 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. upsd-1.0.tgz

    Un autre powerd de remplacement. Semble 黎re assez comparable en fonctionnalit駸 avec powerd-2.0.tar.gz.

    s'il ne fonctionne pas, de tenter de le corriger. Le source inclut aussi bien les "contr?es de base (basic checkups)" que les "contr?es avanc駸 (advanced checkups)" qui sont un peu plus sophistiqu駸 - ils d馗lenchent un shutdown lorsque l'onduleur indique une dur馥 d'alimentation restante de X minutes, plut? qu'au bout de Y minutes apr鑚 la coupure de courant. Le programme de contr?es avanc駸 d馗lenche aussi sur diverses alarmes telles que "temp駻ature ambiante 駘ev馥", "batterie proche du ceci. C'est une paire de modules de communication qui travaillent avec les onduleurs Best Ferrups. Il g鑽e l'onduleur en mode intelligent. Il inter-op鑽e correctement avec powerd-2.0 - utile si vous avez un gros Ils disent qu'il fonctionne aussi avec d'autres onduleurs (en mode b黎e).

    apcupsd-2.8.tar.gz

    L'auteur ( Andre Hedrick) 馗rit :

    fr駲uences, pourcentages de charge et niveau de batterie en temps r馥l. Les protocoles "Safeware" et "Tripplite" sont g駻駸. 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'騁at d'un onduleur et r饌git aux changements d'騁ats (coupure de courant, retour du courant, batterie faible). Vous pouvez 馗rire vos propres scripts qui sont appel駸 dans ces cas. Il ne n馗essite pas SysVinit.

  • t駘馗harger et 騁udier les paquetages plus g駭駻iques. Notes que certains d'entre eux sont en fait plus puissants, mieux document駸 et plus faciles d'emploi que leurs 駲uivalents sp馗ifiques ;
  • si les choses ne se passent pas bien ou si certains points restent obscurs, lire le pr駸ent document avec attention et bidouiller avec ardeur et pr馗aution...
  • 5.1 Que faut-il faire (sommairement) ?

    5.2
    Travail du c稈le

    Le c稈le est con輹 de telle mani鑽e que lorsque l'onduleur bascule ledit relais, cela monte un signal de contr?e particulier de la ligne s駻ie (typiquement DCD, d騁ection de porteuse)

    doivent 黎re maintenus baiss駸). Lorsque powerd voit le signal de contr?e de l'onduleur monter, il 馗rit FAIL dans /etc/powerstatus et envoie un signal
    Travail de init (en plus de tout ce qu'il fait par ailleurs)

    Lorsqu'il re輟it un signal SIGPWR, il regarde dans /etc/powerstatus. Si celui-ci contient FAIL, il ex馗ute l'entr馥 powerfail du fichier /etc/inittab. S'il contient OK, il ex馗ute l'entr馥 powerokwait de inittab.

    5.3 Comment configurer tout 軋 ?

    Ce qui suit pr駸uppose que vous disposez d'un c稈le qui fonctionne correctement avec powerd. Si vous n'en 黎es pas s?, voyez la section : Analyse de c稈les et modification de powerd.c pour toute information sur les c稈les mal d馗rits et la reconfiguration de powerd. Les sections Assignement des broches du port s駻ie et Correspondance entre ioctl et RS232 seront aussi utiles.

    Si vous devez fabriquer un c稈le, voyez la section : Cette derni鑽e peut aussi contenir des informations sur les c稈les fournis par le constructeur. Vous voudrez probablement parcourir toute la section Informations sur un certain nombre d'onduleurs car chaque section contient quelques d騁ails suppl駑entaires g駭駻alement 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 arr黎er le syst鑪e apr鑚 cinq minutes, ou mener toute action appropri馥, et tuer le shutdown en cours, respectivement. En fonction de votre version de shutdown, cela sera, soit si trivial que vous
      telinit q
      
    • Editez rc.local pour lancer powerd lors du lancement. Syntaxe :
      powerd <ligne>
      
    • Branchez une lampe sur l'onduleur.
    • Allumez l'onduleur et la lampe.
    • Lancez powerd.
    • Testez la configuration :
      • D饕ranchez l'onduleur.
        • Contr?ez que la lampe reste allum馥,
        • Assurez-vous que le PC s'arr黎e correctement avant que la batterie soit vide. C'est dangereux, car si la batterie n'assure pas le d駘ai d'arr黎 du PC, vous pouvez vous retrouver avec un syst鑪e de fichiers corrompu, et peut-黎re m麥e la perte de tous vos fichiers. va s'arr黎er proprement lors d'une coupure de courant !

          5.4 Am駘iorations Utilisateur

          • Bidouillez powerd.c pour surveiller la ligne indiquant un faible niveau de batterie.

            6. Notes sur le mat駻iel

            6.1 Comment r饌liser un c稈le ?

            Cette section est juste compos馥 de messages que j'ai vus sur le Net. 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'esp鑽e 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 c稈les et modification de powerd.c

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

            • quelles lignes doivent 黎re maintenues hautes ;
            • quelle(s) ligne(s) 騁eint(gnent) l'onduleur ;
            • quelles lignes l'onduleur modifie pour indiquer que :
                genpower-1.0.1.tgz, power-2.0.tar.gz ou upsd-1.0.tgz d馗rits 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 probl鑪es pour obtenir les informations pr馗it馥s, ou si vous voulez juste les contr?er (une bonne id馥), le programme suivant peut vous y aider. C'est une version bidouill馥 de powerd.c. /* * 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 s駻ie

                La section qui pr馗鐡e pr駸uppose la connaissance de la correspondance entre les signaux de terminal et les broches du port s駻ie. Voici une r馭駻ence de cette correspondance, reprise du document de David Tal : "C稈les et connecteurs fr駲uemment utilis駸". J'inclus un diagramme illustrant les connecteurs, et une table donnant la corresopondance entre les num駻os de broches et les signaux de ligne de terminal.

                Si vous avez besoin d'une r馭駻ence g駭駻ale sur le brochage de c稈les, Yost Serial Device Wiring Standard qui contient des informations int駻essantes sur les connecteurs RJ-45 et les c稈les quatre paires pour toutes les connexions s駻ie ;

              • Stokely consulting pour l'information g駭駻ale 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 tr鑚 bien en sortie html. Broche Broche 1 FG AA 101 --- Masse de chassis GND 2 3 TD BA 103 ---> Donn馥s transmises, TxD 3 2 RD BB 104 <--- Donn馥s re輹es, RxD 6 6 DSR CC 107 <--- Jeu de donn馥s pr黎 7 5 SG AB 102 ---- Masse de signal, GND 8 1 DCD CF 109 <--- D騁ection de porteuse 9 -- -- - - Tension positive continue de test 10 -- -- - - Tension n馮ative continue de test 11 QM -- - <--- Mode d'馮alisation 12 SDCD SCF 122 <--- D騁ection de porteuse secondaire 15 TC DB 114 <--- Signal d'horloge de l'駑etteur 16 SRD SBB 119 <--- Signal d'horloge secondaire du r馗epteur 17 RC DD 115 ---> Signal d'horloge du r馗epteur 18 DCR -- - <--- Horloge divis馥 du r馗epteur 19 SRTS SCA 120 ---> Requ黎e pour 駑ettre secondaire 22 9 RI CE 125 <--- Indicateur de sonnerie 23 -- CH 111 ---> S駘ecteur de vitesse de donn馥s 24 -- CI 112 <--- S駘ecteur de vitesse de donn馥s 25 TC DA 113 <--- Horloge transmise Assignement des broches de port s駻ie (RS-232C), DB-25 et DB-9


                      1                         13         1         5
                    _______________________________      _______________
                    \  . . . . . . . . . . . . .  /      \  . . . . .  /    Connecteurs
                     \  . . . . . . . . . . . .  /        \  . . . .  /     RS-232 vus de
                      ---------------------------          -----------      l'arri鑽e de
                      14                      25            6       9       l'ordinateur
              
                 DTE : Equipement terminal de donn馥s (i.e. ordinateur)
              

              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 num駻iques


              /* 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 troisi鑪e colonne est en hexad馗imal.

              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 sp馗ifiques de certains onduleurs. Ce que je souhaiterais serait de disposer des informations sur le port de contr?e de l'onduleur (ce que fait chaque broche et ce qu'elle attend qui soit fait), sur le c稈le fourni par le constructeur (ce qu'il connecte et où), ainsi qu'une version modifi馥 de powerd.c qui fonctionne avec l'onduleur. De plus, chaque onduleur semble avoir quelques trucs suppl駑entaires qui sont bien d馗rits par les auteurs de chaque section. Ainsi, pour l'heure, je laisse tout en place. Tout pour un HOWTO 駱ais.

              Veuillez m'envoyer vos exp駻iences pour les inclure ici.

              8.1 Exp駻iences g駭駻ales. de r騏ssite diff駻ents.

              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.

              2 ----------+ | \ \| |-------------- /| \/ <--- Le "\/" indique le type de ce |-------------- /| \/ | | +-----+ / / / +------------- | / 10K |/ 6 --\/\/\/--| |\ \/ | | +-----+ / / / 4 ----------+

            (le powerd.c inclus dans SysVinit place ou laisse RTS haut, causant l'arr黎 de l'onduleur imm馘iatement 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 fonctionnalit駸 d'init.

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

            par 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 s駻ie DB-9, les broches 6, 20, 8, 7, 5 et 2 correspondent respectivement aux broches 6, 4, 1, 5, 8 et 3.

            se ferme, faisant descendre CTS.

            Durant une coupure de courant, l'ordinateur peut 騁eindre l'onduleur en montant TX durant 1 ms au moins. appropri駸 au syst鑪e d'exploitation, en l'occurence au processus init. Ce dernier peut ex馗uter des scripts et programmes con輹s pour g駻er (proprement !) l'騅駭ement de coupure de courant.

            Le daemon powerd peut se trouver dans l'un des trois 騁ats suivants :

            Etat 0 - le courant est bon

            Dans cet 騁at, powerd lit le port s駻ie toutes les T0_SLEEP secondes (voir les lignes #define au d饕ut du code source). Si DCD descend, powerd bascule en 騁at 1. Si CTS descend, powerd bascule en 騁at 2 (cela ne doit pas Si DCD remonte, il bascule en 騁at 0. Si CTS tombe, il bascule en 騁at 2.

            Etat 2 - la batterie est faible

            La batterie de l'onduleur est faible. # 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

            /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 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 r駸erve de courant assez importante. applications et de se d馗onnecter. Avant d'ex馗uter la commande shutdown, je v駻ifie qu'il n'y a pas d'autre shutdown en cours. Je cr馥 aussi le fichier /etc/turnUPSoff afin que le syst鑪e arr黎e 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 cr馥 le fichier /etc/turnUPSoff puis on arr黎e le syst鑪e imm馘iatement.

            if [ -f /etc/turnUPSoff ] then echo "Arret de l'onduleur" sleep 5 echo -e "\377" >/dev/cua3 exit 1 fi

            vraisemblablement faire quelques adaptations. N饌mmoins, j'esp鑽e que ce document sera une trace utile pour ceux qui essaieront d'utiliser un onduleur de ce type sous Linux. Si vous rencontrez des difficult駸, recherchez des informations plus g駭駻ales dans le reste de ce Howto. Bonne chance !

            Retour d'informations

            J'appr馗ierais 駭orm駑ent tout retour d'informations concernant ce document, afin de pouvoir affiner celui-ci et y corriger de possibles erreurs (je sais ciro@stud.unipg.it

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

            r駸ultant de l'utilisation du code ni des informations donn馥s 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;
            et de la documentation de Trust.

            Il pr駸ente deux am駘iorations :

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

            Et souvenez-vous que tout ce qui est d馗rit 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
            

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

            Il devrait 黎re assez facile de contr?er leur onduleur. Leur num駻o de t駘駱hone est :

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

            8.7 Deltec Power, Fiskars Power Systems et Exide

            A cette date, Deltec Power 騁ait 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 contr?e avec ses onduleurs qui fonctionne sous Linux. Ils vendent aussi celui-ci s駱ar駑ent 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 envoy馥 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'arr黎 automatique du syst鑪e en cas de coupure de courant de longue dur馥 qui d駱asserait l'autonomie de la batterie de l'onduleur.

            Lansafe III permet les messages "broadcast" et l'envoi de courriers 駘ectroniques en fonction des r馮lages utilisateur. La s駲uence d'arr黎 peut aussi 黎re param騁r馥.

            Deux interfaces sont fournies : mode caract鑽es et X11/Motif.

            Lansafe III fonctionne sur toutes les plateformes majeures de syst鑪es 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 ;
            • s駻ies 9 000 ;
            • s駻ies 10 000.

            Il est aussi possible d'acqu駻ir une licence logicielle s駱ar馥 pour l'utilisation d'un onduleur plus ancien ou d'un autre constructeur. positionn駸 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 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 c稈le 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 b穰e, fourni en sources, donc compilable sous Linux.

            Best Fortress avec le logiciel de Best

            Mini-Howto des onduleurs Best Power

            par Michael Stutz et

            Voici ce qui diff鑽e du manuel, qui ne contient pas actuellement d'instructions sp馗ifiques 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.

          • Maintenant, cr馥z les r駱ertoires pour la documentation et le code source :
            mkdir /usr/doc/best
            mkdir /usr/local/src/best
            
          • Montez le CD-ROM, et d駸archivez le fichier unix/checkups.tar dans un r駱ertoire temporaire :
            cd /tmp
            tar /cdrom/unix/checkups.tar
            
          • Allez dans le r駱ertoire etc/best/advanced qui doit avoir cp source/*.c /usr/local/src/best
          • Nettoyez le chantier dans le r駱ertoire 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 s駻ie de votre choix. Si votre connexion est bonne, vous devriez voir une ligne de carac鑽es 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 arr黎e le syst鑪e apr鑚 quelques instants.
          • 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 Le second module parle au premier, interpr鑼e les r駸ultats, et r駱ond OK ou FAIL.

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

            Les d騁ails se trouvent dans le paquetage lui-m麥e.

            >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 >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 conna? la bonne qualite de leur production (je n'ai pas d'actions chez eux :-() ? 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

            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 pl騁hore de paquetages pour APC cit駸 plus haut ne vous permettent pas de d駑arrer, il est possible que la section qui suit soit d'une comporte une copie de courrier 駘ectronique)  :

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

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

            lecture/馗riture, soit (de pr馭駻ence) utiliser TX (broche 3) plut? que RTS (broche 7) pour 騁eindre l'onduleur (la num駻otation 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 s?e. Je posterai peut-黎re les diff si le temps me le permet...

            BUPS-HOWTO

            Luminated Software Group Pr駸ente

            HOWTO utilisation d'onduleurs Back-UPS (d'APC) (pour prot馮er votre syst鑪e Linux)

            Version: 1.01 BETA

            Document de : Christian G. Holtje Information sur le c稈lage et aide : Ben Galliart

            Adaptation fran軋ise : 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 r馭駻ences de pi鐵es d騁achees Power-Chute, et n'黎es pas s? que le jeu en vaille la chandelle. Bien, j'ai fait mon propre c稈le, et mon propre logiciel et je les utilise pour arr黎er automatiquement mon syst鑪e Linux lors d'une coupure secteur. Vous savez quoi ? --------------------- Cote Male (vers l'onduleur) \ B R * * * / \ * * * V / ------------ --------------------- Cote femelle (vers le port COM) \ R * * * V / \ * B * * / ------------

            Pour ceux qui pr馭鑽ent les chiffres :

                  Male         Femelle
            ---------------------------------------
                    1             7        Bleu
                    2             1        Rouge
            
               ---------------------
                \  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 騁ait la connexion de la ligne RS-232 de l'onduleur "Fail Output" sur CD, le ch龝sis de l'onduleur sur Gnd, et l'entr馥 "Shut Down" sur RTS. Facile, maintenant qu'on vous le dit, non ?

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

            *** Le Logiciel ***

            J'utilise le paquetage SysVInit de Miquel van Smoorenburg pour Linux L'alimentation ne sera coup馥 que s'il y a un probl鑪e secteur et que l'onduleur est sur batteries. Une fois le courant revenu, il se rallume.

            Pour le lancer comme d駑on, entrez simplement :

            backupsd /dev/backups
            

            Ensuite, si le secteur s'arr黎e, 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
            # 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
            

            *** Où l'obtenir ***

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

            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 d? ***

            Christian Holtje Documentation backupsd.c (ce qui n'est pas de Miquel) rc.power ;
          • Ben Galliart Le c稈le, informations sur le standard RS-232 et astuces bruyantes (non rapport馥s 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.
           *
          #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

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

          Selon la base de connaissances (KnowledgeBase) de Microsoft, il

          Les sch駑as de brochage sont invers駸 en ce qui concerne les connecteurs m稷es : en effet, les broches sont num駻ot馥s de mani鑽e inverse sur les connecteurs m稷es et femelles (puisque leurs sens s'opposent lors du brancement). 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 c稈le standard d'APC. La r馭駻ence du c稈le 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 mentionn駸 plus haut Enhanced_APC_UPSD-v1.4.tar.gz, apcd-0.5.tar.gz et smupsd-0.7-1.i386.rpm d馗rits dans la section Logiciels). Je ne sais pas ce que vaut le support pour chacun d'eux. Clive A. Stubbings me dit que cela fonctionne bien apr鑚 quelques ajustements du script d'installation. Il dit que le seul probl鑪e est que "l'interface graphique semble avoir Analyse de c稈les et modification de powerd.c.

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

          R饌lisation du c稈le pour un APC Smart-UPS mod鑞e 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 Pour monter, la broche 8 est l'alimentation d'un r馮ulateur de tension de +5V. La sortie de ce r馮ulateur 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). 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 syst鑪e Linux sur une carte ASUS.

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

          1) faire un c稈le 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 ; 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 5 4 1 6: DSR 8: CTS

          Il faut r饌liser 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     |
           *              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.
           *              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 re輟it les commandes INIT_CMD et lance les scripts idoines :

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

          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 黎re simple ;-)

          durant ces 20 secondes (en particulier, de monter les volumes disque). Cela ne fut pas un probl鑪e pour mon syst鑪e.

          Quatre m騁hodes simples permettent d'emp鹹her Linux de d駑arrer rapidement :

          1. le BIOS doit r饌liser certaines routines (comme identifier le nombre

            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
            

            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'騁at de l'onduleur (courant pr駸ent ou absent, batterie faible ou bonne). # 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 m麥e onduleur ?

          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 plut? que de contr?er une ligne s駻ie.

          powerfail, tous les deux avec le m麥e UID. Faites de /etc/powerokscript le shell du user powerok, et de /etc/powerfailscript celui du user powerfail. Sur le ma?re, 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