|
このページは大阪弁化フィルタによって翻訳生成されたんですわ。 |
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.
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.
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.
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.
L'auteur ( David E. Myers) 馗rit :
smupsd surveille un APC Smart-UPS[TM] sous Red Hat[TM] Linux.
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.
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.
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.Du fichier .lsm :
Programme qui interagit avec les sauvegardes batteries (onduleurs Powerbox).
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.
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 馗ritFAIL dans /etc/powerstatus et envoie un signal
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.
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.
/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
/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
powerd <ligne>
powerd.c pour surveiller la ligne indiquant un faible
niveau de batterie.
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'
Essayez d'obtenir la documentation des c稈les que votre revendeur d'onduleurs fournit. En particulier, recherchez :
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); }
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 ;
Incidemment, il semble que le paquetage Linuxdoc-sgml ne formate plus les tableaux tr鑚 bien en sortie html. Broche
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 !)
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 descendreCTS.
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.
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.
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 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.
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
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
/************************************************************************/
/* 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 */
/************************************************************************/
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).
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 :
Il est aussi fourni avec les onduleurs FPS Power Systems :
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 :
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".
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.
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.
mkdir /usr/doc/best
mkdir /usr/local/src/best
unix/checkups.tar
dans un r駱ertoire temporaire :
cd /tmp
tar /cdrom/unix/checkups.tar
etc/best/advanced qui doit avoir
cp source/*.c /usr/local/src/best
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
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.
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 CircuitSi 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 utiliserioctl(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...
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 ;
/* 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 */
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.
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 :
- 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 #
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