Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce service wrapping for upslog client daemon, and nut-systemd.preset file #2746

Merged
merged 12 commits into from
Jan 3, 2025
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Introduce service wrapping for upslog client daemon [#1803]
Signed-off-by: Jim Klimov <jimklimov+nut@gmail.com>
  • Loading branch information
jimklimov committed Jan 2, 2025
commit dc2332d2a63c68464235db5389d29e02bb79f796
18 changes: 17 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
@@ -4130,6 +4130,8 @@ AS_IF([test x"${with_libsystemd}" = xyes && test x"${SYSTEMD_SUPPORTS_DAEMON_TYP
dnl needed for `upsd -c reload` in legacy scripts and old habits to work:
SYSTEMD_DAEMON_ARGS_UPSD="-FF"
SYSTEMD_DAEMON_TYPE_UPSD="notify"
SYSTEMD_DAEMON_ARGS_UPSLOG="-F"
SYSTEMD_DAEMON_TYPE_UPSLOG="notify"
SYSTEMD_DAEMON_ARGS_UPSMON="-F"
SYSTEMD_DAEMON_TYPE_UPSMON="notify"
SYSTEMD_DAEMON_ARGS_DRIVER="-FF"
@@ -4146,29 +4148,36 @@ AS_IF([test x"${with_libsystemd}" = xyes && test x"${SYSTEMD_SUPPORTS_DAEMON_TYP
SYSTEMD_DAEMON_NOTIFYACCESS_DRIVER="NotifyAccess=all"
dnl Similar for UPSMON with its two processes:
SYSTEMD_DAEMON_NOTIFYACCESS_UPSMON="NotifyAccess=all"
dnl UPSD is started directly by systemd and do not fork:
dnl UPSD is started directly by systemd and does not fork:
SYSTEMD_DAEMON_NOTIFYACCESS_UPSD="NotifyAccess=main"
dnl Similarly for upslog (per settings above):
SYSTEMD_DAEMON_NOTIFYACCESS_UPSLOG="NotifyAccess=main"
dnl Note: at this time we do not pre-define watchdog settings,
dnl to avoid breaking something by a poorly hardcoded guess.
dnl This is something end-users should do for their deployment,
dnl especially for drivers
SYSTEMD_DAEMON_WATCHDOG_DRIVER="#WatchdogSec=240s"
SYSTEMD_DAEMON_WATCHDOG_UPSD="#WatchdogSec=240s"
SYSTEMD_DAEMON_WATCHDOG_UPSLOG="#WatchdogSec=240s"
SYSTEMD_DAEMON_WATCHDOG_UPSMON="#WatchdogSec=240s"
], [
dnl "Usual" daemons that happen to be spawned by systemd
SYSTEMD_DAEMON_ARGS_UPSD="-F"
SYSTEMD_DAEMON_TYPE_UPSD="simple"
SYSTEMD_DAEMON_ARGS_UPSLOG="-F"
SYSTEMD_DAEMON_TYPE_UPSLOG="simple"
SYSTEMD_DAEMON_ARGS_UPSMON="-F"
SYSTEMD_DAEMON_TYPE_UPSMON="simple"
SYSTEMD_DAEMON_ARGS_DRIVER=""
SYSTEMD_DAEMON_TYPE_DRIVER="forking"
SYSTEMD_DAEMON_NOTIFYACCESS_DRIVER=""
SYSTEMD_DAEMON_NOTIFYACCESS_UPSD=""
SYSTEMD_DAEMON_NOTIFYACCESS_UPSLOG=""
SYSTEMD_DAEMON_NOTIFYACCESS_UPSMON=""
dnl Watchdog should not be configured for not-notifying units, right?
SYSTEMD_DAEMON_WATCHDOG_DRIVER="#WatchdogSec=240s"
SYSTEMD_DAEMON_WATCHDOG_UPSD="#WatchdogSec=240s"
SYSTEMD_DAEMON_WATCHDOG_UPSLOG="#WatchdogSec=240s"
SYSTEMD_DAEMON_WATCHDOG_UPSMON="#WatchdogSec=240s"
])

@@ -4879,14 +4888,18 @@ AC_SUBST(LIBSYSTEMD_CFLAGS)
AC_SUBST(LIBSYSTEMD_LIBS)
AC_SUBST(SYSTEMD_DAEMON_ARGS_UPSD)
AC_SUBST(SYSTEMD_DAEMON_TYPE_UPSD)
AC_SUBST(SYSTEMD_DAEMON_ARGS_UPSLOG)
AC_SUBST(SYSTEMD_DAEMON_TYPE_UPSLOG)
AC_SUBST(SYSTEMD_DAEMON_ARGS_UPSMON)
AC_SUBST(SYSTEMD_DAEMON_TYPE_UPSMON)
AC_SUBST(SYSTEMD_DAEMON_ARGS_DRIVER)
AC_SUBST(SYSTEMD_DAEMON_TYPE_DRIVER)
AC_SUBST(SYSTEMD_DAEMON_NOTIFYACCESS_DRIVER)
AC_SUBST(SYSTEMD_DAEMON_NOTIFYACCESS_UPSD)
AC_SUBST(SYSTEMD_DAEMON_NOTIFYACCESS_UPSLOG)
AC_SUBST(SYSTEMD_DAEMON_NOTIFYACCESS_UPSMON)
AC_SUBST(SYSTEMD_DAEMON_WATCHDOG_UPSD)
AC_SUBST(SYSTEMD_DAEMON_WATCHDOG_UPSLOG)
AC_SUBST(SYSTEMD_DAEMON_WATCHDOG_UPSMON)
AC_SUBST(SYSTEMD_DAEMON_WATCHDOG_DRIVER)
AC_SUBST(SYSTEMD_TMPFILES_PROGRAM)
@@ -5547,6 +5560,7 @@ AC_CONFIG_FILES([
scripts/systemd/nut.target
scripts/systemd/nut-common-tmpfiles.conf
scripts/systemd/nut-driver@.service
scripts/systemd/nut-logger.service
scripts/systemd/nut-monitor.service
scripts/systemd/nut-server.service
scripts/systemd/nut-driver-enumerator.service
@@ -5556,6 +5570,7 @@ AC_CONFIG_FILES([
scripts/systemd/nut-driver-enumerator-daemon-activator.path
scripts/Solaris/nut-driver-enumerator.xml
scripts/Solaris/nut-driver.xml
scripts/Solaris/nut-logger.xml
scripts/Solaris/nut-monitor.xml
scripts/Solaris/nut-server.xml
scripts/Solaris/nut.xml
@@ -5592,6 +5607,7 @@ m4_foreach_w([SCRIPTFILE], [
scripts/upsdrvsvcctl/upsdrvsvcctl
scripts/systemd/nutshutdown
scripts/Solaris/svc-nut-server
scripts/Solaris/svc-nut-logger
scripts/Solaris/svc-nut-monitor
scripts/Solaris/precheck.py
scripts/Solaris/preinstall
2 changes: 2 additions & 0 deletions scripts/Solaris/.gitignore
Original file line number Diff line number Diff line change
@@ -7,9 +7,11 @@
/precheck.py
/preproto.pl
/svc-nut-server
/svc-nut-logger
/svc-nut-monitor
/nut-driver.xml
/nut-driver-enumerator.xml
/nut-logger.xml
/nut-monitor.xml
/nut-server.xml
/nut.xml
2 changes: 2 additions & 0 deletions scripts/Solaris/Makefile.am
Original file line number Diff line number Diff line change
@@ -8,12 +8,14 @@ PYTHON = @PYTHON@
SOLARIS_SMF_MANIFESTS = \
nut.xml \
nut-server.xml \
nut-logger.xml \
nut-monitor.xml \
nut-driver.xml \
nut-driver-enumerator.xml

SOLARIS_SMF_METHODSCRIPTS = \
svc-nut-server \
svc-nut-logger \
svc-nut-monitor

if WITH_SOLARIS_SMF
127 changes: 127 additions & 0 deletions scripts/Solaris/nut-logger.xml.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!--
#
# Copyright 2024-2025 Jim Klimov
# Service for NUT logging client (for status collection and analysis)
#
-->

<service_bundle type='manifest' name='nut-logger'>

<service name='system/power/nut-logger' type='service' version='1'>

<!--
Configure a default instance for the service since it doesn't
require additional configuration intervention before it starts.
-->
<create_default_instance enabled='false' />

<!--
Wait for all local and usr filesystem to be mounted - project is
usually located in /usr/sbin.
-->
<dependency
name='fs-local'
type='service'
grouping='require_all'
restart_on='none'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>

<dependency
name='filesystem-usr'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri
value='svc:/system/filesystem/usr:default'/>
</dependency>

<dependency
name='config-files'
type='path'
grouping='require_all'
restart_on='refresh'>
<service_fmri value='file://localhost@CONFPATH@/upslog.conf' />
</dependency>

<!--
Wait for syslog to be started in order to write system
messages from the kernel.
-->
<dependency
name='syslog'
grouping='optional_all'
restart_on='none'
type='service'>
<service_fmri
value='svc:/system/system-log:default'/>
</dependency>

<!--
Wait for network to be started in order to reach remote hosts.
-->
<dependency
name='network-service'
grouping='optional_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/network/service' />
</dependency>

<!--
Wait for NUT upsd to be started, if it's enabled
-->
<dependency
name='nut-service'
grouping='optional_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/power/nut-server' />
</dependency>

<!--
The nut start/stop methods.
-->

<exec_method
type='method'
name='start'
exec='@NUT_DATADIR@/solaris-smf/method/svc-nut-logger %m'
timeout_seconds='60'/>

<exec_method
type='method'
name='stop'
exec=':kill'
timeout_seconds='60' />

<property_group name='startd' type='framework'>
<!--
Sub-process core dumps and external kill signals are not
considered errors, so the service should be restarted.
-->
<propval name='ignore_error' type='astring'
value='core,signal' />
</property_group>

<!-- Really unstable - this service should be evolved! -->
<stability value='Unstable' />

<template>
<common_name>
<loctext xml:lang='C'>
NUT UPS logging client service (for status collection and analysis)
</loctext>
</common_name>
<documentation>
<doc_link name='upslog online' uri='@NUT_WEBSITE_BASE@/docs/man/upslog.html' />
<manpage title='upslog' section='8' manpath='/usr/share/man' />
<doc_link name='nut.conf online' uri='@NUT_WEBSITE_BASE@/docs/man/nut.conf.html' />
<manpage title='nut.conf' section='5' manpath='/usr/share/man' />
</documentation>
</template>
</service>

</service_bundle>
75 changes: 75 additions & 0 deletions scripts/Solaris/svc-nut-logger.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#!/sbin/sh

# Trivial (better is yet to come) SMF method script to start nut services
# Adapted for OpenIndiana userland from init.d script template in NUT sources
# Adaptation copyright (C) 2016-2025 Jim Klimov

if [ -z "$SMF_FMRI" ]; then
echo "$0 must be called in SMF context!" >&2
exit 1
fi

# smf(5)
. /lib/svc/share/smf_include.sh || exit

prefix="@prefix@"
NUT_DIR="@prefix@"
NUT_SBIN_DIR="${NUT_DIR}/sbin"
NUT_LIB_DIR="${NUT_DIR}/lib"
NUT_RUN_DIR="@ALTPIDPATH@"
CONFIG="@CONFPATH@/nut.conf"
DAEMON_CONFIG="@CONFPATH@/upslog.conf"
NUTUSER="@RUN_AS_USER@"
NUTGROUP="@RUN_AS_GROUP@"

# We anticipate some tighter integration with SMF later:
#NUT_QUIET_INIT_UPSNOTIFY=true
#export NUT_QUIET_INIT_UPSNOTIFY

if [ -f "$CONFIG" ] ; then
. "$CONFIG"
fi

if [ -s "$DAEMON_CONFIG" ] ; then
. "$DAEMON_CONFIG"
else
echo "Daemon config file '$DAEMON_CONFIG' not found or populated, not starting anything" >&2
exit $SMF_EXIT_ERR_CONFIG
fi

ups_start () {
if [ "$MODE" = "none" ];then
echo "No NUT mode set, not starting anything" >&2
exit $SMF_EXIT_ERR_CONFIG
fi

if [ x"${UPSLOG_ARGS-}" = x ; then
echo "UPSLOG_ARGS not found or populated in configuration, not starting anything" >&2
exit $SMF_EXIT_ERR_CONFIG
fi

# Default rights inspired by NUT scripts/Solaris/postinstall.in
mkdir -p "@PIDPATH@" # (for privileged processes)
mkdir -p "$NUT_RUN_DIR" && \
chown "root:$NUTGROUP" "$NUT_RUN_DIR" && \
chmod 770 "$NUT_RUN_DIR" \
|| exit $SMF_EXIT_ERR_FATAL

# Fork and background regardless of logging to a file or stdout (-)
LD_LIBRARY_PATH="${NUT_LIB_DIR}:$LD_LIBRARY_PATH" "${NUT_SBIN_DIR}"/upslog -B $UPSLOG_ARGS #> /dev/null 2>&1
}

case "$1" in
'start')
ups_start
;;

*)
echo ""
echo "Usage: '$0' {start}"
echo ""
exit $SMF_EXIT_ERR_CONFIG
;;
esac

exit $?
1 change: 1 addition & 0 deletions scripts/systemd/.gitignore
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@
/nut.target
/nut-driver.service
/nut-driver@.service
/nut-logger.service
/nut-monitor.service
/nut-server.service
/nutshutdown
3 changes: 2 additions & 1 deletion scripts/systemd/Makefile.am
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ systemdsystemunit_DATA = \
nut-driver-enumerator-daemon-activator.service \
nut-driver-enumerator-daemon.service \
nut-driver@.service \
nut-logger.service \
nut-monitor.service \
nut-server.service \
nut-driver.target \
@@ -34,7 +35,7 @@ sbin_SCRIPTS = ../upsdrvsvcctl/upsdrvsvcctl

else !HAVE_SYSTEMD
EXTRA_DIST += \
nut-driver@.service.in nut-monitor.service.in nut-sleep.service \
nut-driver@.service.in nut-logger.service.in nut-monitor.service.in nut-sleep.service \
nut-server.service.in nutshutdown.in nut-driver.target nut.target.in \
nut-driver-enumerator.path.in nut-driver-enumerator.service.in \
nut-driver-enumerator-daemon-activator.path.in \
Loading