[Nut-upsdev] RFC: nut and systemd

Michal Hlavinka mhlavink at redhat.com
Thu Apr 21 08:49:29 UTC 2011


> as a first note, I just want to remember you the existance of
> $(sysconfdir)/nut.conf, to replace both Debian's /etc/default/nut and RedHat
> /etc/sysconfig/ups.

afaik this is not compatible to "4)" For this, upsmon must me separated, so you'd get
something like
/etc/init.d/nut (for upsdrvctl and upsd)
/etc/init.d/nut-monitor (for upsmon)

 
> you've probably heard about systemd already. In Fedora 15, it's
> > used as default instead old SysV init system. While there is some
> > backward compatibility layer, everything is going to be ported from
> > /etc/init.d/<something> init scripts to systemd's service files
> > /lib/systemd/system/<something>.service
> >
> > Unfortunately?, systemd is not 1:1 compatible with old init scripts.
> > Now (at least in Fedora) we have /etc/init.d/ups init script which
> > starts a)upsdrvctl, upsd, upsmon OR b)just upsmon - that based on
> > value in /etc/sysconfig/ups. (btw, I've got complaint recently that in
> >  "server" mode it should be possible to start just upsdrvctl and upsd,
> > without upsmon.)
> >
> 
> I'm interested in users feedback here (mostly for my own info):
> are they using PDUs, or only supervising UPSs?

there is user experience with systemd and any ups daemon, 
afaik Fedora has only 2 of them (nut and apcupsd). And it'll be my task to 
modify apcupsd to use systemd.
 
> the MODE in nut.conf is meant to be extended.
> I once evoked a "upower" mode (drivers started by udev) and a "manual" one
> (started by whatever other mechanism that only need pieces of NUT).
> 
> 
> > systemd "prefers" daemon per service/unit file, so it's not possible
> > to have the same functionality as is with init script.
> >
> 
> can you please point us some sample scripts for equivalent services?

a)equivalent services=ups daemon, there is no such example (yet). nut 
was chosen to be the first one

b)equivalent services=more daemons started by one init script - I'm not 
aware of anything like that. Usually such services have one master process
reading configuration and starting what is needed.

c)example of systemd service file:
============== smartd.service ==============
[Unit]
Description=Self Monitoring and Reporting Technology (SMART) Daemon
After=syslog.target

[Service]
EnvironmentFile=/etc/sysconfig/smartmontools
ExecStart=/usr/sbin/smartd -n $smartd_opts

[Install]
WantedBy=multi-user.target
==================================
it can read basic shell-like variables (/etc/sysconfig/smartmontools) 
and pass them to command line. It can't contain any conditional in 
service file
 
> > 1) systemd does not support:
> > source /etc/sysconfig/ups
> > if [ "$SERVER" = yes ]; then
> > /sbin/upsdrvctl...
> > /.../upsd
> > /.../upsmon
> > else
> > /.../upsmon
> > fi
> >
> > because it has it's special syntax.
> >
> > 2) it does not support:
> > ExecStart=[ "$SERVER" != yes ] || /sbin/upsdrvctl
> > ExecStart=[ "$SERVER" != yes ] || /.../upsd
> > ExecStart=/.../upsmon
> >
> > because it does not use shell
> >
> > 3) it "somehow" supports
> > ExecStart=/usr/libexec/nut/systemd_helper
> > and put shell script code from #1 there and handle other stuff myself.
> >
> > This is somehow ugly solution and despite it is supported, systemd does
> > not like it (it prefers one not-background-forked daemon per service
> > file, so it can monitor & other stuff thanks pid of the daemon is pid of
> > executed process). But - this is only way how to make nut work the
> > same way as old version. So the question is if it's worth it from long time
> > pov.
> >
> > 4)The systemd's way:
> > - 3 service files
> > - one for upsd and one for upsmon. This means SERVER configuration
> > from /etc/sysconfig/ups goes away.
> > - two services configured by user (ups.service/nut.service=upsd,
> > nut-monitor.service=upsmon)
> > - upsdrvctl as on demand service (started before upsd, stoped after upsd)
> >
> >
> >
> > So, the question is: 3) or 4) ?
> >
> 
> as Charles said, the 4th one is the obvious solution to *your* (or *systemd*
> if you prefer) issue.
> I'd like to see an example POC implementation of this, since details are
> still unclear to me (ex: what means an "on demand servive"? no .service
> file?).

For example dovecot (imap server) can be started on demand. systemd listens 
on port 143 and when there is incomming connection, it starts dovecot. On-demand 
service needs service file.

There is more on-demand events (device, another service,....)

Simple on-demand (required by different service file) should be suitable for upsdrvctl.
1) Create simplified nut-device.service (no [install] section...)
2) Create upsd service and add Requires=nut-device.service After=nut-device.service
so when you start upsd by hand or during boot process it starts upsdrvctl firts. If you 
add StopWhenUnneeded=yes to nut-device.service it stops upsdrvctl after stopping 
upsd service.





More information about the Nut-upsdev mailing list