From eb72f866280ce72c25d22963f3ec24d72d60dfa1 Mon Sep 17 00:00:00 2001 From: Thomas Deutschmann Date: Fri, 2 Apr 2021 01:53:28 +0200 Subject: sys-power/apcupsd: rev bump - Migrate to EAPI 7 - OpenRC runscript rewritten - Added some patches from Debian/Fedora Package-Manager: Portage-3.0.18, Repoman-3.0.3 Signed-off-by: Thomas Deutschmann --- sys-power/apcupsd/apcupsd-3.14.14-r3.ebuild | 149 +++++++++++++++++++++ .../files/apcupsd-3.14.9-close-on-exec.patch | 50 +++++++ .../apcupsd/files/apcupsd-3.14.9-commfailure.patch | 15 +++ .../apcupsd/files/apcupsd-3.14.9-fix-nologin.patch | 15 +++ .../apcupsd/files/apcupsd-3.14.9-gapcmon.patch | 33 +++++ .../files/apcupsd-3.14.9-wall-on-mounted-usr.patch | 20 +++ sys-power/apcupsd/files/apcupsd.init | 28 ++++ 7 files changed, 310 insertions(+) create mode 100644 sys-power/apcupsd/apcupsd-3.14.14-r3.ebuild create mode 100644 sys-power/apcupsd/files/apcupsd-3.14.9-close-on-exec.patch create mode 100644 sys-power/apcupsd/files/apcupsd-3.14.9-commfailure.patch create mode 100644 sys-power/apcupsd/files/apcupsd-3.14.9-fix-nologin.patch create mode 100644 sys-power/apcupsd/files/apcupsd-3.14.9-gapcmon.patch create mode 100644 sys-power/apcupsd/files/apcupsd-3.14.9-wall-on-mounted-usr.patch create mode 100644 sys-power/apcupsd/files/apcupsd.init (limited to 'sys-power') diff --git a/sys-power/apcupsd/apcupsd-3.14.14-r3.ebuild b/sys-power/apcupsd/apcupsd-3.14.14-r3.ebuild new file mode 100644 index 000000000000..12e0b16bcc7e --- /dev/null +++ b/sys-power/apcupsd/apcupsd-3.14.14-r3.ebuild @@ -0,0 +1,149 @@ +# Copyright 1999-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI="7" + +inherit linux-info flag-o-matic systemd udev tmpfiles + +DESCRIPTION="APC UPS daemon with integrated tcp/ip remote shutdown" +HOMEPAGE="http://www.apcupsd.org/" +SRC_URI="mirror://sourceforge/apcupsd/${P}.tar.gz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~arm ~ppc ~x86" +IUSE="snmp +usb +modbus cgi gnome kernel_linux" + +DEPEND=">=sys-apps/util-linux-2.23[tty-helpers(-)] + cgi? ( >=media-libs/gd-1.8.4 ) + modbus? ( usb? ( virtual/libusb:0 ) ) + gnome? ( + >=x11-libs/gtk+-2.4.0:2 + dev-libs/glib:2 + >=gnome-base/gconf-2.0 + ) + snmp? ( >=net-analyzer/net-snmp-5.7.2 )" + +RDEPEND="${DEPEND} + virtual/mailx" + +CONFIG_CHECK="~USB_HIDDEV ~HIDRAW" +ERROR_USB_HIDDEV="CONFIG_USB_HIDDEV: needed to access USB-attached UPSes" +ERROR_HIDRAW="CONFIG_HIDRAW: needed to access USB-attached UPSes" + +DOCS=( ChangeLog ReleaseNotes ) +HTML_DOCS=( doc/manual ) + +PATCHES=( + "${FILESDIR}"/${PN}-3.14.9-aliasing.patch + "${FILESDIR}"/${PN}-3.14.9-close-on-exec.patch + "${FILESDIR}"/${PN}-3.14.9-commfailure.patch + "${FILESDIR}"/${PN}-3.14.9-fix-nologin.patch + "${FILESDIR}"/${PN}-3.14.9-gapcmon.patch + "${FILESDIR}"/${PN}-3.14.9-wall-on-mounted-usr.patch +) + +pkg_setup() { + if use kernel_linux && use usb && linux_config_exists ; then + check_extra_config + fi +} + +src_configure() { + local myconf + + use cgi && myconf="${myconf} --enable-cgi --with-cgi-bin=/usr/libexec/${PN}/cgi-bin" + + if use usb ; then + myconf="${myconf} --with-upstype=usb --with-upscable=usb --enable-usb --with-dev=" + use modbus && myconf="${myconf} --enable-modbus-usb" + else + myconf="${myconf} --with-upstype=apcsmart --with-upscable=smart --disable-usb" + use modbus || myconf="${myconf} --disable-modbus" + fi + + # We force the DISTNAME to gentoo so it will use gentoo's layout also + # when installed on non-linux systems. + econf \ + --sbindir=/sbin \ + --sysconfdir=/etc/apcupsd \ + --with-pwrfail-dir=/etc/apcupsd \ + --with-lock-dir=/run/apcupsd \ + --with-pid-dir=/run/apcupsd \ + --with-log-dir=/var/log \ + --with-nis-port=3551 \ + --enable-net --enable-pcnet \ + --with-distname=gentoo \ + $(use_enable snmp) \ + $(use_enable gnome gapcmon) \ + ${myconf} \ + APCUPSD_MAIL=$(type -p mail) +} + +src_compile() { + # Workaround for bug #280674; upstream should really just provide + # the text files in the distribution, but I wouldn't count on them + # doing that anytime soon. + MANPAGER=$(type -p cat) \ + emake VERBOSE=2 +} + +src_install() { + emake DESTDIR="${D}" VERBOSE=2 install + rm "${ED}"/etc/init.d/halt || die + + insinto /etc/apcupsd + newins examples/safe.apccontrol safe.apccontrol + doins "${FILESDIR}"/apcupsd.conf + + doman doc/*.8 doc/*.5 + + einstalldocs + + rm "${ED}"/etc/init.d/apcupsd || die + newinitd "${FILESDIR}/${PN}.init" "${PN}" + newinitd "${FILESDIR}/${PN}.powerfail.init" "${PN}".powerfail + + systemd_dounit "${FILESDIR}"/${PN}.service + dotmpfiles "${FILESDIR}"/${PN}-tmpfiles.conf + + # remove hal settings, we don't really want to have it still around. + rm -r "${D}"/usr/share/hal || die + + # replace it with our udev rules if we're in Linux + if use kernel_linux ; then + udev_newrules "${FILESDIR}"/apcupsd-udev.rules 60-${PN}.rules + fi + +} + +pkg_postinst() { + tmpfiles_process ${PN}-tmpfiles.conf + + if use cgi ; then + elog "The cgi-bin directory for ${PN} is /usr/libexec/${PN}/cgi-bin." + elog "Set up your ScriptAlias or symbolic links accordingly." + fi + + elog "" + elog "Since version 3.14.0 you can use multiple apcupsd instances to" + elog "control more than one UPS in a single box with openRC." + elog "To do this, create a link between /etc/init.d/apcupsd to a new" + elog "/etc/init.d/apcupsd.something, and it will then load the" + elog "configuration file at /etc/apcupsd/something.conf." + elog "" + + elog 'If you want apcupsd to power off your UPS when it' + elog 'shuts down your system in a power failure, you must' + elog 'add apcupsd.powerfail to your shutdown runlevel:' + elog '' + elog ' \e[01m rc-update add apcupsd.powerfail shutdown \e[0m' + elog '' + + if use kernel_linux; then + elog "Starting from version 3.14.9-r1, ${PN} installs udev rules" + elog "for persistent device naming. If you have multiple UPS" + elog "connected to the machine, you can point them to the devices" + elog "in /dev/apcups/by-id directory." + fi +} diff --git a/sys-power/apcupsd/files/apcupsd-3.14.9-close-on-exec.patch b/sys-power/apcupsd/files/apcupsd-3.14.9-close-on-exec.patch new file mode 100644 index 000000000000..aeaa78b35420 --- /dev/null +++ b/sys-power/apcupsd/files/apcupsd-3.14.9-close-on-exec.patch @@ -0,0 +1,50 @@ +Close the socket on exec - avoid leaked file descriptors, patch from Fedora + +--- a/src/apcnis.c ++++ b/src/apcnis.c +@@ -157,6 +157,9 @@ void do_server(UPSINFO *ups) + sleep(5 * 60); + } + ++ /* Close the socket on exec - avoid leaked file descriptors */ ++ fcntl(sockfd, F_SETFD, FD_CLOEXEC); ++ + /* Reuse old sockets */ + #ifndef HAVE_MINGW + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&turnon, sizeof(turnon)) < 0) { +--- a/src/apcupsd.c ++++ b/src/apcupsd.c +@@ -212,6 +212,9 @@ int main(int argc, char *argv[]) + if (ups->event_fd < 0) { + log_event(ups, LOG_WARNING, "Could not open events file %s: %s\n", + ups->eventfile, strerror(errno)); ++ } else { ++ /* Close the file on exec - avoid leaked file descriptors */ ++ fcntl(ups->event_fd, F_SETFD, FD_CLOEXEC); + } + } + +--- a/src/drivers/usb/linux/linux-usb.c ++++ b/src/drivers/usb/linux/linux-usb.c +@@ -246,8 +246,11 @@ bool LinuxUsbUpsDriver::open_usb_device() + /* Retry 10 times */ + for (i = 0; i < 10; i++) { + _fd = open_device(_ups->device); +- if (_fd != -1) ++ if (_fd != -1) { ++ /* Close the device on exec - avoid leaked file descriptors */ ++ fcntl(_fd, F_SETFD, FD_CLOEXEC); + return true; ++ } + sleep(1); + } + +@@ -270,6 +273,7 @@ auto_detect: + asnprintf(devname, sizeof(devname), "%s%d", hiddev[j], k); + _fd = open_device(devname); + if (_fd != -1) { ++ fcntl(_fd, F_SETFD, FD_CLOEXEC); + /* Successful open, save device name and return */ + strlcpy(_ups->device, devname, sizeof(_ups->device)); + return true; + diff --git a/sys-power/apcupsd/files/apcupsd-3.14.9-commfailure.patch b/sys-power/apcupsd/files/apcupsd-3.14.9-commfailure.patch new file mode 100644 index 000000000000..49641c06bef3 --- /dev/null +++ b/sys-power/apcupsd/files/apcupsd-3.14.9-commfailure.patch @@ -0,0 +1,15 @@ +Author: Tero Janka +Description: apcaccess call blocking commfailure mails (Closes: #409734). + +Index: apcupsd/platforms/etc/commfailure.in +=================================================================== +--- apcupsd.orig/platforms/etc/commfailure.in ++++ apcupsd/platforms/etc/commfailure.in +@@ -13,7 +13,5 @@ MSG="$HOSTNAME Communications with UPS $ + echo "Subject: $MSG" + echo " " + echo "$MSG" +- echo " " +- @sbindir@/apcaccess status + ) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN + exit 0 diff --git a/sys-power/apcupsd/files/apcupsd-3.14.9-fix-nologin.patch b/sys-power/apcupsd/files/apcupsd-3.14.9-fix-nologin.patch new file mode 100644 index 000000000000..75f9e4449bf5 --- /dev/null +++ b/sys-power/apcupsd/files/apcupsd-3.14.9-fix-nologin.patch @@ -0,0 +1,15 @@ +Description: only prohibit logins on shutdown if login is allowed at all +Index: apcupsd-3.14.12/src/action.c +=================================================================== +--- apcupsd-3.14.12.orig/src/action.c ++++ apcupsd-3.14.12/src/action.c +@@ -208,7 +208,8 @@ static void do_shutdown(UPSINFO *ups, in + delete_lockfile(ups); + ups->set_fastpoll(); + make_file(ups, ups->pwrfailpath); +- prohibit_logins(ups); ++ if (ups->nologin.type != NEVER) ++ prohibit_logins(ups); + + if (!ups->is_slave()) { + /* diff --git a/sys-power/apcupsd/files/apcupsd-3.14.9-gapcmon.patch b/sys-power/apcupsd/files/apcupsd-3.14.9-gapcmon.patch new file mode 100644 index 000000000000..0dd1cc69aa35 --- /dev/null +++ b/sys-power/apcupsd/files/apcupsd-3.14.9-gapcmon.patch @@ -0,0 +1,33 @@ +Description: take care of some deprecated functions and format issue +Author: Thorsten Alteholz +Index: apcupsd-3.14.14/src/gapcmon/gapcmon.c +=================================================================== +--- apcupsd-3.14.14.orig/src/gapcmon/gapcmon.c 2016-07-16 03:04:22.000000000 +0200 ++++ apcupsd-3.14.14/src/gapcmon/gapcmon.c 2017-10-06 09:26:40.412004149 +0200 +@@ -1580,7 +1580,7 @@ + scaled = gdk_pixbuf_scale_simple(pixbuf, size, size, GDK_INTERP_BILINEAR); + gtk_image_set_from_pixbuf(GTK_IMAGE(pm->tray_image), scaled); + gtk_widget_show(pm->tray_image); +- gdk_pixbuf_unref(scaled); ++ g_object_unref(scaled); + } + + if (pm->window != NULL) +@@ -2889,7 +2889,7 @@ + + pch = g_strdup_printf("%s(%s) emsg=%s", pch_func, pch_topic, pch_emsg); + +- g_message(pch); ++ g_message("%s",pch); + + g_free(pch); + +@@ -4474,7 +4474,7 @@ + gtk_image_set_from_pixbuf(GTK_IMAGE(image), scaled); + gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0); + gtk_widget_show(image); +- gdk_pixbuf_unref(scaled); ++ g_object_unref(scaled); + + label = gtk_label_new(about_text); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); diff --git a/sys-power/apcupsd/files/apcupsd-3.14.9-wall-on-mounted-usr.patch b/sys-power/apcupsd/files/apcupsd-3.14.9-wall-on-mounted-usr.patch new file mode 100644 index 000000000000..b89a5309e5ba --- /dev/null +++ b/sys-power/apcupsd/files/apcupsd-3.14.9-wall-on-mounted-usr.patch @@ -0,0 +1,20 @@ +At halt/killpower time, /usr may already be umounted, and wall +lives in /usr. Avoid failing by using cat if needed. + +Index: apcupsd/platforms/apccontrol.in +=================================================================== +--- apcupsd.orig/platforms/apccontrol.in ++++ apcupsd/platforms/apccontrol.in +@@ -62,10 +62,10 @@ fi + + case "$1" in + killpower) +- echo "Apccontrol doing: ${APCUPSD} --killpower on UPS ${2}" | ${WALL} ++ echo "Apccontrol doing: ${APCUPSD} --killpower on UPS ${2}" | (${WALL} 2>/dev/null || cat) + sleep 10 + ${APCUPSD} --killpower +- echo "Apccontrol has done: ${APCUPSD} --killpower on UPS ${2}" | ${WALL} ++ echo "Apccontrol has done: ${APCUPSD} --killpower on UPS ${2}" | (${WALL} 2>/dev/null || cat) + ;; + commfailure) + echo "Warning communications lost with UPS ${2}" | ${WALL} diff --git a/sys-power/apcupsd/files/apcupsd.init b/sys-power/apcupsd/files/apcupsd.init new file mode 100644 index 000000000000..e544fd4f3900 --- /dev/null +++ b/sys-power/apcupsd/files/apcupsd.init @@ -0,0 +1,28 @@ +#!/sbin/openrc-run +# Copyright 1999-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +: ${APCUPSD_CONFIGFILE:=/etc/apcupsd/${SVCNAME#*.}.conf} +: ${APCUPSD_POWERFAILFILE:=/etc/apcupsd/powerfail} +: ${APCUPSD_PIDFILE:=/run/${SVCNAME}.pid} +: ${APCUPSD_SSDARGS:=--wait 1000} +: ${APCUPSD_TERMTIMEOUT:=TERM/60/KILL/5} + +command="/sbin/apcupsd" +command_args="${APCUPSD_OPTS} --config-file \"${APCUPSD_CONFIGFILE}\" --pid-file \"${APCUPSD_PIDFILE}\"" +pidfile="${APCUPSD_PIDFILE}" +retry="${APCUPSD_TERMTIMEOUT}" +start_stop_daemon_args="${APCUPSD_SSDARGS}" +required_files="${APCUPSD_CONFIGFILE}" + +depend() { + use dns +} + +start_pre() { + if [ -e "${APCUPSD_POWERFAILFILE}" ] ; then + ebegin "Removing stale ${APCUPSD_POWERFAILFILE}" + rm "${APCUPSD_POWERFAILFILE}" + eend $? + fi +} -- cgit v1.2.3-65-gdbad