Le HOWTO des onduleurs (UPS)
Harvey J. Stein,
[email protected], Berger Financial
Research, Ltd. adaptation francaise B.Choppy, 10 mai 1998
v2.42, 18 novembre 1997
Ce document vous aidera a connecter un onduleur sur une machine
Linux... si vous avez de la chance ... Copyright (c) 1994, 1995,
1996, 1997 Harvey J. Stein. Vous pouvez utiliser ce document comme
vous l'entendez, tant qu'il reste intact. En particulier, cette note
(ainsi que les contributions ci-dessous) doit rester intouchee. NdT :
La traduction de ce HOWTO est particulierement delicate, en ce qu'il
integre de nombreux messages echanges sur InterNet reproduits a
l'identique. Autant que possible, on aura conserve le sens general de
ces messages, sans toutefois les reproduire systematiquement en
entier, leur lecture en devenant vite fastidieuse. Dans certains cas,
une partie en anglais est conservee, en particulier dans les en-tetes
de messages. Les noms de signaux et broches de connexion ont ete
traduits, mais leur abreviation originelle conserve (par exemple,
DCD : Detection de porteuse). Une copie de la notice originale de
copyright est conservee, y compris dans les sources des programmes.
Le traducteur attire l'attention de ses lecteurs sur le risque
d'erreur introduite lors de la traduction des commentaires et messages
dans les programmes source, pouvant rendre ceux-ci impossibles a com-
piler ou inutilisables. La reference en ce cas est, comme toujours,
la version originelle du document (en anglais). Version originale de
la notice de copyright : You may use this document as you see fit, as
long as it remains intact. In particular, this notice (along with the
contributions below) must remain untouched.
11.. IInnttrroodduuccttiioonn
Ce HOWTO concerne la connexion d'un onduleur sur un PC sous Linux.
L'idee est d'etablir la connexion de telle sorte que Linux puisse
s'arreter proprement lorsque le courant s'arrete.
Cela inclut la reference a des paquetages logiciels existants
facilitant l'etablissement de ce genre de communications, et la
maniere dont celles-ci sont realisees. Ce dernier point est souvent
superfetatoire si vous pouvez trouver un paquetage tout configure pour
votre onduleur. Sinon, il vous faudra lire ce qui suit.
Dans une large mesure, le present document est encore plus redondant
que lorsque j'en ai ecrit la premiere version en 1994. Toutes les
informations de base ont toujours ete presentes dans les pages de man
de _p_o_w_e_r_d fournies avec le paquetage _S_y_s_V_i_n_i_t. Alors qu'en 1994 il
arrivait souvent que les distributions ne comportent meme pas lesdites
pages de man, je ne crois pas que ce soit encore le cas.
De plus, lorsque j'ai ecrit la premiere version de ce Howto, il
n'existait aucun autre logiciel que _p_o_w_e_r_d pour la communication et le
controle entre Linux et les onduleurs. Maintenant, il existe un
certain nombre de paquetages de controle d'onduleurs dans le
repertoire UPS de Sunsite.
Malgre tout, je continue a maintenir le Howto des onduleurs. Pourquoi
donc ? Eh bien :
+o une seconde source d'informations peut aider a la comprehension de
la methode de connexion de Linux a un onduleur, meme s'il s'agit
simplement de la meme information, ecrite differemment ;
+o le HOWTO peut servir de repository pour les donnees specifiques des
onduleurs - de nombreux onduleurs ne sont pas encore geres par les
paquetages generaux ;
+o le HOWTO contient des details supplementaires qui ne se trouvent
pas dans d'autres documents ;
+o ce document semble avoir maintenant sa vie propre. La necessite de
creation d'un Howto se fait sentir clairement. Il est moins
evident de definir l'instant ou il doive etre mis en sommeil.
11..11.. CCoonnttrriibbuutteeuurrss
Je suis debiteur a vie de ceux dont j'ai recu de l'aide, des
suggestions, ainsi que des donnees specifiques d'onduleurs. La liste
inclut :
+o Hennus Bergman (
[email protected]) ;
+o Charli (
[email protected]) ;
+o Ciro Cattuto (Ciro Cattuto) ;
+o Nick Christenson (
[email protected]) ;
+o Lam Dang (
[email protected]) ;
+o Markus Eiden (
[email protected]) ;
+o Dan Fandrich (
[email protected]) ;
+o Ben Galliart (
[email protected]) ;
+o Danny ter Haar (
[email protected]) ;
+o Christian G. Holtje (
[email protected]) ;
+o Raymond A. Ingles (
[email protected]) ;
+o Peter Kammer (
[email protected]) ;
+o Marek Michalkiewicz (
[email protected]) ;
+o Jim Ockers (
[email protected]) ;
+o Evgeny Stambulchik (
[email protected]) ;
+o Clive A. Stubbings (
[email protected]) ;
+o Miquel van Smoorenburg (
[email protected]) ;
+o Slavik Terletsky (
[email protected]) ;
+o Tom Webster (
[email protected]).
Notez que les adresses e-mail apparaissant dans les extraits de
courriers ci-apres peuvent etre obsoletes. Ce qui precede l'est
propablement aussi, mais quelques-unes sont plus recentes que ce qui
se trouve plus bas.
Mes excuses aussi a quiconque j'aie oublie de citer dans cette liste.
Envoyez-moi un e-mail et je vous ajouterai.
11..22.. AAvveerrttiisssseemmeenntt iimmppoorrttaanntt
Je ne peux reellement pas garantir que quelque partie de ceci
fonctionne pour vous. Connecter un onduleur a un ordinateur peut etre
un travail d'astuce. L'un ou l'autre, ou les deux peuvent bruler,
exploser, mettre le feu, ou commencer la Troisieme Guerre Mondiale.
De plus, je n'ai une experience directe que de l'onduleur Advice
1200 A, et je n'ai pas eu a fabriquer de cable. Donc, _S_O_Y_E_Z _P_R_U_D_E_N_T_,
_R_A_S_S_E_M_B_L_E_Z _T_O_U_T_E _L_'_I_N_F_O_R_M_A_T_I_O_N _P_O_S_S_I_B_L_E _S_U_R _V_O_T_R_E _O_N_D_U_L_E_U_R_.
_R_E_F_L_E_C_H_I_S_S_E_Z _D_'_A_B_O_R_D_. _N_E _C_R_O_Y_E_Z _P_A_S _A _P_R_I_O_R_I _C_E _Q_U_E _V_O_U_S _L_I_S_E_Z _I_C_I _N_I
_A_I_L_L_E_U_R_S.
D'un autre cote, j'ai reussi a tout faire fonctionner avec mes
onduleurs, sans beaucoup d'informations des constructeurs, et sans
faire fumer quoi que ce soit, donc c'est possible.
11..33.. AAuuttrreess ddooccuummeennttss
Ce document ne traite pas des fonctions et possibilites generales des
onduleurs. Pour ce genre d'informations, voyez la Foire Aux Questions
La FAQ UPS. Elle peut aussi etre trouvee sur
ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/answers/UPS-faq. Elle
est maintenue par Nick Christenson, mais semble n'avoir pas ete mise a
jour depuis 1995. Si vous lui envoyez un e-mail, il souhaiterait
qu'apparaisse _U_P_S ou _U_P_S _F_A_Q ou quelque chose de similaire dans la
ligne Subject de votre message.
Il y a aussi de plus en plus de constructeurs d'onduleurs present sur
le Net. Certains d'entre aux fournissent reellement des informations
utiles sur leur site Web. Une liste pratique des sites web des
constructeurs est disponible sur Repertoire des onduleurs. Le meme
site propose aussi une FAQ des onduleurs.
22.. NNoottee iimmppoorrttaannttee ccoonncceerrnnaanntt ll''oobbssoolleesscceennccee ddeess iinnffoorrmmaattiioonnss
Je viens de decouvrir qu'une partie de la documentation ci-dessous est
obsolete. En particulier, le daemon _i_n_i_t fourni avec le dernier
paquetage sysinit est plus sophistique que ce que j'ai decrit. Bien
qu'il semble que la compatibilite ascendante soit assuree pour ce qui
est ecrit ici, il apparait que certaines fonctions non documentees
sont ttrreess iimmppoorrttaanntteess pour la gestion des onduleurs.
Le mecanisme de controle indique ci-apres permet seulement a _p_o_w_e_r_d
d'envoyer a _i_n_i_t un des messages _p_o_w_e_r_f_a_i_l ou _p_o_w_e_r_o_k. _i_n_i_t execute
une commande lorsqu'il recoit _p_o_w_e_r_f_a_i_l et une autre lorsqu'il recoit
_p_o_w_e_r_o_k. Cela complexifie la logique de _p_o_w_e_r_d pour la gestion des
signaux de batterie faible et autres sortes de situations speciales.
Les nouvelles versions d'_i_n_i_t (depuis la version 2.58, apparemment)
sont plus sophistiquees. Il est possible de leur demander d'executer
un script parmi _t_r_o_i_s. Ainsi, _i_n_i_t peut avoir un script _p_o_w_e_r_f_a_i_l
pour traiter une coupure de courant, un script _p_o_w_e_r_f_a_i_l_n_o_w pour
realiser un arret immediat et un script _p_o_w_e_r_o_k pour bloquer tout
arret en cours. C'est nettement plus propre que les circonvolutions
necessaires avec le mecanisme detaille plus bas.
Bien qu'une grande partie du document soit fondee sur l'ancienne
methode de communication avec _i_n_i_t, je viens d'ajouter deux nouvelles
sections dans lesquelles les auteurs utilisent la nouvelle methode.
Il s'agit de ``Trust Energy Protector 400/600'' et APC Smart-UPS 700.
La premiere est particulierement detaillee. Les deux comportent un
_p_o_w_e_r_d_._c qui demande a _i_n_i_t un shutdown immediat lorsqu'un signal de
batterie faible est recu, ainsi que les lignes correspondantes de
_/_e_t_c_/_i_n_i_t_t_a_b. Pour tout le reste, je peux juste vous dire de regarder
dans le code source de _i_n_i_t.
Aussi, pour autant que je sache, de nombreux paquetages cites ci-
dessous utilisent aussi la nouvelle methode de communication.
(-- NdT : Il semble que la plupart des contributeurs a ce Howto
s'appuient sur le redemarrage de l'ordinateur (/sbin/reboot), couple a
une temporisation, pour realiser l'extinction de l'onduleur. Cette
methode semble hasardeuse. Le traducteur propose humblement au
lecteur d'etudier la possibilite de remplacer la relance complete
(reboot) par un arret systeme propre (shutdown -h) ou moins propre
(halt). Cette methode permet d'eviter totalement le risque que
l'onduleur s'arrete "trop tard" dans le processus de demarrage de
l'ordinateur (i.e. lorsque les systemes de fichiers sont deja
montes).--)
33.. OOnndduulleeuurr bbeettee,, oonndduulleeuurr iinntteelllliiggeenntt
Les onduleurs peuvent se classer dans deux categories : "intelligents"
ou "betes". La difference entre les deux reside dans la quantite
d'informations que l'on peut obtenir de et le niveau de controle que
l'on peut exercer sur l'onduleur.
OOnndduulleeuurr ""bbeettee""
+o se connecte a l'ordinateur par le port serie ;
+o utilise les lignes de controle modem pour communiquer avec
celui-ci ;
+o peut indiquer si le courant est present ou non ;
+o peut typiquement indiquer si la batterie est faible ;
+o accepte habituellement un ordre d'arret de la part de
l'ordinateur.
OOnndduulleeuurr ""iinntteelllliiggeenntt""
+o se connecte a l'ordinateur par le port serie ;
+o communique avec celui-ci par transfert de donnees normal sur le
port serie ;
+o dispose typiquement d'une sorte de langage de commandes que
l'ordinateur peut utiliser pour obtenir diverses informations,
positionner certains parametres de fonctionnement et controler
l'onduleur (pour arreter celui-ci, par exemple).
Habituellement, les onduleurs intelligents peuvent fonctionner en mode
bete. C'est utile, car pour autant que je sache, les entreprises qui
construisent les onduleurs les plus populaires (notamment APC) ne
diffusent leur protocole de communication qu'aux entreprises qui
signent un accord de confidentialite.
Autant que je sache, les seuls onduleurs intelligents avec lesquels il
soit simple de communiquer sont ceux faits par Best. De plus, Best
documente completement le mode intelligent (ainsi que le mode bete) et
fournit le source de programmes qui communiquent avec leurs onduleurs.
Tous les paquetages indiques dans la section ``Logiciels''
communiqueront avec les onduleurs en mode bete. C'est tout ce dont on
a reellement besoin. Ceux specifiques des onduleurs APC annoncent
diverses possibilites d'utilisation en mode intelligent, mais je ne
sais pas exactement ce qu'ils permettent. Une implementation complete
vous affichera une fenetre avec toutes sortes de jauges affichant
diverses statistiques de l'onduleur, telles que charge, temperature
interieure, historique des coupures, voltages d'entree et de sortie,
etc. Il semble que le paquetage _s_m_u_p_s_d_-_0_._9_-_1_._i_3_8_6_._r_p_m (section
``Logiciels'' se rapproche de cela. Je ne suis pas sur pour les
autres.
Le reste de ce document est essentiellement limite a la configuration
de votre systeme avec un onduleur bete. L'idee generale est a peu
pres la meme avec un onduleur intelligent, mais les details de
fonctionnement de _p_o_w_e_r_d et le type de cable sont differents pour un
onduleur intelligent.
44.. LLooggiicciieellss
Fondamentalement, tout ce qu'il vous faut est un executable _p_o_w_e_r_d,
habituellement place dans _/_s_b_i_n_/_p_o_w_e_r_d. Il fait habituellement partie
du paquetage _S_y_s_V_i_n_i_t. Pour autant que je sache, toutes les
distributions actuelles de Linux contiennent une version recente de
_S_y_s_V_i_n_i_t. Les versions tres anciennes ne comportaient pas _p_o_w_e_r_d.
Le seul probleme que vous puissiez rencontrer est que votre cable ne
corresponde pas a la configuration de _p_o_w_e_r_d, auquel cas vous devrez,
soit rebrocher votre cable, soit trouver une copie de _p_o_w_e_r_d_._c et le
modifier pour le faire fonctionner avec votre cable. Ou, pour cela,
vous pouvez toujours utiliser l'un des paquetages suivants, dont de
nombreux permettent la configuration du cable.
Comme indique, une alternative au _p_o_w_e_r_d du paquetage _S_y_s_V_i_n_i_t est
l'utilisation de l'un des paquetages disponibles maintenant. il
existe de nombreux paquetages qui aident a configurer la communication
entre l'ordinateur et un onduleur. Aucun d'entre eux n'etait
disponible lorsque j'ai ecrit ce Howto pour la premiere fois, c'est
pourquoi j'ai eu a l'ecrire. En fait, il y a de bonnes chances que
vous puissiez utiliser l'un de ces paquetages logiciels et eviter
totalement le present Howto !
Au 15 mars 1997 a peu pres, le repertoire UPS de Sunsite disposait
d'un certain nombre de paquetages. D'autres sites semblent avoir
aussi des paquetages de controle d'onduleurs. Voici ce que j'ai
trouve (tous sur Sunsite sauf deux) :
EEnnhhaanncceedd AAPPCC BBaacckkUUPPSS..ttaarr..ggzz
Un paquetage de controle des onduleurs intelligents APC Smart-
UPS. Il semble suivre basiquement le BUPS-Howto (Back-UPS-
Howto, inclus ci-apres), mais semble aussi disposer d'une sorte
de signal de batterie faible.
EEnnhhaanncceedd AAPPCC UUPPSSDD--vv11..44..ttaarr..ggzz
Le fichier _._l_s_m dit qu'il s'agit du meme paquetage que le
precedent, sous forme de _._t_a_r_._g_z dans un _._t_a_r_._g_z ! La
documentation est legere. Il semble gerer les onduleurs APC
dans les deux modes bete et intelligent, mais je ne peux m'en
assurer.
EEnnhhaanncceedd AAPPCC UUPPSSDD--vv11..44..ttaarr..ggzz
Un autre paquetage de controle des onduleurs APC Smart-UPS.
Semble inclure une sorte de support maitre/esclave (i.e. une
machine en previent une autre de s'arreter lorsque le courant
est coupe). Semble utiliser les onduleurs en mode intelligent,
par opposition a la bascule des lignes modem.
ssmmuuppssdd--00..99--11..ii338866..rrppmm
ssmmuuppssdd--00..99--11..ssrrcc..rrppmm
L'auteur ( David E. Myers) ecrit :
smupsd surveille un APC Smart-UPS[TM] sous Red Hat[TM] Linux.
Si le courant est coupe, smupsd arretera le systeme et
l'onduleur de maniere correcte.
smupsd a les fonctionnalites suivantes :
+o arret du systeme et de l'onduleur en fonction de la charge
residuelle de ce dernier ou du temps ecoule depuis la coupure de
courant ;
+o surveillance des parametres de l'onduleur en temps reel depuis
toute machine a l'aide du programme graphique upsmon, ecrit en
JavaTM ;
+o trace des parametres de l'onduleur dans un fichier pour analyse
et edition ;
+o mode maitre/esclave permettant a des systemes additionnels
partageant le meme onduleur de lire les parametres de celui-ci
sur la machine qui lui est connectee par port serie ;
+o controle des acces reseau a l'aide du fichier _/_e_t_c_/_h_o_s_t_s_._a_l_l_o_w.
ggeennppoowweerr--11..00..11..ttggzz
Un paquetage general de gestion d'onduleurs. Inclut des
configurations pour beaucoup d'onduleurs - deux pour TrippLite
et trois pour APC. Contient une bonne documentation. Un bon
achat.
ppoowweerrdd--22..00..ttaarr..ggzz
Un _p_o_w_e_r_d de remplacement de celui du paquetage _S_y_s_V_i_n_i_t. A
l'oppose des commentaires de la documentation, il ne semble pas
avoir ete fusionne avec ce dernier (du moins jusqu'a la version
2.62). Ses avantages resident dans le fait qu'il puisse agir
comme serveur pour d'autres _p_o_w_e_r_d tournant sur d'autres
machines (lorsque plusieurs machines d'un reseau partagent le
meme onduleur) et etre configure par le biais d'un fichier - le
source ne necessite donc ni edition ni recompilation.
uuppssdd--11..00..ttggzz
Un autre _p_o_w_e_r_d de remplacement. Semble etre assez comparable
en fonctionnalites avec powerd-2.0.tar.gz.
cchheecckkuuppss..ttaarr
Ce paquetage est destine a controler les onduleurs Best. Il
provient directement du site Web de Best. Comporte des binaires
pour de nombreux _u_n_i_x mais, plus important, inclut le code
source, il est donc possible de l'essayer sous Linux, et s'il ne
fonctionne pas, de tenter de le corriger. Le source inclut
aussi bien les "controles de base (basic checkups)" que les
"controles avances (advanced checkups)" qui sont un peu plus
sophistiques - ils declenchent un shutdown lorsque l'onduleur
indique une duree d'alimentation restante de X minutes, plutot
qu'au bout de Y minutes apres la coupure de courant. Le
programme de controles avances declenche aussi sur diverses
alarmes telles que "temperature ambiante elevee", "batterie
proche du minimum", "tension de sortie faible" ou "alarme test
declenchee par l'utilisateur".
bbeessttuuppss--00..99..ttaarr..ggzz
Un paquetage qui peut bien se trouver sur Sunsite a l'instant ou
vous lisez ceci. C'est une paire de modules de communication
qui travaillent avec les onduleurs Best Ferrups. Il gere
l'onduleur en mode intelligent. Il inter-opere correctement
avec _p_o_w_e_r_d_-_2_._0 - utile si vous avez un gros Ferrups pour toutes
les machines d'un reseau.
Note : ce paquetage doit encore etre charge vers Sunsite. Je
continue a presser l'auteur de le finir et de le charger, mais
il doit encore en trouver le temps.
LLaannSSaaffee IIIIII
Deltec Electronics (et Exide) vendent un paquetage logiciel
appele LanSafe III. Il existe une version Linux. Il est fourni
avec leurs onduleurs. Ils disent qu'il fonctionne aussi avec
d'autres onduleurs (en mode bete).
aappccuuppssdd--22..88..ttaarr..ggzz
L'auteur (Andre Hedrick) ecrit :
apcupsd-2.1.tar.gz remplace Enhanced_APC_UPSD.tar.gz.
C'est un paquetage tres complet pour les onduleurs APC. Il gere
toute leur gamme. J'ai maintenant ajoute un mode intelligent au
paquetage et un support pour les cables APC ou maison si aucun
cable APC n'est gere.
ssmmaarrttuuppss--11..11..ttggzz
Du fichier _._l_s_m :
Un powerd et un utilitaire graphique sous X11 qui vous montre
les voltages, frequences, pourcentages de charge et niveau de
batterie en temps reel. Les protocoles "Safeware" et
"Tripplite" sont geres. Source et binaires ELF.
uuppss..ttaarr..ggzz
Du fichier _._l_s_m :
Programme qui interagit avec les sauvegardes batteries
(onduleurs Powerbox).
uussvvdd--22..00..00..ttggzz
Du fichier _._l_s_m :
uvsd est un daemon qui surveille l'etat d'un onduleur et reagit
aux changements d'etats (coupure de courant, retour du courant,
batterie faible). Vous pouvez ecrire vos propres scripts qui
sont appeles dans ces cas. Il ne necessite _p_a_s SysVinit.
Notez que j'ai seulement jete un coup d'oeil aux paquetages. Je ne
les ai pas utilises. Nous etions proches d'utiliser
bestups-0.9.tar.gz et powerd-2.0.tar.gz mais nous ne l'avons jamais
fait.
55.. FFaaiitteess--llee vvoouuss--mmeemmee
Ce chapitre est specifiquement destine au controle des onduleurs
betes. Neammoins, une grande partie du processus est a peu pres
identique pour les onduleurs intelligents. La principale difference
reside dans la maniere dont le daemon (typiquement _p_o_w_e_r_d) de
surveilance communique avec l'onduleur.
Avant de faire quoi que ce soit, je suggere l'algorithme suivant :
+o parcourir ce document ;
+o telecharger et etudier tous les paquetages qui semblent adaptes
specifiquement a son onduleur ;
+o telecharger et etudier les paquetages plus generiques. Notes que
certains d'entre eux sont en fait plus puissants, mieux documentes
et plus faciles d'emploi que leurs equivalents specifiques ;
+o si les choses ne se passent pas bien ou si certains points restent
obscurs, lire le present document avec attention et bidouiller avec
ardeur et precaution...
55..11.. QQuuee ffaauutt--iill ffaaiirree ((ssoommmmaaiirreemmeenntt)) ??
+o brancher l'ordinateur sur l'onduleur ;
+o connecter le port serie de l'ordinateur a l'onduleur avec un cable
special ;
+o lancer _p_o_w_e_r_d (ou un de ses equivalents) sur l'ordinateur ;
+o configurer _i_n_i_t pour realiser quelque chose de raisonnable sur les
evenements _p_o_w_e_r_f_a_i_l et _p_o_w_e_r_o_k (comme lancer un _s_h_u_t_d_o_w_n et tuer
tout _s_h_u_t_d_o_w_n en cours respectivement, par exemple).
55..22.. CCoommmmeenntt eesstt--ccee ssuuppppoossee ffoonnccttiioonnnneerr ??
TTrraavvaaiill ddee ll''oonndduulleeuurr
Lorsque le courant s'arrete, l'onduleur continue d'alimenter le
PC et signale l'arret du courant par bascule d'un relais ou d'un
optocoupleur sur son port de controle.
TTrraavvaaiill dduu ccaabbllee
Le cable est concu de telle maniere que lorsque l'onduleur
bascule ledit relais, cela monte un signal de controle
particulier de la ligne serie (typiquement _D_C_D, detection de
porteuse)
TTrraavvaaiill ddee ppoowweerrdd
Le daemon _p_o_w_e_r_d controle le port serie. Il maintient
leves/baisses les signaux de controle du port serie dont
l'onduleur a besoin (typiquement _D_T_R, Terminal de Donnees Pret,
doit rester leve, et touts les signaux qui coupent l'onduleur
doivent etre maintenus baisses). Lorsque _p_o_w_e_r_d voit le signal
de controle de l'onduleur monter, il ecrit FAIL dans
/etc/powerstatus et envoie un signal SIGPWR au process _i_n_i_t (les
anciennes versions de _p_o_w_e_r_d et _i_n_i_t ecrivent dans
/etc/powerfail). Lorsque le signal de controle redescend, il
ecrit OK dans /etc/powerstatus et envoie un signal SIGPWR a
_i_n_i_t.
TTrraavvaaiill ddee iinniitt ((eenn pplluuss ddee ttoouutt ccee qquu''iill ffaaiitt ppaarr aaiilllleeuurrss))
Lorsqu'il recoit un signal SIGPWR, il regarde dans
/etc/powerstatus. Si celui-ci contient FAIL, il execute
l'entree powerfail du fichier /etc/inittab. S'il contient OK,
il execute l'entree powerokwait de inittab.
55..33.. CCoommmmeenntt ccoonnffiigguurreerr ttoouutt ccaa ??
Ce qui suit presuppose que vous disposez d'un cable qui fonctionne
correctement avec _p_o_w_e_r_d. Si vous n'en etes pas sur, voyez la
section : ``Analyse de cables et modification de powerd.c'' pour toute
information sur les cables mal decrits et la reconfiguration de
_p_o_w_e_r_d. Les sections ``Assignement des broches du port serie'' et
``Correspondance entre ioctl et RS232'' seront aussi utiles.
Si vous devez fabriquer un cable, voyez la section : ``Comment
realiser un cable ?'' pour les details generaux, et la sous-section
de : ``Informations sur un certain nombre d'onduleurs'' qui se
rapporte a votre onduleur. Cette derniere peut aussi contenir des
informations sur les cables fournis par le constructeur. Vous voudrez
probablement parcourir toute la section ``Informations sur un certain
nombre d'onduleurs'' car chaque section contient quelques details
supplementaires generalement utiles.
+o Editez /etc/inittab. Placez-y quelque chose de ce genre :
# Que faire si le courant s'arrete
# (arreter le systeme et vider la batterie :) :
pf::powerfail:/etc/powerfailscript +5
# Si le courant revient avant la fin du shutdown, arreter celui-ci
pg:0123456:powerokwait:/etc/powerokscript
+o Ecrivez les scripts /etc/powerfailscript et /etc/powerokscript pour
arreter le systeme apres cinq minutes, ou mener toute action
appropriee, et tuer le shutdown en cours, respectivement. En
fonction de votre version de shutdown, cela sera, soit si trivial
que vous n'aurez meme pas a ecrire de script, soit un script d'une
ligne _b_a_s_h, quelque chose du genre :
kill `ps -aux | grep "shutdown" | grep -v grep | awk '{print $2}'`
et vous conserverez les scripts (au cas ou cela ne vous arriverait pas
dans un parfait etat, la premiere apostrophe sur la ligne ci-dessus
est une quote inversee, la seconde et la troisieme sont des apostro-
phes, et la derniere est aussi une quote inversee).
+o Dites a _i_n_i_t de relire le fichier inittab avec :
telinit q
+o Editez rc.local pour lancer _p_o_w_e_r_d lors du lancement. Syntaxe :
powerd <ligne>
Remplacez <ligne> par le port serie modem sur lequel sera connecte
l'onduleur, comme dans : /dev/cua1.
+o Connectez le port serie du PC a celui de l'onduleur. NE BRANCHEZ
PAS ENCORE LE PC SUR L'ONDULEUR.
+o Branchez une lampe sur l'onduleur.
+o Allumez l'onduleur et la lampe.
+o Lancez _p_o_w_e_r_d.
+o Testez la configuration :
+o Debranchez l'onduleur.
+o Controlez que la lampe reste allumee,
+o Controlez que /etc/powerfailscript est lance,
+o Controlez que le shutdown est lance.
+o Rebranchez l'onduleur.
+o Controlez que la lampe reste allumee,
+o Controlez que /etc/powerokscript est lance,
+o Controlez que /etc/powerfailscript n'est pas lance,
+o Controlez que le shutdown est bien arrete.
+o Redebranchez l'onduleur. Laissez-le debranche et verifiez que le PC
s'arrete proprement dans un delai correct.
+o LLaa PPaarrttiiee DDeelliiccaattee.. Une fois que tout semble correct, arretez le
PC et branchez-le sur l'onduleur. Lancez un script qui synchronise
le disque dur toutes les secondes ou a peu pres (sync).
Simultanement, lancez un second script qui execute un find sur
votre disque entier. Le premier sert a rendre l'operation plus
sure, et le second, a consommer le maximum de puissance.
Maintenant, tirez sur la prise de l'onduleur, verifiez une fois de
plus que le PC est lance, et attendez. Assurez-vous que le PC
s'arrete correctement avant que la batterie soit vide. C'est
dangereux, car si la batterie n'assure pas le delai d'arret du PC,
vous pouvez vous retrouver avec un systeme de fichiers corrompu, et
peut-etre meme la perte de tous vos fichiers. Vous devriez
probablement realiser une sauvegarde complete avant ce test, et
positionner un delai de shutdown tres court pour commencer.
Felicitations ! Vous avez maintenant un PC sous Linux protege par
onduleur qui va s'arreter proprement lors d'une coupure de courant !
55..44.. AAmmeelliioorraattiioonnss UUttiilliissaatteeuurr
+o Bidouillez powerd.c pour surveiller la ligne indiquant un faible
niveau de batterie. Dans ce cas, executez un shutdown iimmmmeeddiiaattee ;
+o Modifiez la procedure de shutdown, afin que lorsqu'elle s'execute
dans des conditions de coupure de courant, elle eteigne l'onduleur
apres avoir effectue tout le necessaire.
66.. NNootteess ssuurr llee mmaatteerriieell
66..11.. CCoommmmeenntt rreeaalliisseerr uunn ccaabbllee ??
Cette section est juste composee de messages que j'ai vus sur le Net.
Je ne l'ai pas realise, donc je ne peux parler d'experience. Si
quelqu'un le peut, qu'il ecrive cette section pour moi :). Voir aussi
le message concernant le GPS1000 dans la section ``GPS1000
d'ACCODATA'' pour ne pas citer toutes les donnees specifiques de la
section ``Informations sur un certain nombre d'onduleurs''
>From
[email protected] Wed Jul 21 14:26:33 1993
Newsgroups: comp.os.linux
Subject: Re: Interface onduleur pour Linux ?
From:
[email protected] (Miquel van Smoorenburg)
Date: Sat, 17 Jul 93 18:03:37
Distribution: world
Organization: Cistron Electronics.
Dans l'article <
[email protected]>
[email protected] (Joel M. Hoffman) ecrit_:
>Je ne vais pas tarder a acheter un onduleur, et ai remarque que certains
>d'entre eux ont des interfaces reseau pour prevenir celui-ci lorsque le
>courant est coupe.
>
>Y a-t-il une telle interface pour Linux ?
>
>Merci..
>
>-Joel
>(
[email protected])
>
Lorsque je travaillais sur la derniere version de SysVinit (2.4
actuellement), j'ai eu temporairement un onduleur sur mon ordinateur,
donc j'ai ajoute le support de celui-ci.
Tu as peut-etre vu que dans le dernier fichier d'en-tete <signal.h>,
il y a maintenant un #define SIGPWR 30 :-).
Malgre tout, je n'avais pas une telle interface speciale,
mais la sortie de nombreux onduleurs est juste un relais qui s'ouvre ou se
ferme en cas de coupure de courant.
J'ai reflechi a une methode simple pour connecter ca sur la ligne DCD du
port serie.
Dans le paquetage SysVinit, il y a un demon appele "powerd" qui garde
un oeil sur cette ligne serie et envoie SIGPWR a init lorsque l'etat
change, pour qu'init puisse faire quelque chose (comme arreter le systeme
dans les 5 minutes).
La methode de connexion de l'onduleur a la ligne serie est decrite dans le
source "powerd.c", mais je vais le dessiner ici pour explications_:
+------------------------o DTR
|
+---+
| | resistance
| | 10 kilo-Ohm
| |
+---+ Vers le port serie
|
+-----o-------+------------------------o DCD
| |
o relais |
\ de l' |
\ onduleur |
| |
+-----o-------+------------------------o GND
Joli dessin, hein ?
J'espere que cela peut etre utile.
SysVinit peut etre trouve sur sunsite (et tsx-11 probablement) dans
SysVinit2.4.tar.z
Mike.
--
Miquel van Smoorenburg, <
[email protected]>
Ibmio.com: cannot open CONFIG.SYS: file handle broke off.
>From
[email protected] Wed Jul 21 14:27:04 1993
Newsgroups: comp.os.linux
Subject: Re: Interface onduleur pour Linux_?
From:
[email protected] (Danny ter Haar)
Date: Mon, 19 Jul 93 11:02:14
Distribution: world
Organization: Cistron Electronics.
Dans l'article <
[email protected]>
[email protected] (Miquel van Smoorenburg) ecrit :
>La methode de connexion de l'onduleur a la ligne serie est decrite dans le
>source "powerd.c", mais je vais le dessiner ici pour explications_:
Le dessin n'etait pas vraiment clair, utilisez plutot celui-ci !
>
> +------------------------o DTR
> |
> +---+
> | | resistance
> | | 10 kilo-Ohm
> | |
> +---+ Vers le port serie
> |
> +-----o-------+------------------------o DCD
> |
> o relais
> \ de l'
> \ onduleur
> |
> +-----o--------------------------------o GND
>
Le DTR est maintenu haut.
Lorsque le courant de l'onduleur s'arrete, le relais se ferme.
L'ordinateur controle la descente de la ligne DCD.
Lorsque cela arrive, il lance une sequence shutdown...
_____
Danny
--
<=====================================================================>
Danny ter Haar <
[email protected]> or <
[email protected]>
Robins law #103: 'a couple of lightyears can't part good friends'
66..22.. AAnnaallyyssee ddee ccaabblleess eett mmooddiiffiiccaattiioonn ddee ppoowweerrdd..cc
Essayez d'obtenir la documentation des cables que votre revendeur
d'onduleurs fournit. En particulier, recherchez :
+o quelles lignes doivent etre maintenues hautes ;
+o quelle(s) ligne(s) eteint(gnent) l'onduleur ;
+o quelles lignes l'onduleur modifie pour indiquer que :
+o le courant est coupe,
+o la batterie est faible.
Il vous faut ensuite modifier powerd.c en consequence, ou utiliser
l'un des paquetages configurables cites plus haut (voir
_g_e_n_p_o_w_e_r_-_1_._0_._1_._t_g_z, _p_o_w_e_r_-_2_._0_._t_a_r_._g_z ou _u_p_s_d_-_1_._0_._t_g_z decrits dans la
section ``Logiciels''. Si vous utilisez l'un des paquetages, suivez
les instruction correspondantes. Si vous voulez bidouiller powerd.c,
lisez ce qui suit.
Si vous avez des problemes pour obtenir les informations precitees, ou
si vous voulez juste les controler (une _b_o_n_n_e idee), le programme
suivant peut vous y aider. C'est une version bidouillee de powerd.c.
Il vous permet de positionner les signaux du port depuis la ligne de
commande, puis il controle le port, en affichant l'etat des signaux
chaque seconde. Je l'ai utilise en "upscheck /dev/cua1 2" (par
exemple) pour monter le deuxieme bit (_D_T_R) et descendre les autres.
Le nombre en base 2 indique les bits a monter, ainsi par exemple pour
monter les bits 1, 2 et 3 (et descendre les autres), utilisez 7. Voir
le code pour les details.
Voici le programme (non teste) upscheck.c. Il n'est pas teste car
j'ai modifie la version que j'avais utilisee au depart pour le rendre
plus clair, et que je ne peux tester la nouvelle version pour le
moment.
NdT : La traduction des commentaires et messages peut aussi avoir
altere le comportement du programme.
______________________________________________________________________
/*
* upscheck Controle comment l'ordinateur et l'onduleur communiquent
*
* Usage: upscheck <peripherique> <bits a monter>
* Par exemple, upscheck /dev/cua4 4 pour monter le bit 3 et
* controler /dev/cua4.
*
* Author: Harvey J. Stein <
[email protected]>
* (mais en realite juste une modification mineure de Miquel van
* Smoorenburg's <
[email protected]> powerd.c
*
* Version: 1.0 19940802
*
*/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
/* Programme principal. */
int main(int argc, char **argv)
{
int fd;
/* Ces parametres TIOCM_* sont definis dans <linux/termios.h>, qui */
/* est inclus indirectement ici. */
int dtr_bit = TIOCM_DTR;
int rts_bit = TIOCM_RTS;
int set_bits;
int flags;
int status, oldstat = -1;
int count = 0;
int pc;
if (argc < 2) {
fprintf(stderr, "Usage: upscheck <peripherique> <bits-a-positionner>\n");
exit(1);
}
/* Ouvre le peripherique a controler. */
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
fprintf(stderr, "upscheck: %s: %s\n", argv[1], sys_errlist[errno]);
exit(1);}
/* Recupere les bits a positionner sur la ligne de commande */
sscanf(argv[2], "%d", &set_bits);
while (1) {
/* Positionne les bits specifies sur la ligne de commande (et */
/* seulement eux). */
ioctl(fd, TIOCMSET, &set_bits);
fprintf(stderr, "Positionnement de %o.\n", set_bits);
sleep(1);
/* Recupere les bits actuellement positionnes */
ioctl(fd, TIOCMGET, &flags);
fprintf(stderr, "Les signaux sont %o.\n", flags);
/* Piochez ici en changeant TIOM_CTS par un autre TIOCM jusqu'a */
/* ce que le programme detecte que le courant est coupe lorsque */
/* vous debranchez l'onduleur. Ensuite, vous saurez comment */
/* modifier powerd.c */
if (flags & TIOCM_CTS)
{
pc = 0 ;
fprintf(stderr, "Le courant est la.\n");
}
else
{
pc = pc + 1 ;
fprintf(stderr, "Le courant est coupe.\n");
}
}
close(fd);
}
______________________________________________________________________
66..33.. AAssssiiggnneemmeenntt ddeess bbrroocchheess dduu ppoorrtt sseerriiee
La section qui precede presuppose la connaissance de la correspondance
entre les signaux de terminal et les broches du port serie. Voici une
reference de cette correspondance, reprise du document de David Tal :
"Cables et connecteurs frequemment utilises". J'inclus un diagramme
illustrant les connecteurs, et une table donnant la corresopondance
entre les numeros de broches et les signaux de ligne de terminal.
Si vous avez besoin d'une reference generale sur le brochage de
cables, celle de David Tal en est une bonne, mais je n'arrive plus a
localiser ce document sur le Net. Mais j'ai trouve un bon livre de
remplacement, c'est The Hardware Book.
NdT : si un lecteur francais veut proposer une reference dans la
langue de Moliere, qu'il n'hesite pas a me contacter.
Autres sites utiles :
+o Yost Serial Device Wiring Standard qui contient des informations
interessantes sur les connecteurs RJ-45 et les cables quatre paires
pour toutes les connexions serie ;
+o Stokely consulting pour l'information generale sur Unix et en
particulier leur Unix Serial Port Resources ;
+o Unix Workstation System Administration Education Certification qui
contient : RS-232: Connectors and Cables.
Incidemment, il semble que le paquetage Linuxdoc-sgml ne formate plus
les tableaux tres bien en sortie _h_t_m_l. Si vous voulez pouvoir lire la
table qui suit, vous devrez probablement vous referer a la version _D_V_I
ou texte simple du present document.
| | | | | | | |
|DB-25 | DB-9 | Nom | EIA | CCITT | DTE-DCE | Description |
|Broche | Broche | | | | | |
+-------+---------+--------+-------+---------+----------+-------------------------------------------+
|1 | | FG | AA | 101 | --- | Masse de chassis GND |
|2 | 3 | TD | BA | 103 | ---> | Donnees transmises, TxD |
|3 | 2 | RD | BB | 104 | <--- | Donnees recues, RxD |
|4 | 7 | RTS | CA | 105 | ---> | Requete pour envoyer |
|5 | 8 | CTS | CB | 106 | <--- | Pret a envoyer |
|6 | 6 | DSR | CC | 107 | <--- | Jeu de donnees pret |
|7 | 5 | SG | AB | 102 | ---- | Masse de signal, GND |
|8 | 1 | DCD | CF | 109 | <--- | Detection de porteuse |
|9 | | -- | -- | - | - | Tension positive continue de test |
|10 | | -- | -- | - | - | Tension negative continue de test |
|11 | | QM | -- | - | <--- | Mode d'egalisation |
|12 | | SDCD | SCF | 122 | <--- | Detection de porteuse secondaire |
|13 | | SCTS | SCB | 121 | <--- | Pret a envoyer secondaire |
|14 | | STD | SBA | 118 | ---> | Donnees transmise secondaires |
|15 | | TC | DB | 114 | <--- | Signal d'horloge de l'emetteur |
|16 | | SRD | SBB | 119 | <--- | Signal d'horloge secondaire du recepteur |
|17 | | RC | DD | 115 | ---> | Signal d'horloge du recepteur |
|18 | | DCR | -- | - | <--- | Horloge divisee du recepteur |
|19 | | SRTS | SCA | 120 | ---> | Requete pour emettre secondaire |
|20 | 4 | DTR | CD | 108.2 | ---> | Terminal de donnees pret |
|21 | | SQ | CG | 110 | <--- | Detection de qualite de signal |
|22 | 9 | RI | CE | 125 | <--- | Indicateur de sonnerie |
|23 | | -- | CH | 111 | ---> | Selecteur de vitesse de donnees |
|24 | | -- | CI | 112 | <--- | Selecteur de vitesse de donnees |
|25 | | TC | DA | 113 | <--- | Horloge transmise |
Assignement des broches de port serie (RS-232C), DB-25 et DB-9
______________________________________________________________________
1 13 1 5
_______________________________ _______________
\ . . . . . . . . . . . . . / \ . . . . . / Connecteurs
\ . . . . . . . . . . . . / \ . . . . / RS-232 vus de
--------------------------- ----------- l'arriere de
14 25 6 9 l'ordinateur
DTE : Equipement terminal de donnees (i.e. ordinateur)
DCE : Equipement de communication de donnees (i.e. modem)
RxD : Donnees recues; 1 est transmis "bas", 0 "haut"
TxD : Donnees envoyees; 1 est transmis "bas", 0 "haut"
DTR : DTE annonce qu'il est alimente et pret a communiquer
DSR : DCE annonce qu'il est pret a communiquer; "bas" raccroche le modem
RTS : DTE demande a DCE la permission d'envoyer des donnees
CTS : DCE agree la RTS
RI : DCE indique au DTE qu'il tente d'etablir une connexion
DCD : DCE annonce qu'une connexion est etablie
______________________________________________________________________
66..44.. CCoorrrreessppoonnddaannccee eennttrree iiooccttll eett RRSS223322
Puisque vous pouvez aussi devoir modifier powerd.c pour monter et
descendre les signaux corrects, vous pouvez aussi avoir besoin des
valeurs numeriques des differents signaux de terminal. Ils peuvent
etre trouves dans /usr/include/linux/termios.h, mais sont reproduits
ici comme reference. Puisqu'ils peuvent etre sujets a changements,
vous auriez avantage a les verifier avec ledit fichier.
______________________________________________________________________
/* lignes modem */
#define TIOCM_LE 0x001
#define TIOCM_DTR 0x002
#define TIOCM_RTS 0x004
#define TIOCM_ST 0x008
#define TIOCM_SR 0x010
#define TIOCM_CTS 0x020
#define TIOCM_CAR 0x040
#define TIOCM_RNG 0x080
#define TIOCM_DSR 0x100
#define TIOCM_CD TIOCM_CAR
#define TIOCM_RI TIOCM_RNG
______________________________________________________________________
Notez que la troisieme colonne est en hexadecimal.
77.. QQuuee ffaaiirree ssii ll''oonn nn''eenn ssoorrtt ppaass ??
Voici une nouvelle solution pour le controle lorsque l'onduleur et
l'ordinateur ne s'entendent pas. Je dois dire qu'a chaque fois que je
lis cela, je suis effare de l'intelligence de cette solution.
From: " Raymond A. Ingles" <
[email protected]>
To:
[email protected]
Subject: UPS HOWTO tip
Date: Mon, 24 Feb 1997 11:48:32 -0500 (EST)
Je ne sais pas si d'autres trouveront ca utile, mais je pense pouvoir
diffuser ceci pour inclusion possible dans le HOWTO. Merci de maintenir
un HOWTO que je trouve si utile !
--------------------
Ma fiancee m'a offert un onduleur, un Tripp-Lite 400, je crois.
Il etait le bienvenu et semble fonctionner comme prevu, mais malheureusement,
ne dispose pas d'interface serie pour prevenir l'ordinateur d'une coupure
de courant.
Il semble prevu pour une utilisation personnelle quand l'ordinateur ne
reste pas seul.
Evidemment, cela etait inacceptable et j'ai commence a travailler sur un
systeme de surveillance de ligne, en imaginant ouvrir la boite et voir
comment ajouter le hard que le constructeur avait omis. J'ai alors realise
qu'il y avait une solution plus simple et moins chere (bien qu'un peu moins
dotee en fonctionnalites).
J'avais un vieux modem 2 400 baud que je n'utilisais pas, que j'ai branche
sur un port serie inutilise de l'ordinateur. Je l'ai ensuite branche sur une
prise anti-surtensions, elle-meme branchee sur la prise murale.
J'ai configure powerd avec les options suivantes :
----
serialline /dev/ttyS1
monitor DCD
failwhen low
----
Maintenant, lorsque le courant est coupe (ou, bien que cela ne soit pas
arrive recemment, lorsque je debranche le parasurtenseur pour tester la
configuration), le modem tombe mais l'onduleur commence a alimenter
l'ordinateur.
Lorsque powerd se rend compte que le modem a descendu DCD, il declenche la
sequence powerfail.
Evidemment, il y a certaines limitations.
Il n'est pas possible de faire indiquer par le modem que la batterie est
faible, etc.
On peut seulement indiquer que le courant est coupe.
Maintenant, ce n'est pas cher et je deteste laisser un equipement
informatique inutilise.
Ces temps-ci, il est possible d'avoir un modem 2 400 baud quasi gratuitement.
Je continue a conseiller un onduleur avec des possibilites de communication
completes, mais si l'on est coince avec un qui n'en a pas, cela peut au
moins etre utile.
Sincerement,
Ray Ingles (810) 377-7735
[email protected]
"Anybody who has ever seen a photograph showing the kind of damage that
a trout traveling that fast can inflict on the human skull knows that
such photographs are very valuable. I paid $20 for mine." - Dave Barry
88.. IInnffoorrmmaattiioonnss ssuurr uunn cceerrttaaiinn nnoommbbrree dd''oonndduulleeuurrss
Cette section contient des informations specifiques de certains
onduleurs. Ce que je souhaiterais serait de disposer des informations
sur le port de controle de l'onduleur (ce que fait chaque broche et ce
qu'elle attend qui soit fait), sur le cable fourni par le constructeur
(ce qu'il connecte et ou), ainsi qu'une version modifiee de powerd.c
qui fonctionne avec l'onduleur. Ce que j'ai actuellement est une
description a peu pres complete de chaque onduleur. Je voudrais
essayer d'affiner chaque information, mais comme je ne peux tester
chaque onduleur, il est difficile de decider exactement de ce qui est
necessaire. De plus, chaque onduleur semble avoir quelques trucs
supplementaires qui sont bien decrits par les auteurs de chaque
section. Ainsi, pour l'heure, je laisse tout en place. Tout pour un
HOWTO epais.
VVeeuuiilllleezz mm''eennvvooyyeerr vvooss eexxppeerriieenncceess ppoouurr lleess iinncclluurree iiccii..
88..11.. EExxppeerriieenncceess ggeenneerraalleess..
J'ai conserve les commentaires des gens, mais n'ai pas encore obtenu
la permission de les inclure ici. Voici un sommaire general de ce que
j'ai entendu dire.
AAPPCC ::
Ne donneront pas d'informations sur leur mode "intelligent" sans
votre signature d'un accord de confidentialite. Donc, les gens
sont forces d'utiliser leurs onduleurs "intelligents" en mode
"bete", comme souligne plus bas. Diverses tentatives de retro-
ingenierie ont ete soldees par des niveaux de reussite
differents.
BBeesstt ::
Serviables et aimables. Fournissent le code source et la
documentation pour les deux modes.
TTrriipppp LLiittee ::
Une personne a dit que Tripp ne diffuserait pas non plus
d'information.
UUppssoonniicc ::
Quelqu'un a dit qu'Upsonic a discute de details techniques au
telephone, repondu aux questions par fax et est serviable en
general.
88..22.. AAddvviiccee 11220000 AA
Onduleurs d'Advice Electronics, Tel Aviv, Israel (Tout leur materiel
porte une etiquette a leur nom).
Specification des broches du port de controle.
+o 2 - Coupure de courant.
+o 5 - Batterie faible.
+o 6 - Extinction de l'onduleur.
+o 4 - Masse commune des broches 2, 5 et 6.
Ils m'ont aussi donne le dessin suivant qui ne m'a servi a rien, mais
peut vous etre utile si vous souhaitez fabriquer vous-meme un cable :
______________________________________________________________________
2 ----------+
|
\
\|
|--------------
/|
\/ <--- Le "\/" indique le type de ce
| transistor. J'ai oublie ce que
| cela veut dire, mais ce n'est
+-----+ pas fondamental.
/ / /
5 ----------+
|
\
\|
|--------------
/|
\/
|
|
+-----+
/ / /
+-------------
|
/
10K |/
6 --\/\/\/--|
|\
\/
|
|
+-----+
/ / /
4 ----------+
|
|
+-----+
/ / /
______________________________________________________________________
Cable fourni.
Ils m'ont d'abord donne un cable qui appartenait a un paquetage DOS de
controle de l'onduleur appele RUPS. Je l'ai utilise pour les tests.
Une fois ceux-ci satisfaisants, ils m'ont donne un cable qu'ils
utilisent pour les serveurs Netware connectes a des onduleurs. Il
fonctionnait a l'identique. Voici les details :
+o DTR - Alimentation du cable (powerd.c doit le monter) ;
+o CTS - Courant present (descend quand le courant est coupe) ;
+o DSR - Batterie faible (descend lorsque la batterie faiblit) ;
+o RTS - Extinction de l'onduleur (a monter pour eteindre).
(le powerd.c inclus dans SysVinit place ou laisse RTS haut, causant
l'arret de l'onduleur immediatement lors du lancement de powerd !)
88..33.. nnaammee==""TTrruusstt EEnneerrggyy PPrrootteeccttoorr 440000//660000""
Cette section n'est pas utile seulement pour le Trust Energy
Protector. Elle illustre les nouvelles fonctionnalites d'_i_n_i_t.
Comment utiliser un Trust Energy Protector 400/650 sous Linux ?
par Ciro Cattuto
Version 1.0 - 31 mars 1997
CCoonnnneexxiioonn PPCC--oonndduulleeuurr
Le Trust Energy Protector 400/650 est equipe d'un port de
signaux. A l'aide d'un cable adapte, il est possible de
connecter celui-ci sur un ordinateur pour reagir aux evenements
concernant l'alimentation electrique.
LLee ppoorrtt ddee ssiiggnnaauuxx ddee ll''oonndduulleeuurr
L'assignement des broches du port de signaux DB-9 de l'onduleur
est le suivant, comme indique dans le manuel utilisateur :
bbrroocchhee 22
Ce relais est ferme lorsque le courant d'alimentation est
coupe.
bbrroocchhee 44
Masse des broches 2 et 5.
bbrroocchhee 55
Ce relais est ferme lorsque la batterie dispose de moins
d'une minute et demi d'autonomie.
bbrroocchhee 66
L'utilisateur peut envoyer un signal haut (+5V a +12V) durant
plus d'une milliseconde pour eteindre l'onduleur. Cette
option ne peut etre activee que durant une coupure de
courant.
bbrroocchhee 77
Masse de la broche 6.
llee ccaabbllee
Voici le cable que j'ai utilise pour connecter l'onduleur au
port serie de mon ordinateur.
cote ordinateur (DB-15) cote onduleur (DB-9)
====================================================================
6 DSR --+ [R] = resistance 10 kohm
|
20 DTR --+----+
| |
[R] [R] +--- 7
| | |
8 DCD --+----|-------------- ---------------------|--- 2
| |
7 GND -------|-------------- ---------------------+--- 4
| ...
5 CTS -------+-------------- ------------------------- 5
2 TX ---------------------- ------------------------- 6
====================================================================
Pour un port serie DB-9, les broches 6, 20, 8, 7, 5 et 2
correspondent respectivement aux broches 6, 4, 1, 5, 8 et 3.
CCoommmmeenntt ffoonnccttiioonnnnee llee ccaabbllee ??
L'ordinateur monte DTR et verifie que DSR soit haut pour
s'assurer que le cable soit connecte a l'ordinateur. Tant que
le courant est la, DCD et CTS sont hauts tous les deux (a cause
des resistances).
Lorsque le courant est coupe, le relais entre les broches 2 et 4
de l'onduleur se ferme, et DCD descend pour signaler la coupure.
De meme, lorsque les batteries sont faibles, le relais entre les
broches 5 et 4 se ferme, faisant descendre CTS.
Durant une coupure de courant, l'ordinateur peut eteindre
l'onduleur en montant TX durant 1 ms au moins. Cela peut etre
realise aisement en envoyant un octet 0xFF au port serie avec
une vitesse faible.
llee ddaaeemmoonn ppoowweerrdd
Pour utiliser les informations disponibles sur le port serie, il
faut utiliser un programme qu surveille celui-ci, decode le
signal et envoie les messages appropries au systeme
d'exploitation, en l'occurence au processus init. Ce dernier
peut executer des scripts et programmes concus pour gerer
(proprement !) l'evenement de coupure de courant.
ccoommppiilleerr ppoowweerrdd
En annexe A se trouve le code de powerd, le daemon que j'utilise
pour surveiller le Trust Energy Protector 400/650. Pour le
compiler, il faut le source du paquetage SysVinit (j'ai utilise
celui de sysvinit-2.60). Ecrasez simplement le powerd.c
d'origine et compilez-le.
CCoommmmeenntt ffoonnccttiioonnnnee ppoowweerrdd ??
Des le demarrage, _p_o_w_e_r_d ouvre le peripherique serie connecte a
l'onduleur et monte DTR. Ensuite, il forke un daemon et se
termine en laissant celui-ci tourner. Le daemon _p_o_w_e_r_d peut se
trouver dans l'un des trois etats suivants :
EEttaatt 00 -- llee ccoouurraanntt eesstt bboonn
Dans cet etat, _p_o_w_e_r_d lit le port serie toutes les T0_SLEEP
secondes (voir les lignes #define au debut du code source).
Si DCD descend, _p_o_w_e_r_d bascule en etat 1. Si CTS descend,
_p_o_w_e_r_d bascule en etat 2 (cela ne doit pas arriver si DCD
n'est pas descendu avant, mais j'ai prefere assurer le coup).
EEttaatt 11 -- llee ccoouurraanntt eesstt ccoouuppee
Une coupure de courant a ete detectee. DCD est bas et _p_o_w_e_r_d
lit le port de l'onduleur toutes les T1_SLEEP secondes. Si
DCD remonte, il bascule en etat 0. Si CTS tombe, il bascule
en etat 2.
EEttaatt 22 -- llaa bbaatttteerriiee eesstt ffaaiibbllee
La batterie de l'onduleur est faible. Le daemon _p_o_w_e_r_d reste
dans cet etat.
A chaque changement d'etat de _p_o_w_e_r_d, il previent le processus
_i_n_i_t afin que l'action appropriee soit effectuee. Ces
evenements sont traces a l'aide du systeme de trace du systeme
d'exploitation (NdT : _s_y_s_l_o_g_d).
Si DSR est bas, c'est qu'il y a un probleme au niveau du cable.
_p_o_w_e_r_d continue a surveiller la ligne DSR et envoit un message
d'avertissement toutes les deux minutes au systeme de trace.
UUttiilliisseerr ppoowweerrdd
Le daemon _p_o_w_e_r_d doit etre lance par les scripts
d'initialisation durant le demarrage du systeme. J'ai ajoute
les lignes suivantes dans mon script /etc/rc.d/rc.local :
# Ajout du support de l'onduleur
echo "Demarrage du processus powerd..."
rm -f /etc/turnUPSoff
stty -crtscts speed 75 < /dev/cua3 > /dev/null
if [ -x /usr/sbin/powerd ]
then
/usr/sbin/powerd /dev/cua3
fi
En premier, on efface (si necessaire) le fichier /etc/turnUPSoff.
Celui-ci est utilise par le script de shutdown (/etc/rc.d/rc.0 dans
mon cas) pour decider s'il faut arreter l'onduleur ou non. Voir
plus bas pour plus d'informations.
Ensuite, on desactive le controle de flux materiel sur le
peripherique serie connecte a l'onduleur et on positionne la
vitesse a 75 bauds. Maintenant, nous sommes sur que le signal TX
restera haut suffisamment longtemps pour arreter l'onduleur si nous
envoyons un caractere 0xFF au port serie (a nouveau, voir plus
bas).
Enfin, nous lancons le daemon _p_o_w_e_r_d en lui indiquant le port a
surveiller. Notez que nous n'avons pas a lire de caracteres sur ce
port, donc pas d'inquietude en cas de conflit d'interruptions - il
n'aura aucune influence.
LLee ffiicchhiieerr iinniittttaabb eett lleess ssccrriippttss ddee sshhuuttddoowwnn
Le processus _p_o_w_e_r_d tourne maintenant, et il enverra des signaux
a init en cas de coupure de courant. Il faut maintenant
configurer le systeme afin qu'il puisse reagir de maniere utile
lorsque ces signaux sont recus.
MMooddiiffiiccaattiioonn ddee iinniittttaabb
Ajoutez les lignes suivantes a proximite du debut de votre
fichier /etc/inittab :
# Quoi faire lorsque le courant est coupe (shutdown temporise)
pf::powerfail:/etc/powerfail_script
# Si le courant revient avant le shutdown, arreter celui-ci
pg::powerokwait:/etc/powerokay_script
# Si la batterie de l'onduleur est faible, faire un shutdown immediat
pc::powerfailnow:/etc/powerfailnow_script
LLeess ssccrriippttss
Les scripts powerfail_script, powerokay_script et
powerfailnow_script sont executes lorsque _i_n_i_t recoit le signal
correspondant. Il ont la responsabilite d'arreter le systeme de
maniere propre ou d'arreter un shutdown en cours au cas ou le
courant reviendrait. Voici les scripts que j'utilise
actuellement :
/etc/powerfail_script
#!/bin/sh
/bin/sync
/usr/bin/sleep 10m
kill -9 `ps auxw | \
grep "shutdown" | \
grep -v grep | \
awk '{print $2}'` >/etc/turnUPSoff
/sbin/shutdown -t30 -h +3 "Coupure de courant"
Mon Trust Energy Protector 400 n'alimente que l'ordinateur, j'ai
donc une reserve de courant assez importante. Dans mon secteur,
les coupures de courant ne durent souvent que quelques minutes,
donc le systeme reagit a celles-ci de la maniere suivante : Il
attent 10 minutes (habituellement, le courant revient avant) puis
arrete le systeme, en laissant aux utilisateurs le temps de fermer
leurs applications et de se deconnecter. Avant d'executer la
commande _s_h_u_t_d_o_w_n, je verifie qu'il n'y a pas d'autre shutdown en
cours. Je cree aussi le fichier /etc/turnUPSoff afin que le
systeme arrete l'onduleur.
/etc/powerokay_script
#!/bin/sh
kill `ps auxw | \
grep "powerfail_script" | \
grep -v grep | \
awk '{print $2}'`
kill -9 `ps auxw | \
grep "shutdown" | \
grep -v grep | \
awk '{print $2}'`
rm -f /etc/turnUPSoff
Si le courant revient, on tue le script _p_o_w_e_r_f_a_i_l___s_c_r_i_p_t et tout
_s_h_u_t_d_o_w_n en cours. On n'oublie pas de supprimer /etc/turnUPSoff.
/etc/powerfailnow_script
#!/bin/sh
kill -9 `ps auxw | \
grep "shutdown" | \
grep -v grep | \
awk '{print $2}'` >/etc/turnUPSoff
/sbin/shutdown -h now "Batterie de l'onduleur faible. ARRET IMMEDIAT."
Si la batterie faiblit, on s'assure qu'aucun _s_h_u_t_d_o_w_n ne soit en
cours, on cree le fichier /etc/turnUPSoff puis on arrete le systeme
immediatement.
LLee ssccrriipptt dd''aarrrreett ssyysstteemmee
Lorsque l'arret du systeme est effectue, on peut arreter
l'onduleur en montant le signal TX du port serie durant plus
d'une milliseconde. Celui-ci est deja configure correctement
par la commande stty du script rc.local. Si le fichier
/etc/turnUPSoff est present, on envoit l'octet 0xFF (tous les
bits a 1) sur le port serie.
Pour cela, on ajoute les lignes suivantes autour de la fin du
script d'arret (/etc/rc.d/rc.0 dans mon cas). L'emplacement
correct depend de la maniere dont le systeme est configure, mais
il doit pouvoir se situer avant la commande _e_c_h_o qui affiche le
message "System is halted".
# Est-on dans un cas de coupure de courant ?
if [ -f /etc/turnUPSoff ]
then
echo "Arret de l'onduleur"
sleep 5
echo -e "\377" >/dev/cua3
exit 1
fi
RReemmaarrqquueess ggeenneerraalleess
Ce document contient des choses que j'ai apprises en tentant de
configurer _m_o_n systeme Linux avec le Trust Energy Protector 400.
Certaines informations (le chemin d'acces aux scripts
d'initialisation, par exemple) peuvent etre specifiques a mon
systeme, et il vous faudra vraisemblablement faire quelques
adaptations. Neammoins, j'espere que ce document sera une trace
utile pour ceux qui essaieront d'utiliser un onduleur de ce type
sous Linux. Si vous rencontrez des difficultes, recherchez des
informations plus generales dans le reste de ce Howto. Bonne
chance !
RReettoouurr dd''iinnffoorrmmaattiioonnss
J'apprecierais enormement tout retour d'informations concernant
ce document, afin de pouvoir affiner celui-ci et y corriger de
possibles erreurs (je sais que l'anglais que j'utilise n'est pas
excellent, mais apres tout, je suis italien ! (-- NdT : On se
demande quelquefois s'il faut vraiment tout traduire :-))--)
). Envoyez tout commentaire/suggestion/critique a l'adresse
suivante :
[email protected]
Si vous rencontrez des problemes d'utilisation de l'onduleur
Trust Energy Protector 400/650 sous Linux, vous pouvez aussi me
contacter. J'essaierai de vous aider.
IInnffoorrmmaattiioonnss lleeggaalleess
Je n'ai aucune relation avec Trust Networking Products.
L'information contenue dans ce document est livree "telle
quelle". Vous pouvez l'utiliser a vos risques et perils. Je ne
puis etre tenu responsable d'un quelconque dommage ni perte de
donnees resultant de l'utilisation du code ni des informations
donnees ici.
Ciro Cattuto
AAppppeennddiixx AA -- CCooddee ssoouurrccee dduu ddaaeemmoonn ppoowweerrdd>>
powerd.c
/*
* powerd Recoit les evenements de coupure de courant
* depuis un Trust Energy Protector 400/650
* et previent init
*
* Usage: powerd <port serie>
*
* Author: Ciro Cattuto <
[email protected]>
*
* Version 1.0 - 31 Mars 1997
*
* Ce code est largement fonde sur le powerd.c original de
* Miquel van Smoorenburg <
[email protected]>.
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Ce programme est un logiciel libre ; vous pouvez le distribuer
* et/ou le modifier selon les termes de la Licence Publique Generale
* GNU publiee par la Free Software Foundation version 2 ou (comme
* vous le voulez) toute version ulterieure.
*
*/
/* etat 0 - le courant est la */
#define T0_SLEEP 10 /* intervalle de lecture du port en
secondes */
#define T0_DCD 3 /* duree avec DCD monte avant de realiser
une action */
#define T0_CTS 3 /* duree avec CTS monte avant de realiser
une action */
/* etat 1 - le courant est coupe */
#define T1_SLEEP 2 /* intervalle de lecture du port */
#define T1_DCD 3 /* idem T0_DCD */
#define T1_CTS 3 /* idem T0_CTS */
#define DSR_SLEEP 2
#define DSR_TRIES 60
/* On utilise le nouveau mode de communication avec init. */
#define NEWINIT
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <syslog.h>
#include <string.h>
#include 'paths.h'
#ifdef NEWINIT
#include 'initreq.h'
#endif
#ifndef SIGPWR
# define SIGPWR SIGUSR1
#endif
#ifdef NEWINIT
void alrm_handler()
{
}
#endif
/* Dire a init que le courant est coupe (1), revenu (0) ou que
les batteries de l'onduleur sont faibles (2). */
void powerfail(int event)
{
int fd;
#ifdef NEWINIT
struct init_request req;
/* On remplit la structure necessaire */
memset(&req, 0, sizeof(req));
req.magic = INIT_MAGIC;
switch (event)
{
case 0:
req.cmd = INIT_CMD_POWEROK;
break;
case 1:
req.cmd = INIT_CMD_POWERFAIL;
break;
case 2:
default:
req.cmd = INIT_CMD_POWERFAILNOW;
}
/* On ouvre le fifo (avec timeout) */
signal(SIGALRM, alrm_handler);
alarm(3);
if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0
&& write(fd, &req, sizeof(req)) == sizeof(req)) {
close(fd);
return;
}
/* On revient a l'ancienne methode... */
#endif
/* On cree un fichier info pour init */
unlink(PWRSTAT);
if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
switch (event)
{
case 0:
write(fd, 'OK\n', 3);
break;
case 1:
write(fd, 'FAIL\n', 5);
break;
case 2:
default:
write(fd, 'LOW\n', 4);
break;
}
close(fd);
}
kill(1, SIGPWR);
}
/* Programme principal. */
int main(int argc, char *argv[])
{
int fd;
int dtr_bit = TIOCM_DTR;
int flags;
int DCD, CTS;
int status = -1;
int DCD_count = 0, CTS_count = 0;
int tries;
if (argc < 2) {
fprintf(stderr, 'Usage: powerd <peripherique>\n');
exit(1);
}
/* On demarre syslog. */
openlog('powerd', LOG_CONS|LOG_PERROR, LOG_DAEMON);
/* On ouvre le port a surveiller. */
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
syslog(LOG_ERR, '%s: %s', argv[1], sys_errlist[errno]);
closelog();
exit(1);
}
/* La ligne est ouverte, donc DTR est haut.
On le force tout de meme pour plus de surete */
ioctl(fd, TIOCMBIS, &dtr_bit);
/* On passe en daemon. */
switch(fork()) {
case 0: /* Fils */
closelog();
setsid();
break;
case -1: /* Erreur */
syslog(LOG_ERR, 'Impossible de forker.');
closelog();
exit(1);
default: /* Pere */
closelog();
exit(0);
}
/* On relance syslog. */
openlog('powerd', LOG_CONS, LOG_DAEMON);
/* Maintenant, on echantillonne la ligne DCD */
while(1) {
/* On lit le statut. */
ioctl(fd, TIOCMGET, &flags);
/* On controle la connexion.
DSR doit etre haut */
tries = 0;
while((flags & TIOCM_DSR) == 0) {
/* On continue a essayer, et on previent
toutes les deux minutes */
if ((tries % DSR_TRIES) == 0)
syslog(LOG_ALERT, 'Erreur de connexion onduleur');
sleep(DSR_SLEEP);
tries++;
ioctl(fd, TIOCMGET, &flags);
}
if (tries > 0)
syslog(LOG_ALERT, 'Connexion onduleur OK');
/* On calcule l'etat en cours. */
DCD = flags & TIOCM_CAR;
CTS = flags & TIOCM_CTS;
if (status == -1)
{
status = (DCD != 0) ? 0 : 1;
if (DCD == 0)
{
syslog(LOG_ALERT, 'Coupure de courant. Onduleur actif.');
powerfail(1);
}
}
switch (status)
{
case 0:
if ((DCD != 0) && (CTS != 0))
{
DCD_count = 0;
CTS_count = 0;
sleep(T0_SLEEP);
continue;
}
if (DCD == 0)
DCD_count++;
if (CTS == 0)
CTS_count++;
if ((DCD_count < T0_DCD) && (CTS_count < T0_CTS))
{
sleep(1);
continue;
}
if (CTS_count == T0_CTS)
{
status = 2;
syslog(LOG_ALERT, 'Batteries faibles !');
break;
}
status = 1;
DCD_count = 0;
syslog(LOG_ALERT, 'Coupure de courant. Onduleur actif.');
break;
case 1:
if ((DCD == 0) && (CTS != 0))
{
DCD_count = 0;
CTS_count = 0;
sleep(T1_SLEEP);
continue;
}
if (DCD != 0)
DCD_count++;
if (CTS == 0)
CTS_count++;
if ((DCD_count < T1_DCD) && (CTS_count < T1_CTS))
{
sleep(1);
continue;
}
if (CTS_count == T1_CTS)
{
status = 2;
syslog(LOG_ALERT, 'Batteries faibles !');
break;
}
status = 0;
DCD_count = 0;
CTS_count = 0;
syslog(LOG_ALERT, 'Courant present.');
break;
case 2:
sleep(1);
continue;
default:
break;
}
powerfail(status);
}
/* N'arrive jamais */
return(0);
}
88..44.. TTrruusstt UUPPSS 440000--AA
J'ai recu un message a propos du Trust UPS 400-A. Je ne sais pas si
c'est le meme que le Trust Energy Protector 400, donc voici le message
(-- (NdT : le texte qui suit a ete reformate. Le document d'origine
comporte une copie de courrier electronique)--)
:
Marcel Amerlaan
16 juillet 1997
ddiissppoonniibbiilliittee
Cet onduleur ne semble plus etre fabrique par son constructeur,
mais cela ne veut pas dire qu'il ne soit plus disponible : j'ai
achete le mien tres peu cher il y a seulement un mois. De plus,
cette entreprise reetiquette souvent ses produits.
ccaabbllee
Il est facile a fabriquer a l'aide du cable d'origine pour
powerd et de la documentation de Trust.
Il presente deux ameliorations :
+o indication de batterie faible ;
+o extinction de l'onduleur.
Type : "pleur"
Cable power : {TIOCM_DTR, 0}
Inverter Kill : {TIOCM_RTS, 1}
Inverter Kill Time : 5
Power Check : {TIOCM_CTS, 0}
Battery Check : {TIOCM_CAR, 0}
Cable Check : {TIOCM_RI, 0}
La fonction "cable check" n'est pas utilisee car l'onduleur ne
semble pas la reconnaitre.
ccoonncclluussiioonn
Voila tout ce que je crois savoir. Si vous voulez plus
d'informations sur l'onduleur, le cable ou le logiciel,
contactez-moi.
Et souvenez-vous que tout ce qui est decrit ici fonctionne pour
moi mais je ne garantis pas que ce soit le cas pour vous.
Marcel Ammerlaan
CEO Pleursoft (cela explique le nom du cable, n'est-ce pas :-)
Pays Bas
88..55.. SSuussttaaiinneerr SS--4400aa
Informations sur le Sustainer S-40a (-- (NdT : le texte qui suit a ete
reformate. Le document d'origine comporte une copie de courrier
electronique)--)
:
Evgeny Stambulchik
10 septembre 1995
eennvviirroonnnneemmeenntt
Sustainer S-40a avec le paquetage unipower (recemment renomme
genpower), cable maison (cf. infra). J'ai envoye une copie de
tout ca a Tom Webster, l'auteur du paquetage, et cela devrait
apparaitre dans la nouvelle version.
ccaabbllee
+o Note : les broches d'arret indiquees dans la documentation
technique (4 et 6) sont incorrectes. Les bonnes sont 6 et 7,
comme sur le schema joitnt ;
+o Note 2 : les broches cote PC entre parenthese sont pour un
connecteur 25 broches, les autres pour un 9 broches.
COTE ONDULEUR COTE LINUX
2 COUPURE DE COURANT 1 (8)
+----o----------------------------+------------------o DCD
| |
o |
/ |
/ |
| 4 MASSE COMMUNE | 5 (7)
+----o-------------+--------------|------------------o GND
| | |
\ | |
\ | |
o | |
| 5 BATTERIE | FAIBLE | 8 (5)
+----o-------------|--------------|--------+---------o CTS
| | |
| +-+-+ +-+-+
| | | | |
| Resistances| | | |
| | | | |
| 3 x 10 kohm| | | |
| +-+-+ +-+-+
| | | 4 (20)
| +--------+---------o DTR
|
| 6 ARRET DE | L'ONDULEUR +-------+ 7 (4)
+-+ +---o-------------|---------------+ +---------o RTS
\ | | +-------+
\| -+- |
| <- \ / |
/| -+- |
/ | 7 |
| +---o-------------+
--+--
---
-
ffiicchhiieerr uunniippoowweerrdd..hh
/************************************************************************/
/* Fichier : unipowerd.h */
/* Programme : unipowerd Version: 1.0.0 */
/* Auteur : Tom Webster <
[email protected]> */
/* Creation : 1994/04/20 */
/* Modification : Tom Webster Date: 1995/04/09 */
/* Modification : Evgeny Stambulchik (pour onduleur Sustainer) */
/* */
/* Compilation : GCC 2.5.8 */
/* Compilateur : Linux 1.0.9 */
/* ANSI C Compatible : Non */
/* POSIX Compatible : Oui ? */
/* */
/* But : Fichier d'entete pour unipowerd. */
/* : Contient les informations de configuration */
/* : de unipowerd. Editez ce fichier comme indique */
/* : pour activer les fonctionnalites et ajuster */
/* : unipowerd pour votre onduleur. */
/* */
/* Copyright : GNU Copyleft */
/************************************************************************/
/* Lignes de controle RS232 */
/* */
/* D D */
/* T C */
/* Macro Anglais E E */
/* ---------------------------------------------- */
/* TIOCM_DTR DTR - Data Terminal Ready --> */
/* TIOCM_RTS RTS - Ready to send --> */
/* TIOCM_CTS CTS - Clear To Send <-- */
/* TIOCM_CAR DCD - Data Carrier Detect <-- */
/* TIOCM_RNG RI - Ring Indicator <-- */
/* TIOCM_DSR DSR - Data Signal Ready <-- */
#define HIGH (1)
#define LOW 0
#define PWRSTAT '/etc/powerstatus'
#define UPSSTAT '/etc/upsstatus'
/* CABLEPOWER est la ligne qui alimente le cable */
/* pour la surveillance normale. */
#define CABLEPOWER TIOCM_DTR
#define POWERBIT TIOCM_CAR
#define POWEROK HIGH
/* CABLECHECK vaut 1 pour surveiller la batterie ??*/
/* CABELCHECK vaut 0 pour ne rien surveiller */
#define CABLECHECK 0
#define CABLEBIT TIOCM_RNG
#define CABLEOK HIGH
/* BATTCHECK vaut 1 pour surveiller la batterie */
/* BATTCHECK vaut 0 pour ne rien surveiller */
#define BATTCHECK 1
#define BATTBIT TIOCM_CTS
#define BATTOK HIGH
/* INVERTERKILL vaut 1 pour gerer l'arret de l'onduleur */
/* INVERTERKILL vaut 0 pour ne rien gerer. */
/* INVERTERBIT est la ligne qui eteint l'onduleur en */
/* mode powerfail. */
/* INVERTERTIME est la duree en secondes de maintien haut */
/* de la ligne INVERTERBIT en haut pour eteindre. */
#define INVERTERKILL 1
#define INVERTERBIT TIOCM_RTS
#define INVERTERTIME 5
/************************************************************************/
/* Fin du fichier unipowerd.c */
/************************************************************************/
ffiicchhiieerr ggeennppoowweerrdd..hh
Pour la nouvelle version du logiciel (_g_e_n_p_o_w_e_r_d), je pense qu'il
faut ajouter la ligne suivante :
/* Evgeny's Sustainer S-40A */
{'sustainer', {TIOCM_DTR,0}, {TIOCM_RTS,1}, 5, {TIOCM_CAR,0}, {TIOCM_CTS,0},
{0,0}}
88..66.. SSyysstteell
Une autre entreprise israelienne. Je ne leur ai jamais achete
d'onduleur, mais il m'ont for aimablement fourni une documentation
detaillee sur leur port de communication. Il devrait etre assez
facile de controler leur onduleur. Leur numero de telephone est :
972-8-409-019 (fax 972-8-407-216).
88..77.. DDeelltteecc PPoowweerr,, FFiisskkaarrss PPoowweerr SSyysstteemmss eett EExxiiddee
Fiskars est une holding finnoise, anciennement proprietaire de Deltec
Power. En mars 1996, Fiskars a vendu Deltec Power a Exide. A cette
date, Deltec Power etait l'un des plus gros constructeurs d'onduleurs.
Avec Fiskars, Deltec fabriquait les PowerServers 10, 20, 30 et 40. La
page web de Deltec Power en mentionne d'autres.
Exide joint maintenant un logiciel de controle avec ses onduleurs qui
fonctionne sous Linux. Ils vendent aussi celui-ci separement et
affirment qu'il fonctionne avec d'autres onduleurs aussi.
J'aimerais avoir des nouvelles de gens qui utilisent ce logiciel.
Voici l'annonce qu'ils m'ont envoyee par e-mail :
Exide Electronics annonce Lansafe III, logiciel de gestion d'onduleurs
sous Linux.
Lansafe III est une application de gestion d'onduleurs. Elle permet
l'arret automatique du systeme en cas de coupure de courant de longue
duree qui depasserait l'autonomie de la batterie de l'onduleur.
Lansafe III permet les messages "broadcast" et l'envoi de courriers
electroniques en fonction des reglages utilisateur. La sequence
d'arret peut aussi etre parametree.
Lansafe III fonctionne avec la plus grande partie des onduleurs Exide
Electronics. Il permet aussi l'arret automatique simple avec des
onduleurs d'autres constructeurs.
Lansafe III pour Linux fonctionne sur les systemes Linux a base Intel.
Deux interfaces sont fournies : mode caracteres et X11/Motif.
Lansafe III fonctionne sur toutes les plateformes majeures de systemes
d'exploitation : Linux, IBM AIX, HP UX, Digital Unix, SCO Unix,
Solaris, SunOS, AT&T Unix, toutes les plateformes Windows, OS/2,
Novell et Macintosh en particulier.
Lansafe III est fourni avec les onduleurs Exide suivant :
+o OneUPS Plus ;
+o NetUPS ;
+o PowerWare Prestige ;
+o PowerWare Profile ;
+o PowerWare Plus 5xx.
Il est aussi fourni avec les onduleurs FPS Power Systems :
+o PowerRite Plus ;
+o PowerRite Max ;
+o PowerWorks A30 ;
+o PowerWorks A40 ;
+o series 9 000 ;
+o series 10 000.
Il est aussi possible d'acquerir une licence logicielle separee pour
l'utilisation d'un onduleur plus ancien ou d'un autre constructeur.
Les licences simples sont a USD 149, des licences site sont
disponibles.
Pour tout detail, visitez nos sites web : www.exide.com,
www.fiskarsUPS.com et www.deltecpower.com
Accessoirement, lorsque j'ai tente de me connecter a
www.fiskarsUPS.com, il m'a ete demande une identification et un mot de
passe.
88..88.. OOnndduulleeuurr BBeeaavveerr mmooddeellee UUBB550000
Dan Fandrich ecrit :
Je pense avoir reussi a faire fonctionner mon vieil onduleur Beaver
modele UB500 avec genpower. L'interface utilise des niveaux de
tension compatibles RS-232, donc l'installation est simple. Ily a un
connecteur DB-9 femelle a l'arriere qui se connecte directement dans
un port serie DB-9 de PC a l'aide d'un cable droit.
Les interrupteurs DIP permettent quelques ajustements. Pour emuler le
type d'onduleurs apc1-nt de genpower, ils doivent etre positionnes
comme suit :
+o 1 on (CTS = coupure de courant) ;
+o 2 off (CTS = batterie faible) ;
+o 3 off (DSR = coupure de courant) ;
+o 4 off (DSR = batterie faible) ;
+o 5 off (CD = coupure de courant) ;
+o 6 on (CD = batterie faible) ;
+o 7 off (RI = coupure de courant) ;
+o 8 off (RI = batterie faible) ;
+o 9 on (DTR = extinction) ;
+o 10 off (RTS = extinction).
Les interrupteurs forment des groupes de paires adjacentes pour chaque
broche de sortie. Ils sont exclusifs mutuellement - ne tentez pas de
positionner ON les 5 et 6 ensemble, par exemple, ou vous ferez un
court-circuit entre les signaux coupure de courant et batterie faible.
C'est tout ce qu'il y a a dire. Vous pouvez ajouter cela a votre
documentation.
88..99.. SSeennddoomm
Charli ecrit :
J'ai connecte un onduleur Seldom avec powerd. Peut-etre que ce qui
suit sera utile avec d'autres onduleurs.
J'ai utilise le diagramme de la page de man de _p_o_w_e_r_d :
9 broches 25 broches
DTR 4 20 ----------
| >
DSR 6 6 -- < 10k
>
DCD 1 8 -------------------
relais
GND 5 7 -------------------
En fait, l'onduleur seldom n'utilise pas de relais mais quelque chose
d'autre et fonctionne dans un sens, _m_a_i_s _p_a_s _d_a_n_s _l_'_a_u_t_r_e. Si donc le
cable ne fonctionne pas, il faut essayer d'inverser les broches sur le
"relais".
88..1100.. BBeesstt
L'information sur les onduleurs Best est disponible sur le site web de
Best Power. Leur site contient un paquetage checkup.tar (section
``Logiciels'') de communication avec leurs onduleurs, aussi bien en
modes intelligent que bate, fourni en sources, donc compilable sous
Linux.
BBeesstt FFoorrttrreessss aavveecc llee llooggiicciieell ddee BBeesstt
Mini-Howto des onduleurs Best Power
par Michael Stutz et
http://dsl.org/m.
Version 1.0, 14 aout 1997
88..1100..11.. AAvveerrttiisssseemmeenntt
Copyright 1997 Michael Stutz (-- NdT : la traduction de ce paragraphe
est fournie a titre indicatif au lecteur. Se reporter a la version
originale pour les termes exacts.--) ; cette information est libre ;
elle peut etre redistribuee et/ou modifiee selon les termes de la
Licence Publique Generale GNU (GPL) version 2 ou (a votre preference)
ulterieure, pour autant que la presente phrase soit conservee ; cette
information est fournie SANS AUCUNE GARANTIE ; sans meme de garantie
implicite d'adaptation a un besoin particulier ; se reporter a la GPL
de GNU pour plus de details.
88..1100..22.. IInnttrroodduuccttiioonn
Best Power est constructeur d'onduleurs de haute qualite, et leur
serie Fortress est particulierement bien adaptee a des utilisateurs
habituels de Linux. Bien que ses produits ne soient actuellement pas
aussi bon marche que certains autres (comme ceux d'APC), Best Power
fournit le code source de son logiciel et a ete tres reactif quant aux
questions posees par des utilisateurs de Linux. De plus, son materiel
semble choisi souvent par les consommateurs, ce qui en fait un bon
choix pour les utilisateurs de Linux.
Ce document decrit l'installation d'un onduleur Best Power Fortress
(le modele utilise est un 660a de 1996 accompagne de son CD-ROM) sur
une machine Linux.
88..1100..33.. IInnssttaallllaattiioonn
88..1100..33..11.. MMaatteerriieell
Installez l'onduleur comme indique par les instructions. Les series
_F_o_r_t_r_e_s_s de Best Power sont fournies avec un cable RS-232 destine a
etre connecte a un port serie libre a l'ariere de l'ordinateur.
88..1100..33..22.. LLooggiicciieell
Voici ce qui differe du manuel, qui ne contient pas actuellement
d'instructions specifiques pour Linux. En revanche, le CD-ROM
d'accompagnement conient avec le code source du logiciel de
l'onduleur, ce qui en rend la mise en oeuvre triviale.
Pour realiser celle-ci, suivez les etapes ci-dessous, et utilisez le
manuel comme reference pour avoir une vue d'ensemble sur le
fonctionnement general du logiciel. J'ai pris la liberte de faire
quelques modifications dans ce HOWTO sur la configuration du logiciel
_F_o_r_t_r_e_s_s pour Unix d'une maniere qui me semble plus adaptee a un
systeme Linux. Par exemple, j'ai elimine la necessite d'un repertoire
/etc/best, et place les executables dans /usr/local/bin qui me semble
un endroit plus approprie.
+o D'abord, creez le script "upsdown" destine a etre execute lors d'un
arret secteur. Celui-ci va arreter le systeme :
cat > /etc/upsdown <<EOF
#!/bin/sh
shutdown -h now < /dev/console &
EOF
+o Maintenant, creez les repertoires pour la documentation et le code
source :
mkdir /usr/doc/best
mkdir /usr/local/src/best
+o Montez le CD-ROM, et desarchivez le fichier unix/checkups.tar dans
un repertoire temporaire :
cd /tmp
tar /cdrom/unix/checkups.tar
+o Allez dans le repertoire etc/best/advanced qui doit avoir ete cree
dans le repertoire temporaire a partir de l'archive ;
+o Copiez la documentation et les fichiers script a leurs emplacements
idoines dans le systeme :
cp README /usr/doc/best
cp manual.txt /usr/doc/best
cp bestsend /etc
cp source/*.c /usr/local/src/best
+o Nettoyez le chantier dans le repertoire temporaire et compilez le
logiciel :
cd /usr/local/src/best
rm -R /tmp/etc
gcc -o checkups checkups.c
gcc -o mftalk mftalk.c
mv checkups /usr/local/sbin
mv mftalk /usr/local/sbin
+o Testez l'onduleur. Remplacez ttySx par le port serie de votre
choix. Si votre connexion est bonne, vous devriez voir une ligne
de caraceres s'imprimer a l'ecran :
mftalk /dev/ttySx
+o Rendez le programme checkups executable au demarrage pour le
tester. Cela peut etre realise d'un certain nombre de manieres
differents (decrites dans le manuel). Celle que j'ai utilisee
consiste a ajouter une ligne dans /etc/inittab :
ups:234:once:/usr/local/sbin/checkups -c500 /dev/ttyS1
+o Testez le tout. Supprimez l'alimentation secteur de l'onduleur en
retirant le fusible de l'onduleur, et attendez quelques minutes.
Le logiciel affiche un message d'alerte puis arrete le systeme
apres quelques instants.
+o Si cela fonctionne, retirez l'option -c500 de la ligne de votre
inittab (qui en gros implique d'arreter le systeme systematiquement
au lieu de ne le faire que lorsque le courant est coupe), et vous
pouvez rouler !
88..1100..33..33.. CCoonncclluussiioonn
Toute suggestion permettant d'ameliorer ce document ou les techniques
qui y sont decrites est la bienvenue. A l'instant ou j'ecris ces
lignes, _B_e_s_t _P_o_w_e_r semblait interesse par l'inclusion de la presente
information ou d'une autre dans la sienne afin d'aider les
utilisateurs de Linux par rapport a ses produits, il s'agit donc
reellement d'une entreprise a promouvoir. Vous pouvez lui transmettre
vos impressions a
[email protected] et
[email protected].
BBeesstt FFoorrttrreessss LLII--995500
Quelques commentaires sur le _B_e_s_t _F_o_r_t_r_e_s_s, de Leonard N.
Zubkoff, message du 25 mai 1995 dans comp.os.linux.hardware (--
(NdT : le texte qui suit a ete reformate. Le document d'origine
comporte une copie de message de forum)--)
:
Citation de
[email protected] :
D'accord avec ce que dit Craig. APC a ete tres peu cooperatif,
mais je n'ai que de bonnes choses a dire sur Best. J'utilise
son modele LI 660 ; 660 VA, des tas d'indications sur le panneau
frontal, etc. Le logiciel CheckUPS est en option payante et
necessite quelques bidouillages pour entrer dans mons systeme de
fichiers FSSTND-ise (NdT : File System STaNDard, le standard de
repartition des elements dans les repertoires preconise pour
Linux) (les repertoires et noms de fichiers sont en dur pour
SunOS 4.1.x). Je serai heureux de vous envoyer mes diffs, si
vous les voulez (j'adore quand un constructeur fournit le source
en tant que pratique commerciale normale !!).
Le logiciel CheckUPS est limite, cependant, a realiser des
arrets automagiques (NdT : automagic dans le texte). L'onduleur
peut fournir des tas d'informations sur son etat ; CheckUPS ne
controle que "Si le courant est coupe, combien de temps reste-
t'il d'autonomie a la batterie ?".
Best suit aussi ses questionnaires de satisfaction clients.
J'ai indique ma deception que CheckUPS ne dispose pas de plus de
fonctions d'interrogation (comme le voltage en entree, en
sortie, le pourcentage de charge, etc.) qui sont disponibles en
entree. J'ai demande les specifications de l'interface ; ils
ont dit : "bien sur" et me l'ont envoye en 2 jours,
gracieusement. Un controleur d'etat de l'onduleur complet est
dans ma casserole de derriere. Quelqu'un voit-il une utilite a
ce genre d'utilitaire ?
Reponse de Leonard N. Zubkoff :
Laissez-moi ajouter une autre recommandation pour Best Power.
Je viens d'acheter un Fortress LI-950, mais j'ai decline leur
offre logicielle pour CheckUPS. Contrairement a certaines
autres gammes, un simple cable trois fils suffit a connecter le
Fortress a un port serie -- pas besoin de montage "pull-up" a
faire dans le cable. Quelques minutes de bidouillage et j'avais
un programme qui fait a la fois daemon d'arret systeme et qui
coupe le courant de sortie ensuite lorsque le systeme est arrete
durant une periode sur batterie.
Je pourrais eventuellement utiliser le mode de communications
serie plus intelligent plutot que le simple mode de contact, et
j'ai donc demande la documentation au support technique de Best,
et il est arrive aujourd'hui, une semaine apres mon appel.
Apres avoir etudie celle-ci, je deciderai si une interface plus
intelligente est reellement interessante, en particulier puisque
dans certains cas j'aurais besoin d'arreter deux machines en
reseau partageant l'onduleur.
Leonard.
BBeesstt FFeerrrruuppss
En complement a la documentation et au logiciel sur le site web
de _B_e_s_t, vous pouvez aussi utiliser le paquetage
bestups-0.9.tar.gz (section ``Logiciel''). Nous avons juste
commence a le tester avec notre _F_e_r_r_u_p_s 5 kVA.
L'idee de base est qu'il y a deux modules. L'un qui recoit des
demandes d'information du port reseau, les relaie a l'onduleur,
et renvoit les resultats. Le second module parle au premier,
interprete les resultats, et repond OK ou FAIL.
C'est suffisant pour que le paquetage powerd-2.0.tar.gz (section
``Logiciel'') fasse le reste.
Les details se trouvent dans le paquetage lui-meme.
Par ailleurs, notre _F_e_r_r_u_p_s 5 kVA a fonctionne sans histoire
pour nos 10 ordinateurs et 30 ecrans.
88..1111.. GGPPSS11000000 dd''AACCCCOODDAATTAA
>From
[email protected] Thu Mar 10 15:10:22 1994
Newsgroups: comp.os.linux.help
Subject: Re: shutdown automatique avec un onduleur
From:
[email protected] (Hennus Bergman)
Date: Tue, 1 Mar 1994 22:17:45 GMT
Distribution: world
Organization: The Organization For Removal Of On-Screen Logos
Dans l'article <
[email protected]>,
Colin Owen Rafferty <
[email protected]> ecrit :
>Je suis pret a acheter un onduleur pour ma machine, et j'en
>voudrais un qui sache faire un "auto-shutdown".
>
Je viens d'en acheter un vraiment pas cher :-)
C'est un GPS1000 d'ACCODATA. Tout le monde connait la bonne qualite
de leur production (je n'ai pas d'actions chez eux :-() ?
>Je suppose que tous ont une sorte de connexion serie qui previent le
>systeme de cela.
>
Je l'ai pris a part pour trouver comment il fonctionnait. Il y avait
trois optocoupleurs (deux sorties, une entree) connectes sur un connecteur
a 9 broches a l'arriere. L'un s'allume lorsque le courant est coupe, et
s'eteint lorsque ce dernier revient. Durant ce temps, on peut utiliser
l'"entree" pour arreter la batterie (il relache le relais de puissance).
Le troisieme est une sorte d'acquittement de la commande d'arret. Je
pense que l'interface de mon onduleur a ete concue pour etre connectee
a des niveaux TTL, mais avec quelques resistances il peut etre connecte a
un port serie. Il est branche de telle sorte qu'avec un port RS-232 on
ne puisse utiliser les deux optocoupleurs de sortie; mais l'acquittement
de la commande d'arret n'est pas vraiment necessaire. On peut se conten-
ter de celui qui est important (Notez qu'il est possible de faire fumer
la partie transistor des optocoupleurs avec des niveaux RS-232 si on
le branche mal). ;-)
J'esperais etre capable de le connecter a mon port de jeux inutilise,
mais ce dernier n'a pas de sortie, n'est-ce pas_?
Je vais probablement finir par mettre un port parallele supplementaire
pour ca.
Tous les onduleurs n'utilisent pas d'optocoupleurs, certains se contentent
de simple relais, qui sont moins difficiles a connecter, mais bien sur,
pas aussi `elegants'.
>Quelqu'un a-t-il ecrit un paquetage qui surveille l'onduleur et effectue
>un shutdown (ou similaire) lorsque le courant s'arrete ?
SysVinit-2.4 (et probablement 2.5 aussi bien) a un demon `powerd' qui
surveille le port serie en continu et previent init quand CD (Detection
de porteuse) tombe. Init active ensuite un shutdown avec un delai. Si le
courant revient apres quelques minutes, le shutdown est arrete. Tres beau.
Le seul probleme que j'aie eu avec est qu'il ne dit pas a l'onduleur de
s'arreter lorsque le shutdown est fini. Il attend simplement la avec une
invite root. Je vais probablement ecrire un petit programme pour l'arreter
>depuis /etc/brc. RSN.
> Colin Rafferty, Lehman Brothers <
[email protected]>
Hennus Bergman
88..1122.. TTrriippppLLiittee BBCC775500LLAANN ((SSttaannddbbyy UUPPSS))
Tom Webster, l'auteur du paquetage _g_e_n_p_o_w_e_r, m'a envoye des
informations sur le _T_r_i_p_p_L_i_t_e _B_C_7_5_0_L_A_N. Si vous avez l'un d'entre
eux, c'est probablement le meilleur paquetage pour commencer.
Mais pour etre exhaustif, voici le diagramme de brochage du cable
(realise par tatonnements, et sans documentation) :
Onduleur Systeme
DB-25 DB-25
1 <--------------> 1 Masse
2 <--------------> 4 Coupure de secteur
8 <--------------> 8 Circuit de detection
3 <--------------> 2 Inverseur d'arret
20 <--------------> 22 Circuit
88..1133.. AAPPCC
Si la plethore de paquetages pour APC cites plus haut ne vous
permettent pas de demarrer, il est possible que la section qui suit
soit d'une certaine utilite.
BBaacckkuupp--UUPPSS
Il semble qu'il y ait une certaine controverse sur la fiabilite
des informations indiquees ici sur les APC Back-UPS, donc, soyez
prudent. Je preface cette section avec un message
d'avertissement que j'ai recu. Il peut ne pas prendre tout son
sens tant que le reste de la section n'est pas lu, mais ainsi,
au moins vous aves plus de chances de le voir. Et, a nouveau,
comme je n'ai aucun onduleur APC, je ne peux verifier la
fiabilite d'aucun de ces messages.
UUnn mmeessssaaggee dd''aavveerrttiisssseemmeenntt
Message de Marek Michalkiewicz sur le BUPS-HOWTO (-- (NdT : le
texte qui suit a ete reformate. Le document d'origine comporte
une copie de courrier electronique)--)
:
Si vous voulez connecter un onduleur APC Back-UPS sur votre
machine Linux, ce qui suit peut vous interesser.
Il y a un bon BUPS-HOWTO qui decrit comment le faire. Mais il
comporte un "bug".
Le signal RTS du port serie est utilise pour arreter l'onduleur.
Celui-ci ne s'arretera que s'il travaille sur batterie. Le
manuel indique que le le signal d'arret doit durer au moins
0,5ms. Mais un temps inferieur est suffisant, au moins pour mon
propre APC Back-UPS 600.
L'utilisation de RTS peut etre dangereuse, car ce dernier est
monte a l'ouverture du peripherique. Le programme backupsd le
redescend ensuite, mais il reste haut un moment. Cela coupe le
courant lors du premier lancement de backupsd s'il y a une
coupure secteur a ce moment precis. Cela peut arriver par
exemple si l'onduleur est eteint, et que le courant revienne
seulement pour un moment.
Soit il faut lancer backupsd avant de monter les systemes de
fichiers en lecture/ecriture, soit (de preference) utiliser TX
(broche 3) plutot que RTS (broche 7) pour eteindre l'onduleur
(la numerotation est pour un DB-9). On peut utiliser ioctl(fd,
TCSBRKP, 10); pour monter TX pendant une seconde, par exemple.
L'utilisation de TX doit etre plus sure. Je posterai peut-etre
les diff si le temps me le permet...
BBUUPPSS--HHOOWWTTOO
Luminated Software Group Presente
HOWTO utilisation d'onduleurs _B_a_c_k_-_U_P_S (d'_A_P_C) (pour proteger
votre systeme Linux)
Version: 1.01 BETA
Document de : Christian G. Holtje Information sur le cablage et
aide : Ben Galliart
Adaptation francaise : Bernard Choppy
Ce document est place dans le Domaine Public a une condition.
Celle-ci est que ce qui appartient a Cesar revienne a Cesar.
Modifiez ceci autant que vous voulez, rappelez juste que nous
avons travaille dessus.
AAtttteennttiioonn !!
Ni moi, ni aucun de ceux qui on ecrit ou aide a ce document, ne
garantissons quoi que ce soit concernant ces
textes/sources/indications. Si quoi que ce soit est endommage,
nous n'y sommes POUR RIEN ! Cela fonctionne POUR AUTANT QUE
NOUS LE SACHIONS, mais nous pouvons avoir fait des erreurs.
Donc, soyez prudent !
(-- NdT : Le document d'origine contient des references de
pieces detachees Radio-Shack, qui etaient distribuees par le
reseau Tandy en France. Ce reseau n'existe plus, et les
references ont donc ete supprimees de la version francaise. Le
lecteur neammoins interesse pourra se reporter a la version
anglaise du present document.--)
Bien, vous venez juste d'acheter (ou vous allez le faire) un
_B_a_c_k_-_U_P_S d'_A_P_C (d'autres modeles pourront peut-etre beneficier
de ces informations, avec peu ou pas de modifications, mais nous
ne savons pas). Vous avez jete un coup d'oeil au prix du couple
logiciel/cable _P_o_w_e_r_-_C_h_u_t_e, et n'etes pas sur que le jeu en
vaille la chandelle. Bien, j'ai fait mon propre cable, et mon
propre logiciel et je les utilise pour arreter automatiquement
mon systeme Linux lors d'une coupure secteur. Vous savez quoi ?
Vous pouvez aussi !
*** Le Cable ***
C'etait la partie la plus difficile a imaginer (je m'y connais
peu en hardware, donc Ben a fait le plus gros du travail). Pour
en fabriquer un, vous devez acheter ce qui suit chez votre
marchand d'electronique du coin :
+o 1 connecteur a souder subminiature male DB-9 ;
+o 1 connecteur a souder subminiature femelle DB-9 ;
+o 2 boitiers pour les connecteurs ci-dessus (vendus separement en
general) ;
+o Du cable multi-brins (pas du mono-brin).
Il vous faut aussi, mais vous pourrez peut-etre l'emprunter :
+o un fer a souder ;
+o de la soudure.
Ok... Voici comment connecter le tout !
Ces diagrammes montrent le cote ARRIERE (celui ou vous soudez
les cables sur les broches). Les lettres V, R et B representent
les couleurs des cables que j'ai utilises, et facilitent la
distinction des lignes (-- (Note : j'utilise la numerotation
standard RS-232 (pour autant qu'on puisse dire)--)
Le manuel de l'_A_P_C utilise une numerotation differente.
Ignorez-la ! Utilisez la notre... Je l'ai deja changee pour
vous !).
--------------------- Cote Male (vers l'onduleur)
\ B R * * * /
\ * * * V /
------------
--------------------- Cote femelle (vers le port COM)
\ R * * * V /
\ * B * * /
------------
Pour ceux qui preferent les chiffres :
Male Femelle
---------------------------------------
1 7 Bleu
2 1 Rouge
9 5 Vert
---- Complement : Utilisation des broches RS-232 ! ---- Puisque
nous avons eu a trouver cette information :
Depuis l'ARRIERE (cote soudure), les broches sont numerotees
ainsi :
---------------------
\ 1 2 3 4 5 /
\ 6 7 8 9 /
------------
Les broches signifient
Numero Nom Abreviation (parfois prefixee par D)
1 Detection de porteuse CD
2 Reception de donnees RD
3 Transmission de donnees TD(?)
4 Terminal de donnees pret DTR
5 Masse de signal Gnd
6 Jeu de donnees pret DSR
7 Demande pour envoyer RTS(?)
8 Pret a envoyer CS
9 Indicateur de sonnerie RI
Ce que nous avons fait etait la connexion de la ligne RS-232 de
l'onduleur "Fail Output" sur CD, le chassis de l'onduleur sur Gnd,
et l'entree "Shut Down" sur RTS. Facile, maintenant qu'on vous le
dit, non ?
Je n'ai aucune idee du comportement du logiciel ci-dessous, si vous
achetez le cable d'APC. Il peut fonctionner, ou non.
*** Le Logiciel ***
J'utilise le paquetage _S_y_s_V_I_n_i_t de Miquel van Smoorenburg pour
Linux (voir a la fin pour emplacements, remerciements, adresses E-
mail, etc.). Je ne sais ce qui doit etre change pour utiliser
l'init de quelqu'un d'autre, mais je sais que ce code (qui suit)
fonctionne avec celui de Miquel. Simplement ainsi je remercie
comme je le dois. J'ai regarde dans le code de Miquel pour
comprendre comment ioctl() fonctionnait. Si je n'avais pas eu cet
exemple, j'aurais eu des problemes. J'ai aussi utilise la routine
powerfail() (telle quelle, je crois), puisqu'elle doit interagir
avec init, j'ai pense qu'il devait savoir ca mieux que moi. Le
fichier .c est a la fin de ce document, et necessite seulement
d'etre copie/colle. Pour cela, supprimez simplement tout ce qui
n'est pas du code. Ce document doit se terminer par la ligne /*
Fin de Fichier */... Coupez le reste.
Ce programme peut, soit etre lance comme daemon pour controler
l'etat de l'onduleur et l'indiquer a init, soit etre lance pour
envoyer la commande kill-power (coupure d'alimentation) a
l'onduleur. L'alimentation ne sera coupee que s'il y a un probleme
secteur et que l'onduleur est sur batteries. Une fois le courant
revenu, il se rallume.
Pour le lancer comme demon, entrez simplement :
backupsd /dev/backups
/dev/backups est un lien vers /dev/cua0 (COM 1, pour les DOSseurs)
actuellement. La beaute du lien est que je n'ai qu'a le refaire si
je passe sur COM 2 ou COM 3.
Ensuite, si le secteur s'arrete, init lancera les commandes de
powerwait. Un exemple (qui vient de mon /etc/inittab) :
#Voici les actions de coupure de courant
pf::powerwait:/etc/rc.d/rc.power start
po::powerokwait:/etc/rc.d/rc.power stop
Powerwait sera lance si le courant baisse, et powerokwait s'il
revient.
Voici mon rc.power complet :
___________________________________________________________________
#! /bin/sh
#
# rc.power Ce fichier est execute par init en cas de coupure de courant
#
# Version : @(#)/etc/rc.d/rc.power 1.50 1994-08-10
#
# Auteur : Christian Holtje, <
[email protected]>
#
# Definit le chemin
PATH=/sbin:/etc:/bin:/usr/bin:/sbin/dangerous
# Regarde comment nous avons ete appele
case "$1" in
start)
echo "Attention - probleme d'alimentation secteur." | wall
# Sauvegarde le niveau de fonctionnement actuel
ps | gawk '{ if (($5 == "init") && ($1 == "1")) print $6 }' \
| cut -f2 -d[ | cut -f1 -d] \
> /tmp/run.level.power
/sbin/shutdown -h +1m
;;
stop)
echo "Alimentation secteur revenue." | wall
echo "Tentative d'arret du shutdown." | wall
shutdown -c
;;
*)
echo "Usage: $0 [start|stop]"
exit 1
;;
esac
___________________________________________________________________
Pas mal, non ? En fait, il y a un petit probleme, la... Je n'ai
pas eu le temps de le trouver... S'il y a un gourou "sh" par
ici...
J'ai laisse un petit detail de cote, c'est de faire couper
l'alimentation par l'onduleur si le PC est arrete courant coupe.
Cela est realise en ajoutant la ligne suivante a la fin de votre
script halt :
/sbin/backupsd /dev/backups killpower
Cela va simplement couper l'alimentation si le secteur est coupe.
*** Tester le tout ***
C'est juste une petite section pour vous dire :
SOYEZ PRUDENT !
Je vous recommande la sauvegarde de vos partitions Linux, avec
plusieurs sync avant de tester, et d'etre prudent en general.
Evidemment, je ne fais que vous le recommander. Je n'ai pas ete
prudent du tout, et j'ai eu a nettoyer ma partition plusieurs fois
pendant les tests de ma configuration. Mais celle-ci fonctionne.
:-)
*** Ou l'obtenir ***
Le SysVInit de Miquel van Smoorenburg's peut se trouver sur :
SysVinit-2.50.tgz
et une correction pour certains shell bash se trouve juste a cote :
SysVinit-2.50.patch1
Pour ce qui est d'obtenir ce HOWTO, vous pouvez m'envoyer un E-
mail,
[email protected] avec pour sujet :'request' et le mot-clef
'backups' dans le corps du message : Demande du HOWTO original (il
est possible que j'automatise cela, et d'autres choses).
*** Section des remerciements qui sont dus ***
Merci a :
+o Miquel van Smoorenburg pour son superbe paquetage _S_y_s_V_I_n_i_t et
son powerd.c qui m'ont beaucoup aides ;
+o Christian Holtje Documentation backupsd.c (ce qui n'est pas de
Miquel) rc.power ;
+o Ben Galliart Le cable, informations sur le standard RS-232 et
astuces bruyantes (non rapportees ici).
___________________________________________________________________
/* backupsd.c -- Simple daemon pour lire les signaux de coupure de
* courant d'un onduleur Back-UPS (d'APC).
*
* Certaines parties proviennent du powerd.c de Miquel van Smoorenburg
* D'autres sont originales de Christian Holtje <
[email protected]>
* Je crois qu'on peut dire que c'est dans le Domaine Public, simplement
* n'oubliez pas de citer les auteurs originaux, la ou c'est necessaire.
*
* Avertissement : Nous ne garantissons RIEN de ce logiciel, ni
* n'assumons aucune responsabilite concernant son
* utilisation, bonne ou mauvaise.
*/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
/* C'est le fichier necessaire pour SysVInit */
#define PWRSTAT "/etc/powerstatus"
void powerfail(int fail);
/* Programme principal */
int main(int argc, char **argv)
{
int fd;
int killpwr_bit = TIOCM_RTS;
int flags;
int status, oldstat = -1;
int count = 0;
if (argc < 2) {
fprintf(stderr, "Usage: %s <peripherique> [killpower]\n", argv[0]);
exit(1);
}
/* Ouverture du port */
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
fprintf(stderr, "%s : %s : %s\n", argv[0], argv[1], sys_errlist[errno]);
exit(1);
}
if ( argc >= 3 && (strcmp(argv[2], "killpower")==0) )
{
/* Coupons l'alimentation */
fprintf(stderr, "%s : Tentative de coupure d'alimentation !\n",
argv[0] );
ioctl(fd, TIOCMBIS, &killpwr_bit);
/* Hmmm... Si vous avez une coupure d'alimentation, */
/* ce code ne sera jamais execute */
exit(0);
}
else
/* Puisqu'il ne faut pas couper l'alimentation, il faut restaurer */
/* RTS (killpwr_bit) */
ioctl(fd, TIOCMBIC, &killpwr_bit);
/* Passe en demon. */
switch(fork()) {
case 0: /* Je suis le fils */
setsid();
break;
case -1: /* Passage demon manque */
fprintf(stderr, "%s : fork impossible.\n", argv[0]);
exit(1);
default: /* Je suis le pere */
exit(0);
}
/* Maintenant, on scrute la ligne DCD */
while(1) {
ioctl(fd, TIOCMGET, &flags);
status = (flags & TIOCM_CD);
/* Si DCD est monte, le secteur est coupe */
if (oldstat == 0 && status != 0) {
count++;
if (count > 3) powerfail(0);
else { sleep(1); continue; }
}
/* Si DCD est redescendu, le secteur est revenu */
if (oldstat > 0 && status == 0) {
count++;
if (count > 3) powerfail(1);
else { sleep(1); continue; }
}
/* Reinit du compteur, sauvegarde de l'etat et sleep 2 secondes */
count = 0;
oldstat = status;
sleep(2);
}
/* Erreur ! (ne doit pas arriver) */
return(1);
}
/* Signale a init que le courant est coupe ou revenu */
void powerfail(ok)
int ok;
{
int fd;
/* Cree le fichier necessaire a init pour shutdown/abandon */
unlink(PWRSTAT);
if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
if (ok)
write(fd, "OK\n", 3);
else
write(fd, "FAIL\n", 5);
close(fd);
}
kill(1, SIGPWR);
}
/* Fin de Fichier */
___________________________________________________________________
AAuuttrreess iinnffoorrmmaattiioonnss
(-- (NdT : Le document original comporte de nombreuses copies de
courriers electroniques a ce point. Le traducteur s'est permis
d'en realiser une synthese plus courte et, il l'espere, plus
facile a utiliser)--)
Message de Jim Ockers du 12 janvier 1995 dans
comp.os.linux.hardware :
Selon la base de connaissances (_K_n_o_w_l_e_d_g_e_B_a_s_e) de _M_i_c_r_o_s_o_f_t, il
semble que la broche 5 du connecteur des onduleurs _A_P_C _B_a_c_k_-_U_P_S
et _S_m_a_r_t_-_U_P_S (teste avec un _B_a_c_k_-_U_P_S _4_0_0 sous _W_i_n_d_o_w_s _N_T) monte
un signal "batterie faible" deux minutes au moins avant
l'epuisement de la batterie.
Ce signal est au niveau "TTL collecteur ouvert", et peut etre
ramene aux niveaux RS-232 selon le schema suivant :
Broche 5 Broche 8
+---------+
o------| 10 kOhm |-------o
+---------+
Par ailleurs, le manuel de l'onduleur stipule que la broche commune
a utiliser est la 4 (et non la 9, meme si celles-ci sont branchees
ensemble).
Message de Peter Kammer du 7 octobre 1996 :
Les schemas de brochage sont inverses en ce qui concerne les
connecteurs males : en effet, les broches sont numerotees de
maniere inverse sur les connecteurs males et femelles (puisque
leurs sens s'opposent lors du brancement). Il faut donc considerer
que les schemas pour les connecteurs males sont vus cote exterieur
et non cote interieur (soudure), contrairement a ce qui est
indique.
Par ailleurs, il existe un document de reference technique pour les
onduleurs _B_a_c_k_-_U_P_S qui se trouve sur le site web d'_A_P_C.
Message de Troy Muller du 6 avril 1997 :
L'onduleur _B_a_c_k_-_U_P_S _P_r_o _6_5_0 fonctionne avec le cable standard
d'_A_P_C. La reference du cable est 940-023A et le logicel est
_E_n_h_a_n_c_e_d___A_P_C___B_a_c_k_U_P_S. Ce logiciel envoit des messages globaux
toutes les deux secondes, mais un eu de bidouillage de dowalll.c
permet de limiter cette fonction.
AAPPCC SSmmaarrtt--UUPPSS
De nombreuses personnes ont un APC Smart UPS. Il semble qu'il
existe des paquetages pour utiliser ceux-ci en mode
"intelligent" (voir les paquetages mentionnes plus haut
Enhanced_APC_UPSD-v1.4.tar.gz, apcd-0.5.tar.gz et
smupsd-0.7-1.i386.rpm decrits dans la section ``Logiciels'').
Je ne sais pas ce que vaut le support pour chacun d'eux. Il
semble qu'_A_P_C ccoonnttiinnuuee a refuser de publier son protocole pour
le mode "intelligent" sans un accord de non-diffusion, ainsi
tout le monde a du faire de la retro-ingenierie dessus.
Le consensus general est d'investr dans une gamme qui publie
cette information, comme _B_e_s_t.
Une autre possibilite est d'utiliser la version du logiciel de
controle d'onduleurs _P_o_w_e_r_c_h_u_t_e d'_A_P_C pour _S_C_O _U_n_i_x via le
paquetage de compatibilite _i_B_C_S. Clive A. Stubbings me dit que
cela fonctionne bien apres quelques ajustements du script
d'installation. Il dit que le seul probleme est que
"l'interface graphique semble avoir des problemes a controler
des onduleurs a-travers le reseau".
Si vous possedez un _A_P_C _S_m_a_r_t_-_U_P_S et que vous n'arriviez pas a
le faire fonctionner en mode intelligent avec aucun de ces
logiciels, vous pouvez malgre tout encore l'utiliser en mode
bete. Les sections qui suivent detaillent cette procedure.
J'ai recu, en particulier, des messages concernant les modeles
_6_0_0, _7_0_0 et _1_4_0_0. Il vous faudra probablement bidouiller
powerd.c comme indique dans la section ``Analyse de cables et
modification de powerd.c''.
Message de Lam Dang du 19 aout 1994 dans comp.os.lnux.misc :
Realisation du cable pour un _A_P_C _S_m_a_r_t_-_U_P_S _m_o_d_e_l_e _6_0_0.
Le cable est a realiser entre un connecteur DB-9 femelle sur
l'onduleur et un DB-25 male sur l'ordinateur. Le boitier du
DB-25 est assez grand pour contenir un regulateur de tension et
deux resistances. L'interface entre le connecteur de l'onduleur
et celui du PC est ainsi :
Onduleur (DB-9) PC (DB-25)
1 (Extinction) 20 (DTR)
3 (Coupure de secteur) 5 (CTS)
4 (Commun) 7 (GND)
5 (Batterie faible) 8 (DCD)
9 (Masse chassis) 1 (Chassis Ground)
Vous pouvez utiliser la broche 6 de l'onduleur au lieu de la broche
3 (elles sont inverses l'une de l'autre). La complication est de
monter les broches collecteur ouvert 3 (ou 6) et 5 de l'onduleur.
Ce modele APC fournit une sortie non regulee de 24 V continu sur la
broche 8. La tension de sortie est disponible tout le temps (au
moins un peu apres que le signal de batterie faible soit monte).
L'intensite est limitee a 40mA. Pour monter, la broche 8 est
l'alimentation d'un regulateur de tension de +5V. La sortie de ce
regulateur passe dans deux resistances de 4,7kohm. L'autre bout
d'une resistance connecte les broches 3 (Coupure de courant) de
l'onduleur et 5 du PC (CTS). Celle de l'autre resistance connecte
les broches 5 de l'onduleur (Batterie faible) et 8 du PC (DCD).
Les deux resistances consomment environ 2 mA lorsqu'elles sont a la
masse.
Lorsque l'onduleur est alimente, les broches 5 (CTS) et 8 (DCD)
cote PC doivent etre tres proches de 5V, et monter la broche 20
pendant 5 secondes ne doit avoir aucun effet. Lorsque l'onduleur
passe sur batteries, la broche 5 (CTS) doit tomber a 0V, la broche
8 (DCD) doit rester a l'identique a 5V, et monter la broche 20
(DTR) en court-circuitant les broches 8 et 20, par exemple, doit
eteindre l'onduleur apres environ 15 secondes.
Lorsque la diode "Low Battery" du panneau frontal s'allume, la
broche 8 (DCD) doit descendre a 0V aussi.
Les tensions de l'interface onduleur sont NEGATIVES pour la coupure
de secteur (sur la broche 3 de l'onduleur) et la batterie faible,
et POSITIVE pour l'arret a distance. Les parametres de ligne serie
comme la vitesse n'ont aucune importance.
Liste du materiel necessaire :
+o un boitier DB-9 ;
+o un connecteur sub-DB-25 femelle ;
+o un regulateur de tension 7805 +5Vdc ;
+o deux resistances de 4,7kohm ;
+o un carte a composants perforee ;
+o un cable avec au moins un connecteur 9 broches male.
Et de plus :
+o un multimetre ;
+o un fer a souder;
+o quelques heures...
AAPPCC SSmmaarrtt--UUPPSS 770000
Voici quelques details sur le fonctionnement du modele 700 en
mode bete, qui presente une utilisation futee d'un transistor
place dans le cable qui eteint l'onduleur lorsque l'ordinateur
est eteint.
From: Markus Eiden <
[email protected]>
Sender:
[email protected]
To: "Harvey J. Stein" <
[email protected]>
Subject: Re: APC Smart-UPS
Date: Sun, 30 Mar 1997 16:21:05 +0200
J'utilise un APC Smart-UPS 700 pour mon systeme Linux sur une carte
ASUS.
Pour utiliser quelques possibilites de l'onduleur, il faut quatre
choses :
1) faire un cable RS-232 avec une petite interface ; 2) le source
du powerd du paquetage sysvinit (j'utilise la version 2.6 de Miquel
van Smoorenburg). Il faut ensuite modifier ce powerd ; 3) changer
/etc/inittab ; 4) faire un script qui lance certaines commandes si
le courant est coupe ou si la batterie est faible.
Quelques possibilites :
Lorsque le secteur est coupe, un script est lance et une entree est
faite dans syslog.
Si la batterie est faible, un autre script est lance (qui arete
l'ordinateur, evidemment) et une entree est faite dans syslog.
Si l'ordinateur est arrete et que le courant l'est aussi,
l'onduleur sera arrete a son tour.
1) D'abord le cable :
Si l'on jette un coup d'oeil a l'arriere de l'onduleur, on y trouve
un connecteur femelle comme celui-ci :
8 1: Eteint l'onduleur lorsque le courant est coupe
et que la broche 1 est haute.
X X X X 3: Descend en cas de coupure de curant.
X X X X X 4: Masse
5: Descend en cas de baisse de la batterie.
1 3 4 5 8: +24V
D'un autre cote, l'arriere du PC presente un connecteur male comme
celui-ci :
8 6 1: DCD
X X X X 4: DTR
X X X X X 5: GND
5 4 1 6: DSR
8: CTS
Il faut realiser l'interface suivant entre ces connecteurs :
PC UPS
#------------------ (8)
|
470 Ohm
|
#-----#-----#-----#-----#-----#----- ca. 9-12V
| | | | | |
47 3.3 3.3 3.3 1 470
kOhm kOhm kOhm kOhm kOhm Ohm
| | | | | |
(8) ------------------------# | |
| | | | |
(6) ------------#------------------------------------------- (5)
| | | |
(1) ------------------#------------------------------------- (3)
| | |
| C#------------------------- (1)
| -| |
| B/ |
(4) ------#-----12kOhm---------| |
\>E |
| |
(5)-----------------------------#-------#------------------- (4)
+o j'utilise un transistor "BC140", mais a peut pres n'importe quel
transistor NPN devrait faire l'affaire ;-)
+o Le transistor fonctionne comme "inverseur". Si l'on eteint
l'ordinateur ET que le courant est coupe, la broche 4 du PC
descend et la broche 1 de l'onduleur monte. Cela eteint
l'nduleur pour economiser la batterie.
2) Le source de _p_o_w_e_r_d
J'ai juste retouche tres peu le source (donc c'est en fait celui
de Miquel).
(a) Emet une "alerte" vers syslogd si la broche 8 du PC (DCD)
est basse (c'est qu'alors, le cable n'est pas connecte) ;
(b) DCD descendu a zero -> le courant est coupe -> appel de
powerfail(0) -> envoi de INIT_CMD_POWERFAIL au processus init ;
(c) DCD remonte -> le courant est revenu -> appel de
powerfail(1) -> envoi de INIT_CMD_POWEROK au processus init ;
(d) DSR et DCD descendus a zero -> le courant est coupe et la
batterie est faible > appel de powerfail(2) -> envoi de
INIT_CMD_POWERFAILNOW au processus init.
Et voila.
/*
* powerd Surveille la ligne DCD d'un port serie connecte a un
* onduleur. Si le courant est coupe, previent init.
* Si le courant revient, previent init encore.
* Tant que le courant est la, DCD doit etre "haut". Lorsque
* le courant est coupe, DCD doit descendre.
* Powerd maintient DTR haut, donc en branchant une resistance
* de 10 kOhm entre DCD et DTR, l'onduleur ou un simple relais
* peuvent descendre DCD a la masse.
* Il faut aussi brancher DSR et DTR ensemble. Ainsi, powerd
* peut controler ici et la que DSR soit haut, et il sait donc
* que l'onduleur est connecte !!
*
* Usage: powerd /dev/cua4 (ou tout autre port serie).
*
* Auteur: Miquel van Smoorenburg, <
[email protected]>.
* Quelques changements mineurs de Markus Eiden, <
[email protected]>
* pour APC-Smart-UPS-powerd.
*
* Version: 1.31, 29-Feb-1996.
*
* Traduction: Bernard Choppy (
[email protected])
*
* Ce programme fut developpe initialement pour mon employeur
* ** Cistron Electronics **
* qui a autorise la distribution de celui-ci pour un usage
* generalise.
*
* Copyright 1991-1996 Cistron Electronics.
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Ce programme est un logiciel libre ; vous pouvez le diffuser
* et/ou modifier selon les termes de la GPL (GNU Public License)
* de la Free Software Foundation; au choix dans la version 2 de
* cette licence, ou (a votre choix) toute autre version.
*
* Modifications mineures pour APC-powerd par Markus Eiden
*
[email protected]
*/
/* Utilisation de la nouvelle methode de communication avec init */
#define NEWINIT
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <syslog.h>
#include <string.h>
#include "paths.h"
#ifdef NEWINIT
#include "initreq.h"
#endif
#ifndef SIGPWR
# define SIGPWR SIGUSR1
#endif
#ifdef NEWINIT
void alrm_handler()
{
}
#endif
/* Avise init du changement d'etat du courant */
void powerfail(ok)
int ok;
{
int fd;
#ifdef NEWINIT
struct init_request req;
/* Remplissage de la structure de requete */
memset(&req, 0, sizeof(req));
req.magic = INIT_MAGIC;
/* INIT_CMD_* sont definis dans initreq.h *
* Jetez un coup d'oeil a init.c et /etc/inittab *
* *
* ok=0 -> INIT_CMD_POWERFAIL -> powerwait *
* ok=1 -> INIT_CMD_POWEROK -> powerokwait *
* ok=2 -> INIT_CMD_POWERFAILNOW -> powerfailnow */
switch (ok) {
case 0 : req.cmd = INIT_CMD_POWERFAIL;
/* Coupure -> alerte */
break;
case 1 : req.cmd = INIT_CMD_POWEROK;
/* Retour du courant -> arrete l'alerte */
break;
case 2 : req.cmd = INIT_CMD_POWERFAILNOW;
/* Coupure et batterie faible -> arret systeme */
break;
}
/* Ouvre le fifo (avec timeout) */
signal(SIGALRM, alrm_handler);
alarm(3);
if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0
&& write(fd, &req, sizeof(req)) == sizeof(req)) {
close(fd);
return;
}
/* On en revient a l'ancienne methode... */
#endif
/* Creaton d'un fichier info pour init */
unlink(PWRSTAT);
if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
if (ok)
write(fd, "OK\n", 3);
else
write(fd, "FAIL\n", 5);
close(fd);
}
kill(1, SIGPWR);
}
/* Programme principal */
int main(int argc, char **argv)
{
int fd;
int dtr_bit = TIOCM_DTR;
int flags;
int status, oldstat = -1;
int count = 0;
int tries = 0;
int powerfailed = 0;
int rebootnow = 0;
if (argc < 2) {
fprintf(stderr, "Usage: powerd <port>\n");
exit(1);
}
/* Lancement de syslog */
openlog("powerd", LOG_CONS|LOG_PERROR, LOG_DAEMON);
/* Ouverture du port a surveiller */
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
syslog(LOG_ERR, "%s: %s", argv[1], sys_errlist[errno]);
closelog();
exit(1);
}
/* Port ouvert, DTR doit etre haut. On le force tout de meme...*/
/* Fonctionnement : Batterie faible -> Arret -> DTR descend -> *
* transistor ouvert -> La broche d'arret onduleur monte -> *
* l'onduleur s'arrete apres 20 s environ. S'il y a une coupu- *
* re et que l'ordinateur est eteint, l'onduleur s'arrete. *
* Si le courant revient, l'onduleur s'allume, l'ordinateur *
* demarre, et powerd est lance. *
* */
ioctl(fd, TIOCMBIS, &dtr_bit);
/* Passe en daemon. */
switch(fork()) {
case 0: /* Fils */
closelog();
setsid();
break;
case -1: /* Erreur */
syslog(LOG_ERR, "impossible de forker.");
closelog();
exit(1);
default: /* Pere */
closelog();
exit(0);
}
/* Relance syslog. */
openlog("powerd", LOG_CONS, LOG_DAEMON);
syslog(LOG_INFO, "APCpowerd demarre...");
/* On surveille DCD */
while(1) {
/* Lecture de l'etat. */
ioctl(fd, TIOCMGET, &flags);
/* Controle de connexion : CTS doit etre haut */
tries = 0;
/* TIOCM_*- Se reporter a .../ams/termios.h */
while((flags & TIOCM_CTS) == 0) {
/* On continue a essayer, et alerte toutes les 2 minutes */
if ((tries % 60) == 0)
syslog(LOG_ALERT, "Onduleur non connecte");
sleep(2);
tries++;
ioctl(fd, TIOCMGET, &flags);
}
if (tries > 0)
syslog(LOG_ALERT, "Onduleur reconnecte");
/* Calcule l'etat en cours */
status = (flags & TIOCM_CAR);
/* Si DCD est passe a zero, le courant a ete coupe */
if (oldstat != 0 && status == 0) {
count++;
if (count > 3) {
powerfailed = 1;
powerfail(0);
}
else {
sleep(1);
continue;
}
}
/* Si DCD remonte, le courant est revenu. */
if (oldstat == 0 && status > 0) {
count++;
if (count > 3) {
powerfailed = 0;
/* eigentlich unnoetig: */
rebootnow = 0;
powerfail(1);
}
else {
sleep(1);
continue;
}
}
/* Batterie faible et courant coupe ? */
if (rebootnow==0)
if (powerfailed==1)
if ((flags & TIOCM_DSR) == 0)
{
rebootnow=1;
powerfail(2);
}
/* Reinitialisation, stockage de l'etat et attente 2s. */
count = 0;
oldstat = status;
sleep(2);
}
/* N'arrive jamais */
return(0);
}
3) Modifier inittab
init recoit les commandes INIT_CMD et lance les scripts idoines :
pf::powerwait:/sbin/init.d/powerfail start
pn::powerfailnow:/sbin/init.d/powerfail now
po::powerokwait:/sbin/init.d/powerfail stop
Ce qui signifie, par exemple : si le courant est coupe (powerwait,
lancer le script /sbin/init.d/powerfail avec le parametre "start".
4) Le script powerfail
#! /bin/sh
# Copyright (c) 1997 Markus Eiden,
[email protected]
#
case "$1" in
start)
echo "LE COURANT EST COUPE !" | wall
logger "Coupure de courant"
;;
now)
echo "BATTERIE FAIBLE ! Arret systeme dans une minute" | wall
logger "Batterie faible, arret systeme dans une minute"
sync
/sbin/shutdown -r -t 5 +1
;;
stop)
echo "LE COURANT EST REVENU !!" | wall
logger "Courant retabli"
/sbin/shutdown -c >/dev/null 2>/dev/null
;;
*)
echo "Usage: $0 {start|now|stop}"
exit 1
;;
esac
exit 0
Eh bien, cela devrait etre simple ;-)
Vous voila pret maintenant, mais restez prudent : cela fonctionne
pour moi, mais je ne peux evidemment pas garantir que quoi que ce
soit de cela fonctionne pour vous.
Un petit conseil pour finir : si /sbin/init.d/powerfail arrete
votre PC, DTR descend, donc la broche d'arret (cote onduleur)
monte. Des cet instant, il faut entre 20 et 30 secondes a
l'onduleur pour s'arreter. C'est de votre responsabilite
d'empecher votre machine Linux de redemarrer durant ces 20 secondes
(en particulier, de monter les volumes disque). Cela ne fut pas un
probleme pour mon systeme.
Quatre methodes simples permettent d'empecher Linux de demarrer
rapidement :
1. le BIOS doit realiser certaines routines (comme identifier le
nombre de pistes de votre lecteur de disquettes si vous en
avez un) ;
2. LILO peut etre configure pour attendre s'il est installe ;
3. il peut ne rien y avoir a faire (comme dans mons cas) ;
4. il est possible d'acheter plus de memoire afin que le
decompte dure 30 secondes. Cela doit correspondre environ a
1 024 Mo ;-).
AAPPCC SSmmaarrtt--UUPPSS 11 440000
Autre jour, autre APC. Voici pour le _S_m_a_r_t_-_U_P_S _1 _4_0_0, en mode
bete.
From: "Slavik Terletsky" <
[email protected]>
To:
[email protected]
Subject: my contribution to UPS HOWTO
Date: Mon, 27 Jan 1997 21:10:16 +0000
Daemon d'onduleur pour FreeBSD (2.1.5 - teste).
Schema de branchement :
Onduleur (broche, nom) PC (broche, nom)
---------------------- ---------------------
1 Arret >-----------> 4 Terminal pret
2 Courant Coupe >-----------> 8 Pret a emettre
4 Commun >-----------> 5 Masse
5 Batterie faible >----------+> 1 Detection de porteuse
8 Batterie (+24V) >-|10kOhm|-+
Description
Usage: upsd <device> [wait [script]]
device - device name upsd interacts thru (e.g. /dev/cuaa1)
wait - time (secs) to wait before running script, (default value 0 sec).
script - system shutdown script (default /etc/rc.shutdown).
Fonctionnement :
upsd enregistre tous les changements d'etat de l'onduleur (courant
present ou absent, batterie faible ou bonne). Lorsque le courant
est absent et que la batterie est faible, upsd active le signal
d'arret de l'onduleur, attend le nombre de secondes indique sur la
ligne de commande, et lance le script d'arret.
Exemple de script :
#!/bin/sh
# Le script est execute lorsque le systeme s'arrete
PATH=/sbin:/bin:/usr/sbin:/usr/bin
echo "ARRET IMMEDIAT DU SYSTEME" | wall
reboot
Source d'upsd :
/* daemon d'onduleur
* Copyright 1997 Slavik Terletsky. All rights reserved.
* Auteur: Slavik Terletsky <
[email protected]>
* Systeme: FreeBSD
* Traduction: Bernard Choppy <
[email protected]>
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <syslog.h>
#include <unistd.h>
#include <varargs.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/uio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/ttycom.h>
int status;
int wait = 0;
FILE *fd;
char *scr = "/etc/rc.shutdown";
char *idf = "/var/run/upsd.pid";
void upsterm();
void upsdown(int);
int main(int argc, char *argv[]) {
int pd;
int zero = 0;
char d5, d6, d7;
char low = 0;
char pow = 1;
/* controle des arguments */
switch(argc) {
case 4:
scr = argv[3];
case 3:
wait = atoi(argv[2]);
case 2:
break;
default:
fprintf(stderr, "usage: %s <port> [temporisation [script]]\n", argv[0]);
exit(1);
}
/* controle de l'existence du script */
if(!(fd = fopen(scr, "r"))) {
fprintf(stderr, "fopen: %s: %s\n", scr, sys_errlist[errno]);
exit(1);
}
fclose(fd);
/* controle si upsd s'execute deja */
if(fd = fopen(idf, "r")) {
fprintf(stderr, "fopen: le fichier %s existe deja\n", idf);
exit(1);
}
/* passe en daemon */
switch(fork()) {
case -1: /* erreur */
fprintf(stderr, "fork: %s\n", sys_errlist[errno]);
exit(1);
case 0: /* fils */
break;
default: /* pere */
exit(0);
}
/* sauvegarde du pid */
if(!(fd = fopen(idf, "w"))) {
fprintf(stderr, "fopen: %s: %s\n", idf, sys_errlist[errno]);
exit(1);
}
fprintf(fd, "%d\n", (int)getpid());
fclose(fd);
/* ouverture du port a surveiller */
if((pd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
fprintf(stderr, "open: %s: %s\n", argv[1], sys_errlist[errno]);
exit(1);
}
/* le daemon fonctionne */
openlog("upsd", LOG_PID, LOG_DAEMON);
syslog(LOG_INFO, "daemon demarre");
/* reaction au signal */
(void)signal(SIGTERM, upsterm);
/* surveillance du port */
while(1) {
/* reinitialisation des bits */
if(ioctl(pd, TIOCMSET, &zero) < 0) {
fprintf(stderr, "ioctl: %s\n", sys_errlist[errno]);
exit(1);
}
/* lecture de l'etat du port */
if(ioctl(pd, TIOCMGET, &status) < 0) {
fprintf(stderr, "ioctl: %s\n", sys_errlist[errno]);
exit(1);
}
/* determination de l'etat */
d5 = status & 0x20;
d6 = status & 0x40;
d7 = status & 0x80;
/* courant present */
if(!(d7 + d5)) {
if(!pow) {
syslog(LOG_CRIT, "courant present");
pow = 1;
}
/* courant coupe */
} else {
if(pow) {
syslog(LOG_CRIT, "courant coupe");
pow = 0;
}
}
/* batterie faible */
if(!d6 && !low) {
syslog(LOG_ALERT, "batterie faible");
low = 1;
/* arret onduleur */
if(!pow) {
upsdown(pd);
}
}
/* batterie ok */
if(d6 && low) {
syslog(LOG_CRIT, "batterie ok");
low = 0;
}
sleep(1);
}
/* jamais atteint */
return 0;
}
void upsterm() {
/* message de trace de fin */
syslog(LOG_INFO, "arret du daemon");
/* effacement du fichier de pid */
unlink(idf);
exit(0);
}
void upsdown(int pd) {
/* message de trace d'arret */
syslog(LOG_ALERT, "arret du systeme");
/* effacement du fichier de pid */
unlink(idf);
/* mesure de securite : vidange des tampons d'ecriture */
system("/bin/sync");
system("/bin/sync");
system("/bin/sync");
/* arret de l'onduleur */
status = TIOCM_DTR;
if(ioctl(pd, TIOCMSET, &status) < 0) {
fprintf(stderr, "ioctl: %s\n", sys_errlist[errno]);
exit(1);
}
/* attente puis lancement du script */
sleep(wait);
system(scr);
}
# Slavik Terletsky # University "Lvivska Poytechnika" #
# Network Administrator # mailto:
[email protected] #
99.. CCoommmmeenntt eetteeiinnddrree dd''aauuttrreess mmaacchhiinneess ssuurr llee mmeemmee oonndduulleeuurr ??
Certaines personnes (y compris moi-meme), ont plusieurs PC Linux
connectes sur un onduleur. Un PC controle l'onduleur et doit eteindre
les autres PC lorsque le secteur est coupe.
Nous supposons que les PC peuvent communiquer sur un reseau. Appelons
le PC qui surveille l'onduleur le maitre, et les autres PC, les
esclaves.
Dans les temps anciens, cela necessitait une amusante programmation.
Maintenant, la meilleure chose a faire semble etre de trouver l'un des
paquetages powerd-2.0.tar.gz ou upsd-1.0.tgz cites a la section
``Logiciels'' et de suivre les instructions. Les deux sont capables
de fonctionner sur les esclaves dans un mode qui les connecte a un
processus powerd ou upsd s'executant sur le maitre pour lui demander
l'etat de l'onduleur. Certains des paquetages specifiques pour APC
semblent disposer aussi de cette fonctionnalite.
Neammoins, si votre reseau n'est pas sur, vous pouvez etre amene a
souhaiter plus de securite dans ce montage, puisqu'il est possible de
"pirater" un powerd esclave pour lui faire croire que le courant est
coupe.
Une autre possibilite est d'utiliser le protocole SNMP (Simple Network
Management Protocol - protocole simplifie d'administration de reseau).
Le detail de l'utilisation de SNMP depasse le cadre de ce document,
pour ne pas dire que cela me depasse tout court actuellement.
99..11.. MMeetthhooddee ddee ll''eettaatt dduu ppoorrtt
Configurez un port sur le maitre qui, lorsqu'on y est connecte, envoie
soit "OK", soit "FAIL", soit "BATLOW" lorsque le courant est la, qu'il
est coupe, ou que la batterie est faible, respectivement. Montez cela
sur le port 13 (le port time) sur lequel vous pouvez faire un telnet
et recevoir l'heure locale.
Montez sur les esclaves une version de _p_o_w_e_r_d qui lit ce port plutot
que de controler une ligne serie.
Je pense que c'est probablement la meilleure methode, et j'ai
l'intention d'upgrader mes systemes pour l'utiliser.
99..22.. MMeetthhooddee dd''eemmiissssiioonn eenn ll''aaiirr
Identique a la section ``Methode de l'etat du port'', mais par
emission d'un message broadcast Ethernet signifiant l'evenement.
Cela peut avoir des implications de securite, puisqu'il peut etre
{{spoofed}}
99..33.. MMeetthhooddee dduu ppsseeuuddoo--llooggiinn
Configurez les pseudo-login sur les esclaves avec les noms powerok et
powerfail, tous les deux avec le meme UID. Faites de
/etc/powerokscript le shell du user powerok, et de
/etc/powerfailscript celui du user powerfail. Sur le maitre, faites en
sorte que le script /etc/powerokscript fasse un rlogin sur chaque
esclave en tant que user powerok et que le script /etc/powerfailscript
fasse un rlogin en tant que powerfail sur chaque esclave. Placez un
fichier powerfail pour autoriser le root du master a entrer comme
users powerok et powerfail sur chaque esclave.
C'est le systeme que j'utilise actuellement. Malheureusement, j'ai
quelques difficultes a faire que les login distants s'executent et
rendent la main sans se bloquer. Il faudrait probablement que le
script /etc/powerfailscript fasse les rsh sur les esclaves en tache de
fond pour lui eviter de bloquer. Neammoins, je n'ai jamais obtenu de
login correct en tache de fond. J'ai meme essaye des combinaisons
complexes comme faire se loger toto sur l'esclave. Tout ce que j'ai
utilise avait des problemes et se trouvait bloque par un entree tty
(ou sortie, je ne m'en rappelle plus).
En plus, cela peut creer des trous de securite.