Zacznijmy od utworzenia uzytkownika, z ktorego bedziemy odpalali NUT'a. Nazwijmy go 'ups', niech bedzie czlonkiem grupy zwanej takze 'ups', niech uzytkownika katlogiem domowym bedzie '/var/ups', ktory posluzy nam za state directory (o tym pozniej).
- Kod: Zaznacz cały
# groupadd -g 999 ups
# useradd -u 999 -g ups -d /var/ups -s /bin/false -m ups
# chown ups:ups /var/ups
# chmod 750 /var/ups
Teraz potrzebujemy zrodla NUT'a, znajdziemy je na http://www.networkupstools.org/source.html. Potrzebujemy je sciagnac, rozpakowac, i skompilowac, wiec pokoleji:
- Kod: Zaznacz cały
# /opt/sfw/bin/wget http://www.networkupstools.org/source/2.2/nut-2.2.0.tar.gz
# gunzip -c nut-2.2.0.tar.gz | tar -xf -
# cd nut-2.2.0
# ./configure --prefix=/opt/nut --with-statepath=/var/ups --with-user=ups --with-group=ups
Zatrzyjamajmy sie na sekunde w tym momencie, jako ze naleza sie wyjasnienia co do ostatniej komendy, prefix bedzie katalogiem gdzie NUT zostanie zainstalowany, statedir to wczesniej wspomniany katalog domowy uzytkownika 'ups', dalej uzytkownik i grupa z prawami ktorych demon bedzie uruchamiany. Kontynuujmy...
- Kod: Zaznacz cały
# make && make install
Jesli udalo nam sie skompilowac NUTa, czas zabrac sie za konfiguracje. Na poczatek pozbadzmy sie przykladowych plikow konfiguracyjnych, ktore nie beda nam potrzebne.
# cd /opt/nut/etc
# mkdir example; mv *.example example
Teraz musimy utworzyc i wyedytowac w swoim ulubionym edytorze kilka plikow, jednakze, niektore z nich posiadaja opcje ktore musza zostac zmienione, np. haslo, wiec nie kopiujemy bezmysnie bez czytania.
ups.conf
- Kod: Zaznacz cały
[trust]
driver = megatec
port = /dev/ttya
upsd.conf
- Kod: Zaznacz cały
# bind to localhost only
LISTEN 127.0.0.1
# define ACLs
ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
# Accept connections from localhost...
ACCEPT localhost
# ... and reject anything else
REJECT all
upsd.users
- Kod: Zaznacz cały
# define monitor user
[monuser]
password = ZMIEN_NA_SWOJE_HASLO
allowfrom = localhost
upsmon master
upssched.conf
- Kod: Zaznacz cały
CMDSCRIPT /opt/nut/bin/upssched-cmd
upsmon.conf
- Kod: Zaznacz cały
RUN_AS_USER root # root dlatego ze uzytkownik ups nie moze wykonac shotdown
MONITOR trust@localhost 1 monuser ZMIEN_NA_HASLO_Z_UPSD.USERS master
MINSUPPLIES 1
SHUTDOWNCMD "/usr/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
NOTIFYCMD /opt/nut/bin/notify # utworzymy go w nastepnym kroku
POWERDOWNFLAG /etc/killpower
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
Gotowe, teraz nadajmy grupie 'ups' prawa do odczytu plikow konfiguracyjnych, i upewnijmy sie ze nikt inny nie moze ich czytac (bo zawieraja haslo).
- Kod: Zaznacz cały
# chgrp ups ups.conf upsd.conf upsmon.conf upssched.conf
# chmod 640 ups.conf upsd.conf upsmon.conf upssched.conf
Czas utworzyc wczesniej wspomniany skrypt notify, ktory to bedzie slal nam maila przy kazdej zmianie stanu upsa (czyli jak braknie pradu, albo bateria bedzie slaba).
- Kod: Zaznacz cały
# touch /opt/nut/bin/notify
# chmod 755 /opt/nut/bin/notify
Skrypt powninien zawierac nastepujaca tresc:
- Kod: Zaznacz cały
#!/bin/bash
echo "$*" | mail -s "UPS state changed" TWOJ@ADRES.EMAIL
Teraz dodamy wszystko do SMF, zeby startowalo przy starcie systemu. Do tego celu bedziemy potrzebowali metody i manifestu.
- Kod: Zaznacz cały
# mkdir -p /opt/nut/lib/svc/method
# touch nut
I ladujemy w niego nastepujacy skrypt metody:
(Gotowiec do sciagniecia dostepny tutaj)
- Kod: Zaznacz cały
#!/usr/bin/sh
. /lib/svc/share/smf_include.sh
NUT_DIR=/opt/nut
STATE_DIR=/var/ups
PID_UPS=${STATE_DIR}/upsd.pid
PID_MON=/var/run/upsmon.pid
ups_stop () {
if [ -f ${PID_MON} ]; then
/usr/bin/kill `cat ${PID_MON}` > /dev/null
/usr/bin/rm -f ${PID_MON}
fi
if [ -f ${PID_UPS} ]; then
/usr/bin/kill `cat ${PID_UPS}` > /dev/null
/usr/bin/rm -f ${PID_UPS}
fi
${NUT_DIR}/bin/upsdrvctl stop > /dev/null 2>&1
}
ups_start () {
$NUT_DIR/bin/upsdrvctl start >/dev/null 2>&1
$NUT_DIR/sbin/upsd >/dev/null 2>&1
$NUT_DIR/sbin/upsmon >/dev/null 2>&1
}
##
# Start of script
#
case "$1" in
start)
ups_start
;;
stop)
ups_stop
;;
restart)
ups_stop
while pgrep upsd > /dev/null
do
sleep 1
done
ups_start
;;
*)
echo ""
echo "Usage: `basename $0` { start | stop | restart }"
echo ""
exit 64
;;
esac
Teraz potrzebujemy przygorowac manifest
- Kod: Zaznacz cały
# touch /var/svc/manifest/network/nut.xml
I teraz nut.xml powinien zawierac:
(Gotowiec do sciagniecia tutaj)
- Kod: Zaznacz cały
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='nut'>
<service name='application/nut' type='service' version='1'>
<instance name='default' enabled='false'>
<dependency name='network'
grouping='require_all'
restart_on='error'
type='service'>
<service_fmri value='svc:/milestone/network:default'/>
</dependency>
<dependency name='filesystem-local'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri
value='svc:/system/filesystem/local:default'/>
</dependency>
<exec_method
type='method'
name='start'
exec='/opt/nut/lib/svc/method/nut start'
timeout_seconds='60'>
<method_context />
</exec_method>
<exec_method
type='method'
name='stop'
exec='/opt/nut/lib/svc/method/nut stop'
timeout_seconds='60'>
<method_context />
</exec_method>
<exec_method
type='method'
name='refresh'
exec='/opt/nut/lib/svc/method/nut restart'
timeout_seconds='60'>
<method_context />
</exec_method>
</instance>
<stability value='Evolving' />
<template>
<common_name>
<loctext xml:lang='C'>
Network UPS Tools
</loctext>
</common_name>
</template>
</service>
</service_bundle>
Czas uruchomic i sprawdzic czy dziala
- Kod: Zaznacz cały
# svccfg import nut.xml
# svcadm enable svc:/application/nut:default
# /opt/nut/bin/upsc trust@localhost
battery.charge: 95.0
battery.voltage: 13.50
battery.voltage.nominal: 12.0
driver.name: megatec
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttya
driver.version:
driver.version.internal: 1.5.4
input.frequency: 49.9
input.voltage: 247.0
input.voltage.fault: 247.0
input.voltage.maximum: 252.3
input.voltage.minimum: 243.0
output.voltage: 247.0
output.voltage.nominal: 230.0
ups.beeper.status: enabled
ups.delay.shutdown: 0
ups.delay.start: 2
ups.load: 11.0
ups.mfr: unknown
ups.model: unknown
ups.serial: unknown
ups.status: OL
ups.temperature: 25.0
Jesli upc zwroci wynik podobny do powyzszego, swietnie gratuluje, wszystko dziala! Jesli natomiast upsc pokazuje blad zamiast powyzszego wyniku znaczy ze cos spapralismy.