From ca0de194e261ace3dd882c8dbc5b9e62a8ede86a Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Fri, 8 Jun 2012 23:27:10 +0200 Subject: [PATCH 001/240] Create IPMI support package --- debian/changelog | 7 +++++++ debian/control | 22 ++++++++++++++++++++-- debian/nut-ipmi.install | 1 + debian/nut-ipmi.manpages | 1 + 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 debian/nut-ipmi.install create mode 100644 debian/nut-ipmi.manpages diff --git a/debian/changelog b/debian/changelog index a66b5f5..1c7fd72 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nut (2.6.4-2) unstable; urgency=low + + * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI + support package + + -- Arnaud Quette Fri, 08 Jun 2012 23:23:03 +0200 + nut (2.6.4-1) unstable; urgency=high * New upstream release (Closes: #671444) diff --git a/debian/control b/debian/control index dbf99d7..9b55e05 100644 --- a/debian/control +++ b/debian/control @@ -11,7 +11,9 @@ Build-Depends: debhelper (>= 8), libneon27-gnutls-dev | libneon27-dev, libpowerman0-dev (>= 2.3.3), libwrap0-dev (>= 7.6), - python (>= 2.6.6-3~) + python (>= 2.6.6-3~), + libfreeipmi-dev (>= 0.8.5), + libipmimonitoring-dev (>= 0.8.5) Build-Depends-Indep: asciidoc (>= 8.6.3), docbook-xsl, dblatex (>= 0.2.5), @@ -37,7 +39,7 @@ Description: network UPS tools - metapackage Package: nut-server Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6), ${udev}, nut-client (= ${binary:Version}) -Suggests: nut-cgi, nut-snmp, nut-dev, nut-xml +Suggests: nut-cgi, nut-snmp, nut-ipmi, nut-xml, nut-dev Provides: nut-usb Conflicts: nut-hal-drivers, nut-usb (<< 2.1.0-3), nut-dev (<< 2.2.2) Replaces: nut (<< 2.6.1-2~) @@ -102,6 +104,22 @@ Description: network UPS tools - SNMP driver supports various MIBs including IETF, MGE, and APC. It adds an SNMP Manager interface to the core NUT system. +Package: nut-impi +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 1.4.1-pre1) +Conflicts: nut (<= 1.4.0) +Description: network UPS tools - IPMI driver + Network UPS Tools (NUT) is a client/server monitoring system that + allows computers to share uninterruptible power supply (UPS) and + power distribution unit (PDU) hardware. Clients access the hardware + through the server, and are notified whenever the power status + changes. + . + This package currently provides nut-ipmipsu, a driver which allows + to monitor IPMI power supply units (PSU) found in servers of + popular brands, such as Dell, HP, IBM. It adds an IPMI interface + to the core NUT system. + Package: nut-xml Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 2.2.2) diff --git a/debian/nut-ipmi.install b/debian/nut-ipmi.install new file mode 100644 index 0000000..4823952 --- /dev/null +++ b/debian/nut-ipmi.install @@ -0,0 +1 @@ +debian/tmp/lib/nut/nut-ipmipsu diff --git a/debian/nut-ipmi.manpages b/debian/nut-ipmi.manpages new file mode 100644 index 0000000..5da576f --- /dev/null +++ b/debian/nut-ipmi.manpages @@ -0,0 +1 @@ +debian/tmp/usr/share/man/man8/nut-ipmipsu.8 From 82fda8eb40da49eb299756f9f1ac993a6a1e9202 Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Mon, 11 Jun 2012 20:27:04 +0200 Subject: [PATCH 002/240] Split udev rules files between nut-server and nut-ipmi --- debian/changelog | 1 + debian/control | 2 +- debian/nut-ipmi.install | 1 + debian/nut-server.install | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1c7fd72..a7d2a88 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,7 @@ nut (2.6.4-2) unstable; urgency=low * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI support package + * debian/nut-server.install: only install USB udev rules -- Arnaud Quette Fri, 08 Jun 2012 23:23:03 +0200 diff --git a/debian/control b/debian/control index 9b55e05..ef2b59a 100644 --- a/debian/control +++ b/debian/control @@ -13,7 +13,7 @@ Build-Depends: debhelper (>= 8), libwrap0-dev (>= 7.6), python (>= 2.6.6-3~), libfreeipmi-dev (>= 0.8.5), - libipmimonitoring-dev (>= 0.8.5) + libipmimonitoring-dev (>= 1.1.5-2) Build-Depends-Indep: asciidoc (>= 8.6.3), docbook-xsl, dblatex (>= 0.2.5), diff --git a/debian/nut-ipmi.install b/debian/nut-ipmi.install index 4823952..2d9854d 100644 --- a/debian/nut-ipmi.install +++ b/debian/nut-ipmi.install @@ -1 +1,2 @@ debian/tmp/lib/nut/nut-ipmipsu +debian/tmp/*/udev/rules.d/52-nut-ipmipsu.rules diff --git a/debian/nut-server.install b/debian/nut-server.install index 9486e8a..1c22483 100644 --- a/debian/nut-server.install +++ b/debian/nut-server.install @@ -1,7 +1,7 @@ debian/tmp/sbin/upsd debian/tmp/usr/share/nut/cmdvartab debian/tmp/usr/share/nut/driver.list -debian/tmp/*/udev/ +debian/tmp/*/udev/rules.d/52-nut-usbups.rules debian/tmp/etc/avahi/services/nut.service debian/tmp/etc/nut/ups.conf debian/tmp/etc/nut/upsd.conf From 357d77d1f2552d514865128bf4d3ed6d3f817559 Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Tue, 12 Jun 2012 14:34:34 +0200 Subject: [PATCH 003/240] Fix typo error on nut-ipmi package name --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index ef2b59a..0c7eebe 100644 --- a/debian/control +++ b/debian/control @@ -104,7 +104,7 @@ Description: network UPS tools - SNMP driver supports various MIBs including IETF, MGE, and APC. It adds an SNMP Manager interface to the core NUT system. -Package: nut-impi +Package: nut-ipmi Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 1.4.1-pre1) Conflicts: nut (<= 1.4.0) From f50e2690169d0ec9af2563ed48813dc517911b48 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 10:36:09 +0200 Subject: [PATCH 004/240] debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) --- debian/changelog | 7 +++++++ debian/rules | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index a7d2a88..08b58c2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nut (2.6.4-3) UNRELEASED; urgency=low + + * debian/rules: Stop the nut-client before nut-server on systems using static + boot ordering (Closes: #679451) + + -- Laurent Bigonville Thu, 09 Aug 2012 10:31:05 +0200 + nut (2.6.4-2) unstable; urgency=low * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI diff --git a/debian/rules b/debian/rules index b9eef15..b0745bb 100755 --- a/debian/rules +++ b/debian/rules @@ -76,8 +76,8 @@ common-install-indep:: binary-install/nut-monitor:: dh_python2 -pnut-monitor -DEB_DH_INSTALLINIT_ARGS_nut-server := --init-script=nut-server -- start 50 2 3 4 5 . stop 50 0 1 6 . -DEB_DH_INSTALLINIT_ARGS_nut-client := --init-script=nut-client -- start 51 2 3 4 5 . stop 51 0 1 6 . +DEB_DH_INSTALLINIT_ARGS_nut-server := --init-script=nut-server -- start 50 2 3 4 5 . stop 51 0 1 6 . +DEB_DH_INSTALLINIT_ARGS_nut-client := --init-script=nut-client -- start 51 2 3 4 5 . stop 50 0 1 6 . DEB_DH_COMPRESS_ARGS_nut-doc := -X.pdf ifeq (linux,$(DEB_HOST_ARCH_OS)) From 51c7f9422f070dc2bb8b109caf81e296e694ebc2 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:05:51 +0200 Subject: [PATCH 005/240] debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade (Closes: #677822) --- debian/changelog | 4 +++- debian/control | 3 ++- debian/nut-server.maintscript | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 debian/nut-server.maintscript diff --git a/debian/changelog b/debian/changelog index 08b58c2..2f50b3f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,8 +2,10 @@ nut (2.6.4-3) UNRELEASED; urgency=low * debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) + * debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade + (Closes: #677822) - -- Laurent Bigonville Thu, 09 Aug 2012 10:31:05 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:04:51 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/control b/debian/control index 0c7eebe..e9ff6a4 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: admin Priority: optional Maintainer: Arnaud Quette Uploaders: Laurent Bigonville -Build-Depends: debhelper (>= 8), +Build-Depends: debhelper (>= 8.1.0~), cdbs (>= 0.4.90~), libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, @@ -44,6 +44,7 @@ Provides: nut-usb Conflicts: nut-hal-drivers, nut-usb (<< 2.1.0-3), nut-dev (<< 2.2.2) Replaces: nut (<< 2.6.1-2~) Breaks: nut (<< 2.6.1-2~) +Pre-Depends: ${misc:Pre-Depends} Description: network UPS tools - core system Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and diff --git a/debian/nut-server.maintscript b/debian/nut-server.maintscript new file mode 100644 index 0000000..1d202d4 --- /dev/null +++ b/debian/nut-server.maintscript @@ -0,0 +1,3 @@ +#Removing obsolete init script. +#The file is gone in 2.6.3-2 but was not removed on upgrades. +rm_conffile /etc/init.d/nut 2.6.4-3~ From a9f5fa9b6f1ac755593bce9f818a43664c5926f5 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:20:54 +0200 Subject: [PATCH 006/240] Rename nut-server.lintian-overrides to nut-client.lintian-overrides and adjust overrides now that ups-monitor is shipped in nut-client package (Closes: #677947) --- debian/changelog | 5 ++++- debian/nut-client.lintian-overrides | 1 + debian/nut-server.lintian-overrides | 2 -- 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 debian/nut-client.lintian-overrides delete mode 100644 debian/nut-server.lintian-overrides diff --git a/debian/changelog b/debian/changelog index 2f50b3f..3d891a2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,11 @@ nut (2.6.4-3) UNRELEASED; urgency=low boot ordering (Closes: #679451) * debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade (Closes: #677822) + * Rename nut-server.lintian-overrides to nut-client.lintian-overrides and + adjust overrides now that ups-monitor is shipped in nut-client package + (Closes: #677947) - -- Laurent Bigonville Thu, 09 Aug 2012 11:04:51 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:20:06 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/nut-client.lintian-overrides b/debian/nut-client.lintian-overrides new file mode 100644 index 0000000..4651289 --- /dev/null +++ b/debian/nut-client.lintian-overrides @@ -0,0 +1 @@ +nut-client: script-in-etc-init.d-not-registered-via-update-rc.d diff --git a/debian/nut-server.lintian-overrides b/debian/nut-server.lintian-overrides deleted file mode 100644 index 9618794..0000000 --- a/debian/nut-server.lintian-overrides +++ /dev/null @@ -1,2 +0,0 @@ -nut-server: script-in-etc-init.d-not-registered-via-update-rc.d -nut-server: init.d-script-does-not-provide-itself etc/init.d/ups-monitor From dbeaea56b06b396f5d9ca9fea36f26672d40f6f1 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:39:46 +0200 Subject: [PATCH 007/240] Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched regression (Taken from upstream) (Closes: #679513) --- debian/changelog | 4 +++- debian/patches/0001-fix-upsmon-regression.patch | 15 +++++++++++++++ debian/patches/series | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 debian/patches/0001-fix-upsmon-regression.patch diff --git a/debian/changelog b/debian/changelog index 3d891a2..c52ef13 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,8 +7,10 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Rename nut-server.lintian-overrides to nut-client.lintian-overrides and adjust overrides now that ups-monitor is shipped in nut-client package (Closes: #677947) + * Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched + regression (Taken from upstream) (Closes: #679513) - -- Laurent Bigonville Thu, 09 Aug 2012 11:20:06 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:36:41 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/patches/0001-fix-upsmon-regression.patch b/debian/patches/0001-fix-upsmon-regression.patch new file mode 100644 index 0000000..aa8c13e --- /dev/null +++ b/debian/patches/0001-fix-upsmon-regression.patch @@ -0,0 +1,15 @@ +Description: Fix upsmon/upssched regression +Origin: upstream, http://trac.networkupstools.org/projects/nut/changeset/3670 +Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679513 + +Index: /trunk/clients/upssched.c +=================================================================== +--- a/clients/upssched.c (revision 3555) ++++ b/clients/upssched.c (revision 3670) +@@ -695,5 +695,5 @@ + pconf_encode(arg2, enc, sizeof(enc))); + +- snprintfcat(enc, sizeof(enc), "%s\n", buf); ++ snprintf(enc, sizeof(enc), "%s\n", buf); + + /* see if the parent needs to be started (and maybe start it) */ diff --git a/debian/patches/series b/debian/patches/series index 2024d93..f80396c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1,2 @@ +0001-fix-upsmon-regression.patch 0002-nut-monitor-paths.patch From 1cd02baa2d0423925be31e54b3dfd398ae7ba730 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:50:35 +0200 Subject: [PATCH 008/240] Move nut metapackage to Section: metapackages --- debian/changelog | 3 ++- debian/control | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index c52ef13..2a9b7f1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,8 +9,9 @@ nut (2.6.4-3) UNRELEASED; urgency=low (Closes: #677947) * Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched regression (Taken from upstream) (Closes: #679513) + * Move nut metapackage to Section: metapackages - -- Laurent Bigonville Thu, 09 Aug 2012 11:36:41 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:50:08 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/control b/debian/control index e9ff6a4..b99fe5a 100644 --- a/debian/control +++ b/debian/control @@ -26,6 +26,7 @@ X-Python-Version: >= 2.5 Package: nut Architecture: all +Section: metapackages Depends: ${misc:Depends}, nut-server, nut-client Description: network UPS tools - metapackage Network UPS Tools (NUT) is a client/server monitoring system that From a6634bc58eb5f436a9a81532e4231230df43ee50 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 21:21:03 +0200 Subject: [PATCH 009/240] Also create nut user when installing nut-client package and do not delete it on purge anymore (Closes: #682000) --- debian/changelog | 4 ++- debian/nut-client.postinst | 60 ++++++++++++++++++++++++++++++++++++++ debian/nut-server.postinst | 2 +- debian/nut-server.postrm | 6 ---- 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 debian/nut-client.postinst diff --git a/debian/changelog b/debian/changelog index 2a9b7f1..b6331fb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,8 +10,10 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched regression (Taken from upstream) (Closes: #679513) * Move nut metapackage to Section: metapackages + * Also create nut user when installing nut-client package and do not delete + it on purge anymore (Closes: #682000) - -- Laurent Bigonville Thu, 09 Aug 2012 11:50:08 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 21:18:03 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst new file mode 100644 index 0000000..fbcf657 --- /dev/null +++ b/debian/nut-client.postinst @@ -0,0 +1,60 @@ +#!/bin/sh -e + +case "$1" in + + configure) + + # make sure the nut user exists and has correct memberships + if ! getent group nut >/dev/null; then + addgroup --quiet --system nut + fi + if ! getent passwd nut >/dev/null; then + adduser --quiet --system --ingroup nut --home /var/lib/nut --no-create-home nut + elif ! groups nut | grep -qw nut; then + adduser nut nut + fi +# for Ubuntu, while waiting for a proper debconf +# if ! groups nut | grep -qw dialout; then +# adduser nut dialout +# fi + + # make sure that conffiles are secured and have the correct ownerships + if [ -d /etc/nut/ ] ; then + chown root:nut /etc/nut/ + fi + for file in nut.conf upsmon.conf upssched.conf ; do + if [ -f /etc/nut/$file ] ; then + chown root:nut /etc/nut/$file + chmod 640 /etc/nut/$file + fi + done + + # make sure that /var/run/nut exists and has the correct ownerships + if [ ! -d /var/run/nut ] ; then + mkdir -p /var/run/nut + fi + if [ -d /var/run/nut ] ; then + chown root:nut /var/run/nut + chmod 770 /var/run/nut + fi + + abort-upgrade) + # do nothing + ;; + + abort-remove) + # do nothing + ;; + + abort-deconfigure) + # do nothing + ;; + + *) + echo "$0: incorrect arguments: $*" >&2 + exit 1 + ;; + +esac + +#DEBHELPER# diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index a91caab..193676f 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -22,7 +22,7 @@ case "$1" in if [ -d /etc/nut/ ] ; then chown root:nut /etc/nut/ fi - for file in nut.conf ups.conf upsd.conf upsmon.conf upsd.users upssched.conf ; do + for file in ups.conf upsd.conf upsd.users ; do if [ -f /etc/nut/$file ] ; then chown root:nut /etc/nut/$file chmod 640 /etc/nut/$file diff --git a/debian/nut-server.postrm b/debian/nut-server.postrm index 38b8d52..1ca0437 100644 --- a/debian/nut-server.postrm +++ b/debian/nut-server.postrm @@ -14,12 +14,6 @@ case "$1" in rm -f /etc/udev/rules.d/025_nut-usbups.rules rm -f /etc/udev/rules.d/52_nut-usbups.rules rm -f /etc/udev/rules.d/52-nut-usbups.rules - # remove the nut user - if [ -x "$(command -v deluser)" ]; then - deluser --quiet --system nut > /dev/null || true - else - echo >&2 "not removing nut system account because deluser command was not found" - fi # handle a dpkg bug [ -d /etc/nut ] && rmdir --ignore-fail-on-non-empty /etc/nut >/dev/null 2>&1 ;; From 0429bb5294efa09086bf10b2984b9cf3708b990c Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 21:40:24 +0200 Subject: [PATCH 010/240] =?UTF-8?q?Drop=20/etc/default/nut=20=E2=86=92=20/?= =?UTF-8?q?etc/nut/nut.conf=20migration=20code,=20migration=20happends=20b?= =?UTF-8?q?efore=20squeeze=20release=20(Closes:=20#684392)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 4 ++- debian/nut-server.postinst | 63 -------------------------------------- debian/nut-server.preinst | 7 ----- 3 files changed, 3 insertions(+), 71 deletions(-) diff --git a/debian/changelog b/debian/changelog index b6331fb..75093d1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,8 +12,10 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Move nut metapackage to Section: metapackages * Also create nut user when installing nut-client package and do not delete it on purge anymore (Closes: #682000) + * Drop /etc/default/nut → /etc/nut/nut.conf migration code, migration + happends before squeeze release (Closes: #684392) - -- Laurent Bigonville Thu, 09 Aug 2012 21:18:03 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 21:32:09 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 193676f..c2574b8 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -49,69 +49,6 @@ case "$1" in && udevadm trigger --subsystem-match=usb --action=change # 557178 udevadm trigger --subsystem-match=usb - - # migrate /etc/default/nut to /etc/nut/nut.conf (part #2) - if dpkg --compare-versions "$2" lt-nl "2.4.1-2" ; then - # source the temporary /etc/default/nut.bak file - if [ -f /etc/default/nut.bak ] ; then - . /etc/default/nut.bak - - # FIXME: use a template (and debconf to output?) - echo "migrating /etc/default/nut to /etc/nut/nut.conf" - - # pre process the config - case "$START_UPSD" in - y|Y|yes|YES|Yes) - START_UPSD=yes - ;; - *) - START_UPSD=no - ;; - esac - case "$START_UPSMON" in - y|Y|yes|YES|Yes) - START_UPSMON=yes - ;; - *) - START_UPSMON=no - ;; - esac - - # now process the result - if [ "x$START_UPSD" = "xyes" ] ; then - if [ "x$START_UPSMON" = "xyes" ] ; then - # can also be netserver - NUT_MODE=standalone - #else not processed since it should be an error! - fi - else - if [ "x$START_UPSMON" = "xyes" ] ; then - NUT_MODE=netclient - else - NUT_MODE=none - fi - fi - - # output back the MODE to nut.conf - sed "s/^MODE\(.*\)/MODE=$NUT_MODE/" /etc/nut/nut.conf > /etc/nut/nut.conf.new - - # append the content of default, removing START_* / start... - grep -iv 'START' /etc/default/nut.bak >> /etc/nut/nut.conf.new - # move back to nut.conf - mv /etc/nut/nut.conf.new /etc/nut/nut.conf - # and to init.d/nut - #if [ -f /etc/init.d/nut ] ; then - # sed "s/^UPSD_OPTIONS\(.*\)/UPSD_OPTIONS=\"$UPSD_OPTIONS\"/" /etc/init.d/nut > /etc/init.d/nut.new - # sed "s/^UPSMON_OPTIONS\(.*\)/UPSMON_OPTIONS=\"$UPSMON_OPTIONS\"/" /etc/init.d/nut.new > /etc/init.d/nut - #fi - rm -f /etc/default/nut.bak /etc/default/nut - fi - else - # re process nut.conf MODE so that it can be sourced - NUT_MODE=`grep -e '^ *MODE' /etc/nut/nut.conf | tr -d " "` - sed "s/^ *MODE.*/$NUT_MODE/" /etc/nut/nut.conf > /etc/nut/nut.conf.new - mv /etc/nut/nut.conf.new /etc/nut/nut.conf - fi ;; abort-upgrade) diff --git a/debian/nut-server.preinst b/debian/nut-server.preinst index 587c150..72370d5 100644 --- a/debian/nut-server.preinst +++ b/debian/nut-server.preinst @@ -5,13 +5,6 @@ if [ "$1" = upgrade ]; then [ -f /etc/udev/rules.d/025_nut-usbups.rules ] && rm -f /etc/udev/rules.d/025_nut-usbups.rules [ -f /etc/udev/rules.d/52_nut-usbups.rules ] && rm -f /etc/udev/rules.d/52_nut-usbups.rules [ -f /etc/udev/rules.d/52-nut-usbups.rules ] && rm -f /etc/udev/rules.d/52-nut-usbups.rules - - # migrate /etc/default/nut to /etc/nut/nut.conf (part #1) - # we need to do this before default gets trashed - if [ -f /etc/default/nut ] ; then - # backup /etc/default/nut - cp /etc/default/nut /etc/default/nut.bak - fi fi #DEBHELPER# From 4f4f1f9119ffa81cb86981959ab9dd99faae55ee Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 10:36:09 +0200 Subject: [PATCH 011/240] debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) --- debian/changelog | 7 +++++++ debian/rules | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index a66b5f5..b0b9fb4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nut (2.6.4-2) UNRELEASED; urgency=low + + * debian/rules: Stop the nut-client before nut-server on systems using static + boot ordering (Closes: #679451) + + -- Laurent Bigonville Thu, 09 Aug 2012 10:31:05 +0200 + nut (2.6.4-1) unstable; urgency=high * New upstream release (Closes: #671444) diff --git a/debian/rules b/debian/rules index b9eef15..b0745bb 100755 --- a/debian/rules +++ b/debian/rules @@ -76,8 +76,8 @@ common-install-indep:: binary-install/nut-monitor:: dh_python2 -pnut-monitor -DEB_DH_INSTALLINIT_ARGS_nut-server := --init-script=nut-server -- start 50 2 3 4 5 . stop 50 0 1 6 . -DEB_DH_INSTALLINIT_ARGS_nut-client := --init-script=nut-client -- start 51 2 3 4 5 . stop 51 0 1 6 . +DEB_DH_INSTALLINIT_ARGS_nut-server := --init-script=nut-server -- start 50 2 3 4 5 . stop 51 0 1 6 . +DEB_DH_INSTALLINIT_ARGS_nut-client := --init-script=nut-client -- start 51 2 3 4 5 . stop 50 0 1 6 . DEB_DH_COMPRESS_ARGS_nut-doc := -X.pdf ifeq (linux,$(DEB_HOST_ARCH_OS)) From 080f7baf1401af15d3df8b4495acb18d0762c2db Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:05:51 +0200 Subject: [PATCH 012/240] debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade (Closes: #677822) --- debian/changelog | 4 +++- debian/control | 3 ++- debian/nut-server.maintscript | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 debian/nut-server.maintscript diff --git a/debian/changelog b/debian/changelog index b0b9fb4..1cd47a3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,8 +2,10 @@ nut (2.6.4-2) UNRELEASED; urgency=low * debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) + * debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade + (Closes: #677822) - -- Laurent Bigonville Thu, 09 Aug 2012 10:31:05 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:04:51 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/control b/debian/control index dbf99d7..3cd034a 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: admin Priority: optional Maintainer: Arnaud Quette Uploaders: Laurent Bigonville -Build-Depends: debhelper (>= 8), +Build-Depends: debhelper (>= 8.1.0~), cdbs (>= 0.4.90~), libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, @@ -42,6 +42,7 @@ Provides: nut-usb Conflicts: nut-hal-drivers, nut-usb (<< 2.1.0-3), nut-dev (<< 2.2.2) Replaces: nut (<< 2.6.1-2~) Breaks: nut (<< 2.6.1-2~) +Pre-Depends: ${misc:Pre-Depends} Description: network UPS tools - core system Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and diff --git a/debian/nut-server.maintscript b/debian/nut-server.maintscript new file mode 100644 index 0000000..1d202d4 --- /dev/null +++ b/debian/nut-server.maintscript @@ -0,0 +1,3 @@ +#Removing obsolete init script. +#The file is gone in 2.6.3-2 but was not removed on upgrades. +rm_conffile /etc/init.d/nut 2.6.4-3~ From e038ffaf38402083baf11a809521f93ca7b334f4 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:20:54 +0200 Subject: [PATCH 013/240] Rename nut-server.lintian-overrides to nut-client.lintian-overrides and adjust overrides now that ups-monitor is shipped in nut-client package (Closes: #677947) --- debian/changelog | 5 ++++- debian/nut-client.lintian-overrides | 1 + debian/nut-server.lintian-overrides | 2 -- 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 debian/nut-client.lintian-overrides delete mode 100644 debian/nut-server.lintian-overrides diff --git a/debian/changelog b/debian/changelog index 1cd47a3..c03fca6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,11 @@ nut (2.6.4-2) UNRELEASED; urgency=low boot ordering (Closes: #679451) * debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade (Closes: #677822) + * Rename nut-server.lintian-overrides to nut-client.lintian-overrides and + adjust overrides now that ups-monitor is shipped in nut-client package + (Closes: #677947) - -- Laurent Bigonville Thu, 09 Aug 2012 11:04:51 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:20:06 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/nut-client.lintian-overrides b/debian/nut-client.lintian-overrides new file mode 100644 index 0000000..4651289 --- /dev/null +++ b/debian/nut-client.lintian-overrides @@ -0,0 +1 @@ +nut-client: script-in-etc-init.d-not-registered-via-update-rc.d diff --git a/debian/nut-server.lintian-overrides b/debian/nut-server.lintian-overrides deleted file mode 100644 index 9618794..0000000 --- a/debian/nut-server.lintian-overrides +++ /dev/null @@ -1,2 +0,0 @@ -nut-server: script-in-etc-init.d-not-registered-via-update-rc.d -nut-server: init.d-script-does-not-provide-itself etc/init.d/ups-monitor From 07ab571061ab91420ed24f73e8b5a81994b55e1b Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:39:46 +0200 Subject: [PATCH 014/240] Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched regression (Taken from upstream) (Closes: #679513) --- debian/changelog | 4 +++- debian/patches/0001-fix-upsmon-regression.patch | 15 +++++++++++++++ debian/patches/series | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 debian/patches/0001-fix-upsmon-regression.patch diff --git a/debian/changelog b/debian/changelog index c03fca6..e0fc4b9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,8 +7,10 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Rename nut-server.lintian-overrides to nut-client.lintian-overrides and adjust overrides now that ups-monitor is shipped in nut-client package (Closes: #677947) + * Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched + regression (Taken from upstream) (Closes: #679513) - -- Laurent Bigonville Thu, 09 Aug 2012 11:20:06 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:36:41 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/patches/0001-fix-upsmon-regression.patch b/debian/patches/0001-fix-upsmon-regression.patch new file mode 100644 index 0000000..aa8c13e --- /dev/null +++ b/debian/patches/0001-fix-upsmon-regression.patch @@ -0,0 +1,15 @@ +Description: Fix upsmon/upssched regression +Origin: upstream, http://trac.networkupstools.org/projects/nut/changeset/3670 +Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679513 + +Index: /trunk/clients/upssched.c +=================================================================== +--- a/clients/upssched.c (revision 3555) ++++ b/clients/upssched.c (revision 3670) +@@ -695,5 +695,5 @@ + pconf_encode(arg2, enc, sizeof(enc))); + +- snprintfcat(enc, sizeof(enc), "%s\n", buf); ++ snprintf(enc, sizeof(enc), "%s\n", buf); + + /* see if the parent needs to be started (and maybe start it) */ diff --git a/debian/patches/series b/debian/patches/series index 2024d93..f80396c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1,2 @@ +0001-fix-upsmon-regression.patch 0002-nut-monitor-paths.patch From 8a901d6ac1f71803ca75ed600a5f384d19bf8e12 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 11:50:35 +0200 Subject: [PATCH 015/240] Move nut metapackage to Section: metapackages --- debian/changelog | 3 ++- debian/control | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index e0fc4b9..468fcc1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,8 +9,9 @@ nut (2.6.4-2) UNRELEASED; urgency=low (Closes: #677947) * Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched regression (Taken from upstream) (Closes: #679513) + * Move nut metapackage to Section: metapackages - -- Laurent Bigonville Thu, 09 Aug 2012 11:36:41 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 11:50:08 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/control b/debian/control index 3cd034a..4bd6159 100644 --- a/debian/control +++ b/debian/control @@ -24,6 +24,7 @@ X-Python-Version: >= 2.5 Package: nut Architecture: all +Section: metapackages Depends: ${misc:Depends}, nut-server, nut-client Description: network UPS tools - metapackage Network UPS Tools (NUT) is a client/server monitoring system that From b7d91288c6933d035ffc07fb654542313913dda8 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 21:21:03 +0200 Subject: [PATCH 016/240] Also create nut user when installing nut-client package and do not delete it on purge anymore (Closes: #682000) --- debian/changelog | 4 ++- debian/nut-client.postinst | 60 ++++++++++++++++++++++++++++++++++++++ debian/nut-server.postinst | 2 +- debian/nut-server.postrm | 6 ---- 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 debian/nut-client.postinst diff --git a/debian/changelog b/debian/changelog index 468fcc1..18f3303 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,8 +10,10 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Add debian/patches/0001-fix-upsmon-regression.patch: Fix upsmon/upssched regression (Taken from upstream) (Closes: #679513) * Move nut metapackage to Section: metapackages + * Also create nut user when installing nut-client package and do not delete + it on purge anymore (Closes: #682000) - -- Laurent Bigonville Thu, 09 Aug 2012 11:50:08 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 21:18:03 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst new file mode 100644 index 0000000..fbcf657 --- /dev/null +++ b/debian/nut-client.postinst @@ -0,0 +1,60 @@ +#!/bin/sh -e + +case "$1" in + + configure) + + # make sure the nut user exists and has correct memberships + if ! getent group nut >/dev/null; then + addgroup --quiet --system nut + fi + if ! getent passwd nut >/dev/null; then + adduser --quiet --system --ingroup nut --home /var/lib/nut --no-create-home nut + elif ! groups nut | grep -qw nut; then + adduser nut nut + fi +# for Ubuntu, while waiting for a proper debconf +# if ! groups nut | grep -qw dialout; then +# adduser nut dialout +# fi + + # make sure that conffiles are secured and have the correct ownerships + if [ -d /etc/nut/ ] ; then + chown root:nut /etc/nut/ + fi + for file in nut.conf upsmon.conf upssched.conf ; do + if [ -f /etc/nut/$file ] ; then + chown root:nut /etc/nut/$file + chmod 640 /etc/nut/$file + fi + done + + # make sure that /var/run/nut exists and has the correct ownerships + if [ ! -d /var/run/nut ] ; then + mkdir -p /var/run/nut + fi + if [ -d /var/run/nut ] ; then + chown root:nut /var/run/nut + chmod 770 /var/run/nut + fi + + abort-upgrade) + # do nothing + ;; + + abort-remove) + # do nothing + ;; + + abort-deconfigure) + # do nothing + ;; + + *) + echo "$0: incorrect arguments: $*" >&2 + exit 1 + ;; + +esac + +#DEBHELPER# diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index a91caab..193676f 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -22,7 +22,7 @@ case "$1" in if [ -d /etc/nut/ ] ; then chown root:nut /etc/nut/ fi - for file in nut.conf ups.conf upsd.conf upsmon.conf upsd.users upssched.conf ; do + for file in ups.conf upsd.conf upsd.users ; do if [ -f /etc/nut/$file ] ; then chown root:nut /etc/nut/$file chmod 640 /etc/nut/$file diff --git a/debian/nut-server.postrm b/debian/nut-server.postrm index 38b8d52..1ca0437 100644 --- a/debian/nut-server.postrm +++ b/debian/nut-server.postrm @@ -14,12 +14,6 @@ case "$1" in rm -f /etc/udev/rules.d/025_nut-usbups.rules rm -f /etc/udev/rules.d/52_nut-usbups.rules rm -f /etc/udev/rules.d/52-nut-usbups.rules - # remove the nut user - if [ -x "$(command -v deluser)" ]; then - deluser --quiet --system nut > /dev/null || true - else - echo >&2 "not removing nut system account because deluser command was not found" - fi # handle a dpkg bug [ -d /etc/nut ] && rmdir --ignore-fail-on-non-empty /etc/nut >/dev/null 2>&1 ;; From a5828413ec5817242e77a7f4ebab795be90b8683 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 9 Aug 2012 21:40:24 +0200 Subject: [PATCH 017/240] =?UTF-8?q?Drop=20/etc/default/nut=20=E2=86=92=20/?= =?UTF-8?q?etc/nut/nut.conf=20migration=20code,=20migration=20happends=20b?= =?UTF-8?q?efore=20squeeze=20release=20(Closes:=20#684392)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 4 ++- debian/nut-server.postinst | 63 -------------------------------------- debian/nut-server.preinst | 7 ----- 3 files changed, 3 insertions(+), 71 deletions(-) diff --git a/debian/changelog b/debian/changelog index 18f3303..c569455 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,8 +12,10 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Move nut metapackage to Section: metapackages * Also create nut user when installing nut-client package and do not delete it on purge anymore (Closes: #682000) + * Drop /etc/default/nut → /etc/nut/nut.conf migration code, migration + happends before squeeze release (Closes: #684392) - -- Laurent Bigonville Thu, 09 Aug 2012 21:18:03 +0200 + -- Laurent Bigonville Thu, 09 Aug 2012 21:32:09 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 193676f..c2574b8 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -49,69 +49,6 @@ case "$1" in && udevadm trigger --subsystem-match=usb --action=change # 557178 udevadm trigger --subsystem-match=usb - - # migrate /etc/default/nut to /etc/nut/nut.conf (part #2) - if dpkg --compare-versions "$2" lt-nl "2.4.1-2" ; then - # source the temporary /etc/default/nut.bak file - if [ -f /etc/default/nut.bak ] ; then - . /etc/default/nut.bak - - # FIXME: use a template (and debconf to output?) - echo "migrating /etc/default/nut to /etc/nut/nut.conf" - - # pre process the config - case "$START_UPSD" in - y|Y|yes|YES|Yes) - START_UPSD=yes - ;; - *) - START_UPSD=no - ;; - esac - case "$START_UPSMON" in - y|Y|yes|YES|Yes) - START_UPSMON=yes - ;; - *) - START_UPSMON=no - ;; - esac - - # now process the result - if [ "x$START_UPSD" = "xyes" ] ; then - if [ "x$START_UPSMON" = "xyes" ] ; then - # can also be netserver - NUT_MODE=standalone - #else not processed since it should be an error! - fi - else - if [ "x$START_UPSMON" = "xyes" ] ; then - NUT_MODE=netclient - else - NUT_MODE=none - fi - fi - - # output back the MODE to nut.conf - sed "s/^MODE\(.*\)/MODE=$NUT_MODE/" /etc/nut/nut.conf > /etc/nut/nut.conf.new - - # append the content of default, removing START_* / start... - grep -iv 'START' /etc/default/nut.bak >> /etc/nut/nut.conf.new - # move back to nut.conf - mv /etc/nut/nut.conf.new /etc/nut/nut.conf - # and to init.d/nut - #if [ -f /etc/init.d/nut ] ; then - # sed "s/^UPSD_OPTIONS\(.*\)/UPSD_OPTIONS=\"$UPSD_OPTIONS\"/" /etc/init.d/nut > /etc/init.d/nut.new - # sed "s/^UPSMON_OPTIONS\(.*\)/UPSMON_OPTIONS=\"$UPSMON_OPTIONS\"/" /etc/init.d/nut.new > /etc/init.d/nut - #fi - rm -f /etc/default/nut.bak /etc/default/nut - fi - else - # re process nut.conf MODE so that it can be sourced - NUT_MODE=`grep -e '^ *MODE' /etc/nut/nut.conf | tr -d " "` - sed "s/^ *MODE.*/$NUT_MODE/" /etc/nut/nut.conf > /etc/nut/nut.conf.new - mv /etc/nut/nut.conf.new /etc/nut/nut.conf - fi ;; abort-upgrade) diff --git a/debian/nut-server.preinst b/debian/nut-server.preinst index 587c150..72370d5 100644 --- a/debian/nut-server.preinst +++ b/debian/nut-server.preinst @@ -5,13 +5,6 @@ if [ "$1" = upgrade ]; then [ -f /etc/udev/rules.d/025_nut-usbups.rules ] && rm -f /etc/udev/rules.d/025_nut-usbups.rules [ -f /etc/udev/rules.d/52_nut-usbups.rules ] && rm -f /etc/udev/rules.d/52_nut-usbups.rules [ -f /etc/udev/rules.d/52-nut-usbups.rules ] && rm -f /etc/udev/rules.d/52-nut-usbups.rules - - # migrate /etc/default/nut to /etc/nut/nut.conf (part #1) - # we need to do this before default gets trashed - if [ -f /etc/default/nut ] ; then - # backup /etc/default/nut - cp /etc/default/nut /etc/default/nut.bak - fi fi #DEBHELPER# From 4090c200926b52d0322ed6d66614723d53fd99ea Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Fri, 10 Aug 2012 21:06:18 +0200 Subject: [PATCH 018/240] Fix changelog entry --- debian/changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index c569455..bb8be9b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,7 +13,8 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Also create nut user when installing nut-client package and do not delete it on purge anymore (Closes: #682000) * Drop /etc/default/nut → /etc/nut/nut.conf migration code, migration - happends before squeeze release (Closes: #684392) + happends before squeeze release and this was against policy to have a + maintainer script modifying a conffile in the first place (Closes: #684392) -- Laurent Bigonville Thu, 09 Aug 2012 21:32:09 +0200 From 15f7f26bace9216ce97f478c510c6c3ba532e9d1 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 17:07:22 +0200 Subject: [PATCH 019/240] Add dependency against adduser and lsb-base on nut-client package --- debian/changelog | 3 ++- debian/control | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index bb8be9b..b93c2a9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,8 +15,9 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Drop /etc/default/nut → /etc/nut/nut.conf migration code, migration happends before squeeze release and this was against policy to have a maintainer script modifying a conffile in the first place (Closes: #684392) + * Add dependency against adduser and lsb-base on nut-client package - -- Laurent Bigonville Thu, 09 Aug 2012 21:32:09 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 17:06:27 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/control b/debian/control index 4bd6159..eac3480 100644 --- a/debian/control +++ b/debian/control @@ -57,7 +57,7 @@ Description: network UPS tools - core system Package: nut-client Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} +Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6) Provides: ups-monitor Conflicts: ups-monitor, nut-server (<< 2.6.3-1) Recommends: bash-completion From 062e200fee5334b50d6848c4cf4b853b800ac6cb Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 17:15:13 +0200 Subject: [PATCH 020/240] Fix typo in debian/nut-client.postinst --- debian/nut-client.postinst | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index fbcf657..9d5cad3 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -37,6 +37,7 @@ case "$1" in chown root:nut /var/run/nut chmod 770 /var/run/nut fi + ;; abort-upgrade) # do nothing From 00ffc53caa8dce9f101d12db9bdfa7f84a6af20c Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 17:21:01 +0200 Subject: [PATCH 021/240] Do not use dpkg-maintscript-helper to remove /etc/init.d/nut --- debian/changelog | 2 +- debian/control | 3 +-- debian/nut-server.maintscript | 3 --- debian/nut-server.postinst | 5 +++++ 4 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 debian/nut-server.maintscript diff --git a/debian/changelog b/debian/changelog index b93c2a9..15898a4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,7 +2,7 @@ nut (2.6.4-2) UNRELEASED; urgency=low * debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) - * debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade + * debian/nut-server.postinst: Remove /etc/init.d/nut on upgrade (Closes: #677822) * Rename nut-server.lintian-overrides to nut-client.lintian-overrides and adjust overrides now that ups-monitor is shipped in nut-client package diff --git a/debian/control b/debian/control index eac3480..e5f9af3 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: admin Priority: optional Maintainer: Arnaud Quette Uploaders: Laurent Bigonville -Build-Depends: debhelper (>= 8.1.0~), +Build-Depends: debhelper (>= 8), cdbs (>= 0.4.90~), libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, @@ -43,7 +43,6 @@ Provides: nut-usb Conflicts: nut-hal-drivers, nut-usb (<< 2.1.0-3), nut-dev (<< 2.2.2) Replaces: nut (<< 2.6.1-2~) Breaks: nut (<< 2.6.1-2~) -Pre-Depends: ${misc:Pre-Depends} Description: network UPS tools - core system Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and diff --git a/debian/nut-server.maintscript b/debian/nut-server.maintscript deleted file mode 100644 index 1d202d4..0000000 --- a/debian/nut-server.maintscript +++ /dev/null @@ -1,3 +0,0 @@ -#Removing obsolete init script. -#The file is gone in 2.6.3-2 but was not removed on upgrades. -rm_conffile /etc/init.d/nut 2.6.4-3~ diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index c2574b8..7952552 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -49,6 +49,11 @@ case "$1" in && udevadm trigger --subsystem-match=usb --action=change # 557178 udevadm trigger --subsystem-match=usb + + if dpkg --compare-versions "$2" le "2.6.4-2~" ; then + rm -f /etc/init.d/nut + update-rc.d nut remove >/dev/null + fi ;; abort-upgrade) From 48b40bb27f5eafcae8cd655e29f747f672b07ee2 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 17:26:54 +0200 Subject: [PATCH 022/240] debian/gbp.conf: Switch to wheezy branches --- debian/gbp.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/gbp.conf b/debian/gbp.conf index 6837223..d91ad90 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -1,6 +1,6 @@ [DEFAULT] -debian-branch = debian -upstream-branch = upstream +debian-branch = debian-wheezy +upstream-branch = upstream-wheezy pristine-tar = True [git-buildpackage] From 4ef77d11071e2a2acf118caa57f3558c1f359d0a Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 18:04:03 +0200 Subject: [PATCH 023/240] Be sure that client is stopped before the server also when using dependencies based boot --- debian/changelog | 4 +++- debian/nut-server.init | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 15898a4..7426f0b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,8 +16,10 @@ nut (2.6.4-2) UNRELEASED; urgency=low happends before squeeze release and this was against policy to have a maintainer script modifying a conffile in the first place (Closes: #684392) * Add dependency against adduser and lsb-base on nut-client package + * Be sure that client is stopped before the server also when using + dependencies based boot - -- Laurent Bigonville Sat, 11 Aug 2012 17:06:27 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 18:02:59 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/nut-server.init b/debian/nut-server.init index 5505be4..a606b72 100644 --- a/debian/nut-server.init +++ b/debian/nut-server.init @@ -2,7 +2,7 @@ ### BEGIN INIT INFO # Provides: nut-server upsd # Required-Start: $local_fs $syslog $network $remote_fs udev -# Required-Stop: $local_fs $syslog $network $remote_fs udev nut-client +# Required-Stop: $local_fs $syslog $network $remote_fs udev # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Network UPS Tools initscript From 474ba384e9790d9ffd67a6b12d1ecdb502312e59 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 19:36:11 +0200 Subject: [PATCH 024/240] Fix package descriptions (Closes: #678068) --- debian/changelog | 3 ++- debian/control | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 7426f0b..3af2886 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,8 +18,9 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Add dependency against adduser and lsb-base on nut-client package * Be sure that client is stopped before the server also when using dependencies based boot + * Fix package descriptions (Closes: #678068) - -- Laurent Bigonville Sat, 11 Aug 2012 18:02:59 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 19:35:49 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/control b/debian/control index e5f9af3..e3db9c0 100644 --- a/debian/control +++ b/debian/control @@ -33,7 +33,8 @@ Description: network UPS tools - metapackage through the server, and are notified whenever the power status changes. . - This package is a metapackage that install both nut-server and nut-client + This package is a metapackage that install both nut-server and nut-client, + in most cases it is sufficient for a basic UPS monitoring system. Package: nut-server Architecture: any @@ -51,8 +52,7 @@ Description: network UPS tools - core system changes. . This package provides NUT's core system, and the serial and USB UPS - drivers. In most cases it is sufficient for a basic UPS monitoring - system. + drivers. Package: nut-client Architecture: any From 912696f8a78cd091ab663e91babebcb27dc6987a Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 20:04:57 +0200 Subject: [PATCH 025/240] Also install /bin/upssched-cmd in nut-client package as this script is referenced in default upssched.conf config file --- debian/changelog | 4 +++- debian/nut-client.install | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 3af2886..c6fb1c7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,8 +19,10 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Be sure that client is stopped before the server also when using dependencies based boot * Fix package descriptions (Closes: #678068) + * Also install /bin/upssched-cmd in nut-client package as this script is + referenced in default upssched.conf config file - -- Laurent Bigonville Sat, 11 Aug 2012 19:35:49 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 20:03:56 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/nut-client.install b/debian/nut-client.install index cde4bd7..b4b7d7f 100644 --- a/debian/nut-client.install +++ b/debian/nut-client.install @@ -4,6 +4,7 @@ debian/tmp/bin/upsrw debian/tmp/bin/upscmd debian/tmp/sbin/upsmon debian/tmp/sbin/upssched +debian/tmp/bin/upssched-cmd debian/tmp/etc/bash_completion.d/nut debian/tmp/etc/nut/nut.conf debian/tmp/etc/nut/upsmon.conf From edbf4928c52a9deecf17d7f8c7f0fff244498868 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 21:02:26 +0200 Subject: [PATCH 026/240] debian/watch: Update watch file --- debian/changelog | 3 ++- debian/watch | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index c6fb1c7..14b4693 100644 --- a/debian/changelog +++ b/debian/changelog @@ -21,8 +21,9 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Fix package descriptions (Closes: #678068) * Also install /bin/upssched-cmd in nut-client package as this script is referenced in default upssched.conf config file + * debian/watch: Update watch file - -- Laurent Bigonville Sat, 11 Aug 2012 20:03:56 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 21:02:05 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/watch b/debian/watch index cfb143e..fd44637 100644 --- a/debian/watch +++ b/debian/watch @@ -1,2 +1,2 @@ version=3 -http://www.networkupstools.org/source/2.4/nut-(.*)\.tar\.gz debian uupdate +http://www.networkupstools.org/source/([0-9.]+)/nut-(.*)\.tar\.gz From ba9e479229b41f9dc7decb320c7759e93cb29967 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 00:08:16 +0200 Subject: [PATCH 027/240] Be sure that all maintainer scripts are returning 0 at their end --- debian/changelog | 3 ++- debian/nut-cgi.postrm | 1 + debian/nut-client.postinst | 2 ++ debian/nut-server.postinst | 2 ++ debian/nut-server.postrm | 1 + debian/nut-server.preinst | 2 ++ 6 files changed, 10 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 14b4693..8605dda 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,8 +22,9 @@ nut (2.6.4-2) UNRELEASED; urgency=low * Also install /bin/upssched-cmd in nut-client package as this script is referenced in default upssched.conf config file * debian/watch: Update watch file + * Be sure that all maintainer scripts are returning 0 at their end - -- Laurent Bigonville Sat, 11 Aug 2012 21:02:05 +0200 + -- Laurent Bigonville Sun, 12 Aug 2012 00:07:46 +0200 nut (2.6.4-1) unstable; urgency=high diff --git a/debian/nut-cgi.postrm b/debian/nut-cgi.postrm index bdfecf0..91be66d 100644 --- a/debian/nut-cgi.postrm +++ b/debian/nut-cgi.postrm @@ -44,3 +44,4 @@ esac #DEBHELPER# +exit 0 diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index 9d5cad3..8546a95 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -59,3 +59,5 @@ case "$1" in esac #DEBHELPER# + +exit 0 diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 7952552..d0ec14b 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -76,3 +76,5 @@ case "$1" in esac #DEBHELPER# + +exit 0 diff --git a/debian/nut-server.postrm b/debian/nut-server.postrm index 1ca0437..b95b26f 100644 --- a/debian/nut-server.postrm +++ b/debian/nut-server.postrm @@ -47,3 +47,4 @@ esac #DEBHELPER# +exit 0 diff --git a/debian/nut-server.preinst b/debian/nut-server.preinst index 72370d5..f3e949f 100644 --- a/debian/nut-server.preinst +++ b/debian/nut-server.preinst @@ -8,3 +8,5 @@ if [ "$1" = upgrade ]; then fi #DEBHELPER# + +exit 0 From d1870abc9453ed626fb053e2d0323a48b61ed81e Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 20:39:01 +0200 Subject: [PATCH 028/240] Release to unstable (2.6.4-2) --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 8605dda..a603e8c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nut (2.6.4-2) UNRELEASED; urgency=low +nut (2.6.4-2) unstable; urgency=low * debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) @@ -24,7 +24,7 @@ nut (2.6.4-2) UNRELEASED; urgency=low * debian/watch: Update watch file * Be sure that all maintainer scripts are returning 0 at their end - -- Laurent Bigonville Sun, 12 Aug 2012 00:07:46 +0200 + -- Laurent Bigonville Sun, 12 Aug 2012 20:38:52 +0200 nut (2.6.4-1) unstable; urgency=high From 04703f7239bae389cd5138801914af98c9050852 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Fri, 10 Aug 2012 21:06:18 +0200 Subject: [PATCH 029/240] Fix changelog entry --- debian/changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 75093d1..99ad325 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,7 +13,8 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Also create nut user when installing nut-client package and do not delete it on purge anymore (Closes: #682000) * Drop /etc/default/nut → /etc/nut/nut.conf migration code, migration - happends before squeeze release (Closes: #684392) + happends before squeeze release and this was against policy to have a + maintainer script modifying a conffile in the first place (Closes: #684392) -- Laurent Bigonville Thu, 09 Aug 2012 21:32:09 +0200 From 5d4e219ae8386040ad2c8b0c67af3bd0b57e1c88 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 17:07:22 +0200 Subject: [PATCH 030/240] Add dependency against adduser and lsb-base on nut-client package --- debian/changelog | 3 ++- debian/control | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 99ad325..54fc67e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,8 +15,9 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Drop /etc/default/nut → /etc/nut/nut.conf migration code, migration happends before squeeze release and this was against policy to have a maintainer script modifying a conffile in the first place (Closes: #684392) + * Add dependency against adduser and lsb-base on nut-client package - -- Laurent Bigonville Thu, 09 Aug 2012 21:32:09 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 17:06:27 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/control b/debian/control index b99fe5a..cd6b27e 100644 --- a/debian/control +++ b/debian/control @@ -59,7 +59,7 @@ Description: network UPS tools - core system Package: nut-client Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} +Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6) Provides: ups-monitor Conflicts: ups-monitor, nut-server (<< 2.6.3-1) Recommends: bash-completion From 6c856783433e9dfb4880f05521f61ab4c93b0714 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 17:15:13 +0200 Subject: [PATCH 031/240] Fix typo in debian/nut-client.postinst --- debian/nut-client.postinst | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index fbcf657..9d5cad3 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -37,6 +37,7 @@ case "$1" in chown root:nut /var/run/nut chmod 770 /var/run/nut fi + ;; abort-upgrade) # do nothing From a7e6c2affcca412e5f9d8fb02725ec41866109a3 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 17:21:01 +0200 Subject: [PATCH 032/240] Do not use dpkg-maintscript-helper to remove /etc/init.d/nut --- debian/changelog | 2 +- debian/control | 3 +-- debian/nut-server.maintscript | 3 --- debian/nut-server.postinst | 5 +++++ 4 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 debian/nut-server.maintscript diff --git a/debian/changelog b/debian/changelog index 54fc67e..9642eba 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,7 +2,7 @@ nut (2.6.4-3) UNRELEASED; urgency=low * debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) - * debian/nut-server.maintscript: Remove /etc/init.d/nut on upgrade + * debian/nut-server.postinst: Remove /etc/init.d/nut on upgrade (Closes: #677822) * Rename nut-server.lintian-overrides to nut-client.lintian-overrides and adjust overrides now that ups-monitor is shipped in nut-client package diff --git a/debian/control b/debian/control index cd6b27e..684855a 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: admin Priority: optional Maintainer: Arnaud Quette Uploaders: Laurent Bigonville -Build-Depends: debhelper (>= 8.1.0~), +Build-Depends: debhelper (>= 8), cdbs (>= 0.4.90~), libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, @@ -45,7 +45,6 @@ Provides: nut-usb Conflicts: nut-hal-drivers, nut-usb (<< 2.1.0-3), nut-dev (<< 2.2.2) Replaces: nut (<< 2.6.1-2~) Breaks: nut (<< 2.6.1-2~) -Pre-Depends: ${misc:Pre-Depends} Description: network UPS tools - core system Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and diff --git a/debian/nut-server.maintscript b/debian/nut-server.maintscript deleted file mode 100644 index 1d202d4..0000000 --- a/debian/nut-server.maintscript +++ /dev/null @@ -1,3 +0,0 @@ -#Removing obsolete init script. -#The file is gone in 2.6.3-2 but was not removed on upgrades. -rm_conffile /etc/init.d/nut 2.6.4-3~ diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index c2574b8..7952552 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -49,6 +49,11 @@ case "$1" in && udevadm trigger --subsystem-match=usb --action=change # 557178 udevadm trigger --subsystem-match=usb + + if dpkg --compare-versions "$2" le "2.6.4-2~" ; then + rm -f /etc/init.d/nut + update-rc.d nut remove >/dev/null + fi ;; abort-upgrade) From fa2376d331459513fa68b53c01e5a68fa5544493 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 18:04:03 +0200 Subject: [PATCH 033/240] Be sure that client is stopped before the server also when using dependencies based boot --- debian/changelog | 4 +++- debian/nut-server.init | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 9642eba..038abcf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,8 +16,10 @@ nut (2.6.4-3) UNRELEASED; urgency=low happends before squeeze release and this was against policy to have a maintainer script modifying a conffile in the first place (Closes: #684392) * Add dependency against adduser and lsb-base on nut-client package + * Be sure that client is stopped before the server also when using + dependencies based boot - -- Laurent Bigonville Sat, 11 Aug 2012 17:06:27 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 18:02:59 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/nut-server.init b/debian/nut-server.init index 5505be4..a606b72 100644 --- a/debian/nut-server.init +++ b/debian/nut-server.init @@ -2,7 +2,7 @@ ### BEGIN INIT INFO # Provides: nut-server upsd # Required-Start: $local_fs $syslog $network $remote_fs udev -# Required-Stop: $local_fs $syslog $network $remote_fs udev nut-client +# Required-Stop: $local_fs $syslog $network $remote_fs udev # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Network UPS Tools initscript From b13692c4ba7c813641014d37bf5d37904d23524d Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 19:36:11 +0200 Subject: [PATCH 034/240] Fix package descriptions (Closes: #678068) --- debian/changelog | 3 ++- debian/control | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 038abcf..a72c338 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,8 +18,9 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Add dependency against adduser and lsb-base on nut-client package * Be sure that client is stopped before the server also when using dependencies based boot + * Fix package descriptions (Closes: #678068) - -- Laurent Bigonville Sat, 11 Aug 2012 18:02:59 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 19:35:49 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/control b/debian/control index 684855a..701d80a 100644 --- a/debian/control +++ b/debian/control @@ -35,7 +35,8 @@ Description: network UPS tools - metapackage through the server, and are notified whenever the power status changes. . - This package is a metapackage that install both nut-server and nut-client + This package is a metapackage that install both nut-server and nut-client, + in most cases it is sufficient for a basic UPS monitoring system. Package: nut-server Architecture: any @@ -53,8 +54,7 @@ Description: network UPS tools - core system changes. . This package provides NUT's core system, and the serial and USB UPS - drivers. In most cases it is sufficient for a basic UPS monitoring - system. + drivers. Package: nut-client Architecture: any From 37fc9173250e8d7920b5ecc0b954e5dd7ca3ffb3 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 20:04:57 +0200 Subject: [PATCH 035/240] Also install /bin/upssched-cmd in nut-client package as this script is referenced in default upssched.conf config file --- debian/changelog | 4 +++- debian/nut-client.install | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index a72c338..8ae5bba 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,8 +19,10 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Be sure that client is stopped before the server also when using dependencies based boot * Fix package descriptions (Closes: #678068) + * Also install /bin/upssched-cmd in nut-client package as this script is + referenced in default upssched.conf config file - -- Laurent Bigonville Sat, 11 Aug 2012 19:35:49 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 20:03:56 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/nut-client.install b/debian/nut-client.install index cde4bd7..b4b7d7f 100644 --- a/debian/nut-client.install +++ b/debian/nut-client.install @@ -4,6 +4,7 @@ debian/tmp/bin/upsrw debian/tmp/bin/upscmd debian/tmp/sbin/upsmon debian/tmp/sbin/upssched +debian/tmp/bin/upssched-cmd debian/tmp/etc/bash_completion.d/nut debian/tmp/etc/nut/nut.conf debian/tmp/etc/nut/upsmon.conf From d634a9971d9663abe10c6512ff85267cebd7fbfd Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 11 Aug 2012 21:02:26 +0200 Subject: [PATCH 036/240] debian/watch: Update watch file --- debian/changelog | 3 ++- debian/watch | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 8ae5bba..87d600a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -21,8 +21,9 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Fix package descriptions (Closes: #678068) * Also install /bin/upssched-cmd in nut-client package as this script is referenced in default upssched.conf config file + * debian/watch: Update watch file - -- Laurent Bigonville Sat, 11 Aug 2012 20:03:56 +0200 + -- Laurent Bigonville Sat, 11 Aug 2012 21:02:05 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/watch b/debian/watch index cfb143e..fd44637 100644 --- a/debian/watch +++ b/debian/watch @@ -1,2 +1,2 @@ version=3 -http://www.networkupstools.org/source/2.4/nut-(.*)\.tar\.gz debian uupdate +http://www.networkupstools.org/source/([0-9.]+)/nut-(.*)\.tar\.gz From d518f66985b360d482d60ee239d0f3703e4ab139 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 00:08:16 +0200 Subject: [PATCH 037/240] Be sure that all maintainer scripts are returning 0 at their end --- debian/changelog | 3 ++- debian/nut-cgi.postrm | 1 + debian/nut-client.postinst | 2 ++ debian/nut-server.postinst | 2 ++ debian/nut-server.postrm | 1 + debian/nut-server.preinst | 2 ++ 6 files changed, 10 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 87d600a..d1952f3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,8 +22,9 @@ nut (2.6.4-3) UNRELEASED; urgency=low * Also install /bin/upssched-cmd in nut-client package as this script is referenced in default upssched.conf config file * debian/watch: Update watch file + * Be sure that all maintainer scripts are returning 0 at their end - -- Laurent Bigonville Sat, 11 Aug 2012 21:02:05 +0200 + -- Laurent Bigonville Sun, 12 Aug 2012 00:07:46 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/nut-cgi.postrm b/debian/nut-cgi.postrm index bdfecf0..91be66d 100644 --- a/debian/nut-cgi.postrm +++ b/debian/nut-cgi.postrm @@ -44,3 +44,4 @@ esac #DEBHELPER# +exit 0 diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index 9d5cad3..8546a95 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -59,3 +59,5 @@ case "$1" in esac #DEBHELPER# + +exit 0 diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 7952552..d0ec14b 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -76,3 +76,5 @@ case "$1" in esac #DEBHELPER# + +exit 0 diff --git a/debian/nut-server.postrm b/debian/nut-server.postrm index 1ca0437..b95b26f 100644 --- a/debian/nut-server.postrm +++ b/debian/nut-server.postrm @@ -47,3 +47,4 @@ esac #DEBHELPER# +exit 0 diff --git a/debian/nut-server.preinst b/debian/nut-server.preinst index 72370d5..f3e949f 100644 --- a/debian/nut-server.preinst +++ b/debian/nut-server.preinst @@ -8,3 +8,5 @@ if [ "$1" = upgrade ]; then fi #DEBHELPER# + +exit 0 From e25bc18d9646e83c2e278d4a0808797dd7e4fba0 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 20:39:01 +0200 Subject: [PATCH 038/240] Release to unstable (2.6.4-2) --- debian/changelog | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/debian/changelog b/debian/changelog index d1952f3..11dc6d6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,13 @@ nut (2.6.4-3) UNRELEASED; urgency=low + * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI + support package + * debian/nut-server.install: only install USB udev rules + + -- Arnaud Quette Fri, 08 Jun 2012 23:23:03 +0200 + +nut (2.6.4-2) unstable; urgency=low + * debian/rules: Stop the nut-client before nut-server on systems using static boot ordering (Closes: #679451) * debian/nut-server.postinst: Remove /etc/init.d/nut on upgrade @@ -24,15 +32,7 @@ nut (2.6.4-3) UNRELEASED; urgency=low * debian/watch: Update watch file * Be sure that all maintainer scripts are returning 0 at their end - -- Laurent Bigonville Sun, 12 Aug 2012 00:07:46 +0200 - -nut (2.6.4-2) unstable; urgency=low - - * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI - support package - * debian/nut-server.install: only install USB udev rules - - -- Arnaud Quette Fri, 08 Jun 2012 23:23:03 +0200 + -- Laurent Bigonville Sun, 12 Aug 2012 20:38:52 +0200 nut (2.6.4-1) unstable; urgency=high From 8141cb729782a9dc5f01b07678252aa7aad97d3f Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 22:18:54 +0200 Subject: [PATCH 039/240] Follow multi-arch policy --- debian/changelog | 6 +++++- debian/control | 6 ++++-- debian/libupsclient1-dev.install | 9 +++++---- debian/libupsclient1-dev.links | 1 - debian/libupsclient1.install | 2 +- debian/rules | 9 +++++++-- 6 files changed, 22 insertions(+), 11 deletions(-) delete mode 100644 debian/libupsclient1-dev.links diff --git a/debian/changelog b/debian/changelog index 11dc6d6..8918061 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,10 +1,14 @@ nut (2.6.4-3) UNRELEASED; urgency=low + [ Arnaud Quette ] * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI support package * debian/nut-server.install: only install USB udev rules - -- Arnaud Quette Fri, 08 Jun 2012 23:23:03 +0200 + [ Laurent Bigonville ] + * Follow multi-arch policy + + -- Laurent Bigonville Sun, 12 Aug 2012 22:18:36 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/control b/debian/control index 701d80a..431767f 100644 --- a/debian/control +++ b/debian/control @@ -3,8 +3,8 @@ Section: admin Priority: optional Maintainer: Arnaud Quette Uploaders: Laurent Bigonville -Build-Depends: debhelper (>= 8), - cdbs (>= 0.4.90~), +Build-Depends: debhelper (>= 8.1.3), + cdbs (>= 0.4.93~), libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, libusb-dev (>= 0.1.8), @@ -166,6 +166,8 @@ Description: network UPS tools - documentation Package: libupsclient1 Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same Description: network UPS tools - client library Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and diff --git a/debian/libupsclient1-dev.install b/debian/libupsclient1-dev.install index 3d6b952..144903a 100644 --- a/debian/libupsclient1-dev.install +++ b/debian/libupsclient1-dev.install @@ -1,4 +1,5 @@ -debian/tmp/lib/libupsclient.so -debian/tmp/lib/libupsclient.a -debian/tmp/usr/lib/pkgconfig/ -debian/tmp/usr/include +lib/*/libupsclient.so +usr/lib/*/libupsclient.so +lib/*/libupsclient.a +usr/lib/*/pkgconfig/ +usr/include diff --git a/debian/libupsclient1-dev.links b/debian/libupsclient1-dev.links deleted file mode 100644 index 0ac64c7..0000000 --- a/debian/libupsclient1-dev.links +++ /dev/null @@ -1 +0,0 @@ -/lib/libupsclient.so.1.1.0 /usr/lib/libupsclient.so diff --git a/debian/libupsclient1.install b/debian/libupsclient1.install index 7ba3ff0..132d81a 100644 --- a/debian/libupsclient1.install +++ b/debian/libupsclient1.install @@ -1 +1 @@ -debian/tmp/lib/libupsclient.so.* +lib/*/libupsclient.so.* diff --git a/debian/rules b/debian/rules index b0745bb..3dae758 100755 --- a/debian/rules +++ b/debian/rules @@ -14,7 +14,8 @@ DEB_CONFIGURE_PREFIX := DEB_CONFIGURE_SYSCONFDIR := /etc/nut DEB_CONFIGURE_INCLUDEDIR := /usr/include DEB_CONFIGURE_MANDIR := /usr/share/man -DEB_CONFIGURE_EXTRA_FLAGS := --without-ssl \ +DEB_CONFIGURE_EXTRA_FLAGS := --libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \ + --without-ssl \ --with-cgi \ --with-dev \ --enable-static \ @@ -25,7 +26,7 @@ DEB_CONFIGURE_EXTRA_FLAGS := --without-ssl \ --with-htmlpath=/usr/share/nut/www \ --with-pidpath=/var/run/nut \ --datadir=/usr/share/nut \ - --with-pkgconfig-dir=/usr/lib/pkgconfig \ + --with-pkgconfig-dir=/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig \ --with-user=nut --with-group=nut ifeq (linux,$(DEB_HOST_ARCH_OS)) @@ -61,6 +62,10 @@ common-install-arch:: mv $${f} $(CURDIR)/debian/tmp/etc/nut/$${nf}; \ done + # Create -dev symlink under /usr + ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.1.1.0 \ + $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so + common-install-indep:: #install documentation mkdir -p $(CURDIR)/debian/tmp/usr/share/doc/nut-doc/pdf From 0d1e4a2dcc05c3457234635bf51319e87025a7f9 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 23:14:24 +0200 Subject: [PATCH 040/240] Install systemd .service files (Closes: #679450) --- debian/changelog | 3 ++- debian/rules | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 8918061..464e9b2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,8 +7,9 @@ nut (2.6.4-3) UNRELEASED; urgency=low [ Laurent Bigonville ] * Follow multi-arch policy + * Install systemd .service files (Closes: #679450) - -- Laurent Bigonville Sun, 12 Aug 2012 22:18:36 +0200 + -- Laurent Bigonville Sun, 12 Aug 2012 23:14:05 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/rules b/debian/rules index 3dae758..42ddca7 100755 --- a/debian/rules +++ b/debian/rules @@ -30,7 +30,7 @@ DEB_CONFIGURE_EXTRA_FLAGS := --libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \ --with-user=nut --with-group=nut ifeq (linux,$(DEB_HOST_ARCH_OS)) - DEB_CONFIGURE_EXTRA_FLAGS+=--with-udev-dir=/lib/udev + DEB_CONFIGURE_EXTRA_FLAGS+=--with-udev-dir=/lib/udev --with-systemdsystemunitdir=/lib/systemd/system endif # only build documentation if asciidoc is installed @@ -66,6 +66,18 @@ common-install-arch:: ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.1.1.0 \ $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so + # Install systemd files only on systems where it's supported +ifeq (linux,$(DEB_HOST_ARCH_OS)) + install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-monitor.service \ + $(CURDIR)/debian/nut-client/lib/systemd/system/nut-monitor.service + install -D $(CURDIR)/debian/tmp/lib/systemd/system-shutdown/nutshutdown \ + $(CURDIR)/debian/nut-server/lib/systemd/system-shutdown/nutshutdown + install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-driver.service \ + $(CURDIR)/debian/nut-server/lib/systemd/system/nut-driver.service + install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-server.service \ + $(CURDIR)/debian/nut-server/lib/systemd/system/nut-server.service +endif + common-install-indep:: #install documentation mkdir -p $(CURDIR)/debian/tmp/usr/share/doc/nut-doc/pdf From a1fa151fc70a843f2a17a2412633c8a979162724 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 23:39:31 +0200 Subject: [PATCH 041/240] Imported Upstream version 2.6.5 --- ChangeLog | 315 ++ Makefile.am | 2 +- Makefile.in | 9 +- NEWS | 53 +- UPGRADING | 10 +- clients/Makefile.in | 7 + clients/upssched.c | 2 +- common/Makefile.in | 7 + conf/Makefile.in | 7 + configure | 4629 ++++++++++++++++++++++- configure.in | 46 +- data/Makefile.in | 7 + data/driver.list.in | 154 +- data/html/Makefile.in | 7 + docs/Makefile.am | 2 +- docs/Makefile.in | 9 +- docs/configure.txt | 10 +- docs/documentation.txt | 1 + docs/download.txt | 13 +- docs/images/eaton-logo.png | Bin 7998 -> 0 bytes docs/images/hostedby.png | Bin 0 -> 4006 bytes docs/images/simple.png | Bin 16662 -> 15992 bytes docs/man/Makefile.am | 16 +- docs/man/Makefile.in | 20 +- docs/man/apcsmart-old.8 | 4 +- docs/man/apcsmart.8 | 4 +- docs/man/bcmxcp.8 | 4 +- docs/man/bcmxcp_usb.8 | 4 +- docs/man/belkin.8 | 4 +- docs/man/belkinunv.8 | 6 +- docs/man/belkinunv.txt | 2 - docs/man/bestfcom.8 | 4 +- docs/man/bestfortress.8 | 4 +- docs/man/bestuferrups.8 | 4 +- docs/man/bestups.8 | 4 +- docs/man/blazer.8 | 4 +- docs/man/clone.8 | 4 +- docs/man/dummy-ups.8 | 4 +- docs/man/etapro.8 | 4 +- docs/man/everups.8 | 4 +- docs/man/gamatronic.8 | 4 +- docs/man/genericups.8 | 4 +- docs/man/hosts.conf.5 | 4 +- docs/man/isbmex.8 | 4 +- docs/man/ivtscd.8 | 4 +- docs/man/libupsclient-config.1 | 4 +- docs/man/liebert-esp2.8 | 4 +- docs/man/liebert.8 | 4 +- docs/man/macosx-ups.8 | 81 + docs/man/macosx-ups.txt | 104 + docs/man/masterguard.8 | 4 +- docs/man/metasys.8 | 4 +- docs/man/mge-shut.8 | 21 +- docs/man/mge-shut.txt | 7 +- docs/man/mge-utalk.8 | 4 +- docs/man/microdowell.8 | 4 +- docs/man/netxml-ups.8 | 4 +- docs/man/nut-ipmipsu.8 | 8 +- docs/man/nut-ipmipsu.txt | 4 +- docs/man/nut-recorder.8 | 4 +- docs/man/nut-scanner.8 | 6 +- docs/man/nut-scanner.txt | 10 +- docs/man/nut.conf.5 | 4 +- docs/man/nutscan.3 | 16 +- docs/man/nutscan.txt | 29 +- docs/man/nutscan_add_device_to_device.3 | 4 +- docs/man/nutscan_add_option_to_device.3 | 4 +- docs/man/nutscan_cidr_to_ip.3 | 4 +- docs/man/nutscan_display_parsable.3 | 4 +- docs/man/nutscan_display_ups_conf.3 | 4 +- docs/man/nutscan_free_device.3 | 4 +- docs/man/nutscan_init.3 | 4 +- docs/man/nutscan_new_device.3 | 4 +- docs/man/nutscan_scan_avahi.3 | 14 +- docs/man/nutscan_scan_avahi.txt | 15 +- docs/man/nutscan_scan_ipmi.3 | 4 +- docs/man/nutscan_scan_nut.3 | 4 +- docs/man/nutscan_scan_snmp.3 | 4 +- docs/man/nutscan_scan_usb.3 | 4 +- docs/man/nutscan_scan_xml_http.3 | 4 +- docs/man/nutupsdrv.8 | 4 +- docs/man/oneac.8 | 4 +- docs/man/optiups.8 | 4 +- docs/man/powercom.8 | 10 +- docs/man/powercom.txt | 12 +- docs/man/powerman-pdu.8 | 4 +- docs/man/powerpanel.8 | 4 +- docs/man/rhino.8 | 4 +- docs/man/richcomm_usb.8 | 4 +- docs/man/safenet.8 | 4 +- docs/man/skel.txt | 10 + docs/man/snmp-ups.8 | 4 +- docs/man/solis.8 | 4 +- docs/man/tripplite.8 | 4 +- docs/man/tripplite_usb.8 | 4 +- docs/man/tripplitesu.8 | 4 +- docs/man/ups.conf.5 | 4 +- docs/man/upsc.8 | 4 +- docs/man/upscli_connect.3 | 4 +- docs/man/upscli_disconnect.3 | 4 +- docs/man/upscli_fd.3 | 4 +- docs/man/upscli_get.3 | 4 +- docs/man/upscli_list_next.3 | 4 +- docs/man/upscli_list_start.3 | 4 +- docs/man/upscli_readline.3 | 4 +- docs/man/upscli_sendline.3 | 4 +- docs/man/upscli_splitaddr.3 | 4 +- docs/man/upscli_splitname.3 | 4 +- docs/man/upscli_ssl.3 | 4 +- docs/man/upscli_strerror.3 | 4 +- docs/man/upscli_upserror.3 | 4 +- docs/man/upsclient.3 | 4 +- docs/man/upscmd.8 | 4 +- docs/man/upscode2.8 | 4 +- docs/man/upsd.8 | 4 +- docs/man/upsd.conf.5 | 4 +- docs/man/upsd.users.5 | 4 +- docs/man/upsdrvctl.8 | 4 +- docs/man/upsimage.cgi.8 | 4 +- docs/man/upslog.8 | 4 +- docs/man/upsmon.8 | 4 +- docs/man/upsmon.conf.5 | 4 +- docs/man/upsrw.8 | 4 +- docs/man/upssched.8 | 4 +- docs/man/upssched.conf.5 | 4 +- docs/man/upsset.cgi.8 | 4 +- docs/man/upsset.conf.5 | 4 +- docs/man/upsstats.cgi.8 | 4 +- docs/man/upsstats.html.5 | 4 +- docs/man/usbhid-ups.8 | 4 +- docs/man/victronups.8 | 4 +- docs/new-clients.txt | 6 +- docs/new-drivers.txt | 2 +- docs/nut-names.txt | 45 +- docs/website/Makefile.am | 2 +- docs/website/Makefile.in | 9 +- docs/website/css/web-layout.css | 5 + docs/website/news.txt | 4 + docs/website/projects.txt | 16 +- docs/website/web-layout.conf | 20 +- drivers/Makefile.am | 21 +- drivers/Makefile.in | 258 +- drivers/apc-mib.c | 56 +- drivers/apcsmart.c | 193 +- drivers/belkinunv.c | 1 - drivers/blazer_usb.c | 3 +- drivers/eaton-mib.c | 114 +- drivers/eaton-mib.h | 2 + drivers/macosx-ups.c | 440 +++ drivers/main.c | 2 +- drivers/masterguard.c | 2 - drivers/metasys.c | 2 - drivers/mge-utalk.c | 1 - drivers/microdowell.c | 2 - drivers/netxml-ups.c | 4 +- drivers/nut-ipmipsu.c | 8 +- drivers/nut-libfreeipmi.c | 215 +- drivers/oneac.h | 4 + drivers/powercom-hid.c | 2 +- drivers/safenet.c | 2 - drivers/skel.c | 5 +- drivers/snmp-ups.c | 67 +- drivers/snmp-ups.h | 7 +- drivers/tripplitesu.c | 1 - drivers/usbhid-ups.c | 15 +- drivers/usbhid-ups.h | 2 + include/Makefile.in | 7 + include/config.h.in | 6 + lib/Makefile.in | 7 + m4/nut_check_libfreeipmi.m4 | 8 + m4/nut_check_libltdl.m4 | 30 + scripts/Makefile.in | 7 + scripts/augeas/Makefile.in | 7 + scripts/hal/Makefile.in | 7 + scripts/hal/ups-nut-device.fdi.in | 9 +- scripts/hotplug/Makefile.in | 7 + scripts/hotplug/libhid.usermap | 4 +- scripts/java/Makefile.in | 7 + scripts/python/Makefile.in | 7 + scripts/systemd/Makefile.in | 7 + scripts/systemd/nut-driver.service.in | 4 +- scripts/systemd/nutshutdown.in | 2 +- scripts/udev/Makefile.in | 7 + scripts/udev/nut-usbups.rules.in | 4 +- server/Makefile.am | 4 +- server/Makefile.in | 19 +- server/conf.c | 2 +- server/netcmds.h | 2 +- server/{ssl.c => netssl.c} | 4 +- server/{ssl.h => netssl.h} | 2 +- server/upsd.c | 2 +- tests/Makefile.am | 21 + tests/Makefile.in | 698 ++++ tests/cpputest.cpp | 44 + tests/example.cpp | 62 + tools/Makefile.in | 7 + tools/nut-scanner/Makefile.in | 7 + tools/nut-scanner/nut-scanner.c | 31 +- tools/nut-scanner/nutscan-snmp.h | 3 + tools/nut-scanner/nutscan-usb.h | 1 + tools/nut-scanner/scan_ipmi.c | 58 +- 201 files changed, 7974 insertions(+), 709 deletions(-) delete mode 100644 docs/images/eaton-logo.png create mode 100644 docs/images/hostedby.png create mode 100644 docs/man/macosx-ups.8 create mode 100644 docs/man/macosx-ups.txt create mode 100644 drivers/macosx-ups.c rename server/{ssl.c => netssl.c} (98%) rename server/{ssl.h => netssl.h} (96%) create mode 100644 tests/Makefile.am create mode 100644 tests/Makefile.in create mode 100644 tests/cpputest.cpp create mode 100644 tests/example.cpp diff --git a/ChangeLog b/ChangeLog index 398ebcc..79f040f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,318 @@ +2012-08-08 Arnaud Quette + + * [r3712] NEWS, UPGRADING, configure.in, docs/website/news.txt: + Final update for 2.6.5 release + * [r3711] drivers: Subversion ignored files completion + + Mark oldmge-shut binary as Subversion ignored (no functional + changes) + * [r3710] docs/configure.txt, m4/nut_check_libltdl.m4: Complete + libltdl configuration options + + Add configure options to add specific cflags + (--with-libltdl-includes) and libs (--with-libltdl-libs) for + libltdl. This serves at least to point at non standard location, + as on FreeBSD (reported by David Durieux) + +2012-08-06 Arnaud Quette + + * [r3708] docs/documentation.txt: Add a Wikipedia reference on + Solar controller + * [r3707] docs/Makefile.am, docs/images/eaton-logo.png, + docs/images/hostedby.png, docs/website/Makefile.am, + docs/website/css/web-layout.css, docs/website/web-layout.conf: + Free NUT from Eaton website hosting + + NUT is no more hosted by Eaton. Arnaud Quette (NUT project + leader) has taken over NUT hosting on his own, to give NUT back + some independance. This effort is also part of a logic to stop + crediting Eaton for contributions from others (especially Arnaud + Quette, as an individual). The new hosting service is located, as + for Arnaud's blog (http://arnaud.quette.fr) on Gandi servers, + using PaaS. This will allow more flexibility and automation of + the release process + +2012-08-06 Charles Lepple + + * [r3704] configure.in, docs/man/Makefile.am, + docs/man/macosx-ups.txt, drivers/Makefile.am, + drivers/macosx-ups.c: macosx-ups: new OS X Power Sources + meta-driver + + Mac OS X provides UPS status information in a format similar to + what is shown for laptop batteries. This driver will convert that + information into a format compatible with NUT. + +2012-08-05 Charles Lepple + + * [r3703] drivers/skel.c: Update comments in skel.c + + Fixed a typo, and added fatalx() as an alternative to + fatal_with_errno() + * [r3702] docs/man/skel.txt: Update skeleton driver man page. + +2012-08-03 Charles Lepple + + * [r3701] docs/man/nutscan.txt, docs/man/nutscan_scan_avahi.txt: + nutscan documentation: editing + +2012-07-31 Arnaud Quette + + * [r3699] docs/images/simple.png: Remove extraneous text + * [r3698] data/driver.list.in: Add support for UNITEK Alpha650ipF + and Alpha650ipE + + Add UNITEK Alpha650ipF and Alpha650ipE (USB ID 0x0f03:0x0001) to + the list of blazer_usb supported models (reported by Pascal + MIRALLES) + * [r3697] docs/website/projects.txt: Reference Buffalo NAS in + Related projects + + Add a reference in the Related projects, on Buffalo TerraStation + (Business-class) NAS range, which uses NUT for power protection + +2012-07-30 Arnaud Quette + + * [r3696] docs/download.txt, docs/website/news.txt: First NUT + virtualization package (VMware ESXI 5.0) + + Add the reference to the first NUT virtualization package. This + one is currently an external effort to add VMware NUT client for + ESXI 5.0. But this support will be part of NUT in the long run + +2012-07-24 Charles Lepple + + * [r3692] data/driver.list.in, docs/man/powercom.txt, + drivers/powercom-hid.c: Synchronize Powercom USB documentation + and code comments. + + Apparently, there are at least two different models with the USB + VID:PID of 0d9f:0004. This update is based on the following + report by Gordon Longland: + + http://lists.alioth.debian.org/pipermail/nut-upsuser/2012-July/007748.html + +2012-07-23 Charles Lepple + + * [r3689] docs/man/powercom.txt: powercom: Mention this driver is + serial only + +2012-07-20 Frederic Bohe + + * [r3688] data/driver.list.in, drivers/Makefile.am: Switch mge-shut + to oldmge-shut and newmge-shut to mge-shut + * [r3687] docs/man/mge-shut.txt: Update mge-shut man page for + notification argument. + * [r3686] drivers/usbhid-ups.c: Add a "notification" parameter to + newmge-shut driver. + + It is only here for compatibility with mge-shut driver. It is + ignored since we are always using SHUT_SYNC_OFF in libshut.c. + +2012-07-19 Frederic Bohe + + * [r3683] docs/man/mge-shut.txt: Add a note in man page about + ondelay parameter unit discrepency between newmge-shut and + mge-shut driver. + + mge-shut use a ten seconds unit for ondelay whereas newmge-shut + uses seconds. + * [r3682] drivers/usbhid-ups.c, drivers/usbhid-ups.h: Add a lowbatt + setting to newmge-shut in order to mimic mge-shut setting + +2012-07-19 Emilien Kia + + * [r3681] server/Makefile.am, server/conf.c, server/netcmds.h, + server/netssl.c, server/netssl.h, server/ssl.c, server/ssl.h, + server/upsd.c: Replace server/ssl.[h|c] by server/netssl.[h|c] in + order to prepare nss branch merging. + +2012-07-17 Arnaud Quette + + * [r3678] drivers/apc-mib.c: APC SNMP MIB update and completion + + Add available high precision values, new variables + (input.transfer.reason, battery.current.total and ups.test.date), + and move ambient.{temperature,humidity}.{high,low} to + ambient.1.*, since they relate to alarm threshold of external + probe 1 (patch from Hong-Gunn Chew) + * [r3677] docs/nut-names.txt: Clarify the use of multiple ambient + sensors + + Multiple sensors can be exposed using the indexed notation. + 'ambient.*', without index or using '0', relates to the embedded + sensor. For example: 'ambient.temperature' represent the embedded + sensor temperature. Other sensors (external, communication card, + ...) can use indexes from '1' to 'n'. For example: + 'ambient.1.temperature' for the first external sensor + temperature. + * [r3676] docs/nut-names.txt: NUT namespace completion + + Add two new variables 'ups.test.date' and + 'battery.current.total'. Also add a note on the 'ambient' + collection for supporting multiple sensors + +2012-07-16 Arnaud Quette + + * [r3675] drivers/nut-ipmipsu.c, drivers/nut-libfreeipmi.c, + m4/nut_check_libfreeipmi.m4, tools/nut-scanner/nut-scanner.c, + tools/nut-scanner/scan_ipmi.c: Support for FreeIPMI 1.1.x and + 1.2.x + + Prepare for supporting API changes in FreeIPMI 1.1.x and 1.2.x. + This is mostly related to SDR API simplifications. A 2nd + iteration will probably address code redundancy, whenever + possible + +2012-07-10 Arnaud Quette + + * [r3674] data/driver.list.in, drivers/eaton-mib.c, + drivers/eaton-mib.h, drivers/snmp-ups.c, drivers/snmp-ups.h: Add + support for Eaton ePDU Switched (Pulizzi) + + Implement support for older Eaton / Powerware ePDU Switched. + These were once sold as Pulizzi, and have now been replaced by + newer model (Eaton Marlin implementation and others) + +2012-07-09 Emilien Kia + + * [r3672] configure.in: Fix CppUnit detection. + + Fix inconsistent test for CppUnit install (using pkg-config) to + really enable unit tests. + +2012-07-05 Arnaud Quette + + * [r3671] docs/man/nut-ipmipsu.txt: Fix an error on possible power + supplies status + +2012-07-04 Arnaud Quette + + * [r3670] clients/upssched.c: Fix upssched regression + + Coverity branch merge r3555 introduced a regression: any + upssched.conf command that takes a second argument resulted in a + defective frame sent to the parent process. Thus, the command was + not executed (patch from Oliver Schonefeld) + * [r3669] Makefile.am, configure.in, tests, tests/Makefile.am: Add + basic infrastructure for unit tests + + Merge eki-unittests branch, with some adjustments, to add a basic + initial infrastructure for unit tests, using CppUnit (v1.9.6+) + (from Emilien Kia, from Eaton) + +2012-07-03 Arnaud Quette + + * [r3668] scripts/systemd/nut-driver.service.in, + scripts/systemd/nutshutdown.in: Fix upsdrvctl call path + + upsdrvctl is located in @driverexecdir@, not @SBINDIR@ (reported + by Michal Hlavinka, from Redhat) + +2012-06-15 Arnaud Quette + + * [r3666] configure.in: Adapt systemd installation directory #2 + + Complete commit r3665, by also adapting paths for service files + +2012-06-14 Arnaud Quette + + * [r3665] configure.in: Adapt systemd installation directory + + Adapt systemd installation directory for the shutdown script, so + that it does not try to install it in the actual system + directory, but to the pointed build directory, including a sub + directory prefix + * [r3664] docs/new-clients.txt: Fix broken link to upscli_*(3) HTML + manual pages + +2012-06-12 Arnaud Quette + + * [r3662] docs/new-drivers.txt: Forgotten mention + + upsdrv_info_t->name is also published as "driver.name" variable + * [r3661] docs/man/belkinunv.txt, drivers/belkinunv.c, + drivers/main.c, drivers/masterguard.c, drivers/metasys.c, + drivers/mge-utalk.c, drivers/microdowell.c, + drivers/nut-ipmipsu.c, drivers/safenet.c, drivers/tripplitesu.c, + drivers/usbhid-ups.c: Remove redundant driver.version.internal + publication + * [r3660] configure.in, docs/configure.txt, + docs/man/nut-scanner.txt: Add missing references to libltdl for + nut-scanner + + nut-scanner requires libltdl (Libtool dlopen abstraction) since + NUT 2.6.3. Documentations have been completed, and nut-scanner + build status is now exposed in the build configuration summary + * [r3659] drivers/snmp-ups.c: Fix publication of + driver.version.data + + Publish the MIB name and version in driver.version.data, rather + than merged into driver.version.internal + * [r3658] drivers/netxml-ups.c: Fix publication of + driver.version.data + + netxml-ups subdriver version is to be tracked in + driver.version.data, not in driver.version.internal + * [r3657] docs/nut-names.txt: Add missing variable + driver.version.data + + Add variable driver.version.data, to track version of the + internal data mapping, for generic drivers (reported by Luiz + Angelo Daros de Luca) + * [r3656] docs/nut-names.txt: Fix comment for + driver.version.internal + + Drivers internal version are always tracked separately, and + stored in driver.version.internal + +2012-06-11 Michal Soltys + + * [r3655] drivers/apcsmart.c: apcsmart: tcsetattr/tcgetattr + addendum + + This small patch moves the comparison sequence into separate + function. No functional changes. + + Also minor retab! run on defines. + +2012-06-11 Arnaud Quette + + * [r3654] data/driver.list.in: Add support for REDi Blazer + + Add REDi Blazer 400VA / 600VA / 800VA to the list of blazer_ser + supported models (reported by Marius Gavrilescu) + * [r3653] docs/nut-names.txt: Fix a typo error on power.minimum + description + + power.minimum is really the minimum seen apparent power in VA + (reported by Luiz Angelo Daros de Luca) + +2012-06-07 Arnaud Quette + + * [r3652] data/driver.list.in, drivers/blazer_usb.c: Add support + for Online Zinto A + + Add Online Zinto A (USB ID 0x06da:0x0601) to the list of + blazer_usb supported models (reported by Carsten Burkhardt) + +2012-06-07 Charles Lepple + + * [r3651] drivers/oneac.h: Remove unused constants to fix LLVM + compilation error. + +2012-06-05 Arnaud Quette + + * [r3650] docs/website/news.txt, docs/website/projects.txt: WMNut + updates + + Update WMNut release (0.64) and hosting URL + +2012-06-04 Arnaud Quette + + * [r3647] docs/download.txt, docs/website/news.txt: Update Windows + package publications for 2.6.4-1 + 2012-05-31 Arnaud Quette * [r3643] NEWS, UPGRADING, configure.in, docs/website/news.txt: diff --git a/Makefile.am b/Makefile.am index f9e3cd9..4e95530 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ ACLOCAL_AMFLAGS = -I m4 # subdirectories to build and distribute. The order matters, as # several subdirectories depend on stuff in "common" or tools being built first SUBDIRS = include common clients conf data tools docs drivers \ - lib scripts server + lib scripts server tests # COPYING is included automatically. EXTRA_DIST = LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING diff --git a/Makefile.in b/Makefile.in index ac24401..ded4605 100644 --- a/Makefile.in +++ b/Makefile.in @@ -145,6 +145,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -248,6 +254,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -312,7 +319,7 @@ ACLOCAL_AMFLAGS = -I m4 # subdirectories to build and distribute. The order matters, as # several subdirectories depend on stuff in "common" or tools being built first SUBDIRS = include common clients conf data tools docs drivers \ - lib scripts server + lib scripts server tests # COPYING is included automatically. diff --git a/NEWS b/NEWS index 0fd98a7..606d0c2 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,55 @@ If you're upgrading from an earlier version, see the UPGRADING file. For a complete list of changes, please refer to the ChangeLog file. +--------------------------------------------------------------------------- +Release notes for NUT 2.6.5 - what's new since 2.6.4: + + - This release Fix an important regression in upssched: + any upssched.conf command that takes a second argument resulted in + a defective frame sent to the parent process. Thus, the command was + not executed (report and patch from Oliver Schonefeld) + + - Website hosting: free NUT from Eaton website hosting + NUT website (http://www.networkupstools.org) is no more hosted by Eaton. + Arnaud Quette (NUT project leader) has taken over NUT hosting on his own, + to give NUT back some independance. + This effort is also part of a logic to stop crediting Eaton for + contributions from others (especially Arnaud Quette, as an individual). + The new hosting service is located, as for Arnaud's blog + (http://arnaud.quette.fr) on Gandi servers, using PaaS. This will allow + more flexibility and automation of the release process + + - macosx-ups: new OS X Power Sources meta-driver + Mac OS X provides UPS status information in a format similar to + what is shown for laptop batteries. This driver will convert that + information into a format compatible with NUT (Charles Lepple). + + - support for new devices: + Eaton ePDU Switched + Online Zinto A (USB ID 0x06da:0x0601) + REDi Blazer 400VA / 600VA / 800VA + UNITEK Alpha650ipF and Alpha650ipE (USB ID 0x0f03:0x0001) + + - mge-shut driver has been replaced by a new implementation (newmge-shut). + In case of issue with this new version, users can revert to oldmge-shut. + + - First NUT virtualization package: NUT now supports integration with + VMware ESXI 5.0, through a native VIB package. This is, for the time + being, an external effort from René Garcia (refer to the Download section + on NUT website). But work is underway to improve this integration, and + include it in the NUT source tree + + - IPMI support (nut-ipmipsu driver and nut-scanner): prepare for supporting + API changes in upcoming FreeIPMI versions 1.1.x and 1.2.x. + + - snmp-ups now supports high precision values for APC, and more variables + + - the NUT variables and commands namespace has been fixed and + completed, with the known and used variables that were missing. + + - more bugfixes, cleanup and improvements, on both source code and + documentation. + --------------------------------------------------------------------------- Release notes for NUT 2.6.4 - what's new since 2.6.3: @@ -168,10 +217,10 @@ Release notes for NUT 2.6.3 - what's new since 2.6.2: progress. - Compilation on IBM Aix has been fixed (namespace conflict with ctypes). - + - more bugfixes, cleanup and improvements, on both source code and documentation. - + --------------------------------------------------------------------------- Release notes for NUT 2.6.2 - what's new since 2.6.1: diff --git a/UPGRADING b/UPGRADING index d00143d..d748583 100644 --- a/UPGRADING +++ b/UPGRADING @@ -7,11 +7,19 @@ This file lists changes that affect users who installed older versions of this software. When upgrading from an older version, be sure to check this file to see if you need to make changes to your system. +Changes from 2.6.4 to 2.6.5 +--------------------------- + +- users are encouraged to update to NUT 2.6.5, to fix a regression in +upssched. +- mge-shut driver has been replaced by a new implementation (newmge-shut). +In case of issue with this new version, users can revert to oldmge-shut. + Changes from 2.6.3 to 2.6.4 --------------------------- - users are encouraged to update to NUT 2.6.4, to fix upsd vulnerability -(CVE-2012-2944: upsd can be remotely crashed) +(CVE-2012-2944: upsd can be remotely crashed). - users of the bestups driver are encouraged to switch to blazer_ser, since bestups will soon be deprecated. diff --git a/clients/Makefile.in b/clients/Makefile.in index 48e0dae..65fd3f2 100644 --- a/clients/Makefile.in +++ b/clients/Makefile.in @@ -204,6 +204,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -307,6 +313,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/clients/upssched.c b/clients/upssched.c index 675a3d0..97b3ed4 100644 --- a/clients/upssched.c +++ b/clients/upssched.c @@ -694,7 +694,7 @@ static void sendcmd(const char *cmd, const char *arg1, const char *arg2) snprintfcat(buf, sizeof(buf), " \"%s\"", pconf_encode(arg2, enc, sizeof(enc))); - snprintfcat(enc, sizeof(enc), "%s\n", buf); + snprintf(enc, sizeof(enc), "%s\n", buf); /* see if the parent needs to be started (and maybe start it) */ diff --git a/common/Makefile.in b/common/Makefile.in index 9ccd162..541366c 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -110,6 +110,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -213,6 +219,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/conf/Makefile.in b/conf/Makefile.in index be4cd06..41bd2ed 100644 --- a/conf/Makefile.in +++ b/conf/Makefile.in @@ -115,6 +115,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -218,6 +224,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/configure b/configure index 68b465c..cb2801d 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for nut 2.6.4. +# Generated by GNU Autoconf 2.68 for nut 2.6.5. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -567,8 +567,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='nut' PACKAGE_TARNAME='nut' -PACKAGE_VERSION='2.6.4' -PACKAGE_STRING='nut 2.6.4' +PACKAGE_VERSION='2.6.5' +PACKAGE_STRING='nut 2.6.5' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -674,15 +674,13 @@ WITH_HOTPLUG_FALSE WITH_HOTPLUG_TRUE HAVE_SYSTEMD_FALSE HAVE_SYSTEMD_TRUE -PKG_CONFIG_LIBDIR -PKG_CONFIG_PATH -PKG_CONFIG WITH_PKG_CONFIG_FALSE WITH_PKG_CONFIG_TRUE SOME_DRIVERS_FALSE SOME_DRIVERS_TRUE WITH_DEV_FALSE WITH_DEV_TRUE +CXXCPP OTOOL64 OTOOL LIPO @@ -717,6 +715,8 @@ WITH_WRAP_FALSE WITH_WRAP_TRUE WITH_SSL_FALSE WITH_SSL_TRUE +WITH_MACOSX_FALSE +WITH_MACOSX_TRUE WITH_FREEIPMI_FALSE WITH_FREEIPMI_TRUE WITH_IPMI_FALSE @@ -733,9 +733,22 @@ WITH_USB_FALSE WITH_USB_TRUE WITH_SERIAL_FALSE WITH_SERIAL_TRUE +HAVE_CPPUNIT_FALSE +HAVE_CPPUNIT_TRUE +CPPUNIT_LIBS +CPPUNIT_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG LIBOBJS RANLIB AR +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE @@ -866,11 +879,14 @@ with_ipmi with_freeipmi with_freeipmi_includes with_freeipmi_libs +with_macosx_ups with_ssl with_ssl_includes with_ssl_libs with_wrap with_libltdl +with_libltdl_includes +with_libltdl_libs with_cgi with_gd_includes with_gd_libs @@ -907,9 +923,15 @@ LDFLAGS LIBS CPPFLAGS CPP +CXX +CXXFLAGS +CCC PKG_CONFIG PKG_CONFIG_PATH -PKG_CONFIG_LIBDIR' +PKG_CONFIG_LIBDIR +CPPUNIT_CFLAGS +CPPUNIT_LIBS +CXXCPP' # Initialize some variables set by options. @@ -1452,7 +1474,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures nut 2.6.4 to adapt to many kinds of systems. +\`configure' configures nut 2.6.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1523,7 +1545,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of nut 2.6.4:";; + short | recursive ) echo "Configuration of nut 2.6.5:";; esac cat <<\_ACEOF @@ -1589,6 +1611,8 @@ Optional Packages: include flags for the FreeIPMI library [--with-freeipmi-libs=LIBS] linker flags for the FreeIPMI library + --with-macosx_ups build and install Mac OS X Power Sources meta-driver + (auto) --with-ssl enable SSL development code (auto) [--with-ssl-includes=CFLAGS] include flags for the OpenSSL library @@ -1596,6 +1620,10 @@ Optional Packages: --with-wrap enable libwrap (tcp-wrappers) support (auto) --with-libltdl enable libltdl (Libtool dlopen abstraction) support (auto) + [--with-libltdl-includes=CFLAGS] + include flags for the libltdl library + [--with-libltdl-libs=LIBS] + linker flags for the libltdl library --with-cgi build and install the CGI programs (no) [--with-gd-includes=CFLAGS] include flags for the gd library @@ -1637,11 +1665,18 @@ Some influential environment variables: CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path + CPPUNIT_CFLAGS + C compiler flags for CPPUNIT, overriding pkg-config + CPPUNIT_LIBS + linker flags for CPPUNIT, overriding pkg-config + CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1709,7 +1744,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -nut configure 2.6.4 +nut configure 2.6.5 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -1958,6 +1993,44 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_header_compile +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. @@ -2170,11 +2243,94 @@ $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by nut $as_me 2.6.4, which was +It was created by nut $as_me 2.6.5, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -3244,7 +3400,7 @@ fi # Define the identity of the package. PACKAGE='nut' - VERSION='2.6.4' + VERSION='2.6.5' cat >>confdefs.h <<_ACEOF @@ -5734,6 +5890,390 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } @@ -6530,6 +7070,212 @@ fi + + + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CPPUNIT" >&5 +$as_echo_n "checking for CPPUNIT... " >&6; } + +if test -n "$CPPUNIT_CFLAGS"; then + pkg_cv_CPPUNIT_CFLAGS="$CPPUNIT_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cppunit\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cppunit") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CPPUNIT_CFLAGS=`$PKG_CONFIG --cflags "cppunit" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$CPPUNIT_LIBS"; then + pkg_cv_CPPUNIT_LIBS="$CPPUNIT_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cppunit\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cppunit") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CPPUNIT_LIBS=`$PKG_CONFIG --libs "cppunit" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + CPPUNIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cppunit" 2>&1` + else + CPPUNIT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cppunit" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$CPPUNIT_PKG_ERRORS" >&5 + + have_cppunit=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_cppunit=no +else + CPPUNIT_CFLAGS=$pkg_cv_CPPUNIT_CFLAGS + CPPUNIT_LIBS=$pkg_cv_CPPUNIT_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_cppunit=yes +fi +if test "${have_cppunit}" != "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libcppunit not found." >&5 +$as_echo "$as_me: WARNING: libcppunit not found." >&2;} +fi + if test "${have_cppunit}" = "yes"; then + HAVE_CPPUNIT_TRUE= + HAVE_CPPUNIT_FALSE='#' +else + HAVE_CPPUNIT_TRUE='#' + HAVE_CPPUNIT_FALSE= +fi + + if ( test "${GCC}" = "yes" ) then CFLAGS="${CFLAGS} -Wall -Wsign-compare" @@ -8740,6 +9486,121 @@ else fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ipmi_sdr_cache_ctx_destroy" >&5 +$as_echo_n "checking for library containing ipmi_sdr_cache_ctx_destroy... " >&6; } +if ${ac_cv_search_ipmi_sdr_cache_ctx_destroy+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ipmi_sdr_cache_ctx_destroy (); +int +main () +{ +return ipmi_sdr_cache_ctx_destroy (); + ; + return 0; +} +_ACEOF +for ac_lib in '' freeipmi; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_ipmi_sdr_cache_ctx_destroy=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_ipmi_sdr_cache_ctx_destroy+:} false; then : + break +fi +done +if ${ac_cv_search_ipmi_sdr_cache_ctx_destroy+:} false; then : + +else + ac_cv_search_ipmi_sdr_cache_ctx_destroy=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ipmi_sdr_cache_ctx_destroy" >&5 +$as_echo "$ac_cv_search_ipmi_sdr_cache_ctx_destroy" >&6; } +ac_res=$ac_cv_search_ipmi_sdr_cache_ctx_destroy +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + nut_have_freeipmi_11x_12x=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ipmi_sdr_ctx_destroy" >&5 +$as_echo_n "checking for library containing ipmi_sdr_ctx_destroy... " >&6; } +if ${ac_cv_search_ipmi_sdr_ctx_destroy+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ipmi_sdr_ctx_destroy (); +int +main () +{ +return ipmi_sdr_ctx_destroy (); + ; + return 0; +} +_ACEOF +for ac_lib in '' freeipmi; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_ipmi_sdr_ctx_destroy=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_ipmi_sdr_ctx_destroy+:} false; then : + break +fi +done +if ${ac_cv_search_ipmi_sdr_ctx_destroy+:} false; then : + +else + ac_cv_search_ipmi_sdr_ctx_destroy=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ipmi_sdr_ctx_destroy" >&5 +$as_echo "$ac_cv_search_ipmi_sdr_ctx_destroy" >&6; } +ac_res=$ac_cv_search_ipmi_sdr_ctx_destroy +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + nut_have_freeipmi_11x_12x=yes +else + nut_have_freeipmi_11x_12x=no +fi + + if test "${nut_have_freeipmi}" = "yes"; then nut_with_ipmi="yes" nut_ipmi_lib="(FreeIPMI)" @@ -8751,6 +9612,12 @@ $as_echo "#define HAVE_FREEIPMI 1" >>confdefs.h LIBIPMI_LIBS="${LIBS}" fi + if test "${nut_have_freeipmi_11x_12x}" = "yes"; then + +$as_echo "#define HAVE_FREEIPMI_11X_12X 1" >>confdefs.h + + fi + if test "${nut_have_freeipmi_monitoring}" = "yes"; then $as_echo "#define HAVE_FREEIPMI_MONITORING 1" >>confdefs.h @@ -9149,6 +10016,121 @@ else fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ipmi_sdr_cache_ctx_destroy" >&5 +$as_echo_n "checking for library containing ipmi_sdr_cache_ctx_destroy... " >&6; } +if ${ac_cv_search_ipmi_sdr_cache_ctx_destroy+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ipmi_sdr_cache_ctx_destroy (); +int +main () +{ +return ipmi_sdr_cache_ctx_destroy (); + ; + return 0; +} +_ACEOF +for ac_lib in '' freeipmi; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_ipmi_sdr_cache_ctx_destroy=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_ipmi_sdr_cache_ctx_destroy+:} false; then : + break +fi +done +if ${ac_cv_search_ipmi_sdr_cache_ctx_destroy+:} false; then : + +else + ac_cv_search_ipmi_sdr_cache_ctx_destroy=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ipmi_sdr_cache_ctx_destroy" >&5 +$as_echo "$ac_cv_search_ipmi_sdr_cache_ctx_destroy" >&6; } +ac_res=$ac_cv_search_ipmi_sdr_cache_ctx_destroy +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + nut_have_freeipmi_11x_12x=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ipmi_sdr_ctx_destroy" >&5 +$as_echo_n "checking for library containing ipmi_sdr_ctx_destroy... " >&6; } +if ${ac_cv_search_ipmi_sdr_ctx_destroy+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ipmi_sdr_ctx_destroy (); +int +main () +{ +return ipmi_sdr_ctx_destroy (); + ; + return 0; +} +_ACEOF +for ac_lib in '' freeipmi; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_ipmi_sdr_ctx_destroy=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_ipmi_sdr_ctx_destroy+:} false; then : + break +fi +done +if ${ac_cv_search_ipmi_sdr_ctx_destroy+:} false; then : + +else + ac_cv_search_ipmi_sdr_ctx_destroy=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ipmi_sdr_ctx_destroy" >&5 +$as_echo "$ac_cv_search_ipmi_sdr_ctx_destroy" >&6; } +ac_res=$ac_cv_search_ipmi_sdr_ctx_destroy +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + nut_have_freeipmi_11x_12x=yes +else + nut_have_freeipmi_11x_12x=no +fi + + if test "${nut_have_freeipmi}" = "yes"; then nut_with_ipmi="yes" nut_ipmi_lib="(FreeIPMI)" @@ -9160,6 +10142,12 @@ $as_echo "#define HAVE_FREEIPMI 1" >>confdefs.h LIBIPMI_LIBS="${LIBS}" fi + if test "${nut_have_freeipmi_11x_12x}" = "yes"; then + +$as_echo "#define HAVE_FREEIPMI_11X_12X 1" >>confdefs.h + + fi + if test "${nut_have_freeipmi_monitoring}" = "yes"; then $as_echo "#define HAVE_FREEIPMI_MONITORING 1" >>confdefs.h @@ -9230,6 +10218,57 @@ fi +# Check whether --with-macosx_ups was given. +if test "${with_macosx_ups+set}" = set; then : + withval=$with_macosx_ups; nut_with_macosx_ups="${withval}" +else + nut_with_macosx_ups="auto" + +fi + + +if test "${nut_with_macosx_ups}" != no; then + if test -d /System/Library/Frameworks/IOKit.framework/ ; then + nut_with_macosx_ups="yes" + else + nut_with_macosx_ups="no" + fi +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build Mac OS X meta-driver" >&5 +$as_echo_n "checking whether to build Mac OS X meta-driver... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${nut_with_macosx_ups} ${nut_macosx_ups_lib}" >&5 +$as_echo "${nut_with_macosx_ups} ${nut_macosx_ups_lib}" >&6; } + if test -z "${nut_report_feature_flag}"; then + nut_report_feature_flag="1" + ac_clean_files="${ac_clean_files} conf_nut_report_feature" + echo > conf_nut_report_feature + echo "Configuration summary:" >> conf_nut_report_feature + echo "======================" >> conf_nut_report_feature + fi + echo "build Mac OS X meta-driver: ${nut_with_macosx_ups} ${nut_macosx_ups_lib}" >> conf_nut_report_feature + + + if test "${nut_with_macosx_ups}" = "yes"; then + WITH_MACOSX_TRUE= + WITH_MACOSX_FALSE='#' +else + WITH_MACOSX_TRUE='#' + WITH_MACOSX_FALSE= +fi + + if test "${nut_with_macosx_ups}" = "yes"; then + +cat >>confdefs.h <<_ACEOF +#define WITH_MACOSX 1 +_ACEOF + + fi + + + + # Check whether --with-ssl was given. if test "${with_ssl+set}" = set; then : withval=$with_ssl; nut_with_ssl="${withval}" @@ -9610,6 +10649,46 @@ if test -z "${nut_have_libltdl_seen}"; then LIBS_ORIG="${LIBS}" LIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libltdl cflags" >&5 +$as_echo_n "checking for libltdl cflags... " >&6; } + +# Check whether --with-libltdl-includes was given. +if test "${with_libltdl_includes+set}" = set; then : + withval=$with_libltdl_includes; + case "${withval}" in + yes|no) + as_fn_error $? "invalid option --with(out)-libltdl-includes - see docs/configure.txt" "$LINENO" 5 + ;; + *) + CFLAGS="${withval}" + ;; + esac + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CFLAGS}" >&5 +$as_echo "${CFLAGS}" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libltdl ldflags" >&5 +$as_echo_n "checking for libltdl ldflags... " >&6; } + +# Check whether --with-libltdl-libs was given. +if test "${with_libltdl_libs+set}" = set; then : + withval=$with_libltdl_libs; + case "${withval}" in + yes|no) + as_fn_error $? "invalid option --with(out)-libltdl-libs - see docs/configure.txt" "$LINENO" 5 + ;; + *) + LIBS="${withval}" + ;; + esac + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${LIBS}" >&5 +$as_echo "${LIBS}" >&6; } + for ac_header in ltdl.h do : ac_fn_c_check_header_compile "$LINENO" "ltdl.h" "ac_cv_header_ltdl_h" "$ac_includes_default @@ -9737,6 +10816,16 @@ _ACEOF fi + if test -z "${nut_report_feature_flag}"; then + nut_report_feature_flag="1" + ac_clean_files="${ac_clean_files} conf_nut_report_feature" + echo > conf_nut_report_feature + echo "Configuration summary:" >> conf_nut_report_feature + echo "======================" >> conf_nut_report_feature + fi + echo "build nut-scanner: ${nut_with_libltdl}" >> conf_nut_report_feature + + # Check whether --with-cgi was given. @@ -13594,6 +14683,17 @@ done +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + + + # Set options @@ -17571,6 +18671,3212 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + @@ -18218,9 +22524,10 @@ if test "${with_systemdsystemunitdir+set}" = set; then : fi if test -n "${systemdsystemunitdir}"; then - systemdsystemshutdowndir="/lib/systemd/system-shutdown" + systemdsystemshutdowndir="${libdir}/systemd/system-shutdown" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ${systemdsystemunitdir}" >&5 $as_echo "using ${systemdsystemunitdir}" >&6; } + systemdsystemunitdir="`echo ${systemdsystemunitdir} | sed 's/\/lib/\${libdir}/'`" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -18513,7 +22820,7 @@ _ACEOF -ac_config_files="$ac_config_files clients/Makefile common/Makefile conf/Makefile conf/upssched.conf.sample data/html/header.html data/html/Makefile data/Makefile data/driver.list docs/Makefile docs/man/Makefile docs/website/Makefile drivers/Makefile include/Makefile lib/libupsclient-config lib/libupsclient.pc lib/libnutscan.pc lib/Makefile scripts/augeas/Makefile scripts/augeas/nutnutconf.aug scripts/augeas/nutupsconf.aug scripts/augeas/nutupsdconf.aug scripts/augeas/nutupsdusers.aug scripts/augeas/nutupsmonconf.aug scripts/augeas/nutupsschedconf.aug scripts/augeas/nuthostsconf.aug scripts/augeas/nutupssetconf.aug scripts/avahi/nut.service scripts/hal/Makefile scripts/hal/ups-nut-device.fdi scripts/hotplug/Makefile scripts/hotplug/libhidups scripts/HP-UX/nut.psf scripts/java/Makefile scripts/python/Makefile scripts/systemd/Makefile scripts/systemd/nut-driver.service scripts/systemd/nut-monitor.service scripts/systemd/nut-server.service scripts/systemd/nutshutdown scripts/udev/Makefile scripts/udev/nut-ipmipsu.rules scripts/udev/nut-usbups.rules scripts/ufw/nut.ufw.profile scripts/Makefile server/Makefile tools/Makefile tools/nut-scanner/Makefile Makefile" +ac_config_files="$ac_config_files clients/Makefile common/Makefile conf/Makefile conf/upssched.conf.sample data/html/header.html data/html/Makefile data/Makefile data/driver.list docs/Makefile docs/man/Makefile docs/website/Makefile drivers/Makefile include/Makefile lib/libupsclient-config lib/libupsclient.pc lib/libnutscan.pc lib/Makefile scripts/augeas/Makefile scripts/augeas/nutnutconf.aug scripts/augeas/nutupsconf.aug scripts/augeas/nutupsdconf.aug scripts/augeas/nutupsdusers.aug scripts/augeas/nutupsmonconf.aug scripts/augeas/nutupsschedconf.aug scripts/augeas/nuthostsconf.aug scripts/augeas/nutupssetconf.aug scripts/avahi/nut.service scripts/hal/Makefile scripts/hal/ups-nut-device.fdi scripts/hotplug/Makefile scripts/hotplug/libhidups scripts/HP-UX/nut.psf scripts/java/Makefile scripts/python/Makefile scripts/systemd/Makefile scripts/systemd/nut-driver.service scripts/systemd/nut-monitor.service scripts/systemd/nut-server.service scripts/systemd/nutshutdown scripts/udev/Makefile scripts/udev/nut-ipmipsu.rules scripts/udev/nut-usbups.rules scripts/ufw/nut.ufw.profile scripts/Makefile server/Makefile tools/Makefile tools/nut-scanner/Makefile tests/Makefile Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -18648,7 +22955,15 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPPUNIT_TRUE}" && test -z "${HAVE_CPPUNIT_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPPUNIT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${WITH_SERIAL_TRUE}" && test -z "${WITH_SERIAL_FALSE}"; then as_fn_error $? "conditional \"WITH_SERIAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -18681,6 +22996,10 @@ if test -z "${WITH_FREEIPMI_TRUE}" && test -z "${WITH_FREEIPMI_FALSE}"; then as_fn_error $? "conditional \"WITH_FREEIPMI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${WITH_MACOSX_TRUE}" && test -z "${WITH_MACOSX_FALSE}"; then + as_fn_error $? "conditional \"WITH_MACOSX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${WITH_SSL_TRUE}" && test -z "${WITH_SSL_FALSE}"; then as_fn_error $? "conditional \"WITH_SSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -19154,7 +23473,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by nut $as_me 2.6.4, which was +This file was extended by nut $as_me 2.6.5, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -19220,7 +23539,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -nut config.status 2.6.4 +nut config.status 2.6.5 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" @@ -19479,6 +23798,61 @@ enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_sub enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' @@ -19557,7 +23931,39 @@ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ -striplib; do +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" @@ -19587,7 +23993,18 @@ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" @@ -19618,6 +24035,8 @@ fi + + _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 @@ -19676,6 +24095,7 @@ do "server/Makefile") CONFIG_FILES="$CONFIG_FILES server/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; "tools/nut-scanner/Makefile") CONFIG_FILES="$CONFIG_FILES tools/nut-scanner/Makefile" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; @@ -20417,7 +24837,7 @@ $as_echo X"$file" | # The names of the tagged configurations supported by this script. -available_tags="" +available_tags="CXX " # ### BEGIN LIBTOOL CONFIG @@ -20805,6 +25225,20 @@ file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + # ### END LIBTOOL CONFIG _LT_EOF @@ -20997,6 +25431,163 @@ fi (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + ;; esac diff --git a/configure.in b/configure.in index 2bcf7df..ed2d3e8 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ dnl | Network UPS Tools: configure.in | dnl +------------------------------------------------------------------+ dnl NUT version number is defined here and *only* here (no more include/version) -AC_INIT(nut, 2.6.4) +AC_INIT(nut, 2.6.5) AC_CONFIG_SRCDIR(server/upsd.c) AC_CONFIG_MACRO_DIR([m4]) echo "Network UPS Tools version ${PACKAGE_VERSION}" @@ -89,6 +89,7 @@ AC_PROG_CC dnl Needed for per-target flags AM_PROG_CC_C_O AC_PROG_CPP +AC_PROG_CXX AC_PROG_INSTALL AC_PROG_EGREP AC_PATH_PROG(AR, ar) @@ -113,6 +114,19 @@ AC_CHECK_FUNCS(vsnprintf snprintf, [], [ AC_REPLACE_FUNCS(setenv strerror atexit) + +dnl +dnl Tests for CppUnit availability and usability +dnl Using CppUnit implies C++ support! +dnl Theoretically, libcppunit-dev will pull up to g++, through libstdc++... +dnl AM_PATH_CPPUNIT(1.9.6) + +PKG_CHECK_MODULES(CPPUNIT, cppunit, have_cppunit=yes, have_cppunit=no) +if test "${have_cppunit}" != "yes" ; then + AC_MSG_WARN([libcppunit not found.]) +fi +AM_CONDITIONAL(HAVE_CPPUNIT, test "${have_cppunit}" = "yes") + dnl dnl Only use these when compiling with gcc dnl @@ -415,6 +429,25 @@ AM_CONDITIONAL(WITH_FREEIPMI, test "${nut_with_freeipmi}" = "yes") dnl AM_CONDITIONAL(WITH_OPENIPMI, test "${nut_with_openipmi}" = "yes") +dnl ---------------------------------------------------------------------- +dnl The Mac OS X meta-driver looks at IOKit Power Sources keys managed by +dnl the internal USB UPS driver. +dnl +dnl FIXME: be slightly more clever here: + +NUT_ARG_WITH([macosx_ups], [build and install Mac OS X Power Sources meta-driver], [auto]) +if test "${nut_with_macosx_ups}" != no; then + if test -d /System/Library/Frameworks/IOKit.framework/ ; then + nut_with_macosx_ups="yes" + else + nut_with_macosx_ups="no" + fi +fi + +NUT_REPORT_FEATURE([build Mac OS X meta-driver], + [${nut_with_macosx_ups}], [${nut_macosx_ups_lib}], + [WITH_MACOSX], [Define to enable Mac OS X meta-driver]) + dnl ---------------------------------------------------------------------- dnl Check for --with-ssl @@ -482,6 +515,10 @@ fi NUT_REPORT_FEATURE([enable libltdl (Libtool dlopen abstraction) support], [${nut_with_libltdl}], [], [WITH_LIBLTDL], [Define to enable libltdl (Libtool dlopen abstraction) support]) +dnl Explicitely report if we are building nut-scanner or not +dnl since it requires libltdl +NUT_REPORT([build nut-scanner], [${nut_with_libltdl}]) + dnl ---------------------------------------------------------------------- dnl checks related to --with-cgi @@ -945,9 +982,13 @@ AC_ARG_WITH([systemdsystemunitdir], ;; esac ], []) +dnl Override installation directory, with the local installation +dnl prefix. This is needed for 'distcheck*' targets, otherwise +dnl files will try to get intalled to the actual system directories if test -n "${systemdsystemunitdir}"; then - systemdsystemshutdowndir="/lib/systemd/system-shutdown" + systemdsystemshutdowndir="${libdir}/systemd/system-shutdown" AC_MSG_RESULT(using ${systemdsystemunitdir}) + systemdsystemunitdir="`echo ${systemdsystemunitdir} | sed 's/\/lib/\${libdir}/'`" else AC_MSG_RESULT(no) fi @@ -1143,6 +1184,7 @@ AC_OUTPUT([ server/Makefile tools/Makefile tools/nut-scanner/Makefile + tests/Makefile Makefile ]) diff --git a/data/Makefile.in b/data/Makefile.in index 0bd3feb..345e102 100644 --- a/data/Makefile.in +++ b/data/Makefile.in @@ -151,6 +151,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -254,6 +260,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/data/driver.list.in b/data/driver.list.in index b305b92..64d1815 100644 --- a/data/driver.list.in +++ b/data/driver.list.in @@ -199,16 +199,16 @@ "Cyclades" "pdu" "1" "PM8" "8 outlets" "powerman-pdu (experimental)" "Cyclades" "pdu" "1" "PM10" "10 outlets" "powerman-pdu (experimental)" -"Dell" "ups" "5" "Tower 500W LV / HV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack/Tower 1000W LV / HV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack/Tower 1500W LV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack/Tower 1920W LV / HV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack/Tower 2300W LV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack/Tower 2700W LV / HV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Short Depth Rack 2700W Online LV / HV" "High Efficiency, Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack 3750W High Efficiency Online HV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack 4200W High Efficiency Online HV" "Serial port" "newmge-shut" -"Dell" "ups" "5" "Rack 5600W HV" "Serial port" "newmge-shut" +"Dell" "ups" "5" "Tower 500W LV / HV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Rack/Tower 1000W LV / HV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Rack/Tower 1500W LV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Rack/Tower 1920W LV / HV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Rack/Tower 2300W LV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Rack/Tower 2700W LV / HV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Short Depth Rack 2700W Online LV / HV" "High Efficiency, Serial port" "mge-shut" +"Dell" "ups" "5" "Rack 3750W High Efficiency Online HV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Rack 4200W High Efficiency Online HV" "Serial port" "mge-shut" +"Dell" "ups" "5" "Rack 5600W HV" "Serial port" "mge-shut" "Dell" "ups" "5" "Tower 500W LV / HV" "USB port" "usbhid-ups" "Dell" "ups" "5" "Rack/Tower 1000W LV / HV" "USB port" "usbhid-ups" "Dell" "ups" "5" "Rack/Tower 1500W LV" "USB port" "usbhid-ups" @@ -251,17 +251,17 @@ "Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "USB port" "usbhid-ups" "Eaton" "ups" "5" "5 PX" "USB port" "usbhid-ups" "Eaton" "ups" "5" "Nova AVR 625/1250" "USB" "usbhid-ups" -"Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "EX 700/1000/1500 VA" "Serial port" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "Serial port" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "Serial port" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "5 PX" "Serial port" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "EX RT 1:1 7/11 kVA" "" "mge-shut or newmge-shut" -"Eaton" "ups" "5" "EX RT 3:1 5/7/11 kVA" "" "mge-shut or newmge-shut" +"Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "EX 700/1000/1500 VA" "Serial port" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "Serial port" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "Serial port" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "5 PX" "Serial port" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "EX RT 1:1 7/11 kVA" "" "mge-shut or oldmge-shut" +"Eaton" "ups" "5" "EX RT 3:1 5/7/11 kVA" "" "mge-shut or oldmge-shut" "Eaton" "ups" "5" "EX RT (XML/HTTP)" "NMC Transverse card (ref 66074)" "netxml-ups (experimental)" "Eaton" "ups" "5" "EX RT (SNMP)" "NMC Transverse card (ref 66074)" "snmp-ups (experimental)" "Eaton" "ups" "5" "E Series NV UPS 400-2000 VA" "" "blazer_usb" @@ -273,7 +273,8 @@ "Eaton" "ups" "5" "various models (XML/HTTP mode)" "SNMP/Web Minislot card (ref 66244)" "netxml-ups (experimental)" "Eaton" "ups" "5" "various models (SNMP mode)" "SNMP/Web Minislot card (ref 66244)" "snmp-ups (experimental)" "Eaton" "ups" "5" "various models (serial mode)" "Management Card Contact (ref 66104)" "mge-shut or mge-utalk" -"Eaton" "pdu" "5" "ePDU Managed" "" "snmp-ups (experimental)" +"Eaton" "pdu" "5" "ePDU Managed" "" "snmp-ups" +"Eaton" "pdu" "5" "ePDU Switched" "" "snmp-ups" "Eaton" "pdu" "5" "ePDU Monitored" "" "snmp-ups or netxml-ups" "Eaton" "ups" "5" "Powerware 9130" "" "bcmxcp or usbhid-ups" "Eaton" "ups" "5" "Powerware 9140" "" "bcmxcp or usbhid-ups" @@ -353,8 +354,8 @@ "HP" "ups" "4" "R3000 XR" "" "bcmxcp" "HP" "ups" "4" "R5500 XR" "" "bcmxcp" "HP" "ups" "3" "T500 / T750" "older models, USB port" "bcmxcp_usb" -"HP" "ups" "3" "R/T3000" "Serial port" "mge-shut or newmge-shut" -"HP" "ups" "3" "R5000 / R7000" "Serial port" "mge-shut or newmge-shut" +"HP" "ups" "3" "R/T3000" "Serial port" "mge-shut or oldmge-shut" +"HP" "ups" "3" "R5000 / R7000" "Serial port" "mge-shut or oldmge-shut" "HP" "ups" "3" "T750 INTL" "" "usbhid-ups" "HP" "ups" "3" "T1000 INTL" "" "usbhid-ups" "HP" "ups" "3" "T1500 INTL" "" "usbhid-ups" @@ -492,15 +493,15 @@ "MGE Office Protection Systems" "ups" "5" "Pulsar 700/1000/1500 VA" "USB port" "usbhid-ups" "MGE Office Protection Systems" "ups" "5" "Pulsar M 2200/3000 VA" "USB port" "usbhid-ups" "MGE Office Protection Systems" "ups" "5" "Pulsar MX 5/8/10/15/20 kVA" "USB port" "usbhid-ups" -"MGE Office Protection Systems" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Pulsar 700/1000/1500 VA" "Serial port" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Pulsar M 2200/3000 VA" "Serial port" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Pulsar MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Comet EX RT 1:1 7/11 kVA" "" "mge-shut or newmge-shut" -"MGE Office Protection Systems" "ups" "5" "Comet EX RT 3:1 5/7/11 kVA" "" "mge-shut or newmge-shut" +"MGE Office Protection Systems" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Pulsar 700/1000/1500 VA" "Serial port" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Pulsar M 2200/3000 VA" "Serial port" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Pulsar MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Comet EX RT 1:1 7/11 kVA" "" "mge-shut or oldmge-shut" +"MGE Office Protection Systems" "ups" "5" "Comet EX RT 3:1 5/7/11 kVA" "" "mge-shut or oldmge-shut" "MGE Office Protection Systems" "ups" "5" "Comet EX RT (XML/HTTP)" "NMC Transverse card (ref 66074)" "netxml-ups (experimental)" "MGE Office Protection Systems" "ups" "5" "Comet EX RT (SNMP)" "NMC Transverse card (ref 66074)" "snmp-ups (experimental)" "MGE Office Protection Systems" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (Ref 66102)" "netxml-ups (experimental)" @@ -548,45 +549,45 @@ "MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 4000 RT" "USB" "usbhid-ups" "MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 5000 RT" "USB" "usbhid-ups" "MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (USB)" "USB Card (ref 66067)" "usbhid-ups" -"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 600 Serial" "" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 1100 Serial" "" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse USBS" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse S" "" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium USBS" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium S" "" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 600" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 750" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1000" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1500" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 600" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 850" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1100" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1500" "Serial cable" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C / EX RT" "" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT 3:1" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar Esprit" "" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution 650" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution 850" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution 1150" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1250" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution 1550" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1750" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution 2000" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution S 2500" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Evolution S 3000" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 2200" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000 XL" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar 700" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000 RT2U" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500 RT2U" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 4000 RT" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 5000 RT" "Serial port" "mge-shut or newmge-shut" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar Evolution" "Serial port" "mge-shut or newmge-shut or mge-utalk" -"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C" "" "mge-shut or newmge-shut or mge-utalk" +"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 600 Serial" "" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 1100 Serial" "" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse USBS" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse S" "" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium USBS" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium S" "" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 600" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 750" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1000" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1500" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 600" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 850" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1100" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1500" "Serial cable" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C / EX RT" "" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT 3:1" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar Esprit" "" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution 650" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution 850" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution 1150" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1250" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution 1550" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1750" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution 2000" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution S 2500" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Evolution S 3000" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 2200" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000 XL" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar 700" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000 RT2U" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500 RT2U" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 4000 RT" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 5000 RT" "Serial port" "mge-shut or oldmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar Evolution" "Serial port" "mge-shut or oldmge-shut or mge-utalk" +"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C" "" "mge-shut or oldmge-shut or mge-utalk" "MGE UPS SYSTEMS" "ups" "5" "Pulsar ES+" "" "mge-utalk" "MGE UPS SYSTEMS" "ups" "5" "Pulsar ESV+" "" "mge-utalk" "MGE UPS SYSTEMS" "ups" "5" "Pulsar SV" "" "mge-utalk" @@ -598,7 +599,7 @@ "MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme" "" "mge-utalk" "MGE UPS SYSTEMS" "ups" "5" "Comet EXtreme" "" "mge-utalk" "MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (Serial)" "Utalk Serial Card (ref 66060)" "mge-utalk" -"MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (Serial)" "HID COM Serial Card (ref 66066)" "mge-shut or newmge-shut" +"MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (Serial)" "HID COM Serial Card (ref 66066)" "mge-shut or oldmge-shut" "MGE UPS SYSTEMS" "ups" "5" "Pulsar / Comet / Galaxy (SNMP)" "SNMP/Web Transverse card (ref 66074)" "snmp-ups (experimental)" "MGE UPS SYSTEMS" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (Ref 66102)" "netxml-ups (experimental)" "MGE UPS SYSTEMS" "ups" "5" "various models (SNMP mode)" "NMC Minislot (Ref 66102)" "snmp-ups (experimental)" @@ -677,6 +678,7 @@ "Oneac" "ups" "1" "ON2000XIU" "advanced interface" "oneac" "Online" "ups" "1" "P-Series" "" "genericups upstype=14" +"Online" "ups" "2" "Zinto A" "" "blazer_usb" "Online" "ups" "1" "Zinto D" "" "optiups" "Online" "ups" "2" "Yunto YQ450" "" "blazer_usb" @@ -704,7 +706,7 @@ "Powercom" "ups" "4" "Imperial" "" "powercom" "Powercom" "ups" "5" "Imperial" "USB (2009 models, product id: 00a2)" "usbhid-ups (experimental)" "Powercom" "ups" "4" "Vanguard" "" "blazer_ser" -"Powercom" "ups" "5" "Vanguard" "USB (2009 models, product id: 00a5)" "usbhid-ups (experimental)" +"Powercom" "ups" "5" "Vanguard" "USB (2009 models, product id: 0004 or 00a5)" "usbhid-ups (experimental)" "Powercom" "ups" "4" "WOW" "USB (<= 2009 models, product id: 0002)" "powercom (requires 'usbserial' kernel module)" "Powercom" "ups" "5" "WOW" "USB (2009 models, product id: 00a4)" "usbhid-ups (experimental)" "Powercom" "ups" "4" "(various)" "USB (<= 2009 models, product id: 0002)" "powercom (requires 'usbserial' kernel module)" @@ -767,6 +769,8 @@ "Raritan" "pdu" "3" "Metered PDU - Raritan PM" "no report, but should be supported" "snmp-ups (experimental)" "Raritan" "pdu" "3" "Switched PDU - Raritan RPC" "no report, but should be supported" "snmp-ups (experimental)" +"REDi" "ups" "2" "Blazer 400VA / 600VA / 800VA" "" "blazer_ser" + "Repotec" "ups" "1" "RPF525/625/800/1000" "" "safenet" "Repotec" "ups" "1" "RPT-800A" "" "genericups upstype=13" "Repotec" "ups" "1" "RPT-162A" "" "genericups upstype=13" @@ -852,6 +856,8 @@ "UNITEK" "ups" "2" "Alpha 1000is" "" "blazer_ser" "UNITEK" "ups" "2" "Alpha 500" "" "blazer_ser" "UNITEK" "ups" "2" "Alpha 500 ipE" "" "blazer_ser" +"UNITEK" "ups" "2" "Alpha650ipF" "USB" "blazer_usb" +"UNITEK" "ups" "2" "Alpha650ipE" "USB" "blazer_usb" "UNITEK" "ups" "2" "Alpha 2600" "" "blazer_ser" "UNITEK" "ups" "2" "Alpha 1200Sx" "USB" "blazer_usb" "UNITEK" "ups" "2" "Alpha 1250xD" "USB" "blazer_usb" diff --git a/data/html/Makefile.in b/data/html/Makefile.in index 49fc9f7..a0d4b60 100644 --- a/data/html/Makefile.in +++ b/data/html/Makefile.in @@ -110,6 +110,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -213,6 +219,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/docs/Makefile.am b/docs/Makefile.am index 6521b3b..e4948fd 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -1,5 +1,5 @@ IMAGE_FILES = images/asciidoc.png \ - images/eaton-logo.png \ + images/hostedby.png \ images/nut_layering.png \ images/nut-logo.png \ images/note.png \ diff --git a/docs/Makefile.in b/docs/Makefile.in index 5f04658..aa3b75c 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -124,6 +124,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -227,6 +233,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -285,7 +292,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ IMAGE_FILES = images/asciidoc.png \ - images/eaton-logo.png \ + images/hostedby.png \ images/nut_layering.png \ images/nut-logo.png \ images/note.png \ diff --git a/docs/configure.txt b/docs/configure.txt index 1450ce5..bb3b02d 100644 --- a/docs/configure.txt +++ b/docs/configure.txt @@ -122,6 +122,10 @@ and use HAL support. Build and install Avahi support, to publish NUT server availability using mDNS protocol. + --with-libltdl (default: auto-detect) + +Enable libltdl (Libtool dlopen abstraction) support. +This is required to build nut-scanner. Other configuration options --------------------------- @@ -331,14 +335,16 @@ or higher installed properly. The gdlib-config script will be detected and used by default in that situation. --with-ssl-includes, --with-usb-includes, --with-snmp-includes, - --with-neon-includes, --with-powerman-includes="-I/foo/bar" + --with-neon-includes, --with-libltdl-includes, + --with-powerman-includes="-I/foo/bar" If your system doesn't have pkg-config and support for any of the above libraries isn't found (but you know it is installed), you must specify the compiler flags that are needed. --with-ssl-libs, --with-usb-libs, --with-snmp-libs, - --with-neon-libs, --with-powerman-libs="-L/foo/bar -labcd -lxyz" + --with-neon-libs, --with-libltdl-libs + --with-powerman-libs="-L/foo/bar -labcd -lxyz" If your system doesn't have pkg-config and support for any of the above libraries isn't found (but you know it is installed), you must specify the diff --git a/docs/documentation.txt b/docs/documentation.txt index 8e84b4d..280f945 100644 --- a/docs/documentation.txt +++ b/docs/documentation.txt @@ -46,6 +46,7 @@ These are general information about UPS and PDU. - link:http://tldp.org/HOWTO/UPS-HOWTO/[UPS HOWTO] (The Linux Documentation Project) - link:http://en.wikipedia.org/wiki/Uninterruptible_power_supply[UPS on Wikipedia] - link:http://en.wikipedia.org/wiki/Power_distribution_unit[PDU on Wikipedia] +- link:http://en.wikipedia.org/wiki/Solar_controller[Solar controller on Wikipedia] - link:http://www.pcguide.com/ref/power/ext/ups/over.htm[UPS on The PC Guide] These are writeups by users of the software. diff --git a/docs/download.txt b/docs/download.txt index 33c6edf..306bf2a 100644 --- a/docs/download.txt +++ b/docs/download.txt @@ -115,7 +115,7 @@ link:http://pdb.finkproject.org/pdb/package.php/nut[Fink], link:http://trac.macports.org/browser/trunk/dports/sysutils/nut/Portfile[MacPorts] - Windows (complete port, Beta): -link:http://www.networkupstools.org/source/2.6/NUT-Installer-2.6.3-3.msi[Windows MSI installer 2.6.3-3] +link:http://www.networkupstools.org/source/2.6/NUT-Installer-2.6.4-1.msi[Windows MSI installer 2.6.4-1] Java packages @@ -126,3 +126,14 @@ link:http://www.networkupstools.org/package/java/jNut-0.2-SNAPSHOT.tar.gz[jNUT 0 - NUT Java Web support (client side using REST, Beta) link:http://www.networkupstools.org/package/java/jNutWebAPI-0.2-SNAPSHOT-src.tar.gz[jNutWebAPI 0.2-SNAPSHOT (sources)] + +Virtualization packages +----------------------- + +VMware +~~~~~~ + +- NUT client for ESXI 5.0 (offsite, René Garcia) + + * link:http://rene.margar.fr/2012/05/client-nut-pour-esxi-5-0/[blog entry (French)] + * link:http://rene.margar.fr/downloads/NutClient-ESXi500-1.0.2.tar.gz[VIB package] diff --git a/docs/images/eaton-logo.png b/docs/images/eaton-logo.png deleted file mode 100644 index f297295a89ac54e7c6368c0198b175cc83e67bf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7998 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 M07*qoM6N<$g3xc{zyJUM literal 0 HcmV?d00001 diff --git a/docs/images/simple.png b/docs/images/simple.png index ab1acad8079e54a9b2d9a254a2c6e97f4855807f..62ad84016e6bf3571d51f490685fb112a0c07571 100644 GIT binary patch literal 15992 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≩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 Gy#GI>YP`n) literal 16662 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 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "APCSMART\-OLD" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "APCSMART\-OLD" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/apcsmart.8 b/docs/man/apcsmart.8 index 692e2ba..1319553 100644 --- a/docs/man/apcsmart.8 +++ b/docs/man/apcsmart.8 @@ -2,12 +2,12 @@ .\" Title: apcsmart .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "APCSMART" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "APCSMART" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bcmxcp.8 b/docs/man/bcmxcp.8 index bee2f2c..924f293 100644 --- a/docs/man/bcmxcp.8 +++ b/docs/man/bcmxcp.8 @@ -2,12 +2,12 @@ .\" Title: bcmxcp .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BCMXCP" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BCMXCP" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bcmxcp_usb.8 b/docs/man/bcmxcp_usb.8 index 0f31d4f..372672c 100644 --- a/docs/man/bcmxcp_usb.8 +++ b/docs/man/bcmxcp_usb.8 @@ -2,12 +2,12 @@ .\" Title: bcmxcp_usb .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BCMXCP_USB" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BCMXCP_USB" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/belkin.8 b/docs/man/belkin.8 index 2b9862f..d8d2e38 100644 --- a/docs/man/belkin.8 +++ b/docs/man/belkin.8 @@ -2,12 +2,12 @@ .\" Title: belkin .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BELKIN" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BELKIN" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/belkinunv.8 b/docs/man/belkinunv.8 index 626e5ca..a01de36 100644 --- a/docs/man/belkinunv.8 +++ b/docs/man/belkinunv.8 @@ -2,12 +2,12 @@ .\" Title: belkinunv .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BELKINUNV" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BELKINUNV" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -111,7 +111,7 @@ option is given, each status update is written on a new line\&. not supported by all hardware\&. .RE .PP -\fBbattery\&.voltage\fR, \fBbattery\&.voltage\&.nominal\fR, \fBdriver\&.version\&.internal\fR, \fBinput\&.frequency\fR, \fBinput\&.frequency\&.nominal\fR +\fBbattery\&.voltage\fR, \fBbattery\&.voltage\&.nominal\fR, \fBinput\&.frequency\fR, \fBinput\&.frequency\&.nominal\fR .RS 4 e\&.g\&. 60 for 60Hz .RE diff --git a/docs/man/belkinunv.txt b/docs/man/belkinunv.txt index 9f7b6af..cc8bb99 100644 --- a/docs/man/belkinunv.txt +++ b/docs/man/belkinunv.txt @@ -131,8 +131,6 @@ not supported by all hardware. *battery.voltage.nominal*:: -*driver.version.internal*:: - *input.frequency*:: *input.frequency.nominal*:: diff --git a/docs/man/bestfcom.8 b/docs/man/bestfcom.8 index dd57320..646a250 100644 --- a/docs/man/bestfcom.8 +++ b/docs/man/bestfcom.8 @@ -2,12 +2,12 @@ .\" Title: bestfcom .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTFCOM" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BESTFCOM" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestfortress.8 b/docs/man/bestfortress.8 index e26767f..ad999d2 100644 --- a/docs/man/bestfortress.8 +++ b/docs/man/bestfortress.8 @@ -2,12 +2,12 @@ .\" Title: bestfortress .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTFORTRESS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BESTFORTRESS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestuferrups.8 b/docs/man/bestuferrups.8 index 03319a1..0c62876 100644 --- a/docs/man/bestuferrups.8 +++ b/docs/man/bestuferrups.8 @@ -2,12 +2,12 @@ .\" Title: bestuferrups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTUFERRUPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BESTUFERRUPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestups.8 b/docs/man/bestups.8 index 0f2f6af..0f7f491 100644 --- a/docs/man/bestups.8 +++ b/docs/man/bestups.8 @@ -2,12 +2,12 @@ .\" Title: bestups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTUPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BESTUPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/blazer.8 b/docs/man/blazer.8 index 67d718a..1c53569 100644 --- a/docs/man/blazer.8 +++ b/docs/man/blazer.8 @@ -2,12 +2,12 @@ .\" Title: blazer .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BLAZER" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "BLAZER" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/clone.8 b/docs/man/clone.8 index a19e23c..a2454bf 100644 --- a/docs/man/clone.8 +++ b/docs/man/clone.8 @@ -2,12 +2,12 @@ .\" Title: clone .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "CLONE" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "CLONE" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/dummy-ups.8 b/docs/man/dummy-ups.8 index fd0bc6f..732da10 100644 --- a/docs/man/dummy-ups.8 +++ b/docs/man/dummy-ups.8 @@ -2,12 +2,12 @@ .\" Title: dummy-ups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "DUMMY\-UPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "DUMMY\-UPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/etapro.8 b/docs/man/etapro.8 index 121131b..ea19eb9 100644 --- a/docs/man/etapro.8 +++ b/docs/man/etapro.8 @@ -2,12 +2,12 @@ .\" Title: etapro .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "ETAPRO" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "ETAPRO" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/everups.8 b/docs/man/everups.8 index de926f2..aa25297 100644 --- a/docs/man/everups.8 +++ b/docs/man/everups.8 @@ -2,12 +2,12 @@ .\" Title: everups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "EVERUPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "EVERUPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/gamatronic.8 b/docs/man/gamatronic.8 index ed1a1b0..4dde67d 100644 --- a/docs/man/gamatronic.8 +++ b/docs/man/gamatronic.8 @@ -2,12 +2,12 @@ .\" Title: gamatronic .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "GAMATRONIC" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "GAMATRONIC" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/genericups.8 b/docs/man/genericups.8 index 4d77ca4..17e70ea 100644 --- a/docs/man/genericups.8 +++ b/docs/man/genericups.8 @@ -2,12 +2,12 @@ .\" Title: genericups .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "GENERICUPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "GENERICUPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/hosts.conf.5 b/docs/man/hosts.conf.5 index dafb543..2fc59b0 100644 --- a/docs/man/hosts.conf.5 +++ b/docs/man/hosts.conf.5 @@ -2,12 +2,12 @@ .\" Title: hosts.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "HOSTS\&.CONF" "5" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "HOSTS\&.CONF" "5" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/isbmex.8 b/docs/man/isbmex.8 index 04a46d4..766f102 100644 --- a/docs/man/isbmex.8 +++ b/docs/man/isbmex.8 @@ -2,12 +2,12 @@ .\" Title: isbmex .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "ISBMEX" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "ISBMEX" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/ivtscd.8 b/docs/man/ivtscd.8 index 66b5ae9..d28fd9f 100644 --- a/docs/man/ivtscd.8 +++ b/docs/man/ivtscd.8 @@ -2,12 +2,12 @@ .\" Title: ivtscd .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "IVTSCD" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "IVTSCD" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libupsclient-config.1 b/docs/man/libupsclient-config.1 index e6d281e..6c8d717 100644 --- a/docs/man/libupsclient-config.1 +++ b/docs/man/libupsclient-config.1 @@ -2,12 +2,12 @@ .\" Title: libupsclient-config .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "LIBUPSCLIENT\-CONFIG" "1" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "LIBUPSCLIENT\-CONFIG" "1" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/liebert-esp2.8 b/docs/man/liebert-esp2.8 index db12ebc..79a7b1c 100644 --- a/docs/man/liebert-esp2.8 +++ b/docs/man/liebert-esp2.8 @@ -2,12 +2,12 @@ .\" Title: liebert-esp2 .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "LIEBERT\-ESP2" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "LIEBERT\-ESP2" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/liebert.8 b/docs/man/liebert.8 index cc4ab97..26edf5c 100644 --- a/docs/man/liebert.8 +++ b/docs/man/liebert.8 @@ -2,12 +2,12 @@ .\" Title: liebert .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "LIEBERT" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "LIEBERT" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/macosx-ups.8 b/docs/man/macosx-ups.8 new file mode 100644 index 0000000..dd01029 --- /dev/null +++ b/docs/man/macosx-ups.8 @@ -0,0 +1,81 @@ +'\" t +.\" Title: macosx-ups +.\" Author: [see the "AUTHORS" section] +.\" Generator: DocBook XSL Stylesheets v1.75.2 +.\" Date: 08/08/2012 +.\" Manual: NUT Manual +.\" Source: Network UPS Tools +.\" Language: English +.\" +.TH "MACOSX\-UPS" "8" "08/08/2012" "Network UPS Tools" "NUT Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +macosx-ups \- monitor for Mac OS X built\-in UPS and battery driver +.SH "NOTE" +.sp +This man page only documents the hardware\-specific features of the \fBmacosx\-ups\fR driver\&. For information about the core driver, see \fBnutupsdrv\fR(8)\&. +.SH "SUPPORTED HARDWARE" +.sp +\fBmacosx\-ups\fR supports any USB HID Power Device Class (PDC) UPS which is matched by the Mac OS X built\-in drivers\&. It also can monitor a laptop internal battery as though it were an UPS\&. +.sp +If the UPS is visible in the Energy Saver preferences pane of System Preferences, this driver should be able to monitor it\&. +.SH "EXTRA ARGUMENTS" +.PP +\fBport\fR=\fIregex\fR +.RS 4 +The +\fBport\fR +parameter in the configuration file can be a case\-insensitive extended regular expression (see +\fBregex\fR(3) for details) to match against specific UPS and battery names\&. +.sp +The traditional NUT auto\-detection value of "auto" will be changed to "/UPS"\&. To test this driver against the internal battery of a laptop, a value such as "battery" can be used\&. +.RE +.PP +\fBmodel\fR=\fIregex\fR +.RS 4 +Likewise, if you have more than one UPS, it may be necessary to specify a +\fBmodel\fR +name to match against\&. This parameter is also a case\-insensitive extended regular expression\&. +.RE +.SH "DIAGNOSTICS" +.sp +If the driver cannot find an UPS, first open System Preferences and see if there is an "UPS" tab on the Energy Saver panel\&. If so, re\-run the driver with the \fB\-D\fR flag to list the names of the power sources found\&. +.SH "KNOWN ISSUES AND BUGS" +.sp +This driver is a monitoring\-only driver, and cannot shut down an UPS on its own\&. However, this should not be a problem in practice: it is monitoring the built\-in Mac OS X UPS driver, which has configuration options for several shutdown scenarios\&. Consult the Energy Saver control panel or \fBpmset\fR(8) for more information\&. +.sp +The default distribution of \fBapcupsd\fR installs a kernel extension which prevents Mac OS X from attaching to the UPS\&. In order to use this driver after installing apcupsd, you must first run the apcupsd\-uninstall script and reboot\&. +.sp +Note that other UPS monitoring solutions may show more detail than what is provided by the built\-in Mac OS X driver\&. In particular, voltages other than the battery voltage, as well as current and frequency, are typically not shown\&. It may be possible to monitor these values with \fBapcupsd\fR (for APC hardware only) or \fBusbhid-ups\fR(8)\&. +.SH "AUTHORS" +.sp +Charles Lepple +.SH "SEE ALSO" +.sp +\fBusbhid-ups\fR(8), \fBpmset\fR(8), \fBregex\fR(3) +.SS "The core driver:" +.sp +\fBnutupsdrv\fR(8) +.SS "Internet resources:" +.sp +The NUT (Network UPS Tools) home page: http://www\&.networkupstools\&.org/ +.sp +The apcupsd home page: http://www\&.apcupsd\&.org/ diff --git a/docs/man/macosx-ups.txt b/docs/man/macosx-ups.txt new file mode 100644 index 0000000..9202f5b --- /dev/null +++ b/docs/man/macosx-ups.txt @@ -0,0 +1,104 @@ +MACOSX-UPS(8) +============= + +NAME +---- +macosx-ups - monitor for Mac OS X built-in UPS and battery driver + +NOTE +---- +This man page only documents the hardware-specific features of the +*macosx-ups* driver. For information about the core driver, see +linkman:nutupsdrv[8]. + +SUPPORTED HARDWARE +------------------ +*macosx-ups* supports any USB HID Power Device Class (PDC) UPS which is +matched by the Mac OS X built-in drivers. It also can monitor a laptop +internal battery as though it were an UPS. + +If the UPS is visible in the Energy Saver preferences pane of System +Preferences, this driver should be able to monitor it. + + +EXTRA ARGUMENTS +---------------- +*port*='regex':: +The *port* parameter in the configuration file can be a case-insensitive +extended regular expression (see *regex*(3) for details) to match against +specific UPS and battery names. ++ +The traditional NUT auto-detection value of "auto" will be changed to "/UPS". +To test this driver against the internal battery of a laptop, a value such as +"battery" can be used. + +*model*='regex':: +Likewise, if you have more than one UPS, it may be necessary to specify a +*model* name to match against. This parameter is also a case-insensitive +extended regular expression. + +////////////////////////////////////////// +This driver also supports the following optional settings: + +*option1*='num':: +Set the value of ... to 'num'. Contrast with *option2*. + +*option2*='string':: +Some other option. +////////////////////////////////////////// + +////////////////////////////////////////// +Optional: list supported instant commands here: + +INSTANT COMMANDS +---------------- + +*instcmd1*:: +Command 1. +////////////////////////////////////////// + +DIAGNOSTICS +----------- + +If the driver cannot find an UPS, first open System Preferences and see if +there is an "UPS" tab on the Energy Saver panel. If so, re-run the driver with +the *-D* flag to list the names of the power sources found. + +KNOWN ISSUES AND BUGS +--------------------- + +This driver is a monitoring-only driver, and cannot shut down an UPS on its +own. However, this should not be a problem in practice: it is monitoring the +built-in Mac OS X UPS driver, which has configuration options for several +shutdown scenarios. Consult the Energy Saver control panel or *pmset*(8) for +more information. + +The default distribution of *apcupsd* installs a kernel extension which +prevents Mac OS X from attaching to the UPS. In order to use this driver after +installing apcupsd, you must first run the `apcupsd-uninstall` script and +reboot. + +Note that other UPS monitoring solutions may show more detail than what is +provided by the built-in Mac OS X driver. In particular, voltages other than +the battery voltage, as well as current and frequency, are typically not +shown. It may be possible to monitor these values with *apcupsd* (for APC +hardware only) or linkman:usbhid-ups[8]. + +AUTHORS +------- +Charles Lepple + +SEE ALSO +-------- + +linkman:usbhid-ups[8], *pmset*(8), *regex*(3) + +The core driver: +~~~~~~~~~~~~~~~~ +linkman:nutupsdrv[8] + +Internet resources: +~~~~~~~~~~~~~~~~~~~ +The NUT (Network UPS Tools) home page: http://www.networkupstools.org/ + +The apcupsd home page: http://www.apcupsd.org/ diff --git a/docs/man/masterguard.8 b/docs/man/masterguard.8 index 4dd5aca..e04c066 100644 --- a/docs/man/masterguard.8 +++ b/docs/man/masterguard.8 @@ -2,12 +2,12 @@ .\" Title: masterguard .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MASTERGUARD" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "MASTERGUARD" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/metasys.8 b/docs/man/metasys.8 index 4bcbaf0..4d306cf 100644 --- a/docs/man/metasys.8 +++ b/docs/man/metasys.8 @@ -2,12 +2,12 @@ .\" Title: metasys .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "METASYS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "METASYS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/mge-shut.8 b/docs/man/mge-shut.8 index a2188cd..7f4c40d 100644 --- a/docs/man/mge-shut.8 +++ b/docs/man/mge-shut.8 @@ -2,12 +2,12 @@ .\" Title: mge-shut .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MGE\-SHUT" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "MGE\-SHUT" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -94,13 +94,28 @@ warn you upon startup if it isn\(cqt\&. Some UPS\(cqes will restart no matter wh in \fBups\&.conf\fR helps\&. +.if n \{\ +.sp +.\} +.RS 4 +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBWarning\fR +.ps -1 +.br +ondelay parameter was set in ten seconds unit in the legacy mge\-shut driver ( 3 for 30 seconds) \&. It is now set in seconds ( 30 for 30 seconds)\&. Make sure you use the correct unit in your configuration\&. +.sp .5v +.RE .RE .PP \fBnotification\fR=\fInum\fR .RS 4 Set notification type to 1 (no), 2 (light) or 3 (yes)\&. .sp -The default value is 3 (yes) because of some early Ellipse models which need it\&. +This argument is ignored\&. It is only here for backward compatibility\&. .RE .SH "KNOWN ISSUES" .SS "Repetitive timeout and staleness" diff --git a/docs/man/mge-shut.txt b/docs/man/mge-shut.txt index 76a9241..d8e19c3 100644 --- a/docs/man/mge-shut.txt +++ b/docs/man/mge-shut.txt @@ -56,12 +56,15 @@ than offdelay, but the driver will *not* warn you upon startup if it isn't. Some UPS'es will restart no matter what, even if the power is (still) out at the moment this timer elapses. In that case, you could try if setting 'ondelay = -1' in *ups.conf* helps. ++ +WARNING: ondelay parameter was set in ten seconds unit in the legacy mge-shut +driver ( 3 for 30 seconds) . It is now set in seconds ( 30 for 30 seconds). +Make sure you use the correct unit in your configuration. *notification*='num':: Set notification type to 1 (no), 2 (light) or 3 (yes). + -The default value is 3 (yes) because of some early Ellipse models which -need it. +This argument is ignored. It is only here for backward compatibility. KNOWN ISSUES ------------ diff --git a/docs/man/mge-utalk.8 b/docs/man/mge-utalk.8 index 670c4be..d94ab38 100644 --- a/docs/man/mge-utalk.8 +++ b/docs/man/mge-utalk.8 @@ -2,12 +2,12 @@ .\" Title: mge-utalk .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MGE\-UTALK" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "MGE\-UTALK" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/microdowell.8 b/docs/man/microdowell.8 index f888340..587e4b7 100644 --- a/docs/man/microdowell.8 +++ b/docs/man/microdowell.8 @@ -2,12 +2,12 @@ .\" Title: microdowell .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MICRODOWELL" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "MICRODOWELL" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/netxml-ups.8 b/docs/man/netxml-ups.8 index 69df2fe..abee892 100644 --- a/docs/man/netxml-ups.8 +++ b/docs/man/netxml-ups.8 @@ -2,12 +2,12 @@ .\" Title: netxml-ups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NETXML\-UPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "NETXML\-UPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nut-ipmipsu.8 b/docs/man/nut-ipmipsu.8 index 9ff396a..9a2beed 100644 --- a/docs/man/nut-ipmipsu.8 +++ b/docs/man/nut-ipmipsu.8 @@ -2,12 +2,12 @@ .\" Title: nut-ipmipsu .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUT\-IPMIPSU" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "NUT\-IPMIPSU" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -167,7 +167,7 @@ means that the PSU is present and providing power, .IP \(bu 2.3 .\} -\fIOB\fR +\fIOFF\fR means that the PSU is present but not providing power (power cable removed), .RE .sp @@ -181,7 +181,7 @@ means that the PSU is present but not providing power (power cable removed), .\} \fIstale\fR -means that the PSU is not present (ie physically removed)\&. +(no data) means that the PSU is not present (ie physically removed)\&. .RE .RE .sp diff --git a/docs/man/nut-ipmipsu.txt b/docs/man/nut-ipmipsu.txt index cef3a14..11c4f5c 100644 --- a/docs/man/nut-ipmipsu.txt +++ b/docs/man/nut-ipmipsu.txt @@ -70,8 +70,8 @@ This driver will report various information related to a PSU, including: - status of the PSU: * 'OL' means that the PSU is present and providing power, - * 'OB' means that the PSU is present but not providing power (power cable removed), - * 'stale' means that the PSU is not present (ie physically removed). + * 'OFF' means that the PSU is present but not providing power (power cable removed), + * 'stale' (no data) means that the PSU is not present (ie physically removed). Here is an example output for a Dell r610 server: diff --git a/docs/man/nut-recorder.8 b/docs/man/nut-recorder.8 index de8969d..6e93400 100644 --- a/docs/man/nut-recorder.8 +++ b/docs/man/nut-recorder.8 @@ -2,12 +2,12 @@ .\" Title: nut-recorder .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUT\-RECORDER" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "NUT\-RECORDER" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nut-scanner.8 b/docs/man/nut-scanner.8 index 04e926c..d3caaa7 100644 --- a/docs/man/nut-scanner.8 +++ b/docs/man/nut-scanner.8 @@ -2,12 +2,12 @@ .\" Title: nut-scanner .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUT\-SCANNER" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "NUT\-SCANNER" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -39,7 +39,7 @@ nut-scanner \- scan communication buses for NUT devices \fBnut\-scanner\fR scans available communication buses and displays any NUT\-compatible devices it has found\&. .SH "INSTALLATION" .sp -\fBnut\-scanner\fR is always built by default\&. However, available options (USB, SNMP, IPMI, \&...) will vary according to the available compile time and runtime dependencies\&. For example, if Net\-SNMP is installed, thus providing libsnmp (\&.so or \&.dll) and headers, both during compilation and runtime, then SNMP discovery will be available\&. +\fBnut\-scanner\fR is only built if libltdl (part of libtool development suite) is available\&. Available options (USB, SNMP, IPMI, \&...) will vary according to the available compile time and runtime dependencies\&. For example, if Net\-SNMP is installed, thus providing libsnmp (\&.so or \&.dll) and headers, both during compilation and runtime, then SNMP discovery will be available\&. .SH "OPTIONS" .PP \fB\-h\fR diff --git a/docs/man/nut-scanner.txt b/docs/man/nut-scanner.txt index 2f517ee..6948449 100644 --- a/docs/man/nut-scanner.txt +++ b/docs/man/nut-scanner.txt @@ -21,11 +21,11 @@ NUT-compatible devices it has found. INSTALLATION ------------ -*nut-scanner* is always built by default. However, available options -(USB, SNMP, IPMI, ...) will vary according to the available compile time -and runtime dependencies. For example, if Net-SNMP is installed, thus -providing libsnmp (.so or .dll) and headers, both during compilation -and runtime, then SNMP discovery will be available. +*nut-scanner* is only built if libltdl (part of libtool development suite) +is available. Available options (USB, SNMP, IPMI, ...) will vary according +to the available compile time and runtime dependencies. For example, if +Net-SNMP is installed, thus providing libsnmp (.so or .dll) and headers, +both during compilation and runtime, then SNMP discovery will be available. OPTIONS ------- diff --git a/docs/man/nut.conf.5 b/docs/man/nut.conf.5 index 4231178..fac56d5 100644 --- a/docs/man/nut.conf.5 +++ b/docs/man/nut.conf.5 @@ -2,12 +2,12 @@ .\" Title: nut.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUT\&.CONF" "5" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "NUT\&.CONF" "5" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan.3 b/docs/man/nutscan.3 index 022ede7..3edfcf2 100644 --- a/docs/man/nutscan.3 +++ b/docs/man/nutscan.3 @@ -2,12 +2,12 @@ .\" Title: nutscan .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -33,10 +33,10 @@ nutscan \- Network UPS Tools (NUT) device discovery library .sp The Network UPS Tools (NUT) \fBnutscan\fR library provides the same discovery related features that are also offered by \fBnut-scanner\fR(8)\&. .sp -It allows to discover supported NUT devices (USB, SNMP, Eaton XML/HTTP and IPMI) and NUT servers (using Avahi or the classic connection method)\&. +It enables the discovery of supported NUT devices (USB, SNMP, Eaton XML/HTTP and IPMI) and NUT servers (using Avahi, or the classic connection method)\&. .SH "DISCOVERY FUNCTIONS" .sp -First, include the needed header file: +First, include the required header file: .sp .if n \{\ .RS 4 @@ -128,9 +128,9 @@ for NUT servers (upsd), using the mDNS (Avahi) method, for supported IPMI PSU\&. .RE .sp -All these functions return a list of devices found, using the nutscan_device_t structure\&. This one is described in \fBnutscan_add_device_to_device\fR(3)\&. +All of these functions return a list of devices found, using the nutscan_device_t structure\&. This structure is described in \fBnutscan_add_device_to_device\fR(3)\&. .sp -Helper functions are also provided to output data using standard format: +Helper functions are also provided to output data using standard formats: .sp .RS 4 .ie n \{\ @@ -159,7 +159,7 @@ for ups\&.conf style\&. .RE .SH "ERROR HANDLING" .sp -There is currently no specific mechanism around error handling\&. +There is currently no specific mechanism for error handling\&. .SH "SEE ALSO" .sp -\fBnut-scanner\fR(8), \fBnutscan_scan_usb\fR(3), \fBnutscan_scan_snmp\fR(3) \fBnutscan_scan_xml_http\fR(3), \fBnutscan_scan_nut\fR(3) \fBnutscan_scan_avahi\fR(3), \fBnutscan_scan_ipmi\fR(3) \fBnutscan_display_parsable\fR(3), \fBnutscan_display_ups_conf\fR(3) \fBnutscan_new_device\fR(3), \fBnutscan_free_device\fR(3) \fBnutscan_add_device_to_device\fR(3), \fBnutscan_add_option_to_device\fR(3) \fBnutscan_cidr_to_ip\fR(3) +\fBnut-scanner\fR(8), \fBnutscan_scan_usb\fR(3), \fBnutscan_scan_snmp\fR(3), \fBnutscan_scan_xml_http\fR(3), \fBnutscan_scan_nut\fR(3), \fBnutscan_scan_avahi\fR(3), \fBnutscan_scan_ipmi\fR(3), \fBnutscan_display_parsable\fR(3), \fBnutscan_display_ups_conf\fR(3), \fBnutscan_new_device\fR(3), \fBnutscan_free_device\fR(3), \fBnutscan_add_device_to_device\fR(3), \fBnutscan_add_option_to_device\fR(3), \fBnutscan_cidr_to_ip\fR(3), http://avahi\&.org/ diff --git a/docs/man/nutscan.txt b/docs/man/nutscan.txt index 030a910..90ac366 100644 --- a/docs/man/nutscan.txt +++ b/docs/man/nutscan.txt @@ -12,14 +12,14 @@ DESCRIPTION The Network UPS Tools (NUT) *nutscan* library provides the same discovery related features that are also offered by linkman:nut-scanner[8]. -It allows to discover supported NUT devices (USB, SNMP, Eaton XML/HTTP and IPMI) -and NUT servers (using Avahi or the classic connection method). +It enables the discovery of supported NUT devices (USB, SNMP, Eaton XML/HTTP +and IPMI) and NUT servers (using Avahi, or the classic connection method). DISCOVERY FUNCTIONS ------------------- -First, include the needed header file: +First, include the required header file: #include @@ -33,10 +33,10 @@ Then, to discover new devices, use the appropriate function: - linkman:nutscan_scan_ipmi[3] for supported IPMI PSU. -All these functions return a list of devices found, using the nutscan_device_t -structure. This one is described in linkman:nutscan_add_device_to_device[3]. +All of these functions return a list of devices found, using the nutscan_device_t +structure. This structure is described in linkman:nutscan_add_device_to_device[3]. -Helper functions are also provided to output data using standard format: +Helper functions are also provided to output data using standard formats: - linkman:nutscan_display_parsable[3] for parsable output, - linkman:nutscan_display_ups_conf[3] for ups.conf style. @@ -44,16 +44,17 @@ Helper functions are also provided to output data using standard format: ERROR HANDLING -------------- -There is currently no specific mechanism around error handling. +There is currently no specific mechanism for error handling. SEE ALSO -------- linkman:nut-scanner[8], -linkman:nutscan_scan_usb[3], linkman:nutscan_scan_snmp[3] -linkman:nutscan_scan_xml_http[3], linkman:nutscan_scan_nut[3] -linkman:nutscan_scan_avahi[3], linkman:nutscan_scan_ipmi[3] -linkman:nutscan_display_parsable[3], linkman:nutscan_display_ups_conf[3] -linkman:nutscan_new_device[3], linkman:nutscan_free_device[3] -linkman:nutscan_add_device_to_device[3], linkman:nutscan_add_option_to_device[3] -linkman:nutscan_cidr_to_ip[3] +linkman:nutscan_scan_usb[3], linkman:nutscan_scan_snmp[3], +linkman:nutscan_scan_xml_http[3], linkman:nutscan_scan_nut[3], +linkman:nutscan_scan_avahi[3], linkman:nutscan_scan_ipmi[3], +linkman:nutscan_display_parsable[3], linkman:nutscan_display_ups_conf[3], +linkman:nutscan_new_device[3], linkman:nutscan_free_device[3], +linkman:nutscan_add_device_to_device[3], linkman:nutscan_add_option_to_device[3], +linkman:nutscan_cidr_to_ip[3], +http://avahi.org/ diff --git a/docs/man/nutscan_add_device_to_device.3 b/docs/man/nutscan_add_device_to_device.3 index 91c0153..703f525 100644 --- a/docs/man/nutscan_add_device_to_device.3 +++ b/docs/man/nutscan_add_device_to_device.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_add_device_to_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_ADD_DEVICE_T" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_ADD_DEVICE_T" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_add_option_to_device.3 b/docs/man/nutscan_add_option_to_device.3 index 4075e39..3080806 100644 --- a/docs/man/nutscan_add_option_to_device.3 +++ b/docs/man/nutscan_add_option_to_device.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_add_option_to_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_ADD_OPTION_T" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_ADD_OPTION_T" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_cidr_to_ip.3 b/docs/man/nutscan_cidr_to_ip.3 index 56a6454..776047a 100644 --- a/docs/man/nutscan_cidr_to_ip.3 +++ b/docs/man/nutscan_cidr_to_ip.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_cidr_to_ip .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_CIDR_TO_IP" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_CIDR_TO_IP" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_display_parsable.3 b/docs/man/nutscan_display_parsable.3 index aee3034..8562486 100644 --- a/docs/man/nutscan_display_parsable.3 +++ b/docs/man/nutscan_display_parsable.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_display_parsable .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_DISPLAY_PARS" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_DISPLAY_PARS" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_display_ups_conf.3 b/docs/man/nutscan_display_ups_conf.3 index cc8d242..1b9017d 100644 --- a/docs/man/nutscan_display_ups_conf.3 +++ b/docs/man/nutscan_display_ups_conf.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_display_ups_conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_DISPLAY_UPS_" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_DISPLAY_UPS_" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_free_device.3 b/docs/man/nutscan_free_device.3 index d3d462c..616cef6 100644 --- a/docs/man/nutscan_free_device.3 +++ b/docs/man/nutscan_free_device.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_free_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_FREE_DEVICE" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_FREE_DEVICE" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_init.3 b/docs/man/nutscan_init.3 index 24c62ba..644033e 100644 --- a/docs/man/nutscan_init.3 +++ b/docs/man/nutscan_init.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_init .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_INIT" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_INIT" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_new_device.3 b/docs/man/nutscan_new_device.3 index 028b201..fda0bf4 100644 --- a/docs/man/nutscan_new_device.3 +++ b/docs/man/nutscan_new_device.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_new_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_NEW_DEVICE" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_NEW_DEVICE" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_avahi.3 b/docs/man/nutscan_scan_avahi.3 index 2bf5d71..6ebc0a9 100644 --- a/docs/man/nutscan_scan_avahi.3 +++ b/docs/man/nutscan_scan_avahi.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_scan_avahi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_SCAN_AVAHI" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_SCAN_AVAHI" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -28,7 +28,7 @@ .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" -nutscan_scan_avahi \- Scan network for NUT services via AVAHI\&. +nutscan_scan_avahi \- Scan network for NUT services via mDNS .SH "SYNOPSIS" .sp .nf @@ -40,14 +40,14 @@ nutscan_device_t * nutscan_scan_avahi(long usec_timeout); .fi .SH "DESCRIPTION" .sp -The \fBnutscan_scan_avahi()\fR function try to detect NUT service and its associated devcies\&. It uses the AVAHI library to do so\&. +The \fBnutscan_scan_avahi()\fR function tries to detect the NUT service via mDNS, and its associated devices\&. It uses the Avahi library to do so\&. .sp You MUST call \fBnutscan_init\fR(3) before using this function\&. .sp -This function waits up to \fIusec_timeout\fR microseconds before considering an IP address does not respond\&. +This function waits up to \fIusec_timeout\fR microseconds before considering an IP address to be unresponsive\&. .SH "RETURN VALUE" .sp -The \fBnutscan_scan_avahi()\fR function returns a pointer to a nutscan_device_t structure containing all found devices or NULL if an error occurs or no device is found\&. +The \fBnutscan_scan_avahi()\fR function returns a pointer to a nutscan_device_t structure containing all found devices\&. It returns NULL if an error occurs, or if no device is found\&. .SH "SEE ALSO" .sp -\fBnutscan_init\fR(3), \fBnutscan_scan_usb\fR(3), \fBnutscan_scan_xml_http\fR(3), \fBnutscan_scan_nut\fR(3), \fBnutscan_scan_snmp\fR(3), \fBnutscan_scan_ipmi\fR(3), \fBnutscan_display_ups_conf\fR(3), \fBnutscan_display_parsable\fR(3), \fBnutscan_new_device\fR(3), \fBnutscan_free_device\fR(3), \fBnutscan_add_option_to_device\fR(3), \fBnutscan_add_device_to_device\fR(3), \fBnutscan_cidr_to_ip\fR(3) +\fBnutscan_init\fR(3), \fBnutscan_scan_usb\fR(3), \fBnutscan_scan_xml_http\fR(3), \fBnutscan_scan_nut\fR(3), \fBnutscan_scan_snmp\fR(3), \fBnutscan_scan_ipmi\fR(3), \fBnutscan_display_ups_conf\fR(3), \fBnutscan_display_parsable\fR(3), \fBnutscan_new_device\fR(3), \fBnutscan_free_device\fR(3), \fBnutscan_add_option_to_device\fR(3), \fBnutscan_add_device_to_device\fR(3), \fBnutscan_cidr_to_ip\fR(3), http://avahi\&.org/ diff --git a/docs/man/nutscan_scan_avahi.txt b/docs/man/nutscan_scan_avahi.txt index 15ccbb2..32c39e7 100644 --- a/docs/man/nutscan_scan_avahi.txt +++ b/docs/man/nutscan_scan_avahi.txt @@ -4,7 +4,7 @@ NUTSCAN_SCAN_AVAHI(3) NAME ---- -nutscan_scan_avahi - Scan network for NUT services via AVAHI. +nutscan_scan_avahi - Scan network for NUT services via mDNS SYNOPSIS -------- @@ -16,16 +16,20 @@ SYNOPSIS DESCRIPTION ----------- -The *nutscan_scan_avahi()* function try to detect NUT service and its associated devcies. It uses the AVAHI library to do so. +The *nutscan_scan_avahi()* function tries to detect the NUT service via mDNS, +and its associated devices. It uses the Avahi library to do so. You MUST call linkman:nutscan_init[3] before using this function. -This function waits up to 'usec_timeout' microseconds before considering an IP address does not respond. +This function waits up to 'usec_timeout' microseconds before considering an IP +address to be unresponsive. RETURN VALUE ------------ -The *nutscan_scan_avahi()* function returns a pointer to a `nutscan_device_t` structure containing all found devices or NULL if an error occurs or no device is found. +The *nutscan_scan_avahi()* function returns a pointer to a `nutscan_device_t` +structure containing all found devices. It returns NULL if an error occurs, or +if no device is found. SEE ALSO -------- @@ -35,4 +39,5 @@ linkman:nutscan_scan_nut[3], linkman:nutscan_scan_snmp[3], linkman:nutscan_scan_ipmi[3], linkman:nutscan_display_ups_conf[3], linkman:nutscan_display_parsable[3], linkman:nutscan_new_device[3], linkman:nutscan_free_device[3], linkman:nutscan_add_option_to_device[3], -linkman:nutscan_add_device_to_device[3], linkman:nutscan_cidr_to_ip[3] +linkman:nutscan_add_device_to_device[3], linkman:nutscan_cidr_to_ip[3], +http://avahi.org/ diff --git a/docs/man/nutscan_scan_ipmi.3 b/docs/man/nutscan_scan_ipmi.3 index 890c96c..ec9e33c 100644 --- a/docs/man/nutscan_scan_ipmi.3 +++ b/docs/man/nutscan_scan_ipmi.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_scan_ipmi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_SCAN_IPMI" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_SCAN_IPMI" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_nut.3 b/docs/man/nutscan_scan_nut.3 index d40b690..c846181 100644 --- a/docs/man/nutscan_scan_nut.3 +++ b/docs/man/nutscan_scan_nut.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_scan_nut .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_SCAN_NUT" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_SCAN_NUT" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_snmp.3 b/docs/man/nutscan_scan_snmp.3 index dcdaa04..3838bd6 100644 --- a/docs/man/nutscan_scan_snmp.3 +++ b/docs/man/nutscan_scan_snmp.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_scan_snmp .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_SCAN_SNMP" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_SCAN_SNMP" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_usb.3 b/docs/man/nutscan_scan_usb.3 index 40968c0..ac976e6 100644 --- a/docs/man/nutscan_scan_usb.3 +++ b/docs/man/nutscan_scan_usb.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_scan_usb .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_SCAN_USB" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_SCAN_USB" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_xml_http.3 b/docs/man/nutscan_scan_xml_http.3 index d3c42cd..bc0bae8 100644 --- a/docs/man/nutscan_scan_xml_http.3 +++ b/docs/man/nutscan_scan_xml_http.3 @@ -2,12 +2,12 @@ .\" Title: nutscan_scan_xml_http .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTSCAN_SCAN_XML_HTT" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTSCAN_SCAN_XML_HTT" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutupsdrv.8 b/docs/man/nutupsdrv.8 index 262ddbc..d4eb941 100644 --- a/docs/man/nutupsdrv.8 +++ b/docs/man/nutupsdrv.8 @@ -2,12 +2,12 @@ .\" Title: nutupsdrv .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTUPSDRV" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "NUTUPSDRV" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/oneac.8 b/docs/man/oneac.8 index b468b38..7625522 100644 --- a/docs/man/oneac.8 +++ b/docs/man/oneac.8 @@ -2,12 +2,12 @@ .\" Title: oneac .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "ONEAC" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "ONEAC" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/optiups.8 b/docs/man/optiups.8 index 7e48a29..df63076 100644 --- a/docs/man/optiups.8 +++ b/docs/man/optiups.8 @@ -2,12 +2,12 @@ .\" Title: optiups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "OPTIUPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "OPTIUPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/powercom.8 b/docs/man/powercom.8 index 24f1c05..f93c6b2 100644 --- a/docs/man/powercom.8 +++ b/docs/man/powercom.8 @@ -2,12 +2,12 @@ .\" Title: powercom .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "POWERCOM" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "POWERCOM" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -28,13 +28,15 @@ .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" -powercom \- UPS driver for Powercom/Trust/Advice UPS equipment +powercom \- UPS driver for serial Powercom/Trust/Advice UPS equipment .SH "NOTE" .sp This man page only documents the hardware\-specific features of the powercom driver\&. For information about the core driver, see \fBnutupsdrv\fR(8)\&. .SH "SUPPORTED HARDWARE" .sp -This driver supports many similar kinds of UPS hardware\&. The most common ones are the Trust 425/625, Powercom, and Advice Partner/King PR750\&. Others using the same protocol may also work\&. +This driver supports many similar kinds of serial UPS hardware (as well as a few USB UPS models with USB\-to\-serial adapters)\&. The most common ones are the Trust 425/625, Powercom, and Advice Partner/King PR750\&. Others using the same protocol may also work\&. For USB connections, you might need \fBusbhid-ups\fR(8)\&. +.sp +For more specific guidance on which driver is applicable for a USB connection, see the NUT Hardware Compatibility List (HCL)\&. .SH "EXTRA ARGUMENTS" .sp This driver supports the following optional settings in the \fBups.conf\fR(5) file: diff --git a/docs/man/powercom.txt b/docs/man/powercom.txt index f01bd9a..b7516ff 100644 --- a/docs/man/powercom.txt +++ b/docs/man/powercom.txt @@ -4,7 +4,7 @@ POWERCOM(8) NAME ---- -powercom - UPS driver for Powercom/Trust/Advice UPS equipment +powercom - UPS driver for serial Powercom/Trust/Advice UPS equipment NOTE ---- @@ -14,9 +14,13 @@ linkman:nutupsdrv[8]. SUPPORTED HARDWARE ------------------ -This driver supports many similar kinds of UPS hardware. The most common -ones are the Trust 425/625, Powercom, and Advice Partner/King PR750. -Others using the same protocol may also work. +This driver supports many similar kinds of serial UPS hardware (as well as a +few USB UPS models with USB-to-serial adapters). The most common ones are the +Trust 425/625, Powercom, and Advice Partner/King PR750. Others using the same +protocol may also work. For USB connections, you might need linkman:usbhid-ups[8]. + +For more specific guidance on which driver is applicable for a USB connection, +see the NUT Hardware Compatibility List (HCL). EXTRA ARGUMENTS --------------- diff --git a/docs/man/powerman-pdu.8 b/docs/man/powerman-pdu.8 index d8f4bc3..a58f181 100644 --- a/docs/man/powerman-pdu.8 +++ b/docs/man/powerman-pdu.8 @@ -2,12 +2,12 @@ .\" Title: powerman-pdu .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "POWERMAN\-PDU" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "POWERMAN\-PDU" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/powerpanel.8 b/docs/man/powerpanel.8 index 53f5d5e..d96339f 100644 --- a/docs/man/powerpanel.8 +++ b/docs/man/powerpanel.8 @@ -2,12 +2,12 @@ .\" Title: powerpanel .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "POWERPANEL" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "POWERPANEL" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/rhino.8 b/docs/man/rhino.8 index c92c25c..cd2fdc9 100644 --- a/docs/man/rhino.8 +++ b/docs/man/rhino.8 @@ -2,12 +2,12 @@ .\" Title: rhino .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "RHINO" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "RHINO" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/richcomm_usb.8 b/docs/man/richcomm_usb.8 index ab5f191..c92e918 100644 --- a/docs/man/richcomm_usb.8 +++ b/docs/man/richcomm_usb.8 @@ -2,12 +2,12 @@ .\" Title: richcomm_usb .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "RICHCOMM_USB" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "RICHCOMM_USB" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/safenet.8 b/docs/man/safenet.8 index c21a244..9d8b67b 100644 --- a/docs/man/safenet.8 +++ b/docs/man/safenet.8 @@ -2,12 +2,12 @@ .\" Title: safenet .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "SAFENET" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "SAFENET" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/skel.txt b/docs/man/skel.txt index f98cd2c..8bf885f 100644 --- a/docs/man/skel.txt +++ b/docs/man/skel.txt @@ -43,6 +43,7 @@ CABLING ////////////////////////////////////////// EXTRA ARGUMENTS +--------------- This driver also supports the following optional settings: *option1*='num':: @@ -70,6 +71,15 @@ INSTALLATION ////////////////////////////////////////// +////////////////////////////////////////// +Optional: use DIAGNOSTICS to describe troubleshooting techniques that are +longer than what can be conveniently described in the driver error messages. + +DIAGNOSTICS +----------- + +////////////////////////////////////////// + ////////////////////////////////////////// You may leave this as "none known at this time", or describe any trouble encountered when implementing the protocol for your UPS. diff --git a/docs/man/snmp-ups.8 b/docs/man/snmp-ups.8 index d431961..9db1748 100644 --- a/docs/man/snmp-ups.8 +++ b/docs/man/snmp-ups.8 @@ -2,12 +2,12 @@ .\" Title: snmp-ups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "SNMP\-UPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "SNMP\-UPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/solis.8 b/docs/man/solis.8 index da4d0e9..6c213d0 100644 --- a/docs/man/solis.8 +++ b/docs/man/solis.8 @@ -2,12 +2,12 @@ .\" Title: solis .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "SOLIS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "SOLIS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/tripplite.8 b/docs/man/tripplite.8 index a74c0cf..d9a9c04 100644 --- a/docs/man/tripplite.8 +++ b/docs/man/tripplite.8 @@ -2,12 +2,12 @@ .\" Title: tripplite .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "TRIPPLITE" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "TRIPPLITE" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/tripplite_usb.8 b/docs/man/tripplite_usb.8 index 5a71c35..424f93f 100644 --- a/docs/man/tripplite_usb.8 +++ b/docs/man/tripplite_usb.8 @@ -2,12 +2,12 @@ .\" Title: tripplite_usb .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "TRIPPLITE_USB" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "TRIPPLITE_USB" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/tripplitesu.8 b/docs/man/tripplitesu.8 index 366af7c..cd212ad 100644 --- a/docs/man/tripplitesu.8 +++ b/docs/man/tripplitesu.8 @@ -2,12 +2,12 @@ .\" Title: tripplitesu .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "TRIPPLITESU" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "TRIPPLITESU" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/ups.conf.5 b/docs/man/ups.conf.5 index 0abc9a1..5db9e12 100644 --- a/docs/man/ups.conf.5 +++ b/docs/man/ups.conf.5 @@ -2,12 +2,12 @@ .\" Title: ups.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPS\&.CONF" "5" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPS\&.CONF" "5" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsc.8 b/docs/man/upsc.8 index 115da0e..8b90ae1 100644 --- a/docs/man/upsc.8 +++ b/docs/man/upsc.8 @@ -2,12 +2,12 @@ .\" Title: upsc .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSC" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSC" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_connect.3 b/docs/man/upscli_connect.3 index f696834..44d7b8f 100644 --- a/docs/man/upscli_connect.3 +++ b/docs/man/upscli_connect.3 @@ -2,12 +2,12 @@ .\" Title: upscli_connect .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_CONNECT" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_CONNECT" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_disconnect.3 b/docs/man/upscli_disconnect.3 index b51af56..daa9ab8 100644 --- a/docs/man/upscli_disconnect.3 +++ b/docs/man/upscli_disconnect.3 @@ -2,12 +2,12 @@ .\" Title: upscli_disconnect .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_DISCONNECT" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_DISCONNECT" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_fd.3 b/docs/man/upscli_fd.3 index 4c22874..3876e72 100644 --- a/docs/man/upscli_fd.3 +++ b/docs/man/upscli_fd.3 @@ -2,12 +2,12 @@ .\" Title: upscli_fd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_FD" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_FD" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_get.3 b/docs/man/upscli_get.3 index 5fa3550..4c6c501 100644 --- a/docs/man/upscli_get.3 +++ b/docs/man/upscli_get.3 @@ -2,12 +2,12 @@ .\" Title: upscli_get .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_GET" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_GET" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_list_next.3 b/docs/man/upscli_list_next.3 index 028df71..2a1687f 100644 --- a/docs/man/upscli_list_next.3 +++ b/docs/man/upscli_list_next.3 @@ -2,12 +2,12 @@ .\" Title: upscli_list_next .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_LIST_NEXT" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_LIST_NEXT" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_list_start.3 b/docs/man/upscli_list_start.3 index 9f7134b..ba5c0a8 100644 --- a/docs/man/upscli_list_start.3 +++ b/docs/man/upscli_list_start.3 @@ -2,12 +2,12 @@ .\" Title: upscli_list_start .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/31/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_LIST_START" "3" "05/31/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_LIST_START" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_readline.3 b/docs/man/upscli_readline.3 index 6f5be4a..fd7d5fa 100644 --- a/docs/man/upscli_readline.3 +++ b/docs/man/upscli_readline.3 @@ -2,12 +2,12 @@ .\" Title: upscli_readline .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_READLINE" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_READLINE" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_sendline.3 b/docs/man/upscli_sendline.3 index 29d31db..448da95 100644 --- a/docs/man/upscli_sendline.3 +++ b/docs/man/upscli_sendline.3 @@ -2,12 +2,12 @@ .\" Title: upscli_sendline .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SENDLINE" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SENDLINE" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_splitaddr.3 b/docs/man/upscli_splitaddr.3 index 17ed111..99a71b4 100644 --- a/docs/man/upscli_splitaddr.3 +++ b/docs/man/upscli_splitaddr.3 @@ -2,12 +2,12 @@ .\" Title: upscli_splitaddr .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SPLITADDR" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SPLITADDR" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_splitname.3 b/docs/man/upscli_splitname.3 index 166dd0f..39440f4 100644 --- a/docs/man/upscli_splitname.3 +++ b/docs/man/upscli_splitname.3 @@ -2,12 +2,12 @@ .\" Title: upscli_splitname .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SPLITNAME" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SPLITNAME" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_ssl.3 b/docs/man/upscli_ssl.3 index 87da86c..2e81a8c 100644 --- a/docs/man/upscli_ssl.3 +++ b/docs/man/upscli_ssl.3 @@ -2,12 +2,12 @@ .\" Title: upscli_ssl .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SSL" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SSL" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_strerror.3 b/docs/man/upscli_strerror.3 index a5549ff..85b41a5 100644 --- a/docs/man/upscli_strerror.3 +++ b/docs/man/upscli_strerror.3 @@ -2,12 +2,12 @@ .\" Title: upscli_strerror .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_STRERROR" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_STRERROR" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_upserror.3 b/docs/man/upscli_upserror.3 index 4aebd4f..ec7f7b6 100644 --- a/docs/man/upscli_upserror.3 +++ b/docs/man/upscli_upserror.3 @@ -2,12 +2,12 @@ .\" Title: upscli_upserror .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_UPSERROR" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_UPSERROR" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsclient.3 b/docs/man/upsclient.3 index 00f57f3..fa877c4 100644 --- a/docs/man/upsclient.3 +++ b/docs/man/upsclient.3 @@ -2,12 +2,12 @@ .\" Title: upsclient .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLIENT" "3" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCLIENT" "3" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscmd.8 b/docs/man/upscmd.8 index 1bcdded..56c714e 100644 --- a/docs/man/upscmd.8 +++ b/docs/man/upscmd.8 @@ -2,12 +2,12 @@ .\" Title: upscmd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCMD" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCMD" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscode2.8 b/docs/man/upscode2.8 index 3cf38d9..27237d2 100644 --- a/docs/man/upscode2.8 +++ b/docs/man/upscode2.8 @@ -2,12 +2,12 @@ .\" Title: upscode2 .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCODE2" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSCODE2" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.8 b/docs/man/upsd.8 index 746253e..fc8d312 100644 --- a/docs/man/upsd.8 +++ b/docs/man/upsd.8 @@ -2,12 +2,12 @@ .\" Title: upsd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSD" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSD" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.conf.5 b/docs/man/upsd.conf.5 index c3f95cb..5e19b76 100644 --- a/docs/man/upsd.conf.5 +++ b/docs/man/upsd.conf.5 @@ -2,12 +2,12 @@ .\" Title: upsd.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSD\&.CONF" "5" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSD\&.CONF" "5" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.users.5 b/docs/man/upsd.users.5 index 73fe1b5..04d756e 100644 --- a/docs/man/upsd.users.5 +++ b/docs/man/upsd.users.5 @@ -2,12 +2,12 @@ .\" Title: upsd.users .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/25/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSD\&.USERS" "5" "05/25/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSD\&.USERS" "5" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsdrvctl.8 b/docs/man/upsdrvctl.8 index 909d855..dba092d 100644 --- a/docs/man/upsdrvctl.8 +++ b/docs/man/upsdrvctl.8 @@ -2,12 +2,12 @@ .\" Title: upsdrvctl .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSDRVCTL" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSDRVCTL" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsimage.cgi.8 b/docs/man/upsimage.cgi.8 index ab3f1ee..45f6dd3 100644 --- a/docs/man/upsimage.cgi.8 +++ b/docs/man/upsimage.cgi.8 @@ -2,12 +2,12 @@ .\" Title: upsimage.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSIMAGE\&.CGI" "8" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSIMAGE\&.CGI" "8" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upslog.8 b/docs/man/upslog.8 index 2eb6121..539cdd0 100644 --- a/docs/man/upslog.8 +++ b/docs/man/upslog.8 @@ -2,12 +2,12 @@ .\" Title: upslog .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSLOG" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSLOG" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsmon.8 b/docs/man/upsmon.8 index 08bf7aa..e8b5883 100644 --- a/docs/man/upsmon.8 +++ b/docs/man/upsmon.8 @@ -2,12 +2,12 @@ .\" Title: upsmon .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSMON" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSMON" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsmon.conf.5 b/docs/man/upsmon.conf.5 index f2079f3..e348a6e 100644 --- a/docs/man/upsmon.conf.5 +++ b/docs/man/upsmon.conf.5 @@ -2,12 +2,12 @@ .\" Title: upsmon.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSMON\&.CONF" "5" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSMON\&.CONF" "5" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsrw.8 b/docs/man/upsrw.8 index 6a885bc..878e0e1 100644 --- a/docs/man/upsrw.8 +++ b/docs/man/upsrw.8 @@ -2,12 +2,12 @@ .\" Title: upsrw .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/24/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSRW" "8" "05/24/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSRW" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upssched.8 b/docs/man/upssched.8 index 0695d66..511b9e4 100644 --- a/docs/man/upssched.8 +++ b/docs/man/upssched.8 @@ -2,12 +2,12 @@ .\" Title: upssched .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSCHED" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSSCHED" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upssched.conf.5 b/docs/man/upssched.conf.5 index 7ed2fb5..a2e0e43 100644 --- a/docs/man/upssched.conf.5 +++ b/docs/man/upssched.conf.5 @@ -2,12 +2,12 @@ .\" Title: upssched.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSCHED\&.CONF" "5" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSSCHED\&.CONF" "5" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsset.cgi.8 b/docs/man/upsset.cgi.8 index d89ece6..30f5b21 100644 --- a/docs/man/upsset.cgi.8 +++ b/docs/man/upsset.cgi.8 @@ -2,12 +2,12 @@ .\" Title: upsset.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSET\&.CGI" "8" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSSET\&.CGI" "8" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsset.conf.5 b/docs/man/upsset.conf.5 index 931c821..e89a858 100644 --- a/docs/man/upsset.conf.5 +++ b/docs/man/upsset.conf.5 @@ -2,12 +2,12 @@ .\" Title: upsset.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSET\&.CONF" "5" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSSET\&.CONF" "5" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsstats.cgi.8 b/docs/man/upsstats.cgi.8 index 7ffbc0e..ed9bc01 100644 --- a/docs/man/upsstats.cgi.8 +++ b/docs/man/upsstats.cgi.8 @@ -2,12 +2,12 @@ .\" Title: upsstats.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSTATS\&.CGI" "8" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSSTATS\&.CGI" "8" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsstats.html.5 b/docs/man/upsstats.html.5 index b305592..1952eea 100644 --- a/docs/man/upsstats.html.5 +++ b/docs/man/upsstats.html.5 @@ -2,12 +2,12 @@ .\" Title: upsstats.html .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/22/2012 +.\" Date: 08/08/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSTATS\&.HTML" "5" "05/22/2012" "Network UPS Tools" "NUT Manual" +.TH "UPSSTATS\&.HTML" "5" "08/08/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/usbhid-ups.8 b/docs/man/usbhid-ups.8 index 207bfb1..a4b9e6f 100644 --- a/docs/man/usbhid-ups.8 +++ b/docs/man/usbhid-ups.8 @@ -2,12 +2,12 @@ .\" Title: usbhid-ups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "USBHID\-UPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "USBHID\-UPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/victronups.8 b/docs/man/victronups.8 index 412f19a..6ed84e9 100644 --- a/docs/man/victronups.8 +++ b/docs/man/victronups.8 @@ -2,12 +2,12 @@ .\" Title: victronups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 05/21/2012 +.\" Date: 08/07/2012 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "VICTRONUPS" "8" "05/21/2012" "Network UPS Tools" "NUT Manual" +.TH "VICTRONUPS" "8" "08/07/2012" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/new-clients.txt b/docs/new-clients.txt index 41c9804..fa02074 100644 --- a/docs/new-clients.txt +++ b/docs/new-clients.txt @@ -33,9 +33,9 @@ with `make` and `make install` as usual. This must be done before building other (non-NUT) programs which depend on them. For more information, refer to the linkman:upsclient[3], -manual page and the various -link:man/index.html#Developer_man[upscli_*(3)] functions documentation -referenced in the same file. +manual page and the various link:../man/index.html#devclient[upscli_*(3)] +functions documentation referenced in the same file. + Configuration helpers ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/new-drivers.txt b/docs/new-drivers.txt index 40a887f..21d4a09 100644 --- a/docs/new-drivers.txt +++ b/docs/new-drivers.txt @@ -54,7 +54,7 @@ upsdrv_info_t This structure tracks several description information about the driver: - * *name*: the driver full name, for banner printing. + * *name*: the driver full name, for banner printing and "driver.name" variable. * *version*: the driver's own version. For sub driver information, refer below to sub_upsdrv_info. This value has the form "X.YZ", and is published by main as "driver.version.internal". diff --git a/docs/nut-names.txt b/docs/nut-names.txt index e2563ab..10a431a 100644 --- a/docs/nut-names.txt +++ b/docs/nut-names.txt @@ -87,6 +87,8 @@ ups: General unit information (seconds) | 1209600 (two weeks) | ups.test.result | Results of last self test (opaque string) | Bad battery pack +| ups.test.date | Date of last self test + (opaque string) | 07/17/12 | ups.display.language | Language to use on front panel (*** opaque) | E | ups.contacts | UPS external contact sensors @@ -256,10 +258,10 @@ Valid with/without context (ie. per phase or aggregated/averaged) | voltage.minimum | Minimum seen voltage (V) | power | Apparent power (VA) | power.maximum | Maximum seen apparent power (VA) -| power.minimum | Maximum seen apparent power (VA) +| power.minimum | Minimum seen apparent power (VA) | power.percent | Percentage of apparent power related to maximum load -| power.maximum.percent | Max seen percentage of apparent power -| power.minimum.percent | Min seen percentage of apparent power +| power.maximum.percent | Maximum seen percentage of apparent power +| power.minimum.percent | Minimum seen percentage of apparent power | realpower | Real power (W) | powerfactor | Power Factor (dimensionless value between 0.00 and 1.00) | crestfactor | Crest Factor (dimensionless value greater or equal to 1) @@ -320,6 +322,7 @@ battery: Any battery details (Ie battery.charge = 100) | 26,9 | battery.capacity | Battery capacity (Ah) | 7.2 | battery.current | Battery current (A) | 1.19 +| battery.current.total | Total battery current (A) | 1.19 | battery.temperature | Battery temperature (degrees C) | 050.7 | battery.runtime | Battery runtime (seconds) | 1080 | battery.runtime.low | Remaining battery runtime when @@ -344,32 +347,39 @@ battery: Any battery details ambient: Conditions from external probe equipment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +NOTE: multiple sensors can be exposed using the indexed notation. +'ambient.*', without index or using '0', relates to the embedded sensor. +For example: 'ambient.temperature' represent the embedded sensor temperature. +Other sensors (external, communication card, ...) can use indexes +from '1' to 'n'. For example: 'ambient.1.temperature' for the first external +sensor temperature. + [options="header"] |=============================================================================== | Name | Description | Example value -| ambient.temperature | Ambient temperature +| ambient.n.temperature | Ambient temperature (degrees C) | 25.40 -| ambient.temperature.alarm | Temperature alarm +| ambient.n.temperature.alarm | Temperature alarm (enabled/disabled) | enabled -| ambient.temperature.high | Temperature threshold high +| ambient.n.temperature.high | Temperature threshold high (degrees C) | 40 -| ambient.temperature.low | Temperature threshold low +| ambient.n.temperature.low | Temperature threshold low (degrees C) | 5 -| ambient.temperature.maximum | Maximum temperature seen +| ambient.n.temperature.maximum | Maximum temperature seen (degrees C) | 37.6 -| ambient.temperature.minimum | Minimum temperature seen +| ambient.n.temperature.minimum | Minimum temperature seen (degrees C) | 18.1 -| ambient.humidity | Ambient relative humidity +| ambient.n.humidity | Ambient relative humidity (percent) | 038.8 -| ambient.humidity.alarm | Relative humidity alarm +| ambient.n.humidity.alarm | Relative humidity alarm (enabled/disabled) | enabled -| ambient.humidity.high | Relative humidity +| ambient.n.humidity.high | Relative humidity threshold high (percent) | 80 -| ambient.humidity.low | Relative humidity +| ambient.n.humidity.low | Relative humidity threshold high (percent) | 10 -| ambient.humidity.maximum | Maximum relative humidity +| ambient.n.humidity.maximum | Maximum relative humidity seen (percent) | 60 -| ambient.humidity.minimum | Minimum relative humidity +| ambient.n.humidity.minimum | Minimum relative humidity seen (percent) | 13 |=============================================================================== @@ -433,8 +443,9 @@ driver: Internal driver information | Name | Description | Example value | driver.name | Driver name | usbhid-ups | driver.version | Driver version (NUT release) | X.Y.Z -| driver.version.internal | Internal driver version - (if tracked separately) | 1.23.45 +| driver.version.internal | Internal driver version | 1.23.45 +| driver.version.data | Version of the internal data + mapping, for generic drivers | Eaton HID 1.31 | driver.parameter.xxx | Parameter xxx (ups.conf or cmdline -x) setting | (varies) | driver.flag.xxx | Flag xxx (ups.conf or diff --git a/docs/website/Makefile.am b/docs/website/Makefile.am index 0308139..bcf59b5 100644 --- a/docs/website/Makefile.am +++ b/docs/website/Makefile.am @@ -6,7 +6,7 @@ EXTRA_DIST = news.txt projects.txt website.txt \ $(FAVICON_FILES) IMAGE_FILES = images/asciidoc.png \ - images/eaton-logo.png \ + images/hostedby.png \ images/blue-arrow.png \ images/simple.png \ images/advanced.png \ diff --git a/docs/website/Makefile.in b/docs/website/Makefile.in index fc22885..3929fc3 100644 --- a/docs/website/Makefile.in +++ b/docs/website/Makefile.in @@ -84,6 +84,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -187,6 +193,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -253,7 +260,7 @@ EXTRA_DIST = news.txt projects.txt website.txt \ $(FAVICON_FILES) IMAGE_FILES = images/asciidoc.png \ - images/eaton-logo.png \ + images/hostedby.png \ images/blue-arrow.png \ images/simple.png \ images/advanced.png \ diff --git a/docs/website/css/web-layout.css b/docs/website/css/web-layout.css index 1edc014..c8580bc 100644 --- a/docs/website/css/web-layout.css +++ b/docs/website/css/web-layout.css @@ -139,3 +139,8 @@ td#driver-col { width: 30%; } #support-level-legend dd { margin: 0; padding: 0; width: 85%; float: left; } /*.support-level-descr { margin-left: 20px; float: right; }*/ + +/* Remove text underscores on href */ +div#footer-badges a:link, #layout-menu a:visited, #layout-menu a:hover { + text-decoration: none; +} diff --git a/docs/website/news.txt b/docs/website/news.txt index e8f4f9e..5e2acb9 100644 --- a/docs/website/news.txt +++ b/docs/website/news.txt @@ -1,3 +1,7 @@ +- August 8, 2012: 2.6.5 released +- June 27, 2012: link:download.html#_virtualization_packages[VMware NUT client for ESXI 5.0] +- June 5, 2012: link:http://wmnut.networkupstools.org[WMNut] 0.64 released, and move hosting +- June 4, 2012: link:download.html#_binary_packages[Beta NUT 2.6.4-1 package for Windows released] - May 31, 2012: 2.6.4 released, including link:http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-2944[CVE-2012-2944] fix - May 10, 2012: link:http://wmnut.mgeops.org[WMNut] 0.63 released - May 9, 2012: Official publication of Riello communication protocols diff --git a/docs/website/projects.txt b/docs/website/projects.txt index 5968036..59eeb88 100644 --- a/docs/website/projects.txt +++ b/docs/website/projects.txt @@ -55,11 +55,11 @@ NOTE: WinNUT is currently being replaced by a full port to Windows, part of the official NUT distribution. link:download.html#_binary_packages[MSI packages] are available too. -link:http://wmnut.mgeops.org/[WMNUT] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +link:http://wmnut.networkupstools.org[WMNUT] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -WMNut is a program to monitor multiple UPSs statistics through the NUT (Network -UPS Tools) framework on Linux and other systems. +WMNut is a dockapp program to monitor multiple UPSs statistics through the NUT +(Network UPS Tools) framework on Linux and other systems. Network Management Systems (NMS) integration -------------------------------------------- @@ -157,6 +157,8 @@ NOTE: UPS::Nut is part of NUT since version NUT 2.6.1. Hardware projects involving NUT ------------------------------- +This is an incomplete list of the hardware known to embed NUT. + link:http://www.dell.com/us/business/p/powervault-nx3500/pd[Dell PowerVault NX3500] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -198,6 +200,12 @@ link:http://www.thecus.com[Thecus NAS] Thecus NAS firmware includes NUT for UPS support. The link:http://www.thecus.com/Downloads/Compatible_List/UPS_List_v1.0_ALL.pdf[following list of devices] is known to be supported. + +link:http://www.buffalotech.com[Buffalo NAS] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Buffalo TeraStation NAS (Business-class) include NUT for UPS support. + link:http://www.webbastards.com/projects/[lcd-nut] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/website/web-layout.conf b/docs/website/web-layout.conf index 18af913..9072e1b 100644 --- a/docs/website/web-layout.conf +++ b/docs/website/web-layout.conf @@ -83,9 +83,9 @@ endif::hcl[]

  • Support
  • Alioth Forge
  • - +
    @@ -142,22 +142,22 @@ ifndef::textonly[] Powered by AsciiDoc + alt="Powered by AsciiDoc"/> Valid XHTML 1.1 + alt="Valid XHTML 1.1"/> Valid CSS! + alt="Valid CSS!"/> - - Firefox Download Button + + Hoster endif::textonly[]
    diff --git a/drivers/Makefile.am b/drivers/Makefile.am index 72630d9..45eff04 100644 --- a/drivers/Makefile.am +++ b/drivers/Makefile.am @@ -36,7 +36,7 @@ endif SERIAL_DRIVERLIST = bcmxcp belkin belkinunv bestfcom \ bestfortress bestuferrups bestups dummy-ups etapro everups \ gamatronic genericups isbmex liebert liebert-esp2 masterguard metasys \ - mge-shut mge-utalk microdowell newmge-shut oneac optiups powercom rhino \ + oldmge-shut mge-utalk microdowell mge-shut oneac optiups powercom rhino \ safenet skel solis tripplite tripplitesu upscode2 victronups powerpanel \ blazer_ser clone clone-outlet ivtscd apcsmart apcsmart-old SNMP_DRIVERLIST = snmp-ups @@ -46,9 +46,10 @@ USB_DRIVERLIST = $(USB_LIBUSB_DRIVERLIST) HAL_DRIVERLIST = hald-addon-usbhid-ups hald-addon-bcmxcp_usb \ hald-addon-tripplite_usb hald-addon-blazer_usb NEONXML_DRIVERLIST = netxml-ups +MACOSX_DRIVERLIST = macosx-ups # distribute all drivers, even ones that are not built by default -EXTRA_PROGRAMS = $(SERIAL_DRIVERLIST) $(SNMP_DRIVERLIST) $(USB_DRIVERLIST) $(NEONXML_DRIVERLIST) +EXTRA_PROGRAMS = $(SERIAL_DRIVERLIST) $(SNMP_DRIVERLIST) $(USB_DRIVERLIST) $(NEONXML_DRIVERLIST) $(MACOSX_DRIVERLIST) # construct the list of drivers to build if SOME_DRIVERS @@ -77,6 +78,9 @@ endif if WITH_IPMI driverexec_PROGRAMS += nut-ipmipsu endif +if WITH_MACOSX + driverexec_PROGRAMS += $(MACOSX_DRIVERLIST) +endif else driverexec_PROGRAMS += skel endif @@ -114,7 +118,7 @@ liebert_SOURCES = liebert.c liebert_esp2_SOURCES = liebert-esp2.c masterguard_SOURCES = masterguard.c metasys_SOURCES = metasys.c -mge_shut_SOURCES = mge-shut.c hidparser.c +oldmge_shut_SOURCES = mge-shut.c hidparser.c mge_utalk_SOURCES = mge-utalk.c microdowell_SOURCES = microdowell.c oneac_SOURCES = oneac.c @@ -174,10 +178,10 @@ richcomm_usb_SOURCES = richcomm_usb.c usb-common.c richcomm_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) # HID-over-serial -newmge_shut_SOURCES = usbhid-ups.c libshut.c libhid.c hidparser.c mge-hid.c +mge_shut_SOURCES = usbhid-ups.c libshut.c libhid.c hidparser.c mge-hid.c # per-target CFLAGS are necessary here -newmge_shut_CFLAGS = $(AM_CFLAGS) -DSHUT_MODE -newmge_shut_LDADD = $(LDADD) +mge_shut_CFLAGS = $(AM_CFLAGS) -DSHUT_MODE +mge_shut_LDADD = $(LDADD) # SNMP snmp_ups_SOURCES = snmp-ups.c apc-mib.c baytech-mib.c compaq-mib.c eaton-mib.c \ @@ -214,6 +218,11 @@ if WITH_FREEIPMI endif nut_ipmipsu_LDADD = $(LDADD) $(LIBIPMI_LIBS) +# Mac OS X metadriver +macosx_ups_LDADD = $(LDADD_DRIVERS) +macosx_ups_LDFLAGS = $(LDFLAGS) -framework IOKit -framework CoreFoundation +macosx_ups_SOURCES = macosx-ups.c + # ---------------------------------------------------------------------- # List of header files. The purpose of this list is not dependency # tracking (which is automatic), but to ensure these files are diff --git a/drivers/Makefile.in b/drivers/Makefile.in index 8b2c02e..eda7250 100644 --- a/drivers/Makefile.in +++ b/drivers/Makefile.in @@ -45,27 +45,30 @@ target_triplet = @target@ @WITH_LIBPOWERMAN_TRUE@am__append_5 = $(LIBPOWERMAN_CFLAGS) @WITH_IPMI_TRUE@am__append_6 = $(LIBIPMI_CFLAGS) EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) \ - $(am__EXEEXT_5) -@SOME_DRIVERS_FALSE@driverexec_PROGRAMS = $(am__EXEEXT_6) \ -@SOME_DRIVERS_FALSE@ $(am__EXEEXT_7) $(am__EXEEXT_8) \ -@SOME_DRIVERS_FALSE@ $(am__EXEEXT_9) $(am__EXEEXT_10) \ -@SOME_DRIVERS_FALSE@ $(am__EXEEXT_11) upsdrvctl$(EXEEXT) + $(am__EXEEXT_5) $(am__EXEEXT_6) +@SOME_DRIVERS_FALSE@driverexec_PROGRAMS = $(am__EXEEXT_7) \ +@SOME_DRIVERS_FALSE@ $(am__EXEEXT_8) $(am__EXEEXT_9) \ +@SOME_DRIVERS_FALSE@ $(am__EXEEXT_10) $(am__EXEEXT_11) \ +@SOME_DRIVERS_FALSE@ $(am__EXEEXT_12) $(am__EXEEXT_13) \ +@SOME_DRIVERS_FALSE@ upsdrvctl$(EXEEXT) @SOME_DRIVERS_TRUE@driverexec_PROGRAMS = $(DRIVER_BUILD_LIST) \ -@SOME_DRIVERS_TRUE@ $(am__EXEEXT_6) $(am__EXEEXT_7) \ -@SOME_DRIVERS_TRUE@ $(am__EXEEXT_8) $(am__EXEEXT_9) \ -@SOME_DRIVERS_TRUE@ $(am__EXEEXT_10) $(am__EXEEXT_11) \ -@SOME_DRIVERS_TRUE@ skel$(EXEEXT) upsdrvctl$(EXEEXT) +@SOME_DRIVERS_TRUE@ $(am__EXEEXT_7) $(am__EXEEXT_8) \ +@SOME_DRIVERS_TRUE@ $(am__EXEEXT_9) $(am__EXEEXT_10) \ +@SOME_DRIVERS_TRUE@ $(am__EXEEXT_11) $(am__EXEEXT_12) \ +@SOME_DRIVERS_TRUE@ $(am__EXEEXT_13) skel$(EXEEXT) \ +@SOME_DRIVERS_TRUE@ upsdrvctl$(EXEEXT) @SOME_DRIVERS_FALSE@@WITH_SERIAL_TRUE@am__append_7 = $(SERIAL_DRIVERLIST) @SOME_DRIVERS_FALSE@@WITH_SNMP_TRUE@am__append_8 = $(SNMP_DRIVERLIST) @SOME_DRIVERS_FALSE@@WITH_USB_TRUE@am__append_9 = $(USB_LIBUSB_DRIVERLIST) @SOME_DRIVERS_FALSE@@WITH_HAL_TRUE@halexec_PROGRAMS = \ -@SOME_DRIVERS_FALSE@@WITH_HAL_TRUE@ $(am__EXEEXT_12) +@SOME_DRIVERS_FALSE@@WITH_HAL_TRUE@ $(am__EXEEXT_14) @SOME_DRIVERS_FALSE@@WITH_NEON_TRUE@am__append_10 = $(NEONXML_DRIVERLIST) @SOME_DRIVERS_FALSE@@WITH_LIBPOWERMAN_TRUE@am__append_11 = powerman-pdu @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__append_12 = nut-ipmipsu -@WITH_SSL_TRUE@am__append_13 = $(LIBSSL_CFLAGS) -@WITH_SSL_TRUE@am__append_14 = $(LIBSSL_LIBS) -@WITH_FREEIPMI_TRUE@am__append_15 = nut-libfreeipmi.c +@SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__append_13 = $(MACOSX_DRIVERLIST) +@WITH_SSL_TRUE@am__append_14 = $(LIBSSL_CFLAGS) +@WITH_SSL_TRUE@am__append_15 = $(LIBSSL_LIBS) +@WITH_FREEIPMI_TRUE@am__append_16 = nut-libfreeipmi.c subdir = drivers DIST_COMMON = $(dist_noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -114,8 +117,8 @@ am__EXEEXT_1 = bcmxcp$(EXEEXT) belkin$(EXEEXT) belkinunv$(EXEEXT) \ bestups$(EXEEXT) dummy-ups$(EXEEXT) etapro$(EXEEXT) \ everups$(EXEEXT) gamatronic$(EXEEXT) genericups$(EXEEXT) \ isbmex$(EXEEXT) liebert$(EXEEXT) liebert-esp2$(EXEEXT) \ - masterguard$(EXEEXT) metasys$(EXEEXT) mge-shut$(EXEEXT) \ - mge-utalk$(EXEEXT) microdowell$(EXEEXT) newmge-shut$(EXEEXT) \ + masterguard$(EXEEXT) metasys$(EXEEXT) oldmge-shut$(EXEEXT) \ + mge-utalk$(EXEEXT) microdowell$(EXEEXT) mge-shut$(EXEEXT) \ oneac$(EXEEXT) optiups$(EXEEXT) powercom$(EXEEXT) \ rhino$(EXEEXT) safenet$(EXEEXT) skel$(EXEEXT) solis$(EXEEXT) \ tripplite$(EXEEXT) tripplitesu$(EXEEXT) upscode2$(EXEEXT) \ @@ -128,16 +131,18 @@ am__EXEEXT_3 = usbhid-ups$(EXEEXT) bcmxcp_usb$(EXEEXT) \ richcomm_usb$(EXEEXT) am__EXEEXT_4 = $(am__EXEEXT_3) am__EXEEXT_5 = netxml-ups$(EXEEXT) -@SOME_DRIVERS_FALSE@@WITH_SERIAL_TRUE@am__EXEEXT_6 = $(am__EXEEXT_1) -@SOME_DRIVERS_FALSE@@WITH_SNMP_TRUE@am__EXEEXT_7 = $(am__EXEEXT_2) -@SOME_DRIVERS_FALSE@@WITH_USB_TRUE@am__EXEEXT_8 = $(am__EXEEXT_3) -@SOME_DRIVERS_FALSE@@WITH_NEON_TRUE@am__EXEEXT_9 = $(am__EXEEXT_5) -@SOME_DRIVERS_FALSE@@WITH_LIBPOWERMAN_TRUE@am__EXEEXT_10 = powerman-pdu$(EXEEXT) -@SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__EXEEXT_11 = \ +am__EXEEXT_6 = macosx-ups$(EXEEXT) +@SOME_DRIVERS_FALSE@@WITH_SERIAL_TRUE@am__EXEEXT_7 = $(am__EXEEXT_1) +@SOME_DRIVERS_FALSE@@WITH_SNMP_TRUE@am__EXEEXT_8 = $(am__EXEEXT_2) +@SOME_DRIVERS_FALSE@@WITH_USB_TRUE@am__EXEEXT_9 = $(am__EXEEXT_3) +@SOME_DRIVERS_FALSE@@WITH_NEON_TRUE@am__EXEEXT_10 = $(am__EXEEXT_5) +@SOME_DRIVERS_FALSE@@WITH_LIBPOWERMAN_TRUE@am__EXEEXT_11 = powerman-pdu$(EXEEXT) +@SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__EXEEXT_12 = \ @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@ nut-ipmipsu$(EXEEXT) +@SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__EXEEXT_13 = $(am__EXEEXT_6) am__installdirs = "$(DESTDIR)$(driverexecdir)" \ "$(DESTDIR)$(halexecdir)" -am__EXEEXT_12 = hald-addon-usbhid-ups$(EXEEXT) \ +am__EXEEXT_14 = hald-addon-usbhid-ups$(EXEEXT) \ hald-addon-bcmxcp_usb$(EXEEXT) \ hald-addon-tripplite_usb$(EXEEXT) \ hald-addon-blazer_usb$(EXEEXT) @@ -264,6 +269,12 @@ am_liebert_esp2_OBJECTS = liebert-esp2.$(OBJEXT) liebert_esp2_OBJECTS = $(am_liebert_esp2_OBJECTS) liebert_esp2_LDADD = $(LDADD) liebert_esp2_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_macosx_ups_OBJECTS = macosx-ups.$(OBJEXT) +macosx_ups_OBJECTS = $(am_macosx_ups_OBJECTS) +macosx_ups_DEPENDENCIES = $(LDADD_DRIVERS) +macosx_ups_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(macosx_ups_LDFLAGS) $(LDFLAGS) -o $@ am_masterguard_OBJECTS = masterguard.$(OBJEXT) masterguard_OBJECTS = $(am_masterguard_OBJECTS) masterguard_LDADD = $(LDADD) @@ -272,10 +283,14 @@ am_metasys_OBJECTS = metasys.$(OBJEXT) metasys_OBJECTS = $(am_metasys_OBJECTS) metasys_LDADD = $(LDADD) metasys_DEPENDENCIES = $(am__DEPENDENCIES_2) -am_mge_shut_OBJECTS = mge-shut.$(OBJEXT) hidparser.$(OBJEXT) +am_mge_shut_OBJECTS = mge_shut-usbhid-ups.$(OBJEXT) \ + mge_shut-libshut.$(OBJEXT) mge_shut-libhid.$(OBJEXT) \ + mge_shut-hidparser.$(OBJEXT) mge_shut-mge-hid.$(OBJEXT) mge_shut_OBJECTS = $(am_mge_shut_OBJECTS) -mge_shut_LDADD = $(LDADD) -mge_shut_DEPENDENCIES = $(am__DEPENDENCIES_2) +mge_shut_DEPENDENCIES = $(am__DEPENDENCIES_3) +mge_shut_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(mge_shut_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ am_mge_utalk_OBJECTS = mge-utalk.$(OBJEXT) mge_utalk_OBJECTS = $(am_mge_utalk_OBJECTS) mge_utalk_LDADD = $(LDADD) @@ -287,19 +302,15 @@ microdowell_DEPENDENCIES = $(am__DEPENDENCIES_2) am_netxml_ups_OBJECTS = netxml-ups.$(OBJEXT) mge-xml.$(OBJEXT) netxml_ups_OBJECTS = $(am_netxml_ups_OBJECTS) netxml_ups_DEPENDENCIES = $(LDADD_DRIVERS) $(am__DEPENDENCIES_1) -am_newmge_shut_OBJECTS = newmge_shut-usbhid-ups.$(OBJEXT) \ - newmge_shut-libshut.$(OBJEXT) newmge_shut-libhid.$(OBJEXT) \ - newmge_shut-hidparser.$(OBJEXT) newmge_shut-mge-hid.$(OBJEXT) -newmge_shut_OBJECTS = $(am_newmge_shut_OBJECTS) -newmge_shut_DEPENDENCIES = $(am__DEPENDENCIES_3) -newmge_shut_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(newmge_shut_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__nut_ipmipsu_SOURCES_DIST = nut-ipmipsu.c nut-libfreeipmi.c @WITH_FREEIPMI_TRUE@am__objects_2 = nut-libfreeipmi.$(OBJEXT) am_nut_ipmipsu_OBJECTS = nut-ipmipsu.$(OBJEXT) $(am__objects_2) nut_ipmipsu_OBJECTS = $(am_nut_ipmipsu_OBJECTS) nut_ipmipsu_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_1) +am_oldmge_shut_OBJECTS = mge-shut.$(OBJEXT) hidparser.$(OBJEXT) +oldmge_shut_OBJECTS = $(am_oldmge_shut_OBJECTS) +oldmge_shut_LDADD = $(LDADD) +oldmge_shut_DEPENDENCIES = $(am__DEPENDENCIES_2) am_oneac_OBJECTS = oneac.$(OBJEXT) oneac_OBJECTS = $(am_oneac_OBJECTS) oneac_LDADD = $(LDADD) @@ -394,11 +405,11 @@ SOURCES = $(libdummy_a_SOURCES) $(libnuthalmain_a_SOURCES) \ $(hald_addon_tripplite_usb_SOURCES) \ $(hald_addon_usbhid_ups_SOURCES) $(isbmex_SOURCES) \ $(ivtscd_SOURCES) $(liebert_SOURCES) $(liebert_esp2_SOURCES) \ - $(masterguard_SOURCES) $(metasys_SOURCES) $(mge_shut_SOURCES) \ - $(mge_utalk_SOURCES) $(microdowell_SOURCES) \ - $(netxml_ups_SOURCES) $(newmge_shut_SOURCES) \ - $(nut_ipmipsu_SOURCES) $(oneac_SOURCES) $(optiups_SOURCES) \ - $(powercom_SOURCES) $(powerman_pdu_SOURCES) \ + $(macosx_ups_SOURCES) $(masterguard_SOURCES) \ + $(metasys_SOURCES) $(mge_shut_SOURCES) $(mge_utalk_SOURCES) \ + $(microdowell_SOURCES) $(netxml_ups_SOURCES) \ + $(nut_ipmipsu_SOURCES) $(oldmge_shut_SOURCES) $(oneac_SOURCES) \ + $(optiups_SOURCES) $(powercom_SOURCES) $(powerman_pdu_SOURCES) \ $(powerpanel_SOURCES) $(rhino_SOURCES) $(richcomm_usb_SOURCES) \ $(safenet_SOURCES) $(skel_SOURCES) $(snmp_ups_SOURCES) \ $(solis_SOURCES) $(tripplite_SOURCES) $(tripplite_usb_SOURCES) \ @@ -417,16 +428,16 @@ DIST_SOURCES = $(libdummy_a_SOURCES) $(libnuthalmain_a_SOURCES) \ $(hald_addon_tripplite_usb_SOURCES) \ $(hald_addon_usbhid_ups_SOURCES) $(isbmex_SOURCES) \ $(ivtscd_SOURCES) $(liebert_SOURCES) $(liebert_esp2_SOURCES) \ - $(masterguard_SOURCES) $(metasys_SOURCES) $(mge_shut_SOURCES) \ - $(mge_utalk_SOURCES) $(microdowell_SOURCES) \ - $(netxml_ups_SOURCES) $(newmge_shut_SOURCES) \ - $(am__nut_ipmipsu_SOURCES_DIST) $(oneac_SOURCES) \ - $(optiups_SOURCES) $(powercom_SOURCES) $(powerman_pdu_SOURCES) \ - $(powerpanel_SOURCES) $(rhino_SOURCES) $(richcomm_usb_SOURCES) \ - $(safenet_SOURCES) $(skel_SOURCES) $(snmp_ups_SOURCES) \ - $(solis_SOURCES) $(tripplite_SOURCES) $(tripplite_usb_SOURCES) \ - $(tripplitesu_SOURCES) $(upscode2_SOURCES) \ - $(upsdrvctl_SOURCES) $(usbhid_ups_SOURCES) \ + $(macosx_ups_SOURCES) $(masterguard_SOURCES) \ + $(metasys_SOURCES) $(mge_shut_SOURCES) $(mge_utalk_SOURCES) \ + $(microdowell_SOURCES) $(netxml_ups_SOURCES) \ + $(am__nut_ipmipsu_SOURCES_DIST) $(oldmge_shut_SOURCES) \ + $(oneac_SOURCES) $(optiups_SOURCES) $(powercom_SOURCES) \ + $(powerman_pdu_SOURCES) $(powerpanel_SOURCES) $(rhino_SOURCES) \ + $(richcomm_usb_SOURCES) $(safenet_SOURCES) $(skel_SOURCES) \ + $(snmp_ups_SOURCES) $(solis_SOURCES) $(tripplite_SOURCES) \ + $(tripplite_usb_SOURCES) $(tripplitesu_SOURCES) \ + $(upscode2_SOURCES) $(upsdrvctl_SOURCES) $(usbhid_ups_SOURCES) \ $(victronups_SOURCES) HEADERS = $(dist_noinst_HEADERS) ETAGS = etags @@ -448,6 +459,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -551,6 +568,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -628,7 +646,7 @@ AM_CFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) \ SERIAL_DRIVERLIST = bcmxcp belkin belkinunv bestfcom \ bestfortress bestuferrups bestups dummy-ups etapro everups \ gamatronic genericups isbmex liebert liebert-esp2 masterguard metasys \ - mge-shut mge-utalk microdowell newmge-shut oneac optiups powercom rhino \ + oldmge-shut mge-utalk microdowell mge-shut oneac optiups powercom rhino \ safenet skel solis tripplite tripplitesu upscode2 victronups powerpanel \ blazer_ser clone clone-outlet ivtscd apcsmart apcsmart-old @@ -641,6 +659,7 @@ HAL_DRIVERLIST = hald-addon-usbhid-ups hald-addon-bcmxcp_usb \ hald-addon-tripplite_usb hald-addon-blazer_usb NEONXML_DRIVERLIST = netxml-ups +MACOSX_DRIVERLIST = macosx-ups @SOME_DRIVERS_FALSE@@WITH_HAL_TRUE@halexecdir = $(HAL_CALLOUTS_PATH) # ========================================================================== @@ -673,7 +692,7 @@ liebert_SOURCES = liebert.c liebert_esp2_SOURCES = liebert-esp2.c masterguard_SOURCES = masterguard.c metasys_SOURCES = metasys.c -mge_shut_SOURCES = mge-shut.c hidparser.c +oldmge_shut_SOURCES = mge-shut.c hidparser.c mge_utalk_SOURCES = mge-utalk.c microdowell_SOURCES = microdowell.c oneac_SOURCES = oneac.c @@ -698,9 +717,9 @@ victronups_SOURCES = victronups.c # dummy dummy_ups_SOURCES = dummy-ups.c dummy_ups_CFLAGS = $(AM_CFLAGS) -I$(top_srcdir)/clients \ - $(am__append_13) -dummy_ups_LDADD = $(LDADD_DRIVERS) ../clients/libupsclient.la \ $(am__append_14) +dummy_ups_LDADD = $(LDADD_DRIVERS) ../clients/libupsclient.la \ + $(am__append_15) # Clone drivers clone_SOURCES = clone.c @@ -728,10 +747,10 @@ richcomm_usb_SOURCES = richcomm_usb.c usb-common.c richcomm_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) # HID-over-serial -newmge_shut_SOURCES = usbhid-ups.c libshut.c libhid.c hidparser.c mge-hid.c +mge_shut_SOURCES = usbhid-ups.c libshut.c libhid.c hidparser.c mge-hid.c # per-target CFLAGS are necessary here -newmge_shut_CFLAGS = $(AM_CFLAGS) -DSHUT_MODE -newmge_shut_LDADD = $(LDADD) +mge_shut_CFLAGS = $(AM_CFLAGS) -DSHUT_MODE +mge_shut_LDADD = $(LDADD) # SNMP snmp_ups_SOURCES = snmp-ups.c apc-mib.c baytech-mib.c compaq-mib.c eaton-mib.c \ @@ -761,9 +780,14 @@ powerman_pdu_SOURCES = powerman-pdu.c powerman_pdu_LDADD = $(LDADD) $(LIBPOWERMAN_LIBS) # IPMI PSU -nut_ipmipsu_SOURCES = nut-ipmipsu.c $(am__append_15) +nut_ipmipsu_SOURCES = nut-ipmipsu.c $(am__append_16) nut_ipmipsu_LDADD = $(LDADD) $(LIBIPMI_LIBS) +# Mac OS X metadriver +macosx_ups_LDADD = $(LDADD_DRIVERS) +macosx_ups_LDFLAGS = $(LDFLAGS) -framework IOKit -framework CoreFoundation +macosx_ups_SOURCES = macosx-ups.c + # ---------------------------------------------------------------------- # List of header files. The purpose of this list is not dependency # tracking (which is automatic), but to ensure these files are @@ -1001,6 +1025,9 @@ liebert$(EXEEXT): $(liebert_OBJECTS) $(liebert_DEPENDENCIES) liebert-esp2$(EXEEXT): $(liebert_esp2_OBJECTS) $(liebert_esp2_DEPENDENCIES) @rm -f liebert-esp2$(EXEEXT) $(LINK) $(liebert_esp2_OBJECTS) $(liebert_esp2_LDADD) $(LIBS) +macosx-ups$(EXEEXT): $(macosx_ups_OBJECTS) $(macosx_ups_DEPENDENCIES) + @rm -f macosx-ups$(EXEEXT) + $(macosx_ups_LINK) $(macosx_ups_OBJECTS) $(macosx_ups_LDADD) $(LIBS) masterguard$(EXEEXT): $(masterguard_OBJECTS) $(masterguard_DEPENDENCIES) @rm -f masterguard$(EXEEXT) $(LINK) $(masterguard_OBJECTS) $(masterguard_LDADD) $(LIBS) @@ -1009,7 +1036,7 @@ metasys$(EXEEXT): $(metasys_OBJECTS) $(metasys_DEPENDENCIES) $(LINK) $(metasys_OBJECTS) $(metasys_LDADD) $(LIBS) mge-shut$(EXEEXT): $(mge_shut_OBJECTS) $(mge_shut_DEPENDENCIES) @rm -f mge-shut$(EXEEXT) - $(LINK) $(mge_shut_OBJECTS) $(mge_shut_LDADD) $(LIBS) + $(mge_shut_LINK) $(mge_shut_OBJECTS) $(mge_shut_LDADD) $(LIBS) mge-utalk$(EXEEXT): $(mge_utalk_OBJECTS) $(mge_utalk_DEPENDENCIES) @rm -f mge-utalk$(EXEEXT) $(LINK) $(mge_utalk_OBJECTS) $(mge_utalk_LDADD) $(LIBS) @@ -1019,12 +1046,12 @@ microdowell$(EXEEXT): $(microdowell_OBJECTS) $(microdowell_DEPENDENCIES) netxml-ups$(EXEEXT): $(netxml_ups_OBJECTS) $(netxml_ups_DEPENDENCIES) @rm -f netxml-ups$(EXEEXT) $(LINK) $(netxml_ups_OBJECTS) $(netxml_ups_LDADD) $(LIBS) -newmge-shut$(EXEEXT): $(newmge_shut_OBJECTS) $(newmge_shut_DEPENDENCIES) - @rm -f newmge-shut$(EXEEXT) - $(newmge_shut_LINK) $(newmge_shut_OBJECTS) $(newmge_shut_LDADD) $(LIBS) nut-ipmipsu$(EXEEXT): $(nut_ipmipsu_OBJECTS) $(nut_ipmipsu_DEPENDENCIES) @rm -f nut-ipmipsu$(EXEEXT) $(LINK) $(nut_ipmipsu_OBJECTS) $(nut_ipmipsu_LDADD) $(LIBS) +oldmge-shut$(EXEEXT): $(oldmge_shut_OBJECTS) $(oldmge_shut_DEPENDENCIES) + @rm -f oldmge-shut$(EXEEXT) + $(LINK) $(oldmge_shut_OBJECTS) $(oldmge_shut_LDADD) $(LIBS) oneac$(EXEEXT): $(oneac_OBJECTS) $(oneac_DEPENDENCIES) @rm -f oneac$(EXEEXT) $(LINK) $(oneac_OBJECTS) $(oneac_LDADD) $(LIBS) @@ -1130,6 +1157,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liebert-esp2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liebert-hid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liebert.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macosx-ups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-hal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/masterguard.Po@am__quote@ @@ -1139,14 +1167,14 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge-shut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge-utalk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge-xml.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge_shut-hidparser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge_shut-libhid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge_shut-libshut.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge_shut-mge-hid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mge_shut-usbhid-ups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/microdowell.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netvision-mib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netxml-ups.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newmge_shut-hidparser.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newmge_shut-libhid.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newmge_shut-libshut.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newmge_shut-mge-hid.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newmge_shut-usbhid-ups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nut-ipmipsu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nut-libfreeipmi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oneac.Po@am__quote@ @@ -1211,75 +1239,75 @@ dummy_ups-dummy-ups.obj: dummy-ups.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -c -o dummy_ups-dummy-ups.obj `if test -f 'dummy-ups.c'; then $(CYGPATH_W) 'dummy-ups.c'; else $(CYGPATH_W) '$(srcdir)/dummy-ups.c'; fi` -newmge_shut-usbhid-ups.o: usbhid-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-usbhid-ups.o -MD -MP -MF $(DEPDIR)/newmge_shut-usbhid-ups.Tpo -c -o newmge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-usbhid-ups.Tpo $(DEPDIR)/newmge_shut-usbhid-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usbhid-ups.c' object='newmge_shut-usbhid-ups.o' libtool=no @AMDEPBACKSLASH@ +mge_shut-usbhid-ups.o: usbhid-ups.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-usbhid-ups.o -MD -MP -MF $(DEPDIR)/mge_shut-usbhid-ups.Tpo -c -o mge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-usbhid-ups.Tpo $(DEPDIR)/mge_shut-usbhid-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usbhid-ups.c' object='mge_shut-usbhid-ups.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c -newmge_shut-usbhid-ups.obj: usbhid-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-usbhid-ups.obj -MD -MP -MF $(DEPDIR)/newmge_shut-usbhid-ups.Tpo -c -o newmge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-usbhid-ups.Tpo $(DEPDIR)/newmge_shut-usbhid-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usbhid-ups.c' object='newmge_shut-usbhid-ups.obj' libtool=no @AMDEPBACKSLASH@ +mge_shut-usbhid-ups.obj: usbhid-ups.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-usbhid-ups.obj -MD -MP -MF $(DEPDIR)/mge_shut-usbhid-ups.Tpo -c -o mge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-usbhid-ups.Tpo $(DEPDIR)/mge_shut-usbhid-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usbhid-ups.c' object='mge_shut-usbhid-ups.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` -newmge_shut-libshut.o: libshut.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-libshut.o -MD -MP -MF $(DEPDIR)/newmge_shut-libshut.Tpo -c -o newmge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-libshut.Tpo $(DEPDIR)/newmge_shut-libshut.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libshut.c' object='newmge_shut-libshut.o' libtool=no @AMDEPBACKSLASH@ +mge_shut-libshut.o: libshut.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libshut.o -MD -MP -MF $(DEPDIR)/mge_shut-libshut.Tpo -c -o mge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libshut.Tpo $(DEPDIR)/mge_shut-libshut.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libshut.c' object='mge_shut-libshut.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c -newmge_shut-libshut.obj: libshut.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-libshut.obj -MD -MP -MF $(DEPDIR)/newmge_shut-libshut.Tpo -c -o newmge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-libshut.Tpo $(DEPDIR)/newmge_shut-libshut.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libshut.c' object='newmge_shut-libshut.obj' libtool=no @AMDEPBACKSLASH@ +mge_shut-libshut.obj: libshut.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libshut.obj -MD -MP -MF $(DEPDIR)/mge_shut-libshut.Tpo -c -o mge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libshut.Tpo $(DEPDIR)/mge_shut-libshut.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libshut.c' object='mge_shut-libshut.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` -newmge_shut-libhid.o: libhid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-libhid.o -MD -MP -MF $(DEPDIR)/newmge_shut-libhid.Tpo -c -o newmge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-libhid.Tpo $(DEPDIR)/newmge_shut-libhid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libhid.c' object='newmge_shut-libhid.o' libtool=no @AMDEPBACKSLASH@ +mge_shut-libhid.o: libhid.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libhid.o -MD -MP -MF $(DEPDIR)/mge_shut-libhid.Tpo -c -o mge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libhid.Tpo $(DEPDIR)/mge_shut-libhid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libhid.c' object='mge_shut-libhid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c -newmge_shut-libhid.obj: libhid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-libhid.obj -MD -MP -MF $(DEPDIR)/newmge_shut-libhid.Tpo -c -o newmge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-libhid.Tpo $(DEPDIR)/newmge_shut-libhid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libhid.c' object='newmge_shut-libhid.obj' libtool=no @AMDEPBACKSLASH@ +mge_shut-libhid.obj: libhid.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libhid.obj -MD -MP -MF $(DEPDIR)/mge_shut-libhid.Tpo -c -o mge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libhid.Tpo $(DEPDIR)/mge_shut-libhid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libhid.c' object='mge_shut-libhid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` -newmge_shut-hidparser.o: hidparser.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-hidparser.o -MD -MP -MF $(DEPDIR)/newmge_shut-hidparser.Tpo -c -o newmge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-hidparser.Tpo $(DEPDIR)/newmge_shut-hidparser.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hidparser.c' object='newmge_shut-hidparser.o' libtool=no @AMDEPBACKSLASH@ +mge_shut-hidparser.o: hidparser.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-hidparser.o -MD -MP -MF $(DEPDIR)/mge_shut-hidparser.Tpo -c -o mge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-hidparser.Tpo $(DEPDIR)/mge_shut-hidparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hidparser.c' object='mge_shut-hidparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c -newmge_shut-hidparser.obj: hidparser.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-hidparser.obj -MD -MP -MF $(DEPDIR)/newmge_shut-hidparser.Tpo -c -o newmge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-hidparser.Tpo $(DEPDIR)/newmge_shut-hidparser.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hidparser.c' object='newmge_shut-hidparser.obj' libtool=no @AMDEPBACKSLASH@ +mge_shut-hidparser.obj: hidparser.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-hidparser.obj -MD -MP -MF $(DEPDIR)/mge_shut-hidparser.Tpo -c -o mge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-hidparser.Tpo $(DEPDIR)/mge_shut-hidparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hidparser.c' object='mge_shut-hidparser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` -newmge_shut-mge-hid.o: mge-hid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-mge-hid.o -MD -MP -MF $(DEPDIR)/newmge_shut-mge-hid.Tpo -c -o newmge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-mge-hid.Tpo $(DEPDIR)/newmge_shut-mge-hid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mge-hid.c' object='newmge_shut-mge-hid.o' libtool=no @AMDEPBACKSLASH@ +mge_shut-mge-hid.o: mge-hid.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-mge-hid.o -MD -MP -MF $(DEPDIR)/mge_shut-mge-hid.Tpo -c -o mge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-mge-hid.Tpo $(DEPDIR)/mge_shut-mge-hid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mge-hid.c' object='mge_shut-mge-hid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c -newmge_shut-mge-hid.obj: mge-hid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -MT newmge_shut-mge-hid.obj -MD -MP -MF $(DEPDIR)/newmge_shut-mge-hid.Tpo -c -o newmge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/newmge_shut-mge-hid.Tpo $(DEPDIR)/newmge_shut-mge-hid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mge-hid.c' object='newmge_shut-mge-hid.obj' libtool=no @AMDEPBACKSLASH@ +mge_shut-mge-hid.obj: mge-hid.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-mge-hid.obj -MD -MP -MF $(DEPDIR)/mge_shut-mge-hid.Tpo -c -o mge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-mge-hid.Tpo $(DEPDIR)/mge_shut-mge-hid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mge-hid.c' object='mge_shut-mge-hid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(newmge_shut_CFLAGS) $(CFLAGS) -c -o newmge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` mostlyclean-libtool: -rm -f *.lo diff --git a/drivers/apc-mib.c b/drivers/apc-mib.c index 368504c..8851a6f 100644 --- a/drivers/apc-mib.c +++ b/drivers/apc-mib.c @@ -1,8 +1,9 @@ /* apc-mib.c - data to monitor APC SNMP devices (Powernet MIB) with NUT * - * Copyright (C) 2002-2003 - * Dmitry Frolov - * Arnaud Quette + * Copyright (C) + * 2002-2003 - Dmitry Frolov + * 2002-2012 - Arnaud Quette + * 2012 - Chew Hong Gunn (high precision values) * * Sponsored by MGE UPS SYSTEMS * @@ -25,7 +26,7 @@ #include "apc-mib.h" -#define APCC_MIB_VERSION "1.1" +#define APCC_MIB_VERSION "1.2" /* Other APC sysOID: * @@ -45,6 +46,15 @@ /* TODO: find the right sysOID for this MIB * Ie ".1.3.6.1.4.1.318.1.1.1" or ".1.3.6.1.4.1.318" or? */ +/* .1.3.6.1.4.1.318.1.1.1 + * enterprise^ + * apc ---------^ + * products ------^ + * hardware --------^ + * ups ---------------^ + * ref: ftp://ftp.apc.com/apc/public/software/pnetmib/mib/404/powernet404.mib + */ + /* info elements */ #define APCC_OID_BATT_STATUS ".1.3.6.1.4.1.318.1.1.1.2.1.1.0" @@ -107,6 +117,19 @@ static info_lkp_t apcc_sensitivity_modes[] = { { 0, "NULL" } }; +#define APCC_OID_TRANSFERREASON "1.3.6.1.4.1.318.1.1.1.3.2.5.0" +static info_lkp_t apcc_transfer_reasons[] = { + { 1, "noTransfer" }, + { 2, "highLineVoltage" }, + { 3, "brownout" }, + { 4, "blackout" }, + { 5, "smallMomentarySag" }, + { 6, "deepMomentarySag" }, + { 7, "smallMomentarySpike" }, + { 8, "largeMomentarySpike" }, + { 9, "selfTest" }, + { 10, "rateOfVoltageChange" } +}; /* --- */ @@ -130,7 +153,12 @@ static snmp_info_t apcc_mib[] = { { "ups.model", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.318.1.1.1.1.1.1.0", "Generic Powernet SNMP device", SU_FLAG_STATIC | SU_FLAG_OK, NULL }, { "ups.serial", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.318.1.1.1.1.2.3.0", "", SU_FLAG_STATIC | SU_FLAG_OK, NULL }, { "ups.mfr.date", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.318.1.1.1.1.2.2.0", "", SU_FLAG_OK | SU_FLAG_STATIC, NULL }, + { "input.voltage", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.3.3.1.0", "", SU_FLAG_OK | SU_FLAG_NEGINVALID | SU_FLAG_UNIQUE, NULL }, + { "input.voltage.maximum", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.3.3.2.0", "", SU_FLAG_OK | SU_FLAG_NEGINVALID | SU_FLAG_UNIQUE, NULL }, + { "input.voltage.minimum", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.3.3.3.0", "", SU_FLAG_OK | SU_FLAG_NEGINVALID | SU_FLAG_UNIQUE, NULL }, { "input.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.3.2.1.0", "", SU_FLAG_OK, NULL }, + { "input.voltage.maximum", 0, 1, ".1.3.6.1.4.1.318.1.1.1.3.2.2.0", "", SU_FLAG_OK, NULL }, + { "input.voltage.minimum", 0, 1, ".1.3.6.1.4.1.318.1.1.1.3.2.3.0", "", SU_FLAG_OK, NULL }, { "input.phases", ST_FLAG_STRING, 2, ".1.3.6.1.4.1.318.1.1.1.9.2.2.1.2.1", "", SU_FLAG_STATIC | SU_FLAG_OK, NULL }, { "input.L1-L2.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.9.2.3.1.3.1.1.1", "", SU_FLAG_OK|SU_FLAG_NEGINVALID, NULL }, { "input.L2-L3.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.9.2.3.1.3.1.1.2", "", SU_FLAG_OK|SU_FLAG_NEGINVALID, NULL }, @@ -151,9 +179,11 @@ static snmp_info_t apcc_mib[] = { { "input.L2.current.minimum", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.9.2.3.1.8.1.1.2", "", SU_FLAG_OK|SU_FLAG_NEGINVALID, NULL }, { "input.L3.current.minimum", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.9.2.3.1.8.1.1.3", "", SU_FLAG_OK|SU_FLAG_NEGINVALID, NULL }, { "input.frequency", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.9.2.2.1.4.1", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, + { "input.frequency", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.3.3.4.0", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, { "input.frequency", 0, 1, ".1.3.6.1.4.1.318.1.1.1.3.2.4.0", "", SU_FLAG_OK, NULL }, { "input.transfer.low", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.3.0", "", SU_TYPE_INT | SU_FLAG_OK, NULL }, { "input.transfer.high", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.2.0", "", SU_TYPE_INT | SU_FLAG_OK, NULL }, + { "input.transfer.reason", ST_FLAG_STRING, 1, APCC_OID_TRANSFERREASON, "", SU_TYPE_INT | SU_FLAG_OK, apcc_transfer_reasons }, { "input.sensitivity", ST_FLAG_STRING | ST_FLAG_RW, 1, APCC_OID_SENSITIVITY, "", SU_TYPE_INT | SU_FLAG_OK, apcc_sensitivity_modes }, { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, APCC_OID_POWER_STATUS, "OFF", SU_FLAG_OK | SU_STATUS_PWR, apcc_pwr_info }, @@ -163,27 +193,37 @@ static snmp_info_t apcc_mib[] = { SU_FLAG_OK | SU_STATUS_CAL, apcc_cal_info }, { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, APCC_OID_NEEDREPLBATT, "", SU_FLAG_OK | SU_STATUS_RB, apcc_battrepl_info }, + { "ups.temperature", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.2.3.2.0", "", SU_FLAG_OK|SU_FLAG_UNIQUE, NULL }, { "ups.temperature", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.2.0", "", SU_FLAG_OK, NULL }, + { "ups.load", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.4.3.3.0", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, { "ups.load", 0, 1, ".1.3.6.1.4.1.318.1.1.1.4.2.3.0", "", SU_FLAG_OK, NULL }, { "ups.firmware", ST_FLAG_STRING, 16, ".1.3.6.1.4.1.318.1.1.1.1.2.1.0", "", SU_FLAG_STATIC | SU_FLAG_OK, NULL }, { "ups.delay.shutdown", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.10.0", "", SU_FLAG_OK, NULL }, { "ups.delay.start", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.9.0", "", SU_FLAG_OK, NULL }, + { "battery.charge", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.2.3.1.0", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, { "battery.charge", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.1.0", "", SU_FLAG_OK, NULL }, { "battery.charge.restart", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.6.0", "", SU_TYPE_INT | SU_FLAG_OK, NULL }, { "battery.runtime", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.3.0", "", SU_FLAG_OK, NULL }, { "battery.runtime.low", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.8.0", "", SU_FLAG_OK, NULL }, + { "battery.voltage", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.2.3.4.0", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, { "battery.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.8.0", "", SU_FLAG_OK, NULL }, { "battery.voltage.nominal", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.7.0", "", SU_FLAG_OK, NULL }, + { "battery.current", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.2.3.5.0", "", SU_FLAG_OK|SU_FLAG_UNIQUE, NULL }, { "battery.current", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.9.0", "", SU_FLAG_OK, NULL }, + { "battery.current.total", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.2.3.6.0", "", SU_FLAG_OK, NULL }, { "battery.packs", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.5.0", "", SU_FLAG_OK, NULL }, { "battery.packs.bad", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.6.0", "", SU_FLAG_OK, NULL }, { "battery.date", ST_FLAG_STRING | ST_FLAG_RW, 8, ".1.3.6.1.4.1.318.1.1.1.2.1.3.0", "", SU_FLAG_OK | SU_FLAG_STATIC | SU_TYPE_STRING, NULL }, { "ups.id", ST_FLAG_STRING | ST_FLAG_RW, 8, ".1.3.6.1.4.1.318.1.1.1.1.1.2.0", "", SU_FLAG_OK | SU_FLAG_STATIC | SU_TYPE_STRING, NULL }, { "ups.test.result", ST_FLAG_STRING, SU_INFOSIZE, APCC_OID_TESTDIAGRESULTS, "", SU_FLAG_OK, apcc_testdiag_results }, + { "ups.test.date", ST_FLAG_STRING | ST_FLAG_RW, 8, ".1.3.6.1.4.1.318.1.1.1.7.2.4.0", "", SU_FLAG_OK | SU_FLAG_STATIC | SU_TYPE_STRING, NULL }, + { "output.voltage", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.4.3.1.0", "", SU_FLAG_OK | SU_FLAG_UNIQUE, NULL }, { "output.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.4.2.1.0", "", SU_FLAG_OK, NULL }, { "output.phases", ST_FLAG_STRING, 2, ".1.3.6.1.4.1.318.1.1.1.9.3.2.1.2.1", "", SU_FLAG_STATIC | SU_FLAG_OK, NULL }, { "output.frequency", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.9.3.2.1.4.1", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, + { "output.frequency", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.4.3.2.0", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, { "output.frequency", 0, 1, ".1.3.6.1.4.1.318.1.1.1.4.2.2.0", "", SU_FLAG_OK, NULL }, + { "output.current", 0, 0.1, ".1.3.6.1.4.1.318.1.1.1.4.3.4.0", "", SU_FLAG_OK|SU_FLAG_NEGINVALID|SU_FLAG_UNIQUE, NULL }, { "output.current", 0, 1, ".1.3.6.1.4.1.318.1.1.1.4.2.4.0", "", SU_FLAG_OK, NULL }, { "output.L1-L2.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.9.3.3.1.3.1.1.1", "", SU_FLAG_OK|SU_FLAG_NEGINVALID, NULL }, { "output.L2-L3.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.9.3.3.1.3.1.1.2", "", SU_FLAG_OK|SU_FLAG_NEGINVALID, NULL }, @@ -220,11 +260,11 @@ static snmp_info_t apcc_mib[] = { /* Measure-UPS ambient variables */ /* Environmental sensors (AP9612TH and others) */ { "ambient.temperature", 0, 1, ".1.3.6.1.4.1.318.1.1.2.1.1.0", "", SU_FLAG_OK, NULL }, - { "ambient.temperature.high", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.3.1", "", SU_FLAG_OK, NULL }, - { "ambient.temperature.low", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.4.1", "", SU_FLAG_OK, NULL }, + { "ambient.1.temperature.alarm.high", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.3.1", "", SU_FLAG_OK, NULL }, + { "ambient.1.temperature.alarm.low", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.4.1", "", SU_FLAG_OK, NULL }, { "ambient.humidity", 0, 1, ".1.3.6.1.4.1.318.1.1.2.1.2.0", "", SU_FLAG_OK, NULL }, - { "ambient.humidity.high", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.6.1", "", SU_FLAG_OK, NULL }, - { "ambient.humidity.low", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.7.1", "", SU_FLAG_OK, NULL }, + { "ambient.1.humidity.alarm.high", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.6.1", "", SU_FLAG_OK, NULL }, + { "ambient.1.humidity.alarm.low", 0, 1, ".1.3.6.1.4.1.318.1.1.10.1.2.2.1.7.1", "", SU_FLAG_OK, NULL }, /* IEM ambient variables */ /* IEM: integrated environment monitor probe */ diff --git a/drivers/apcsmart.c b/drivers/apcsmart.c index 1f5ab12..cb1d4f5 100644 --- a/drivers/apcsmart.c +++ b/drivers/apcsmart.c @@ -56,11 +56,10 @@ static int ups_status = 0; #define VDISCARD VDISCRD #endif /* VDISCRD && !VDISCARD */ - #ifndef CTRL -#define CONTROL(x) (x&037) +#define CONTROL(x) (x&037) #else -#define CONTROL CTRL +#define CONTROL CTRL #endif /* @@ -71,55 +70,54 @@ static int ups_status = 0; #define CDISCARD CONTROL('O') #endif #ifndef CDSUSP -#define CDSUSP CONTROL('Y') +#define CDSUSP CONTROL('Y') #endif #ifndef CEOF -#define CEOF CONTROL('D') +#define CEOF CONTROL('D') #endif #ifndef CEOL #define CEOL 0xff /* was 0 */ #endif #ifndef CERASE -#define CERASE 0177 +#define CERASE 0177 #endif #ifndef CINTR -#define CINTR CONTROL('C') +#define CINTR CONTROL('C') #endif #ifndef CKILL #define CKILL CONTROL('U') /* was '@' */ #endif #ifndef CLNEXT -#define CLNEXT CONTROL('V') +#define CLNEXT CONTROL('V') #endif #ifndef CMIN -#define CMIN CEOF +#define CMIN CEOF #endif #ifndef CQUIT -#define CQUIT CONTROL('\\') +#define CQUIT CONTROL('\\') #endif #ifndef CRPRNT -#define CRPRNT CONTROL('R') +#define CRPRNT CONTROL('R') #endif #ifndef CREPRINT #define CREPRINT CRPRNT #endif #ifndef CSTART -#define CSTART CONTROL('Q') +#define CSTART CONTROL('Q') #endif #ifndef CSTOP -#define CSTOP CONTROL('S') +#define CSTOP CONTROL('S') #endif #ifndef CSUSP -#define CSUSP CONTROL('Z') +#define CSUSP CONTROL('Z') #endif #ifndef CTIME -#define CTIME CEOL +#define CTIME CEOL #endif #ifndef CWERASE #define CWERASE CONTROL('W') #endif - /* some forwards */ static int sdcmd_S(const void *); @@ -141,7 +139,7 @@ static int (*sdlist[])(const void *) = { #define SDIDX_K 2 #define SDIDX_Z 3 #define SDIDX_CS 4 -#define SDCNT ((int)(sizeof(sdlist)/sizeof(sdlist[0]))) +#define SDCNT ((int)(sizeof(sdlist)/sizeof(sdlist[0]))) static apc_vartab_t *vartab_lookup_char(char cmdchar) { @@ -241,6 +239,84 @@ static const char *convert_data(apc_vartab_t *cmd_entry, const char *upsval) return temp; } +/* report differences if tcsetattr != tcgetattr, return otherwise */ +static void apc_ser_diff(struct termios *tioset, struct termios *tioget) +{ + size_t i; + const char dir[] = { 's', 'g' }; + struct termios *tio[] = { tioset, tioget }; + struct cchar { + const char *name; + int sub; + u_char def; + }; + const struct cchar cchars1[] = { +#ifdef VDISCARD + { "discard", VDISCARD, CDISCARD }, +#endif +#ifdef VDSUSP + { "dsusp", VDSUSP, CDSUSP }, +#endif + { "eof", VEOF, CEOF }, + { "eol", VEOL, CEOL }, + { "eol2", VEOL2, CEOL }, + { "erase", VERASE, CERASE }, +#ifdef VINTR + { "intr", VINTR, CINTR }, +#endif + { "kill", VKILL, CKILL }, + { "lnext", VLNEXT, CLNEXT }, + { "min", VMIN, CMIN }, + { "quit", VQUIT, CQUIT }, +#ifdef VREPRINT + { "reprint", VREPRINT, CREPRINT }, +#endif + { "start", VSTART, CSTART }, +#ifdef VSTATUS + { "status", VSTATUS, CSTATUS }, +#endif + { "stop", VSTOP, CSTOP }, + { "susp", VSUSP, CSUSP }, + { "time", VTIME, CTIME }, + { "werase", VWERASE, CWERASE }, + { NULL }, + }, *cp; + + /* clear status flags so that they don't affect our binary compare */ +#if defined(PENDIN) || defined(FLUSHO) + for (i = 0; i < sizeof(tio)/sizeof(tio[0]); i++) { +#ifdef PENDIN + tio[i]->c_lflag &= ~PENDIN; +#endif +#ifdef FLUSHO + tio[i]->c_lflag &= ~FLUSHO; +#endif + } +#endif /* defined(PENDIN) || defined(FLUSHO) */ + + if (!memcmp(tio[0], tio[1], sizeof(*tio[0]))) + return; + + upslogx(LOG_NOTICE, "%s: device reports different attributes than what were set", device_path); + + /* + * According to the manual the most common problem is mis-matched + * combinations of input and output baud rates. If the combination is + * not supported then neither are changed. This should not be a + * problem here since we set them both to the same extremely common + * rate of 2400. + */ + + for (i = 0; i < sizeof(tio)/sizeof(tio[0]); i++) { + upsdebugx(1, "tc%cetattr(): gfmt1:cflag=%x:iflag=%x:lflag=%x:oflag=%x:", dir[i], + (unsigned int) tio[i]->c_cflag, (unsigned int) tio[i]->c_iflag, + (unsigned int) tio[i]->c_lflag, (unsigned int) tio[i]->c_oflag); + for (cp = cchars1; cp->name; ++cp) + upsdebugx(1, "\t%s=%x:", cp->name, tio[i]->c_cc[cp->sub]); + upsdebugx(1, "\tispeed=%d:ospeed=%d", (int) cfgetispeed(tio[i]), (int) cfgetospeed(tio[i])); + } +} + static void apc_ser_set(void) { struct termios tio, tio_chk; @@ -298,92 +374,11 @@ static void apc_ser_set(void) if (tcsetattr(upsfd, TCSANOW, &tio)) fatal_with_errno(EXIT_FAILURE, "tcsetattr(%s)", device_path); - /* clear status flags so that they don't affect our binary compare */ -#ifdef PENDIN - tio.c_lflag &= ~PENDIN; -#endif -#ifdef FLUSHO - tio.c_lflag &= ~FLUSHO; -#endif - memset(&tio_chk, 0, sizeof(tio_chk)); if (tcgetattr(upsfd, &tio_chk)) fatal_with_errno(EXIT_FAILURE, "tcgetattr(%s)", device_path); - /* clear status flags so that they don't affect our binary compare */ -#ifdef PENDIN - tio_chk.c_lflag &= ~PENDIN; -#endif -#ifdef FLUSHO - tio_chk.c_lflag &= ~FLUSHO; -#endif - - if (memcmp(&tio_chk, &tio, sizeof(tio))) { - struct cchar { - const char *name; - int sub; - u_char def; - }; - const struct cchar cchars1[] = { -#ifdef VDISCARD - { "discard", VDISCARD, CDISCARD }, -#endif -#ifdef VDSUSP - { "dsusp", VDSUSP, CDSUSP }, -#endif - { "eof", VEOF, CEOF }, - { "eol", VEOL, CEOL }, - { "eol2", VEOL2, CEOL }, - { "erase", VERASE, CERASE }, -#ifdef VINTR - { "intr", VINTR, CINTR }, -#endif - { "kill", VKILL, CKILL }, - { "lnext", VLNEXT, CLNEXT }, - { "min", VMIN, CMIN }, - { "quit", VQUIT, CQUIT }, -#ifdef VREPRINT - { "reprint", VREPRINT, CREPRINT }, -#endif - { "start", VSTART, CSTART }, -#ifdef VSTATUS - { "status", VSTATUS, CSTATUS }, -#endif - { "stop", VSTOP, CSTOP }, - { "susp", VSUSP, CSUSP }, - { "time", VTIME, CTIME }, - { "werase", VWERASE, CWERASE }, - { .name = NULL }, - }; - const struct cchar *cp; - struct termios *tp; - - upslogx(LOG_NOTICE, "%s: device reports different attributes than what were set", device_path); - - /* - * According to the manual the most common problem is - * mis-matched combinations of input and output baud rates. If - * the combination is not supported then neither are changed. - * This should not be a problem here since we set them both to - * the same extremely common rate of 2400. - */ - - tp = &tio; - upsdebugx(1, "tcsetattr(): gfmt1:cflag=%x:iflag=%x:lflag=%x:oflag=%x:", - (unsigned int) tp->c_cflag, (unsigned int) tp->c_iflag, - (unsigned int) tp->c_lflag, (unsigned int) tp->c_oflag); - for (cp = cchars1; cp->name; ++cp) - upsdebugx(1, "\t%s=%x:", cp->name, tp->c_cc[cp->sub]); - upsdebugx(1, "\tispeed=%d:ospeed=%d", (int) cfgetispeed(tp), (int) cfgetospeed(tp)); - - tp = &tio_chk; - upsdebugx(1, "tcgetattr(): gfmt1:cflag=%x:iflag=%x:lflag=%x:oflag=%x:", - (unsigned int) tp->c_cflag, (unsigned int) tp->c_iflag, - (unsigned int) tp->c_lflag, (unsigned int) tp->c_oflag); - for (cp = cchars1; cp->name; ++cp) - upsdebugx(1, "\t%s=%x:", cp->name, tp->c_cc[cp->sub]); - upsdebugx(1, "\tispeed=%d:ospeed=%d", (int) cfgetispeed(tp), (int) cfgetospeed(tp)); - } + apc_ser_diff(&tio, &tio_chk); cable = getval("cable"); if (cable && !strcasecmp(cable, ALT_CABLE_1)) { diff --git a/drivers/belkinunv.c b/drivers/belkinunv.c index 5698313..c5abda2 100644 --- a/drivers/belkinunv.c +++ b/drivers/belkinunv.c @@ -36,7 +36,6 @@ battery.runtime battery.voltage battery.voltage.nominal - driver.version.internal input.frequency input.frequency.nominal e.g. 60 for 60Hz input.sensitivity (RW) normal/medium/low diff --git a/drivers/blazer_usb.c b/drivers/blazer_usb.c index 1104071..0651eea 100644 --- a/drivers/blazer_usb.c +++ b/drivers/blazer_usb.c @@ -28,7 +28,7 @@ #include "blazer.h" #define DRIVER_NAME "Megatec/Q1 protocol USB driver" -#define DRIVER_VERSION "0.08" +#define DRIVER_VERSION "0.09" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -351,6 +351,7 @@ static usb_device_id_t blazer_usb_id[] = { { USB_DEVICE(0x06da, 0x0004), &cypress_subdriver }, /* Phoenixtec Innova 3/1 T */ { USB_DEVICE(0x06da, 0x0005), &cypress_subdriver }, /* Phoenixtec Innova RT */ { USB_DEVICE(0x06da, 0x0201), &cypress_subdriver }, /* Phoenixtec Innova T */ + { USB_DEVICE(0x06da, 0x0601), &phoenix_subdriver }, /* Online Zinto A */ { USB_DEVICE(0x0f03, 0x0001), &cypress_subdriver }, /* Unitek Alpha 1200Sx */ { USB_DEVICE(0x14f0, 0x00c9), &phoenix_subdriver }, /* GE EP series */ /* end of list */ diff --git a/drivers/eaton-mib.c b/drivers/eaton-mib.c index 6da265b..b06006e 100644 --- a/drivers/eaton-mib.c +++ b/drivers/eaton-mib.c @@ -1,10 +1,11 @@ /* eaton-mib.c - data to monitor Eaton Aphel PDUs (Basic and Complex) * - * Copyright (C) 2008 - 2010 - * Arnaud Quette + * Copyright (C) 2008 - 2012 + * Arnaud Quette + * Arnaud Quette * - * Sponsored by Eaton - * and MGE Office Protection Systems + * Supported by Eaton + * and previously MGE Office Protection Systems * * 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 @@ -348,7 +349,112 @@ static snmp_info_t eaton_marlin_mib[] = { { NULL, 0, 0, NULL, NULL, 0, NULL, NULL } }; +/* Pulizzi Monitored ePDU (Basic model, SNMP only) + * FIXME: to be completed + * + * Warning: there are 2 versions: + * - SA built MI.mib (old MIB) + * #define PULIZZI1_OID_MIB ".1.3.6.1.4.1.20677.3.1.1" + * #define PULIZZI1_OID_MODEL_NAME ".1.3.6.1.4.1.20677.3.1.1.1.2.0" + * - Eaton-Powerware-Monitored-ePDU_1.0.E.mib (new MIB) Vertical SW + */ + + +/* Pulizzi Switched ePDU */ + +#define EATON_PULIZZI_SW_MIB_VERSION "0.1" + +#define PULIZZI_SW_OID_MIB ".1.3.6.1.4.1.20677.3.1.1" +#define PULIZZI_SW_OID_MODEL_NAME ".1.3.6.1.4.1.20677.2.1.1.0" + +/* Some buggy FW also report sysOID = ".1.3.6.1.4.1.20677.1" */ +#define EATON_PULIZZI_SWITCHED1_SYSOID ".1.3.6.1.4.1.20677.1" +#define EATON_PULIZZI_SWITCHED2_SYSOID ".1.3.6.1.4.1.20677.2" + + +static info_lkp_t pulizzi_sw_outlet_status_info[] = { + { 1, "on" }, + { 2, "off" }, + { 0, NULL } +}; + +/* simply remap the above status to "yes" */ +static info_lkp_t pulizzi_sw_outlet_switchability_info[] = { + { 1, "yes" }, + { 2, "yes" }, + { 0, NULL } +}; + +/* Snmp2NUT lookup table for Eaton Pulizzi Switched ePDU MIB */ +static snmp_info_t eaton_pulizzi_switched_mib[] = { + /* Device page */ + { "device.mfr", ST_FLAG_STRING, SU_INFOSIZE, NULL, "EATON | Powerware", + SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL, NULL }, + { "device.model", ST_FLAG_STRING, SU_INFOSIZE, PULIZZI_SW_OID_MODEL_NAME, + "Switched ePDU", SU_FLAG_STATIC | SU_FLAG_OK, NULL, NULL }, + { "device.type", ST_FLAG_STRING, SU_INFOSIZE, NULL, "pdu", + SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL, NULL }, + + /* UPS page */ + { "ups.mfr", ST_FLAG_STRING, SU_INFOSIZE, NULL, "EATON", + SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL, NULL }, + { "ups.model", ST_FLAG_STRING, SU_INFOSIZE, PULIZZI_SW_OID_MODEL_NAME, + "Switched ePDU", SU_FLAG_STATIC | SU_FLAG_OK, NULL, NULL }, + /* FIXME: to be moved to the device collection! */ + { "ups.date", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.1.4.0", + "", SU_FLAG_STATIC | SU_FLAG_OK, NULL, NULL }, + { "ups.time", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.1.3.0", + "", SU_FLAG_STATIC | SU_FLAG_OK, NULL, NULL }, + { "ups.macaddr", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.2.6.0", + "unknown", 0, NULL, NULL }, + + /* Outlet page */ + /* Note: outlet.count is deduced, with guestimate_outlet_count() */ + { "outlet.id", 0, 1, NULL, "0", SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL }, + { "outlet.desc", ST_FLAG_RW | ST_FLAG_STRING, 20, NULL, "All outlets", + SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL }, + + { "outlet.current", 0, 1.0, ".1.3.6.1.4.1.20677.2.8.6.4.2.0", NULL, 0, NULL, NULL }, + { "outlet.voltage", 0, 1.0, ".1.3.6.1.4.1.20677.2.8.6.4.1.0", NULL, 0, NULL, NULL }, + { "outlet.power", 0, 1.0, ".1.3.6.1.4.1.20677.2.8.6.4.3.0", NULL, 0, NULL, NULL }, + + /* outlet template definition + * Notes: + * - indexes start from 1, ie outlet.1 => .1 + * - the first definition is used to determine the base index (ie 0 or 1) + * - outlet.count is estimated, based on the below OID iteration capabilities */ + { "outlet.%i.desc", ST_FLAG_RW | ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.6.1.%i.1.0", NULL, SU_FLAG_STATIC | SU_FLAG_OK | SU_OUTLET, NULL, NULL }, + { "outlet.%i.status", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.6.3.%i.0", + NULL, SU_FLAG_OK | SU_OUTLET, &pulizzi_sw_outlet_status_info[0], NULL }, + { "outlet.%i.id", 0, 1, NULL, "%i", SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK | SU_OUTLET, NULL, NULL }, + /* we use the same OID as outlet.n.status..., to expose switchability */ + { "outlet.%i.switchable", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.6.3.%i.0", "yes", SU_FLAG_STATIC | SU_FLAG_OK | SU_OUTLET, &pulizzi_sw_outlet_switchability_info[0], NULL }, + /* FIXME: need to be added to the namespace! */ + { "outlet.%i.delay.reboot", ST_FLAG_RW, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.6.1.%i.5.0", NULL, SU_OUTLET, NULL, NULL }, + /* "outlet1SequenceTime" is used for global sequence */ + { "outlet.%i.delay.start", ST_FLAG_RW, SU_INFOSIZE, ".1.3.6.1.4.1.20677.2.6.1.%i.4.0", NULL, SU_OUTLET, NULL, NULL }, + + /* instant commands. */ + /* FIXME: not exposed as "outlet.load...", or otherwise specific processing applies (template instanciation) */ + { "load.on", 0, 1, ".1.3.6.1.4.1.20677.2.6.2.1.0", NULL, SU_TYPE_CMD, NULL, NULL }, + { "load.off", 0, 2, ".1.3.6.1.4.1.20677.2.6.2.1.0", NULL, SU_TYPE_CMD, NULL, NULL }, + { "load.on.delay", 0, 3, ".1.3.6.1.4.1.20677.2.6.2.1.0", NULL, SU_TYPE_CMD, NULL, NULL }, + { "load.off.delay", 0, 4, ".1.3.6.1.4.1.20677.2.6.2.1.0", NULL, SU_TYPE_CMD, NULL, NULL }, + + /* WARNING: outlet 1 => index 2! */ + { "outlet.%i.load.on", 0, 1, ".1.3.6.1.4.1.20677.2.6.2.%i.0", NULL, SU_TYPE_CMD | SU_OUTLET | SU_CMD_OFFSET, NULL, NULL }, + { "outlet.%i.load.off", 0, 2, ".1.3.6.1.4.1.20677.2.6.2.%i.0", NULL, SU_TYPE_CMD | SU_OUTLET | SU_CMD_OFFSET, NULL, NULL }, + { "outlet.%i.load.cycle", 0, 3, ".1.3.6.1.4.1.20677.2.6.2.%i.0", NULL, SU_TYPE_CMD | SU_OUTLET | SU_CMD_OFFSET, NULL, NULL }, + + /* end of structure. */ + { NULL, 0, 0, NULL, NULL, 0, NULL, NULL } +}; + + mib2nut_info_t aphel_genesisII = { "aphel_genesisII", EATON_APHEL_MIB_VERSION, "", APHEL1_OID_MODEL_NAME, eaton_aphel_genesisII_mib, APHEL1_SYSOID }; mib2nut_info_t aphel_revelation = { "aphel_revelation", EATON_APHEL_MIB_VERSION, "", APHEL2_OID_MODEL_NAME, eaton_aphel_revelation_mib, APHEL2_SYSOID }; mib2nut_info_t eaton_marlin = { "eaton_epdu", EATON_MARLIN_MIB_VERSION, "", EATON_MARLIN_OID_MODEL_NAME, eaton_marlin_mib, EATON_MARLIN_SYSOID }; +/*mib2nut_info_t pulizzi_monitored = { "pulizzi_monitored", EATON_PULIZZI_MIB_VERSION, "", PULIZZI1_OID_MODEL_NAME, eaton_pulizzi_monitored_mib, PULIZZI1_OID_MIB };*/ +mib2nut_info_t pulizzi_switched1 = { "pulizzi_switched1", EATON_PULIZZI_SW_MIB_VERSION, "", EATON_PULIZZI_SWITCHED1_SYSOID, eaton_pulizzi_switched_mib, EATON_PULIZZI_SWITCHED1_SYSOID }; +mib2nut_info_t pulizzi_switched2 = { "pulizzi_switched2", EATON_PULIZZI_SW_MIB_VERSION, "", EATON_PULIZZI_SWITCHED1_SYSOID, eaton_pulizzi_switched_mib, EATON_PULIZZI_SWITCHED2_SYSOID }; diff --git a/drivers/eaton-mib.h b/drivers/eaton-mib.h index 4997066..d5223e6 100644 --- a/drivers/eaton-mib.h +++ b/drivers/eaton-mib.h @@ -7,5 +7,7 @@ extern mib2nut_info_t aphel_genesisII; extern mib2nut_info_t aphel_revelation; extern mib2nut_info_t eaton_marlin; +extern mib2nut_info_t pulizzi_switched1; +extern mib2nut_info_t pulizzi_switched2; #endif /* EATON_MIB_H */ diff --git a/drivers/macosx-ups.c b/drivers/macosx-ups.c new file mode 100644 index 0000000..11ed475 --- /dev/null +++ b/drivers/macosx-ups.c @@ -0,0 +1,440 @@ +/* Bridge driver to read Mac OS X UPS status (as displayed in Energy Saver control panel) + * + * Copyright (C) 2011-2012 Charles Lepple + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "main.h" + +#include + +#include "CoreFoundation/CoreFoundation.h" +#include "IOKit/ps/IOPowerSources.h" +#include "IOKit/ps/IOPSKeys.h" + +#define DRIVER_NAME "Mac OS X UPS meta-driver" +#define DRIVER_VERSION "1.0" + +/* driver description structure */ +upsdrv_info_t upsdrv_info = { + DRIVER_NAME, + DRIVER_VERSION, + "Charles Lepple ", + DRV_EXPERIMENTAL, + { NULL } +}; + +#if 0 +#define CFRelease(ref) do { upsdebugx(3, "%s:%d: CFRelease(%p)", __FILE__, __LINE__, ref); CFRelease(ref); } while(0) +#endif + +static CFStringRef g_power_key = NULL; +static double max_capacity_value = 100.0; + +/*! Copy the current power dictionary. + * + * Caller must release power dictionary when finished with it. + */ +static CFDictionaryRef copy_power_dictionary(CFTypeRef power_key) +{ + CFTypeRef power_blob; + CFDictionaryRef power_dictionary; + + power_blob = IOPSCopyPowerSourcesInfo(); + + assert(power_blob); + upsdebugx(6, "%s: Got power_blob:", __func__); + if(nut_debug_level >= 6) CFShow(power_blob); + + upsdebugx(5, "power_key = "); + if(nut_debug_level >= 5) CFShow(power_key); + upsdebugx(6, "end power_key"); + + power_dictionary = IOPSGetPowerSourceDescription(power_blob, power_key); + + upsdebugx(5, "Asserting 'power_dictionary': %p", power_dictionary); + assert(power_dictionary); + upsdebugx(5, "CFShowing 'power_dictionary'"); + if(nut_debug_level >= 5) CFShow(power_dictionary); + + CFRetain(power_dictionary); + + /* Get a new power_blob next time: */ + CFRelease(power_blob); + + return power_dictionary; +} + +void upsdrv_initinfo(void) +{ + /* try to detect the UPS here - call fatal_with_errno(EXIT_FAILURE, ) if it fails */ + + char device_name[80] = ""; + CFStringRef device_type_cfstr, device_name_cfstr; + CFPropertyListRef power_dictionary; + CFNumberRef max_capacity; + + upsdebugx(1, "upsdrv_initinfo()"); + + dstate_setinfo("device.mfr", "(unknown)"); + + power_dictionary = copy_power_dictionary(g_power_key); + + device_type_cfstr = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSTypeKey)); + if(device_type_cfstr && !CFStringCompare(device_type_cfstr, CFSTR(kIOPSInternalBatteryType), 0)) { + dstate_setinfo("device.type", "battery"); + } + + upsdebugx(2, "Getting 'Name' key"); + + device_name_cfstr = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSNameKey)); + + if (!device_name_cfstr) { + fatalx(EXIT_FAILURE, "Couldn't retrieve 'Name' key from power dictionary."); + } + + CFRetain(device_name_cfstr); + + CFStringGetCString(device_name_cfstr, device_name, sizeof(device_name), kCFStringEncodingUTF8); + upsdebugx(2, "Got name: %s", device_name); + + CFRelease(device_name_cfstr); + + dstate_setinfo("device.model", "%s", device_name); + + max_capacity = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSMaxCapacityKey)); + if(max_capacity) { + CFRetain(max_capacity); + + CFNumberGetValue(max_capacity, kCFNumberDoubleType, &max_capacity_value); + CFRelease(max_capacity); + + upsdebugx(3, "Max Capacity = %.f units (usually 100)", max_capacity_value); + if(max_capacity_value != 100) { + upsdebugx(1, "Max Capacity: %f != 100", max_capacity_value); + } + } + + /* upsh.instcmd = instcmd; */ + CFRelease(power_dictionary); +} + +void upsdrv_updateinfo(void) +{ + CFPropertyListRef power_dictionary; + CFStringRef power_source_state; + CFNumberRef battery_voltage, battery_runtime; + CFNumberRef current_capacity; + CFBooleanRef is_charging; + double max_capacity_value = 100.0, current_capacity_value; + + upsdebugx(1, "upsdrv_updateinfo()"); + + power_dictionary = copy_power_dictionary( g_power_key ); + assert(power_dictionary); /* TODO: call dstate_datastale()? */ + + status_init(); + + /* Retrieve OL/OB state */ + power_source_state = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSPowerSourceStateKey)); + assert(power_source_state); + CFRetain(power_source_state); + + upsdebugx(3, "Power Source State:"); + if(nut_debug_level >= 3) CFShow(power_source_state); + + if(!CFStringCompare(power_source_state, CFSTR(kIOPSACPowerValue), 0)) { + status_set("OL"); + } else { + status_set("OB"); + } + + CFRelease(power_source_state); + + /* Retrieve CHRG state */ + is_charging = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSIsChargingKey)); + if(is_charging) { + Boolean is_charging_value; + + is_charging_value = CFBooleanGetValue(is_charging); + if(is_charging_value) { + status_set("CHRG"); + } + } + + status_commit(); + + /* Retrieve battery voltage */ + + battery_voltage = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSVoltageKey)); + if(battery_voltage) { + int battery_voltage_value; + + CFNumberGetValue(battery_voltage, kCFNumberIntType, &battery_voltage_value); + upsdebugx(2, "battery_voltage = %d mV", battery_voltage_value); + dstate_setinfo("battery.voltage", "%.3f", battery_voltage_value/1000.0); + } + + /* Retrieve battery runtime */ + battery_runtime = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSTimeToEmptyKey)); + if(battery_runtime) { + double battery_runtime_value; + + CFNumberGetValue(battery_runtime, kCFNumberDoubleType, &battery_runtime_value); + + upsdebugx(2, "battery_runtime = %.f minutes", battery_runtime_value); + if(battery_runtime_value > 0) { + dstate_setinfo("battery.runtime", "%d", (int)(battery_runtime_value*60)); + } else { + dstate_delinfo("battery.runtime"); + } + } else { + dstate_delinfo("battery.runtime"); + } + + /* Retrieve current capacity */ + current_capacity = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSCurrentCapacityKey)); + if(current_capacity) { + CFNumberGetValue(current_capacity, kCFNumberDoubleType, ¤t_capacity_value); + + upsdebugx(2, "Current Capacity = %.f/%.f units", current_capacity_value, max_capacity_value); + if(max_capacity_value > 0) { + dstate_setinfo("battery.charge", "%.f", 100.0 * current_capacity_value / max_capacity_value); + } + } + + /* TODO: it should be possible to set poll_interval (and maxage in the + * server) to an absurdly large value, and use notify(3) to get + * updates. + */ + + /* + * poll_interval = 2; + */ + + dstate_dataok(); + CFRelease(power_dictionary); +} + +void upsdrv_shutdown(void) +{ + /* tell the UPS to shut down, then return - DO NOT SLEEP HERE */ + + /* maybe try to detect the UPS here, but try a shutdown even if + it doesn't respond at first if possible */ + + /* NOTE: Mac OS X already has shutdown routines - this driver is more + for monitoring and notification purposes. Still, there is a key that + might be useful to set in SystemConfiguration land. */ + fatalx(EXIT_FAILURE, "shutdown not supported"); + + /* you may have to check the line status since the commands + for toggling power are frequently different for OL vs. OB */ + + /* OL: this must power cycle the load if possible */ + + /* OB: the load must remain off until the power returns */ +} + +/* +static int instcmd(const char *cmdname, const char *extra) +{ + if (!strcasecmp(cmdname, "test.battery.stop")) { + ser_send_buf(upsfd, ...); + return STAT_INSTCMD_HANDLED; + } + + upslogx(LOG_NOTICE, "instcmd: unknown command [%s]", cmdname); + return STAT_INSTCMD_UNKNOWN; +} +*/ + +/* TODO: + There is a configuration file here: + /Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist + with several keys under UPSDefaultThresholds: + + * UPSShutdownAfterMinutes + * UPSShutdownAtLevel + * UPSShutdownAtMinutesLeft + + It is not likely that these keys can be written, but they might be good values for NUT variables. + + In conjunction with 'ignorelb' and a delta, this could be used to synthesize a + LB status right before the computer shuts down. +*/ + +/* +static int setvar(const char *varname, const char *val) +{ + if (!strcasecmp(varname, "ups.test.interval")) { + ser_send_buf(upsfd, ...); + return STAT_SET_HANDLED; + } + + upslogx(LOG_NOTICE, "setvar: unknown variable [%s]", varname); + return STAT_SET_UNKNOWN; +} +*/ + +void upsdrv_help(void) +{ +} + +/* list flags and values that you want to receive via -x */ +void upsdrv_makevartable(void) +{ + /* allow '-x xyzzy' */ + /* addvar(VAR_FLAG, "xyzzy", "Enable xyzzy mode"); */ + + /* allow '-x foo=' */ + /* addvar(VAR_VALUE, "foo", "Override foo setting"); */ + + addvar(VAR_VALUE, "model", "Regular Expression to match power source model name"); +} + +void upsdrv_initups(void) +{ + CFArrayRef power_source_key_list; + CFIndex num_keys, index; + CFDictionaryRef power_dictionary; + CFTypeRef power_blob; + CFStringRef potential_key, potential_model; + char *device_name = device_path, *model_name; /* regex(3) */ + char potential_device_name[80], potential_model_name[80]; + regex_t name_regex, model_regex; + int ret; + + upsdebugx(3, "upsdrv_initups(): Power Sources blob:"); + /* upsfd = ser_open(device_path); */ + /* ser_set_speed(upsfd, device_path, B1200); */ + power_blob = IOPSCopyPowerSourcesInfo(); + if(!power_blob) { + fatalx(EXIT_FAILURE, "Couldn't retrieve Power Sources blob"); + } + + if(nut_debug_level >= 3) CFShow(power_blob); + + if(!strcmp(device_name, "auto")) { + device_name = "/UPS"; + } + + upsdebugx(2, "Matching power supply key names against regex '%s'", device_name); + + ret = regcomp(&name_regex, device_name, REG_EXTENDED|REG_NOSUB|REG_ICASE); + + if(ret) { + fatalx(EXIT_FAILURE, + "Failed to compile regex from 'port' parameter: '%s'.", + device_name); + } + + if((model_name = getval("model"))) { + upsdebugx(2, "Matching power supply model names against regex '%s'", model_name); + ret = regcomp(&model_regex, model_name, REG_EXTENDED|REG_NOSUB|REG_ICASE); + + if(ret) { + fatalx(EXIT_FAILURE, + "Failed to compile regex from 'model' parameter: '%s'.", + model_name); + } + } + + power_source_key_list = IOPSCopyPowerSourcesList(power_blob); + + num_keys = CFArrayGetCount(power_source_key_list); + upsdebugx(1, "Number of power supplies found: %d", (int)num_keys); + + if(nut_debug_level >= 3) CFShow(power_source_key_list); + + if(num_keys < 1) { + /* bail */ + fatalx(EXIT_FAILURE, "Couldn't find any UPS or battery"); + } + + for(index=0; index < num_keys; index++) { + potential_key = CFArrayGetValueAtIndex(power_source_key_list, index); + CFStringGetCString(potential_key, potential_device_name, + sizeof(potential_device_name), kCFStringEncodingUTF8); + upsdebugx(1, " Power supply: %s", potential_device_name); + + ret = regexec(&name_regex, potential_device_name, 0,0,0); + + power_dictionary = copy_power_dictionary(potential_key); + + upsdebugx(2, "Getting 'Name' key (UPS model)"); + + potential_model = CFDictionaryGetValue(power_dictionary, CFSTR(kIOPSNameKey)); + CFStringGetCString(potential_model, potential_model_name, sizeof(potential_model_name), kCFStringEncodingUTF8); + upsdebugx(1, " model name: %s", potential_model_name); + + CFRelease(power_dictionary); + + /* Does key match? Check model: */ + if (!ret) { + if(model_name) { + ret = regexec(&model_regex, potential_model_name, 0,0,0); + if(!ret) { + upsdebugx(2, "Matched model name"); + break; + } + } else { + upsdebugx(2, "Matched key name"); + break; + } + } + } + + regfree(&name_regex); + if(model_name) { + regfree(&model_regex); + } + + if(ret) { + fatalx(EXIT_FAILURE, "Couldn't find UPS or battery matching both 'port' (%s) and 'model' (%s)", + device_name, model_name); + } + + g_power_key = potential_key; + CFRetain(g_power_key); + upsdebugx(2, "g_power_key = "); + if(nut_debug_level >= 2) CFShow(g_power_key); + upsdebugx(2, "end g_power_key."); + + power_dictionary = copy_power_dictionary(g_power_key); + assert(power_dictionary); + if(nut_debug_level >= 3) CFShow(power_dictionary); + + /* the upsh handlers can't be done here, as they get initialized + * shortly after upsdrv_initups returns to main. + */ + + /* don't try to detect the UPS here */ + + /* do stuff */ + + CFRelease(power_dictionary); +} + +void upsdrv_cleanup(void) +{ + upsdebugx(1, "Cleanup: release references"); + CFRelease(g_power_key); + + /* free(dynamic_mem); */ + /* ser_close(upsfd, device_path); */ +} diff --git a/drivers/main.c b/drivers/main.c index 66caa36..7c2fc55 100644 --- a/drivers/main.c +++ b/drivers/main.c @@ -623,7 +623,7 @@ int main(int argc, char **argv) * when its a pdu! */ dstate_setinfo("device.type", "ups"); - /* publish the top-level data: version number, driver name */ + /* publish the top-level data: version numbers, driver name */ dstate_setinfo("driver.version", "%s", UPS_VERSION); dstate_setinfo("driver.version.internal", "%s", upsdrv_info.version); dstate_setinfo("driver.name", "%s", progname); diff --git a/drivers/masterguard.c b/drivers/masterguard.c index f480ad3..7edc899 100644 --- a/drivers/masterguard.c +++ b/drivers/masterguard.c @@ -469,8 +469,6 @@ void upsdrv_initinfo(void) dstate_setinfo("ups.model", "%s", name); if( strlen( firmware ) > 0 ) dstate_setinfo("ups.firmware", "%s", firmware); - - dstate_setinfo("driver.version.internal", "%s", DRIVER_VERSION); } /******************************************************************** diff --git a/drivers/metasys.c b/drivers/metasys.c index d05e5ef..647de3c 100644 --- a/drivers/metasys.c +++ b/drivers/metasys.c @@ -316,8 +316,6 @@ void upsdrv_initinfo(void) dstate_setflags("ups.test.result", ST_FLAG_STRING | ST_FLAG_RW); dstate_setaux("ups.test.result", 20); - /* Fixed variables */ - dstate_setinfo("driver.version.internal", "%s", DRIVER_VERSION); /* UPS INFO READ */ res = command_read_sequence(UPS_INFO, my_answer); if (res < 0) fatal_with_errno(EXIT_FAILURE, "Could not communicate with the ups"); diff --git a/drivers/mge-utalk.c b/drivers/mge-utalk.c index 3139065..d4c9729 100644 --- a/drivers/mge-utalk.c +++ b/drivers/mge-utalk.c @@ -235,7 +235,6 @@ void upsdrv_initinfo(void) /* manufacturer -------------------------------------------- */ dstate_setinfo("ups.mfr", "MGE UPS SYSTEMS"); - dstate_setinfo("driver.version.internal", "%s", DRIVER_VERSION); /* loop until we have at status */ tries = 0; diff --git a/drivers/microdowell.c b/drivers/microdowell.c index 82bcd43..a1d6605 100644 --- a/drivers/microdowell.c +++ b/drivers/microdowell.c @@ -848,8 +848,6 @@ void upsdrv_initinfo(void) dstate_setinfo("ups.mfr.date", "%04d/%02d/%02d", ups.YearOfProd, ups.MonthOfProd, ups.DayOfProd) ; dstate_setinfo("battery.packs", "%d", ups.BatteryNumber) ; - dstate_setinfo("driver.version.internal", "%s", DRIVER_VERSION) ; - /* Register the available variables. */ dstate_setinfo("ups.delay.start", "%d", ups.WakeUpDelay); dstate_setflags("ups.delay.start", ST_FLAG_RW | ST_FLAG_STRING); diff --git a/drivers/netxml-ups.c b/drivers/netxml-ups.c index 130d50f..ee55503 100644 --- a/drivers/netxml-ups.c +++ b/drivers/netxml-ups.c @@ -38,7 +38,7 @@ #include #define DRIVER_NAME "network XML UPS" -#define DRIVER_VERSION "0.30" +#define DRIVER_VERSION "0.31" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -92,7 +92,7 @@ void upsdrv_initinfo(void) continue; } - dstate_setinfo("driver.version.internal", "%s", subdriver->version); + dstate_setinfo("driver.version.data", "%s", subdriver->version); if (testvar("subscribe") && (netxml_alarm_subscribe(subdriver->subscribe) == NE_OK)) { extrafd = ne_sock_fd(sock); diff --git a/drivers/nut-ipmipsu.c b/drivers/nut-ipmipsu.c index 18cb355..b7382a8 100644 --- a/drivers/nut-ipmipsu.c +++ b/drivers/nut-ipmipsu.c @@ -1,6 +1,7 @@ /* nut-ipmipsu.c - Driver for IPMI Power Supply Units (PSU) * - * Copyright (C) 2011 - Arnaud Quette + * Copyright (C) + * 2011 - 2012 Arnaud Quette * * 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 @@ -26,7 +27,7 @@ #include "nut-ipmi.h" #define DRIVER_NAME "IPMI PSU driver" -#define DRIVER_VERSION "0.06" +#define DRIVER_VERSION "0.07" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -62,9 +63,6 @@ void upsdrv_initinfo(void) ipmi_dev.manufacturer ? ipmi_dev.manufacturer : "unknown", ipmi_dev.product ? ipmi_dev.product : "unknown"); - dstate_setinfo("driver.version.data", "%s", DRIVER_NAME); - dstate_setinfo("driver.version.internal", DRIVER_VERSION); - dstate_setinfo ("device.type", "psu"); /* Publish information from the IPMI structure */ diff --git a/drivers/nut-libfreeipmi.c b/drivers/nut-libfreeipmi.c index 0e3415d..1539e75 100644 --- a/drivers/nut-libfreeipmi.c +++ b/drivers/nut-libfreeipmi.c @@ -1,7 +1,7 @@ /* nut-libfreeipmi.c - NUT IPMI backend, using FreeIPMI * * Copyright (C) - * 2011 - Arnaud Quette + * 2011 - 2012 Arnaud Quette * 2011 - Albert Chu * * Based on the sample codes 'ipmi-fru-example.c', 'frulib.c' and @@ -58,10 +58,18 @@ /* FreeIPMI contexts and configuration*/ ipmi_ctx_t ipmi_ctx = NULL; ipmi_fru_parse_ctx_t fru_parse_ctx = NULL; -ipmi_sdr_cache_ctx_t sdr_cache_ctx = NULL; -ipmi_sdr_parse_ctx_t sdr_parse_ctx = NULL; ipmi_monitoring_ctx_t mon_ctx = NULL; struct ipmi_monitoring_ipmi_config ipmi_config; +/* SDR management API has changed with 1.1.X and later */ +#ifdef HAVE_FREEIPMI_11X_12X + ipmi_sdr_ctx_t sdr_ctx = NULL; +#else + ipmi_sdr_cache_ctx_t sdr_cache_ctx = NULL; + ipmi_sdr_parse_ctx_t sdr_parse_ctx = NULL; +#ifndef IPMI_SDR_MAX_RECORD_LENGTH + #define IPMI_SDR_MAX_RECORD_LENGTH IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH +#endif +#endif /* HAVE_FREEIPMI_11X_12X */ /* FIXME: freeipmi auto selects a cache based on the hostname you are * connecting too, but this is probably fine for you @@ -276,6 +284,11 @@ static void libfreeipmi_cleanup() ipmi_fru_parse_ctx_destroy (fru_parse_ctx); } +#ifdef HAVE_FREEIPMI_11X_12X + if (sdr_ctx) { + ipmi_sdr_ctx_destroy (sdr_ctx); + } +#else /* HAVE_FREEIPMI_11X_12X */ if (sdr_cache_ctx) { ipmi_sdr_cache_ctx_destroy (sdr_cache_ctx); } @@ -283,6 +296,7 @@ static void libfreeipmi_cleanup() if (sdr_parse_ctx) { ipmi_sdr_parse_ctx_destroy (sdr_parse_ctx); } +#endif /* HAVE_FREEIPMI_11X_12X */ if (ipmi_ctx) { ipmi_ctx_close (ipmi_ctx); @@ -467,7 +481,7 @@ static int libfreeipmi_get_board_info (const void *areabuf, * Return -1 on error, or the number of sensors found otherwise */ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) { - uint8_t sdr_record[IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH]; + uint8_t sdr_record[IPMI_SDR_MAX_RECORD_LENGTH]; uint8_t record_type, logical_physical_fru_device, logical_fru_device_device_slave_address; uint8_t tmp_entity_id, tmp_entity_instance; int sdr_record_len; @@ -484,6 +498,23 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_dev->sensors_count = 0; memset(ipmi_dev->sensors_id_list, 0, sizeof(ipmi_dev->sensors_id_list)); +#ifdef HAVE_FREEIPMI_11X_12X + if (!(sdr_ctx = ipmi_sdr_ctx_create ())) + { + libfreeipmi_cleanup(); + fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_ctx_create()"); + } + + if (ipmi_sdr_cache_open (sdr_ctx, ipmi_ctx, CACHE_LOCATION) < 0) + { + if (ipmi_sdr_ctx_errnum (sdr_ctx) != IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST) + { + libfreeipmi_cleanup(); + fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_open: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + } + } +#else /* HAVE_FREEIPMI_11X_12X */ if (!(sdr_cache_ctx = ipmi_sdr_cache_ctx_create ())) { libfreeipmi_cleanup(); @@ -505,7 +536,32 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx)); } } +#endif /* HAVE_FREEIPMI_11X_12X */ +#ifdef HAVE_FREEIPMI_11X_12X + if (ipmi_sdr_ctx_errnum (sdr_ctx) == IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST) + { + if (ipmi_sdr_cache_create (sdr_ctx, + ipmi_ctx, CACHE_LOCATION, + IPMI_SDR_CACHE_CREATE_FLAGS_DEFAULT, + NULL, NULL) < 0) + { + libfreeipmi_cleanup(); + fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_create: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + } + if (ipmi_sdr_cache_open (sdr_ctx, + ipmi_ctx, CACHE_LOCATION) < 0) + { + if (ipmi_sdr_ctx_errnum (sdr_ctx) != IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST) + { + libfreeipmi_cleanup(); + fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_open: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + } + } + } +#else /* HAVE_FREEIPMI_11X_12X */ if (ipmi_sdr_cache_ctx_errnum (sdr_cache_ctx) == IPMI_SDR_CACHE_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST) { if (ipmi_sdr_cache_create (sdr_cache_ctx, @@ -518,7 +574,6 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_create: %s", ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx)); } - if (ipmi_sdr_cache_open (sdr_cache_ctx, ipmi_ctx, CACHE_LOCATION) < 0) { @@ -530,7 +585,16 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) } } } +#endif /* HAVE_FREEIPMI_11X_12X */ +#ifdef HAVE_FREEIPMI_11X_12X + if (ipmi_sdr_cache_record_count (sdr_ctx, &record_count) < 0) { + fprintf (stderr, + "ipmi_sdr_cache_record_count: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } +#else if (ipmi_sdr_cache_record_count (sdr_cache_ctx, &record_count) < 0) { fprintf (stderr, @@ -538,19 +602,44 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx)); goto cleanup; } +#endif /* HAVE_FREEIPMI_11X_12X */ +#ifdef HAVE_FREEIPMI_11X_12X + for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_ctx)) + { + memset (sdr_record, '\0', IPMI_SDR_MAX_RECORD_LENGTH); + + if ((sdr_record_len = ipmi_sdr_cache_record_read (sdr_ctx, + sdr_record, + IPMI_SDR_MAX_RECORD_LENGTH)) < 0) + { + fprintf (stderr, "ipmi_sdr_cache_record_read: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } + if (ipmi_sdr_parse_record_id_and_type (sdr_ctx, + sdr_record, + sdr_record_len, + NULL, + &record_type) < 0) + { + fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } +#else for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_cache_ctx)) { - memset (sdr_record, '\0', IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH); + memset (sdr_record, '\0', IPMI_SDR_MAX_RECORD_LENGTH); + if ((sdr_record_len = ipmi_sdr_cache_record_read (sdr_cache_ctx, sdr_record, - IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH)) < 0) + IPMI_SDR_MAX_RECORD_LENGTH)) < 0) { fprintf (stderr, "ipmi_sdr_cache_record_read: %s", ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx)); goto cleanup; } - if (ipmi_sdr_parse_record_id_and_type (sdr_parse_ctx, sdr_record, sdr_record_len, @@ -561,10 +650,27 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx)); goto cleanup; } +#endif /* HAVE_FREEIPMI_11X_12X */ if (record_type != IPMI_SDR_FORMAT_FRU_DEVICE_LOCATOR_RECORD) continue; +#ifdef HAVE_FREEIPMI_11X_12X + if (ipmi_sdr_parse_fru_device_locator_parameters (sdr_ctx, + sdr_record, + sdr_record_len, + NULL, + &logical_fru_device_device_slave_address, + NULL, + NULL, + &logical_physical_fru_device, + NULL) < 0) + { + fprintf (stderr, "ipmi_sdr_parse_fru_device_locator_parameters: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } +#else /* HAVE_FREEIPMI_11X_12X */ if (ipmi_sdr_parse_fru_device_locator_parameters (sdr_parse_ctx, sdr_record, sdr_record_len, @@ -579,12 +685,26 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx)); goto cleanup; } +#endif /* HAVE_FREEIPMI_11X_12X */ if (logical_physical_fru_device && logical_fru_device_device_slave_address == ipmi_dev->ipmi_id) { found_device_id++; +#ifdef HAVE_FREEIPMI_11X_12X + if (ipmi_sdr_parse_fru_entity_id_and_instance (sdr_ctx, + sdr_record, + sdr_record_len, + &entity_id, + &entity_instance) < 0) + { + fprintf (stderr, + "ipmi_sdr_parse_fru_entity_id_and_instance: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } +#else /* HAVE_FREEIPMI_11X_12X */ if (ipmi_sdr_parse_fru_entity_id_and_instance (sdr_parse_ctx, sdr_record, sdr_record_len, @@ -596,6 +716,7 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx)); goto cleanup; } +#endif /* HAVE_FREEIPMI_11X_12X */ break; } } @@ -608,23 +729,60 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) else upsdebugx(1, "Found device id %d", ipmi_dev->ipmi_id); +#ifdef HAVE_FREEIPMI_11X_12X + if (ipmi_sdr_cache_first (sdr_ctx) < 0) + { + fprintf (stderr, "ipmi_sdr_cache_first: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } +#else /* HAVE_FREEIPMI_11X_12X */ if (ipmi_sdr_cache_first (sdr_cache_ctx) < 0) { fprintf (stderr, "ipmi_sdr_cache_first: %s", ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx)); goto cleanup; } +#endif /* HAVE_FREEIPMI_11X_12X */ +#ifdef HAVE_FREEIPMI_11X_12X + for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_ctx)) + { + /* uint8_t sdr_record[IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH]; + uint8_t record_type, tmp_entity_id, tmp_entity_instance; + int sdr_record_len; */ + + memset (sdr_record, '\0', IPMI_SDR_MAX_RECORD_LENGTH); + if ((sdr_record_len = ipmi_sdr_cache_record_read (sdr_ctx, + sdr_record, + IPMI_SDR_MAX_RECORD_LENGTH)) < 0) + { + fprintf (stderr, "ipmi_sdr_cache_record_read: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } + + if (ipmi_sdr_parse_record_id_and_type (sdr_ctx, + sdr_record, + sdr_record_len, + &record_id, + &record_type) < 0) + { + fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } +#else /* HAVE_FREEIPMI_11X_12X */ for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_cache_ctx)) { /* uint8_t sdr_record[IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH]; uint8_t record_type, tmp_entity_id, tmp_entity_instance; int sdr_record_len; */ - memset (sdr_record, '\0', IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH); + memset (sdr_record, '\0', IPMI_SDR_MAX_RECORD_LENGTH); if ((sdr_record_len = ipmi_sdr_cache_record_read (sdr_cache_ctx, sdr_record, - IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH)) < 0) + IPMI_SDR_MAX_RECORD_LENGTH)) < 0) { fprintf (stderr, "ipmi_sdr_cache_record_read: %s", ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx)); @@ -641,6 +799,7 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx)); goto cleanup; } +#endif /* HAVE_FREEIPMI_11X_12X */ upsdebugx (5, "Checking record %i (/%i)", record_id, record_count); @@ -650,6 +809,19 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) continue; } +#ifdef HAVE_FREEIPMI_11X_12X + if (ipmi_sdr_parse_entity_id_instance_type (sdr_ctx, + sdr_record, + sdr_record_len, + &tmp_entity_id, + &tmp_entity_instance, + NULL) < 0) + { + fprintf (stderr, "ipmi_sdr_parse_entity_instance_type: %s", + ipmi_sdr_ctx_errormsg (sdr_ctx)); + goto cleanup; + } +#else /* HAVE_FREEIPMI_11X_12X */ if (ipmi_sdr_parse_entity_id_instance_type (sdr_parse_ctx, sdr_record, sdr_record_len, @@ -661,6 +833,7 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx)); goto cleanup; } +#endif /* HAVE_FREEIPMI_11X_12X */ if (tmp_entity_id == entity_id && tmp_entity_instance == entity_instance) @@ -677,6 +850,11 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev) cleanup: /* Cleanup */ +#ifdef HAVE_FREEIPMI_11X_12X + if (sdr_ctx) { + ipmi_sdr_ctx_destroy (sdr_ctx); + } +#else /* HAVE_FREEIPMI_11X_12X */ if (sdr_cache_ctx) { ipmi_sdr_cache_ctx_destroy (sdr_cache_ctx); } @@ -684,6 +862,7 @@ cleanup: if (sdr_parse_ctx) { ipmi_sdr_parse_ctx_destroy (sdr_parse_ctx); } +#endif /* HAVE_FREEIPMI_11X_12X */ return ipmi_dev->sensors_count; } @@ -775,6 +954,8 @@ int nut_ipmi_get_sensors_status(IPMIDevice_t *ipmi_dev) return -1; } + upsdebugx (1, "nut_ipmi_get_sensors_status: %i sensors to check", sensor_count); + for (i = 0; i < sensor_count; i++, ipmi_monitoring_sensor_iterator_next (mon_ctx)) { int record_id, sensor_type; @@ -797,6 +978,8 @@ int nut_ipmi_get_sensors_status(IPMIDevice_t *ipmi_dev) continue; } + upsdebugx (1, "checking sensor #%i, type %i", record_id, sensor_type); + /* should we consider this for ALARM? * IPMI_MONITORING_STATE_NOMINAL * IPMI_MONITORING_STATE_WARNING @@ -838,16 +1021,19 @@ int nut_ipmi_get_sensors_status(IPMIDevice_t *ipmi_dev) ipmi_dev->temperature = *((double *)sensor_reading); upsdebugx (3, "Temperature: %.2f", *((double *)sensor_reading)); dstate_setinfo("ambient.temperature", "%.2f", *((double *)sensor_reading)); + retval = 0; break; case IPMI_MONITORING_SENSOR_TYPE_VOLTAGE: ipmi_dev->voltage = *((double *)sensor_reading); upsdebugx (3, "Voltage: %.2f", *((double *)sensor_reading)); dstate_setinfo("input.voltage", "%.2f", *((double *)sensor_reading)); + retval = 0; break; case IPMI_MONITORING_SENSOR_TYPE_CURRENT: ipmi_dev->input_current = *((double *)sensor_reading); upsdebugx (3, "Current: %.2f", *((double *)sensor_reading)); dstate_setinfo("input.current", "%.2f", *((double *)sensor_reading)); + retval = 0; break; case IPMI_MONITORING_SENSOR_TYPE_POWER_SUPPLY: @@ -898,6 +1084,7 @@ int nut_ipmi_get_sensors_status(IPMIDevice_t *ipmi_dev) str_count++; } break; + /* Not sure of the values of these, so get as much as possible... */ case IPMI_MONITORING_SENSOR_TYPE_POWER_UNIT: upsdebugx (3, "Power Unit: status string"); @@ -938,6 +1125,7 @@ int nut_ipmi_get_sensors_status(IPMIDevice_t *ipmi_dev) { case PSU_PRESENT: status_set("OL"); + retval = 0; break; case PSU_ABSENT: status_set("OFF"); @@ -946,6 +1134,7 @@ int nut_ipmi_get_sensors_status(IPMIDevice_t *ipmi_dev) break; case PSU_POWER_FAILURE: status_set("OFF"); + retval = 0; break; } @@ -955,3 +1144,9 @@ int nut_ipmi_get_sensors_status(IPMIDevice_t *ipmi_dev) return retval; } + +/* +--chassis-control=CONTROL + Control the chassis. This command provides power-up, power-down, and reset control. Supported values: POWER-DOWN, POWER-UP, POWER-CYCLE, HARD-RESET, DIAGNOS‐ + TIC-INTERRUPT, SOFT-SHUTDOWN. +*/ diff --git a/drivers/oneac.h b/drivers/oneac.h index 9f1bae8..a85a505 100644 --- a/drivers/oneac.h +++ b/drivers/oneac.h @@ -95,8 +95,12 @@ #define GETX_BATT_REPLACED '+' /* yymmdd */ #define GETX_DATE_RESP_SIZE 6 +/* FIXME: Both of the following constants are unused, and the first is not + * valid C syntax (breaks LLVM). */ +#if 0 #define GETX_UNIT_KVA '''' /* Read as xxx.xx */ #define GETX_UNIT_WATTS "''" /* 2-character string request */ +#endif #define GETX_LOW_OUT_ALLOW '[' /* Tap up or inverter at this point */ #define GETX_HI_OUT_ALLOW ']' /* Tap down or inverter at this point */ #define GETX_NOTIFY_DELAY ',' /* Secs of delay for power fail alert */ diff --git a/drivers/powercom-hid.c b/drivers/powercom-hid.c index 7e1b7fd..d6a2a50 100644 --- a/drivers/powercom-hid.c +++ b/drivers/powercom-hid.c @@ -43,7 +43,7 @@ static usb_device_id_t powercom_usb_device_table[] = { { USB_DEVICE(POWERCOM_VENDORID, 0x00a5), NULL }, /* PowerCOM BNT - Black Knight Pro */ { USB_DEVICE(POWERCOM_VENDORID, 0x00a6), NULL }, - /* PowerCOM BNT-xxxAP */ + /* PowerCOM Vanguard and BNT-xxxAP */ { USB_DEVICE(POWERCOM_VENDORID, 0x0004), NULL }, /* Terminating entry */ diff --git a/drivers/safenet.c b/drivers/safenet.c index 392fa45..77170fb 100644 --- a/drivers/safenet.c +++ b/drivers/safenet.c @@ -297,8 +297,6 @@ void upsdrv_initinfo(void) int retry = 3; char *v; - dstate_setinfo("driver.version.internal", "%s", DRIVER_VERSION); - usleep(100000); /* diff --git a/drivers/skel.c b/drivers/skel.c index 4957bcd..5d4b930 100644 --- a/drivers/skel.c +++ b/drivers/skel.c @@ -33,7 +33,8 @@ upsdrv_info_t upsdrv_info = { void upsdrv_initinfo(void) { - /* try to detect the UPS here - call fatal_with_errno(EXIT_FAILURE, ) if it fails */ + /* try to detect the UPS here - call fatal_with_errno(EXIT_FAILURE, ...) + * or fatalx(EXIT_FAILURE, ...) if it fails */ /* dstate_setinfo("ups.mfr", "skel manufacturer"); */ /* dstate_setinfo("ups.model", "longrun 15000"); */ @@ -158,7 +159,7 @@ void upsdrv_initups(void) /* to get variables and flags from the command line, use this: * - * first populate with upsdrv_buildvartable above, then... + * first populate with upsdrv_makevartable() above, then... * * set flag foo : /bin/driver -x foo * set variable 'cable' to '1234' : /bin/driver -x cable=1234 diff --git a/drivers/snmp-ups.c b/drivers/snmp-ups.c index 36fdfb8..598b816 100644 --- a/drivers/snmp-ups.c +++ b/drivers/snmp-ups.c @@ -60,6 +60,8 @@ static mib2nut_info_t *mib2nut[] = { &aphel_genesisII, &aphel_revelation, &eaton_marlin, + &pulizzi_switched1, + &pulizzi_switched2, &raritan, &baytech, &compaq, @@ -91,7 +93,7 @@ const char *mibvers; static void disable_transfer_oids(void); #define DRIVER_NAME "Generic SNMP UPS driver" -#define DRIVER_VERSION "0.66" +#define DRIVER_VERSION "0.68" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -122,13 +124,10 @@ int outlet_index_base = -1; void upsdrv_initinfo(void) { snmp_info_t *su_info_p; - char version[128]; upsdebugx(1, "SNMP UPS driver : entering upsdrv_initinfo()"); - snprintf(version, sizeof version, "%s (mib: %s %s)", - DRIVER_VERSION, mibname, mibvers); - dstate_setinfo("driver.version.internal", "%s", version); + dstate_setinfo("driver.version.data", "%s MIB %s", mibname, mibvers); /* add instant commands to the info database. * outlet commands are processed later, during initial walk */ @@ -955,7 +954,7 @@ const char *su_find_infoval(info_lkp_t *oid2info, long value) info_lkp_t *info_lkp; for (info_lkp = oid2info; (info_lkp != NULL) && - (strcmp(info_lkp->info_value, "NULL")); info_lkp++) { + (strcmp(info_lkp->info_value, "NULL")) && (info_lkp->info_value != NULL); info_lkp++) { if (info_lkp->oid_value == value) { upsdebugx(1, "su_find_infoval: found %s (value: %ld)", @@ -1055,6 +1054,32 @@ int base_nut_outlet_offset(void) return (outlet_index_base==0)?1:0; } +/* try to determine the number of outlets, using a template definition, + * that we walk, until we can't get anymore values */ +static int guestimate_outlet_count(const char *OID_template) +{ + int base_index = 0; + char test_OID[SU_INFOSIZE]; + int base_count; + + upsdebugx(1, "guestimate_outlet_count(%s)", OID_template); + + /* Determine if OID index starts from 0 or 1? */ + sprintf(test_OID, OID_template, base_index); + if (nut_snmp_get(test_OID) == NULL) + base_index++; + + /* Now, actually iterate */ + for (base_count = 0 ; ; base_count++) { + sprintf(test_OID, OID_template, base_index + base_count); + if (nut_snmp_get(test_OID) == NULL) + break; + } + + upsdebugx(3, "guestimate_outlet_count: %i", base_count); + return base_count; +} + /* process a single data from a walk */ bool_t get_and_process_data(int mode, snmp_info_t *su_info_p) { @@ -1236,10 +1261,20 @@ bool_t snmp_ups_walk(int mode) if(dstate_getinfo("outlet.count") == NULL) { /* FIXME: should we disable it? - * su_info_p->flags &= ~SU_FLAG_OK; */ - continue; + * su_info_p->flags &= ~SU_FLAG_OK; + * or rely on guestimation? */ + if ((outlet_count = guestimate_outlet_count(su_info_p->OID)) == -1) { + /* Failed */ + continue; + } + else { + /* Publish the count estimation */ + dstate_setinfo("outlet.count", "%i", outlet_count); + } + } + else { + outlet_count = atoi(dstate_getinfo("outlet.count")); } - outlet_count = atoi(dstate_getinfo("outlet.count")); /* general init of data using the template */ instantiate_info(su_info_p, &cur_info_p); @@ -1495,11 +1530,14 @@ int su_instcmd(const char *cmdname, const char *extradata) snmp_info_t *su_info_p = NULL; int status; int retval = STAT_INSTCMD_FAILED; + int cmd_offset = 0; upsdebugx(2, "entering su_instcmd(%s, %s)", cmdname, extradata); - if (strncmp(cmdname, "outlet", 6)) + /* FIXME: this should only apply if strchr(%)! */ + if (strncmp(cmdname, "outlet", 6)) { su_info_p = su_find_info(cmdname); + } else { snmp_info_t *tmp_info_p; char *outlet_number_ptr = strchr(cmdname, '.'); @@ -1539,8 +1577,15 @@ int su_instcmd(const char *cmdname, const char *extradata) } /* adapt the OID */ if (su_info_p->OID != NULL) { + /* Workaround buggy Eaton Pulizzi implementation + * which have different offsets index for data & commands! */ + if (su_info_p->flags & SU_CMD_OFFSET) { + upsdebugx(3, "Adding command offset"); + cmd_offset++; + } + sprintf((char *)su_info_p->OID, tmp_info_p->OID, - outlet_number - base_nut_outlet_offset()); + outlet_number - base_nut_outlet_offset() + cmd_offset); } else { free_info(su_info_p); return STAT_INSTCMD_UNKNOWN; diff --git a/drivers/snmp-ups.h b/drivers/snmp-ups.h index 72f93ce..328963c 100644 --- a/drivers/snmp-ups.h +++ b/drivers/snmp-ups.h @@ -132,13 +132,18 @@ typedef struct { * disable the other providers */ #define SU_FLAG_SETINT (1 << 6) /* save value */ #define SU_OUTLET (1 << 7) /* outlet template definition */ +#define SU_CMD_OFFSET (1 << 8) /* Add +1 to the OID index */ /* Notes on outlet templates usage: * - outlet.count MUST exist and MUST be declared before any outlet template + * Otherwise, the driver will try to determine it by itself... * - the first outlet template MUST NOT be a server side variable (ie MUST have * a valid OID) in order to detect the base SNMP index (0 or 1) */ -/* status string components */ +/* status string components + * FIXME: these should be removed, since there is no added value. + * Ie, this can be guessed from info->type! */ + #define SU_STATUS_PWR (0 << 8) /* indicates power status element */ #define SU_STATUS_BATT (1 << 8) /* indicates battery status element */ #define SU_STATUS_CAL (2 << 8) /* indicates calibration status element */ diff --git a/drivers/tripplitesu.c b/drivers/tripplitesu.c index 9c9049b..d0d0563 100644 --- a/drivers/tripplitesu.c +++ b/drivers/tripplitesu.c @@ -75,7 +75,6 @@ battery.temperature battery.voltage battery.voltage.nominal - driver.version.internal input.frequency input.sensitivity (RW) (1) input.transfer.high (RW) diff --git a/drivers/usbhid-ups.c b/drivers/usbhid-ups.c index 6899d2f..d2c276c 100644 --- a/drivers/usbhid-ups.c +++ b/drivers/usbhid-ups.c @@ -717,6 +717,10 @@ void upsdrv_makevartable(void) upsdebugx(1, "upsdrv_makevartable..."); + snprintf(temp, sizeof(temp), "Set low battery level, in %% (default=%s).", DEFAULT_LOWBATT); + addvar (VAR_VALUE, HU_VAR_LOWBATT, temp); + + snprintf(temp, sizeof(temp), "Set shutdown delay, in seconds (default=%s)", DEFAULT_OFFDELAY); addvar(VAR_VALUE, HU_VAR_OFFDELAY, temp); @@ -738,6 +742,8 @@ void upsdrv_makevartable(void) addvar(VAR_VALUE, "productid", "Regular expression to match UPS Product numerical ID (4 digits hexadecimal)"); addvar(VAR_VALUE, "bus", "Regular expression to match USB bus name"); addvar(VAR_FLAG, "explore", "Diagnostic matching of unsupported UPS"); +#else + addvar(VAR_VALUE, "notification", "Set notification type, (ignored, only for backward compatibility)"); #endif } @@ -855,7 +861,6 @@ void upsdrv_initinfo(void) upsdebugx(1, "upsdrv_initinfo..."); dstate_setinfo("driver.version.data", "%s", subdriver->name); - dstate_setinfo("driver.version.internal", DRIVER_VERSION); /* init polling frequency */ val = getval(HU_VAR_POLLFREQ); @@ -939,6 +944,14 @@ void upsdrv_initups(void) fatalx(EXIT_FAILURE, "Can't initialize data from HID UPS"); } + if (dstate_getinfo("battery.charge.low")) { + /* Retrieve user defined battery settings */ + val = getval(HU_VAR_LOWBATT); + if (val) { + dstate_setinfo("battery.charge.low", "%ld", strtol(val, NULL, 10)); + } + } + if (dstate_getinfo("ups.delay.start")) { /* Retrieve user defined delay settings */ val = getval(HU_VAR_ONDELAY); diff --git a/drivers/usbhid-ups.h b/drivers/usbhid-ups.h index 96bce48..4f4b3c3 100644 --- a/drivers/usbhid-ups.h +++ b/drivers/usbhid-ups.h @@ -37,11 +37,13 @@ extern hid_dev_handle_t udev; extern bool_t use_interrupt_pipe; /* Set to FALSE if interrupt reports should not be used */ /* Driver's parameters */ +#define HU_VAR_LOWBATT "lowbatt" #define HU_VAR_ONDELAY "ondelay" #define HU_VAR_OFFDELAY "offdelay" #define HU_VAR_POLLFREQ "pollfreq" /* Parameters default values */ +#define DEFAULT_LOWBATT "30" /* percentage of battery charge to consider the UPS in low battery state */ #define DEFAULT_ONDELAY "30" /* Delay between return of utility power */ /* and powering up of load, in seconds */ /* CAUTION: ondelay > offdelay */ diff --git a/include/Makefile.in b/include/Makefile.in index 324c600..e21f5a6 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -85,6 +85,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -188,6 +194,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/include/config.h.in b/include/config.h.in index 2d9c06d..7fa10b0 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -92,6 +92,9 @@ /* Define if FreeIPMI support is available */ #undef HAVE_FREEIPMI +/* Define if FreeIPMI 1.1.X / 1.2.X support is available */ +#undef HAVE_FREEIPMI_11X_12X + /* Define to 1 if you have the header file. */ #undef HAVE_FREEIPMI_FREEIPMI_H @@ -397,6 +400,9 @@ /* Define to enable Powerman PDU support */ #undef WITH_LIBPOWERMAN +/* Define to enable Mac OS X meta-driver */ +#undef WITH_MACOSX + /* Define to enable Neon HTTP support */ #undef WITH_NEON diff --git a/lib/Makefile.in b/lib/Makefile.in index 36945ba..d974132 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -114,6 +114,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -217,6 +223,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/m4/nut_check_libfreeipmi.m4 b/m4/nut_check_libfreeipmi.m4 index c6d4163..72e7819 100644 --- a/m4/nut_check_libfreeipmi.m4 +++ b/m4/nut_check_libfreeipmi.m4 @@ -71,6 +71,10 @@ if test -z "${nut_have_libfreeipmi_seen}"; then AC_SEARCH_LIBS([ipmi_monitoring_init], [ipmimonitoring], [nut_have_freeipmi_monitoring=yes], [nut_have_freeipmi_monitoring=no]) AC_SEARCH_LIBS([ipmi_monitoring_sensor_read_record_id], [ipmimonitoring], [], [nut_have_freeipmi_monitoring=no]) + dnl Check for FreeIPMI 1.1.X / 1.2.X which implies API changes! + AC_SEARCH_LIBS([ipmi_sdr_cache_ctx_destroy], [freeipmi], [nut_have_freeipmi_11x_12x=no], []) + AC_SEARCH_LIBS([ipmi_sdr_ctx_destroy], [freeipmi], [nut_have_freeipmi_11x_12x=yes], [nut_have_freeipmi_11x_12x=no]) + if test "${nut_have_freeipmi}" = "yes"; then nut_with_ipmi="yes" nut_ipmi_lib="(FreeIPMI)" @@ -80,6 +84,10 @@ if test -z "${nut_have_libfreeipmi_seen}"; then LIBIPMI_LIBS="${LIBS}" fi + if test "${nut_have_freeipmi_11x_12x}" = "yes"; then + AC_DEFINE(HAVE_FREEIPMI_11X_12X, 1, [Define if FreeIPMI 1.1.X / 1.2.X support is available]) + fi + if test "${nut_have_freeipmi_monitoring}" = "yes"; then AC_DEFINE(HAVE_FREEIPMI_MONITORING, 1, [Define if FreeIPMI monitoring support is available]) fi diff --git a/m4/nut_check_libltdl.m4 b/m4/nut_check_libltdl.m4 index e1058bb..4c5f6e7 100644 --- a/m4/nut_check_libltdl.m4 +++ b/m4/nut_check_libltdl.m4 @@ -12,6 +12,36 @@ if test -z "${nut_have_libltdl_seen}"; then LIBS_ORIG="${LIBS}" LIBS="" + AC_MSG_CHECKING(for libltdl cflags) + AC_ARG_WITH(libltdl-includes, + AS_HELP_STRING([@<:@--with-libltdl-includes=CFLAGS@:>@], [include flags for the libltdl library]), + [ + case "${withval}" in + yes|no) + AC_MSG_ERROR(invalid option --with(out)-libltdl-includes - see docs/configure.txt) + ;; + *) + CFLAGS="${withval}" + ;; + esac + ], []) + AC_MSG_RESULT([${CFLAGS}]) + + AC_MSG_CHECKING(for libltdl ldflags) + AC_ARG_WITH(libltdl-libs, + AS_HELP_STRING([@<:@--with-libltdl-libs=LIBS@:>@], [linker flags for the libltdl library]), + [ + case "${withval}" in + yes|no) + AC_MSG_ERROR(invalid option --with(out)-libltdl-libs - see docs/configure.txt) + ;; + *) + LIBS="${withval}" + ;; + esac + ], []) + AC_MSG_RESULT([${LIBS}]) + AC_CHECK_HEADERS(ltdl.h, [nut_have_libltdl=yes], [nut_have_libltdl=no], [AC_INCLUDES_DEFAULT]) AC_SEARCH_LIBS(lt_dlinit, ltdl, [], [nut_have_libltdl=no]) diff --git a/scripts/Makefile.in b/scripts/Makefile.in index 156e00a..92b7f73 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -124,6 +124,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -227,6 +233,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/augeas/Makefile.in b/scripts/augeas/Makefile.in index 22d5f63..ebeb554 100644 --- a/scripts/augeas/Makefile.in +++ b/scripts/augeas/Makefile.in @@ -91,6 +91,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -194,6 +200,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/hal/Makefile.in b/scripts/hal/Makefile.in index 4f9f7cd..f07c0e3 100644 --- a/scripts/hal/Makefile.in +++ b/scripts/hal/Makefile.in @@ -109,6 +109,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -212,6 +218,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/hal/ups-nut-device.fdi.in b/scripts/hal/ups-nut-device.fdi.in index d35c5d4..5587fd4 100644 --- a/scripts/hal/ups-nut-device.fdi.in +++ b/scripts/hal/ups-nut-device.fdi.in @@ -308,6 +308,13 @@ hald-addon-blazer_usb ups + + + battery + battery + hald-addon-blazer_usb + ups + battery @@ -585,7 +592,7 @@ - + battery battery diff --git a/scripts/hotplug/Makefile.in b/scripts/hotplug/Makefile.in index 8aeb214..124320a 100644 --- a/scripts/hotplug/Makefile.in +++ b/scripts/hotplug/Makefile.in @@ -114,6 +114,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -217,6 +223,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/hotplug/libhid.usermap b/scripts/hotplug/libhid.usermap index 40c07e2..9fab6ec 100644 --- a/scripts/hotplug/libhid.usermap +++ b/scripts/hotplug/libhid.usermap @@ -96,6 +96,8 @@ libhidups 0x0003 0x06da 0x0004 0x0000 0x0000 0x00 libhidups 0x0003 0x06da 0x0005 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Phoenixtec Innova T libhidups 0x0003 0x06da 0x0201 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 +# Online Zinto A +libhidups 0x0003 0x06da 0x0601 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # various models libhidups 0x0003 0x06da 0xffff 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 @@ -178,7 +180,7 @@ libhidups 0x0003 0x09ae 0x4007 0x0000 0x0000 0x00 libhidups 0x0003 0x09ae 0x4008 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # PowerCOM -# PowerCOM BNT-xxxAP +# PowerCOM Vanguard and BNT-xxxAP libhidups 0x0003 0x0d9f 0x0004 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # PowerCOM IMP - IMPERIAL Series libhidups 0x0003 0x0d9f 0x00a2 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 diff --git a/scripts/java/Makefile.in b/scripts/java/Makefile.in index 7afd226..e1f7ac1 100644 --- a/scripts/java/Makefile.in +++ b/scripts/java/Makefile.in @@ -86,6 +86,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -189,6 +195,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/python/Makefile.in b/scripts/python/Makefile.in index 1f354b0..8758850 100644 --- a/scripts/python/Makefile.in +++ b/scripts/python/Makefile.in @@ -86,6 +86,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -189,6 +195,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/systemd/Makefile.in b/scripts/systemd/Makefile.in index 8c2bc3d..108ab16 100644 --- a/scripts/systemd/Makefile.in +++ b/scripts/systemd/Makefile.in @@ -118,6 +118,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -221,6 +227,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/systemd/nut-driver.service.in b/scripts/systemd/nut-driver.service.in index f81ac69..ec31ee2 100644 --- a/scripts/systemd/nut-driver.service.in +++ b/scripts/systemd/nut-driver.service.in @@ -4,7 +4,7 @@ After=local-fs.target network.target StopWhenUnneeded=yes [Service] -ExecStart=@SBINDIR@/upsdrvctl start -ExecStop=@SBINDIR@/upsdrvctl stop +ExecStart=@driverexecdir@/upsdrvctl start +ExecStop=@driverexecdir@/upsdrvctl stop Type=forking diff --git a/scripts/systemd/nutshutdown.in b/scripts/systemd/nutshutdown.in index 1b97fa2..2caac4b 100644 --- a/scripts/systemd/nutshutdown.in +++ b/scripts/systemd/nutshutdown.in @@ -1,2 +1,2 @@ #!/bin/sh -@SBINDIR@/upsmon -K >/dev/null 2>&1 && @SBINDIR@/upsdrvctl shutdown +@SBINDIR@/upsmon -K >/dev/null 2>&1 && @driverexecdir@/upsdrvctl shutdown diff --git a/scripts/udev/Makefile.in b/scripts/udev/Makefile.in index 00d19d5..190f882 100644 --- a/scripts/udev/Makefile.in +++ b/scripts/udev/Makefile.in @@ -111,6 +111,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -214,6 +220,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/scripts/udev/nut-usbups.rules.in b/scripts/udev/nut-usbups.rules.in index 6aa3166..cfa2e88 100644 --- a/scripts/udev/nut-usbups.rules.in +++ b/scripts/udev/nut-usbups.rules.in @@ -98,6 +98,8 @@ ATTR{idVendor}=="06da", ATTR{idProduct}=="0004", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="06da", ATTR{idProduct}=="0005", MODE="664", GROUP="@RUN_AS_GROUP@" # Phoenixtec Innova T - blazer_usb ATTR{idVendor}=="06da", ATTR{idProduct}=="0201", MODE="664", GROUP="@RUN_AS_GROUP@" +# Online Zinto A - blazer_usb +ATTR{idVendor}=="06da", ATTR{idProduct}=="0601", MODE="664", GROUP="@RUN_AS_GROUP@" # various models - usbhid-ups ATTR{idVendor}=="06da", ATTR{idProduct}=="ffff", MODE="664", GROUP="@RUN_AS_GROUP@" @@ -180,7 +182,7 @@ ATTR{idVendor}=="09ae", ATTR{idProduct}=="4007", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="09ae", ATTR{idProduct}=="4008", MODE="664", GROUP="@RUN_AS_GROUP@" # PowerCOM -# PowerCOM BNT-xxxAP - usbhid-ups +# PowerCOM Vanguard and BNT-xxxAP - usbhid-ups ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0004", MODE="664", GROUP="@RUN_AS_GROUP@" # PowerCOM IMP - IMPERIAL Series - usbhid-ups ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a2", MODE="664", GROUP="@RUN_AS_GROUP@" diff --git a/server/Makefile.am b/server/Makefile.am index 5f2f679..8146568 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -21,10 +21,10 @@ endif sbin_PROGRAMS = upsd EXTRA_PROGRAMS = sockdebug -upsd_SOURCES = upsd.c user.c conf.c ssl.c sstate.c desc.c \ +upsd_SOURCES = upsd.c user.c conf.c netssl.c sstate.c desc.c \ netget.c netmisc.c netlist.c netuser.c netset.c netinstcmd.c \ conf.h nut_ctype.h desc.h netcmds.h neterr.h netget.h netinstcmd.h \ - netlist.h netmisc.h netset.h netuser.h ssl.h sstate.h stype.h upsd.h \ + netlist.h netmisc.h netset.h netuser.h netssl.h sstate.h stype.h upsd.h \ upstype.h user-data.h user.h sockdebug_SOURCES = sockdebug.c diff --git a/server/Makefile.in b/server/Makefile.in index dd63712..a633c0d 100644 --- a/server/Makefile.in +++ b/server/Makefile.in @@ -86,9 +86,9 @@ sockdebug_DEPENDENCIES = ../common/libcommon.la \ ../common/libparseconf.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) am_upsd_OBJECTS = upsd.$(OBJEXT) user.$(OBJEXT) conf.$(OBJEXT) \ - ssl.$(OBJEXT) sstate.$(OBJEXT) desc.$(OBJEXT) netget.$(OBJEXT) \ - netmisc.$(OBJEXT) netlist.$(OBJEXT) netuser.$(OBJEXT) \ - netset.$(OBJEXT) netinstcmd.$(OBJEXT) + netssl.$(OBJEXT) sstate.$(OBJEXT) desc.$(OBJEXT) \ + netget.$(OBJEXT) netmisc.$(OBJEXT) netlist.$(OBJEXT) \ + netuser.$(OBJEXT) netset.$(OBJEXT) netinstcmd.$(OBJEXT) upsd_OBJECTS = $(am_upsd_OBJECTS) upsd_LDADD = $(LDADD) upsd_DEPENDENCIES = ../common/libcommon.la ../common/libparseconf.la \ @@ -128,6 +128,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -231,6 +237,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -295,10 +302,10 @@ udevdir = @udevdir@ AM_CFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) LDADD = ../common/libcommon.la ../common/libparseconf.la $(NETLIBS) \ $(am__append_3) $(am__append_4) -upsd_SOURCES = upsd.c user.c conf.c ssl.c sstate.c desc.c \ +upsd_SOURCES = upsd.c user.c conf.c netssl.c sstate.c desc.c \ netget.c netmisc.c netlist.c netuser.c netset.c netinstcmd.c \ conf.h nut_ctype.h desc.h netcmds.h neterr.h netget.h netinstcmd.h \ - netlist.h netmisc.h netset.h netuser.h ssl.h sstate.h stype.h upsd.h \ + netlist.h netmisc.h netset.h netuser.h netssl.h sstate.h stype.h upsd.h \ upstype.h user-data.h user.h sockdebug_SOURCES = sockdebug.c @@ -399,9 +406,9 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netmisc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netssl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netuser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockdebug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sstate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user.Po@am__quote@ diff --git a/server/conf.c b/server/conf.c index 3e348e2..c4d52fc 100644 --- a/server/conf.c +++ b/server/conf.c @@ -22,7 +22,7 @@ #include "upsconf.h" #include "sstate.h" #include "user.h" -#include "ssl.h" +#include "netssl.h" ups_t *upstable = NULL; int num_ups = 0; diff --git a/server/netcmds.h b/server/netcmds.h index c0b5225..613ef44 100644 --- a/server/netcmds.h +++ b/server/netcmds.h @@ -19,7 +19,7 @@ #include "nut_ctype.h" -#include "ssl.h" +#include "netssl.h" #include "netget.h" #include "netset.h" #include "netlist.h" diff --git a/server/ssl.c b/server/netssl.c similarity index 98% rename from server/ssl.c rename to server/netssl.c index bb95dca..ff3fd4e 100644 --- a/server/ssl.c +++ b/server/netssl.c @@ -1,4 +1,4 @@ -/* ssl.c - Interface to OpenSSL for upsd +/* netssl.c - Interface to OpenSSL for upsd Copyright (C) 2002 Russell Kroll @@ -29,7 +29,7 @@ #include "upsd.h" #include "neterr.h" -#include "ssl.h" +#include "netssl.h" char *certfile = NULL; diff --git a/server/ssl.h b/server/netssl.h similarity index 96% rename from server/ssl.h rename to server/netssl.h index 7f4009c..2d6224e 100644 --- a/server/ssl.h +++ b/server/netssl.h @@ -1,4 +1,4 @@ -/* ssl.h - ssl support prototypes for upsd +/* netssl.h - ssl support prototypes for upsd Copyright (C) 2002 Russell Kroll diff --git a/server/upsd.c b/server/upsd.c index 1bb6c27..f8d9c7e 100644 --- a/server/upsd.c +++ b/server/upsd.c @@ -35,7 +35,7 @@ #include "user.h" #include "nut_ctype.h" #include "stype.h" -#include "ssl.h" +#include "netssl.h" #include "sstate.h" #include "desc.h" #include "neterr.h" diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..3960ad8 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,21 @@ +# Network UPS Tools: tests + +if HAVE_CPPUNIT + +TESTS = cppunittest + +check_PROGRAMS = $(TESTS) + +cppunittest_CXXFLAGS = $(CPPUNIT_CFLAGS) +cppunittest_LDFLAGS = $(CPPUNIT_LIBS) + +# List of src files for CppUnit tests +CPPUNITTESTSRC = example.cpp + +cppunittest_SOURCES = $(CPPUNITTESTSRC) cpputest.cpp + +else !HAVE_CPPUNIT + +EXTRA_DIST = example.cpp cpputest.cpp + +endif !HAVE_CPPUNIT diff --git a/tests/Makefile.in b/tests/Makefile.in new file mode 100644 index 0000000..4530104 --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,698 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Network UPS Tools: tests +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@HAVE_CPPUNIT_TRUE@TESTS = cppunittest$(EXEEXT) +@HAVE_CPPUNIT_TRUE@check_PROGRAMS = $(am__EXEEXT_1) +subdir = tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nut_arg_with.m4 \ + $(top_srcdir)/m4/nut_check_asciidoc.m4 \ + $(top_srcdir)/m4/nut_check_libavahi.m4 \ + $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ + $(top_srcdir)/m4/nut_check_libgd.m4 \ + $(top_srcdir)/m4/nut_check_libhal.m4 \ + $(top_srcdir)/m4/nut_check_libltdl.m4 \ + $(top_srcdir)/m4/nut_check_libneon.m4 \ + $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ + $(top_srcdir)/m4/nut_check_libpowerman.m4 \ + $(top_srcdir)/m4/nut_check_libssl.m4 \ + $(top_srcdir)/m4/nut_check_libusb.m4 \ + $(top_srcdir)/m4/nut_check_libwrap.m4 \ + $(top_srcdir)/m4/nut_check_os.m4 \ + $(top_srcdir)/m4/nut_config_libhal.m4 \ + $(top_srcdir)/m4/nut_report_feature.m4 \ + $(top_srcdir)/m4/nut_type_socklen_t.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@HAVE_CPPUNIT_TRUE@am__EXEEXT_1 = cppunittest$(EXEEXT) +am__cppunittest_SOURCES_DIST = example.cpp cpputest.cpp +@HAVE_CPPUNIT_TRUE@am__objects_1 = cppunittest-example.$(OBJEXT) +@HAVE_CPPUNIT_TRUE@am_cppunittest_OBJECTS = $(am__objects_1) \ +@HAVE_CPPUNIT_TRUE@ cppunittest-cpputest.$(OBJEXT) +cppunittest_OBJECTS = $(am_cppunittest_OBJECTS) +cppunittest_LDADD = $(LDADD) +cppunittest_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(cppunittest_CXXFLAGS) \ + $(CXXFLAGS) $(cppunittest_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(cppunittest_SOURCES) +DIST_SOURCES = $(am__cppunittest_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A2X = @A2X@ +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +ASCIIDOC = @ASCIIDOC@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BINDIR = @BINDIR@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFPATH = @CONFPATH@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DBLATEX = @DBLATEX@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOC_BUILD_LIST = @DOC_BUILD_LIST@ +DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@ +DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@ +DRIVER_MAN_LIST = @DRIVER_MAN_LIST@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ +HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ +HAL_FDI_PATH = @HAL_FDI_PATH@ +HAL_USER = @HAL_USER@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ +LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBGD_CFLAGS = @LIBGD_CFLAGS@ +LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ +LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ +LIBHAL_LIBS = @LIBHAL_LIBS@ +LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ +LIBIPMI_LIBS = @LIBIPMI_LIBS@ +LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ +LIBLTDL_LIBS = @LIBLTDL_LIBS@ +LIBNEON_CFLAGS = @LIBNEON_CFLAGS@ +LIBNEON_LIBS = @LIBNEON_LIBS@ +LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@ +LIBNETSNMP_LIBS = @LIBNETSNMP_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBPOWERMAN_CFLAGS = @LIBPOWERMAN_CFLAGS@ +LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@ +LIBS = @LIBS@ +LIBSSL_CFLAGS = @LIBSSL_CFLAGS@ +LIBSSL_LIBS = @LIBSSL_LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ +LIBUSB_LIBS = @LIBUSB_LIBS@ +LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@ +LIBWRAP_LIBS = @LIBWRAP_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NETLIBS = @NETLIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NUT_NETVERSION = @NUT_NETVERSION@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OS_NAME = @OS_NAME@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIDPATH = @PIDPATH@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PORT = @PORT@ +RANLIB = @RANLIB@ +RUN_AS_GROUP = @RUN_AS_GROUP@ +RUN_AS_USER = @RUN_AS_USER@ +SBINDIR = @SBINDIR@ +SED = @SED@ +SERLIBS = @SERLIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STATEPATH = @STATEPATH@ +STRIP = @STRIP@ +SUN_LIBUSB = @SUN_LIBUSB@ +TREE_VERSION = @TREE_VERSION@ +VERSION = @VERSION@ +WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cgiexecdir = @cgiexecdir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +driverexecdir = @driverexecdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +hotplugdir = @hotplugdir@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfigdir = @pkgconfigdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemshutdowndir = @systemdsystemshutdowndir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevdir = @udevdir@ +@HAVE_CPPUNIT_TRUE@cppunittest_CXXFLAGS = $(CPPUNIT_CFLAGS) +@HAVE_CPPUNIT_TRUE@cppunittest_LDFLAGS = $(CPPUNIT_LIBS) + +# List of src files for CppUnit tests +@HAVE_CPPUNIT_TRUE@CPPUNITTESTSRC = example.cpp +@HAVE_CPPUNIT_TRUE@cppunittest_SOURCES = $(CPPUNITTESTSRC) cpputest.cpp +@HAVE_CPPUNIT_FALSE@EXTRA_DIST = example.cpp cpputest.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +cppunittest$(EXEEXT): $(cppunittest_OBJECTS) $(cppunittest_DEPENDENCIES) + @rm -f cppunittest$(EXEEXT) + $(cppunittest_LINK) $(cppunittest_OBJECTS) $(cppunittest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cppunittest-cpputest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cppunittest-example.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +cppunittest-example.o: example.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-example.o -MD -MP -MF $(DEPDIR)/cppunittest-example.Tpo -c -o cppunittest-example.o `test -f 'example.cpp' || echo '$(srcdir)/'`example.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-example.Tpo $(DEPDIR)/cppunittest-example.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='example.cpp' object='cppunittest-example.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-example.o `test -f 'example.cpp' || echo '$(srcdir)/'`example.cpp + +cppunittest-example.obj: example.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-example.obj -MD -MP -MF $(DEPDIR)/cppunittest-example.Tpo -c -o cppunittest-example.obj `if test -f 'example.cpp'; then $(CYGPATH_W) 'example.cpp'; else $(CYGPATH_W) '$(srcdir)/example.cpp'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-example.Tpo $(DEPDIR)/cppunittest-example.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='example.cpp' object='cppunittest-example.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-example.obj `if test -f 'example.cpp'; then $(CYGPATH_W) 'example.cpp'; else $(CYGPATH_W) '$(srcdir)/example.cpp'; fi` + +cppunittest-cpputest.o: cpputest.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-cpputest.o -MD -MP -MF $(DEPDIR)/cppunittest-cpputest.Tpo -c -o cppunittest-cpputest.o `test -f 'cpputest.cpp' || echo '$(srcdir)/'`cpputest.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-cpputest.Tpo $(DEPDIR)/cppunittest-cpputest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='cpputest.cpp' object='cppunittest-cpputest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-cpputest.o `test -f 'cpputest.cpp' || echo '$(srcdir)/'`cpputest.cpp + +cppunittest-cpputest.obj: cpputest.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-cpputest.obj -MD -MP -MF $(DEPDIR)/cppunittest-cpputest.Tpo -c -o cppunittest-cpputest.obj `if test -f 'cpputest.cpp'; then $(CYGPATH_W) 'cpputest.cpp'; else $(CYGPATH_W) '$(srcdir)/cpputest.cpp'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-cpputest.Tpo $(DEPDIR)/cppunittest-cpputest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='cpputest.cpp' object='cppunittest-cpputest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-cpputest.obj `if test -f 'cpputest.cpp'; then $(CYGPATH_W) 'cpputest.cpp'; else $(CYGPATH_W) '$(srcdir)/cpputest.cpp'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/cpputest.cpp b/tests/cpputest.cpp new file mode 100644 index 0000000..448dd5b --- /dev/null +++ b/tests/cpputest.cpp @@ -0,0 +1,44 @@ +/* cpputest - basic runner for unit tests + + Copyright (C) + 2012 Emilien Kia + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include + + +int main(int argc, char* argv[]) +{ + /* Get the top level suite from the registry */ + CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); + + /* Adds the test to the list of test to run */ + CppUnit::TextUi::TestRunner runner; + runner.addTest( suite ); + + /* Change the default outputter to a compiler error format outputter */ + runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), + std::cerr ) ); + /* Run the tests. */ + bool wasSucessful = runner.run(); + + /* Return error code 1 if the one of test failed. */ + return wasSucessful ? 0 : 1; +} + diff --git a/tests/example.cpp b/tests/example.cpp new file mode 100644 index 0000000..28ea52e --- /dev/null +++ b/tests/example.cpp @@ -0,0 +1,62 @@ +/* example - CppUnit unit test example + + Copyright (C) + 2012 Emilien Kia + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +#include + +class ExampleTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( ExampleTest ); + CPPUNIT_TEST( testOne ); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp(); + void tearDown(); + + void testOne(); +}; + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION( ExampleTest ); + + +void ExampleTest::setUp() +{ +} + + +void ExampleTest::tearDown() +{ +} + + +void ExampleTest::testOne() +{ + // Set up + int i = 1; + float f = 1.0; + + // Process + int cast = (int)f; + + // Check + CPPUNIT_ASSERT_EQUAL( i, cast ); +} + + diff --git a/tools/Makefile.in b/tools/Makefile.in index 70c7439..3229321 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -126,6 +126,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -229,6 +235,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/tools/nut-scanner/Makefile.in b/tools/nut-scanner/Makefile.in index 9396c58..5c91916 100644 --- a/tools/nut-scanner/Makefile.in +++ b/tools/nut-scanner/Makefile.in @@ -164,6 +164,12 @@ CFLAGS = @CFLAGS@ CONFPATH = @CONFPATH@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ @@ -267,6 +273,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/tools/nut-scanner/nut-scanner.c b/tools/nut-scanner/nut-scanner.c index b6cd221..db582be 100644 --- a/tools/nut-scanner/nut-scanner.c +++ b/tools/nut-scanner/nut-scanner.c @@ -1,6 +1,7 @@ /* nut-scanner.c: a tool to detect NUT supported devices * - * Copyright (C) 2011 - Arnaud Quette + * Copyright (C) + * 2011 - 2012 Arnaud Quette * * 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 @@ -122,16 +123,16 @@ static int printq(int quiet,const char *fmt, ...) return 0; } - va_start(ap, fmt); - ret = vprintf(fmt, ap); - va_end(ap); + va_start(ap, fmt); + ret = vprintf(fmt, ap); + va_end(ap); return ret; } int main(int argc, char *argv[]) { - nutscan_snmp_t sec; + nutscan_snmp_t snmp_sec; int opt_ret; char * cidr = NULL; int allow_all = 0; @@ -145,7 +146,7 @@ int main(int argc, char *argv[]) void (*display_func)(nutscan_device_t * device); int ret_code = EXIT_SUCCESS; - memset(&sec,0,sizeof(sec)); + memset(&snmp_sec, 0, sizeof(snmp_sec)); nutscan_init(); @@ -175,43 +176,43 @@ int main(int argc, char *argv[]) if(!nutscan_avail_snmp) { goto display_help; } - sec.community = strdup(optarg); + snmp_sec.community = strdup(optarg); break; case 'l': if(!nutscan_avail_snmp) { goto display_help; } - sec.secLevel = strdup(optarg); + snmp_sec.secLevel = strdup(optarg); break; case 'u': if(!nutscan_avail_snmp) { goto display_help; } - sec.secName = strdup(optarg); + snmp_sec.secName = strdup(optarg); break; case 'W': if(!nutscan_avail_snmp) { goto display_help; } - sec.authPassword = strdup(optarg); + snmp_sec.authPassword = strdup(optarg); break; case 'X': if(!nutscan_avail_snmp) { goto display_help; } - sec.privPassword = strdup(optarg); + snmp_sec.privPassword = strdup(optarg); break; case 'w': if(!nutscan_avail_snmp) { goto display_help; } - sec.authProtocol = strdup(optarg); + snmp_sec.authProtocol = strdup(optarg); break; case 'x': if(!nutscan_avail_snmp) { goto display_help; } - sec.privProtocol = strdup(optarg); + snmp_sec.privProtocol = strdup(optarg); break; case 'S': if(!nutscan_avail_snmp) { @@ -374,11 +375,11 @@ display_help: else { printq(quiet,"Scanning SNMP bus.\n"); #ifdef HAVE_PTHREAD - if( pthread_create(&thread[TYPE_SNMP],NULL,run_snmp,&sec)) { + if( pthread_create(&thread[TYPE_SNMP],NULL,run_snmp,&snmp_sec)) { nutscan_avail_snmp = 0; } #else - dev[TYPE_SNMP] = nutscan_scan_snmp(start_ip,end_ip,timeout,&sec); + dev[TYPE_SNMP] = nutscan_scan_snmp(start_ip,end_ip,timeout,&snmp_sec); #endif /* HAVE_PTHREAD */ } } diff --git a/tools/nut-scanner/nutscan-snmp.h b/tools/nut-scanner/nutscan-snmp.h index 069da20..eda7958 100644 --- a/tools/nut-scanner/nutscan-snmp.h +++ b/tools/nut-scanner/nutscan-snmp.h @@ -33,6 +33,9 @@ static snmp_device_id_t snmp_device_table[] = { { ".1.3.6.1.4.1.17373.3.1.1.0" , "aphel_genesisII", ".1.3.6.1.4.1.17373"}, { ".1.3.6.1.4.1.534.6.6.6.1.1.12.0" , "aphel_revelation", ".1.3.6.1.4.1.534.6.6.6"}, { ".1.3.6.1.4.1.534.6.6.7.1.2.1.2.0" , "eaton_epdu", ".1.3.6.1.4.1.534.6.6.7"}, + { "" , "pulizzi_monitored", NULL}, + { ".1.3.6.1.4.1.20677.1" , "pulizzi_switched1", ".1.3.6.1.4.1.20677.1"}, + { ".1.3.6.1.4.1.20677.1" , "pulizzi_switched2", ".1.3.6.1.4.1.20677.2"}, { "1.3.6.1.4.1.534.1.1.2.0" , "pw", ".1.3.6.1.4.1.534.1"}, { ".1.3.6.1.4.1.705.1.1.1.0" , "mge", ".1.3.6.1.4.1.705.1"}, { ".1.3.6.1.4.1.318.1.1.1.1.1.1.0" , "apcc", NULL}, diff --git a/tools/nut-scanner/nutscan-usb.h b/tools/nut-scanner/nutscan-usb.h index a20fdb7..e030c8a 100644 --- a/tools/nut-scanner/nutscan-usb.h +++ b/tools/nut-scanner/nutscan-usb.h @@ -70,6 +70,7 @@ static usb_device_id_t usb_device_table[] = { { 0x06da, 0x0004, "blazer_usb" }, { 0x06da, 0x0005, "blazer_usb" }, { 0x06da, 0x0201, "blazer_usb" }, + { 0x06da, 0x0601, "blazer_usb" }, { 0x06da, 0xffff, "usbhid-ups" }, { 0x075d, 0x0300, "usbhid-ups" }, { 0x0764, 0x0005, "usbhid-ups" }, diff --git a/tools/nut-scanner/scan_ipmi.c b/tools/nut-scanner/scan_ipmi.c index d47ee52..d650efa 100644 --- a/tools/nut-scanner/scan_ipmi.c +++ b/tools/nut-scanner/scan_ipmi.c @@ -1,6 +1,7 @@ /* scan_ipmi.c: detect NUT supported Power Supply Units * - * Copyright (C) 2011 - Arnaud Quette + * Copyright (C) + * 2011 - 2012 Arnaud Quette * * 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 @@ -35,8 +36,12 @@ static const char *dl_error = NULL; static int (*nut_ipmi_fru_parse_close_device_id) (ipmi_fru_parse_ctx_t ctx); static void (*nut_ipmi_fru_parse_ctx_destroy) (ipmi_fru_parse_ctx_t ctx); +#ifdef HAVE_FREEIPMI_11X_12X +static void (*nut_ipmi_sdr_ctx_destroy) (ipmi_sdr_ctx_t ctx); +#else /* HAVE_FREEIPMI_11X_12X */ static void (*nut_ipmi_sdr_cache_ctx_destroy) (ipmi_sdr_cache_ctx_t ctx); static void (*nut_ipmi_sdr_parse_ctx_destroy) (ipmi_sdr_parse_ctx_t ctx); +#endif /* HAVE_FREEIPMI_11X_12X */ static ipmi_fru_parse_ctx_t (*nut_ipmi_fru_parse_ctx_create) (ipmi_ctx_t ipmi_ctx); static int (*nut_ipmi_fru_parse_ctx_set_flags) (ipmi_fru_parse_ctx_t ctx, unsigned int flags); static int (*nut_ipmi_fru_parse_open_device_id) (ipmi_fru_parse_ctx_t ctx, uint8_t fru_device_id); @@ -97,6 +102,15 @@ int nutscan_load_ipmi_library() goto err; } +#ifdef HAVE_FREEIPMI_11X_12X + + *(void **) (&nut_ipmi_sdr_ctx_destroy) = lt_dlsym(dl_handle, "ipmi_sdr_ctx_destroy"); + if ((dl_error = lt_dlerror()) != NULL) { + goto err; + } + +#else /* HAVE_FREEIPMI_11X_12X */ + *(void **) (&nut_ipmi_sdr_cache_ctx_destroy) = lt_dlsym(dl_handle, "ipmi_sdr_cache_ctx_destroy"); if ((dl_error = lt_dlerror()) != NULL) { goto err; @@ -106,6 +120,7 @@ int nutscan_load_ipmi_library() if ((dl_error = lt_dlerror()) != NULL) { goto err; } +#endif /* HAVE_FREEIPMI_11X_12X */ *(void **) (&nut_ipmi_fru_parse_ctx_create) = lt_dlsym(dl_handle, "ipmi_fru_parse_ctx_create"); if ((dl_error = lt_dlerror()) != NULL) { @@ -172,15 +187,28 @@ err: /* end of dynamic link library stuff */ /* Cleanup IPMI contexts */ +#ifdef HAVE_FREEIPMI_11X_12X +static void nut_freeipmi_cleanup(ipmi_fru_parse_ctx_t fru_parse_ctx, + ipmi_sdr_ctx_t sdr_ctx) +#else /* HAVE_FREEIPMI_11X_12X */ static void nut_freeipmi_cleanup(ipmi_fru_parse_ctx_t fru_parse_ctx, ipmi_sdr_cache_ctx_t sdr_cache_ctx, ipmi_sdr_parse_ctx_t sdr_parse_ctx) +#endif /* HAVE_FREEIPMI_11X_12X */ { if (fru_parse_ctx) { (*nut_ipmi_fru_parse_close_device_id) (fru_parse_ctx); (*nut_ipmi_fru_parse_ctx_destroy) (fru_parse_ctx); } +#ifdef HAVE_FREEIPMI_11X_12X + + if (sdr_ctx) { + (*nut_ipmi_sdr_ctx_destroy) (sdr_ctx); + } + +#else /* HAVE_FREEIPMI_11X_12X */ + if (sdr_cache_ctx) { (*nut_ipmi_sdr_cache_ctx_destroy) (sdr_cache_ctx); } @@ -188,6 +216,8 @@ static void nut_freeipmi_cleanup(ipmi_fru_parse_ctx_t fru_parse_ctx, if (sdr_parse_ctx) { (*nut_ipmi_sdr_parse_ctx_destroy) (sdr_parse_ctx); } + +#endif /* HAVE_FREEIPMI_11X_12X */ } /* Return 1 if supported, 0 otherwise */ @@ -198,8 +228,12 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id) unsigned int area_length = 0; uint8_t areabuf[IPMI_FRU_PARSE_AREA_SIZE_MAX+1]; ipmi_fru_parse_ctx_t fru_parse_ctx = NULL; +#ifdef HAVE_FREEIPMI_11X_12X + ipmi_sdr_ctx_t sdr_ctx = NULL; +#else /* HAVE_FREEIPMI_11X_12X */ ipmi_sdr_cache_ctx_t sdr_cache_ctx = NULL; ipmi_sdr_parse_ctx_t sdr_parse_ctx = NULL; +#endif /* HAVE_FREEIPMI_11X_12X */ /* Parse FRU information */ if (!(fru_parse_ctx = (*nut_ipmi_fru_parse_ctx_create) (ipmi_ctx))) @@ -211,13 +245,21 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id) /* lots of motherboards calculate checksums incorrectly */ if ((*nut_ipmi_fru_parse_ctx_set_flags) (fru_parse_ctx, IPMI_FRU_PARSE_FLAGS_SKIP_CHECKSUM_CHECKS) < 0) { +#ifdef HAVE_FREEIPMI_11X_12X + nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx); +#else nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); +#endif /* HAVE_FREEIPMI_11X_12X */ return 0; } if ((*nut_ipmi_fru_parse_open_device_id) (fru_parse_ctx, ipmi_id) < 0) { +#ifdef HAVE_FREEIPMI_11X_12X + nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx); +#else nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); +#endif /* HAVE_FREEIPMI_11X_12X */ return 0; } @@ -235,7 +277,11 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id) areabuf, IPMI_FRU_PARSE_AREA_SIZE_MAX) < 0) { +#ifdef HAVE_FREEIPMI_11X_12X + nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx); +#else nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); +#endif /* HAVE_FREEIPMI_11X_12X */ return 0; } @@ -244,14 +290,22 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id) if (area_type == IPMI_FRU_PARSE_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION) { /* Found a POWER_SUPPLY record */ +#ifdef HAVE_FREEIPMI_11X_12X + nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx); +#else nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); +#endif /* HAVE_FREEIPMI_11X_12X */ return 1; } } } while ((ret = (*nut_ipmi_fru_parse_next) (fru_parse_ctx)) == 1); /* No need for further errors checking */ +#ifdef HAVE_FREEIPMI_11X_12X + nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx); +#else nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); +#endif /* HAVE_FREEIPMI_11X_12X */ return 0; } @@ -297,7 +351,7 @@ nutscan_device_t * nutscan_scan_ipmi() return NULL; } - /* Loop through all possible devices */ + /* Loop through all possible components */ for (ipmi_id = 0 ; ipmi_id <= IPMI_FRU_DEVICE_ID_MAX ; ipmi_id++) { if (is_ipmi_device_supported(ipmi_ctx, ipmi_id)) { From ce071bf6d9d6ee761a80a9687851979164588ef3 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 23:40:20 +0200 Subject: [PATCH 042/240] New upstream release --- debian/changelog | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 464e9b2..75123ce 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nut (2.6.4-3) UNRELEASED; urgency=low +nut (2.6.5-1) UNRELEASED; urgency=low [ Arnaud Quette ] * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI @@ -6,10 +6,11 @@ nut (2.6.4-3) UNRELEASED; urgency=low * debian/nut-server.install: only install USB udev rules [ Laurent Bigonville ] + * New upstream release * Follow multi-arch policy * Install systemd .service files (Closes: #679450) - -- Laurent Bigonville Sun, 12 Aug 2012 23:14:05 +0200 + -- Laurent Bigonville Sun, 12 Aug 2012 23:39:33 +0200 nut (2.6.4-2) unstable; urgency=low From b5e16725faeba13582e8f9a0bd1421b1b4a5e266 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 23:43:25 +0200 Subject: [PATCH 043/240] Drop debian/patches/0001-fix-upsmon-regression.patch, applied upstream --- debian/changelog | 3 ++- debian/patches/0001-fix-upsmon-regression.patch | 15 --------------- debian/patches/series | 1 - 3 files changed, 2 insertions(+), 17 deletions(-) delete mode 100644 debian/patches/0001-fix-upsmon-regression.patch diff --git a/debian/changelog b/debian/changelog index 75123ce..fcbef96 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,10 +7,11 @@ nut (2.6.5-1) UNRELEASED; urgency=low [ Laurent Bigonville ] * New upstream release + - Drop debian/patches/0001-fix-upsmon-regression.patch, applied upstream * Follow multi-arch policy * Install systemd .service files (Closes: #679450) - -- Laurent Bigonville Sun, 12 Aug 2012 23:39:33 +0200 + -- Laurent Bigonville Sun, 12 Aug 2012 23:43:02 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/patches/0001-fix-upsmon-regression.patch b/debian/patches/0001-fix-upsmon-regression.patch deleted file mode 100644 index aa8c13e..0000000 --- a/debian/patches/0001-fix-upsmon-regression.patch +++ /dev/null @@ -1,15 +0,0 @@ -Description: Fix upsmon/upssched regression -Origin: upstream, http://trac.networkupstools.org/projects/nut/changeset/3670 -Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679513 - -Index: /trunk/clients/upssched.c -=================================================================== ---- a/clients/upssched.c (revision 3555) -+++ b/clients/upssched.c (revision 3670) -@@ -695,5 +695,5 @@ - pconf_encode(arg2, enc, sizeof(enc))); - -- snprintfcat(enc, sizeof(enc), "%s\n", buf); -+ snprintf(enc, sizeof(enc), "%s\n", buf); - - /* see if the parent needs to be started (and maybe start it) */ diff --git a/debian/patches/series b/debian/patches/series index f80396c..2024d93 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1 @@ -0001-fix-upsmon-regression.patch 0002-nut-monitor-paths.patch From 4730afcab2ecc95e00fd4ac6f3e094bd0bbf3340 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 12 Aug 2012 23:49:47 +0200 Subject: [PATCH 044/240] Systemd units are now installed in multi-arch path --- debian/rules | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/debian/rules b/debian/rules index 42ddca7..e647ddc 100755 --- a/debian/rules +++ b/debian/rules @@ -68,13 +68,13 @@ common-install-arch:: # Install systemd files only on systems where it's supported ifeq (linux,$(DEB_HOST_ARCH_OS)) - install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-monitor.service \ + install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-monitor.service \ $(CURDIR)/debian/nut-client/lib/systemd/system/nut-monitor.service - install -D $(CURDIR)/debian/tmp/lib/systemd/system-shutdown/nutshutdown \ + install -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system-shutdown/nutshutdown \ $(CURDIR)/debian/nut-server/lib/systemd/system-shutdown/nutshutdown - install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-driver.service \ + install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-driver.service \ $(CURDIR)/debian/nut-server/lib/systemd/system/nut-driver.service - install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-server.service \ + install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-server.service \ $(CURDIR)/debian/nut-server/lib/systemd/system/nut-server.service endif From 7903ed56c27ab293b109dc534dc4a4a8d02a1c6d Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 13 Aug 2012 00:19:04 +0200 Subject: [PATCH 045/240] debian/nut-server.install: Drop newmge-shut, renamed upstream to mge-shut and install the old implementation (oldmge-shut) instead --- debian/NEWS | 6 ++++++ debian/changelog | 4 +++- debian/nut-server.install | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 debian/NEWS diff --git a/debian/NEWS b/debian/NEWS new file mode 100644 index 0000000..e42605c --- /dev/null +++ b/debian/NEWS @@ -0,0 +1,6 @@ +nut (2.6.5-1) experimental; urgency=low + + mge-shut driver has been replaced by a new implementation (newmge-shut). + In case of issue with this new version, users can revert to oldmge-shut. + + -- Laurent Bigonville Mon, 13 Aug 2012 00:32:18 +0200 diff --git a/debian/changelog b/debian/changelog index fcbef96..17ace90 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,8 +10,10 @@ nut (2.6.5-1) UNRELEASED; urgency=low - Drop debian/patches/0001-fix-upsmon-regression.patch, applied upstream * Follow multi-arch policy * Install systemd .service files (Closes: #679450) + * debian/nut-server.install: Drop newmge-shut, renamed upstream to mge-shut + and install the old implementation (oldmge-shut) instead - -- Laurent Bigonville Sun, 12 Aug 2012 23:43:02 +0200 + -- Laurent Bigonville Mon, 13 Aug 2012 00:23:00 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/nut-server.install b/debian/nut-server.install index 1c22483..ad36c03 100644 --- a/debian/nut-server.install +++ b/debian/nut-server.install @@ -26,7 +26,7 @@ debian/tmp/lib/nut/tripplite_usb debian/tmp/lib/nut/bcmxcp debian/tmp/lib/nut/bestuferrups debian/tmp/lib/nut/gamatronic -debian/tmp/lib/nut/newmge-shut +debian/tmp/lib/nut/oldmge-shut debian/tmp/lib/nut/safenet debian/tmp/lib/nut/isbmex debian/tmp/lib/nut/masterguard From b8b31887a5d31d7a8a04c4058ba56299c3664419 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 13 Aug 2012 00:58:16 +0200 Subject: [PATCH 046/240] debian/control: Drop ancient Conflicts/Provides/Replaces --- debian/changelog | 3 ++- debian/control | 14 ++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/debian/changelog b/debian/changelog index 17ace90..7356843 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,8 +12,9 @@ nut (2.6.5-1) UNRELEASED; urgency=low * Install systemd .service files (Closes: #679450) * debian/nut-server.install: Drop newmge-shut, renamed upstream to mge-shut and install the old implementation (oldmge-shut) instead + * debian/control: Drop ancient Conflicts/Provides/Replaces - -- Laurent Bigonville Mon, 13 Aug 2012 00:23:00 +0200 + -- Laurent Bigonville Mon, 13 Aug 2012 00:56:42 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/control b/debian/control index 431767f..7b6c990 100644 --- a/debian/control +++ b/debian/control @@ -41,9 +41,8 @@ Description: network UPS tools - metapackage Package: nut-server Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6), ${udev}, nut-client (= ${binary:Version}) -Suggests: nut-cgi, nut-snmp, nut-ipmi, nut-xml, nut-dev -Provides: nut-usb -Conflicts: nut-hal-drivers, nut-usb (<< 2.1.0-3), nut-dev (<< 2.2.2) +Suggests: nut-cgi, nut-snmp, nut-ipmi, nut-xml, nut-monitor +Conflicts: nut-hal-drivers Replaces: nut (<< 2.6.1-2~) Breaks: nut (<< 2.6.1-2~) Description: network UPS tools - core system @@ -60,9 +59,9 @@ Package: nut-client Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6) Provides: ups-monitor -Conflicts: ups-monitor, nut-server (<< 2.6.3-1) +Conflicts: ups-monitor Recommends: bash-completion -Replaces: nut (<< 2.6.1-2~) +Replaces: ups-monitor, nut (<< 2.6.1-2~), nut-server (<< 2.6.3-1~) Breaks: nut (<< 2.6.1-2~), nut-server (<< 2.6.3-1~) Description: network UPS tools - clients Network UPS Tools (NUT) is a client/server monitoring system that @@ -79,7 +78,6 @@ Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, adduser Recommends: apache2 | httpd-cgi Suggests: nut -Replaces: nut (<< 1.1.11) Description: network UPS tools - web interface Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and @@ -93,7 +91,6 @@ Description: network UPS tools - web interface Package: nut-snmp Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 1.4.1-pre1) -Conflicts: nut (<= 1.4.0) Description: network UPS tools - SNMP driver Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and @@ -108,7 +105,6 @@ Description: network UPS tools - SNMP driver Package: nut-ipmi Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 1.4.1-pre1) -Conflicts: nut (<= 1.4.0) Description: network UPS tools - IPMI driver Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and @@ -181,8 +177,6 @@ Package: libupsclient1-dev Section: libdevel Architecture: any Depends: libupsclient1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Provides: nut-dev -Conflicts: nut-dev (<< 2.2.2) Description: network UPS tools - development files Network UPS Tools (NUT) is a client/server monitoring system that allows computers to share uninterruptible power supply (UPS) and From 2904bfac3cc33bd7508bb91b68afebf134027b4c Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 13 Aug 2012 01:11:45 +0200 Subject: [PATCH 047/240] Install all development files under /usr --- debian/changelog | 3 ++- debian/libupsclient1-dev.dirs | 1 - debian/libupsclient1-dev.install | 5 ++--- .../0003-install-dev-files-in-usr.patch | 20 +++++++++++++++++++ debian/patches/series | 1 + debian/rules | 7 +++++-- 6 files changed, 30 insertions(+), 7 deletions(-) delete mode 100644 debian/libupsclient1-dev.dirs create mode 100644 debian/patches/0003-install-dev-files-in-usr.patch diff --git a/debian/changelog b/debian/changelog index 7356843..2f5a8ad 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,8 +13,9 @@ nut (2.6.5-1) UNRELEASED; urgency=low * debian/nut-server.install: Drop newmge-shut, renamed upstream to mge-shut and install the old implementation (oldmge-shut) instead * debian/control: Drop ancient Conflicts/Provides/Replaces + * Install all development files under /usr - -- Laurent Bigonville Mon, 13 Aug 2012 00:56:42 +0200 + -- Laurent Bigonville Mon, 13 Aug 2012 01:11:26 +0200 nut (2.6.4-2) unstable; urgency=low diff --git a/debian/libupsclient1-dev.dirs b/debian/libupsclient1-dev.dirs deleted file mode 100644 index 502167f..0000000 --- a/debian/libupsclient1-dev.dirs +++ /dev/null @@ -1 +0,0 @@ -/lib diff --git a/debian/libupsclient1-dev.install b/debian/libupsclient1-dev.install index 144903a..5b3120a 100644 --- a/debian/libupsclient1-dev.install +++ b/debian/libupsclient1-dev.install @@ -1,5 +1,4 @@ -lib/*/libupsclient.so usr/lib/*/libupsclient.so -lib/*/libupsclient.a -usr/lib/*/pkgconfig/ +usr/lib/*/libupsclient.a +usr/lib/*/pkgconfig/libupsclient.pc usr/include diff --git a/debian/patches/0003-install-dev-files-in-usr.patch b/debian/patches/0003-install-dev-files-in-usr.patch new file mode 100644 index 0000000..73ea30b --- /dev/null +++ b/debian/patches/0003-install-dev-files-in-usr.patch @@ -0,0 +1,20 @@ +Description: Adjust .pc paths to install development files to /usr +Author: Laurent Bigonville +Forwarded: not-needed + +--- a/lib/libnutscan.pc.in ++++ b/lib/libnutscan.pc.in +@@ -1,4 +1,4 @@ +-prefix=@prefix@ ++prefix=/usr + exec_prefix=@exec_prefix@ + libdir=@libdir@ + includedir=@includedir@ +--- a/lib/libupsclient.pc.in ++++ b/lib/libupsclient.pc.in +@@ -1,4 +1,4 @@ +-prefix=@prefix@ ++prefix=/usr + exec_prefix=@exec_prefix@ + libdir=@libdir@ + includedir=@includedir@ diff --git a/debian/patches/series b/debian/patches/series index 2024d93..0b2897f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1,2 @@ +0003-install-dev-files-in-usr.patch 0002-nut-monitor-paths.patch diff --git a/debian/rules b/debian/rules index e647ddc..9104960 100755 --- a/debian/rules +++ b/debian/rules @@ -62,8 +62,11 @@ common-install-arch:: mv $${f} $(CURDIR)/debian/tmp/etc/nut/$${nf}; \ done - # Create -dev symlink under /usr - ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.1.1.0 \ + # Move -dev file to /usr + mv $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/libupsclient.a \ + $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.a + rm -f $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so + ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.1 \ $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so # Install systemd files only on systems where it's supported From 3f5ae0e4fb66dc24065e4207b7ea7b3042d23b20 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 13 Aug 2012 01:59:26 +0200 Subject: [PATCH 048/240] Release to experimental --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 2f5a8ad..6152411 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nut (2.6.5-1) UNRELEASED; urgency=low +nut (2.6.5-1) experimental; urgency=low [ Arnaud Quette ] * debian/control, debian/nut-ipmi.{install,manpages}: create IPMI @@ -15,7 +15,7 @@ nut (2.6.5-1) UNRELEASED; urgency=low * debian/control: Drop ancient Conflicts/Provides/Replaces * Install all development files under /usr - -- Laurent Bigonville Mon, 13 Aug 2012 01:11:26 +0200 + -- Laurent Bigonville Mon, 13 Aug 2012 01:59:18 +0200 nut (2.6.4-2) unstable; urgency=low From 5b99c93354906e83a65b00322f3eed432c3bc574 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 13 Aug 2012 10:46:13 +0200 Subject: [PATCH 049/240] debian/control: Move the nut-monitor Suggests from nut-server to nut-client --- debian/changelog | 7 +++++++ debian/control | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 6152411..e97fa58 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nut (2.6.5-2) UNRELEASED; urgency=low + + * debian/control: Move the nut-monitor Suggests from nut-server to + nut-client + + -- Laurent Bigonville Mon, 13 Aug 2012 10:45:03 +0200 + nut (2.6.5-1) experimental; urgency=low [ Arnaud Quette ] diff --git a/debian/control b/debian/control index 7b6c990..71ce684 100644 --- a/debian/control +++ b/debian/control @@ -41,7 +41,7 @@ Description: network UPS tools - metapackage Package: nut-server Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6), ${udev}, nut-client (= ${binary:Version}) -Suggests: nut-cgi, nut-snmp, nut-ipmi, nut-xml, nut-monitor +Suggests: nut-cgi, nut-snmp, nut-ipmi, nut-xml Conflicts: nut-hal-drivers Replaces: nut (<< 2.6.1-2~) Breaks: nut (<< 2.6.1-2~) @@ -61,6 +61,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6) Provides: ups-monitor Conflicts: ups-monitor Recommends: bash-completion +Suggests: nut-monitor Replaces: ups-monitor, nut (<< 2.6.1-2~), nut-server (<< 2.6.3-1~) Breaks: nut (<< 2.6.1-2~), nut-server (<< 2.6.3-1~) Description: network UPS tools - clients From c79bcd71af2285eec15c642fa66dbc13b876dead Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 9 Oct 2012 23:38:43 +0200 Subject: [PATCH 050/240] Restore proper SELinux context for runtime created /var/run/nut directory --- debian/changelog | 3 ++- debian/nut-client.init | 3 ++- debian/nut-client.postinst | 1 + debian/nut-server.init | 3 ++- debian/nut-server.postinst | 1 + 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index e97fa58..1651395 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,8 +2,9 @@ nut (2.6.5-2) UNRELEASED; urgency=low * debian/control: Move the nut-monitor Suggests from nut-server to nut-client + * Restore proper SELinux context for runtime created /var/run/nut directory - -- Laurent Bigonville Mon, 13 Aug 2012 10:45:03 +0200 + -- Laurent Bigonville Tue, 09 Oct 2012 23:38:10 +0200 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/nut-client.init b/debian/nut-client.init index 8524dd2..15a9f75 100755 --- a/debian/nut-client.init +++ b/debian/nut-client.init @@ -54,7 +54,8 @@ fi check_var_directory() { [ ! -d ${pid_dir} ] && mkdir -p ${pid_dir} \ && chown root:nut ${pid_dir} \ - && chmod 770 ${pid_dir} + && chmod 770 ${pid_dir} \ + && [ -x /sbin/restorecon ] && /sbin/restorecon ${pid_dir} } # check if the right components are running diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index 8546a95..5f61e55 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -36,6 +36,7 @@ case "$1" in if [ -d /var/run/nut ] ; then chown root:nut /var/run/nut chmod 770 /var/run/nut + [ -x /sbin/restorecon ] && /sbin/restorecon /var/run/nut fi ;; diff --git a/debian/nut-server.init b/debian/nut-server.init index a606b72..c539bd5 100644 --- a/debian/nut-server.init +++ b/debian/nut-server.init @@ -52,7 +52,8 @@ fi check_var_directory() { [ ! -d ${pid_dir} ] && mkdir -p ${pid_dir} \ && chown root:nut ${pid_dir} \ - && chmod 770 ${pid_dir} + && chmod 770 ${pid_dir} \ + && [ -x /sbin/restorecon ] && /sbin/restorecon ${pid_dir} } # check if the right components are running diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index d0ec14b..8523527 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -36,6 +36,7 @@ case "$1" in if [ -d /var/run/nut ] ; then chown root:nut /var/run/nut chmod 770 /var/run/nut + [ -x /sbin/restorecon ] && /sbin/restorecon /var/run/nut fi # make sure that /var/lib/nut has the correct permissions and ownerships From 6bfb45a6bc019c1124fd3644af453597d76e0ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 27 Nov 2012 08:34:19 +0100 Subject: [PATCH 051/240] Debian release 2.6.4-2.1 --- debian/changelog | 8 ++++++++ debian/nut-client.preinst | 14 ++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 debian/nut-client.preinst diff --git a/debian/changelog b/debian/changelog index a603e8c..88b850b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +nut (2.6.4-2.1) unstable; urgency=low + + * Non-maintainer upload. + * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older + versions of the postinst (Closes: #677054) + + -- Sébastien Villemot Mon, 26 Nov 2012 21:09:33 +0100 + nut (2.6.4-2) unstable; urgency=low * debian/rules: Stop the nut-client before nut-server on systems using static diff --git a/debian/nut-client.preinst b/debian/nut-client.preinst new file mode 100644 index 0000000..2107da1 --- /dev/null +++ b/debian/nut-client.preinst @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +# Revert /etc/nut/nut.conf mangling done by older versions of the postinst +# See #677054 +if [ "$1" = "install" -o "$1" = "upgrade" ] \ + && dpkg --compare-versions "$2" lt "2.6.4-2" \ + && [ -f /etc/nut/nut.conf ] \ + && [ "`md5sum /etc/nut/nut.conf | cut -d ' ' -f 1`" = f9b571ae65952e3a761fac2202633478 ]; then + sed -i 's/^MODE=none$/MODE = none/' /etc/nut/nut.conf +fi + +#DEBHELPER# From a80da4998d7254857d1d01d8fdd8bcfbf1ff68ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 27 Nov 2012 08:34:19 +0100 Subject: [PATCH 052/240] debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older versions of the postinst (Closes: #677054) --- debian/changelog | 5 +++++ debian/nut-client.preinst | 14 ++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 debian/nut-client.preinst diff --git a/debian/changelog b/debian/changelog index 1651395..46f7e6b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,14 @@ nut (2.6.5-2) UNRELEASED; urgency=low + [ Laurent Bigonville ] * debian/control: Move the nut-monitor Suggests from nut-server to nut-client * Restore proper SELinux context for runtime created /var/run/nut directory + [ Sébastien Villemot ] + * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older + versions of the postinst (Closes: #677054) + -- Laurent Bigonville Tue, 09 Oct 2012 23:38:10 +0200 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/nut-client.preinst b/debian/nut-client.preinst new file mode 100644 index 0000000..2107da1 --- /dev/null +++ b/debian/nut-client.preinst @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +# Revert /etc/nut/nut.conf mangling done by older versions of the postinst +# See #677054 +if [ "$1" = "install" -o "$1" = "upgrade" ] \ + && dpkg --compare-versions "$2" lt "2.6.4-2" \ + && [ -f /etc/nut/nut.conf ] \ + && [ "`md5sum /etc/nut/nut.conf | cut -d ' ' -f 1`" = f9b571ae65952e3a761fac2202633478 ]; then + sed -i 's/^MODE=none$/MODE = none/' /etc/nut/nut.conf +fi + +#DEBHELPER# From caf09b3d5850a2f36fff35c5948d7ccaeb4fb14c Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 2 Dec 2012 13:08:38 +0100 Subject: [PATCH 053/240] debian/control: Fix typo in package description --- debian/changelog | 3 ++- debian/control | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 46f7e6b..a4d1a60 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,12 +4,13 @@ nut (2.6.5-2) UNRELEASED; urgency=low * debian/control: Move the nut-monitor Suggests from nut-server to nut-client * Restore proper SELinux context for runtime created /var/run/nut directory + * debian/control: Fix typo in package description [ Sébastien Villemot ] * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older versions of the postinst (Closes: #677054) - -- Laurent Bigonville Tue, 09 Oct 2012 23:38:10 +0200 + -- Laurent Bigonville Sun, 02 Dec 2012 13:07:51 +0100 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/control b/debian/control index 71ce684..81b21f6 100644 --- a/debian/control +++ b/debian/control @@ -35,7 +35,7 @@ Description: network UPS tools - metapackage through the server, and are notified whenever the power status changes. . - This package is a metapackage that install both nut-server and nut-client, + This package is a metapackage that installs both nut-server and nut-client, in most cases it is sufficient for a basic UPS monitoring system. Package: nut-server From 68adcbdb659141fcf9118f787922482be2ceadc5 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 2 Dec 2012 13:48:57 +0100 Subject: [PATCH 054/240] debian/watch: Update watch file URL (Thanks to Bart Martens) --- debian/changelog | 3 ++- debian/watch | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index a4d1a60..72f7176 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,12 +5,13 @@ nut (2.6.5-2) UNRELEASED; urgency=low nut-client * Restore proper SELinux context for runtime created /var/run/nut directory * debian/control: Fix typo in package description + * debian/watch: Update watch file URL (Thanks to Bart Martens) [ Sébastien Villemot ] * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older versions of the postinst (Closes: #677054) - -- Laurent Bigonville Sun, 02 Dec 2012 13:07:51 +0100 + -- Laurent Bigonville Sun, 02 Dec 2012 13:48:20 +0100 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/watch b/debian/watch index fd44637..606e460 100644 --- a/debian/watch +++ b/debian/watch @@ -1,2 +1,2 @@ version=3 -http://www.networkupstools.org/source/([0-9.]+)/nut-(.*)\.tar\.gz +http://www.networkupstools.org/download.html .*/nut-(.*)\.tar\.(?:gz|bz2|xz) From d8a36de1df036ef621c78d9753afaf5790b9e515 Mon Sep 17 00:00:00 2001 From: Ivo De Decker Date: Thu, 20 Dec 2012 20:40:01 +0100 Subject: [PATCH 055/240] Imported Debian patch 2.6.4-2.2 --- debian/changelog | 13 +++++++++++++ debian/control | 2 +- debian/nut-client.postinst | 29 +++++++++++++++++++++-------- debian/nut-server.postinst | 28 ++++++++++++++++++---------- 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/debian/changelog b/debian/changelog index 88b850b..b320316 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +nut (2.6.4-2.2) unstable; urgency=low + + * Non-maintainer upload with fixes for wheezy. + * Only remove /etc/init.d/nut from previous versions of nut in nut-server + postinst if there are no local changes. + * Also remove /etc/init.d/nut in nut-client postinst. Thanks to + Laurent Bigonville for the hint. + * Only fix permissions of configfiles on first install. + * debian/control: Fix typo in package description. Thanks to Julien Cristau + for spotting this. + + -- Ivo De Decker Thu, 20 Dec 2012 20:40:01 +0100 + nut (2.6.4-2.1) unstable; urgency=low * Non-maintainer upload. diff --git a/debian/control b/debian/control index e3db9c0..63e772e 100644 --- a/debian/control +++ b/debian/control @@ -33,7 +33,7 @@ Description: network UPS tools - metapackage through the server, and are notified whenever the power status changes. . - This package is a metapackage that install both nut-server and nut-client, + This package is a metapackage that installs both nut-server and nut-client, in most cases it is sufficient for a basic UPS monitoring system. Package: nut-server diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index 8546a95..869752e 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -19,15 +19,18 @@ case "$1" in # fi # make sure that conffiles are secured and have the correct ownerships - if [ -d /etc/nut/ ] ; then - chown root:nut /etc/nut/ - fi - for file in nut.conf upsmon.conf upssched.conf ; do - if [ -f /etc/nut/$file ] ; then - chown root:nut /etc/nut/$file - chmod 640 /etc/nut/$file + # on first install + if [ -z "$2" ] ; then + if [ -d /etc/nut/ ] ; then + chown root:nut /etc/nut/ fi - done + for file in nut.conf upsmon.conf upssched.conf ; do + if [ -f /etc/nut/$file ] ; then + chown root:nut /etc/nut/$file + chmod 640 /etc/nut/$file + fi + done + fi # make sure that /var/run/nut exists and has the correct ownerships if [ ! -d /var/run/nut ] ; then @@ -37,6 +40,16 @@ case "$1" in chown root:nut /var/run/nut chmod 770 /var/run/nut fi + + if dpkg --compare-versions "$2" le "2.6.4-2~" && + [ -f /etc/init.d/nut ] ; then + if [ "`md5sum /etc/init.d/nut | cut -d ' ' -f 1`" = 72f1dbc6b92cb4407f26605d05b12681 ]; then + rm -f /etc/init.d/nut + else + mv /etc/init.d/nut /etc/init.d/nut.dpkg-old + fi + update-rc.d nut remove >/dev/null + fi ;; abort-upgrade) diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index d0ec14b..45a3a44 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -19,15 +19,18 @@ case "$1" in # fi # make sure that conffiles are secured and have the correct ownerships - if [ -d /etc/nut/ ] ; then - chown root:nut /etc/nut/ - fi - for file in ups.conf upsd.conf upsd.users ; do - if [ -f /etc/nut/$file ] ; then - chown root:nut /etc/nut/$file - chmod 640 /etc/nut/$file + # on first install + if [ -z "$2" ] ; then + if [ -d /etc/nut/ ] ; then + chown root:nut /etc/nut/ fi - done + for file in ups.conf upsd.conf upsd.users ; do + if [ -f /etc/nut/$file ] ; then + chown root:nut /etc/nut/$file + chmod 640 /etc/nut/$file + fi + done + fi # make sure that /var/run/nut exists and has the correct ownerships if [ ! -d /var/run/nut ] ; then @@ -50,8 +53,13 @@ case "$1" in # 557178 udevadm trigger --subsystem-match=usb - if dpkg --compare-versions "$2" le "2.6.4-2~" ; then - rm -f /etc/init.d/nut + if dpkg --compare-versions "$2" le "2.6.4-2~" && + [ -f /etc/init.d/nut ] ; then + if [ "`md5sum /etc/init.d/nut | cut -d ' ' -f 1`" = 72f1dbc6b92cb4407f26605d05b12681 ]; then + rm -f /etc/init.d/nut + else + mv /etc/init.d/nut /etc/init.d/nut.dpkg-old + fi update-rc.d nut remove >/dev/null fi ;; From d54dd5484020cb893751942c476b90fdfad7f6f4 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 13 Jan 2013 17:31:58 +0100 Subject: [PATCH 056/240] Only fix permissions of configfiles on first install. --- debian/changelog | 5 ++++- debian/nut-client.postinst | 19 +++++++++++-------- debian/nut-server.postinst | 19 +++++++++++-------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/debian/changelog b/debian/changelog index 72f7176..eaf9c73 100644 --- a/debian/changelog +++ b/debian/changelog @@ -11,7 +11,10 @@ nut (2.6.5-2) UNRELEASED; urgency=low * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older versions of the postinst (Closes: #677054) - -- Laurent Bigonville Sun, 02 Dec 2012 13:48:20 +0100 + [ Ivo De Decker ] + * Only fix permissions of configfiles on first install. + + -- Laurent Bigonville Sun, 13 Jan 2013 17:31:15 +0100 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index 5f61e55..e4743f5 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -19,15 +19,18 @@ case "$1" in # fi # make sure that conffiles are secured and have the correct ownerships - if [ -d /etc/nut/ ] ; then - chown root:nut /etc/nut/ - fi - for file in nut.conf upsmon.conf upssched.conf ; do - if [ -f /etc/nut/$file ] ; then - chown root:nut /etc/nut/$file - chmod 640 /etc/nut/$file + # on first install + if [ -z "$2" ] ; then + if [ -d /etc/nut/ ] ; then + chown root:nut /etc/nut/ fi - done + for file in nut.conf upsmon.conf upssched.conf ; do + if [ -f /etc/nut/$file ] ; then + chown root:nut /etc/nut/$file + chmod 640 /etc/nut/$file + fi + done + fi # make sure that /var/run/nut exists and has the correct ownerships if [ ! -d /var/run/nut ] ; then diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 8523527..0c653da 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -19,15 +19,18 @@ case "$1" in # fi # make sure that conffiles are secured and have the correct ownerships - if [ -d /etc/nut/ ] ; then - chown root:nut /etc/nut/ - fi - for file in ups.conf upsd.conf upsd.users ; do - if [ -f /etc/nut/$file ] ; then - chown root:nut /etc/nut/$file - chmod 640 /etc/nut/$file + # on first install + if [ -z "$2" ] ; then + if [ -d /etc/nut/ ] ; then + chown root:nut /etc/nut/ fi - done + for file in ups.conf upsd.conf upsd.users ; do + if [ -f /etc/nut/$file ] ; then + chown root:nut /etc/nut/$file + chmod 640 /etc/nut/$file + fi + done + fi # make sure that /var/run/nut exists and has the correct ownerships if [ ! -d /var/run/nut ] ; then From 715368e54fdb4a4ccdc2e155a918eae23c479e45 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 13 Jan 2013 17:36:52 +0100 Subject: [PATCH 057/240] Only remove /etc/init.d/nut from previous versions of nut in nut-server postinst if there are no local changes. * Only remove /etc/init.d/nut from previous versions of nut in nut-server postinst if there are no local changes. * Also remove /etc/init.d/nut in nut-client postinst. Thanks to Laurent Bigonville for the hint. --- debian/changelog | 6 +++++- debian/nut-client.postinst | 10 ++++++++++ debian/nut-server.postinst | 9 +++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index eaf9c73..35237fa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,8 +13,12 @@ nut (2.6.5-2) UNRELEASED; urgency=low [ Ivo De Decker ] * Only fix permissions of configfiles on first install. + * Only remove /etc/init.d/nut from previous versions of nut in nut-server + postinst if there are no local changes. + * Also remove /etc/init.d/nut in nut-client postinst. Thanks to + Laurent Bigonville for the hint. - -- Laurent Bigonville Sun, 13 Jan 2013 17:31:15 +0100 + -- Laurent Bigonville Sun, 13 Jan 2013 17:36:13 +0100 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index e4743f5..bac6721 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -41,6 +41,16 @@ case "$1" in chmod 770 /var/run/nut [ -x /sbin/restorecon ] && /sbin/restorecon /var/run/nut fi + + if dpkg --compare-versions "$2" le "2.6.4-2~" && + [ -f /etc/init.d/nut ] ; then + if [ "`md5sum /etc/init.d/nut | cut -d ' ' -f 1`" = 72f1dbc6b92cb4407f26605d05b12681 ]; then + rm -f /etc/init.d/nut + else + mv /etc/init.d/nut /etc/init.d/nut.dpkg-old + fi + update-rc.d nut remove >/dev/null + fi ;; abort-upgrade) diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 0c653da..4a718aa 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -54,8 +54,13 @@ case "$1" in # 557178 udevadm trigger --subsystem-match=usb - if dpkg --compare-versions "$2" le "2.6.4-2~" ; then - rm -f /etc/init.d/nut + if dpkg --compare-versions "$2" le "2.6.4-2~" && + [ -f /etc/init.d/nut ] ; then + if [ "`md5sum /etc/init.d/nut | cut -d ' ' -f 1`" = 72f1dbc6b92cb4407f26605d05b12681 ]; then + rm -f /etc/init.d/nut + else + mv /etc/init.d/nut /etc/init.d/nut.dpkg-old + fi update-rc.d nut remove >/dev/null fi ;; From 853f3503ce848548eb092ee904db5208b1e570a8 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Fri, 25 Jan 2013 23:17:36 +0100 Subject: [PATCH 058/240] debian/rules: Alias systemd nut-monitor service file to nut-client to prevent it from running twice --- debian/changelog | 4 +++- debian/rules | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 35237fa..b7eeeaa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,8 @@ nut (2.6.5-2) UNRELEASED; urgency=low * Restore proper SELinux context for runtime created /var/run/nut directory * debian/control: Fix typo in package description * debian/watch: Update watch file URL (Thanks to Bart Martens) + * debian/rules: Alias systemd nut-monitor service file to nut-client to + prevent it from running twice [ Sébastien Villemot ] * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older @@ -18,7 +20,7 @@ nut (2.6.5-2) UNRELEASED; urgency=low * Also remove /etc/init.d/nut in nut-client postinst. Thanks to Laurent Bigonville for the hint. - -- Laurent Bigonville Sun, 13 Jan 2013 17:36:13 +0100 + -- Laurent Bigonville Fri, 25 Jan 2013 23:13:51 +0100 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/rules b/debian/rules index 9104960..2d6ca9e 100755 --- a/debian/rules +++ b/debian/rules @@ -79,6 +79,11 @@ ifeq (linux,$(DEB_HOST_ARCH_OS)) $(CURDIR)/debian/nut-server/lib/systemd/system/nut-driver.service install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-server.service \ $(CURDIR)/debian/nut-server/lib/systemd/system/nut-server.service + + # This is needed to avoid services to be started twice (systemd and LSB) + mkdir -p $(CURDIR)/debian/nut-client/etc/systemd/system/ + ln -s /lib/systemd/system/nut-monitor.service \ + $(CURDIR)/debian/nut-client/etc/systemd/system/nut-client.service endif common-install-indep:: From 440624271f734ef498809db10ae7896cd61d5b42 Mon Sep 17 00:00:00 2001 From: Ivo De Decker Date: Sat, 26 Jan 2013 20:09:48 +0100 Subject: [PATCH 059/240] Imported Debian patch 2.6.4-2.3 --- debian/changelog | 9 +++++++++ debian/nut-client.preinst | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/debian/changelog b/debian/changelog index b320316..e7b612b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +nut (2.6.4-2.3) unstable; urgency=low + + * Non-maintainer upload with fixes for wheezy. + * debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done + by postinst during upgrade from lenny to squeeze (Really closes: #677054) + Thanks to Andreas Beckmann for the review. + + -- Ivo De Decker Sat, 26 Jan 2013 20:09:48 +0100 + nut (2.6.4-2.2) unstable; urgency=low * Non-maintainer upload with fixes for wheezy. diff --git a/debian/nut-client.preinst b/debian/nut-client.preinst index 2107da1..53134e3 100644 --- a/debian/nut-client.preinst +++ b/debian/nut-client.preinst @@ -4,6 +4,15 @@ set -e # Revert /etc/nut/nut.conf mangling done by older versions of the postinst # See #677054 +# changed configfile created by a fresh install in lenny, upgraded to squeeze +if [ "$1" = "install" -o "$1" = "upgrade" ] \ + && dpkg --compare-versions "$2" lt "2.6.4-2" \ + && [ -f /etc/nut/nut.conf ] \ + && [ "`md5sum /etc/nut/nut.conf | cut -d ' ' -f 1`" = 331cca39153f451c2968f4b734c1cf3f ]; then + sed -i '29,$ d' /etc/nut/nut.conf +fi + +# changed configfile created by a fresh install in squeeze if [ "$1" = "install" -o "$1" = "upgrade" ] \ && dpkg --compare-versions "$2" lt "2.6.4-2" \ && [ -f /etc/nut/nut.conf ] \ From 47044fe3b0fdc06b89c806eb2765f66a17d63ff0 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 26 Jan 2013 00:19:45 +0100 Subject: [PATCH 060/240] d/p/0004-fix-systemd-service.patch: Fix systemd service file for Debian --- debian/changelog | 3 +- debian/patches/0004-fix-systemd-service.patch | 28 +++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 debian/patches/0004-fix-systemd-service.patch diff --git a/debian/changelog b/debian/changelog index b7eeeaa..1864def 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,7 @@ nut (2.6.5-2) UNRELEASED; urgency=low * debian/watch: Update watch file URL (Thanks to Bart Martens) * debian/rules: Alias systemd nut-monitor service file to nut-client to prevent it from running twice + * d/p/0004-fix-systemd-service.patch: Fix systemd service file for Debian [ Sébastien Villemot ] * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older @@ -20,7 +21,7 @@ nut (2.6.5-2) UNRELEASED; urgency=low * Also remove /etc/init.d/nut in nut-client postinst. Thanks to Laurent Bigonville for the hint. - -- Laurent Bigonville Fri, 25 Jan 2013 23:13:51 +0100 + -- Laurent Bigonville Sat, 26 Jan 2013 00:15:43 +0100 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/patches/0004-fix-systemd-service.patch b/debian/patches/0004-fix-systemd-service.patch new file mode 100644 index 0000000..9465687 --- /dev/null +++ b/debian/patches/0004-fix-systemd-service.patch @@ -0,0 +1,28 @@ +Subject: Fix systemd service file for Debian +From: Laurent Bigonville +Forwarded: not-needed + +--- a/scripts/systemd/nut-driver.service.in ++++ b/scripts/systemd/nut-driver.service.in +@@ -1,10 +1,11 @@ + [Unit] + Description=Network UPS Tools - power device driver controller +-After=local-fs.target network.target ++After=local-fs.target network.target udev-settle.service ++Wants=udev-settle.service + StopWhenUnneeded=yes + + [Service] +-ExecStart=@driverexecdir@/upsdrvctl start +-ExecStop=@driverexecdir@/upsdrvctl stop ++ExecStart=@SBINDIR@/upsdrvctl start ++ExecStop=@SBINDIR@/upsdrvctl stop + Type=forking + +--- a/scripts/systemd/nut-monitor.service.in ++++ b/scripts/systemd/nut-monitor.service.in +@@ -9,3 +9,4 @@ Type=forking + + [Install] + WantedBy=multi-user.target ++Alias=nut-client.service diff --git a/debian/patches/series b/debian/patches/series index 0b2897f..540178d 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,3 @@ 0003-install-dev-files-in-usr.patch 0002-nut-monitor-paths.patch +0004-fix-systemd-service.patch From 11b7980da62ca4326d14cc3c1e461fe76cdc7486 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 26 Jan 2013 01:01:44 +0100 Subject: [PATCH 061/240] Install tmpfiles conf files to create /run/nut directory during boot --- debian/changelog | 3 ++- debian/nut-client.tmpfiles | 1 + debian/nut-server.tmpfiles | 1 + debian/rules | 6 ++++++ 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 debian/nut-client.tmpfiles create mode 100644 debian/nut-server.tmpfiles diff --git a/debian/changelog b/debian/changelog index 1864def..7fbb256 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,6 +9,7 @@ nut (2.6.5-2) UNRELEASED; urgency=low * debian/rules: Alias systemd nut-monitor service file to nut-client to prevent it from running twice * d/p/0004-fix-systemd-service.patch: Fix systemd service file for Debian + * Install tmpfiles conf files to create /run/nut directory during boot [ Sébastien Villemot ] * debian/nut-client.preinst: revert /etc/nut/nut.conf mangling done by older @@ -21,7 +22,7 @@ nut (2.6.5-2) UNRELEASED; urgency=low * Also remove /etc/init.d/nut in nut-client postinst. Thanks to Laurent Bigonville for the hint. - -- Laurent Bigonville Sat, 26 Jan 2013 00:15:43 +0100 + -- Laurent Bigonville Sat, 26 Jan 2013 00:59:10 +0100 nut (2.6.5-1) experimental; urgency=low diff --git a/debian/nut-client.tmpfiles b/debian/nut-client.tmpfiles new file mode 100644 index 0000000..bf195cf --- /dev/null +++ b/debian/nut-client.tmpfiles @@ -0,0 +1 @@ +d /run/nut 0770 root nut - - diff --git a/debian/nut-server.tmpfiles b/debian/nut-server.tmpfiles new file mode 100644 index 0000000..bf195cf --- /dev/null +++ b/debian/nut-server.tmpfiles @@ -0,0 +1 @@ +d /run/nut 0770 root nut - - diff --git a/debian/rules b/debian/rules index 2d6ca9e..425a353 100755 --- a/debian/rules +++ b/debian/rules @@ -80,6 +80,12 @@ ifeq (linux,$(DEB_HOST_ARCH_OS)) install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-server.service \ $(CURDIR)/debian/nut-server/lib/systemd/system/nut-server.service + # Install tmpfiles config file to create /run/nut directory + install -m 644 -D $(CURDIR)/debian/nut-client.tmpfiles \ + $(CURDIR)/debian/nut-client/usr/lib/tmpfiles.d/nut-client.conf + install -m 644 -D $(CURDIR)/debian/nut-server.tmpfiles \ + $(CURDIR)/debian/nut-server/usr/lib/tmpfiles.d/nut-server.conf + # This is needed to avoid services to be started twice (systemd and LSB) mkdir -p $(CURDIR)/debian/nut-client/etc/systemd/system/ ln -s /lib/systemd/system/nut-monitor.service \ From 2f87baa5a4330ede008dda35e8dfdaad05ed8c12 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 26 Jan 2013 01:12:41 +0100 Subject: [PATCH 062/240] Do not hardcode full path to restorecon Use which command to detect if the executable is present or not --- debian/nut-client.postinst | 4 +++- debian/nut-server.postinst | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index bac6721..4b04850 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -39,7 +39,9 @@ case "$1" in if [ -d /var/run/nut ] ; then chown root:nut /var/run/nut chmod 770 /var/run/nut - [ -x /sbin/restorecon ] && /sbin/restorecon /var/run/nut + if which restorecon >/dev/null 2>&1; then + restorecon /var/run/nut + fi fi if dpkg --compare-versions "$2" le "2.6.4-2~" && diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 4a718aa..3322126 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -39,7 +39,9 @@ case "$1" in if [ -d /var/run/nut ] ; then chown root:nut /var/run/nut chmod 770 /var/run/nut - [ -x /sbin/restorecon ] && /sbin/restorecon /var/run/nut + if which restorecon >/dev/null 2>&1; then + restorecon /var/run/nut + fi fi # make sure that /var/lib/nut has the correct permissions and ownerships From e8e497bcf43557ff8936587baab97a935f066c83 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 31 Jan 2013 21:51:37 +0100 Subject: [PATCH 063/240] Release to experimental --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 7fbb256..91f6766 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nut (2.6.5-2) UNRELEASED; urgency=low +nut (2.6.5-2) experimental; urgency=low [ Laurent Bigonville ] * debian/control: Move the nut-monitor Suggests from nut-server to @@ -22,7 +22,7 @@ nut (2.6.5-2) UNRELEASED; urgency=low * Also remove /etc/init.d/nut in nut-client postinst. Thanks to Laurent Bigonville for the hint. - -- Laurent Bigonville Sat, 26 Jan 2013 00:59:10 +0100 + -- Laurent Bigonville Thu, 31 Jan 2013 21:51:31 +0100 nut (2.6.5-1) experimental; urgency=low From 623a7f2f699fa33ad150b9230fbe7a0f4c8aaf1a Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 14 May 2013 18:04:58 +0200 Subject: [PATCH 064/240] Move libupsclient1 package to libs Section * debian/control: - Move libupsclient1 package to libs Section --- debian/changelog | 7 +++++++ debian/control | 1 + 2 files changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 91f6766..01c2e19 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nut (2.6.5-3) UNRELEASED; urgency=low + + * debian/control: + - Move libupsclient1 package to libs Section + + -- Laurent Bigonville Tue, 14 May 2013 18:04:04 +0200 + nut (2.6.5-2) experimental; urgency=low [ Laurent Bigonville ] diff --git a/debian/control b/debian/control index 81b21f6..097a738 100644 --- a/debian/control +++ b/debian/control @@ -161,6 +161,7 @@ Description: network UPS tools - documentation This package contains FAQ, user, developer and packager documentation. Package: libupsclient1 +Section: libs Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Pre-Depends: ${misc:Pre-Depends} From 8e1c6bce0dd9d6fbac2d3c147c89c3f6c7c10ccf Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 14 May 2013 18:13:57 +0200 Subject: [PATCH 065/240] Add libgd-dev to the Build-Depends, keep the other alternatives to ease the backports --- debian/changelog | 2 ++ debian/control | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 01c2e19..0bb09b5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,8 @@ nut (2.6.5-3) UNRELEASED; urgency=low * debian/control: - Move libupsclient1 package to libs Section + - Add libgd-dev to the Build-Depends, keep the other alternatives to ease + the backports -- Laurent Bigonville Tue, 14 May 2013 18:04:04 +0200 diff --git a/debian/control b/debian/control index 097a738..0c84526 100644 --- a/debian/control +++ b/debian/control @@ -5,7 +5,7 @@ Maintainer: Arnaud Quette Uploaders: Laurent Bigonville Build-Depends: debhelper (>= 8.1.3), cdbs (>= 0.4.93~), - libgd2-xpm-dev | libgd2-noxpm-dev, + libgd-dev | libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, libusb-dev (>= 0.1.8), libneon27-gnutls-dev | libneon27-dev, From fc374550b2985c8eb8b398ddd6bb04e4b498233a Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 18 Jun 2013 10:33:13 +0200 Subject: [PATCH 066/240] Bump Standards-Version to 3.9.4 (no further changes) --- debian/changelog | 1 + debian/control | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 0bb09b5..dfd730e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,7 @@ nut (2.6.5-3) UNRELEASED; urgency=low - Move libupsclient1 package to libs Section - Add libgd-dev to the Build-Depends, keep the other alternatives to ease the backports + - Bump Standards-Version to 3.9.4 (no further changes) -- Laurent Bigonville Tue, 14 May 2013 18:04:04 +0200 diff --git a/debian/control b/debian/control index 0c84526..5107a95 100644 --- a/debian/control +++ b/debian/control @@ -18,7 +18,7 @@ Build-Depends-Indep: asciidoc (>= 8.6.3), docbook-xsl, dblatex (>= 0.2.5), libxml2-utils -Standards-Version: 3.9.3 +Standards-Version: 3.9.4 Homepage: http://www.networkupstools.org/ Vcs-Browser: http://git.debian.org/?p=collab-maint/nut.git;a=summary Vcs-Git: git://git.debian.org/git/collab-maint/nut.git From d5939980c129647e6e7d7c528247a771ab8abaf0 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 18 Jun 2013 10:35:08 +0200 Subject: [PATCH 067/240] Add autotools-dev to the build-dependencies so config.{guess,sub} are getting updated during build --- debian/changelog | 2 ++ debian/control | 1 + 2 files changed, 3 insertions(+) diff --git a/debian/changelog b/debian/changelog index dfd730e..77cf6ca 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,8 @@ nut (2.6.5-3) UNRELEASED; urgency=low - Add libgd-dev to the Build-Depends, keep the other alternatives to ease the backports - Bump Standards-Version to 3.9.4 (no further changes) + - Add autotools-dev to the build-dependencies so config.{guess,sub} are + getting updated during build -- Laurent Bigonville Tue, 14 May 2013 18:04:04 +0200 diff --git a/debian/control b/debian/control index 5107a95..7fd2128 100644 --- a/debian/control +++ b/debian/control @@ -5,6 +5,7 @@ Maintainer: Arnaud Quette Uploaders: Laurent Bigonville Build-Depends: debhelper (>= 8.1.3), cdbs (>= 0.4.93~), + autotools-dev, libgd-dev | libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, libusb-dev (>= 0.1.8), From c51fe5965ab7fb49e047995b4548df24df80d41d Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 18 Jun 2013 10:36:07 +0200 Subject: [PATCH 068/240] Use canonical URL for the VCS-* fields --- debian/changelog | 1 + debian/control | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 77cf6ca..4d5c627 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,6 +7,7 @@ nut (2.6.5-3) UNRELEASED; urgency=low - Bump Standards-Version to 3.9.4 (no further changes) - Add autotools-dev to the build-dependencies so config.{guess,sub} are getting updated during build + - Use canonical URL for the VCS-* fields -- Laurent Bigonville Tue, 14 May 2013 18:04:04 +0200 diff --git a/debian/control b/debian/control index 7fd2128..475f3eb 100644 --- a/debian/control +++ b/debian/control @@ -21,8 +21,8 @@ Build-Depends-Indep: asciidoc (>= 8.6.3), libxml2-utils Standards-Version: 3.9.4 Homepage: http://www.networkupstools.org/ -Vcs-Browser: http://git.debian.org/?p=collab-maint/nut.git;a=summary -Vcs-Git: git://git.debian.org/git/collab-maint/nut.git +Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/nut.git;a=summary +Vcs-Git: git://anonscm.debian.org/collab-maint/nut.git X-Python-Version: >= 2.5 Package: nut From cc689212ad818533def33a61693d7a22040f444f Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 18 Jun 2013 21:21:00 +0200 Subject: [PATCH 069/240] debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done by postinst during upgrade from lenny to squeeze (Really closes: #677054) Thanks to Andreas Beckmann for the review. --- debian/changelog | 6 ++++++ debian/nut-client.preinst | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index 4d5c627..8f3daf2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,6 @@ nut (2.6.5-3) UNRELEASED; urgency=low + [ Laurent Bigonville ] * debian/control: - Move libupsclient1 package to libs Section - Add libgd-dev to the Build-Depends, keep the other alternatives to ease @@ -9,6 +10,11 @@ nut (2.6.5-3) UNRELEASED; urgency=low getting updated during build - Use canonical URL for the VCS-* fields + [ Ivo De Decker ] + * debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done + by postinst during upgrade from lenny to squeeze (Really closes: #677054) + Thanks to Andreas Beckmann for the review. + -- Laurent Bigonville Tue, 14 May 2013 18:04:04 +0200 nut (2.6.5-2) experimental; urgency=low diff --git a/debian/nut-client.preinst b/debian/nut-client.preinst index 2107da1..fa1bd01 100644 --- a/debian/nut-client.preinst +++ b/debian/nut-client.preinst @@ -4,6 +4,15 @@ set -e # Revert /etc/nut/nut.conf mangling done by older versions of the postinst # See #677054 +# changed configfile created by a fresh install in lenny, upgraded to squeeze +if [ "$1" = "install" -o "$1" = "upgrade" ] \ + && dpkg --compare-versions "$2" lt "2.6.4-2" \ + && [ -f /etc/nut/nut.conf ] \ + && [ "`md5sum /etc/nut/nut.conf | cut -d ' ' -f 1`" = 331cca39153f451c2968f4b734c1cf3f ]; then + sed -i '29,$ d' /etc/nut/nut.conf +fi + +# changed configfile created by a fresh install in squeeze if [ "$1" = "install" -o "$1" = "upgrade" ] \ && dpkg --compare-versions "$2" lt "2.6.4-2" \ && [ -f /etc/nut/nut.conf ] \ From f313323738fd5bf05cd49c0b80b1f21783e8602b Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 18 Jun 2013 21:52:31 +0200 Subject: [PATCH 070/240] Added dep-8-tests to improve QA (from Ubuntu, closes: #708130) --- debian/changelog | 3 +- debian/tests/control | 3 + debian/tests/nut | 6 + debian/tests/test-nut.py | 422 ++++++++++++++ debian/tests/testlib.py | 1144 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 1577 insertions(+), 1 deletion(-) create mode 100644 debian/tests/control create mode 100644 debian/tests/nut create mode 100644 debian/tests/test-nut.py create mode 100644 debian/tests/testlib.py diff --git a/debian/changelog b/debian/changelog index 8f3daf2..411a8be 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,13 +9,14 @@ nut (2.6.5-3) UNRELEASED; urgency=low - Add autotools-dev to the build-dependencies so config.{guess,sub} are getting updated during build - Use canonical URL for the VCS-* fields + * Added dep-8-tests to improve QA (from Ubuntu, closes: #708130) [ Ivo De Decker ] * debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done by postinst during upgrade from lenny to squeeze (Really closes: #677054) Thanks to Andreas Beckmann for the review. - -- Laurent Bigonville Tue, 14 May 2013 18:04:04 +0200 + -- Laurent Bigonville Tue, 18 Jun 2013 21:49:12 +0200 nut (2.6.5-2) experimental; urgency=low diff --git a/debian/tests/control b/debian/tests/control new file mode 100644 index 0000000..b4bdda5 --- /dev/null +++ b/debian/tests/control @@ -0,0 +1,3 @@ +Tests: nut +Depends: python-unit, nut-server, nut-client +Restrictions: needs-root diff --git a/debian/tests/nut b/debian/tests/nut new file mode 100644 index 0000000..598cde8 --- /dev/null +++ b/debian/tests/nut @@ -0,0 +1,6 @@ +#!/bin/bash +#------------ +# Testing nut +#------------ +set -e +python `dirname $0`/test-nut.py 2>&1 diff --git a/debian/tests/test-nut.py b/debian/tests/test-nut.py new file mode 100644 index 0000000..c34256c --- /dev/null +++ b/debian/tests/test-nut.py @@ -0,0 +1,422 @@ +#!/usr/bin/python +# +# test-nut.py quality assurance test script +# Copyright (C) 2008-2011 Arnaud Quette +# Copyright (C) 2012 Jamie Strandboge +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +''' + *** IMPORTANT *** + DO NOT RUN ON A PRODUCTION SERVER. + *** IMPORTANT *** + + How to run (up to natty): + $ sudo apt-get -y install python-unit nut + $ sudo ./test-nut.py -v + + How to run (oneiric+): + $ sudo apt-get -y install python-unit nut-server nut-client + $ sudo ./test-nut.py -v + + NOTE: + - NUT architecture (helps understanding): + http://www.networkupstools.org/docs/developer-guide.chunked/ar01s02.html#_the_layering + + - These tests only validate the NUT software framework itself (communication + between the drivers, server and client layers ; events propagation and + detection). The critical part of NUT, Ie the driver layer which + communicate with actual devices, can only be tested with real hardware! + + - These tests use the NUT simulation driver (dummy-ups) to emulate real + hardware behavior, and generate events (power failure, low battery, ...). + + TODO: + - improve test duration, by reworking NutTestCommon._setUp() and the way + daemons are started (ie, always) + - more events testing (upsmon / upssched) + - test syslog and wall output + - test UPS redundancy + - test Powerchain (once available!) + - test AppArmor (once available!) + - add hardware testing as Private tests? + - load a .dev file, and test a full output + + QA INFORMATION: + - NUT provides "make check" and "make distcheck" in its source distribution + - NUT provides Quality Assurance information, to track all efforts: + http://www.networkupstools.org/nut-qa.html +''' + +# QRT-Packages: python-unit netcat-openbsd +# QRT-Alternates: nut-server nut +# QRT-Alternates: nut-client nut +# nut-dev is needed for the dummy driver on hardy +# QRT-Alternates: nut-dev +# QRT-Privilege: root +# QRT-Depends: + + +import unittest, subprocess, sys, os, time +import tempfile +import testlib + +use_private = True +try: + from private.qrt.nut import PrivateNutTest +except ImportError: + class PrivateNutTest(object): + '''Empty class''' + print >>sys.stdout, "Skipping private tests" + + +class NutTestCommon(testlib.TestlibCase): + '''Common functions''' + + # FIXME: initscript will be splitted into nut-server and nut-client + # (Debian bug #634858) + initscript = "/etc/init.d/nut-server" + hosts_file = "/etc/hosts" + powerdownflag = "/etc/killpower" + shutdowncmd = "/tmp/shutdowncmd" + notifyscript = "/tmp/nutifyme" + notifylog = "/tmp/notify.log" + + def _setUp(self): + '''Set up prior to each test_* function''' + '''We generate a NUT config using the dummmy-ups driver + and standard settings for local monitoring + ''' + self.tmpdir = "" + self.rundir = "/var/run/nut" + testlib.cmd(['/bin/rm -f' + self.powerdownflag]) + + testlib.config_replace('/etc/nut/ups.conf', ''' +[dummy-dev1] + driver = dummy-ups + port = dummy.dev + desc = "simulation device" + ''') + + if self.lsb_release['Release'] <= 8.04: + testlib.config_replace('/etc/nut/upsd.conf', ''' +ACL dummy-net 127.0.0.1/8 +ACL dummy-net2 ::1/64 +ACL all 0.0.0.0/0 +ACCEPT dummy-net dummy-net2 +REJECT all + ''') + else: + testlib.config_replace('/etc/nut/upsd.conf', '''# just to touch the file''') + + extra_cfgs = '' + if self.lsb_release['Release'] <= 8.04: + extra_cfgs = ''' allowfrom = dummy-net dummy-net2 +''' + testlib.config_replace('/etc/nut/upsd.users', ''' +[admin] + password = dummypass + actions = SET + instcmds = ALL +%s +[monuser] + password = dummypass + upsmon master +%s ''' %(extra_cfgs, extra_cfgs)) + + testlib.config_replace('/etc/nut/upsmon.conf', ''' +MONITOR dummy-dev1@localhost 1 monuser dummy-pass master +MINSUPPLIES 1 +SHUTDOWNCMD "/usr/bin/touch ''' + self.shutdowncmd + '"\n' +'''POWERDOWNFLAG ''' + self.powerdownflag + '\n' +''' +NOTIFYCMD ''' + self.notifyscript + '\n' +''' +NOTIFYFLAG ONLINE SYSLOG+EXEC +NOTIFYFLAG ONBATT SYSLOG+EXEC +NOTIFYFLAG LOWBATT SYSLOG+EXEC +NOTIFYFLAG FSD SYSLOG+EXEC +# NOTIFYFLAG COMMOK SYSLOG+EXEC +# NOTIFYFLAG COMMBAD SYSLOG+EXEC +NOTIFYFLAG SHUTDOWN SYSLOG+EXEC +# NOTIFYFLAG REPLBATT SYSLOG+EXEC +# NOTIFYFLAG NOCOMM SYSLOG+EXEC +# NOTIFYFLAG NOPARENT SYSLOG+EXEC + +# Shorten test duration by: +# Speeding up polling frequency +POLLFREQ 2 +# And final wait delay +FINALDELAY 0 +''' +) + + testlib.create_fill(self.notifyscript, ''' +#! /bin/bash +echo "$*" > ''' + self.notifylog + '\n', mode=0755) + + # dummy-ups absolutely needs a data file, even if empty + testlib.config_replace('/etc/nut/dummy.dev', ''' +ups.mfr: Dummy Manufacturer +ups.model: Dummy UPS +ups.status: OL +# Set a big enough timer to avoid value reset, due to reading loop +TIMER 600 + ''') + + testlib.config_replace('/etc/nut/nut.conf', '''MODE=standalone''') + + # Add known friendly IP names for localhost v4 and v6 + # FIXME: find a way to determine if v4 / v6 are enabled, and a way to + # get v4 / v6 names + testlib.config_replace(self.hosts_file, '''# +127.0.0.1 localv4 +::1 localv6 +''', append=True) + + if self.lsb_release['Release'] <= 8.04: + testlib.config_replace('/etc/default/nut', '''# +START_UPSD=yes +UPSD_OPTIONS="" +START_UPSMON=yes +UPSMON_OPTIONS="" +''', append=False) + + # Start the framework + self._restart() + + def _tearDown(self): + '''Clean up after each test_* function''' + self._stop() + time.sleep(2) + os.unlink('/etc/nut/ups.conf') + os.unlink('/etc/nut/upsd.conf') + os.unlink('/etc/nut/upsd.users') + os.unlink('/etc/nut/upsmon.conf') + os.unlink('/etc/nut/dummy.dev') + os.unlink('/etc/nut/nut.conf') + testlib.config_restore('/etc/nut/ups.conf') + testlib.config_restore('/etc/nut/upsd.conf') + testlib.config_restore('/etc/nut/upsd.users') + testlib.config_restore('/etc/nut/upsmon.conf') + testlib.config_restore('/etc/nut/dummy.dev') + testlib.config_restore('/etc/nut/nut.conf') + if os.path.exists(self.notifyscript): + os.unlink(self.notifyscript) + if os.path.exists(self.shutdowncmd): + os.unlink(self.shutdowncmd) + testlib.config_restore(self.hosts_file) + if self.lsb_release['Release'] <= 8.04: + testlib.config_restore('/etc/default/nut') + + if os.path.exists(self.tmpdir): + testlib.recursive_rm(self.tmpdir) + + # this is needed because of the potentially hung upsd process in the + # CVE-2012-2944 test + testlib.cmd(['killall', 'upsd']) + testlib.cmd(['killall', '-9', 'upsd']) + + def _start(self): + '''Start NUT''' + rc, report = testlib.cmd([self.initscript, 'start']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + self.assertEquals(expected, rc, result + report) + time.sleep(2) + + def _stop(self): + '''Stop NUT''' + rc, report = testlib.cmd([self.initscript, 'stop']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + self.assertEquals(expected, rc, result + report) + + def _reload(self): + '''Reload NUT''' + rc, report = testlib.cmd([self.initscript, 'force-reload']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + self.assertEquals(expected, rc, result + report) + + def _restart(self): + '''Restart NUT''' + self._stop() + time.sleep(2) + self._start() + + def _status(self): + '''NUT Status''' + rc, report = testlib.cmd([self.initscript, 'status']) + expected = 0 + if self.lsb_release['Release'] <= 8.04: + self._skipped("init script does not support status command") + expected = 1 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + self.assertEquals(expected, rc, result + report) + + def _testDaemons(self, daemons): + '''Daemons running''' + for d in daemons: + # A note on the driver pid file: its name is + # -.pid + # ex: dummy-dev1-dummy-ups.pid + if d == 'dummy-ups' : + pidfile = os.path.join(self.rundir, 'dummy-ups-dummy-dev1.pid') + else : + pidfile = os.path.join(self.rundir, d + '.pid') + warning = "Could not find pidfile '" + pidfile + "'" + self.assertTrue(os.path.exists(pidfile), warning) + self.assertTrue(testlib.check_pidfile(d, pidfile), d + ' is not running') + + def _nut_setvar(self, var, value): + '''Test upsrw''' + rc, report = testlib.cmd(['/bin/upsrw', '-s', var + '=' + value, + '-u', 'admin' , '-p', 'dummypass', 'dummy-dev1@localhost']) + self.assertTrue(rc == 0, 'upsrw: ' + report) + return rc,report + + +class BasicTest(NutTestCommon, PrivateNutTest): + '''Test basic NUT functionalities''' + + def setUp(self): + '''Setup mechanisms''' + NutTestCommon._setUp(self) + + def tearDown(self): + '''Shutdown methods''' + NutTestCommon._tearDown(self) + + def test_daemons_service(self): + '''Test daemons using "service status"''' + self._status() + + def test_daemons_pid(self): + '''Test daemons using PID files''' + # upsmon does not work because ups-client is still missing + daemons = [ 'dummy-ups', 'upsd'] + self._testDaemons(daemons) + + def test_upsd_IPv4(self): + '''Test upsd IPv4 reachability''' + rc, report = testlib.cmd(['/bin/upsc', '-l', 'localv4']) + self.assertTrue('dummy-dev1' in report, 'dummy-dev1 should be present in device(s) listing: ' + report) + + def test_upsd_IPv6(self): + '''Test upsd IPv6 reachability''' + rc, report = testlib.cmd(['/bin/upsc', '-l', 'localv6']) + self.assertTrue('dummy-dev1' in report, 'dummy-dev1 should be present in device(s) listing: ' + report) + + def test_upsc_device_list(self): + '''Test NUT client interface (upsc): device(s) listing''' + rc, report = testlib.cmd(['/bin/upsc', '-L']) + self.assertTrue('dummy-dev1: simulation device' in report, 'dummy-dev1 should be present in device(s) listing: ' + report) + + def _test_upsc_status(self): + '''Test NUT client interface (upsc): data access''' + rc, report = testlib.cmd(['/bin/upsc', 'dummy-dev1', 'ups.status']) + self.assertTrue('OL' in report, 'UPS Status: ' + report + 'should be OL') + + #def test_upsc_powerchain(self): + # '''Test NUT client interface (upsc): Powerchain(s) listing''' + # rc, report = testlib.cmd(['/bin/upsc', '-p']) + # Result == Main ; dummy-dev1 ; $hostname + # self.assertTrue('dummy-dev1' in report, 'dummy-dev1 should be present in device(s) listing: ' + report) + + def test_upsrw(self): + '''Test upsrw''' + # Set ups.status to OB (On Battery)... + self._nut_setvar('ups.model', 'Test') + time.sleep(2) + # and check the result on the client side + rc, report = testlib.cmd(['/bin/upsc', 'dummy-dev1@localhost', 'ups.model']) + self.assertTrue('Test' in report, 'UPS Model: ' + report + 'should be Test') + + # FIXME: need a simulation counterpart, not yet implemented + #def test_upscmd(self): + # '''Test upscmd''' + + def test_upsmon_notif(self): + '''Test upsmon notifications''' + # Set ups.status to OB (On Battery)... + self._nut_setvar('ups.status', 'OB') + time.sleep(1) + # and check the result on the client side + rc, report = testlib.cmd(['/bin/upsc', 'dummy-dev1@localhost', 'ups.status']) + self.assertTrue('OB' in report, 'UPS Status: ' + report + 'should be OB') + + #def test_upsmon_shutdown(self): + # '''Test upsmon basic shutdown (single UPS, low battery status)''' + # self._nut_setvar('ups.status', 'OB LB') + # time.sleep(2) + # # and check the result on the client side + # rc, report = testlib.cmd(['/bin/upsc', 'dummy-dev1@localhost', 'ups.status']) + # self.assertTrue('OB LB' in report, 'UPS Status: ' + report + 'should be OB LB') + # # FIXME: improve with a 2 sec loop * 5 tries + # time.sleep(3) + # # Check for powerdownflag and shutdowncmd (needed for halt!) + # # FIXME: replace by a call to 'upsmon -K' + # self.assertTrue(os.path.exists(self.powerdownflag), 'POWERDOWNFLAG has not been set!') + # self.assertTrue(os.path.exists(self.shutdowncmd), 'SHUTDOWNCMD has not been executed!') + + def test_CVE_2012_2944(self): + '''Test CVE-2012-2944''' + self.tmpdir = tempfile.mkdtemp(dir='/tmp', prefix="testlib-") + # First send bad input. We need to do this in a script because python + # functions don't like our embedded NULs + script = os.path.join(self.tmpdir, 'script.sh') + contents = '''#!/bin/sh +printf '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n' | nc -q 1 127.0.0.1 3493 +sleep 1 +dd if=/dev/urandom count=64 | nc -q 1 127.0.0.1 3493 +''' + testlib.create_fill(script, contents, mode=0755) + rc, report = testlib.cmd([script]) + + # It should not have crashed. Let's see if it did + self._testDaemons(['upsd']) + self.assertTrue('ERR UNKNOWN-COMMAND' in report, "Could not find 'ERR UNKNOWN-COMMAND' in:\n%s" % report) + + # This CVE may also result in a hung upsd. Try to kill it, if it is + # still around, it is hung + testlib.cmd(['killall', 'upsd']) + pidfile = os.path.join(self.rundir, 'upsd.pid') + self.assertFalse(os.path.exists(pidfile), "Found %s" % pidfile) + self.assertFalse(testlib.check_pidfile('upsd', pidfile), 'upsd is hung') + #subprocess.call(['bash']) + +# FIXME +#class AdvancedTest(NutTestCommon, PrivateNutTest): +# '''Test advanced NUT functionalities''' + +if __name__ == '__main__': + + suite = unittest.TestSuite() + # more configurable + if (len(sys.argv) == 1 or sys.argv[1] == '-v'): + suite.addTest(unittest.TestLoader().loadTestsFromTestCase(BasicTest)) + + # Pull in private tests + #if use_private: + # suite.addTest(unittest.TestLoader().loadTestsFromTestCase(MyPrivateTest)) + + else: + print '''Usage: + test-nut.py [-v] basic tests +''' + sys.exit(1) + rc = unittest.TextTestRunner(verbosity=2).run(suite) + if not rc.wasSuccessful(): + sys.exit(1) diff --git a/debian/tests/testlib.py b/debian/tests/testlib.py new file mode 100644 index 0000000..fe0a622 --- /dev/null +++ b/debian/tests/testlib.py @@ -0,0 +1,1144 @@ +# +# testlib.py quality assurance test script +# Copyright (C) 2008-2011 Canonical Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program. If not, see +# . +# + +'''Common classes and functions for package tests.''' + +import string, random, crypt, subprocess, pwd, grp, signal, time, unittest, tempfile, shutil, os, os.path, re, glob +import sys, socket, gzip +from stat import * +from encodings import string_escape + +import warnings +warnings.filterwarnings('ignore', message=r'.*apt_pkg\.TagFile.*', category=DeprecationWarning) +try: + import apt_pkg + apt_pkg.InitSystem(); +except: + # On non-Debian system, fall back to simple comparison without debianisms + class apt_pkg(object): + def VersionCompare(one, two): + list_one = one.split('.') + list_two = two.split('.') + while len(list_one)>0 and len(list_two)>0: + if list_one[0] > list_two[0]: + return 1 + if list_one[0] < list_two[0]: + return -1 + list_one.pop(0) + list_two.pop(0) + return 0 + +bogus_nxdomain = "208.69.32.132" + +# http://www.chiark.greenend.org.uk/ucgi/~cjwatson/blosxom/2009-07-02-python-sigpipe.html +# This is needed so that the subprocesses that produce endless output +# actually quit when the reader goes away. +import signal +def subprocess_setup(): + # Python installs a SIGPIPE handler by default. This is usually not what + # non-Python subprocesses expect. + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + +class TimedOutException(Exception): + def __init__(self, value = "Timed Out"): + self.value = value + def __str__(self): + return repr(self.value) + +def _restore_backup(path): + pathbackup = path + '.autotest' + if os.path.exists(pathbackup): + shutil.move(pathbackup, path) + +def _save_backup(path): + pathbackup = path + '.autotest' + if os.path.exists(path) and not os.path.exists(pathbackup): + shutil.copy2(path, pathbackup) + # copy2 does not copy ownership, so do it here. + # Reference: http://docs.python.org/library/shutil.html + a = os.stat(path) + os.chown(pathbackup, a[4], a[5]) + +def config_copydir(path): + if os.path.exists(path) and not os.path.isdir(path): + raise OSError, "'%s' is not a directory" % (path) + _restore_backup(path) + + pathbackup = path + '.autotest' + if os.path.exists(path): + shutil.copytree(path, pathbackup, symlinks=True) + +def config_replace(path,contents,append=False): + '''Replace (or append) to a config file''' + _restore_backup(path) + if os.path.exists(path): + _save_backup(path) + if append: + contents = file(path).read() + contents + open(path, 'w').write(contents) + +def config_comment(path, field): + _save_backup(path) + contents = "" + for line in file(path): + if re.search("^\s*%s\s*=" % (field), line): + line = "#" + line + contents += line + + open(path+'.new', 'w').write(contents) + os.rename(path+'.new', path) + +def config_set(path, field, value, spaces=True): + _save_backup(path) + contents = "" + if spaces==True: + setting = '%s = %s\n' % (field, value) + else: + setting = '%s=%s\n' % (field, value) + found = False + for line in file(path): + if re.search("^\s*%s\s*=" % (field), line): + found = True + line = setting + contents += line + if not found: + contents += setting + + open(path+'.new', 'w').write(contents) + os.rename(path+'.new', path) + +def config_patch(path, patch, depth=1): + '''Patch a config file''' + _restore_backup(path) + _save_backup(path) + + handle, name = mkstemp_fill(patch) + rc = subprocess.call(['/usr/bin/patch', '-p%s' %(depth), path], stdin=handle, stdout=subprocess.PIPE) + os.unlink(name) + if rc != 0: + raise Exception("Patch failed") + +def config_restore(path): + '''Rename a replaced config file back to its initial state''' + _restore_backup(path) + +def timeout(secs, f, *args): + def handler(signum, frame): + raise TimedOutException() + + old = signal.signal(signal.SIGALRM, handler) + result = None + signal.alarm(secs) + try: + result = f(*args) + finally: + signal.alarm(0) + signal.signal(signal.SIGALRM, old) + + return result + +def require_nonroot(): + if os.geteuid() == 0: + print >>sys.stderr, "This series of tests should be run as a regular user with sudo access, not as root." + sys.exit(1) + +def require_root(): + if os.geteuid() != 0: + print >>sys.stderr, "This series of tests should be run with root privileges (e.g. via sudo)." + sys.exit(1) + +def require_sudo(): + if os.geteuid() != 0 or os.environ.get('SUDO_USER', None) == None: + print >>sys.stderr, "This series of tests must be run under sudo." + sys.exit(1) + if os.environ['SUDO_USER'] == 'root': + print >>sys.stderr, 'Please run this test using sudo from a regular user. (You ran sudo from root.)' + sys.exit(1) + +def random_string(length,lower=False): + '''Return a random string, consisting of ASCII letters, with given + length.''' + + s = '' + selection = string.letters + if lower: + selection = string.lowercase + maxind = len(selection)-1 + for l in range(length): + s += selection[random.randint(0, maxind)] + return s + +def mkstemp_fill(contents,suffix='',prefix='testlib-',dir=None): + '''As tempfile.mkstemp does, return a (file, name) pair, but with + prefilled contents.''' + + handle, name = tempfile.mkstemp(suffix=suffix,prefix=prefix,dir=dir) + os.close(handle) + handle = file(name,"w+") + handle.write(contents) + handle.flush() + handle.seek(0) + + return handle, name + +def create_fill(path, contents, mode=0644): + '''Safely create a page''' + # make the temp file in the same dir as the destination file so we + # don't get invalid cross-device link errors when we rename + handle, name = mkstemp_fill(contents, dir=os.path.dirname(path)) + handle.close() + os.rename(name, path) + os.chmod(path, mode) + +def login_exists(login): + '''Checks whether the given login exists on the system.''' + + try: + pwd.getpwnam(login) + return True + except KeyError: + return False + +def group_exists(group): + '''Checks whether the given login exists on the system.''' + + try: + grp.getgrnam(group) + return True + except KeyError: + return False + +def recursive_rm(dirPath, contents_only=False): + '''recursively remove directory''' + names = os.listdir(dirPath) + for name in names: + path = os.path.join(dirPath, name) + if os.path.islink(path) or not os.path.isdir(path): + os.unlink(path) + else: + recursive_rm(path) + if contents_only == False: + os.rmdir(dirPath) + +def check_pidfile(exe, pidfile): + '''Checks if pid in pidfile is running''' + if not os.path.exists(pidfile): + return False + + # get the pid + try: + fd = open(pidfile, 'r') + pid = fd.readline().rstrip('\n') + fd.close() + except: + return False + + return check_pid(exe, pid) + +def check_pid(exe, pid): + '''Checks if pid is running''' + cmdline = "/proc/%s/cmdline" % (str(pid)) + if not os.path.exists(cmdline): + return False + + # get the command line + try: + fd = open(cmdline, 'r') + tmp = fd.readline().split('\0') + fd.close() + except: + return False + + # this allows us to match absolute paths or just the executable name + if re.match('^' + exe + '$', tmp[0]) or \ + re.match('.*/' + exe + '$', tmp[0]) or \ + re.match('^' + exe + ': ', tmp[0]) or \ + re.match('^\(' + exe + '\)', tmp[0]): + return True + + return False + +def check_port(port, proto, ver=4): + '''Check if something is listening on the specified port. + WARNING: for some reason this does not work with a bind mounted /proc + ''' + assert (port >= 1) + assert (port <= 65535) + assert (proto.lower() == "tcp" or proto.lower() == "udp") + assert (ver == 4 or ver == 6) + + fn = "/proc/net/%s" % (proto) + if ver == 6: + fn += str(ver) + + rc, report = cmd(['cat', fn]) + assert (rc == 0) + + hport = "%0.4x" % port + + if re.search(': [0-9a-f]{8}:%s [0-9a-f]' % str(hport).lower(), report.lower()): + return True + return False + +def get_arch(): + '''Get the current architecture''' + rc, report = cmd(['uname', '-m']) + assert (rc == 0) + return report.strip() + +def get_memory(): + '''Gets total ram and swap''' + meminfo = "/proc/meminfo" + memtotal = 0 + swaptotal = 0 + if not os.path.exists(meminfo): + return (False, False) + + try: + fd = open(meminfo, 'r') + for line in fd.readlines(): + splitline = line.split() + if splitline[0] == 'MemTotal:': + memtotal = int(splitline[1]) + elif splitline[0] == 'SwapTotal:': + swaptotal = int(splitline[1]) + fd.close() + except: + return (False, False) + + return (memtotal,swaptotal) + +def is_running_in_vm(): + '''Check if running under a VM''' + # add other virtualization environments here + for search in ['QEMU Virtual CPU']: + rc, report = cmd_pipe(['dmesg'], ['grep', search]) + if rc == 0: + return True + return False + +def ubuntu_release(): + '''Get the Ubuntu release''' + f = "/etc/lsb-release" + try: + size = os.stat(f)[ST_SIZE] + except: + return "UNKNOWN" + + if size > 1024*1024: + raise IOError, 'Could not open "%s" (too big)' % f + + try: + fh = open("/etc/lsb-release", 'r') + except: + raise + + lines = fh.readlines() + fh.close() + + pat = re.compile(r'DISTRIB_CODENAME') + for line in lines: + if pat.search(line): + return line.split('=')[1].rstrip('\n').rstrip('\r') + + return "UNKNOWN" + +def cmd(command, input = None, stderr = subprocess.STDOUT, stdout = subprocess.PIPE, stdin = None, timeout = None): + '''Try to execute given command (array) and return its stdout, or return + a textual error if it failed.''' + + try: + sp = subprocess.Popen(command, stdin=stdin, stdout=stdout, stderr=stderr, close_fds=True, preexec_fn=subprocess_setup) + except OSError, e: + return [127, str(e)] + + out, outerr = sp.communicate(input) + # Handle redirection of stdout + if out == None: + out = '' + # Handle redirection of stderr + if outerr == None: + outerr = '' + return [sp.returncode,out+outerr] + +def cmd_pipe(command1, command2, input = None, stderr = subprocess.STDOUT, stdin = None): + '''Try to pipe command1 into command2.''' + try: + sp1 = subprocess.Popen(command1, stdin=stdin, stdout=subprocess.PIPE, stderr=stderr, close_fds=True) + sp2 = subprocess.Popen(command2, stdin=sp1.stdout, stdout=subprocess.PIPE, stderr=stderr, close_fds=True) + except OSError, e: + return [127, str(e)] + + out = sp2.communicate(input)[0] + return [sp2.returncode,out] + +def cwd_has_enough_space(cdir, total_bytes): + '''Determine if the partition of the current working directory has 'bytes' + free.''' + rc, df_output = cmd(['df']) + result = 'Got exit code %d, expected %d\n' % (rc, 0) + if rc != 0: + return False + + kb = total_bytes / 1024 + + mounts = dict() + for line in df_output.splitlines(): + if '/' not in line: + continue + tmp = line.split() + mounts[tmp[5]] = int(tmp[3]) + + cdir = os.getcwd() + while cdir != '/': + if not mounts.has_key(cdir): + cdir = os.path.dirname(cdir) + continue + if kb < mounts[cdir]: + return True + else: + return False + + if kb < mounts['/']: + return True + + return False + +def get_md5(filename): + '''Gets the md5sum of the file specified''' + + (rc, report) = cmd(["/usr/bin/md5sum", "-b", filename]) + expected = 0 + assert (expected == rc) + + return report.split(' ')[0] + +def dpkg_compare_installed_version(pkg, check, version): + '''Gets the version for the installed package, and compares it to the + specified version. + ''' + (rc, report) = cmd(["/usr/bin/dpkg", "-s", pkg]) + assert (rc == 0) + assert ("Status: install ok installed" in report) + installed_version = "" + for line in report.splitlines(): + if line.startswith("Version: "): + installed_version = line.split()[1] + + assert (installed_version != "") + + (rc, report) = cmd(["/usr/bin/dpkg", "--compare-versions", installed_version, check, version]) + assert (rc == 0 or rc == 1) + if rc == 0: + return True + return False + +def prepare_source(source, builder, cached_src, build_src, patch_system): + '''Download and unpack source package, installing necessary build depends, + adjusting the permissions for the 'builder' user, and returning the + directory of the unpacked source. Patch system can be one of: + - cdbs + - dpatch + - quilt + - quiltv3 + - None (not the string) + + This is normally used like this: + + def setUp(self): + ... + self.topdir = os.getcwd() + self.cached_src = os.path.join(os.getcwd(), "source") + self.tmpdir = tempfile.mkdtemp(prefix='testlib', dir='/tmp') + self.builder = testlib.TestUser() + testlib.cmd(['chgrp', self.builder.login, self.tmpdir]) + os.chmod(self.tmpdir, 0775) + + def tearDown(self): + ... + self.builder = None + self.topdir = os.getcwd() + if os.path.exists(self.tmpdir): + testlib.recursive_rm(self.tmpdir) + + def test_suite_build(self): + ... + build_dir = testlib.prepare_source('foo', \ + self.builder, \ + self.cached_src, \ + os.path.join(self.tmpdir, \ + os.path.basename(self.cached_src)), + "quilt") + os.chdir(build_dir) + + # Example for typical build, adjust as necessary + print "" + print " make clean" + rc, report = testlib.cmd(['sudo', '-u', self.builder.login, 'make', 'clean']) + + print " configure" + rc, report = testlib.cmd(['sudo', '-u', self.builder.login, './configure', '--prefix=%s' % self.tmpdir, '--enable-debug']) + + print " make (will take a while)" + rc, report = testlib.cmd(['sudo', '-u', self.builder.login, 'make']) + + print " make check (will take a while)", + rc, report = testlib.cmd(['sudo', '-u', self.builder.login, 'make', 'check']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + self.assertEquals(expected, rc, result + report) + + def test_suite_cleanup(self): + ... + if os.path.exists(self.cached_src): + testlib.recursive_rm(self.cached_src) + + It is up to the caller to clean up cached_src and build_src (as in the + above example, often the build_src is in a tmpdir that is cleaned in + tearDown() and the cached_src is cleaned in a one time clean-up + operation (eg 'test_suite_cleanup()) which must be run after the build + suite test (obviously). + ''' + + # Make sure we have a clean slate + assert (os.path.exists(os.path.dirname(build_src))) + assert (not os.path.exists(build_src)) + + cdir = os.getcwd() + if os.path.exists(cached_src): + shutil.copytree(cached_src, build_src) + os.chdir(build_src) + else: + # Only install the build dependencies on the initial setup + rc, report = cmd(['apt-get','-y','--force-yes','build-dep',source]) + assert (rc == 0) + + os.makedirs(build_src) + os.chdir(build_src) + + # These are always needed + pkgs = ['build-essential', 'dpkg-dev', 'fakeroot'] + rc, report = cmd(['apt-get','-y','--force-yes','install'] + pkgs) + assert (rc == 0) + + rc, report = cmd(['apt-get','source',source]) + assert (rc == 0) + shutil.copytree(build_src, cached_src) + + unpacked_dir = os.path.join(build_src, glob.glob('%s-*' % source)[0]) + + # Now apply the patches. Do it here so that we don't mess up our cached + # sources. + os.chdir(unpacked_dir) + assert (patch_system in ['cdbs', 'dpatch', 'quilt', 'quiltv3', None]) + if patch_system != None and patch_system != "quiltv3": + if patch_system == "quilt": + os.environ.setdefault('QUILT_PATCHES','debian/patches') + rc, report = cmd(['quilt', 'push', '-a']) + assert (rc == 0) + elif patch_system == "cdbs": + rc, report = cmd(['./debian/rules', 'apply-patches']) + assert (rc == 0) + elif patch_system == "dpatch": + rc, report = cmd(['dpatch', 'apply-all']) + assert (rc == 0) + + cmd(['chown', '-R', '%s:%s' % (builder.uid, builder.gid), build_src]) + os.chdir(cdir) + + return unpacked_dir + +def _aa_status(): + '''Get aa-status output''' + exe = "/usr/sbin/aa-status" + assert (os.path.exists(exe)) + if os.geteuid() == 0: + return cmd([exe]) + return cmd(['sudo', exe]) + +def is_apparmor_loaded(path): + '''Check if profile is loaded''' + rc, report = _aa_status() + if rc != 0: + return False + + for line in report.splitlines(): + if line.endswith(path): + return True + return False + +def is_apparmor_confined(path): + '''Check if application is confined''' + rc, report = _aa_status() + if rc != 0: + return False + + for line in report.splitlines(): + if re.search('%s \(' % path, line): + return True + return False + +def check_apparmor(path, first_ubuntu_release, is_running=True): + '''Check if path is loaded and confined for everything higher than the + first Ubuntu release specified. + + Usage: + rc, report = testlib.check_apparmor('/usr/sbin/foo', 8.04, is_running=True) + if rc < 0: + return self._skipped(report) + + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + self.assertEquals(expected, rc, result + report) + ''' + global manager + rc = -1 + + if manager.lsb_release["Release"] < first_ubuntu_release: + return (rc, "Skipped apparmor check") + + if not os.path.exists('/sbin/apparmor_parser'): + return (rc, "Skipped (couldn't find apparmor_parser)") + + rc = 0 + msg = "" + if not is_apparmor_loaded(path): + rc = 1 + msg = "Profile not loaded for '%s'" % path + + # this check only makes sense it the 'path' is currently executing + if is_running and rc == 0 and not is_apparmor_confined(path): + rc = 1 + msg = "'%s' is not running in enforce mode" % path + + return (rc, msg) + +def get_gcc_version(gcc, full=True): + gcc_version = 'none' + if not gcc.startswith('/'): + gcc = '/usr/bin/%s' % (gcc) + if os.path.exists(gcc): + gcc_version = 'unknown' + lines = cmd([gcc,'-v'])[1].strip().splitlines() + version_lines = [x for x in lines if x.startswith('gcc version')] + if len(version_lines) == 1: + gcc_version = " ".join(version_lines[0].split()[2:]) + if not full: + return gcc_version.split()[0] + return gcc_version + +def is_kdeinit_running(): + '''Test if kdeinit is running''' + # applications that use kdeinit will spawn it if it isn't running in the + # test. This is a problem because it does not exit. This is a helper to + # check for it. + rc, report = cmd(['ps', 'x']) + if 'kdeinit4 Running' not in report: + print >>sys.stderr, ("kdeinit not running (you may start/stop any KDE application then run this script again)") + return False + return True + +def get_pkgconfig_flags(libs=[]): + '''Find pkg-config flags for libraries''' + assert (len(libs) > 0) + rc, pkg_config = cmd(['pkg-config', '--cflags', '--libs'] + libs) + expected = 0 + if rc != expected: + print >>sys.stderr, 'Got exit code %d, expected %d\n' % (rc, expected) + assert(rc == expected) + return pkg_config.split() + +class TestDaemon: + '''Helper class to manage daemons consistently''' + def __init__(self, init): + '''Setup daemon attributes''' + self.initscript = init + + def start(self): + '''Start daemon''' + rc, report = cmd([self.initscript, 'start']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + time.sleep(2) + if expected != rc: + return (False, result + report) + + if "fail" in report: + return (False, "Found 'fail' in report\n" + report) + + return (True, "") + + def stop(self): + '''Stop daemon''' + rc, report = cmd([self.initscript, 'stop']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + if expected != rc: + return (False, result + report) + + if "fail" in report: + return (False, "Found 'fail' in report\n" + report) + + return (True, "") + + def reload(self): + '''Reload daemon''' + rc, report = cmd([self.initscript, 'force-reload']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + if expected != rc: + return (False, result + report) + + if "fail" in report: + return (False, "Found 'fail' in report\n" + report) + + return (True, "") + + def restart(self): + '''Restart daemon''' + (res, str) = self.stop() + if not res: + return (res, str) + + (res, str) = self.start() + if not res: + return (res, str) + + return (True, "") + + def status(self): + '''Check daemon status''' + rc, report = cmd([self.initscript, 'status']) + expected = 0 + result = 'Got exit code %d, expected %d\n' % (rc, expected) + if expected != rc: + return (False, result + report) + + if "fail" in report: + return (False, "Found 'fail' in report\n" + report) + + return (True, "") + +class TestlibManager(object): + '''Singleton class used to set up per-test-run information''' + def __init__(self): + # Set glibc aborts to dump to stderr instead of the tty so test output + # is more sane. + os.environ.setdefault('LIBC_FATAL_STDERR_','1') + + # check verbosity + self.verbosity = False + if (len(sys.argv) > 1 and '-v' in sys.argv[1:]): + self.verbosity = True + + # Load LSB release file + self.lsb_release = dict() + if not os.path.exists('/usr/bin/lsb_release') and not os.path.exists('/bin/lsb_release'): + raise OSError, "Please install 'lsb-release'" + for line in subprocess.Popen(['lsb_release','-a'],stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0].splitlines(): + field, value = line.split(':',1) + value=value.strip() + field=field.strip() + # Convert numerics + try: + value = float(value) + except: + pass + self.lsb_release.setdefault(field,value) + + # FIXME: hack OEM releases into known-Ubuntu versions + if self.lsb_release['Distributor ID'] == "HP MIE (Mobile Internet Experience)": + if self.lsb_release['Release'] == 1.0: + self.lsb_release['Distributor ID'] = "Ubuntu" + self.lsb_release['Release'] = 8.04 + else: + raise OSError, "Unknown version of HP MIE" + + # FIXME: hack to assume a most-recent release if we're not + # running under Ubuntu. + if self.lsb_release['Distributor ID'] not in ["Ubuntu","Linaro"]: + self.lsb_release['Release'] = 10000 + # Adjust Linaro release to pretend to be Ubuntu + if self.lsb_release['Distributor ID'] in ["Linaro"]: + self.lsb_release['Distributor ID'] = "Ubuntu" + self.lsb_release['Release'] -= 0.01 + + # Load arch + if not os.path.exists('/usr/bin/dpkg'): + machine = cmd(['uname','-m'])[1].strip() + if machine.endswith('86'): + self.dpkg_arch = 'i386' + elif machine.endswith('_64'): + self.dpkg_arch = 'amd64' + elif machine.startswith('arm'): + self.dpkg_arch = 'armel' + else: + raise ValueError, "Unknown machine type '%s'" % (machine) + else: + self.dpkg_arch = cmd(['dpkg','--print-architecture'])[1].strip() + + # Find kernel version + self.kernel_is_ubuntu = False + self.kernel_version_signature = None + self.kernel_version = cmd(["uname","-r"])[1].strip() + versig = '/proc/version_signature' + if os.path.exists(versig): + self.kernel_is_ubuntu = True + self.kernel_version_signature = file(versig).read().strip() + self.kernel_version_ubuntu = self.kernel_version + elif os.path.exists('/usr/bin/dpkg'): + # this can easily be inaccurate but is only an issue for Dapper + rc, out = cmd(['dpkg','-l','linux-image-%s' % (self.kernel_version)]) + if rc == 0: + self.kernel_version_signature = out.strip().split('\n').pop().split()[2] + self.kernel_version_ubuntu = self.kernel_version_signature + if self.kernel_version_signature == None: + # Attempt to fall back to something for non-Debian-based + self.kernel_version_signature = self.kernel_version + self.kernel_version_ubuntu = self.kernel_version + # Build ubuntu version without hardware suffix + try: + self.kernel_version_ubuntu = "-".join([x for x in self.kernel_version_signature.split(' ')[1].split('-') if re.search('^[0-9]', x)]) + except: + pass + + # Find gcc version + self.gcc_version = get_gcc_version('gcc') + + # Find libc + self.path_libc = [x.split()[2] for x in cmd(['ldd','/bin/ls'])[1].splitlines() if x.startswith('\tlibc.so.')][0] + + # Report self + if self.verbosity: + kernel = self.kernel_version_ubuntu + if kernel != self.kernel_version_signature: + kernel += " (%s)" % (self.kernel_version_signature) + print >>sys.stdout, "Running test: '%s' distro: '%s %.2f' kernel: '%s' arch: '%s' uid: %d/%d SUDO_USER: '%s')" % ( \ + sys.argv[0], + self.lsb_release['Distributor ID'], + self.lsb_release['Release'], + kernel, + self.dpkg_arch, + os.geteuid(), os.getuid(), + os.environ.get('SUDO_USER', '')) + sys.stdout.flush() + + # Additional heuristics + #if os.environ.get('SUDO_USER', os.environ.get('USER', '')) in ['mdeslaur']: + # sys.stdout.write("Replying to Marc Deslauriers in http://launchpad.net/bugs/%d: " % random.randint(600000, 980000)) + # sys.stdout.flush() + # time.sleep(0.5) + # sys.stdout.write("destroyed\n") + # time.sleep(0.5) + + def hello(self, msg): + print >>sys.stderr, "Hello from %s" % (msg) +# The central instance +manager = TestlibManager() + +class TestlibCase(unittest.TestCase): + def __init__(self, *args): + '''This is called for each TestCase test instance, which isn't much better + than SetUp.''' + + unittest.TestCase.__init__(self, *args) + + # Attach to and duplicate dicts from manager singleton + self.manager = manager + #self.manager.hello(repr(self) + repr(*args)) + self.my_verbosity = self.manager.verbosity + self.lsb_release = self.manager.lsb_release + self.dpkg_arch = self.manager.dpkg_arch + self.kernel_version = self.manager.kernel_version + self.kernel_version_signature = self.manager.kernel_version_signature + self.kernel_version_ubuntu = self.manager.kernel_version_ubuntu + self.kernel_is_ubuntu = self.manager.kernel_is_ubuntu + self.gcc_version = self.manager.gcc_version + self.path_libc = self.manager.path_libc + + def version_compare(self, one, two): + return apt_pkg.VersionCompare(one,two) + + def assertFileType(self, filename, filetype): + '''Checks the file type of the file specified''' + + (rc, report, out) = self._testlib_shell_cmd(["/usr/bin/file", "-b", filename]) + out = out.strip() + expected = 0 + # Absolutely no idea why this happens on Hardy + if self.lsb_release['Release'] == 8.04 and rc == 255 and len(out) > 0: + rc = 0 + result = 'Got exit code %d, expected %d:\n%s\n' % (rc, expected, report) + self.assertEquals(expected, rc, result) + + filetype = '^%s$' % (filetype) + result = 'File type reported by file: [%s], expected regex: [%s]\n' % (out, filetype) + self.assertNotEquals(None, re.search(filetype, out), result) + + def yank_commonname_from_cert(self, certfile): + '''Extract the commonName from a given PEM''' + rc, out = cmd(['openssl','asn1parse','-in',certfile]) + if rc == 0: + ready = False + for line in out.splitlines(): + if ready: + return line.split(':')[-1] + if ':commonName' in line: + ready = True + return socket.getfqdn() + + def announce(self, text): + if self.my_verbosity: + print >>sys.stdout, "(%s) " % (text), + sys.stdout.flush() + + def make_clean(self): + rc, output = self.shell_cmd(['make','clean']) + self.assertEquals(rc, 0, output) + + def get_makefile_compiler(self): + # Find potential compiler name + compiler = 'gcc' + if os.path.exists('Makefile'): + for line in open('Makefile'): + if line.startswith('CC') and '=' in line: + items = [x.strip() for x in line.split('=')] + if items[0] == 'CC': + compiler = items[1] + break + return compiler + + def make_target(self, target, expected=0): + '''Compile a target and report output''' + + compiler = self.get_makefile_compiler() + rc, output = self.shell_cmd(['make',target]) + self.assertEquals(rc, expected, 'rc(%d)!=%d:\n' % (rc, expected) + output) + self.assertTrue('%s ' % (compiler) in output, 'Expected "%s":' % (compiler) + output) + return output + + # call as return testlib.skipped() + def _skipped(self, reason=""): + '''Provide a visible way to indicate that a test was skipped''' + if reason != "": + reason = ': %s' % (reason) + self.announce("skipped%s" % (reason)) + return False + + def _testlib_shell_cmd(self,args,stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT): + argstr = "'" + "', '".join(args).strip() + "'" + rc, out = cmd(args,stdin=stdin,stdout=stdout,stderr=stderr) + report = 'Command: ' + argstr + '\nOutput:\n' + out + return rc, report, out + + def shell_cmd(self, args, stdin=None): + return cmd(args,stdin=stdin) + + def assertShellExitEquals(self, expected, args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, msg=""): + '''Test a shell command matches a specific exit code''' + rc, report, out = self._testlib_shell_cmd(args, stdin=stdin, stdout=stdout, stderr=stderr) + result = 'Got exit code %d, expected %d\n' % (rc, expected) + self.assertEquals(expected, rc, msg + result + report) + + def assertShellExitNotEquals(self, unwanted, args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, msg=""): + '''Test a shell command doesn't match a specific exit code''' + rc, report, out = self._testlib_shell_cmd(args, stdin=stdin, stdout=stdout, stderr=stderr) + result = 'Got (unwanted) exit code %d\n' % rc + self.assertNotEquals(unwanted, rc, msg + result + report) + + def assertShellOutputContains(self, text, args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, msg="", invert=False): + '''Test a shell command contains a specific output''' + rc, report, out = self._testlib_shell_cmd(args, stdin=stdin, stdout=stdout, stderr=stderr) + result = 'Got exit code %d. Looking for text "%s"\n' % (rc, text) + if not invert: + self.assertTrue(text in out, msg + result + report) + else: + self.assertFalse(text in out, msg + result + report) + + def assertShellOutputEquals(self, text, args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, msg="", invert=False, expected=None): + '''Test a shell command matches a specific output''' + rc, report, out = self._testlib_shell_cmd(args, stdin=stdin, stdout=stdout, stderr=stderr) + result = 'Got exit code %d. Looking for exact text "%s" (%s)\n' % (rc, text, " ".join(args)) + if not invert: + self.assertEquals(text, out, msg + result + report) + else: + self.assertNotEquals(text, out, msg + result + report) + if expected != None: + result = 'Got exit code %d. Expected %d (%s)\n' % (rc, expected, " ".join(args)) + self.assertEquals(rc, expected, msg + result + report) + + def _word_find(self, report, content, invert=False): + '''Check for a specific string''' + if invert: + warning = 'Found "%s"\n' % content + self.assertTrue(content not in report, warning + report) + else: + warning = 'Could not find "%s"\n' % content + self.assertTrue(content in report, warning + report) + + def _test_sysctl_value(self, path, expected, msg=None, exists=True): + sysctl = '/proc/sys/%s' % (path) + self.assertEquals(exists, os.path.exists(sysctl), sysctl) + value = None + if exists: + value = int(file(sysctl).read()) + report = "%s is not %d: %d" % (sysctl, expected, value) + if msg: + report += " (%s)" % (msg) + self.assertEquals(value, expected, report) + return value + + def set_sysctl_value(self, path, desired): + sysctl = '/proc/sys/%s' % (path) + self.assertTrue(os.path.exists(sysctl),"%s does not exist" % (sysctl)) + file(sysctl,'w').write(str(desired)) + self._test_sysctl_value(path, desired) + + def kernel_at_least(self, introduced): + return self.version_compare(self.kernel_version_ubuntu, + introduced) >= 0 + + def kernel_claims_cve_fixed(self, cve): + changelog = "/usr/share/doc/linux-image-%s/changelog.Debian.gz" % (self.kernel_version) + if os.path.exists(changelog): + for line in gzip.open(changelog): + if cve in line and not "revert" in line and not "Revert" in line: + return True + return False + +class TestGroup: + '''Create a temporary test group and remove it again in the dtor.''' + + def __init__(self, group=None, lower=False): + '''Create a new group''' + + self.group = None + if group: + if group_exists(group): + raise ValueError, 'group name already exists' + else: + while(True): + group = random_string(7,lower=lower) + if not group_exists(group): + break + + assert subprocess.call(['groupadd',group]) == 0 + self.group = group + g = grp.getgrnam(self.group) + self.gid = g[2] + + def __del__(self): + '''Remove the created group.''' + + if self.group: + rc, report = cmd(['groupdel', self.group]) + assert rc == 0 + +class TestUser: + '''Create a temporary test user and remove it again in the dtor.''' + + def __init__(self, login=None, home=True, group=None, uidmin=None, lower=False, shell=None): + '''Create a new user account with a random password. + + By default, the login name is random, too, but can be explicitly + specified with 'login'. By default, a home directory is created, this + can be suppressed with 'home=False'.''' + + self.login = None + + if os.geteuid() != 0: + raise ValueError, "You must be root to run this test" + + if login: + if login_exists(login): + raise ValueError, 'login name already exists' + else: + while(True): + login = 't' + random_string(7,lower=lower) + if not login_exists(login): + break + + self.salt = random_string(2) + self.password = random_string(8,lower=lower) + self.crypted = crypt.crypt(self.password, self.salt) + + creation = ['useradd', '-p', self.crypted] + if home: + creation += ['-m'] + if group: + creation += ['-G',group] + if uidmin: + creation += ['-K','UID_MIN=%d'%uidmin] + if shell: + creation += ['-s',shell] + creation += [login] + assert subprocess.call(creation) == 0 + # Set GECOS + assert subprocess.call(['usermod','-c','Buddy %s' % (login),login]) == 0 + + self.login = login + p = pwd.getpwnam(self.login) + self.uid = p[2] + self.gid = p[3] + self.gecos = p[4] + self.home = p[5] + self.shell = p[6] + + def __del__(self): + '''Remove the created user account.''' + + if self.login: + # sanity check the login name so we don't accidentally wipe too much + if len(self.login)>3 and not '/' in self.login: + subprocess.call(['rm','-rf', '/home/'+self.login, '/var/mail/'+self.login]) + rc, report = cmd(['userdel', '-f', self.login]) + assert rc == 0 + + def add_to_group(self, group): + '''Add user to the specified group name''' + rc, report = cmd(['usermod', '-G', group, self.login]) + if rc != 0: + print report + assert rc == 0 + +# Timeout handler using alarm() from John P. Speno's Pythonic Avocado +class TimeoutFunctionException(Exception): + """Exception to raise on a timeout""" + pass +class TimeoutFunction: + def __init__(self, function, timeout): + self.timeout = timeout + self.function = function + + def handle_timeout(self, signum, frame): + raise TimeoutFunctionException() + + def __call__(self, *args, **kwargs): + old = signal.signal(signal.SIGALRM, self.handle_timeout) + signal.alarm(self.timeout) + try: + result = self.function(*args, **kwargs) + finally: + signal.signal(signal.SIGALRM, old) + signal.alarm(0) + return result + +def main(): + print "hi" + unittest.main() From 476bccbdb39457dc31ffa9a1ce3e98d030605b04 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Fri, 21 Jun 2013 17:29:14 +0200 Subject: [PATCH 071/240] debian/nut-monitor.menu, nut-monitor.xpm: Add Debian menu entry (Closes: #708813) --- debian/changelog | 2 + debian/nut-monitor.install | 1 + debian/nut-monitor.menu | 4 + debian/nut-monitor.xpm | 326 +++++++++++++++++++++++++++++++++++++ 4 files changed, 333 insertions(+) create mode 100644 debian/nut-monitor.menu create mode 100644 debian/nut-monitor.xpm diff --git a/debian/changelog b/debian/changelog index 411a8be..17d90e1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,6 +10,8 @@ nut (2.6.5-3) UNRELEASED; urgency=low getting updated during build - Use canonical URL for the VCS-* fields * Added dep-8-tests to improve QA (from Ubuntu, closes: #708130) + * debian/nut-monitor.menu, nut-monitor.xpm: Add Debian menu entry (Closes: + #708813) [ Ivo De Decker ] * debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done diff --git a/debian/nut-monitor.install b/debian/nut-monitor.install index 612e8f3..6cbef89 100644 --- a/debian/nut-monitor.install +++ b/debian/nut-monitor.install @@ -4,3 +4,4 @@ scripts/python/app/gui-*.glade usr/share/nut-monitor/ scripts/python/app/locale/ usr/share/ scripts/python/app/nut-monitor.png usr/share/pixmaps/ scripts/python/app/pixmaps usr/share/nut-monitor/ +debian/nut-monitor.xpm usr/share/pixmaps/ diff --git a/debian/nut-monitor.menu b/debian/nut-monitor.menu new file mode 100644 index 0000000..2b849cb --- /dev/null +++ b/debian/nut-monitor.menu @@ -0,0 +1,4 @@ +?package(nut-monitor): needs="X11" section="Applications/System/Monitoring"\ + title="NUT Monitor" command="/usr/bin/NUT-Monitor"\ + icon="/usr/share/pixmaps/nut-monitor.xpm"\ + longtitle="Network UPS Tools GUI client" diff --git a/debian/nut-monitor.xpm b/debian/nut-monitor.xpm new file mode 100644 index 0000000..6bfa642 --- /dev/null +++ b/debian/nut-monitor.xpm @@ -0,0 +1,326 @@ +/* XPM */ +static char * nut_monitor_xpm[] = { +"32 32 291 2", +" c None", +". c #C7A509", +"+ c #D0B123", +"@ c #CEAF21", +"# c #CBAB15", +"$ c #C5A305", +"% c #C4A100", +"& c #CAAB1A", +"* c #E0C74E", +"= c #E0C949", +"- c #ECDA6F", +"; c #FCF6C6", +"> c #FDF7B5", +", c #E8D663", +"' c #CEAF0E", +") c #CAA915", +"! c #DFC858", +"~ c #D1B42E", +"{ c #C29E00", +"] c #D6BB34", +"^ c #FBEE92", +"/ c #FFF792", +"( c #FEF07A", +"_ c #F9E857", +": c #F6E558", +"< c #F5E55D", +"[ c #EED500", +"} c #D7B800", +"| c #CCAB00", +"1 c #CAA80A", +"2 c #EFDA59", +"3 c #EFDC69", +"4 c #F0E289", +"5 c #DBC350", +"6 c #C8A714", +"7 c #BE9700", +"8 c #FFFEAA", +"9 c #FCE955", +"0 c #FCED74", +"a c #FCF194", +"b c #FDF4AD", +"c c #F5E565", +"d c #EFD91D", +"e c #E6CA00", +"f c #D2B000", +"g c #D0B226", +"h c #EAD65F", +"i c #EDD852", +"j c #E9D037", +"k c #E6CC2E", +"l c #ECD856", +"m c #CDAF23", +"n c #BD9500", +"o c #FFFFD2", +"p c #FCED72", +"q c #FCEE7A", +"r c #FDF087", +"s c #FDF195", +"t c #FDF4AB", +"u c #FEF8C2", +"v c #FEF9C0", +"w c #FEF5AA", +"x c #FBEE8A", +"y c #F4E269", +"z c #F4E058", +"A c #F0DA49", +"B c #EDD851", +"C c #EBD96F", +"D c #CCAD23", +"E c #BC9400", +"F c #FFFFD9", +"G c #FDF5B0", +"H c #FDFAD9", +"I c #FDF9D4", +"J c #FEF9D8", +"K c #FEFBE3", +"L c #FFFDEA", +"M c #FFFCE4", +"N c #FEFAD4", +"O c #FBF3B8", +"P c #F5E99B", +"Q c #EBDA75", +"R c #E0CA52", +"S c #D8C03D", +"T c #D6BE48", +"U c #CCAC21", +"V c #FFFFD6", +"W c #FDF3A5", +"X c #FDF9D0", +"Y c #FCF4B9", +"Z c #F9F2AB", +"` c #F5E561", +" . c #F1DE3B", +".. c #EFD91C", +"+. c #E8CF1B", +"@. c #E0C61C", +"#. c #DBC01E", +"$. c #D9BD21", +"%. c #D6BA26", +"&. c #D5B729", +"*. c #D7BD43", +"=. c #FFFFD4", +"-. c #FCF3A2", +";. c #FDF9CE", +">. c #FBF4B9", +",. c #FAF2AA", +"'. c #F5E86D", +"). c #F3E14B", +"!. c #F0DC2D", +"~. c #EAD329", +"{. c #E1C927", +"]. c #DCC224", +"^. c #D9BD23", +"/. c #D5B921", +"(. c #D2B522", +"_. c #D3BA3E", +":. c #CBAC22", +"<. c #A68E1A", +"[. c #FFFCD8", +"}. c #FCF2A0", +"|. c #FEF8C9", +"1. c #FCF4B1", +"2. c #FAF1A2", +"3. c #F5E666", +"4. c #F2E045", +"5. c #F0DB28", +"6. c #E8D123", +"7. c #E1C720", +"8. c #DCC01D", +"9. c #D9BC1A", +"0. c #D7B916", +"a. c #D3B41A", +"b. c #C8B140", +"c. c #B6A34A", +"d. c #777B7D", +"e. c #EFF0ED", +"f. c #DCDECF", +"g. c #F0EEDC", +"h. c #F2ECC0", +"i. c #F4EDA6", +"j. c #F2E568", +"k. c #F2DF3E", +"l. c #F4DD12", +"m. c #EBD118", +"n. c #DDC420", +"o. c #D1BA27", +"p. c #C0AD37", +"q. c #A5994E", +"r. c #898464", +"s. c #7F8077", +"t. c #8F9396", +"u. c #72746E", +"v. c #D8DAD4", +"w. c #E7E8E5", +"x. c #E0E2E1", +"y. c #DBDDDE", +"z. c #CACDD3", +"A. c #C2C6CD", +"B. c #B7BBC8", +"C. c #A9AFB8", +"D. c #9CA0A7", +"E. c #8E9396", +"F. c #848888", +"G. c #7E7F7B", +"H. c #76786F", +"I. c #7B7C77", +"J. c #8C8E8A", +"K. c #676965", +"L. c #EFF1EE", +"M. c #D6D9D4", +"N. c #E4E5E3", +"O. c #DFE0DC", +"P. c #D9DCD7", +"Q. c #CCCEC8", +"R. c #C4C7BF", +"S. c #BABDB5", +"T. c #ADAFA7", +"U. c #9FA199", +"V. c #91938B", +"W. c #84877F", +"X. c #7B7D76", +"Y. c #71736E", +"Z. c #787975", +"`. c #858783", +" + c #5F615C", +".+ c #EFF0EE", +"++ c #D5D8D3", +"@+ c #E3E5E1", +"#+ c #DCDDDA", +"$+ c #D6D9D5", +"%+ c #C9CCC7", +"&+ c #C2C5BE", +"*+ c #B8BBB4", +"=+ c #ABAEA6", +"-+ c #9C9F97", +";+ c #8E9089", +">+ c #81847D", +",+ c #787A74", +"'+ c #6E716B", +")+ c #757772", +"!+ c #7E807C", +"~+ c #555752", +"{+ c #D5D7D3", +"]+ c #E0E2DE", +"^+ c #DADBD8", +"/+ c #D4D6D1", +"(+ c #C8CAC5", +"_+ c #C1C4BD", +":+ c #B6B9B3", +"<+ c #A9ACA4", +"[+ c #999C95", +"}+ c #8A8D85", +"|+ c #7F827B", +"1+ c #767771", +"2+ c #6D6F6A", +"3+ c #757773", +"4+ c #777975", +"5+ c #4B4E49", +"6+ c #F0F2EE", +"7+ c #D3D6D1", +"8+ c #DEE0DE", +"9+ c #D8D9D6", +"0+ c #D1D3CF", +"a+ c #C6C8C3", +"b+ c #BFC2BB", +"c+ c #B5B8B1", +"d+ c #A6A9A2", +"e+ c #989B93", +"f+ c #767773", +"g+ c #70726F", +"h+ c #434540", +"i+ c #D2D5D0", +"j+ c #DCDDDB", +"k+ c #D4D6D2", +"l+ c #CED0CB", +"m+ c #C5C7C2", +"n+ c #BEC1BA", +"o+ c #B4B7B0", +"p+ c #A7AAA2", +"q+ c #767874", +"r+ c #6A6C68", +"s+ c #424440", +"t+ c #EFF1ED", +"u+ c #D1D4CF", +"v+ c #DADCD8", +"w+ c #D3D5D0", +"x+ c #CCCFC9", +"y+ c #C4C7C1", +"z+ c #6A6B68", +"A+ c #41433F", +"B+ c #EDEFEC", +"C+ c #D2D5CF", +"D+ c #D9DAD7", +"E+ c #D2D4CF", +"F+ c #CBCEC8", +"G+ c #D7D9D5", +"H+ c #D1D3CE", +"I+ c #CBCDC8", +"J+ c #8A8C85", +"K+ c #7D8079", +"L+ c #696B65", +"M+ c #7F807C", +"N+ c #6A6C69", +"O+ c #81827E", +"P+ c #DEE0DD", +"Q+ c #F1F2EF", +"R+ c #DEE0DC", +"S+ c #CFD2CC", +"T+ c #C3C6C0", +"U+ c #BBBEB7", +"V+ c #ADB0A9", +"W+ c #A2A59D", +"X+ c #979A92", +"Y+ c #8F928A", +"Z+ c #92948F", +"`+ c #9D9E99", +" @ c #A9AAA6", +".@ c #868784", +"+@ c #4B4D49", +"@@ c #5E605B", +"#@ c #959794", +"$@ c #AEAFAC", +"%@ c #B6B8B5", +"&@ c #BABCB8", +"*@ c #BDBEBB", +"=@ c #B4B6B2", +"-@ c #AAABA7", +";@ c #9E9F9B", +">@ c #888986", +",@ c #686A66", +"'@ c #454743", +" ", +" ", +" ", +" ", +" ", +" ", +" . + @ # $ ", +" % & * = - ; > , ' ) ! ~ { ", +" ] ^ / ( _ : < [ } | 1 2 3 4 5 6 ", +" 7 8 9 0 a b c d e f g h i j k l m ", +" n o p q r s t u v w x y z A B C D ", +" E F G H I J K L M N O P Q R S T U ", +" E V W X Y Z ` ...+.@.#.$.%.&.*.U ", +" E =.-.;.>.,.'.).!.~.{.].^./.(._.:. ", +" <.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c. ", +" d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t. ", +" u.e.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J. ", +" K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. ", +" +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+ ", +" ~+.+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+ ", +" 5+6+7+8+9+0+a+b+c+d+e+}+|+1+2+f+g+ ", +" h+6+i+j+k+l+m+n+o+p+e+}+|+1+2+q+r+ ", +" s+t+u+v+w+x+y+n+o+p+e+}+|+1+2+q+z+ ", +" A+B+C+D+E+F+y+n+o+p+e+}+|+1+2+4+z+ ", +" s+6+7+G+H+I+y+n+c+p+e+J+K+u.L+M+N+ ", +" O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@ ", +" A+@@#@$@%@&@*@=@-@;@>@,@'@ ", +" ", +" ", +" ", +" ", +" "}; From 65234e6c7b5eb087f662c60f51bbb69b4c5ce817 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Fri, 21 Jun 2013 17:37:48 +0200 Subject: [PATCH 072/240] debian/control: Add missing Testsuite field --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index 475f3eb..f58e3a2 100644 --- a/debian/control +++ b/debian/control @@ -24,6 +24,7 @@ Homepage: http://www.networkupstools.org/ Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/nut.git;a=summary Vcs-Git: git://anonscm.debian.org/collab-maint/nut.git X-Python-Version: >= 2.5 +XS-Testsuite: autopkgtest Package: nut Architecture: all From a60005575faaf44f3314b6659325d63b50af675d Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Wed, 26 Jun 2013 18:48:42 +0200 Subject: [PATCH 073/240] debian/rules: Drop manual creation of .service files symlink, this should be handled by dh_systemd now --- debian/changelog | 4 +++- debian/rules | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/debian/changelog b/debian/changelog index 17d90e1..6df125c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,13 +12,15 @@ nut (2.6.5-3) UNRELEASED; urgency=low * Added dep-8-tests to improve QA (from Ubuntu, closes: #708130) * debian/nut-monitor.menu, nut-monitor.xpm: Add Debian menu entry (Closes: #708813) + * debian/rules: Drop manual creation of .service files symlink, this should + be handled by dh_systemd now [ Ivo De Decker ] * debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done by postinst during upgrade from lenny to squeeze (Really closes: #677054) Thanks to Andreas Beckmann for the review. - -- Laurent Bigonville Tue, 18 Jun 2013 21:49:12 +0200 + -- Laurent Bigonville Wed, 26 Jun 2013 18:47:52 +0200 nut (2.6.5-2) experimental; urgency=low diff --git a/debian/rules b/debian/rules index 425a353..06213c6 100755 --- a/debian/rules +++ b/debian/rules @@ -85,11 +85,6 @@ ifeq (linux,$(DEB_HOST_ARCH_OS)) $(CURDIR)/debian/nut-client/usr/lib/tmpfiles.d/nut-client.conf install -m 644 -D $(CURDIR)/debian/nut-server.tmpfiles \ $(CURDIR)/debian/nut-server/usr/lib/tmpfiles.d/nut-server.conf - - # This is needed to avoid services to be started twice (systemd and LSB) - mkdir -p $(CURDIR)/debian/nut-client/etc/systemd/system/ - ln -s /lib/systemd/system/nut-monitor.service \ - $(CURDIR)/debian/nut-client/etc/systemd/system/nut-client.service endif common-install-indep:: From 38742dde537f22a2fd220d1d9f678569a08e8793 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 6 Jul 2013 16:26:58 +0200 Subject: [PATCH 074/240] Add build-dependency against dh-systemd and bump minimal cdbs version so systemd helpers are called during build. --- debian/changelog | 4 +++- debian/control | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 6df125c..4f36d30 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,6 +9,8 @@ nut (2.6.5-3) UNRELEASED; urgency=low - Add autotools-dev to the build-dependencies so config.{guess,sub} are getting updated during build - Use canonical URL for the VCS-* fields + - Add build-dependency against dh-systemd and bump minimal cdbs version so + systemd helpers are called during build. * Added dep-8-tests to improve QA (from Ubuntu, closes: #708130) * debian/nut-monitor.menu, nut-monitor.xpm: Add Debian menu entry (Closes: #708813) @@ -20,7 +22,7 @@ nut (2.6.5-3) UNRELEASED; urgency=low by postinst during upgrade from lenny to squeeze (Really closes: #677054) Thanks to Andreas Beckmann for the review. - -- Laurent Bigonville Wed, 26 Jun 2013 18:47:52 +0200 + -- Laurent Bigonville Sat, 06 Jul 2013 16:25:00 +0200 nut (2.6.5-2) experimental; urgency=low diff --git a/debian/control b/debian/control index f58e3a2..14f1fec 100644 --- a/debian/control +++ b/debian/control @@ -4,8 +4,9 @@ Priority: optional Maintainer: Arnaud Quette Uploaders: Laurent Bigonville Build-Depends: debhelper (>= 8.1.3), - cdbs (>= 0.4.93~), + cdbs (>= 0.4.122~), autotools-dev, + dh-systemd (>= 1.4), libgd-dev | libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, libusb-dev (>= 0.1.8), From fd9b4809ec28d45e69f825bda4233aef875331d1 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Wed, 10 Jul 2013 22:13:44 +0200 Subject: [PATCH 075/240] debian/patches/0004-fix-systemd-service.patch: Also add Wants/Before for systemd-udev-settle.service in the nut-driver.service as it got renamed after udev merge --- debian/changelog | 5 ++++- debian/patches/0004-fix-systemd-service.patch | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 4f36d30..6c1bb63 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,13 +16,16 @@ nut (2.6.5-3) UNRELEASED; urgency=low #708813) * debian/rules: Drop manual creation of .service files symlink, this should be handled by dh_systemd now + * debian/patches/0004-fix-systemd-service.patch: Also add Wants/Before for + systemd-udev-settle.service in the nut-driver.service as it got renamed + after udev merge [ Ivo De Decker ] * debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done by postinst during upgrade from lenny to squeeze (Really closes: #677054) Thanks to Andreas Beckmann for the review. - -- Laurent Bigonville Sat, 06 Jul 2013 16:25:00 +0200 + -- Laurent Bigonville Wed, 10 Jul 2013 22:12:22 +0200 nut (2.6.5-2) experimental; urgency=low diff --git a/debian/patches/0004-fix-systemd-service.patch b/debian/patches/0004-fix-systemd-service.patch index 9465687..02d4825 100644 --- a/debian/patches/0004-fix-systemd-service.patch +++ b/debian/patches/0004-fix-systemd-service.patch @@ -8,8 +8,8 @@ Forwarded: not-needed [Unit] Description=Network UPS Tools - power device driver controller -After=local-fs.target network.target -+After=local-fs.target network.target udev-settle.service -+Wants=udev-settle.service ++After=local-fs.target network.target udev-settle.service systemd-udev-settle.service ++Wants=udev-settle.service systemd-udev-settle.service StopWhenUnneeded=yes [Service] From 154f28c325d8b7c1efdfd61032b63b26d8fae645 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Wed, 10 Jul 2013 22:48:24 +0200 Subject: [PATCH 076/240] debian/patches/0004-fix-systemd-service.patch: Fix path for upsdrvctl in scripts/systemd/nutshutdown.in --- debian/changelog | 4 +++- debian/patches/0004-fix-systemd-service.patch | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 6c1bb63..35ee448 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,13 +19,15 @@ nut (2.6.5-3) UNRELEASED; urgency=low * debian/patches/0004-fix-systemd-service.patch: Also add Wants/Before for systemd-udev-settle.service in the nut-driver.service as it got renamed after udev merge + * debian/patches/0004-fix-systemd-service.patch: Fix path for upsdrvctl in + scripts/systemd/nutshutdown.in [ Ivo De Decker ] * debian/nut-client.preinst: also revert /etc/nut/nut.conf mangling done by postinst during upgrade from lenny to squeeze (Really closes: #677054) Thanks to Andreas Beckmann for the review. - -- Laurent Bigonville Wed, 10 Jul 2013 22:12:22 +0200 + -- Laurent Bigonville Wed, 10 Jul 2013 22:47:23 +0200 nut (2.6.5-2) experimental; urgency=low diff --git a/debian/patches/0004-fix-systemd-service.patch b/debian/patches/0004-fix-systemd-service.patch index 02d4825..d33a250 100644 --- a/debian/patches/0004-fix-systemd-service.patch +++ b/debian/patches/0004-fix-systemd-service.patch @@ -26,3 +26,9 @@ Forwarded: not-needed [Install] WantedBy=multi-user.target +Alias=nut-client.service +--- a/scripts/systemd/nutshutdown.in ++++ b/scripts/systemd/nutshutdown.in +@@ -1,2 +1,2 @@ + #!/bin/sh +-@SBINDIR@/upsmon -K >/dev/null 2>&1 && @driverexecdir@/upsdrvctl shutdown ++@SBINDIR@/upsmon -K >/dev/null 2>&1 && @SBINDIR@/upsdrvctl shutdown From 4c61ee613e3fa30c78f53a08b6fd9d581f523955 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 11 Jul 2013 00:50:18 +0200 Subject: [PATCH 077/240] Release to unstable --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 35ee448..935da5e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nut (2.6.5-3) UNRELEASED; urgency=low +nut (2.6.5-3) unstable; urgency=low [ Laurent Bigonville ] * debian/control: @@ -27,7 +27,7 @@ nut (2.6.5-3) UNRELEASED; urgency=low by postinst during upgrade from lenny to squeeze (Really closes: #677054) Thanks to Andreas Beckmann for the review. - -- Laurent Bigonville Wed, 10 Jul 2013 22:47:23 +0200 + -- Laurent Bigonville Thu, 11 Jul 2013 00:50:06 +0200 nut (2.6.5-2) experimental; urgency=low From 8157c709a1894b0ccb8f23889defafb503d412f0 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 11 Jul 2013 12:13:31 +0200 Subject: [PATCH 078/240] debian/control: Do not build nut-ipmi on hurd-i386 as freeipmi is not available on that platform. --- debian/changelog | 7 +++++++ debian/control | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 935da5e..e9e8a6f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nut (2.6.5-4) UNRELEASED; urgency=low + + * debian/control: Do not build nut-ipmi on hurd-i386 as freeipmi is not + available on that platform. + + -- Laurent Bigonville Thu, 11 Jul 2013 12:12:51 +0200 + nut (2.6.5-3) unstable; urgency=low [ Laurent Bigonville ] diff --git a/debian/control b/debian/control index 14f1fec..66a37a8 100644 --- a/debian/control +++ b/debian/control @@ -14,8 +14,8 @@ Build-Depends: debhelper (>= 8.1.3), libpowerman0-dev (>= 2.3.3), libwrap0-dev (>= 7.6), python (>= 2.6.6-3~), - libfreeipmi-dev (>= 0.8.5), - libipmimonitoring-dev (>= 1.1.5-2) + libfreeipmi-dev (>= 0.8.5) [!hurd-i386], + libipmimonitoring-dev (>= 1.1.5-2) [!hurd-i386] Build-Depends-Indep: asciidoc (>= 8.6.3), docbook-xsl, dblatex (>= 0.2.5), @@ -107,7 +107,7 @@ Description: network UPS tools - SNMP driver Manager interface to the core NUT system. Package: nut-ipmi -Architecture: any +Architecture: linux-any kfreebsd-any Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 1.4.1-pre1) Description: network UPS tools - IPMI driver Network UPS Tools (NUT) is a client/server monitoring system that From 9b4acffd6cbf531ed84327b21e026b1e14ba8183 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Thu, 11 Jul 2013 12:30:04 +0200 Subject: [PATCH 079/240] Release to unstable --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index e9e8a6f..976cbaa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,9 @@ -nut (2.6.5-4) UNRELEASED; urgency=low +nut (2.6.5-4) unstable; urgency=low * debian/control: Do not build nut-ipmi on hurd-i386 as freeipmi is not available on that platform. - -- Laurent Bigonville Thu, 11 Jul 2013 12:12:51 +0200 + -- Laurent Bigonville Thu, 11 Jul 2013 12:29:58 +0200 nut (2.6.5-3) unstable; urgency=low From 0121794af9f287cdd41161f64b85daaffdb54ae2 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 24 Nov 2013 16:00:12 +0100 Subject: [PATCH 080/240] Imported Upstream version 2.7.1 --- ChangeLog | 7047 ++++++++++------- MAINTAINERS | 4 + Makefile.am | 26 +- Makefile.in | 149 +- NEWS | 86 +- README | 7 +- UPGRADING | 22 + aclocal.m4 | 81 +- clients/Makefile.am | 12 +- clients/Makefile.in | 175 +- clients/cgilib.h | 12 + clients/nutclient.cpp | 1726 ++++ clients/nutclient.h | 963 +++ clients/status.h | 13 + clients/upsc.c | 9 + clients/upsclient.c | 680 +- clients/upsclient.h | 40 +- clients/upscmd.c | 9 + clients/upsimagearg.h | 13 + clients/upslog.c | 9 + clients/upslog.h | 13 + clients/upsmon.c | 94 +- clients/upsmon.h | 12 + clients/upsrw.c | 19 +- clients/upssched.h | 13 + clients/upsstats.h | 13 + common/Makefile.in | 50 +- common/common.c | 62 + conf/Makefile.am | 2 +- conf/Makefile.in | 79 +- conf/upsd.conf.sample | 47 +- conf/upsmon.conf.sample | 84 +- conf/upsmon.conf.sample.in | 377 + config.guess | 49 +- config.sub | 74 +- configure | 1296 +-- configure.in | 89 +- data/Makefile.in | 81 +- data/cmdvartab | 3 + data/driver.list.in | 254 +- data/html/Makefile.in | 70 +- depcomp | 190 +- docs/FAQ.txt | 20 +- docs/Makefile.am | 44 +- docs/Makefile.in | 98 +- docs/acknowledgements.txt | 22 +- docs/configure.txt | 9 +- docs/developers.txt | 300 +- docs/download.txt | 54 +- docs/hid-subdrivers.txt | 4 +- docs/macros.txt | 3 +- docs/man/Makefile.am | 120 +- docs/man/Makefile.in | 250 +- docs/man/al175.8 | 187 + docs/man/al175.txt | 73 + docs/man/apcsmart-old.8 | 8 +- docs/man/apcsmart.8 | 36 +- docs/man/apcsmart.txt | 24 + docs/man/apcupsd-ups.8 | 357 + docs/man/apcupsd-ups.txt | 107 + docs/man/asciidoc.conf | 21 - docs/man/bcmxcp.8 | 8 +- docs/man/bcmxcp_usb.8 | 8 +- docs/man/belkin.8 | 8 +- docs/man/belkinunv.8 | 8 +- docs/man/bestfcom.8 | 8 +- docs/man/bestfortress.8 | 8 +- docs/man/bestuferrups.8 | 8 +- docs/man/bestups.8 | 8 +- docs/man/{blazer.txt => blazer-common.txt} | 55 +- docs/man/blazer_ser.8 | 271 + docs/man/blazer_ser.txt | 10 + docs/man/{blazer.8 => blazer_usb.8} | 81 +- docs/man/blazer_usb.txt | 11 + docs/man/clone.8 | 8 +- docs/man/dummy-ups.8 | 8 +- docs/man/etapro.8 | 8 +- docs/man/everups.8 | 8 +- docs/man/gamatronic.8 | 8 +- docs/man/genericups.8 | 10 +- docs/man/genericups.txt | 3 +- docs/man/hosts.conf.5 | 8 +- docs/man/isbmex.8 | 8 +- docs/man/ivtscd.8 | 8 +- docs/man/libnutclient.3 | 55 + docs/man/libnutclient.txt | 52 + docs/man/libnutclient_commands.3 | 65 + docs/man/libnutclient_commands.txt | 47 + docs/man/libnutclient_devices.3 | 60 + docs/man/libnutclient_devices.txt | 43 + docs/man/libnutclient_general.3 | 67 + docs/man/libnutclient_general.txt | 45 + docs/man/libnutclient_misc.3 | 71 + docs/man/libnutclient_misc.txt | 52 + docs/man/libnutclient_tcp.3 | 73 + docs/man/libnutclient_tcp.txt | 54 + docs/man/libnutclient_variables.3 | 78 + docs/man/libnutclient_variables.txt | 64 + docs/man/libupsclient-config.1 | 8 +- docs/man/liebert-esp2.8 | 8 +- docs/man/liebert.8 | 8 +- docs/man/macosx-ups.8 | 8 +- docs/man/masterguard.8 | 8 +- docs/man/metasys.8 | 8 +- docs/man/mge-shut.8 | 8 +- docs/man/mge-utalk.8 | 8 +- docs/man/microdowell.8 | 8 +- docs/man/netxml-ups.8 | 25 +- docs/man/netxml-ups.txt | 14 + docs/man/nut-ipmipsu.8 | 8 +- docs/man/nut-recorder.8 | 12 +- docs/man/nut-recorder.txt | 8 +- docs/man/nut-scanner.8 | 262 +- docs/man/nut-scanner.txt | 129 +- docs/man/nut.conf.5 | 8 +- docs/man/nutclient_authenticate.3 | 1 + docs/man/nutclient_destroy.3 | 1 + docs/man/nutclient_device_forced_shutdown.3 | 1 + docs/man/nutclient_device_login.3 | 1 + docs/man/nutclient_device_master.3 | 1 + docs/man/nutclient_execute_device_command.3 | 1 + ...nutclient_get_device_command_description.3 | 1 + docs/man/nutclient_get_device_commands.3 | 1 + docs/man/nutclient_get_device_description.3 | 1 + docs/man/nutclient_get_device_num_logins.3 | 1 + docs/man/nutclient_get_device_rw_variables.3 | 1 + ...utclient_get_device_variable_description.3 | 1 + .../nutclient_get_device_variable_values.3 | 1 + docs/man/nutclient_get_device_variables.3 | 1 + docs/man/nutclient_get_devices.3 | 1 + docs/man/nutclient_has_device.3 | 1 + docs/man/nutclient_has_device_command.3 | 1 + docs/man/nutclient_has_device_variable.3 | 1 + docs/man/nutclient_logout.3 | 1 + .../man/nutclient_set_device_variable_value.3 | 1 + .../nutclient_set_device_variable_values.3 | 1 + docs/man/nutclient_tcp_create_client.3 | 1 + docs/man/nutclient_tcp_disconnect.3 | 1 + docs/man/nutclient_tcp_get_timeout.3 | 1 + docs/man/nutclient_tcp_is_connected.3 | 1 + docs/man/nutclient_tcp_reconnect.3 | 1 + docs/man/nutclient_tcp_set_timeout.3 | 1 + docs/man/nutdrv_qx.8 | 1383 ++++ docs/man/nutdrv_qx.txt | 646 ++ docs/man/nutscan.3 | 8 +- docs/man/nutscan_add_device_to_device.3 | 8 +- docs/man/nutscan_add_option_to_device.3 | 8 +- docs/man/nutscan_cidr_to_ip.3 | 8 +- docs/man/nutscan_display_parsable.3 | 8 +- docs/man/nutscan_display_ups_conf.3 | 8 +- docs/man/nutscan_free_device.3 | 8 +- docs/man/nutscan_get_serial_ports_list.3 | 95 + docs/man/nutscan_get_serial_ports_list.txt | 40 + docs/man/nutscan_init.3 | 8 +- docs/man/nutscan_new_device.3 | 8 +- docs/man/nutscan_scan_avahi.3 | 10 +- docs/man/nutscan_scan_avahi.txt | 1 + docs/man/nutscan_scan_eaton_serial.3 | 51 + docs/man/nutscan_scan_eaton_serial.txt | 40 + docs/man/nutscan_scan_ipmi.3 | 10 +- docs/man/nutscan_scan_ipmi.txt | 3 +- docs/man/nutscan_scan_nut.3 | 10 +- docs/man/nutscan_scan_nut.txt | 3 +- docs/man/nutscan_scan_snmp.3 | 10 +- docs/man/nutscan_scan_snmp.txt | 3 +- docs/man/nutscan_scan_usb.3 | 10 +- docs/man/nutscan_scan_usb.txt | 2 +- docs/man/nutscan_scan_xml_http.3 | 10 +- docs/man/nutscan_scan_xml_http.txt | 2 +- docs/man/nutupsdrv.8 | 10 +- docs/man/nutupsdrv.txt | 5 +- docs/man/oneac.8 | 8 +- docs/man/optiups.8 | 8 +- docs/man/powercom.8 | 8 +- docs/man/powerman-pdu.8 | 8 +- docs/man/powerpanel.8 | 8 +- docs/man/rhino.8 | 8 +- docs/man/richcomm_usb.8 | 8 +- docs/man/riello_ser.8 | 67 + docs/man/riello_ser.txt | 43 + docs/man/riello_usb.8 | 67 + docs/man/riello_usb.txt | 42 + docs/man/safenet.8 | 8 +- docs/man/snmp-ups.8 | 19 +- docs/man/snmp-ups.txt | 14 +- docs/man/solis.8 | 8 +- docs/man/tripplite.8 | 8 +- docs/man/tripplite_usb.8 | 8 +- docs/man/tripplitesu.8 | 8 +- docs/man/ups.conf.5 | 8 +- docs/man/upsc.8 | 11 +- docs/man/upsc.txt | 8 + docs/man/upscli_add_host_cert.3 | 52 + docs/man/upscli_add_host_cert.txt | 35 + docs/man/upscli_cleanup.3 | 49 + docs/man/upscli_cleanup.txt | 29 + docs/man/upscli_connect.3 | 8 +- docs/man/upscli_disconnect.3 | 8 +- docs/man/upscli_fd.3 | 8 +- docs/man/upscli_get.3 | 8 +- docs/man/upscli_init.3 | 58 + docs/man/upscli_init.txt | 48 + docs/man/upscli_list_next.3 | 8 +- docs/man/upscli_list_start.3 | 8 +- docs/man/upscli_readline.3 | 8 +- docs/man/upscli_sendline.3 | 8 +- docs/man/upscli_splitaddr.3 | 8 +- docs/man/upscli_splitname.3 | 8 +- docs/man/upscli_ssl.3 | 8 +- docs/man/upscli_strerror.3 | 8 +- docs/man/upscli_upserror.3 | 8 +- docs/man/upsclient.3 | 17 +- docs/man/upsclient.txt | 14 + docs/man/upscmd.8 | 10 +- docs/man/upscmd.txt | 3 + docs/man/upscode2.8 | 8 +- docs/man/upsd.8 | 8 +- docs/man/upsd.conf.5 | 65 +- docs/man/upsd.conf.txt | 26 +- docs/man/upsd.users.5 | 8 +- docs/man/upsdrvctl.8 | 8 +- docs/man/upsimage.cgi.8 | 8 +- docs/man/upslog.8 | 8 +- docs/man/upsmon.8 | 8 +- docs/man/upsmon.conf.5 | 56 +- docs/man/upsmon.conf.txt | 57 +- docs/man/upsrw.8 | 10 +- docs/man/upsrw.txt | 3 + docs/man/upssched.8 | 8 +- docs/man/upssched.conf.5 | 8 +- docs/man/upsset.cgi.8 | 8 +- docs/man/upsset.conf.5 | 8 +- docs/man/upsstats.cgi.8 | 8 +- docs/man/upsstats.html.5 | 8 +- docs/man/usbhid-ups.8 | 13 +- docs/man/usbhid-ups.txt | 5 + docs/man/victronups.8 | 8 +- docs/new-clients.txt | 65 +- docs/new-drivers.txt | 28 +- docs/nut-names.txt | 6 +- docs/nut-qa.txt | 22 +- docs/nut.dict | 55 + docs/nutdrv_qx-subdrivers.txt | 661 ++ docs/security.txt | 205 +- docs/snmp-subdrivers.txt | 287 + docs/stable-hcl.txt | 55 +- docs/website/Makefile.am | 8 +- docs/website/Makefile.in | 54 +- docs/website/css/web-layout.css | 92 +- docs/website/news.txt | 24 +- docs/website/old-news.txt | 63 + docs/website/projects.txt | 61 +- docs/website/scripts/nut_jquery.js | 983 ++- docs/website/web-layout.conf | 3 +- drivers/Makefile.am | 56 +- drivers/Makefile.in | 722 +- drivers/al175.c | 1292 +++ drivers/apc-hid.c | 38 +- drivers/apc-hid.h | 2 + drivers/apcsmart.c | 1431 ++-- drivers/apcsmart.h | 51 +- drivers/apcsmart_tabs.c | 90 +- drivers/apcsmart_tabs.h | 18 +- drivers/apcupsd-ups.c | 290 + drivers/apcupsd-ups.h | 137 + drivers/bcmxcp.c | 1139 +-- drivers/bcmxcp.h | 901 ++- drivers/bcmxcp_io.h | 2 +- drivers/bcmxcp_ser.c | 46 +- drivers/bcmxcp_usb.c | 68 +- drivers/belkin-hid.c | 2 +- drivers/bestfcom.c | 2 +- drivers/blazer.c | 64 +- drivers/blazer_ser.c | 5 +- drivers/blazer_usb.c | 16 +- drivers/cps-hid.c | 7 +- drivers/delta_ups-mib.c | 361 + drivers/delta_ups-mib.h | 29 + drivers/dstate-hal.c | 12 +- drivers/dstate-hal.h | 1 + drivers/idowell-hid.c | 4 +- drivers/ietf-mib.c | 24 +- drivers/libhid.c | 12 +- drivers/libshut.c | 4 +- drivers/libusb.c | 7 +- drivers/liebert-hid.c | 3 +- drivers/mge-hid.c | 23 +- drivers/mge-utalk.c | 16 +- drivers/mge-utalk.h | 2 +- drivers/mge-xml.c | 423 +- drivers/mge-xml.h | 37 + drivers/netxml-ups.c | 1118 ++- drivers/nut-ipmipsu.c | 15 +- drivers/nut-libfreeipmi.c | 381 +- drivers/nutdrv_qx.c | 2439 ++++++ drivers/nutdrv_qx.h | 172 + drivers/nutdrv_qx_blazer-common.c | 355 + drivers/nutdrv_qx_blazer-common.h | 41 + drivers/nutdrv_qx_mecer.c | 143 + drivers/nutdrv_qx_mecer.h | 29 + drivers/nutdrv_qx_megatec-old.c | 141 + drivers/nutdrv_qx_megatec-old.h | 29 + drivers/nutdrv_qx_megatec.c | 141 + drivers/nutdrv_qx_megatec.h | 29 + drivers/nutdrv_qx_mustek.c | 141 + drivers/nutdrv_qx_mustek.h | 29 + drivers/nutdrv_qx_voltronic.c | 4209 ++++++++++ drivers/nutdrv_qx_voltronic.h | 29 + drivers/nutdrv_qx_zinto.c | 141 + drivers/nutdrv_qx_zinto.h | 29 + drivers/openups-hid.c | 360 + drivers/openups-hid.h | 38 + drivers/powercom-hid.c | 16 +- drivers/powercom.c | 2 - drivers/powercom.h | 2 - drivers/powerman-pdu.c | 8 +- drivers/powerp-txt.c | 66 +- drivers/powerpanel.c | 5 +- drivers/powerware-mib.c | 16 +- drivers/richcomm_usb.c | 2 +- drivers/riello.c | 1016 +++ drivers/riello.h | 179 + drivers/riello_ser.c | 1055 +++ drivers/riello_usb.c | 1064 +++ drivers/serial.c | 40 +- drivers/serial.h | 2 + drivers/snmp-ups.c | 302 +- drivers/snmp-ups.h | 7 +- drivers/tripplite-hid.c | 11 +- drivers/tripplite_usb.c | 189 +- drivers/upscode2.c | 1 - drivers/usb-common.c | 8 +- drivers/usb-common.h | 4 +- drivers/usbhid-ups.c | 16 +- include/Makefile.am | 22 +- include/Makefile.in | 159 +- include/common.h | 13 + include/config.h.in | 17 +- include/extstate.h | 12 + include/nut_platform.h | 125 + include/proto.h | 12 + include/state.h | 12 + include/upsconf.h | 12 + install-sh | 29 +- lib/Makefile.am | 2 +- lib/Makefile.in | 81 +- lib/README | 1 + lib/libnutclient.pc.in | 13 + ltmain.sh | 95 +- m4/libtool.m4 | 302 +- m4/ltoptions.m4 | 19 +- m4/ltversion.m4 | 10 +- m4/nut_check_libfreeipmi.m4 | 1 - m4/nut_check_libnss.m4 | 75 + m4/nut_check_libopenssl.m4 | 76 + m4/nut_check_libssl.m4 | 72 - m4/nut_check_os.m4 | 4 +- missing | 53 +- scripts/HP-UX/Makefile | 51 - scripts/HP-UX/nut.psf.in | 312 +- scripts/HP-UX/postinstall.in | 81 + scripts/Makefile.am | 5 +- scripts/Makefile.in | 62 +- scripts/README | 1 - scripts/Solaris/Makefile.am | 17 + scripts/{java => Solaris}/Makefile.in | 99 +- scripts/Solaris/makelocal.sh | 5 + scripts/Solaris/nut.in | 63 + scripts/Solaris/pkginfo.in | 11 + scripts/Solaris/postinstall.in | 65 + scripts/Solaris/preremove.in | 8 + scripts/augeas/Makefile.in | 46 +- scripts/augeas/nutupsconf.aug.in | 27 +- scripts/hal/Makefile.in | 61 +- scripts/hal/ups-nut-device.fdi.in | 29 + scripts/hotplug/Makefile.in | 70 +- scripts/hotplug/libhid.usermap | 10 + scripts/java/Makefile.am | 15 - scripts/java/README | 19 - scripts/java/jNut/README | 77 - scripts/java/jNut/pom.xml | 40 - .../java/org/networkupstools/jnut/Client.java | 619 -- .../org/networkupstools/jnut/Command.java | 100 - .../java/org/networkupstools/jnut/Device.java | 279 - .../networkupstools/jnut/NutException.java | 107 - .../jnut/StringLineSocket.java | 137 - .../org/networkupstools/jnut/Variable.java | 120 - .../org/networkupstools/jnut/ClientTest.java | 113 - scripts/java/jNutList/README | 30 - scripts/java/jNutList/pom.xml | 62 - .../org/networkupstools/jnutlist/AppList.java | 112 - scripts/python/Makefile.am | 1 + scripts/python/Makefile.in | 47 +- scripts/python/app/NUT-Monitor | 2 +- scripts/python/app/gui-1.3.glade | 3 +- .../app/locale/it/LC_MESSAGES/NUT-Monitor.mo | Bin 0 -> 6462 bytes scripts/python/app/nut-monitor.desktop | 1 + ...o-subdriver.sh => gen-usbhid-subdriver.sh} | 14 +- scripts/systemd/Makefile.in | 70 +- scripts/systemd/nut-driver.service.in | 4 +- scripts/udev/Makefile.in | 61 +- scripts/udev/nut-usbups.rules.in | 10 + scripts/upower/95-upower-hid.rules | 5 + server/Makefile.in | 55 +- server/conf.c | 29 +- server/conf.h | 15 +- server/desc.h | 14 + server/netcmds.h | 13 + server/netget.h | 13 + server/netinstcmd.h | 13 + server/netlist.h | 13 + server/netmisc.h | 13 + server/netset.h | 13 + server/netssl.c | 458 +- server/netssl.h | 38 +- server/netuser.h | 13 + server/nut_ctype.h | 19 +- server/sstate.h | 12 + server/stype.h | 12 + server/upsd.c | 14 +- server/upsd.h | 12 + server/upstype.h | 12 + server/user-data.h | 13 + server/user.h | 13 + tests/Makefile.in | 61 +- tools/Makefile.am | 2 +- tools/Makefile.in | 59 +- tools/gitlog2changelog.py | 125 + tools/nut-hclinfo.py | 2 +- tools/nut-scanner/Makefile.am | 16 +- tools/nut-scanner/Makefile.in | 141 +- tools/nut-scanner/nut-scan.h | 56 +- tools/nut-scanner/nut-scanner.c | 118 +- tools/nut-scanner/nutscan-device.c | 75 +- tools/nut-scanner/nutscan-device.h | 38 +- tools/nut-scanner/nutscan-display.c | 18 +- tools/nut-scanner/nutscan-init.h | 13 + tools/nut-scanner/nutscan-ip.h | 13 + tools/nut-scanner/nutscan-serial.c | 196 + tools/nut-scanner/nutscan-serial.h | 24 + tools/nut-scanner/nutscan-snmp.h | 17 +- tools/nut-scanner/nutscan-usb.h | 3 + tools/nut-scanner/scan_avahi.c | 2 +- tools/nut-scanner/scan_eaton_serial.c | 439 + tools/nut-scanner/scan_ipmi.c | 322 +- tools/nut-scanner/scan_nut.c | 15 +- tools/nut-scanner/scan_snmp.c | 2 +- tools/nut-scanner/scan_usb.c | 8 +- tools/nut-scanner/scan_xml_http.c | 2 +- tools/nut-usbinfo.pl | 6 + tools/svn2cl.authors | 21 - 451 files changed, 41339 insertions(+), 10887 deletions(-) create mode 100644 clients/nutclient.cpp create mode 100644 clients/nutclient.h create mode 100644 conf/upsmon.conf.sample.in create mode 100644 docs/man/al175.8 create mode 100644 docs/man/al175.txt create mode 100644 docs/man/apcupsd-ups.8 create mode 100644 docs/man/apcupsd-ups.txt rename docs/man/{blazer.txt => blazer-common.txt} (94%) create mode 100644 docs/man/blazer_ser.8 create mode 100644 docs/man/blazer_ser.txt rename docs/man/{blazer.8 => blazer_usb.8} (90%) create mode 100644 docs/man/blazer_usb.txt create mode 100644 docs/man/libnutclient.3 create mode 100644 docs/man/libnutclient.txt create mode 100644 docs/man/libnutclient_commands.3 create mode 100644 docs/man/libnutclient_commands.txt create mode 100644 docs/man/libnutclient_devices.3 create mode 100644 docs/man/libnutclient_devices.txt create mode 100644 docs/man/libnutclient_general.3 create mode 100644 docs/man/libnutclient_general.txt create mode 100644 docs/man/libnutclient_misc.3 create mode 100644 docs/man/libnutclient_misc.txt create mode 100644 docs/man/libnutclient_tcp.3 create mode 100644 docs/man/libnutclient_tcp.txt create mode 100644 docs/man/libnutclient_variables.3 create mode 100644 docs/man/libnutclient_variables.txt create mode 100644 docs/man/nutclient_authenticate.3 create mode 100644 docs/man/nutclient_destroy.3 create mode 100644 docs/man/nutclient_device_forced_shutdown.3 create mode 100644 docs/man/nutclient_device_login.3 create mode 100644 docs/man/nutclient_device_master.3 create mode 100644 docs/man/nutclient_execute_device_command.3 create mode 100644 docs/man/nutclient_get_device_command_description.3 create mode 100644 docs/man/nutclient_get_device_commands.3 create mode 100644 docs/man/nutclient_get_device_description.3 create mode 100644 docs/man/nutclient_get_device_num_logins.3 create mode 100644 docs/man/nutclient_get_device_rw_variables.3 create mode 100644 docs/man/nutclient_get_device_variable_description.3 create mode 100644 docs/man/nutclient_get_device_variable_values.3 create mode 100644 docs/man/nutclient_get_device_variables.3 create mode 100644 docs/man/nutclient_get_devices.3 create mode 100644 docs/man/nutclient_has_device.3 create mode 100644 docs/man/nutclient_has_device_command.3 create mode 100644 docs/man/nutclient_has_device_variable.3 create mode 100644 docs/man/nutclient_logout.3 create mode 100644 docs/man/nutclient_set_device_variable_value.3 create mode 100644 docs/man/nutclient_set_device_variable_values.3 create mode 100644 docs/man/nutclient_tcp_create_client.3 create mode 100644 docs/man/nutclient_tcp_disconnect.3 create mode 100644 docs/man/nutclient_tcp_get_timeout.3 create mode 100644 docs/man/nutclient_tcp_is_connected.3 create mode 100644 docs/man/nutclient_tcp_reconnect.3 create mode 100644 docs/man/nutclient_tcp_set_timeout.3 create mode 100644 docs/man/nutdrv_qx.8 create mode 100644 docs/man/nutdrv_qx.txt create mode 100644 docs/man/nutscan_get_serial_ports_list.3 create mode 100644 docs/man/nutscan_get_serial_ports_list.txt create mode 100644 docs/man/nutscan_scan_eaton_serial.3 create mode 100644 docs/man/nutscan_scan_eaton_serial.txt create mode 100644 docs/man/riello_ser.8 create mode 100644 docs/man/riello_ser.txt create mode 100644 docs/man/riello_usb.8 create mode 100644 docs/man/riello_usb.txt create mode 100644 docs/man/upscli_add_host_cert.3 create mode 100644 docs/man/upscli_add_host_cert.txt create mode 100644 docs/man/upscli_cleanup.3 create mode 100644 docs/man/upscli_cleanup.txt create mode 100644 docs/man/upscli_init.3 create mode 100644 docs/man/upscli_init.txt create mode 100644 docs/nut.dict create mode 100644 docs/nutdrv_qx-subdrivers.txt create mode 100644 docs/snmp-subdrivers.txt create mode 100644 docs/website/old-news.txt create mode 100644 drivers/al175.c create mode 100644 drivers/apcupsd-ups.c create mode 100644 drivers/apcupsd-ups.h create mode 100644 drivers/delta_ups-mib.c create mode 100644 drivers/delta_ups-mib.h create mode 100644 drivers/nutdrv_qx.c create mode 100644 drivers/nutdrv_qx.h create mode 100644 drivers/nutdrv_qx_blazer-common.c create mode 100644 drivers/nutdrv_qx_blazer-common.h create mode 100644 drivers/nutdrv_qx_mecer.c create mode 100644 drivers/nutdrv_qx_mecer.h create mode 100644 drivers/nutdrv_qx_megatec-old.c create mode 100644 drivers/nutdrv_qx_megatec-old.h create mode 100644 drivers/nutdrv_qx_megatec.c create mode 100644 drivers/nutdrv_qx_megatec.h create mode 100644 drivers/nutdrv_qx_mustek.c create mode 100644 drivers/nutdrv_qx_mustek.h create mode 100644 drivers/nutdrv_qx_voltronic.c create mode 100644 drivers/nutdrv_qx_voltronic.h create mode 100644 drivers/nutdrv_qx_zinto.c create mode 100644 drivers/nutdrv_qx_zinto.h create mode 100644 drivers/openups-hid.c create mode 100644 drivers/openups-hid.h create mode 100644 drivers/riello.c create mode 100644 drivers/riello.h create mode 100644 drivers/riello_ser.c create mode 100644 drivers/riello_usb.c create mode 100644 include/nut_platform.h create mode 100644 lib/libnutclient.pc.in mode change 100755 => 100644 ltmain.sh create mode 100644 m4/nut_check_libnss.m4 create mode 100644 m4/nut_check_libopenssl.m4 delete mode 100644 m4/nut_check_libssl.m4 delete mode 100644 scripts/HP-UX/Makefile create mode 100644 scripts/HP-UX/postinstall.in create mode 100644 scripts/Solaris/Makefile.am rename scripts/{java => Solaris}/Makefile.in (80%) create mode 100755 scripts/Solaris/makelocal.sh create mode 100644 scripts/Solaris/nut.in create mode 100644 scripts/Solaris/pkginfo.in create mode 100644 scripts/Solaris/postinstall.in create mode 100644 scripts/Solaris/preremove.in delete mode 100644 scripts/java/Makefile.am delete mode 100644 scripts/java/README delete mode 100644 scripts/java/jNut/README delete mode 100644 scripts/java/jNut/pom.xml delete mode 100644 scripts/java/jNut/src/main/java/org/networkupstools/jnut/Client.java delete mode 100644 scripts/java/jNut/src/main/java/org/networkupstools/jnut/Command.java delete mode 100644 scripts/java/jNut/src/main/java/org/networkupstools/jnut/Device.java delete mode 100644 scripts/java/jNut/src/main/java/org/networkupstools/jnut/NutException.java delete mode 100644 scripts/java/jNut/src/main/java/org/networkupstools/jnut/StringLineSocket.java delete mode 100644 scripts/java/jNut/src/main/java/org/networkupstools/jnut/Variable.java delete mode 100644 scripts/java/jNut/src/test/java/org/networkupstools/jnut/ClientTest.java delete mode 100644 scripts/java/jNutList/README delete mode 100644 scripts/java/jNutList/pom.xml delete mode 100644 scripts/java/jNutList/src/main/java/org/networkupstools/jnutlist/AppList.java create mode 100644 scripts/python/app/locale/it/LC_MESSAGES/NUT-Monitor.mo rename scripts/subdriver/{path-to-subdriver.sh => gen-usbhid-subdriver.sh} (95%) create mode 100755 tools/gitlog2changelog.py create mode 100644 tools/nut-scanner/nutscan-serial.c create mode 100644 tools/nut-scanner/nutscan-serial.h create mode 100644 tools/nut-scanner/scan_eaton_serial.c delete mode 100644 tools/svn2cl.authors diff --git a/ChangeLog b/ChangeLog index 79f040f..7188f00 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,728 +1,2423 @@ +2013-11-19 Charles Lepple + + * configure.in: configure: update version to 2.7.1 + * docs/website/news.txt: news: add 2.7.1 release + * Makefile.am: ChangeLog: use full path to generator script + * docs/website/projects.txt: website: update related project links + +2013-11-18 Arnaud Quette + + * NEWS: Minor reordering of the news + +2013-11-18 Kirill Smelkov + + * MAINTAINERS, docs/man/.gitignore, docs/man/Makefile.am, + docs/man/al175.txt, docs/man/index.txt, docs/man/nutupsdrv.txt, + docs/new-drivers.txt, drivers/Makefile.am, drivers/al175.c: al175: + updated driver, please restore it Back in 2005 I was young and + idealistic, that's why you finally marked al175 as 'broken', but + now I understand your points (some) and that in NUT you need good + portability. So this time I've checked that al175 compiles with + CC="gcc -std=c89 -pedantic", and CC="gcc -std=c99 -pedantic" Also, + I've tried to clean-up the driver based on feedback from 2009, but + unfortunately I no longer have hardware to test and will not have + any in foreseable future, so the driver was reworked to meet the + project code quality criteria, without testing on real hardware. + Some bugs may have crept in. Changes since last posting in 2009: + - patch rebased on top of current master (v2.6.5-400-g214c442); - + added reference to COMLI communication protocol document; - status + decode errors go to log, instead of setting non-conformant status + like "?T", "?OOST", etc. For such errors new loglevel is + allocated; - "High Battery" status is back; - converted tracing + macros to direct use of upsdebugx and numbers 1,2,3,4 for loglevels + as requested (but now lines got longer because of explicit __func__ + usage); - lowered usage of other macros (e.g. REVERSE_BITS + inlined); - alarm(3) is not used anymore - instead whole I/O + transaction time budget is maintained manually; - man page + converted to asciidoc and supported variables list is merged into + it; - upsdebug_ascii moved to common.c and to separate patch. + ~~~~ Changes since al175 was removed from NUT tree in 2008: - + alloca was eliminated through the help of automatic variables - + debugging/tracing were reworked to (almost always) use NUT builtins + - al175 now uses 3 debug levels for (1=user-level info, 2=protocol + debugging, 3=I/O tracing) - rechecked + http://eu1.networkupstools.org/doc/2.2.0/developers.html and + applied where apporpiate Also > This driver does not support + upsdrv_shutdown(), which makes > it not very useful in a real world + application. This alone > warrants 'experimental' status, but for + the below mentioned > reasons (to name a few), it's flagged + 'broken' instead. Yes, at present shutdown is not supported, and + unfortunately now I don't have AL175 hardware at hand, so that I + can't write it and verify the implementation. I've marked the + driver as DRV_EXPERIMENTAL, although it was tested by us as part of + our systems to work OK for more than three years in production + environment on ships (and we don't need shutdown there -- in + critical situations the system has to operate as long as possible, + untill the battery is empty) Also, all of the previous issues + listed below are now fixed in this al175 version: - ‘return’ + with a value, in function returning void (2x) - anonymous variadic + macros were introduced in C99 - C++ style comments are not allowed + in ISO C90 - ISO C forbids braced-groups within expressions (5x) - + ISO C90 forbids specifying subobject to initialize (16x) - ISO C99 + requires rest arguments to be used (18x) Yes, "All the world is + not an x86 Linux box," and I've tried to make all the world happy. + Please apply. Thanks, Kirill. + * common/common.c, docs/developers.txt, include/common.h: common: + upsdebug_ascii() - to dump a message in ascii For debugging ASCII- + based protocols with control characters (e.g. COMLI) it is handy to + dump messages not in hex, but in ascii with human readable codes. + Add utility function to do it. + +2013-11-17 Charles Lepple + + * docs/man/.gitignore, drivers/.gitignore: apcupsd-ups: ignore + generated files + * drivers/apcupsd-ups.c: apcupsd-ups: fix cut-n-paste error + * drivers/apcupsd-ups.c: apcupsd-ups 0.04: use O_NONBLOCK instead of + FIONBIO + * NEWS, docs/man/index.txt: apcupsd-ups: add NEWS and man page link + * UPGRADING: Mention upsrw output change. + * docs/man/nut-recorder.txt: Reword nut-recorder man page + * UPGRADING: UPGRADING: link to man pages for changed drivers + * configure.in: Bump version to 2.7.1-pre2 + * NEWS, UPGRADING: Update NEWS and UPGRADING for 2.7.1 Closes: + networkupstools#37 + * data/driver.list.in: HCL: StarPower PCF-800VA Reported by Don. + Reference: http://news.gmane.org/find-root.php?message_id=%3cCAPO%2 + bLDnApF3ALNfp%5fwaVpHqSuJ9sajKCKXPXLLsAWUWww7Of%3dw%40mail.gmail.co + m%3e + * data/driver.list.in: HCL: Atlantis Land A03-P551(V1.2) supported by + blazer_usb Reported by Giovanni Panozzo. Reference: + http://news.gmane.org/find- + root.php?message_id=%3c51B76B0C.1080109%40panozzo.it%3e Note that + blazer_usb will eventually be replaced by nutdrv_qx. + * clients/nutclient.h, clients/upsclient.c, + conf/upsmon.conf.sample.in, configure.in, docs/FAQ.txt, + docs/man/libnutclient.txt, docs/man/libnutclient_general.txt, + docs/man/upsmon.conf.txt, docs/security.txt, drivers/powerman- + pdu.c, server/netssl.c: Replace 'connexion' with 'connection' in + English contexts Also reworded a few phrases surrounding the + replacements. + * docs/man/.gitignore: asciidoc: ignore all generated blazer*.html + files + * data/driver.list.in: HCL: update CyberPower entries, including + CP900AVR Reported by Craig Duttweiler Reference: + http://news.gmane.org/find- + root.php?message_id=%3c51295F86.4080601%40twistedsanity.net%3e + * docs/stable-hcl.txt: GitHub issues can also be used to report HCL + updates + * docs/website/projects.txt: Update links to related projects + * docs/download.txt: Update download page * Re-added link to + Buildbot snapshot generator * Updated a few links + +2013-11-13 Daniele Pezzini + + * docs/man/.gitignore, drivers/.gitignore: Add nutdrv_qx to + .gitignore files and remove voltronic from them + +2013-11-12 Charles Lepple + + * docs/man/Makefile.am: a2x: use --destination-dir This option seems + to work now. Previously, Asciidoc source files were copied to the + destination directory, but this did not account for included files. + +2013-11-12 Daniele Pezzini + + * docs/man/nutdrv_qx.txt: nutdrv_qx: fix cross links in manpage + Remove links to voltronic manuals. Fix links to blazer manuals. + +2013-11-12 Charles Lepple + + * .gitignore: git: ignore test-driver, and sort ignores list test- + driver is apparently part of automake, generated for libcpp unit + tests. + +2013-11-10 Charles Lepple + + * docs/man/Makefile.am: Include blazer-common.txt in built tarball + +2013-11-10 Daniele Pezzini + + * clients/upsrw.c: upsrw: publish also the maximum length of STRING + rw variables + +2013-11-09 Daniele Pezzini + + * docs/website/scripts/nut_jquery.js: HCL: Improve readability of + nut_jquery.js + * docs/website/scripts/nut_jquery.js: HCL: make support-level filter + show items with a 'higher or equal' level Reference: https://githu + b.com/networkupstools/nut/issues/48#issuecomment-28134135 + * data/driver.list.in: nutdrv_qx: readd HCL's items lost with the + revert of the voltronic merge + * data/driver.list.in: nutdrv_qx: remove superfluous indications from + the HCL + * data/driver.list.in, docs/Makefile.am, docs/blzr-subdrivers.txt, + docs/man/Makefile.am, docs/man/blzr.txt, docs/man/index.txt, + docs/man/nutdrv_qx.txt, docs/man/nutupsdrv.txt, docs/new- + drivers.txt, docs/nutdrv_qx-subdrivers.txt, drivers/Makefile.am, + drivers/blzr.c, drivers/blzr.h, drivers/blzr_blazer-common.c, + drivers/blzr_blazer-common.h, drivers/blzr_mecer.c, + drivers/blzr_mecer.h, drivers/blzr_megatec-old.c, drivers + /blzr_megatec-old.h, drivers/blzr_megatec.c, + drivers/blzr_megatec.h, drivers/blzr_mustek.c, + drivers/blzr_mustek.h, drivers/blzr_voltronic.c, + drivers/blzr_voltronic.h, drivers/blzr_zinto.c, + drivers/blzr_zinto.h, drivers/nutdrv_qx.c, drivers/nutdrv_qx.h, + drivers/nutdrv_qx_blazer-common.c, drivers/nutdrv_qx_blazer- + common.h, drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_mecer.h, + drivers/nutdrv_qx_megatec-old.c, drivers/nutdrv_qx_megatec-old.h, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_megatec.h, + drivers/nutdrv_qx_mustek.c, drivers/nutdrv_qx_mustek.h, + drivers/nutdrv_qx_voltronic.c, drivers/nutdrv_qx_voltronic.h, + drivers/nutdrv_qx_zinto.c, drivers/nutdrv_qx_zinto.h, tools/nut- + usbinfo.pl: nutdrv_qx: rename 'blzr' driver to 'nutdrv_qx' + Reference: http://lists.alioth.debian.org/pipermail/nut- + upsdev/2013-November/006555.html + * docs/stable-hcl.txt, docs/website/css/web-layout.css: Address Issue + #48 (text-based browsers) Reference: https://github.com/networkups + tools/nut/issues/48#issuecomment-28107101 + +2013-11-08 Arnaud Quette + + * docs/website/projects.txt: Cleanup NUT related projects + +2013-10-25 Daniele Pezzini + + * drivers/blazer.c: blazer: Support UPSes that reply '(ACK' when an + instant command succeeds + * drivers/blazer.c: blazer: Fix a discrepancy in the handling of + instant commands Check if the reply we got back from the UPS is + 'ACK' also for the commands stored in the array. + +2013-10-17 Daniele Pezzini + + * docs/man/blazer-common.txt: blazer: Cosmetic changes + * drivers/blazer_ser.c, drivers/blazer_usb.c: blazer: Fix + blazer_{ser,usb} + TESTING Those things are useless when TESTING + is defined + * docs/man/blazer-common.txt: blazer: Fix user manuals + {Serial,USB}-specific sections belong to 'Extra arguments' section + * drivers/blazer_ser.c, drivers/blazer_usb.c: blazer: Versioning + * drivers/blazer.c: blazer: Add more log infos in instcmd + +2013-10-16 Daniele Pezzini + + * docs/man/Makefile.am, docs/man/blazer-common.txt, + docs/man/blazer.txt, docs/man/blazer_ser.txt, + docs/man/blazer_usb.txt, docs/man/index.txt, + docs/man/nutupsdrv.txt: blazer: Fix {usb,ser} manual Split the old + blazer manual in two manuals named after their executables with a + common source. + * docs/man/blazer.txt: blazer: Fix user manual Fix minor errors Add + ranges Fix test.battery.start (i.e. minutes instead of seconds) + * drivers/blazer.c: blazer: Fix shutdown sequence Split stop pending + shutdown and shutdown itself so that if we have problems stopping + the shutdown (e.g. there's no shutdown pending and the UPS, because + of that, echoes back the command) we can still shutdown the UPS. + * drivers/blazer.c: blazer: Fix minor error in battery guesstimation + We need both battery.voltage.low and battery.voltage.high to + 'guesstimate' the battery charge + * drivers/blazer.c: blazer: Fix test.battery.start T00 doesn't make + any sense: the range should be 01-99 minutes + * drivers/blazer.c: blazer: Fix shutdown.return 'SnR0000' is meant + to put the UPS down and not return 'Sn' should be used instead when + ondelay is 0 + * drivers/blazer.c: blazer: Fix shutdown delay 'offdelay' as used by + this driver is meant to be in the .2-.9 (12..54 seconds) and 01-10 + (60..600 seconds) range. + +2013-11-03 Charles Lepple + + * data/driver.list.in, docs/man/.gitignore, docs/man/Makefile.am, + docs/man/index.txt, docs/man/voltronic_ser.txt, + docs/man/voltronic_usb.txt, drivers/Makefile.am, + drivers/voltronic.c, drivers/voltronic.h, drivers/voltronic_ser.c, + drivers/voltronic_usb.c, tools/nut-usbinfo.pl: Revert "Merge branch + 'voltronic-driver'" This reverts commit + de07fc7f5e7f68b91507b2bf3d4d3b92b774c3ed, reversing changes made to + a074844f88ca352780dd881b5fa3c435832d165e. The voltronic + funtionality will be a subdriver of the new blazer driver. + +2013-11-04 Daniele Pezzini + + * drivers/blzr_voltronic.c: blzr: Fix log message + * drivers/blzr_voltronic.c: blzr: Fix compile-time error Reference: + http://lists.alioth.debian.org/pipermail/nut- + upsdev/2013-November/006549.html + +2013-10-25 Daniele Pezzini + + * drivers/blzr.c: blzr: Cosmetic changes + * drivers/blzr_megatec-old.c, drivers/blzr_megatec.c, + drivers/blzr_mustek.c, drivers/blzr_zinto.c: blzr: Remove + duplicates in the testing struct + +2013-11-04 Daniele Pezzini + + * drivers/blzr_blazer-common.c, drivers/blzr_blazer-common.h: blzr: + Fix blzr_blazer-common.{c,h} header comments + +2013-10-25 Daniele Pezzini + + * docs/blzr-subdrivers.txt, docs/man/blzr.txt, drivers/Makefile.am, + drivers/blzr.c, drivers/blzr_mecer.c, drivers/blzr_mecer.h: blzr: + Add Mecer subdiver (blzr protocol=mecer) A subdriver covering an + idiom similar to the one used by the megatec subdriver, but with + these peculiarities: - if a command/query is rejected or invalid, + the UPS will reply '(NAK\r' - if a command succeeds, the UPS will + reply '(ACK\r' + +2013-10-17 Daniele Pezzini + + * docs/blzr-subdrivers.txt: blzr: Improve developer manual Add note + on how to group items in blzr2nut array. + * drivers/blzr_voltronic.c: blzr: Fix switch/case Forgot to break at + the end of the case + * docs/man/blzr.txt, drivers/blzr.c, drivers/blzr_voltronic.c: blzr: + Cosmetic changes + +2013-10-16 Daniele Pezzini + + * data/driver.list.in, docs/Makefile.am, docs/blzr-subdrivers.txt, + docs/man/Makefile.am, docs/man/blzr.txt, docs/man/index.txt, + docs/man/nutupsdrv.txt, docs/new-drivers.txt, drivers/Makefile.am, + drivers/blzr.c, drivers/blzr.h, drivers/blzr_blazer-common.c, + drivers/blzr_blazer-common.h, drivers/blzr_megatec-old.c, drivers + /blzr_megatec-old.h, drivers/blzr_megatec.c, + drivers/blzr_megatec.h, drivers/blzr_mustek.c, + drivers/blzr_mustek.h, drivers/blzr_voltronic.c, + drivers/blzr_voltronic.h, drivers/blzr_zinto.c, + drivers/blzr_zinto.h, drivers/dstate-hal.c, drivers/dstate-hal.h, + tools/nut-usbinfo.pl: blzr: New driver 'blzr' New driver for Q* + UPSes. Based on blazer, usbhid-ups and voltronic driver. This + might address Issue #25 + +2013-11-04 Charles Lepple + + * include/Makefile.am: nut_include.h: fail gracefully if git fails + Fix proposed by Jim Klimov. + +2013-11-03 Charles Lepple + + * docs/stable-hcl.txt: HCL: typos + * data/driver.list.in, docs/stable-hcl.txt: HCL: minor cleanup + Remove a duplicate Tripp Lite entry, and add a missing "a". + * docs/stable-hcl.txt: HCL documentation: reword + * data/driver.list.in, docs/acknowledgements.txt: HCL: incorporate + Tripp Lite test results Source: + http://article.gmane.org/gmane.comp.monitoring.nut.user/8173 + * docs/Makefile.am, docs/website/Makefile.am: HCL: additional + dependencies Apparently still not complete, though. + * docs/website/scripts/nut_jquery.js: HCL JavaScript: make key case- + insensitive Also special-case the spelling change for Tripp Lite. + TODO: make the value matching case-insensitive as well. + * docs/website/scripts/nut_jquery.js: HCL JavaScript: update the USB- + matching code Slightly more accurate, but later on we should + really track the connection type as a first-class attribute for + each entry in the HCL. Matching the driver name is brittle. + * docs/website/scripts/nut_jquery.js, tools/nut-hclinfo.py: HCL + generation: don't combine driver names The Python and JavaScript + code for generating the HCL was combining adjacent drivers even + when the support level was different. This clutters up the driver + list a bit, but presents a more accurate picture of support levels. + +2013-10-28 Michal Soltys + + * docs/man/apcsmart.txt: apcsmart: minor man update A short note + about availabilty of apcsmart-old. + * docs/man/apcsmart.txt, drivers/apcsmart.c, drivers/apcsmart.h: + apcsmart: string/comment/text trivial changes + +2013-10-27 Charles Lepple + + * tools/nut-scanner/nutscan-device.c: [nut-scanner] Remove unused + variable + +2013-10-18 Vaclav Krpec + + * tools/nut-scanner/nutscan-device.c, tools/nut-scanner/nutscan- + device.h, tools/nut-scanner/nutscan-display.c, tools/nut- + scanner/scan_nut.c: Nutscan fix and enhancement Closes #60 (GitHub + Pull Request via fbohe) + * docs/man/netxml-ups.txt, drivers/mge-xml.c, drivers/mge-xml.h, + drivers/netxml-ups.c: netxml: added RW access, fixed FSD/shutdown + duration bugs, etc. * Fixed bugs in resolution of FSD condition + and computation of shutdown duration. * Added System.* UPS + variables. * Enabled RW access to appropriate UPS variables. * + Added UPS veriables value convertors. * Added support for XML + protocol v3 {GET|SET}_OBJECT query implementing getvar and setvar + routines. * netxml driver man page updated to include info about + the driver-specific configuration parameters. Closes #59 (GitHub + pull request: "Enhancement for netxml driver") Pull request by: + Frédéric BOHE + * clients/upsc.c, clients/upscmd.c, clients/upslog.c, + clients/upsrw.c: Fix AIX linkage of do_upsconf_args() Closes #58 + (GitHub pull request "Fix AIX build") (cherry picked from commit + 5fc7518f97d2738d791c3c77f2257d05e3a9da3b) + +2013-10-26 Charles Lepple + + * configure.in: Define _REENTRANT for all Solaris and AIX platforms. + This is essentially the final commit in pull request #39. + +2013-10-24 Frédéric BOHE + + * drivers/mge-hid.c: Fix wrong OFF status reported when on battery. + UPS.BatterySystem.Charger.PresentStatus.Used is not related to UPS + outputs being on or off but rather to the charger being on or off. + +2013-10-16 Daniele Pezzini + + * scripts/python/Makefile.am, scripts/python/app/gui-1.3.glade, + .../app/locale/it/LC_MESSAGES/NUT-Monitor.mo, + scripts/python/app/locale/it/it.po, scripts/python/app/nut- + monitor.desktop: Add italian translation + * scripts/python/app/locale/fr/fr.po: Add source of french + translation + * scripts/python/app/gui-1.3.glade.h, scripts/python/app/locale/NUT- + Monitor.pot: Add translation sources + +2013-10-16 Frédéric BOHE + + * drivers/powerware-mib.c, drivers/snmp-ups.c, drivers/snmp-ups.h: + Fix Low Battery detection with ConnectUPS cards The low battery + OID itself cannot be read directly. Low battery alarms OID appears + in an alarm array. + +2013-10-02 Arnaud Quette + + * data/driver.list.in: [HCL] Add support for Eaton 5S Add Eaton 5S + (USB ID 0x0463:0xffff) to the list of usbhid-ups supported models + (reported by Matt Ivie) + +2013-10-02 Frédéric BOHE + + * data/driver.list.in: [HCL] update Eaton UPS + +2013-09-30 Frédéric BOHE + + * drivers/libshut.c: Increment driver revision + +2013-09-28 Alf Høgemark + + * drivers/bcmxcp.c: bcmxcp: Fix handling of date and time format The + date and time bytes are packed BCD, so it must be properly decoded. + The check for the Julian or Month:Day format was wrong Info on + format taken from http://old.networkupstools.org/protocols/eaton/XC + P_Rev_C1_Public_021309.pdf + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for some + more meters and one more command Add mapping for + PW_SET_TIME_AND_DATE command. Add mapping for input.bypass.voltage, + input.bypass.L1-N.voltage, input.bypass.L2-N.voltage, + input.bypass.L3-N.voltage. Add mapping for input.bypass.frequency. + Add mapping for ups.power.nominal if provided as meter, it was + previously only set on init. Change mapping for ups.realpower for + single phase. Tested on Eaton PW9130. + * drivers/bcmxcp.c: bcmxcp: Remove newline on debug output for + outlets + +2013-09-24 Frédéric BOHE + + * drivers/libshut.c, tools/nut-scanner/scan_eaton_serial.c: Change + RTS init level for PnP devices Setting RTS line to 1 disturbs + communication with some devices using serial plug and play feature. + So we need to initialize it to 0. + +2013-09-07 Arnaud Quette + + * data/driver.list.in: Add support for Forza FX-1500LCD Add Forza + FX-1500LCD (USB ID 0x0665:0x5161) to the list of blazer_usb + supported models (reported by Gabor Tjong A Hung) + * data/driver.list.in: Add Schneider APC AP9630 SNMP management card + Add Schneider APC AP9630 SNMP management card to the list of snmp- + ups supported models. Note that it requires the option + "privProtocol=AES" to work (reported by Tim Rice) + * drivers/.gitignore: Git ignore drivers/voltronic_{ser,usb} Add + drivers/voltronic_{ser,usb} to the list of Git ignored files + +2013-08-28 Charles Lepple + + * packaging/RedHat/.gitignore, packaging/debian/.gitignore, + packaging/mandriva/.gitignore, packaging/opensuse/.gitignore: + Remove .gitignore files from long-gone packaging directory. + +2013-08-28 Daniele Pezzini + + * docs/website/css/web-layout.css: Improve CSS readability + * docs/stable-hcl.txt, docs/website/css/web-layout.css: Address Issue + #48 Move legend out of filters' block. (HTML+CSS) + +2013-08-10 Alf Høgemark + + * drivers/bcmxcp.c: bcmxcp: Add instcmd for system test capabilities + based on what UPS support + +2013-08-09 Alf Høgemark + + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Code restructure, + declare variables at top of method After re-reading code style, + compiled with -pedantic, and got some warnings, so moved variable + declarations to the top of methods + * drivers/bcmxcp.c, drivers/bcmxcp_io.h, drivers/bcmxcp_ser.c, + drivers/bcmxcp_usb.c: bcmxcp: Reformat code, remove tabs in the + middle of lines. No code changes After re-reading the developer + code style guide, use spaces and not tabs in the middle of lines to + align text + * drivers/bcmxcp.h: bcmxcp: Reformat code, remove tabs in the middle + of lines. No code changes After re-reading the developer code + style guide, use spaces and not tabs in the middle of lines to + align text + * drivers/bcmxcp.c: bcmxcp: Refactor code, use if-else if rather than + 4 if statements + +2013-08-08 Alf Høgemark + + * drivers/bcmxcp.c: bcmxcp: Add parameter to nut_find_infoval to + control debug output We do not want debug output if + nut_find_infoval does not find a mapped value in all cases. For + example, when a command byte is not mapped to a instcmd, we do not + want debug output. + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Remove + PW_UPDATE_POWER_SOURCE_STATUS_COMMAND, it seems very unlikely to be + used + * drivers/bcmxcp.h: bcmxcp: Cosmetic changes constant definitions. No + code changes. + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Use command map to + control which instcmd are supported Use the command map info + retrieved from UPS to list all commands supported by the UPS at + debug level 2. Use the info from command map to set up which + instcmd the UPS supports. + * drivers/bcmxcp.c: bcmxcp: Use info_lkp_t structure for mapping + topology info Make code simpler by using the info_lkp_t structure + for mapping value from topology block to text presented to user as + ups.description + * drivers/bcmxcp.c: bcmxcp: Cosmetic commentary fixes and remove some + empty lines. No code changes + * drivers/bcmxcp.c: bcmxcp: Output unsupported alarms on debug level + 3, not level 2 The supported alarms in alarm map is outputted at + debug level 2. The unsupported alarms should be outputted at debug + level 3, it is not that interesting. Also remove debug outputted + empty line after table heading line for meter map and alarm map. + * drivers/bcmxcp.c: bcmxcp: Refactor code for setting which alarms + are supported, to avoid code duplication Refactor the code which + checks the alarm map for supported alarms, by making a new method + which checks the alarm bit to see if the alarm is supported. + * drivers/bcmxcp.c: bcmxcp: Only include ups.serial and device.part + if they have a value Only set info about ups.serial and + device.part if the UPS actually report useful info for these. + Remove the handling of space characters as meaning string + termination for ups.serial, this is not done for part number, and + according to bcmxcp spec are these both 16 byte ascii text + messages. Move Nominal output frequence handling up, placing it + just below Nominal output voltage + +2013-08-04 Charles Lepple + + * docs/man/index.txt, docs/man/voltronic_ser.txt, + docs/man/voltronic_usb.txt: voltronic* documentation updates - Add + to man page index - Reword a few sections - Fix typos - Comment out + USB section in voltronic_ser.txt Long-term, we should probably + figure out a better way to maintain two parallel driver pages like + this. The blazer man page is the same for both, with .so links for + the man pages, but then you have USB info in a serial driver page. + For now, voltronic_usb.txt is just a copy of voltronic_ser.txt with + a few _ser-to-_usb replacements. + +2013-08-01 Daniele Pezzini + + * drivers/voltronic.c: Get rid of 'god.knows' variables + +2013-07-26 Arnaud Quette + + * drivers/powercom-hid.c: Forgotten subdriver version bump + +2013-07-25 Arnaud Quette + + * docs/man/upsc.txt, docs/man/upscmd.txt, docs/man/upsrw.txt: + Complete upsclient commands usage note Add a note for scripting + usage, for upsc, upscmd and upsrw, to state the obvious: only + consider the output from stdout for data requested. stderr may + contain error messages, which can disrupt your script execution. + Address the second task and closes Github issue #30 + * clients/upsclient.c: Fix a minor regression in upsclient output + NSS support has introduced a minor regression in upsclient output. + Clients such as upsc, upscmd and upsrw were particularly affected. + This patch restores a default behavior similar to prior versions. + However, "-v" option remains to be implemented. Address the first + task of Github issue #30 + +2013-07-24 Charles Lepple + + * docs/website/web-layout.conf: Add GitHub link to website sidebar + +2013-07-24 Frédéric BOHE + + * configure.in: Fix wrong errno reported by connect on Solaris + Closes issue #43 + * clients/upsclient.c: Fix connect in multi-threaded environnement on + AIX Closes issue #42 + +2013-07-23 Frédéric BOHE + + * clients/upsclient.c: Fix nut-scanner crash on nut server scan, + upscli_sslinit calls upscli_readline which might calls + upscli_disconnect in case of error. upscli_disconnect frees + ups->host and set it to NULL, so it is illegal to use ups->host + after a call to upscli_sslinit. + +2013-07-23 Charles Lepple + + * clients/Makefile.am: Revert "Fix connect in multi-thread + environnement on Solaris" This reverts the previous commit. It + overwrites the CFLAGS which specifies one of the key include + directories. + +2013-07-23 Frédéric BOHE + + * clients/Makefile.am: Fix connect in multi-thread environnement on + Solaris + * tools/nut-scanner/nutscan-device.c, tools/nut-scanner/nutscan- + device.h, tools/nut-scanner/scan_avahi.c, tools/nut- + scanner/scan_eaton_serial.c, tools/nut-scanner/scan_ipmi.c, tools + /nut-scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools/nut- + scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: [nut- + scanner] Make sure to return the first device of the list. + +2013-07-22 Charles Lepple + + * docs/download.txt: Download information: reference Git + * configure.in: Bump NUT version to 2.7.1-pre1 + +2013-07-21 Charles Lepple + + * include/Makefile.am: nut_version.h: trim tag characters through + first slash + +2013-04-27 Charles Lepple + + * include/Makefile.am: nut_version.h: remove SVN plumbing This + should eliminate the "Unversioned directory" message. The source of + the version information is also listed in nut_version.h Closes + Github issue #15 + +2013-07-16 Sven Putteneers + + * scripts/python/app/NUT-Monitor: NUT-Monitor: parse battery.runtime + as float Without this patch, I get a flood of "Invalid literal for + int with base 10: '28500.00" errors. http://news.gmane.org/find- + root.php?message_id=%3c51E54B99.9030908%40gmail.com%3e + +2013-07-10 Arnaud Quette + + * docs/website/news.txt, docs/website/projects.txt: Reference walNUT + Gnome Shell extension + +2013-07-09 Charles Lepple + + * drivers/riello_ser.c, drivers/riello_usb.c: riello: suppress some + warnings about %lu versus %u + +2013-07-09 Elio Parisi + + * drivers/riello.h, drivers/riello_ser.c, drivers/riello_usb.c: + riello: whitespace fixes, and read nominal values only once Bumped + driver versions to 0.02 + +2013-07-07 Alf Høgemark + + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add support for reading + topology map and setting ups.description based on it + * drivers/bcmxcp.c: bcmxcp: Initialize variables in + calculate_ups_load method + * drivers/bcmxcp.c: bcmxcp: Output more info hardware capabilities in + debug mode Add some more debug output on driver init, to let us + know what the hardware support. Outputs length of alarm history + log, topology block length and maximum supported command length. + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + input.quality to meters + * drivers/bcmxcp.c: bcmxcp: Add Alf Høgemark as one of the authors + for the driver + * drivers/bcmxcp.c: bcmxcp: Only calculate ups.load if the UPS does + not report it directly If the UPS does not report a meter mapped + to ups.load, we try to calculate the ups.load, but we do not + calculate it if the UPS can report the ups.load directly + * drivers/bcmxcp.c: bcmxcp: Use defined constants in setvar, and + handle BCMXCP_RETURN_ACCEPTED_PARAMETER_ADJUST Use the defined + constants from header file, instead of magic numbers in setvar + method. Add handling of BCMXCP_RETURN_ACCEPTED_PARAMETER_ADJUST. + Report upsdrv_comm_good on successful execution of setvar to UPS. + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add handling of + BCMXCP_RETURN_ACCEPTED_PARAMETER_ADJUST and others in ACK block + Add support for handling more return statuses when exeucting + commands, the most important being + BCMXCP_RETURN_ACCEPTED_PARAMETER_ADJUST, which means the command + was executed. The others added all handles cases where command was + not executed, but you now get a more detailed entry in log as to + why it was not executed. + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + output.L.power to meters Not tested on hardware, due to + lack of hardware supporting it + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + battery.current.total to meters Not tested on hardware, due to + lack of hardware supporting it + +2013-07-06 Alf Høgemark + + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + input.realpower to meters input.realpower is not listed in + http://www.networkupstools.org/docs/developer- + guide.chunked/apas01.html, but other drivers use it. Not tested on + hardware, due to lack of hardware supporting it + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + ambient.1.temperature to meters Not tested on hardware, due to + lack of hardware supporting it + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + input.power to meters input.power is not listed in + http://www.networkupstools.org/docs/developer- + guide.chunked/apas01.html, but other drivers use it. Not tested on + hardware, due to lack of hardware supporting it + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + output.powerfactor and input.powerfactor to meters + input.powerfactor is not listed in + http://www.networkupstools.org/docs/developer- + guide.chunked/apas01.html, so a bit unsure if this should be added. + Not tested on hardware, due to lack of hardware supporting it + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add mapping for + output.L.power.percent to meters Not tested on hardware, + due to lack of hardware supporting it + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: map ups.date and + ups.time to meters. Not testes on hardware, due to lack of + hardware supporting it + * drivers/bcmxcp.h: bcmxcp: Comment which meter map constants are + mapped to nut variables + +2013-07-05 Alf Høgemark + + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Add constants for all + bcmxmp meter map, and replace magic numbers with constants Take + all the bcmxcp meter map defined in http://old.networkupstools.org/ + protocols/eaton/XCP_Meter_Map_021309.pdf and put them into the + bcmxcp.h file. Update the bcmxcp.c file, replacing magic numbers + for meter map by using the corresponding defined constant. + +2013-07-04 Alf Høgemark + + * drivers/bcmxcp.c: bcmxcp: Let decode_instcmd_exec also handle short + read from UPS + * drivers/bcmxcp.c: bcmxcp: Add test.panel.start instcmd support + * drivers/bcmxcp.c: bcmxcp: Use one fuction to decode command + execution status in all places To avoid duplicating the logic + which checks the status of command execution at UPS, add a new + function which contains the check, and use that function whenever + we send a command to UPS and get status back from UPS. + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: Define byte for + choosing which system test to run in header file + * drivers/bcmxcp.c: bcmxcp: Fix outlet number for + outlet.x.shutdown.return if more than 2 outlets + * drivers/bcmxcp.c: bcmxcp: Let upsdrv_shutdown call instcmd for + shutting down To avoid code duplication between upsdrv_shutdown + and instcmd, let the upsdrv_shutdown method first try to issue a + shutdown.return instcmd, and then proceed with shutdown.stayoff if + the shutdown.return failed. This seems to be in line with what the + usbhid driver does. + * drivers/bcmxcp.c: bcmxcp: report upsdrv_comm_good at successful + execution of instcmd + * drivers/bcmxcp.c: bcmxcp: Return more specific error codes from + instcmd Use the available STAT_INSTCMD_FAILED and + STAT_INSTCMD_INVALID as return value from the instcmd method when + applicable, instead of always returning STAT_INSTCMD_UNKNOWN or -1. + +2013-07-03 Alf Høgemark + + * drivers/bcmxcp.c, drivers/bcmxcp.h: bcmxcp: use command map if + supplied. If UPS supplies command map, use it to control what + commands we register with dstate_addcmd. If UPS does not supply + command map, we register default commands with dstate_addcmd + * data/cmdvartab, drivers/bcmxcp.c: bcmxcp: cosmetic: make changes by + Prachi Gandhi more coherent with rest of driver + * drivers/bcmxcp.c: bcmxcp: Fix method name outputted in debug + message Reference: + http://article.gmane.org/gmane.comp.monitoring.nut.devel/6458 + Whitespace was addressed in previous commit (clepple) + +2013-07-03 Charles Lepple + + * drivers/bcmxcp.c: bcmxcp: indentation fixes (no code changes) + +2013-07-03 Alf Høgemark + + * drivers/bcmxcp.c: bcmxcp: add ups.load and battery.voltage.low + Adapted slightly for bcmxcp branch (original patch was against + master). Bump driver version to 0.28 as well. (clepple) Reference: + http://article.gmane.org/gmane.comp.monitoring.nut.devel/6460 + +2013-06-18 Daniele Pezzini + + * drivers/voltronic.c: Add unknown/unused and commented capability + entries Might be useful for future versions. + * data/driver.list.in: Add devices to HCL + * drivers/voltronic.c, drivers/voltronic_ser.c, + drivers/voltronic_usb.c: Fix warning flag + versioning Some UPSes + seem to reply with a \0 just before the end of the warning flag + (obtained with QWS), as a consequence of that, the string in C is 1 + char shorter than expected (the \r is not within the string). -> + Fix voltronic_warning function. Increase driver versions. + * drivers/voltronic.c, drivers/voltronic_ser.c, + drivers/voltronic_usb.c: Fix shutdown.return + versioning Fix + shutdown.return when ondelay = 0 -> split between offdelay < 60 and + offdelay > 60. Increase driver versions. + +2013-06-17 Daniele Pezzini + + * docs/man/voltronic_ser.txt, docs/man/voltronic_usb.txt: Correct + typos @shutdown.{return,stayoff} + * drivers/voltronic.c, drivers/voltronic_ser.c, + drivers/voltronic_usb.c: Imrove shutdown sequence + versioning + Split shutdown and stopping of pending shutdowns so that if there's + no shutdown pending and the UPS doesn't accept a shutdown.stop in + this situation (i.e. it replies '(NAK') the shutdown procedure + doesn't get halted. Increase version number of drivers. + * data/driver.list.in: Correct typos & add software reference in HCL + * docs/man/voltronic_ser.txt, docs/man/voltronic_usb.txt: Improve + docs layout + * drivers/voltronic_usb.c: Add USBDevice_t structure + * drivers/voltronic_usb.c: Add comment so that autogen rules have the + right comment + * drivers/voltronic_ser.c, drivers/voltronic_usb.c: Correct manpage + references + +2013-05-14 Bo Kersey + + * drivers/bestfcom.c: bestfcom: Use fc.idealbvolts for calculating + percent charge 'I have a Best Ferrups 3.1KVA and I noticed that + the percent battery voltage reported from upsc never gets above + 69.9%. I believe there is a mistake in the driver. The battery + percentage is calculated based on the High Battery Alarm Setpoint + (59.6V) instead of the Ideal Voltage which is about 54V (4 + batteries x 13.6V). I examined the source code and found that the + variable fc.fullvolts is the result of querying parameter 67 from + the UPS. This parameter is defined per Ferrups Tip 503 as: "The + battery voltage at which the UPS sound a High Battery alarm" A + better value to use in determining the percent battery voltage + would be fc.idealbvolts which is calculated in the driver source... + I propose the following patch to fix the battery.charge (% battery + full) reading.' Ref: + http://article.gmane.org/gmane.comp.monitoring.nut.user/7891 + +2013-05-13 Michal Soltys + + * docs/nut-names.txt: Add device.uptime to nut-names.txt Also fix + one typo. + * docs/man/apcsmart.txt, drivers/apcsmart.c: apcsmart: allow users to + select non-canonical tty mode The main reason behind this addition + is windows compatibility, see + http://article.gmane.org/gmane.comp.monitoring.nut.user/7762 IGNCR + has been readded earlier in commit + 20c52bee77fa0b3ea3c7f8bec25afd103b7ff4a2 - this might be enough to + handle windows behavior, but if it's not the case - using non + canonical processing (same as is present in apcsmart-old) should + solve any pressing issues. + * drivers/apcsmart_tabs.c: apcsmart: add device.uptime to vartab + +2013-04-26 Michal Soltys + + * drivers/apcsmart.c, drivers/apcsmart_tabs.h: apcsmart: remove + APC_DEPR flag APC_{MULTI, PRESENT} are both sufficient for + handling 1:n and n:1 relations + +2013-04-22 Michal Soltys + + * drivers/apcsmart.c: apcsmart: expand APC_MULTI to apc:nut 1:n cases + +2013-04-15 Michal Soltys + + * drivers/apcsmart.c, drivers/apcsmart_tabs.c: apcsmart: change + approach to 2 digit compatibility entries As reported in + http://article.gmane.org/gmane.comp.monitoring.nut.user/7762 - 2 + digit values reported through 'b' are really >255V voltage values. + So we match whole 00 - FF set as single (fake) compat entry. + +2013-04-16 Michal Soltys + + * drivers/apcsmart.c: apcsmart: remove strchr() check from + legacy_verify() As vartab doesn't contain characters from + APC_UNR_CMDS. + +2013-04-15 Michal Soltys + + * drivers/apcsmart.h: apcsmart: re-add CR to ignore sets Despite + icanon mode, windows (supposedly) is uncapable of ignoring CR in + fashion analogous to IGNCR flag. See + http://article.gmane.org/gmane.comp.monitoring.nut.user/7762 for + rationale. + * drivers/apcsmart_tabs.c: apcsmart: add regex format to + ambient.0.temperature 'T' might (on older units) also mean "ups + uptime", so we want to distinguish that case gracefully. The + formats are: uptime: 000.0 temp: 00.00 + +2013-05-03 Andrew Avdeev + + * drivers/powercom-hid.c: PowerCOM BNT-1000AP HID instant commands + Adds a few vendor-specific HID mappings for PowerCOM. Instant + commands supported on UPS [pcm]: beeper.disable - Disable the UPS + beeper beeper.enable - Enable the UPS beeper beeper.toggle - Toggle + the UPS beeper load.off - Turn off the load immediately load.on - + Turn on the load immediately shutdown.return - Turn off the load + and return when power is back shutdown.stayoff - Turn off the load + and remain off test.battery.start.quick - Start a quick battery + test http://article.gmane.org/gmane.comp.monitoring.nut.devel/6435 + +2013-04-25 Christian Wiese + + * tools/nut-scanner/Makefile.am, tools/nut-scanner/scan_usb.c: nut- + scanner: fix scan_usb to remove trailing spaces from output strings + This patch uses rtrim() from libcommon to remove trailing spaces + from serialnumber, device_name and vendor_name. see: + https://github.com/networkupstools/nut/issues/26 + +2013-04-18 Arnaud Quette + + * docs/new-drivers.txt: Add a reference to the SNMP subdrivers + chapter + +2013-04-15 Michal Soltys + + * drivers/apcsmart.c, drivers/apcsmart.h, drivers/apcsmart_tabs.c, + drivers/apcsmart_tabs.h: apcsmart: move variable regex matching + into vartab This also allows us to properly validate (in near + future) cases when single apc variable can match multiple nut + variables. Other changes: - adjust rexhlp() to follow 0 for false + and non-0 for true, like in the rest of the functions - remove + valid_cmd() as rexhlp() can be used directly with formats in the + table; furthermore the warning (in case of failure) could be + confusing when we add nut:apc n:1 case + +2013-04-11 Arnaud Quette + + * drivers/libusb.c: Set USB timeout to 5 seconds Set the low level + USB timeout back to the standard 5 seconds. This was set to 4 + seconds, for performance reasons, but is now causing issues with + some devices (reported by Stefan "stevenbg", GitHub issue #23) + +2013-04-10 Charles Lepple + + * docs/man/.gitignore: Ignore voltronic_* generated documentation + * drivers/voltronic_usb.c: voltronic_usb: switch to new + is_usb_device_supported() syntax + * tools/nut-usbinfo.pl: Add voltronic_usb driver to USB info + extractor tool + +2013-04-10 Daniele Pezzini + + * data/driver.list.in, docs/man/Makefile.am, + docs/man/voltronic_ser.txt, docs/man/voltronic_usb.txt, + drivers/Makefile.am, drivers/voltronic.c, drivers/voltronic.h, + drivers/voltronic_ser.c, drivers/voltronic_usb.c: New drivers: + voltronic_ser/voltronic_usb Reference: + http://article.gmane.org/gmane.comp.monitoring.nut.devel/6418 + +2013-04-10 Elio Parisi + + * drivers/riello.c, drivers/riello.h, drivers/riello_ser.c, + drivers/riello_usb.c: Riello drivers: fix memset() arguments, and + use stdint.h Reference: + http://article.gmane.org/gmane.comp.monitoring.nut.devel/6417 + +2013-04-04 Émilien Kia + + * configure.in, docs/new-clients.txt, scripts/Makefile.am, + scripts/README, scripts/java/.gitignore, scripts/java/Makefile.am, + scripts/java/README, scripts/java/jNut/.gitignore, + scripts/java/jNut/README, scripts/java/jNut/pom.xml, + .../main/java/org/networkupstools/jnut/Client.java, + .../java/org/networkupstools/jnut/Command.java, + .../main/java/org/networkupstools/jnut/Device.java, + .../org/networkupstools/jnut/NutException.java, + .../java/org/networkupstools/jnut/Scanner.java, + .../org/networkupstools/jnut/StringLineSocket.java, + .../java/org/networkupstools/jnut/Variable.java, + .../java/org/networkupstools/jnut/ClientTest.java, + .../java/org/networkupstools/jnut/ScannerTest.java, + scripts/java/jNutList/README, scripts/java/jNutList/pom.xml, + .../java/org/networkupstools/jnutlist/AppList.java, + scripts/java/jNutWebAPI/README, scripts/java/jNutWebAPI/pom.xml, + .../jnutwebapi/NutRestProvider.java, + .../jnutwebapi/RestWSApplication.java, + .../jnutwebapi/ScannerProvider.java, .../jNutWebAPI/src/main/webapp + /WEB-INF/web.xml: Remove java related files (jNut) which will be + moved to a separated repository. See issues: - + https://github.com/networkupstools/nut/issues/2 - + https://github.com/networkupstools/nut/issues/22 + +2013-03-26 Alex Lov + + * drivers/ietf-mib.c: Fix OID for input.bypass.voltage in ietf-mib.c + Ooops, forgot fix one + * drivers/ietf-mib.c: Fix OIDs for bypass group in ietf-mib.c + Reference http://tools.ietf.org/html/rfc1628#page-12 For bypass + voltage, current and power + +2013-03-13 Arnaud Quette + + * docs/FAQ.txt: Add a FAQ entry for supported but not working USB UPS + +2013-03-10 Charles Lepple + + * scripts/upower/95-upower-hid.rules: upower: update generated rules + file + +2013-03-09 Charles Lepple + + * docs/download.txt: Update VMware ESXi package link (from René + Garcia) + +2013-02-28 Charles Lepple + + * Makefile.am, tools/gitlog2changelog.py: Issue #4: Specify starting + commit to gitlog2changelog.py + +2013-02-27 Michal Soltys + + * drivers/apcsmart_tabs.c: apcsmart: add old APC 600I compatibility + entry Though without 'T' - until we handle situations when single + nut variable is able to correspond to more than one apc var. + Testet-by: Markus Pruehs + +2013-02-26 Charles Lepple + + * tools/gitlog2changelog.py: git-changelog: really fixes #4 (missing + entries) The script was discarding any commits which happened to + include the word 'commit'. + * tools/gitlog2changelog.py: git-changelog: remove re.* calls for + simple string matching + +2013-02-25 Charles Lepple + + * Makefile.am, tools/Makefile.am: git-changelog: Fix list of + distributed files + * tools/gitlog2changelog.py: Fixes issue #4: ChangeLog now includes + single-file commits. + * Makefile.am, tools/gitlog2changelog.py: Issue #4: generate + ChangeLog from git logs This seems to generate long ChangeLog + entries in the format we had with svn2cl, but some commits appear + to be missing. + * tools/gitlog2changelog.py: Import gitlog2changelog.py (2008-12-27) + https://github.com/cryos/avogadro/commit/8be9957e5b3b5675701ef2ed00 + 2aa9e718d4146e#scripts/gitlog2changelog.py + +2013-02-25 Émilien Kia + + * clients/nutclient.cpp, clients/nutclient.h: Add comparison operator + for nut::Device class. Make std::set work and not + dropping devices anymore. + +2012-11-02 Charles Lepple + + * README, scripts/upower/95-upower-hid.rules: apcupsd-ups: link to + man page from README Patch by Arnaud: https://alioth.debian.org/tr + acker/index.php?func=detail&aid=313846&group_id=30602&atid=411544 + +2012-10-30 Charles Lepple + + * docs/man/apcupsd-ups.txt: apcupsd-ups: Update man page with + variables and units + +2012-09-28 Charles Lepple + + * drivers/apcupsd-ups.c, drivers/apcupsd-ups.h: apcupsd-ups: + Additional variables + * drivers/apcupsd-ups.c, drivers/apcupsd-ups.h: apcupsd-ups: Remove + multiplier from ups.load + +2012-09-27 Charles Lepple + + * docs/man/apcupsd-ups.txt, drivers/apcupsd-ups.c: apcupsd-ups: + miscellaneous cleanup + +2012-09-27 Andreas Steinmetz + + * docs/man/Makefile.am, docs/man/apcupsd-ups.txt, + drivers/Makefile.am, drivers/apcupsd-ups.c, drivers/apcupsd-ups.h: + apcupsd client driver https://alioth.debian.org/tracker/?func=det + ail&atid=411544&aid=313846&group_id=30602 + +2013-02-23 Charles Lepple + + * drivers/bcmxcp.c: bcmxcp: remove unused variable + +2013-02-16 Charles Lepple + + * docs/website/news.txt: News: Git conversion + * docs/developers.txt: Update developer documentation for Git + repository + +2013-02-21 Arnaud Quette + + * .gitignore, scripts/HP-UX/.gitignore: Git ignored files completion + +2013-02-21 Michal Soltys + + * drivers/apcsmart_tabs.c: apcsmart: minor fixups to compat. tables + * drivers/apcsmart.c: apcsmart: verify/setup fixups legacy_verify() + - check against commands we always ignore oldapcsetup() - extra + comments, minor flow change + +2013-02-17 Charles Lepple + + * tools/git-svn.authors, tools/svn2cl.authors: Remove obsolete + authors files. + +2013-02-16 Arnaud Quette + + * .gitignore: Git ignored files completion + +2013-02-06 Frederic Bohe + + * scripts/Solaris/nut.in, scripts/Solaris/postinstall.in: [Solaris] + Fix postinstall user/group, and service start * Fix postinstall + user/group detection/creation. * Fix service start depending on the + mode, and add poweroff command. + +2013-02-04 Emilien Kia + + * include/proto.h: Move __cplusplus/extern "C" begin block before to + fix a problem of ifdef when included in real C++ code. + +2013-02-01 Frederic Bohe + + * configure.in, scripts/HP-UX/makedepot.sh, scripts/HP-UX/nut.psf.in, + scripts/HP-UX/postinstall.in: [HP-UX] : add postinstal script for + installing services files. + +2013-02-01 Arnaud Quette + + * docs/man/snmp-ups.txt: Update SNMP driver documentation Mentioning + 'mib' is not needed anymore since NUT 2.6.2. Also mention 'v3' as + an allowed value for 'snmp_version' (reported by Tim Rice) + +2013-01-29 Michal Soltys + + * drivers/apcsmart.c, drivers/apcsmart.h, drivers/apcsmart_tabs.c, + drivers/apcsmart_tabs.h: apcsmart: implement #311678 (multiple + values per variable) This is a bit more general than the original + request. All variables that return multiple comma-separated + values, are added as *.N.* where 1 <= N <= APC_PACK_MAX; the + variables are stored with temporary name *.0.* in apcsmart_tabs.c, + but only at least 1 and at most 4 are added per update run + (superfluous - if any - are removed), with *.0.* placeholder being + ignored. We assume that the particular variables cannot belong to + the capability set at the same time (as reported by user) - + otherwise we will need a bit more complex handling, including + updates to all setvar functions. + * drivers/apcsmart.c, drivers/apcsmart.h: apcsmart: update logging + logic / apc_read() - logging This mostly adds few macros that + implicitly use or pass caller's name (and in case of hard errors, + line number). This allows removal of a few "failed" / "succeeded" + lines (which in practice don't really happen), for example there is + no need for: upslogx(LOG_ERR, "preread_data: apc_write failed"); + as any hard error will be reported by apc_write() internally, + providing the place and line number it was called at. Similarly, + some upslogx / upsdebugx calls were wrapped in analogous macros to + provide caller's name automatically. Debug levels (-D) were + adjusted to require only one letter. - apc_read() It's been a bit + more scrutinized: - filling up full caller's buffer is considered + an error; shouldn't happen unless the ups is somehow damaged or + some model is capable of returning more than 512 bytes in one read + (current max I witnessed is around 270 bytes during capability + read) - timeout reads (whether it's allowed or not) cannot really + have any non-0 count, though sanity check could theoretically be + useful in non-canonical mode; commented out code was added for + reference + * drivers/apcsmart.c: apcsmart: enhance prtchr() So it can handle 4 + returns with static pointers. + * drivers/apcsmart.c: apcsmart: allow timeout on read in smartmode() + As this function is used to "nudge" ups, we should expect it to + timeout. Also avoids extra log spam. + +2013-01-29 Frederic Bohe + + * scripts/Solaris/postinstall.in: Use variables to generate Solaris + postinstall script. + * scripts/Solaris/postinstall.in: Enhance the Solaris post install + script. + +2013-01-22 Arnaud Quette + + * docs/man/Makefile.am: Remove duplicate entries for Eaton serial + scan + * include/Makefile.am, tools/nut-scanner/Makefile.am: List missing + header files to be distributed nutscan-serial.h and nut_platform.h + were missing from the distribution + * scripts/Solaris/.gitignore: Subversion ignored files completion + Mark Solaris generated packaging files as Subversion ignored (no + functional changes) + * docs/man/.gitignore, docs/man/Makefile.am, docs/man/index.txt, + docs/man/nut-scanner.txt, + docs/man/nutscan_get_serial_ports_list.txt, + docs/man/nutscan_scan_avahi.txt, + docs/man/nutscan_scan_eaton_serial.txt, + docs/man/nutscan_scan_ipmi.txt, docs/man/nutscan_scan_nut.txt, + docs/man/nutscan_scan_snmp.txt, docs/man/nutscan_scan_usb.txt, + docs/man/nutscan_scan_xml_http.txt, include/nut_platform.h, tools + /nut-scanner/Makefile.am, tools/nut-scanner/nut-scan.h, tools/nut- + scanner/nut-scanner.c, tools/nut-scanner/nutscan-device.h, tools + /nut-scanner/nutscan-display.c, tools/nut-scanner/nutscan-serial.c, + tools/nut-scanner/nutscan-serial.h, tools/nut- + scanner/scan_eaton_serial.c, tools/nut-scanner/scan_nut.c: Add nut- + scanner support for Eaton serial units nut-scanner and libnutscan + now provides respectively an option and functions to detect Eaton + serial devices. The following protocols are supported: SHUT, XCP + and Q1 (patch from Frederic Bohe, with parts from Arnaud Quette, + both for Eaton) + * configure.in: Fix for pthread on HP-UX pthread is compiled on a + stub when -lpthread is not explicitly added. This commit is a + duplicate of [[SVN:3801]], from Frederic Bohe (for Eaton) + * drivers/bcmxcp_ser.c: Change baud-rates ordering for auto-detection + * docs/new-drivers.txt, drivers/serial.c, drivers/serial.h: Add non- + fatal versions of ser_open / ser_set_speed + +2013-01-21 Frederic Bohe + + * scripts/Solaris/nut.in, scripts/Solaris/postinstall.in: Allow + start/stop of NUT from Solaris packages + +2013-01-13 Emilien Kia + + * clients/cgilib.h, clients/status.h, clients/upsimagearg.h, + clients/upslog.h, clients/upsmon.h, clients/upssched.h, + clients/upsstats.h, include/common.h, include/extstate.h, + include/proto.h, include/state.h, include/upsconf.h, server/conf.h, + server/desc.h, server/netcmds.h, server/netget.h, + server/netinstcmd.h, server/netlist.h, server/netmisc.h, + server/netset.h, server/netssl.h, server/netuser.h, + server/sstate.h, server/stype.h, server/upsd.h, server/upstype.h, + server/user-data.h, server/user.h, tools/nut-scanner/nut-scan.h, + tools/nut-scanner/nutscan-device.h, tools/nut-scanner/nutscan- + init.h, tools/nut-scanner/nutscan-ip.h: Protect header files for + C++ inclusion. + +2012-12-19 Arnaud Quette + + * data/driver.list.in: HCL: Add support for Lyonn CTB-1200 Add Lyonn + CTB-1200 (USB ID 0x0665:0x5161) to the list of blazer_usb supported + models (reported by Martin Sarsale) + * docs/stable-hcl.txt: Clarify expected report for shutdown testing + State explicitly that, for now, a statement that the user has + actually tested the shutdown procedure successfully is enough + (report from Martin Sarsale) + +2012-12-19 Frederic Bohe + + * scripts/HP-UX/makedepot.sh, scripts/HP-UX/nut.psf.in: Use installed + binaries to create package + +2012-12-18 Arnaud Quette + + * drivers/delta_ups-mib.c: Fix a typo error and current multiplier + factor + * data/driver.list.in, drivers/Makefile.am, drivers/delta_ups-mib.c, + drivers/delta_ups-mib.h, drivers/snmp-ups.c: Support for DeltaUPS + MIB and Socomec Netys RT 1/1 Add preliminary SNMP support for a + new MIB: DeltaUPS MIB, with sysOID ".1.3.6.1.4.1.2254.2.4". The + first known supported devices are Socomec Netys RT 1/1, equiped + with Netvision SNMP card + +2012-12-18 Michal Soltys + + * drivers/apcsmart.c: apcsmart: add update_info() No need for almost + identical update_info_normal() and update_info_all() + * drivers/apcsmart.c: apcsmart: two fixups In poll_data(): we are + not supposed to set variable after its (formally impossible) + removal In upsdrv_shutdown(): wrong comparison + +2012-12-14 Arnaud Quette + + * data/driver.list.in, drivers/powerp-txt.c, drivers/powerpanel.c: + Add support for CyberPower OL3000RMXL2U Add CyberPower + OL3000RMXL2U serial support to the powerpanel driver, text protocol + version (Alioth patch #313910, from Timothy Pearson) + +2012-12-13 Arnaud Quette + + * docs/Makefile.am, docs/new-drivers.txt, docs/snmp-subdrivers.txt, + scripts/subdriver/gen-snmp-subdriver.sh: Helper script to create + SNMP subdrivers stubs Created a new shell script + (scripts/subdriver/gen-snmp-subdriver.sh) to automatically create a + "stub" subdriver. This will make it a lot easier and quicker to + create subdrivers for snmp-ups. A new documentation chapter has + also been added ("How to make a new subdriver to support another + SNMP device") + * drivers/tripplite-hid.c: Add support for newer TrippLite + Smart1500LCD Add newer TrippLite Smart1500LCD (USB ID + 0x09ae:0x3016) to the list of usbhid-ups supported models (reported + by Steve Salier) + +2012-12-12 Frederic Bohe + + * drivers/mge-hid.c: Fix crash with debug level greater or equal to 2 + +2012-12-10 Michal Soltys + + * drivers/apcsmart.c: apcsmart: add prtchr() helper Add prtchr() + helper and simplify reporting when we check whether some APC + cmd/var character is or isn't printable. + * drivers/apcsmart_tabs.c: apcsmart: apc_cmdtab[] fixup Earlier + commit that adjusted regex checks, also changed cmd fields for all + instant commands handled by custom functions. We cannot do that, as + they are not detected as supported this way. + +2012-12-08 Arnaud Quette + + * drivers/mge-utalk.c, drivers/mge-utalk.h: Change Martin Loyer's + mail address As per Martin's request. + * drivers/mge-utalk.c: Improve mge-utalk general behavior Make two + adjustments to improve the general behavior: first, send the double + "Z" prior to "Si" command. Second, inter-commands delay has been + increased to comply with the specification + +2012-12-08 Michal Soltys + + * drivers/apcsmart.c: apcsmart: serial related stuff a bit more + strict Also: - apc_flush() now loops with >0 condition (otherwise + errored apc_read() might cause inf loop) - ser_comm_good/fail() + were kind of missing in write wrappers + * drivers/apcsmart.c, drivers/apcsmart.h: apcsmart: + sdlist/sdtype/advorder changes - verify 'advorder' with regex - + remove unused defines - as the user is directed towards man page + either way (and without it numbers are kind of meaningless), drop + SDMAX + * drivers/apcsmart.c: apcsmart: setup port after variable + sanitization in upsdrv_initups() + * drivers/apcsmart.c: apcsmart: cleanup dstate ok/stale calls + * drivers/apcsmart.c: apcsmart: getbaseinfo() fixup In extremely + unlikely case of failing write, report it up and act accordingly. + * drivers/apcsmart.c, drivers/apcsmart.h, drivers/apcsmart_tabs.c, + drivers/apcsmart_tabs.h: apcsmart: adjust regex logic A bit + simpler / tighter now. + * drivers/apcsmart.c: apcsmart: add var_string_setup() In theory + deprecate_vars() should also consider APC_STRING variables. In + practice - we don't have any variables that are both APC_MULTI and + APC_STRING - but it's more correct this way, so let's do it. + * drivers/apcsmart.c: apcsmart: cosmetics - code shuffling, + comments, flow - rename query_ups() -> legacy_verify() - add few + lines of help directing to man page + * drivers/apcsmart.c: apcsmart: simplify query_ups() / + proto_verification() Both functions rely now on common variable + verificaion function. + * drivers/apcsmart.c: apcsmart: add var_verify() The function will + be used in subsequent commit for common verification. + * drivers/apcsmart.c: apcsmart: shuffle two functions query_ups() + and oldapcsetup() + * drivers/apcsmart.c: apcsmart: simplify query_ups() This commit + changes query_ups() function and makes it rely on the same + deprecate_vars() logic that protocol_verify() requires. We can + shorten the code a bit now, and it allows us to do more + simplifications in subsequent commits. + * drivers/apcsmart.c: apcsmart: add functions informing about + [un]supported cmds/vars In unified fashion, instead of each + protocol-verification related function doing it on its own. + * drivers/apcsmart.c, drivers/apcsmart.h, drivers/apcsmart_tabs.c, + drivers/apcsmart_tabs.h: apcsmart: minor tidying up comments, + trivial changes, code shuffling ... + * drivers/apcsmart.c: apcsmart: remove unused field 'def' from cchar + In apc_ser_diff() reporting differences between + tcgetattr/tcsetattr, 'def' field was unused (along with related + defines). + +2012-12-06 Frederic Bohe + + * tools/nut-scanner/nut-scanner.c: Fix nut-scanner compilation + without pthread + +2012-12-02 Charles Lepple + + * drivers/riello_usb.c: riello_usb.c: eliminate uninitialized + variable + +2012-11-29 Arnaud Quette + + * conf/.gitignore: Subversion ignored files completion Mark + upsmon.conf.sample as Subversion ignored, since it is now generated + from a .in template file (no functional changes) + * conf/Makefile.am, conf/upsmon.conf.sample, + conf/upsmon.conf.sample.in, configure.in: Adapt upsmon.conf sample + to use configured values The sample upsmon.conf provided now + adapts RUN_AS_USER value, and NOTIFYCMD / POWERDOWNFLAG base path + to the user configured values + +2012-11-28 Arnaud Quette + + * drivers/riello.c, drivers/riello_ser.c, drivers/riello_usb.c: Minor + improvements to Riello drivers Fix ups.power.nominal name in + Riello drivers, and its value for GPSER protocol(riello_ser). + device.mfr was also changed in both drivers, and revisions were + bumped to 0.02 (patch from Elio Parisi, Riello) + * data/driver.list.in, drivers/Makefile.am, drivers/openups-hid.c, + drivers/openups-hid.h, drivers/usbhid-ups.c, scripts/upower/95 + -upower-hid.rules: Official support for Minibox openUPS Intelligent + UPS Add a new usbhid-ups subdriver to handle Minibox openUPS + Intelligent UPS (USB ID 0x04d8:0xd004) (patch from Nicu Pavel, + Mini-Box.Com) + +2012-11-28 Charles Lepple + + * conf/upsmon.conf.sample, docs/man/upsmon.conf.txt: Update + references to pager.txt + +2012-11-27 Frederic Bohe + + * data/driver.list.in, docs/man/genericups.txt: Add information about + Eaton Management Card Contact + +2012-11-25 Arnaud Quette + + * drivers/riello.c, drivers/riello.h, drivers/riello_ser.c, + drivers/riello_usb.c: Minor improvements to Riello drivers Fix + functions and variables names to use English language. Also fix + warnings reported by Mac OS X Buildbot and Charles Lepple (patch + from Elio Parisi, Riello) + +2012-11-21 Arnaud Quette + + * docs/acknowledgements.txt: Complete Acknowledgements with a Riello + entry Riello deserves a dedicated entry in the Supporting UPS + manufacturers, for having provided protocols information and + drivers implementations + * docs/man/.gitignore: Subversion ignored files completion Mark + riello_ser and riello_usb HTML manpages as Subversion ignored (no + functional changes) + * data/driver.list.in, docs/man/.gitignore, docs/man/Makefile.am, + docs/man/riello_ser.txt, docs/man/riello_usb.txt, + drivers/.gitignore, drivers/Makefile.am, drivers/riello.c, + drivers/riello.h, drivers/riello_ser.c, drivers/riello_usb.c, tools + /nut-usbinfo.pl: Official support for Riello serial and USB devices + Add two new drivers, riello_ser and riello_usb, to support the + whole ranges of Riello devices: IDG, IPG, WPG, NPW, NDG, DVT, DVR, + DVD, VST, VSD, SEP, SDH, SDL, SPW, SPT, MCT, MST, MCM, MCT, MHT, + MPT and MPM. This completes the official Riello protocols + publication, that happened in May 2012 (developed by Elio Parisi, + from Riello) + +2012-11-20 Arnaud Quette + + * clients/upsclient.h, server/nut_ctype.h: Fix NSS include directives + The current NSS include directives (nss/nss.h) were incorrect. + These were failing on Redhat systems, and working on some others + because of the default include path (reported by Michal Hlavinka, + from Redhat) + +2012-11-19 Arnaud Quette + + * data/driver.list.in: HCL: Add support for Aviem Power RT + 1000-3000VA Add Aviem Systems - Aviem Power RT 1000-3000VA to the + list of blazer_ser supported models (reported by Michael + Dobrovitsky) + +2012-11-19 Emilien Kia + + * tools/nut-scanner/nutscan-device.c: Fix a memory leak in scanner. + +2012-11-13 Arnaud Quette + + * docs/man/.gitignore: Complete the list of Subversion ignored files + Commit r3778 was missing generated HTML files (no functional + changes) + * docs/man/Makefile.am: Fix installation of libnutclient manual pages + Commit r3777 fixed the test target, but libnutclient manual pages + were not actually installed + * docs/man/.gitignore, lib/.gitignore: Complete the list of + Subversion ignored files The merge of NSS and libnutclient + branches have left some new generated files (no functional changes) + * docs/man/libnutclient_commands.txt, + docs/man/libnutclient_devices.txt, + docs/man/libnutclient_general.txt, docs/man/libnutclient_misc.txt, + docs/man/libnutclient_tcp.txt, docs/man/libnutclient_variables.txt: + Fix Buildbot failures on previous commit (man pages) The merge of + the libnutclient branch caused a failure of the 'distcheck-light' + test target. Manual pages documentation in this branch uses a + mechanism to generate multiple manpages from one source file. This + was however conflicting with a Makefile rule, that requires the + generated file to have the same name as the source file. Applies + the same principle by adding the content of the Header section to + the NAME commands list. Also fix a typo error in the Header section + of libnutclient_devices + +2012-11-13 Emilien Kia + + * clients/Makefile.am, clients/nutclient.cpp, clients/nutclient.h, + configure.in, docs/man/Makefile.am, docs/man/index.txt, + docs/man/libnutclient.txt, docs/man/libnutclient_commands.txt, + docs/man/libnutclient_devices.txt, + docs/man/libnutclient_general.txt, docs/man/libnutclient_misc.txt, + docs/man/libnutclient_tcp.txt, docs/man/libnutclient_variables.txt, + docs/new-clients.txt, lib/Makefile.am, lib/README, + lib/libnutclient.pc.in: Merge libnutclient (libcpp) branch Pull + Request #2: "High level C and C++ libnutclient" from + https://github.com/clepple/nut/pull/2 . Hand-merged into SVN trunk + from commit: 701cc571f4f8578e9c82b13c1e9eab509a41cd7f + +2012-11-08 Frederic Bohe + + * docs/man/usbhid-ups.txt, drivers/usbhid-ups.c: Add a command line + to usbhid-ups to activate the max_report tweak. + * drivers/apc-hid.c, drivers/libhid.c: Fix tweak for APC Back-UPS + since it seems to break Back-UPS 700 connectivity (reported by + Denis Serov). Adding some more comments on UPS which need and + which do not need the tweak. Refactored the detection code. + +2012-11-07 Arnaud Quette + + * scripts/subdriver/gen-usbhid-subdriver.sh: Fix USB HID subdriver + generation tool This tool has not been updated since timestamps + were added to driver debug traces. It was thus producing erroneous + results (reported by Nicu Pavel) + +2012-11-01 Arnaud Quette + + * drivers/snmp-ups.c: Fix a crash on outlets management snmp-ups was + crashing when the number of outlets was equal to zero + +2012-10-31 Arnaud Quette + + * docs/man/.gitignore, docs/man/blazer.txt: Fix blazer manual pages + generation to generate blazer, blazer_ser and blazer_usb manual + pages. The same manual page is now distributed and available under + these 3 names (warning to packagers) + * docs/man/Makefile.am, docs/man/asciidoc.conf: Fix manpage + refmiscinfo attributes and multiple NAME refmiscinfo attributes + were previously specified through asciidoc.conf. This approach + prevented from specifying and generating multiple manual pages from + a single source. Moreover, manversion (pointing NUT version) was + mistyped, and thus omitted. Makefile rules now directly define + refmiscinfo through attributes, and allow to solve the long + standing blazer / blazer_ser / blazer_usb related issue, and the + upcoming libnutclient one + +2012-10-19 Arnaud Quette + + * drivers/cps-hid.c, drivers/idowell-hid.c, scripts/subdriver/gen- + usbhid-subdriver.sh: Replace missing occurrences in previous commit + * docs/hid-subdrivers.txt, drivers/libhid.c, scripts/Makefile.am, + scripts/subdriver/gen-usbhid-subdriver.sh, scripts/subdriver/path- + to-subdriver.sh: Rename usbhid subdriver generation script This + script was previously named path-to-subdriver.sh, which was not + enough meaningful. The renaming to gen-usbhid-subdriver.sh also + makes sense with a potential gen-snmp-subdriver.sh + * data/driver.list.in: HCL: Add support for Apollo 850VA Add Apollo + 850VA (USB ID 0x0665:0x5161) to the list of blazer_usb supported + models (reported by Mike Raath) + +2012-10-15 Arnaud Quette + + * configure.in, scripts/systemd/nut-driver.service.in: Fix driver + path in systemd driver unit The driver path, in nut- + driver.service, was not expanded correctly (reported by Marc + Rechté) + +2012-10-15 Michal Soltys + + * data/driver.list.in: HCL: add info about new APC models Info about + new SMT, SMX and SURTD models which require additional card for + "legacy" smart protocol. + +2012-10-15 Arnaud Quette + + * configure.in: Only fail if SSL was explicitly requested + Configuration should not abort if neither OpenSSL nor Mozilla NSS + has been found, and if SSL was not explicitly requested by the + user. This fixes the Buildbot compilation failure on Aix (build + #206) + +2012-10-12 Charles Lepple + + * tools/git-svn.authors, tools/svn2cl.authors: Update Emilien Kia's + email address + +2012-10-11 Arnaud Quette + + * docs/Makefile.am: Fix Solaris compilation failure + +2012-10-10 Arnaud Quette + + * README: Spell check fix (test) + * .gitignore, configure.in, docs/.gitignore, docs/Makefile.am, docs + /nut-qa.txt, docs/nut.dict: Spell checking framework implementation + Implement a framework to spell check documentation source files, + using Aspell. This includes an interactive build target (make + spellcheck-interactive), and an automated one (make spellcheck), + mainly for QA / Buildbot purpose. Note that a base NUT dictionnary + is also available (docs/nut.dict), providing a glossary of terms + related to power devices and management + * drivers/tripplite_usb.c: Remove POD ("Plain Old Documentation") + With the approval of the author (Charles Lepple), remove POD + ("Plain Old Documentation"). This embedded documentation was + redundant, and is probably out of date, with respect to the + AsciiDoc version + * drivers/powercom.c, drivers/powercom.h, drivers/upscode2.c: Remove + unnecessary RCS $Id lines + +2012-10-05 Arnaud Quette + + * tools/nut-scanner/nut-scan.h: Fix compilation error Define + IPMI_PRIVILEGE_LEVEL_ADMIN value, in case FreeIPMI is not available + +2012-10-04 Arnaud Quette + + * docs/man/nut-scanner.txt, drivers/nut-ipmipsu.c, tools/nut-scanner + /nut-scan.h, tools/nut-scanner/nut-scanner.c, tools/nut- + scanner/scan_ipmi.c: Support power supplies scan over the network + nut-scanner can now scan for power supplies with IPMI over LAN. + This is currently limited to IPMI 1.5 only + +2012-10-03 Arnaud Quette + + * docs/acknowledgements.txt: Update acknowledgements + +2012-09-28 Charles Lepple + + * drivers/.gitignore: Cleanup of svn:ignore list in drivers/ (no code + change) + +2012-09-27 Charles Lepple + + * tools/git-svn.authors, tools/svn2cl.authors: Welcome, Václav! (SVN + username mappings) + +2012-09-21 Arnaud Quette + + * docs/nut-qa.txt: Update the link to the Ubuntu QRT script + +2012-09-19 Arnaud Quette + + * drivers/nut-libfreeipmi.c, m4/nut_check_libfreeipmi.m4, tools/nut- + scanner/scan_ipmi.c: Support for FreeIPMI 1.1.x and 1.2.x (#2) + Prepare for supporting API changes in FreeIPMI 1.1.x and 1.2.x. + This 2nd patch, which completes [[SVN:3675]], addresses FRU API + changes, and removes code redundancy. This code has been tested + with FreeIPMI 0.8.12 and the latest [[FreeIPMI SVN]] trunk r9505 + (reported as 1.2.0.beta2 by pkgconfig) + * docs/download.txt, docs/website/news.txt: Update Windows package + publications for 2.6.5-3 + +2012-09-17 Arnaud Quette + + * docs/download.txt, docs/website/news.txt: Update Windows package + publications for 2.6.5-2 + +2012-09-12 Arnaud Quette + + * drivers/bcmxcp_usb.c: Fix data reception loop The new data + reception algorithm was trying to get more data than it should + (patch from Rich Wrenn) + +2012-09-10 Frederic Bohe + + * drivers/apc-hid.c, drivers/apc-hid.h, drivers/libhid.c: Add a tweak + for APC Back UPS ES APC Back UPS ES have a buggy firmware which + overflows on ReportID 0x0c, i.e. + UPS.PowerSummary.RemainingCapacity. This results in battery.charge + not being exposed and endless reconnections on systems with libusb + reporting EOVERFLOW. And it results on a failure to init the driver + for systems with libusb not reporting EOVERFLOW but EIO (i.e. on + Windows). + * tools/nut-scanner/nut-scanner.c: [nut-scanner] Fix a crash when no + start IP is provided. + * drivers/apc-hid.c, drivers/bcmxcp_usb.c, drivers/belkin-hid.c, + drivers/blazer_usb.c, drivers/cps-hid.c, drivers/idowell-hid.c, + drivers/liebert-hid.c, drivers/mge-hid.c, drivers/powercom-hid.c, + drivers/richcomm_usb.c, drivers/tripplite-hid.c, + drivers/tripplite_usb.c, drivers/usb-common.c, drivers/usb- + common.h: Extend USB device support check (from Arnaud Quette) Use + USBDevice_t structure in is_usb_device_supported(), instead of + direct VendorID and ProductID. This allows to pass it to the + specific processing handler for broader check + +2012-09-07 Leo Arias + + * conf/nut.conf.sample: Update nut.conf.sample (grammar and + documentation) https://alioth.debian.org/tracker/?func=detail&ati + d=411544&aid=313762&group_id=30602 + +2012-08-14 Arnaud Quette + + * NEWS, UPGRADING, configure.in, data/driver.list.in, + docs/Makefile.am, docs/configure.txt, docs/documentation.txt, + docs/download.txt, docs/images/eaton-logo.png, + docs/images/hostedby.png, docs/images/simple.png, + docs/man/.gitignore, docs/man/Makefile.am, docs/man/index.txt, + docs/man/macosx-ups.txt, docs/man/mge-shut.txt, + docs/man/nutscan.txt, docs/man/nutscan_scan_avahi.txt, + docs/man/powercom.txt, docs/man/skel.txt, docs/nut-names.txt, + docs/website/.gitignore, docs/website/Makefile.am, docs/website/css + /web-layout.css, docs/website/news.txt, docs/website/old-news.txt, + docs/website/projects.txt, docs/website/web-layout.conf, + drivers/.gitignore, drivers/Makefile.am, drivers/macosx-ups.c, + drivers/mge-hid.c, drivers/powercom-hid.c, drivers/skel.c, drivers + /usbhid-ups.c, drivers/usbhid-ups.h, m4/nut_check_libltdl.m4: Merge + from trunk [[SVN:3679]] to [[SVN:3718]] to ssl-nss-port + +2012-08-09 Arnaud Quette + + * docs/website/.gitignore, docs/website/Makefile.am, + docs/website/news.txt, docs/website/old-news.txt: Integrate + archived news + * docs/nut-names.txt, drivers/mge-hid.c: Add shutdown ability switch + to Eaton units Eaton HID units (using usbhid-ups or [new,old]mge- + shut) were missing a data mapping to allow the change of the + shutdown ability switch. The result was that the UPS was not + powered off, even if all the protocol commands were sent (reported + by Daniel O'Connor) + * docs/download.txt, docs/website/news.txt: Update Windows package + publications for 2.6.5-1 + * docs/man/.gitignore, docs/man/index.txt: Added macosx-ups manual + page to the index Also add generated groff and HTML contents to + the list of Subversion ignored files + 2012-08-08 Arnaud Quette - * [r3712] NEWS, UPGRADING, configure.in, docs/website/news.txt: - Final update for 2.6.5 release - * [r3711] drivers: Subversion ignored files completion - - Mark oldmge-shut binary as Subversion ignored (no functional - changes) - * [r3710] docs/configure.txt, m4/nut_check_libltdl.m4: Complete - libltdl configuration options - - Add configure options to add specific cflags + * NEWS, UPGRADING, configure.in, docs/website/news.txt: Final update + for 2.6.5 release + * drivers/.gitignore: Subversion ignored files completion Mark + oldmge-shut binary as Subversion ignored (no functional changes) + * docs/configure.txt, m4/nut_check_libltdl.m4: Complete libltdl + configuration options Add configure options to add specific cflags (--with-libltdl-includes) and libs (--with-libltdl-libs) for - libltdl. This serves at least to point at non standard location, - as on FreeBSD (reported by David Durieux) + libltdl. This serves at least to point at non standard location, as + on FreeBSD (reported by David Durieux) 2012-08-06 Arnaud Quette - * [r3708] docs/documentation.txt: Add a Wikipedia reference on - Solar controller - * [r3707] docs/Makefile.am, docs/images/eaton-logo.png, + * docs/documentation.txt: Add a Wikipedia reference on Solar + controller + * docs/Makefile.am, docs/images/eaton-logo.png, docs/images/hostedby.png, docs/website/Makefile.am, - docs/website/css/web-layout.css, docs/website/web-layout.conf: - Free NUT from Eaton website hosting - - NUT is no more hosted by Eaton. Arnaud Quette (NUT project - leader) has taken over NUT hosting on his own, to give NUT back - some independance. This effort is also part of a logic to stop - crediting Eaton for contributions from others (especially Arnaud - Quette, as an individual). The new hosting service is located, as - for Arnaud's blog (http://arnaud.quette.fr) on Gandi servers, - using PaaS. This will allow more flexibility and automation of - the release process + docs/website/css/web-layout.css, docs/website/web-layout.conf: Free + NUT from Eaton website hosting NUT is no more hosted by Eaton. + Arnaud Quette (NUT project leader) has taken over NUT hosting on + his own, to give NUT back some independance. This effort is also + part of a logic to stop crediting Eaton for contributions from + others (especially Arnaud Quette, as an individual). The new + hosting service is located, as for Arnaud's blog + (http://arnaud.quette.fr) on Gandi servers, using PaaS. This will + allow more flexibility and automation of the release process 2012-08-06 Charles Lepple - * [r3704] configure.in, docs/man/Makefile.am, - docs/man/macosx-ups.txt, drivers/Makefile.am, - drivers/macosx-ups.c: macosx-ups: new OS X Power Sources - meta-driver - - Mac OS X provides UPS status information in a format similar to - what is shown for laptop batteries. This driver will convert that - information into a format compatible with NUT. + * configure.in, docs/man/Makefile.am, docs/man/macosx-ups.txt, + drivers/Makefile.am, drivers/macosx-ups.c: macosx-ups: new OS X + Power Sources meta-driver Mac OS X provides UPS status information + in a format similar to what is shown for laptop batteries. This + driver will convert that information into a format compatible with + NUT. 2012-08-05 Charles Lepple - * [r3703] drivers/skel.c: Update comments in skel.c - - Fixed a typo, and added fatalx() as an alternative to - fatal_with_errno() - * [r3702] docs/man/skel.txt: Update skeleton driver man page. + * drivers/skel.c: Update comments in skel.c Fixed a typo, and added + fatalx() as an alternative to fatal_with_errno() + * docs/man/skel.txt: Update skeleton driver man page. 2012-08-03 Charles Lepple - * [r3701] docs/man/nutscan.txt, docs/man/nutscan_scan_avahi.txt: - nutscan documentation: editing + * docs/man/nutscan.txt, docs/man/nutscan_scan_avahi.txt: nutscan + documentation: editing 2012-07-31 Arnaud Quette - * [r3699] docs/images/simple.png: Remove extraneous text - * [r3698] data/driver.list.in: Add support for UNITEK Alpha650ipF - and Alpha650ipE - - Add UNITEK Alpha650ipF and Alpha650ipE (USB ID 0x0f03:0x0001) to - the list of blazer_usb supported models (reported by Pascal - MIRALLES) - * [r3697] docs/website/projects.txt: Reference Buffalo NAS in - Related projects - - Add a reference in the Related projects, on Buffalo TerraStation - (Business-class) NAS range, which uses NUT for power protection + * docs/images/simple.png: Remove extraneous text + * data/driver.list.in: HCL: Add support for UNITEK Alpha650ipF and + Alpha650ipE Add UNITEK Alpha650ipF and Alpha650ipE (USB ID + 0x0f03:0x0001) to the list of blazer_usb supported models (reported + by Pascal MIRALLES) + * docs/website/projects.txt: Reference Buffalo NAS in Related + projects Add a reference in the Related projects, on Buffalo + TerraStation (Business-class) NAS range, which uses NUT for power + protection 2012-07-30 Arnaud Quette - * [r3696] docs/download.txt, docs/website/news.txt: First NUT - virtualization package (VMware ESXI 5.0) - - Add the reference to the first NUT virtualization package. This - one is currently an external effort to add VMware NUT client for - ESXI 5.0. But this support will be part of NUT in the long run + * docs/download.txt, docs/website/news.txt: First NUT virtualization + package (VMware ESXI 5.0) Add the reference to the first NUT + virtualization package. This one is currently an external effort to + add VMware NUT client for ESXI 5.0. But this support will be part + of NUT in the long run 2012-07-24 Charles Lepple - * [r3692] data/driver.list.in, docs/man/powercom.txt, - drivers/powercom-hid.c: Synchronize Powercom USB documentation - and code comments. - + * data/driver.list.in, docs/man/powercom.txt, drivers/powercom-hid.c: + Synchronize Powercom USB documentation and code comments. Apparently, there are at least two different models with the USB - VID:PID of 0d9f:0004. This update is based on the following - report by Gordon Longland: - - http://lists.alioth.debian.org/pipermail/nut-upsuser/2012-July/007748.html + VID:PID of 0d9f:0004. This update is based on the following report + by Gordon Longland: http://lists.alioth.debian.org/pipermail/nut- + upsuser/2012-July/007748.html 2012-07-23 Charles Lepple - * [r3689] docs/man/powercom.txt: powercom: Mention this driver is - serial only + * docs/man/powercom.txt: powercom: Mention this driver is serial only 2012-07-20 Frederic Bohe - * [r3688] data/driver.list.in, drivers/Makefile.am: Switch mge-shut - to oldmge-shut and newmge-shut to mge-shut - * [r3687] docs/man/mge-shut.txt: Update mge-shut man page for - notification argument. - * [r3686] drivers/usbhid-ups.c: Add a "notification" parameter to - newmge-shut driver. - - It is only here for compatibility with mge-shut driver. It is - ignored since we are always using SHUT_SYNC_OFF in libshut.c. + * data/driver.list.in, drivers/Makefile.am: Switch mge-shut to + oldmge-shut and newmge-shut to mge-shut + * docs/man/mge-shut.txt: Update mge-shut man page for notification + argument. + * drivers/usbhid-ups.c: Add a "notification" parameter to newmge-shut + driver. It is only here for compatibility with mge-shut driver. It + is ignored since we are always using SHUT_SYNC_OFF in libshut.c. + +2012-07-20 Emilien Kia + + * README, docs/Makefile.am, docs/config-notes.txt, docs/contact- + closure.txt, docs/macros.txt, docs/man/mge-shut.txt, + docs/man/upscli_connect.txt, docs/man/upscli_disconnect.txt, + docs/man/upscli_fd.txt, docs/man/upscli_get.txt, + docs/man/upscli_list_next.txt, docs/man/upscli_list_start.txt, + docs/man/upscli_readline.txt, docs/man/upscli_sendline.txt, + docs/man/upscli_ssl.txt, docs/man/upscli_strerror.txt, + docs/man/upscli_upserror.txt, docs/man/upsclient.txt, + docs/scheduling.txt, docs/security.txt: Fix trunk merge (pass 2). + Apply changes to doc to prepare merge to trunk. + +2012-07-19 Emilien Kia + + * clients/upsclient.c, server/netssl.c, server/netssl.h: Fix trunk + merge. Refactor and clean to prepare merge to trunk. 2012-07-19 Frederic Bohe - * [r3683] docs/man/mge-shut.txt: Add a note in man page about - ondelay parameter unit discrepency between newmge-shut and - mge-shut driver. - - mge-shut use a ten seconds unit for ondelay whereas newmge-shut - uses seconds. - * [r3682] drivers/usbhid-ups.c, drivers/usbhid-ups.h: Add a lowbatt - setting to newmge-shut in order to mimic mge-shut setting + * docs/man/mge-shut.txt: Document ondelay parameter unit discrepency + for SHUT drivers mge-shut uses a ten seconds unit for ondelay + whereas newmge-shut uses seconds. + * drivers/usbhid-ups.c, drivers/usbhid-ups.h: Add a lowbatt setting + to newmge-shut in order to mimic mge-shut setting -2012-07-19 Emilien Kia +2012-07-19 Emilien Kia - * [r3681] server/Makefile.am, server/conf.c, server/netcmds.h, + * server/Makefile.am, server/conf.c, server/netcmds.h, server/netssl.c, server/netssl.h, server/ssl.c, server/ssl.h, server/upsd.c: Replace server/ssl.[h|c] by server/netssl.[h|c] in order to prepare nss branch merging. +2012-07-18 Emilien Kia + + * .gitignore, INSTALL, MAINTAINERS, Makefile.am, NEWS, UPGRADING, + autogen.sh, clients/Makefile.am, clients/upsc.c, + clients/upsclient.c, clients/upsclient.h, clients/upsmon.c, + clients/upsmon.h, clients/upsrw.c, clients/upssched.c, + common/Makefile.am, common/common.c, common/parseconf.c, + common/state.c, common/upsconf.c, compile, conf/nut.conf.sample, + conf/upsd.conf.sample, configure.in, data/cmdvartab, + data/driver.list.in, docs/.gitignore, docs/FAQ.txt, + docs/Makefile.am, docs/acknowledgements.txt, docs/cables.txt, + docs/cables/apc.txt, docs/config-notes.txt, docs/configure.txt, + docs/design.txt, docs/developer-guide.txt, docs/developers.txt, + docs/documentation.txt, docs/download.txt, docs/features.txt, + docs/images/advanced.png, docs/images/bigbox.png, + docs/images/bizarre.png, docs/images/nut-logo.png, + docs/images/nut.svg, docs/images/simple.png, docs/macros.txt, docs + /maintainer-guide.txt, docs/man/.gitignore, docs/man/Makefile.am, + docs/man/apcsmart-old.txt, docs/man/apcsmart.txt, + docs/man/bcmxcp.txt, docs/man/belkinunv.txt, docs/man/blazer.txt, + docs/man/dummy-ups.txt, docs/man/index.txt, docs/man/metasys.txt, + docs/man/nut-ipmipsu.txt, docs/man/nut-recorder.txt, docs/man/nut- + scanner.txt, docs/man/nut.conf.txt, docs/man/nutscan.txt, + docs/man/nutscan_add_device_to_device.txt, + docs/man/nutscan_add_option_to_device.txt, + docs/man/nutscan_cidr_to_ip.txt, + docs/man/nutscan_display_parsable.txt, + docs/man/nutscan_display_ups_conf.txt, + docs/man/nutscan_free_device.txt, docs/man/nutscan_init.txt, + docs/man/nutscan_new_device.txt, docs/man/nutscan_scan_avahi.txt, + docs/man/nutscan_scan_ipmi.txt, docs/man/nutscan_scan_nut.txt, + docs/man/nutscan_scan_snmp.txt, docs/man/nutscan_scan_usb.txt, + docs/man/nutscan_scan_xml_http.txt, docs/man/nutupsdrv.txt, + docs/man/oneac.txt, docs/man/powercom.txt, docs/man/snmp-ups.txt, + docs/man/ups.conf.txt, docs/man/upsc.txt, + docs/man/upscli_list_start.txt, docs/man/upsd.users.txt, + docs/man/upsmon.txt, docs/man/upsrw.txt, docs/net-protocol.txt, + docs/new-clients.txt, docs/new-drivers.txt, docs/nut-names.txt, + docs/security.txt, docs/sock-protocol.txt, docs/stable-hcl.txt, + docs/support.txt, docs/website/Makefile.am, docs/website/css/web- + layout.css, docs/website/faviconut.ico, docs/website/faviconut.png, + docs/website/news.txt, docs/website/projects.txt, docs/website/ups- + protocols.txt, docs/website/web-layout.conf, drivers/.gitignore, + drivers/Makefile.am, drivers/apc-hid.c, drivers/apc-mib.c, drivers + /apcsmart-old.c, drivers/apcsmart-old.h, drivers/apcsmart.c, + drivers/apcsmart.h, drivers/apcsmart_tabs.c, + drivers/apcsmart_tabs.h, drivers/bcmxcp.c, drivers/bcmxcp.h, + drivers/bcmxcp_ser.c, drivers/bcmxcp_usb.c, drivers/belkin-hid.c, + drivers/belkinunv.c, drivers/bestfcom.c, drivers/bestfortress.c, + drivers/bestpower-mib.c, drivers/bestups.c, drivers/blazer.c, + drivers/blazer_ser.c, drivers/blazer_usb.c, drivers/compaq-mib.c, + drivers/cps-hid.c, drivers/cyberpower-mib.c, drivers/cyberpower- + mib.h, drivers/dstate.c, drivers/dstate.h, drivers/dummy-ups.c, + drivers/dummy-ups.h, drivers/eaton-mib.c, drivers/eaton-mib.h, + drivers/etapro.c, drivers/gamatronic.c, drivers/genericups.c, + drivers/ietf-mib.c, drivers/isbmex.c, drivers/libhid.c, + drivers/libshut.c, drivers/liebert-esp2.c, drivers/liebert-hid.c, + drivers/main.c, drivers/masterguard.c, drivers/metasys.c, drivers + /mge-hid.c, drivers/mge-mib.c, drivers/mge-shut.c, drivers/mge- + utalk.c, drivers/microdowell.c, drivers/netvision-mib.c, drivers + /netxml-ups.c, drivers/nut-ipmi.h, drivers/nut-ipmipsu.c, drivers + /nut-libfreeipmi.c, drivers/oneac.c, drivers/oneac.h, drivers + /powercom-hid.c, drivers/powercom.c, drivers/powercom.h, drivers + /powerware-mib.c, drivers/raritan-pdu-mib.c, drivers/rhino.c, + drivers/safenet.c, drivers/snmp-ups.c, drivers/snmp-ups.h, + drivers/solis.c, drivers/tripplite-hid.c, drivers/tripplite_usb.c, + drivers/tripplitesu.c, drivers/upscode2.c, drivers/upshandler.h, + drivers/usb-common.c, drivers/usbhid-ups.c, include/.gitignore, + include/Makefile.am, include/common.h, include/extstate.h, + include/nut_stdint.h, include/parseconf.h, include/state.h, + lib/.gitignore, lib/Makefile.am, lib/README, lib/libnutscan.pc.in, + lib/libupsclient-config.in, lib/libupsclient.pc.in, + m4/ax_create_stdint_h.m4, m4/nut_check_libavahi.m4, + m4/nut_check_libfreeipmi.m4, m4/nut_check_libltdl.m4, + m4/nut_check_libwrap.m4, m4/nut_check_os.m4, + m4/nut_report_feature.m4, scripts/HP-UX/.gitignore, scripts/HP- + UX/makedepot.sh, scripts/HP-UX/nut.psf.in, scripts/Makefile.am, + scripts/README, scripts/augeas/Makefile.am, scripts/augeas/README, + scripts/avahi/nut.service.in, scripts/java/Makefile.am, + scripts/java/README, scripts/java/jNut/README, + scripts/java/jNut/pom.xml, + .../main/java/org/networkupstools/jnut/Client.java, + .../java/org/networkupstools/jnut/Command.java, + .../main/java/org/networkupstools/jnut/Device.java, + .../org/networkupstools/jnut/NutException.java, + .../java/org/networkupstools/jnut/Scanner.java, + .../org/networkupstools/jnut/StringLineSocket.java, + .../java/org/networkupstools/jnut/Variable.java, + .../java/org/networkupstools/jnut/ClientTest.java, + .../java/org/networkupstools/jnut/ScannerTest.java, + scripts/java/jNutList/README, scripts/java/jNutList/pom.xml, + .../java/org/networkupstools/jnutlist/AppList.java, + scripts/java/jNutWebAPI/README, scripts/java/jNutWebAPI/pom.xml, + .../jnutwebapi/NutRestProvider.java, + .../jnutwebapi/RestWSApplication.java, + .../jnutwebapi/ScannerProvider.java, .../jNutWebAPI/src/main/webapp + /WEB-INF/web.xml, scripts/logrotate/nutlogd, + scripts/python/module/PyNUT.py, scripts/systemd/Makefile.am, + scripts/systemd/README, scripts/systemd/nut-driver.service.in, + scripts/systemd/nut-monitor.service.in, scripts/systemd/nut- + server.service.in, scripts/systemd/nutshutdown.in, + scripts/udev/.gitignore, scripts/udev/Makefile.am, + scripts/udev/README, scripts/udev/nut-ipmipsu.rules.in, + scripts/ufw/README, scripts/ufw/nut.ufw.profile.in, + scripts/upower/95-upower-hid.rules, server/Makefile.am, + server/ctype.h, server/netcmds.h, server/netget.c, server/netget.h, + server/netinstcmd.c, server/netinstcmd.h, server/netlist.c, + server/netlist.h, server/netmisc.c, server/netmisc.h, + server/netset.c, server/netset.h, server/netssl.c, server/netssl.h, + server/netuser.c, server/netuser.h, server/nut_ctype.h, + server/sstate.c, server/sstate.h, server/upsd.c, server/upsd.h, + server/user.c, tests/Makefile.am, tests/cpputest.cpp, + tests/example.cpp, tools/Makefile.am, tools/device-recorder.sh, + tools/git-svn.authors, tools/nut-hclinfo.py, tools/nut-recorder.sh, + tools/nut-scanner/Makefile.am, tools/nut-scanner/README, tools/nut- + scanner/nut-scan.h, tools/nut-scanner/nut-scanner.c, tools/nut- + scanner/nutscan-device.c, tools/nut-scanner/nutscan-device.h, tools + /nut-scanner/nutscan-display.c, tools/nut-scanner/nutscan-init.c, + tools/nut-scanner/nutscan-init.h, tools/nut-scanner/nutscan-ip.c, + tools/nut-scanner/nutscan-ip.h, tools/nut-scanner/scan_avahi.c, + tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools + /nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut- + scanner/scan_xml_http.c, tools/nut-snmpinfo.py, tools/nut- + usbinfo.pl, tools/svn2cl.authors: Merge from trunk [[SVN:2848]] to + [[SVN:3679]] to ssl-nss-port. Note: a problem is occurring for + server/ssl.[h|c]: they have been moved to server/netssl.[h|c] but + consider them as removed. For the branch merging to trunk, + consider paying attention to the case of these files (removing them + by hand). + 2012-07-17 Arnaud Quette - * [r3678] drivers/apc-mib.c: APC SNMP MIB update and completion - - Add available high precision values, new variables + * drivers/apc-mib.c: APC SNMP MIB update and completion Add + available high precision values, new variables (input.transfer.reason, battery.current.total and ups.test.date), - and move ambient.{temperature,humidity}.{high,low} to - ambient.1.*, since they relate to alarm threshold of external - probe 1 (patch from Hong-Gunn Chew) - * [r3677] docs/nut-names.txt: Clarify the use of multiple ambient - sensors - + and move ambient.{temperature,humidity}.{high,low} to ambient.1.*, + since they relate to alarm threshold of external probe 1 (patch + from Hong-Gunn Chew) + * docs/nut-names.txt: Clarify the use of multiple ambient sensors Multiple sensors can be exposed using the indexed notation. 'ambient.*', without index or using '0', relates to the embedded sensor. For example: 'ambient.temperature' represent the embedded sensor temperature. Other sensors (external, communication card, ...) can use indexes from '1' to 'n'. For example: - 'ambient.1.temperature' for the first external sensor - temperature. - * [r3676] docs/nut-names.txt: NUT namespace completion - - Add two new variables 'ups.test.date' and - 'battery.current.total'. Also add a note on the 'ambient' - collection for supporting multiple sensors + 'ambient.1.temperature' for the first external sensor temperature. + * docs/nut-names.txt: NUT namespace completion Add two new variables + 'ups.test.date' and 'battery.current.total'. Also add a note on the + 'ambient' collection for supporting multiple sensors 2012-07-16 Arnaud Quette - * [r3675] drivers/nut-ipmipsu.c, drivers/nut-libfreeipmi.c, - m4/nut_check_libfreeipmi.m4, tools/nut-scanner/nut-scanner.c, - tools/nut-scanner/scan_ipmi.c: Support for FreeIPMI 1.1.x and - 1.2.x - + * drivers/nut-ipmipsu.c, drivers/nut-libfreeipmi.c, + m4/nut_check_libfreeipmi.m4, tools/nut-scanner/nut-scanner.c, tools + /nut-scanner/scan_ipmi.c: Support for FreeIPMI 1.1.x and 1.2.x Prepare for supporting API changes in FreeIPMI 1.1.x and 1.2.x. - This is mostly related to SDR API simplifications. A 2nd - iteration will probably address code redundancy, whenever - possible + This is mostly related to SDR API simplifications. A 2nd iteration + will probably address code redundancy, whenever possible 2012-07-10 Arnaud Quette - * [r3674] data/driver.list.in, drivers/eaton-mib.c, - drivers/eaton-mib.h, drivers/snmp-ups.c, drivers/snmp-ups.h: Add - support for Eaton ePDU Switched (Pulizzi) - - Implement support for older Eaton / Powerware ePDU Switched. - These were once sold as Pulizzi, and have now been replaced by - newer model (Eaton Marlin implementation and others) + * data/driver.list.in, drivers/eaton-mib.c, drivers/eaton-mib.h, + drivers/snmp-ups.c, drivers/snmp-ups.h: Add support for Eaton ePDU + Switched (Pulizzi) Implement support for older Eaton / Powerware + ePDU Switched. These were once sold as Pulizzi, and have now been + replaced by newer model (Eaton Marlin implementation and others) -2012-07-09 Emilien Kia +2012-07-09 Emilien Kia - * [r3672] configure.in: Fix CppUnit detection. - - Fix inconsistent test for CppUnit install (using pkg-config) to - really enable unit tests. + * configure.in: Fix CppUnit detection. Fix inconsistent test for + CppUnit install (using pkg-config) to really enable unit tests. 2012-07-05 Arnaud Quette - * [r3671] docs/man/nut-ipmipsu.txt: Fix an error on possible power - supplies status + * docs/man/nut-ipmipsu.txt: Fix an error on possible power supplies + status 2012-07-04 Arnaud Quette - * [r3670] clients/upssched.c: Fix upssched regression - - Coverity branch merge r3555 introduced a regression: any - upssched.conf command that takes a second argument resulted in a - defective frame sent to the parent process. Thus, the command was - not executed (patch from Oliver Schonefeld) - * [r3669] Makefile.am, configure.in, tests, tests/Makefile.am: Add - basic infrastructure for unit tests - - Merge eki-unittests branch, with some adjustments, to add a basic - initial infrastructure for unit tests, using CppUnit (v1.9.6+) - (from Emilien Kia, from Eaton) + * clients/upssched.c: Fix upssched regression Coverity branch merge + [[SVN:3555]] introduced a regression: any upssched.conf command + that takes a second argument resulted in a defective frame sent to + the parent process. Thus, the command was not executed (patch from + Oliver Schonefeld) + * Makefile.am, configure.in, tests/.gitignore, tests/Makefile.am, + tests/cpputest.cpp, tests/example.cpp: Add basic infrastructure for + unit tests Merge eki-unittests branch, with some adjustments, to + add a basic initial infrastructure for unit tests, using CppUnit + (v1.9.6+) (from Emilien Kia, from Eaton) 2012-07-03 Arnaud Quette - * [r3668] scripts/systemd/nut-driver.service.in, - scripts/systemd/nutshutdown.in: Fix upsdrvctl call path - - upsdrvctl is located in @driverexecdir@, not @SBINDIR@ (reported - by Michal Hlavinka, from Redhat) + * scripts/systemd/nut-driver.service.in, + scripts/systemd/nutshutdown.in: Fix upsdrvctl call path upsdrvctl + is located in @driverexecdir@, not @SBINDIR@ (reported by Michal + Hlavinka, from Redhat) 2012-06-15 Arnaud Quette - * [r3666] configure.in: Adapt systemd installation directory #2 - - Complete commit r3665, by also adapting paths for service files + * configure.in: Adapt systemd installation directory #2 Complete + previous commit by also adapting paths for service files 2012-06-14 Arnaud Quette - * [r3665] configure.in: Adapt systemd installation directory - - Adapt systemd installation directory for the shutdown script, so - that it does not try to install it in the actual system - directory, but to the pointed build directory, including a sub - directory prefix - * [r3664] docs/new-clients.txt: Fix broken link to upscli_*(3) HTML - manual pages + * configure.in: Adapt systemd installation directory Adapt systemd + installation directory for the shutdown script, so that it does not + try to install it in the actual system directory, but to the + pointed build directory, including a sub directory prefix + * docs/new-clients.txt: Fix broken link to upscli_*(3) HTML manual + pages 2012-06-12 Arnaud Quette - * [r3662] docs/new-drivers.txt: Forgotten mention - - upsdrv_info_t->name is also published as "driver.name" variable - * [r3661] docs/man/belkinunv.txt, drivers/belkinunv.c, - drivers/main.c, drivers/masterguard.c, drivers/metasys.c, - drivers/mge-utalk.c, drivers/microdowell.c, - drivers/nut-ipmipsu.c, drivers/safenet.c, drivers/tripplitesu.c, - drivers/usbhid-ups.c: Remove redundant driver.version.internal - publication - * [r3660] configure.in, docs/configure.txt, - docs/man/nut-scanner.txt: Add missing references to libltdl for - nut-scanner - - nut-scanner requires libltdl (Libtool dlopen abstraction) since - NUT 2.6.3. Documentations have been completed, and nut-scanner - build status is now exposed in the build configuration summary - * [r3659] drivers/snmp-ups.c: Fix publication of - driver.version.data - - Publish the MIB name and version in driver.version.data, rather - than merged into driver.version.internal - * [r3658] drivers/netxml-ups.c: Fix publication of - driver.version.data - + * configure.in: Fix WITH_SSL and WITH_NSS AM_CONDITIONAL definitions + nut_with_nss / nut_with_openssl must be set to "yes", otherwise + AM_CONDITIONAL counterpart WITH_NSS / WITH_SSL is not defined + * docs/new-drivers.txt: Forgotten mention upsdrv_info_t->name is + also published as "driver.name" variable + * docs/man/belkinunv.txt, drivers/belkinunv.c, drivers/main.c, + drivers/masterguard.c, drivers/metasys.c, drivers/mge-utalk.c, + drivers/microdowell.c, drivers/nut-ipmipsu.c, drivers/safenet.c, + drivers/tripplitesu.c, drivers/usbhid-ups.c: Remove redundant + driver.version.internal publication + * configure.in, docs/configure.txt, docs/man/nut-scanner.txt: Add + missing references to libltdl for nut-scanner nut-scanner requires + libltdl (Libtool dlopen abstraction) since NUT 2.6.3. + Documentations have been completed, and nut-scanner build status is + now exposed in the build configuration summary + * drivers/snmp-ups.c: Fix publication of driver.version.data Publish + the MIB name and version in driver.version.data, rather than merged + into driver.version.internal + * drivers/netxml-ups.c: Fix publication of driver.version.data netxml-ups subdriver version is to be tracked in driver.version.data, not in driver.version.internal - * [r3657] docs/nut-names.txt: Add missing variable - driver.version.data - - Add variable driver.version.data, to track version of the - internal data mapping, for generic drivers (reported by Luiz - Angelo Daros de Luca) - * [r3656] docs/nut-names.txt: Fix comment for - driver.version.internal - - Drivers internal version are always tracked separately, and - stored in driver.version.internal + * docs/nut-names.txt: Add missing variable driver.version.data Add + variable driver.version.data, to track version of the internal data + mapping, for generic drivers (reported by Luiz Angelo Daros de + Luca) + * docs/nut-names.txt: Fix comment for driver.version.internal + Drivers internal version are always tracked separately, and stored + in driver.version.internal 2012-06-11 Michal Soltys - * [r3655] drivers/apcsmart.c: apcsmart: tcsetattr/tcgetattr - addendum - - This small patch moves the comparison sequence into separate - function. No functional changes. - - Also minor retab! run on defines. + * drivers/apcsmart.c: apcsmart: tcsetattr/tcgetattr addendum This + small patch moves the comparison sequence into separate function. + No functional changes. Also minor retab! run on defines. 2012-06-11 Arnaud Quette - * [r3654] data/driver.list.in: Add support for REDi Blazer - - Add REDi Blazer 400VA / 600VA / 800VA to the list of blazer_ser - supported models (reported by Marius Gavrilescu) - * [r3653] docs/nut-names.txt: Fix a typo error on power.minimum - description - + * data/driver.list.in: HCL: Add support for REDi Blazer Add REDi + Blazer 400VA / 600VA / 800VA to the list of blazer_ser supported + models (reported by Marius Gavrilescu) + * docs/nut-names.txt: Fix a typo error on power.minimum description power.minimum is really the minimum seen apparent power in VA (reported by Luiz Angelo Daros de Luca) 2012-06-07 Arnaud Quette - * [r3652] data/driver.list.in, drivers/blazer_usb.c: Add support - for Online Zinto A - - Add Online Zinto A (USB ID 0x06da:0x0601) to the list of - blazer_usb supported models (reported by Carsten Burkhardt) + * data/driver.list.in, drivers/blazer_usb.c: HCL: Add support for + Online Zinto A to blazer_usb Add Online Zinto A (USB ID + 0x06da:0x0601) to the list of blazer_usb supported models (reported + by Carsten Burkhardt) 2012-06-07 Charles Lepple - * [r3651] drivers/oneac.h: Remove unused constants to fix LLVM - compilation error. + * drivers/oneac.h: Remove unused constants to fix LLVM compilation + error. 2012-06-05 Arnaud Quette - * [r3650] docs/website/news.txt, docs/website/projects.txt: WMNut - updates - + * docs/website/news.txt, docs/website/projects.txt: WMNut updates Update WMNut release (0.64) and hosting URL 2012-06-04 Arnaud Quette - * [r3647] docs/download.txt, docs/website/news.txt: Update Windows - package publications for 2.6.4-1 + * docs/download.txt, docs/website/news.txt: Update Windows package + publications for 2.6.4-1 2012-05-31 Arnaud Quette - * [r3643] NEWS, UPGRADING, configure.in, docs/website/news.txt: - Final update for 2.6.4 release + * NEWS, UPGRADING, configure.in, docs/website/news.txt: Final update + for 2.6.4 release 2012-05-30 Arnaud Quette - * [r3642] data/driver.list.in: Add support for Cyber Power Systems - CP1000PFCLCD - - Add CyberPower Systems CP1000PFCLCD (USB ID 0x0764:0x0501) to the - list of usbhid-ups supported models (reported by David Owen) - * [r3641] drivers/apc-mib.c: Track more APC SNMP sysOID values, as - comments - * [r3640] drivers/upshandler.h: Fix code spacing (no functional - change) - * [r3639] drivers/bcmxcp_ser.c, drivers/bcmxcp_usb.c: Add some - debug traces on incoming / outgoing data - * [r3638] INSTALL: Add missing reference to nut.conf manual page - * [r3637] drivers/bestfortress.c: Improve Best Fortress LI675VA - support - + * data/driver.list.in: HCL: Add support for Cyber Power Systems + CP1000PFCLCD Add CyberPower Systems CP1000PFCLCD (USB ID + 0x0764:0x0501) to the list of usbhid-ups supported models (reported + by David Owen) + * drivers/apc-mib.c: Track more APC SNMP sysOID values, as comments + * drivers/upshandler.h: Fix code spacing (no functional change) + * drivers/bcmxcp_ser.c, drivers/bcmxcp_usb.c: Add some debug traces + on incoming / outgoing data + * INSTALL: Add missing reference to nut.conf manual page + * drivers/bestfortress.c: Improve Best Fortress LI675VA support Apply an old missed patch: all responses are preceded and terminated by "CR LF". But bestfortress driver discards anything after the first "CR LF". This patch trims everything up to the first LF. (patch from Jørgen Thomsen) - * [r3636] drivers/metasys.c: Remove extraneous spaces (no - functional changes) + * drivers/metasys.c: Remove extraneous spaces (no functional changes) + +2012-05-30 Prachi Gandhi + + * scripts/Solaris/preinstall: Updated preinstall script for 'nut' + group, user checking + * Makefile.am, scripts/Solaris/Makefile.am, + scripts/Solaris/preinstall: Added checking for existing 'nut' + group, user and updated package name 2012-05-29 Arnaud Quette - * [r3633] common/parseconf.c: Fix CVE-2012-2944: upsd can be - remotely crashed - - NUT server (upsd), from versions 2.4.0 to 2.6.3, are exposed to - crashes when receiving random data from the network. - - This issue is related to the way NUT parses characters, - especially from the network. Non printable characters were missed - from strings operation (such as strlen), but still copied to the - buffer, causing an overflow. - - Thus, fix NUT parser, to only allow the subset Ascii charset from - Space to ~ - - (Reported by Sebastian Pohle, Alioth bug #313636, CVE-2012-2944) - * [r3632] data/driver.list.in: Add support for Lexis X-power Tigra - 1kVA - + * common/parseconf.c: Fix CVE-2012-2944: upsd can be remotely crashed + NUT server (upsd), from versions 2.4.0 to 2.6.3, are exposed to + crashes when receiving random data from the network. This issue is + related to the way NUT parses characters, especially from the + network. Non printable characters were missed from strings + operation (such as strlen), but still copied to the buffer, causing + an overflow. Thus, fix NUT parser, to only allow the subset Ascii + charset from Space to ~ (Reported by Sebastian Pohle, Alioth bug + #313636, CVE-2012-2944) + * data/driver.list.in: HCL: Add support for Lexis X-power Tigra 1kVA Add Lexis X-power Tigra 1kVA to the list of blazer_ser or bestups supported models (reported by Tmima Pliroforikis Perifereiakis Enotitas Pierias) - * [r3631] data/driver.list.in: Encourage the use of blazer_ser - instead of bestups - - Mention blazer_ser as prefered compared to bestups. Recent - changes to blazer_ser have made it possible to use it instead of - bestups. In the end, bestups will be replaced by blazer_ser, as - for other Megatec/Q1 drivers - * [r3629] drivers/blazer.c, drivers/blazer_ser.c: Improve Best UPS - support in blazer - - Best UPS units, which use a subset of the Megatec/Q1 protocol, - supported by the blazer drivers, can now work with blazer_ser. - This support is still limited, but already offers a decent set of - features + * data/driver.list.in: HCL: Encourage the use of blazer_ser instead + of bestups Mention blazer_ser as prefered compared to bestups. + Recent changes to blazer_ser have made it possible to use it + instead of bestups. In the end, bestups will be replaced by + blazer_ser, as for other Megatec/Q1 drivers + +2012-05-29 Prachi Gandhi + + * Makefile.am, configure.in, tools/nut-scanner/Makefile.am, tools + /nut-scanner/nut-scan.h, tools/nut-scanner/nutscan-init.c, tools + /nut-scanner/nutscan-init.h, tools/nut-scanner/scan_snmp.c: Changes + in nut-scanner to remove Sparc 'usmAESPrivProtocol' error while + creating package + +2012-05-29 Arnaud Quette + + * drivers/blazer.c, drivers/blazer_ser.c: Improve Best UPS support in + blazer Best UPS units, which use a subset of the Megatec/Q1 + protocol, supported by the blazer drivers, can now work with + blazer_ser. This support is still limited, but already offers a + decent set of features 2012-05-25 Arnaud Quette - * [r3628] server/user.c: Add debug traces for instcmds and actions - - Whenever upsd adds an instant command or an action, from - upsd.users, display a debug trace - * [r3627] docs/man/upsd.users.txt: Clarify multiple actions - specification - + * server/user.c: Add debug traces for instcmds and actions Whenever + upsd adds an instant command or an action, from upsd.users, display + a debug trace + * docs/man/upsd.users.txt: Clarify multiple actions specification Add more details and an example, to illustrate multiple actions specification (reported by Emilien Kia, from Eaton) 2012-05-24 Arnaud Quette - * [r3626] data/driver.list.in: Add support for Eaton Management - Card Contact - - Add Eaton Management Card Contact (ref 66104) to the list of - mge-shut or mge-utalk supported models - * [r3625] drivers/compaq-mib.c: HP SNMP completion - - Complete HP SNMP mapping table, with thresholds, nominal values - and more commands + * data/driver.list.in: HCL: Add support for Eaton Management Card + Contact Add Eaton Management Card Contact (ref 66104) to the list + of mge-shut or mge-utalk supported models + * drivers/compaq-mib.c: HP SNMP completion Complete HP SNMP mapping + table, with thresholds, nominal values and more commands 2012-05-23 Arnaud Quette - * [r3623] clients/upsrw.c, common/state.c, - docs/man/upscli_list_start.txt, docs/man/upsrw.txt, - docs/net-protocol.txt, docs/new-drivers.txt, - docs/sock-protocol.txt, drivers/dstate.c, drivers/dstate.h, - include/extstate.h, include/state.h, - scripts/java/jNut/src/main/java/org/networkupstools/jnut/Variable.java, - server/netget.c, server/netlist.c, server/netset.c, - server/sstate.c, server/sstate.h: Support of ranges of values for - writable variables - - Merge branch that implement [RFC]: new dstate_addrange() and - "LIST RANGE" command: it is now possible to specify one or more - ranges of values for writable variables, using dstate_addrange() - in drivers. upsd also supports the new type 'RANGE' for 'GET - TYPE', along with the 'LIST RANGE' command. Finally, users can - interact through upsrw, which displays the supported ranges, and - enforces new value checking against the provided boundaries - * [r3622] docs/website/projects.txt: Reference Thecus NAS in - Related projects - - Add a reference in the Related projects, on Thecus NAS range, - which uses NUT for power protection + * docs/website/projects.txt: Reference Thecus NAS in Related projects + Add a reference in the Related projects, on Thecus NAS range, which + uses NUT for power protection 2012-05-22 Arnaud Quette - * [r3621] drivers/apcsmart.c, drivers/apcsmart.h: Complete r3620 - for HP-UX - - HP-UX does not support VREPRINT, so make it conditional - * [r3620] drivers/apcsmart.c, drivers/apcsmart.h: Fix commit r3603 - - Commit r3603 (fix tcsetattr() / tcgetattr() issue) has introduced - some incompatibility with older Unix systems, such as Solaris, - Aix and HP-UX. The present commit should address it - * [r3618] configure.in, docs/net-protocol.txt, server/netcmds.h, + * drivers/apcsmart.c, drivers/apcsmart.h: Complete previous commit + for HP-UX HP-UX does not support VREPRINT, so make it conditional + * drivers/apcsmart.c, drivers/apcsmart.h: Fix commit [[SVN:3603]] + Commit [[SVN:3603]] (fix tcsetattr() / tcgetattr() issue) has + introduced some incompatibility with older Unix systems, such as + Solaris, Aix and HP-UX. The present commit should address it. + * scripts/java/jNut/src/main/java/org/networkupstools/jnut/Variable.j + ava: Adjust comment (no functional change) + * configure.in, docs/net-protocol.txt, server/netcmds.h, server/netmisc.c, server/netmisc.h: Add versioning to the network + protocol Due to the number of recent evolutions to the network + protocol, along with other possible future changes, NUT network + protocol is now versioned. The chapter "Network protocol + information", of the developer guide, stores the revision history, + while a new "NETVER" command serves this information through the protocol - - Due to the number of recent evolutions to the network protocol, - along with other possible future changes, NUT network protocol is - now versioned. The chapter "Network protocol information", of the - developer guide, stores the revision history, while a new - "NETVER" command serves this information through the protocol 2012-05-21 Arnaud Quette - * [r3617] data/driver.list.in: Complete the supported PowerWalker - ranges - - Add PowerWalker Online VFI LCD, Line-Interactive VI LCD and - Line-Interactive VI models to the list of blazer_usb supported - models - * [r3616] data/driver.list.in: Add support for Microline C-Lion - Innova ranges - - Add Microline C-Lion Innova models to the list of blazer_usb - supported models - * [r3614] data/driver.list.in: Add support for KOLFF ranges - - Add KOLFF BLACK NOVA models to the list of blazer_usb supported - models - * [r3613] data/driver.list.in: Add support Ippon INNOVA RT range - - Add Ippon INNOVA RT models to the list of blazer_usb supported - models - * [r3612] data/driver.list.in: Add support for Gtec ranges - - Add Gtec models to the list of blazer_ser or blazer_usb supported - models - * [r3611] data/driver.list.in: Complete the supported EVER ranges - - Add EVER POWERLINE RT / 11 / 31 and DUO II Pro models to the list - of blazer_ser or blazer_usb supported models - * [r3610] data/driver.list.in: Add support for COVER ENERGY SA - ranges - + * data/driver.list.in: HCL: Complete the supported PowerWalker ranges + Add PowerWalker Online VFI LCD, Line-Interactive VI LCD and Line- + Interactive VI models to the list of blazer_usb supported models + * data/driver.list.in: HCL: Add support for Microline C-Lion Innova + ranges Add Microline C-Lion Innova models to the list of + blazer_usb supported models + +2012-05-21 Prachi Gandhi + + * Makefile.am, scripts/HP-UX/Makefile, scripts/HP-UX/nut.psf.in, + scripts/Makefile.am: generalized 'make package' call for Solaris, + HPUX package; updated nut.psf.in for HPUX + +2012-05-21 Arnaud Quette + + * data/driver.list.in: HCL: Add support for KOLFF ranges Add KOLFF + BLACK NOVA models to the list of blazer_usb supported models + * data/driver.list.in: HCL: Add support Ippon INNOVA RT range Add + Ippon INNOVA RT models to the list of blazer_usb supported models + * data/driver.list.in: HCL: Add support for Gtec ranges Add Gtec + models to the list of blazer_ser or blazer_usb supported models + * data/driver.list.in: HCL: Complete the supported EVER ranges Add + EVER POWERLINE RT / 11 / 31 and DUO II Pro models to the list of + blazer_ser or blazer_usb supported models + * data/driver.list.in: HCL: Add support for COVER ENERGY SA ranges Add COVER ENERGY SA models to the list of blazer_usb supported models - * [r3609] data/driver.list.in: Add support for Borri ranges - - Add Borri models to the list of blazer_usb supported models - * [r3608] data/driver.list.in: Add support for ARTronic ranges - - Add ARTronic models, both serial and USB, to the list of - blazer_ser and blazer_usb supported models - * [r3607] drivers/belkin-hid.c: Fix Liebert firmware (incorrect - exponents) - + * data/driver.list.in: HCL: Add support for Borri ranges Add Borri + models to the list of blazer_usb supported models + * data/driver.list.in: HCL: Add support for ARTronic ranges Add + ARTronic models, both serial and USB, to the list of blazer_ser and + blazer_usb supported models + +2012-05-21 Charles Lepple + + * drivers/belkin-hid.c: Fix Liebert firmware (incorrect exponents) There are at least two Liebert firmware types which both report a VID:PID of 10af:0001. The newer ones tend not to have the Belkin broken Usage Pages (and therefore use standard HID PDC paths) but - they have incorrect exponents for some fields. This patch fixes - the values for the latter implementation - - Author: Charles Lepple - * [r3606] data/driver.list.in, drivers/netvision-mib.c: Add - 3-phases support to Socomec Netvision MIB - - Improve Socomec Netvision MIB, by adding support for 3-phases UPS - (patch from Manuel Bouyer) - * [r3605] data/driver.list.in: Add support for PowerShield Defender - 1200VA - - Add PowerShield Defender 1200VA (USB ID 0665:5161) to the list of - blazer_usb supported models (reported by Tom Clarkson) - * [r3604] drivers/blazer.c, drivers/blazer_ser.c, - drivers/blazer_usb.c: beeper.status belongs to the "ups" data - collection + they have incorrect exponents for some fields. This patch fixes the + values for the latter implementation + +2012-05-21 Arnaud Quette + + * data/driver.list.in, drivers/netvision-mib.c: Add 3-phases support + to Socomec Netvision MIB Improve Socomec Netvision MIB, by adding + support for 3-phases UPS (patch from Manuel Bouyer) + * data/driver.list.in: HCL: Add support for PowerShield Defender + 1200VA Add PowerShield Defender 1200VA (USB ID 0665:5161) to the + list of blazer_usb supported models (reported by Tom Clarkson) + * drivers/blazer.c, drivers/blazer_ser.c, drivers/blazer_usb.c: + beeper.status belongs to the "ups" data collection 2012-05-16 Arnaud Quette - * [r3603] drivers/apcsmart.c, drivers/apcsmart.h: Final fix to the - tcsetattr() / tcgetattr() issue - - The most likely cause of all spurious differences between what - was set on the port with tcsetattr() and what tcgetattr() shows - are likely to do with the c_local PENDIN flag, which is a status - bit, not a control bit. It will change when there's unread - pending input, which can be quite often on an APC UPS. - - The right way to compare struct termios values is to clear the - status flags _after_ the tcsetattr() and of course after the - tcgetattr() call and then compare the result with what was set. - - Also set NOKERNINFO, if available, as we don't want the UPS or - noise on the line to accidentally trigger status output back to - the UPS, and finally make sure IEXTEN is also cleared along with - ISIG since it too can cause weird things to happen. - - This change also adds some debug code to show any differences in - the structures in a logical manner in debug output (and squashes - one tiny compiler warning) (patch from Greg A. Woods) - * [r3602] docs/config-notes.txt, docs/man/upsmon.txt: Whitespace - fixes - - Remove some extraneous spaces, suggested by "git diff --check", - and improve a bit formatting (patch #36 from Greg A. Woods) + * drivers/apcsmart.c, drivers/apcsmart.h: Final fix to the + tcsetattr() / tcgetattr() issue The most likely cause of all + spurious differences between what was set on the port with + tcsetattr() and what tcgetattr() shows are likely to do with the + c_local PENDIN flag, which is a status bit, not a control bit. It + will change when there's unread pending input, which can be quite + often on an APC UPS. The right way to compare struct termios + values is to clear the status flags _after_ the tcsetattr() and of + course after the tcgetattr() call and then compare the result with + what was set. Also set NOKERNINFO, if available, as we don't want + the UPS or noise on the line to accidentally trigger status output + back to the UPS, and finally make sure IEXTEN is also cleared along + with ISIG since it too can cause weird things to happen. This + change also adds some debug code to show any differences in the + structures in a logical manner in debug output (and squashes one + tiny compiler warning) (patch from Greg A. Woods) + * docs/config-notes.txt, docs/man/upsmon.txt: Whitespace fixes + Remove some extraneous spaces, suggested by "git diff --check", and + improve a bit formatting (patch #36 from Greg A. Woods) 2012-05-15 Arnaud Quette - * [r3601] drivers/snmp-ups.c, drivers/snmp-ups.h: Remove dead code - - Remove dead code, related to shutdown handling (no functional - changes) (based on patch #29 from Greg A. Woods) - * [r3599] docs/nut-names.txt: Fix formating issue - * [r3598] docs/nut-names.txt: Add missing battery.voltage data to - the namespace - - Add missing battery.voltage.{low,high} to the standard NUT - namespace - * [r3597] docs/nut-names.txt, drivers/upscode2.c: Rename - peakcurrent to current.peak (as per RFC) - - Rename peakcurrent to current.peak, since it is more coherent and - suitable - * [r3596] drivers/dummy-ups.c, drivers/dummy-ups.h: Update and - cleanup - + * drivers/snmp-ups.c, drivers/snmp-ups.h: Remove dead code Remove + dead code, related to shutdown handling (no functional changes) + (based on patch #29 from Greg A. Woods) + +2012-05-15 Prachi Gandhi + + * scripts/Solaris/Makefile.am: Updated scripts/Solaris/Makefile.am to + remove prototype, checkinstall + +2012-05-15 Arnaud Quette + + * docs/nut-names.txt: Fix formating issue + * docs/nut-names.txt: Add missing battery.voltage data to the + namespace Add missing battery.voltage.{low,high} to the standard + NUT namespace + * docs/nut-names.txt, drivers/upscode2.c: Rename peakcurrent to + current.peak (as per RFC) Rename peakcurrent to current.peak, + since it is more coherent and suitable + * drivers/dummy-ups.c, drivers/dummy-ups.h: Update and cleanup Convert flags defitions to bitwise left shift, convert some - comments about variables to actual values, and do a bit of - cleanup (patch #27 from Greg A. Woods) - * [r3594] drivers/blazer.c: Add comment on shutdown.return ondelay - value - - Add a comment reinforcing the need for ondelay=3 (partial patch - #26 from Greg A. Woods) - * [r3593] docs/man/snmp-ups.txt: Complete APC SNMP compatibility - information - - Mention more varieties of APC SNMP cards, and mention the - POWERNET MIB (patch #25 from Greg A. Woods) - * [r3590] drivers/netvision-mib.c: Fix status processing for "ECO - mode" - - When running in "ECO mode", the driver should report an - ups.status set to "OL", or it otherwise ends up with an empty - string that confuses upsmon (patch from Ivan Kuznetsov) + comments about variables to actual values, and do a bit of cleanup + (patch #27 from Greg A. Woods) + +2012-05-15 Prachi Gandhi + + * scripts/Solaris/checkinstall, scripts/Solaris/precheck.py, + scripts/Solaris/prototype: Deleted checkinstall, prototype files + +2012-05-15 Arnaud Quette + + * drivers/blazer.c: Add comment on shutdown.return ondelay value Add + a comment reinforcing the need for ondelay=3 (partial patch #26 + from Greg A. Woods) + * docs/man/snmp-ups.txt: Complete APC SNMP compatibility information + Mention more varieties of APC SNMP cards, and mention the POWERNET + MIB (patch #25 from Greg A. Woods) + +2012-05-15 Prachi Gandhi + + * Makefile.am, scripts/Solaris/Makefile.am, + scripts/Solaris/pkginfo.in, scripts/Solaris/prepackage.py, + scripts/Solaris/preproto.pl: Added perl script to create prototype + file onsolaris platform, updated Makefile.am + * m4/nut_check_os.m4: Added perl script to create prototype file + onsolaris platform, updated Makefile.am + +2012-05-15 Arnaud Quette + + * drivers/netvision-mib.c: Fix status processing for "ECO mode" When + running in "ECO mode", the driver should report an ups.status set + to "OL", or it otherwise ends up with an empty string that confuses + upsmon (patch from Ivan Kuznetsov) 2012-05-14 Arnaud Quette - * [r3589] docs/man/blazer.txt: Mention General Electric in blazer - manual page - + * docs/man/blazer.txt: Mention General Electric in blazer manual page Mention General Electric as a user of the Megatec/Q1 protocol (patch #24 from Greg A. Woods) - * [r3588] clients/upsmon.h: Use bitwise left shift for flags - definitions - - Use (1 << N) to define a bit flag at bit N, which is more - coherent with other similar implementations in NUT (patch #23 + * clients/upsmon.h: Use bitwise left shift for flags definitions Use + (1 << N) to define a bit flag at bit N, which is more coherent with + other similar implementations in NUT (patch #23 from Greg A. Woods) + * clients/upsmon.c: Cosmetic changes Remove dead / redundant + #defines, and enable interesting debug traces that were commented + out (based on patch #22 from Greg A. Woods) + * drivers/apcsmart.h: Use bitwise left shift for status flags + definitions Use (1 << N) to define a bit flag at bit N, which is + more coherent with other similar implementations in NUT (patch #21 from Greg A. Woods) - * [r3587] clients/upsmon.c: Cosmetic changes - - Remove dead / redundant #defines, and enable interesting debug - traces that were commented out (based on patch #22 from Greg A. - Woods) - * [r3586] drivers/apcsmart.h: Use bitwise left shift for status - flags definitions - - Use (1 << N) to define a bit flag at bit N, which is more - coherent with other similar implementations in NUT (patch #21 - from Greg A. Woods) - * [r3585] drivers/apcsmart.c, drivers/apcsmart.h: Don't be too - strict about terminal settings - - Don't log an error when tcgetattr() reports different settings on - the port (patch #20 from Greg A. Woods) - * [r3584] tools/nut-usbinfo.pl: Better filtering on USB related - files - - The current USB information extraction script is not optimal at + * drivers/apcsmart.c, drivers/apcsmart.h: Don't be too strict about + terminal settings Don't log an error when tcgetattr() reports + different settings on the port (patch #20 from Greg A. Woods) + * tools/nut-usbinfo.pl: Better filtering on USB related files The + current USB information extraction script is not optimal at filtering files that need to be inspected. While waiting for a proper rewrite, improve a bit more filenames filtering (patch #18 from Greg A. Woods) - * [r3583] drivers/blazer_ser.c: Quote the debug output for space - visibility - + * drivers/blazer_ser.c: Quote the debug output for space visibility Quote the debug output so one can see how many spaces there are (patch #16 from Greg A. Woods) - * [r3582] docs/cables/apc.txt: Update APC cabling information - - Update information about APC cable model numbering and revisions - (patch #16 from Greg A. Woods) - * [r3581] data/driver.list.in: GE Digital Energy updates - - Rename "GE" to "GE Digital Energy", which is more appropriate in - this context. Also add GT Series 1000-3000 VA to the list of - blazer_ser supported models (patch #15 from Greg A. Woods) - * [r3580] docs/developers.txt: Complete notes on spaces for - alignements - - Add complementary note on the use of spaces for alignements - (patch #14 from Greg A. Woods) - * [r3577] docs/design.txt: Use more suitable examples - - Use an example driver name matching the unified NUT drivers - generic manual page name (patch #13 from Greg A. Woods) - * [r3576] drivers/mge-hid.c: Complete and update Eaton HID usages - table + * docs/cables/apc.txt: Update APC cabling information Update + information about APC cable model numbering and revisions (patch + #16 from Greg A. Woods) + * data/driver.list.in: HCL: GE Digital Energy updates Rename "GE" to + "GE Digital Energy", which is more appropriate in this context. + Also add GT Series 1000-3000 VA to the list of blazer_ser supported + models (patch #15 from Greg A. Woods) + * docs/developers.txt: Complete notes on spaces for alignements Add + complementary note on the use of spaces for alignements (patch #14 + from Greg A. Woods) + * docs/design.txt: Use more suitable examples Use an example driver + name matching the unified NUT drivers generic manual page name + (patch #13 from Greg A. Woods) + * drivers/mge-hid.c: Complete and update Eaton HID usages table 2012-05-11 Arnaud Quette - * [r3574] tools/Makefile.am: Fix typo in comment - - Fix a typo error in comment (reported by Fred Bohé, from Eaton) - * [r3573] scripts/upower/95-upower-hid.rules: Update upower script - - Update upower script with recent changes and updates (redundant - with patch #6 from Greg A. Woods) - * [r3572] tools/Makefile.am: Explicit mention of Makefiles - brokenness - + * tools/Makefile.am: Fix typo in comment Fix a typo error in comment + (reported by Fred Bohé, from Eaton) + * scripts/upower/95-upower-hid.rules: Update upower script Update + upower script with recent changes and updates (redundant with patch + #6 from Greg A. Woods) + * tools/Makefile.am: Explicit mention of Makefiles brokenness Document that, at least, this Makefile.am is broken by design (patch #5 from Greg A. Woods) - * [r3571] docs/man/apcsmart.txt: Fix documentation wording - - "there're" is not a valid contraction, especially not in a - technical document (patch #4 from Greg A. Woods) - * [r3570] docs/man/apcsmart.txt: Always use upper case for the - acronym "UPS" - + * docs/man/apcsmart.txt: Fix documentation wording "there're" is not + a valid contraction, especially not in a technical document (patch + #4 from Greg A. Woods) + * docs/man/apcsmart.txt: Always use upper case for the acronym "UPS" Be consistent in using all upper case for the acronym "UPS" (Ie Uninterruptible Power Supply) (patch #3 from Greg A. Woods) - * [r3569] docs/man/apcsmart.txt: Fix SmartUPS cabling nomenclature - - Correct the nomenclature of the SmartUPS cabling part numbers - (patch #2 from Greg A. Woods) - * [r3568] configure.in: Fix a configure error message - - Asciidoc might actually be installed but documentation might - still not be build-able (earlier messages should hint at exactly - what was missing) (patch #1 from Greg A. Woods) - * [r3567] data/driver.list.in: Add support for ATEK Defensor range - - Add ATEK Defensor range (Innova series) to the list of blazer_usb + * docs/man/apcsmart.txt: Fix SmartUPS cabling nomenclature Correct + the nomenclature of the SmartUPS cabling part numbers (patch #2 + from Greg A. Woods) + * configure.in: Fix a configure error message Asciidoc might + actually be installed but documentation might still not be build- + able (earlier messages should hint at exactly what was missing) + (patch #1 from Greg A. Woods) + * data/driver.list.in: HCL: Add support for ATEK Defensor range Add + ATEK Defensor range (Innova series) to the list of blazer_usb supported models - * [r3566] data/driver.list.in: Fix EVER brand name - - The correct name is "EVER", not "EVER UPS", as per a request from - the manufacturer + * data/driver.list.in: HCL: Fix EVER brand name The correct name is + "EVER", not "EVER UPS", as per a request from the manufacturer 2012-05-10 Arnaud Quette - * [r3565] docs/website/news.txt: Update for WMNut 0.63 publication - * [r3564] docs/website/ups-protocols.txt: Official Riello protocols + * docs/website/news.txt: Update for WMNut 0.63 publication + * docs/website/ups-protocols.txt: Official Riello protocols publication +2012-05-08 Prachi Gandhi + + * Makefile.am, scripts/Solaris/Makefile.am, + scripts/Solaris/prepackage.py: Added python script to create + pkginfo.in and checkinstall scripts depending upon the solaris + platform + 2012-05-03 Arnaud Quette - * [r3558] drivers/libshut.c, drivers/mge-shut.c: Forgotten driver - version bump - * [r3557] clients/upsmon.c: Coverity fix on upsmon - - Remove an unneeded null check, that cause a Coverity error - (reported by Michal Hlavinka from RedHat) - * [r3556] drivers/libshut.c, drivers/mge-shut.c: Coverity fix on - Eaton SHUT - + * drivers/libshut.c, drivers/mge-shut.c: Forgotten driver version + bump + * clients/upsmon.c: Coverity fix on upsmon Remove an unneeded null + check, that cause a Coverity error (reported by Michal Hlavinka + from RedHat) + * drivers/libshut.c, drivers/mge-shut.c: Coverity fix on Eaton SHUT Fix some tests that are always false, regardless of the values of operands (reported by Michal Hlavinka from RedHat) - * [r3555] clients/upssched.c, drivers/bcmxcp.c, - drivers/bcmxcp_usb.c, drivers/dstate.c, drivers/mge-utalk.c, - drivers/rhino.c, drivers/solis.c, drivers/tripplite_usb.c, - tools/nut-scanner/scan_nut.c, tools/nut-scanner/scan_xml_http.c: - Merge Coverity branch - - Merge all work done part of the Coverity static analysis scan, - done by Michal Hlavinka from RedHat 2012-05-02 Arnaud Quette - * [r3553] docs/download.txt, docs/website/news.txt: Update Windows - package publications - * [r3552] common/Makefile.am, include/Makefile.am: Better handling - of nut_version.h - - nut_version.h should not be distributed, since it is + * docs/download.txt, docs/website/news.txt: Update Windows package + publications + * common/Makefile.am, include/Makefile.am: Better handling of + nut_version.h nut_version.h should not be distributed, since it is automatically built. Moreover, hard dependency in common/ is not needed since BUILT_SOURCES reference ensure generation before any other target: @@ -731,3187 +2426,2415 @@ 2012-04-27 Arnaud Quette - * [r3547] data/driver.list.in, drivers/cps-hid.c: Add support for - CyberPower Systems PR6000LCDRTXL5U - - Add CyberPower Systems PR6000LCDRTXL5U (USB ID 0x0764:0x0601) to - the list of usbhid-ups supported models (reported by Dax Kelson) - * [r3546] data/driver.list.in: Complete HP supported devices list - - Add HP UPS Management Module to the list of snmp-ups supported - models. Also complete serial compatibility for some models, using - mge-shut + * data/driver.list.in, drivers/cps-hid.c: Add support for CyberPower + Systems PR6000LCDRTXL5U Add CyberPower Systems PR6000LCDRTXL5U + (USB ID 0x0764:0x0601) to the list of usbhid-ups supported models + (reported by Dax Kelson) + * data/driver.list.in: HCL: Complete HP supported devices list Add + HP UPS Management Module to the list of snmp-ups supported models. + Also complete serial compatibility for some models, using mge-shut 2012-04-25 Arnaud Quette - * [r3542] docs/man/nut-scanner.txt: Clarify nut-scanner compilation - and distribution - - Document explicitely how nut-scanner is compiled, and how its - features are made available, according to its dependencies (both - compile time and runtime) + * docs/man/nut-scanner.txt: Clarify nut-scanner compilation and + distribution Document explicitely how nut-scanner is compiled, and + how its features are made available, according to its dependencies + (both compile time and runtime) 2012-04-24 Frederic Bohe - * [r3539] tools/nut-scanner/nut-scanner.c, - tools/nut-scanner/nutscan-init.c, + * tools/nut-scanner/nut-scanner.c, tools/nut-scanner/nutscan-init.c, tools/nut-scanner/nutscan-init.h, tools/nut-scanner/scan_avahi.c, - tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, - tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, - tools/nut-scanner/scan_xml_http.c: Cleaner exit for nut-scanner + tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools + /nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut- + scanner/scan_xml_http.c: Cleaner exit for nut-scanner 2012-04-23 Frederic Bohe - * [r3538] tools/nut-scanner/scan_avahi.c, - tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, - tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, - tools/nut-scanner/scan_xml_http.c: Be more verbose when failing - to dynamically load a library + * tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, + tools/nut-scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools + /nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: Be more + verbose when failing to dynamically load a library 2012-04-14 Arnaud Quette - * [r3534] docs/man, docs/man/Makefile.am, docs/man/index.txt, - docs/man/nut-recorder.txt, tools/nut-recorder.sh: Create - nut-recorder manual page - * [r3533] drivers/tripplite-hid.c: HP USB UPS completion #3 - - Remove R/T3000 USB ID (0x03f0:0x1fe5) from the TrippLite HID - mapping, since it is supported by the Eaton HID mapping. This - completes commit r3525. Also adds ups.firmware and device.part - * [r3532] drivers/usbhid-ups.c: Correct Celsius temperatures that - should be in Kelvin - - Check if raw value is in the Kelvin range, to detect buggy values - that are already expressed in Celsius degrees, as found on some - HP devices - * [r3531] docs/developer-guide.txt, tools/Makefile.am, - tools/device-recorder.sh, tools/nut-recorder.sh: Rename - device-recorder to nut-recorder - * [r3530] data/driver.list.in: Reorder Dell devices by connection - type + * docs/man/.gitignore, docs/man/Makefile.am, docs/man/index.txt, + docs/man/nut-recorder.txt, tools/nut-recorder.sh: Create nut- + recorder manual page + * drivers/tripplite-hid.c: HP USB UPS completion #3 Remove R/T3000 + USB ID (0x03f0:0x1fe5) from the TrippLite HID mapping, since it is + supported by the Eaton HID mapping. This completes commit + * drivers/usbhid-ups.c: Correct Celsius temperatures that should be + in Kelvin Check if raw value is in the Kelvin range, to detect + buggy values that are already expressed in Celsius degrees, as + found on some HP devices + * docs/developer-guide.txt, tools/Makefile.am, tools/device- + recorder.sh, tools/nut-recorder.sh: Rename device-recorder to nut- + recorder + * data/driver.list.in: HCL: Reorder Dell devices by connection type 2012-04-10 Arnaud Quette - * [r3529] scripts/systemd/nut-driver.service.in, - scripts/systemd/nut-monitor.service.in, - scripts/systemd/nut-server.service.in, + * scripts/systemd/nut-driver.service.in, scripts/systemd/nut- + monitor.service.in, scripts/systemd/nut-server.service.in, scripts/systemd/nutshutdown.in: Fix broken systemd integration in - the build system - - Step 2: add the theoretical path templates to the systemd - scripts. This however requires adjustments to the RPM package. - Namely, upsd and upsmon will have to be installed in /sbin, - instead of the current /usr/sbin - * [r3528] configure.in, scripts/systemd/Makefile.am: Fix broken - systemd integration in the build system - - Step 1: remove Makefile rules that were both useless, and causing - warning. Generate nut-*.service files from .in templates in - configure, as it should be, which is currently void since there - is no target to substitute. This has however required to export - SBINDIR and PIDPATH through AC_SUBST, in configure - * [r3525] drivers/mge-hid.c: HP USB UPS completion #2 - - Address HP USB/HID devices, that use the Eaton HID definitions. - This includes the latest products range (USB IDs 0x1fe5, 0x1fe6, - 0x1fe7 and 0x1fe8), and few more variables and commands - * [r3524] drivers/mge-hid.c: Fix Eaton / MGE outlet.2.switchable - flags - + the build system Step 2: add the theoretical path templates to the + systemd scripts. This however requires adjustments to the RPM + package. Namely, upsd and upsmon will have to be installed in + /sbin, instead of the current /usr/sbin + * configure.in, scripts/systemd/Makefile.am: Fix broken systemd + integration in the build system Step 1: remove Makefile rules that + were both useless, and causing warning. Generate nut-*.service + files from .in templates in configure, as it should be, which is + currently void since there is no target to substitute. This has + however required to export SBINDIR and PIDPATH through AC_SUBST, in + configure + * clients/upsrw.c, common/state.c, docs/man/upscli_list_start.txt, + docs/man/upsrw.txt, docs/net-protocol.txt, docs/new-drivers.txt, + docs/sock-protocol.txt, drivers/dstate.c, drivers/dstate.h, + include/extstate.h, include/state.h, server/netget.c, + server/netlist.c, server/netset.c, server/sstate.c, + server/sstate.h: Support of ranges of values for writable variables + It is now possible to specify one or more ranges of values for + writable variables, using dstate_addrange() in drivers. upsd also + supports the new type 'RANGE' for 'GET TYPE', along with the 'LIST + RANGE' command. Finally, users can interact through upsrw, which + displays the supported ranges, and enforces new value checking + against the provided boundaries + * drivers/mge-hid.c: HP USB UPS completion #2 Address HP USB/HID + devices, that use the Eaton HID definitions. This includes the + latest products range (USB IDs 0x1fe5, 0x1fe6, 0x1fe7 and 0x1fe8), + and few more variables and commands + * drivers/mge-hid.c: Fix Eaton / MGE outlet.2.switchable flags outlet.2.switchable should only be writable to enable ECO mode on Ellipse ECO, Protection Station and some 3S. Other models should - only expose it as read only (reported by Prachi Gandhi from - Eaton, Alioth bug #313587) + only expose it as read only (reported by Prachi Gandhi from Eaton, + Alioth bug #313587) 2012-04-04 Arnaud Quette - * [r3520] scripts/Makefile.am, scripts/logrotate, - scripts/logrotate/nutlogd: Provide log rotation configuration for - NUT - - Provide a basic configuration file for managing rotation - (logrotate) of NUT log files, generated by upslog + * scripts/Makefile.am, scripts/logrotate/nutlogd: Provide log + rotation configuration for NUT Provide a basic configuration file + for managing rotation (logrotate) of NUT log files, generated by + upslog 2012-04-02 Arnaud Quette - * [r3518] docs/nut-names.txt: Update the namespace - - Complete the namespace with missing variables and commands, that - are either known or have had an RFC - * [r3517] docs/man: Subversion ignored files completion - - Mark nutscan_init.html as Subversion ignored (no functional - changes) + * docs/nut-names.txt: Update the namespace Complete the namespace + with missing variables and commands, that are either known or have + had an RFC + * docs/man/.gitignore: Subversion ignored files completion Mark + nutscan_init.html as Subversion ignored (no functional changes) 2012-03-31 Arnaud Quette - * [r3516] data/driver.list.in: Add support for AEG Power Solutions - PROTECT HOME - - Add AEG Power Solutions PROTECT HOME (USB ID 0x0665:0x5161) to - the list of blazer_ser and blazer_usb supported models (reported - by Joachim Schiele) + * data/driver.list.in: HCL: Add support for AEG Power Solutions + PROTECT HOME Add AEG Power Solutions PROTECT HOME (USB ID + 0x0665:0x5161) to the list of blazer_ser and blazer_usb supported + models (reported by Joachim Schiele) 2012-03-30 Arnaud Quette - * [r3514] drivers/bcmxcp_usb.c: Add debug traces for read / write - commands - * [r3512] common/common.c, include/common.h: Improve support - functions for trimming strings - - Enforce verifications in rtrim, and add an ltrim function + * drivers/bcmxcp_usb.c: Add debug traces for read / write commands + * common/common.c, include/common.h: Improve support functions for + trimming strings Enforce verifications in rtrim, and add an ltrim + function 2012-03-29 Arnaud Quette - * [r3511] data/driver.list.in, drivers/blazer_usb.c: Add support - Innova online UPS family - - Add Innova T (0x06da:0x0201), Innova RT (0x06da:0x0005) and - Innova 3/1 T (0x06da:0x0004) to the list of of blazer_usb and - blazer_ser supported models. Innova series are online UPS - supporting Q1 for compatibility, and many more commands. Better - support, either through blazer_* rewrite or through a new driver, - is considered as a future possibility + * data/driver.list.in, drivers/blazer_usb.c: Add support Innova + online UPS family Add Innova T (0x06da:0x0201), Innova RT + (0x06da:0x0005) and Innova 3/1 T (0x06da:0x0004) to the list of of + blazer_usb and blazer_ser supported models. Innova series are + online UPS supporting Q1 for compatibility, and many more commands. + Better support, either through blazer_* rewrite or through a new + driver, is considered as a future possibility 2012-03-24 Arnaud Quette - * [r3508] configure.in, docs/Makefile.am, docs/security.txt, - scripts/Makefile.am, scripts/ufw, scripts/ufw/README, + * configure.in, docs/Makefile.am, docs/security.txt, + scripts/Makefile.am, scripts/ufw/.gitignore, scripts/ufw/README, scripts/ufw/nut.ufw.profile.in: Uncomplicated Firewall (UFW) - support - - Provide an Uncomplicated Firewall (UFW) profile (nut.ufw.profile) - to tightly integrate NUT, along with some documentation - completion for the Security chapter of the user manual + support Provide an Uncomplicated Firewall (UFW) profile + (nut.ufw.profile) to tightly integrate NUT, along with some + documentation completion for the Security chapter of the user + manual 2012-03-23 Arnaud Quette - * [r3507] conf/nut.conf.sample, docs/man/nut.conf.txt: Fix nut.conf - documentation and sample file - - Since nut.conf is intended to be sourced by shell scripts, spaces - must not be added around the equal sign. Fix documentation and - sample file to conform to this purpose, and add bold warning - (reported by Tim Rice, Alioth bug #312452) - * [r3506] clients/upsmon.c, server/upsd.c: Detect duplicate - instances of upsd / upsmon - - Fix a long standing issue, that is the lack of detection of - duplicate upsd / upsmon instances when starting another one of - these daemons. This previously resulted in inconsistencies, such - as being unable to stop the daemon, due to its .pid file being - removed by the newly started instance (last reported by Andrew - Min Chang) + * conf/nut.conf.sample, docs/man/nut.conf.txt: Fix nut.conf + documentation and sample file Since nut.conf is intended to be + sourced by shell scripts, spaces must not be added around the equal + sign. Fix documentation and sample file to conform to this purpose, + and add bold warning (reported by Tim Rice, Alioth bug #312452) + * clients/upsmon.c, server/upsd.c: Detect duplicate instances of upsd + / upsmon Fix a long standing issue, that is the lack of detection + of duplicate upsd / upsmon instances when starting another one of + these daemons. This previously resulted in inconsistencies, such as + being unable to stop the daemon, due to its .pid file being removed + by the newly started instance (last reported by Andrew Min Chang) 2012-03-21 Frederic Bohe - * [r3503] drivers/libshut.c: Avoid stack corruption on invalid - frame - - In the protocol, the frame size can be 8 bytes max. That is why - the frame buffer is only 8 bytes long. If the frame is corrupted, - the size read may be up to 15, which may corrupt the stack while - writing into the frame buffer. This patch add a simple sanity - check on the size to avoid a crash and enforce protocol - limitation. - * [r3501] drivers/libshut.c: Fix SHUT variables read (from Arnaud - Quette) - * [r3500] drivers/bcmxcp.c, drivers/bcmxcp.h, drivers/bcmxcp_usb.c: - Change timeout for PW9120 - - Current timeout (1 sec) is too short for PW9120: numerous frames - are lost. Setting this to 2 seconds fix this. - * [r3499] drivers/libshut.c: Deactivate UPS notification - - Currently this driver is ignoring notification by automatically - sending NACK when they are received. Nevertheless,this behavior - creates communication errors with some UPS (M2200). So this patch - completly disable the sending of notification from the UPS. - Ideally we should correclty implement notifications managment for - optimal performance, but with this patch, at least, communiaton - works. - * [r3498] drivers/libshut.c: Fix shut notification mask + * drivers/libshut.c: Avoid stack corruption on invalid frame In the + protocol, the frame size can be 8 bytes max. That is why the frame + buffer is only 8 bytes long. If the frame is corrupted, the size + read may be up to 15, which may corrupt the stack while writing + into the frame buffer. This patch add a simple sanity check on the + size to avoid a crash and enforce protocol limitation. + * drivers/libshut.c: Fix SHUT variables read (from Arnaud Quette) + * drivers/bcmxcp.c, drivers/bcmxcp.h, drivers/bcmxcp_usb.c: Change + timeout for PW9120 Current timeout (1 sec) is too short for + PW9120: numerous frames are lost. Setting this to 2 seconds fix + this. + * drivers/libshut.c: Deactivate UPS notification Currently this + driver is ignoring notification by automatically sending NACK when + they are received. Nevertheless,this behavior creates communication + errors with some UPS (M2200). So this patch completly disable the + sending of notification from the UPS. Ideally we should correclty + implement notifications managment for optimal performance, but with + this patch, at least, communiaton works. + * drivers/libshut.c: Fix shut notification mask 2012-03-09 Arnaud Quette - * [r3495] docs/config-notes.txt: Emphasize special characters - * [r3494] data/driver.list.in, drivers/tripplite-hid.c: HP USB UPS - completion #1 - - Address HP USB/HID devices, that use the TrippLite HID + * docs/config-notes.txt: Emphasize special characters + * data/driver.list.in, drivers/tripplite-hid.c: HP USB UPS completion + #1 Address HP USB/HID devices, that use the TrippLite HID definitions. This includes new ProductIDs, and few more variables and commands - * [r3493] drivers/oneac.h: Remove extraneous comment start + * drivers/oneac.h: Remove extraneous comment start 2012-03-08 Frederic Bohe - * [r3487] common/parseconf.c, common/upsconf.c, - docs/config-notes.txt: More flexible '=' character managment in - conf files - - This allow to support the following forms : 'foo = bar', - 'foo=bar', 'foo =bar' and 'foo= bar' + * common/parseconf.c, common/upsconf.c, docs/config-notes.txt: More + flexible '=' character managment in conf files This allow to + support the following forms : 'foo = bar', 'foo=bar', 'foo =bar' + and 'foo= bar' 2012-03-06 Arnaud Quette - * [r3485] docs/man/oneac.txt, drivers/oneac.c, drivers/oneac.h: - Improve general OneAC support (oneac 0.80) - - Improve support for all families of Oneac (EG, ON, OZ and OB), - including support for more data and instant commands (patch from - Bill Elliot) + * docs/man/oneac.txt, drivers/oneac.c, drivers/oneac.h: Improve + general OneAC support (oneac 0.80) Improve support for all + families of Oneac (EG, ON, OZ and OB), including support for more + data and instant commands (patch from Bill Elliot) 2012-03-05 Arnaud Quette - * [r3484] drivers/blazer.c, drivers/blazer_ser.c, - drivers/blazer_usb.c: Guesstimate battery high and low voltages - - Add an automatic estimation for high and low voltages, to be able - to determine battery charge. This should cover most cases, but a - bold mention has been added at driver startup, to inform the - user. Driver version (USB and serial) have been bumped to reflect - this change - * [r3483] drivers/blazer.c: Set 'FSD' status flag upon need - - As per the recent decision to allow driver to set 'FSD' status - flag, set 'FSD' upon "Shutdown imminent" detection + * drivers/blazer.c, drivers/blazer_ser.c, drivers/blazer_usb.c: + Guesstimate battery high and low voltages Add an automatic + estimation for high and low voltages, to be able to determine + battery charge. This should cover most cases, but a bold mention + has been added at driver startup, to inform the user. Driver + version (USB and serial) have been bumped to reflect this change + * drivers/blazer.c: Set 'FSD' status flag upon need As per the + recent decision to allow driver to set 'FSD' status flag, set 'FSD' + upon "Shutdown imminent" detection 2012-03-02 Arnaud Quette - * [r3481] autogen.sh, scripts/augeas/Makefile.am: Sanity check - before python script execution - - Only generate Augeas ups.conf lens if we can import required - Python modules (re,glob,codecs) - * [r3480] docs/man/blazer.txt: Fix typo error in runtimecal example - values - * [r3479] docs/stable-hcl.txt: Improve formating - * [r3478] docs/new-drivers.txt: Formalize the use of the FSD status - flag - - As an exception, drivers are now allowed to set the "FSD" (Forced + * autogen.sh, scripts/augeas/Makefile.am: Sanity check before python + script execution Only generate Augeas ups.conf lens if we can + import required Python modules (re,glob,codecs) + * docs/man/blazer.txt: Fix typo error in runtimecal example values + * docs/stable-hcl.txt: Improve formating + * docs/new-drivers.txt: Formalize the use of the FSD status flag As + an exception, drivers are now allowed to set the "FSD" (Forced ShutDown) status flag when an imminent shutdown has been detected +2012-02-29 Arnaud Quette + + * clients/upsc.c, docs/man/upsc.txt: Client side implementation of + "LIST CLIENT" Implement "LIST CLIENT" in upsc, using "-c " + * docs/net-protocol.txt, server/netlist.c: Adjust server side + implementation of "LIST CLIENT" Commands of the "LIST" family have + to be coherent with the command name. Ie, "LIST CLIENT" should use + the same "CLIENT" prefix, or it will otherwise break client side + verification mechanism + * server/netlist.c: Adjust "LIST CLIENTS" implementation Adjust + "LIST CLIENTS" implementation to be more coherent with other + network protocol commands + * docs/net-protocol.txt: Document new "LIST CLIENTS" command + * server/upsd.c, server/upsd.h: Remove upsd "info" command Adjust + initial "LIST CLIENTS" commit, by removing the upsd "info" command, + which is not suitable, and redundant with the "LIST CLIENT" command + of the network protocol [Fixed compilation error] + 2012-02-29 Charles Lepple - * [r3477] clients/upsc.c, docs/man/upsc.txt: Client side - implementation of "LIST CLIENT" - - Implement "LIST CLIENT" in upsc, using "-c " - - Author: Arnaud Quette - * [r3476] docs/net-protocol.txt, server/netlist.c: Adjust server - side implementation of "LIST CLIENT" - - Commands of the "LIST" family have to be coherent with the - command name. Ie, "LIST CLIENT" should use the same "CLIENT" - prefix, or it will otherwise break client side verification - mechanism - - Author: Arnaud Quette - * [r3475] server/netlist.c: Adjust "LIST CLIENTS" implementation - - Adjust "LIST CLIENTS" implementation to be more coherent with - other network protocol commands - - Author: Arnaud Quette - * [r3474] docs/net-protocol.txt: Document new "LIST CLIENTS" - command - - Author: Arnaud Quette - * [r3473] server/upsd.c, server/upsd.h: Remove upsd "info" command - - Adjust initial "LIST CLIENTS" commit, by removing the upsd "info" - command, which is not suitable, and redundant with the "LIST - CLIENT" command of the network protocol - - [Fixed compilation error] - - Author: Arnaud Quette - * [r3472] scripts/python/module/PyNUT.py: Add support for LIST - CLIENTS, etc. to PyNUT. - - Patch by Rene Martín Rodríguez . Merged with - typo fixes in repository. - - Covers LIST CLIENTS, FSD, HELP and VER. Module version bumped to - 1.2.2. - - Discussion: + * scripts/python/module/PyNUT.py: Add support for LIST CLIENTS, etc. + to PyNUT. Patch by Rene Martín Rodríguez . + Merged with typo fixes in repository. Covers LIST CLIENTS, FSD, + HELP and VER. Module version bumped to 1.2.2. Discussion: http://article.gmane.org/gmane.comp.monitoring.nut.devel/5871 - * [r3471] server/netlist.c, server/upsd.c, server/upsd.h: Add new - "LIST CLIENTS" command to NUT protocol. - - Patch by Rene Martín Rodríguez , with - indentation changed to tabs. - + * server/netlist.c, server/upsd.c, server/upsd.h: Add new "LIST + CLIENTS" command to NUT protocol. Patch by Rene Martín Rodríguez + , with indentation changed to tabs. Discussion: http://article.gmane.org/gmane.comp.monitoring.nut.devel/5870 - * [r3470] drivers/blazer.c: Update URL to Megatec protocol - description. + * drivers/blazer.c: Update URL to Megatec protocol description. 2012-02-28 Arnaud Quette - * [r3469] drivers/liebert-hid.c: UPower optimization - - Always spell manufacturer names the same way across the various - USB drivers. This avoids duplication of manufacturer entries in + * drivers/liebert-hid.c: UPower optimization Always spell + manufacturer names the same way across the various USB drivers. + This avoids duplication of manufacturer entries in scripts/upower/95-upower-hid.rules, during automatic generation 2012-02-27 Arnaud Quette - * [r3468] data/driver.list.in, drivers/cps-hid.c: Add support for - CyberPower OR700LCDRM1U - - Add CyberPower OR700LCDRM1U (0x0764:0x0601) to the list of - usbhid-ups supported models (reported by Brian McCann) + * data/driver.list.in, drivers/cps-hid.c: Add support for CyberPower + OR700LCDRM1U Add CyberPower OR700LCDRM1U (0x0764:0x0601) to the + list of usbhid-ups supported models (reported by Brian McCann) 2012-02-22 Michal Soltys - * [r3467] drivers/apcsmart.c: drivers/apcsmart.c: setvar_string() - and apc_write_long() bugfixes - - setvar_string() couldn't function properly, due to the use of - wrong variable. - - Not associated with any bugreport (reported directly to email). - * [r3466] drivers/apcsmart.c: drivers/apcsmart.c: make - tcsetattr()/tcgetattr() difference not fatal - - This is follow up from earlier bug report (#313395). Earlier - commit should have fixed the issue, but the original submitter - never commented on it. - - Just in case - instead of making it fatal, we only log the issue. + * drivers/apcsmart.c: drivers/apcsmart.c: setvar_string() and + apc_write_long() bugfixes setvar_string() couldn't function + properly, due to the use of wrong variable. Not associated with + any bugreport (reported directly to email). + * drivers/apcsmart.c: drivers/apcsmart.c: make + tcsetattr()/tcgetattr() difference not fatal This is follow up + from earlier bug report (#313395). Earlier commit should have fixed + the issue, but the original submitter never commented on it. Just + in case - instead of making it fatal, we only log the issue. 2012-02-20 Arnaud Quette - * [r3450] drivers/snmp-ups.c, tools/nut-scanner/scan_snmp.c: Better - handling of Net-SNMP AES PrivProtocol - - Handle smartly issues related to Net-SNMP support and declaration - of AES PrivProtocol + * drivers/snmp-ups.c, tools/nut-scanner/scan_snmp.c: Better handling + of Net-SNMP AES PrivProtocol Handle smartly issues related to Net- + SNMP support and declaration of AES PrivProtocol 2012-02-19 Charles Lepple - * [r3449] drivers/snmp-ups.c, drivers/snmp-ups.h: Don't allocate - storage for variables in snmp-ups.h - - The header files should declare variables as extern, and they - should be allocated in only one .c file (not all of the files - which include the .h file). While this is not an immediate - problem when only one .c file includes the .h file, it still - should be fixed in case that changes in the future. - - Patch by Daniel Macks: - http://fink.cvs.sourceforge.net/viewvc/fink/experimental/dmacks/finkinfo/nut.patch?revision=1.1&view=markup - * [r3448] drivers/bcmxcp.c, drivers/bcmxcp.h: Don't allocate - storage for variables in bcmxcp.h - - The header files should declare variables as extern, and they - should be allocated in only one .c file (not all of the files - which include the .h file). This was causing multiple symbol - definitions on Mac OS X. - - Patch by Daniel Macks: - http://fink.cvs.sourceforge.net/viewvc/fink/experimental/dmacks/finkinfo/nut.patch?revision=1.1&view=markup + * drivers/snmp-ups.c, drivers/snmp-ups.h: Don't allocate storage for + variables in snmp-ups.h The header files should declare variables + as extern, and they should be allocated in only one .c file (not + all of the files which include the .h file). While this is not an + immediate problem when only one .c file includes the .h file, it + still should be fixed in case that changes in the future. Patch by + Daniel Macks: http://fink.cvs.sourceforge.net/viewvc/fink/experimen + tal/dmacks/finkinfo/nut.patch?revision=1.1&view=markup + * drivers/bcmxcp.c, drivers/bcmxcp.h: Don't allocate storage for + variables in bcmxcp.h The header files should declare variables as + extern, and they should be allocated in only one .c file (not all + of the files which include the .h file). This was causing multiple + symbol definitions on Mac OS X. Patch by Daniel Macks: http://fink + .cvs.sourceforge.net/viewvc/fink/experimental/dmacks/finkinfo/nut.p + atch?revision=1.1&view=markup 2012-02-16 Arnaud Quette - * [r3447] data/driver.list.in, drivers/blazer_usb.c: Add support - for Online Yunto YQ450 - - Add Online Yunto YQ450 (0x06da:0x0002) to the list of blazer_usb - supported models (reported by Thomas Maisl) + * data/driver.list.in, drivers/blazer_usb.c: Add support for Online + Yunto YQ450 Add Online Yunto YQ450 (0x06da:0x0002) to the list of + blazer_usb supported models (reported by Thomas Maisl) 2012-02-16 Charles Lepple - * [r3445] tools/git-svn.authors, tools/svn2cl.authors: Update SVN - username mappings + * tools/git-svn.authors, tools/svn2cl.authors: Update SVN username + mappings 2012-02-14 Arnaud Quette - * [r3440] data/driver.list.in: Add support for Tripp-Lite - OMNISMART500 - - Add Tripp-Lite OMNISMART500 (productID 0001) to the list of + * data/driver.list.in: Add support for Tripp-Lite OMNISMART500 Add + Tripp-Lite OMNISMART500 (productID 0001) to the list of tripplite_usb supported models (reported by Matt Schulte) 2012-02-10 Arnaud Quette - * [r3439] data/driver.list.in: Support for Dell UPS Network - Management Card - + * data/driver.list.in: Support for Dell UPS Network Management Card Add Dell UPS Network Management Card to the list of snmp-ups and - netxml-ups supported models. SNMP support currently relies on - IETF (RFC-1628) MIB, and not on Dell UPS MIB + netxml-ups supported models. SNMP support currently relies on IETF + (RFC-1628) MIB, and not on Dell UPS MIB 2012-02-09 Frederic Bohe - * [r3435] tools/nut-scanner/scan_snmp.c: Remove useless lib_mutex - and buggy dev_mutex + * tools/nut-scanner/scan_snmp.c: Remove useless lib_mutex and buggy + dev_mutex 2012-02-03 Arnaud Quette - * [r3431] Makefile.am: Update ChangeLog generation and fix text - wrapping - - Adapt the ChangeLog file generation process to correctly wrap - text, even with the new 'git style' format, used for Subversion - commit messages + * Makefile.am: Update ChangeLog generation and fix text wrapping + Adapt the ChangeLog file generation process to correctly wrap text, + even with the new 'git style' format, used for Subversion commit + messages 2012-02-02 Arnaud Quette - * [r3426] drivers/bcmxcp.c, drivers/bcmxcp.h: Improve XCP support - for battery status - - Add support for battery test publication in ups.test.result, and - RB (replace battery) in ups.status + * drivers/bcmxcp.c, drivers/bcmxcp.h: Improve XCP support for battery + status Add support for battery test publication in + ups.test.result, and RB (replace battery) in ups.status 2012-01-31 Arnaud Quette - * [r3424] drivers/bestfortress.c: Add more debug traces - - Add more debug traces, again, to work on the checksum corruption - issue + * drivers/bestfortress.c: Add more debug traces Add more debug + traces, again, to work on the checksum corruption issue 2012-01-23 Arnaud Quette - * [r3411] drivers/mge-mib.c: Clean and complete MGE MIB - - Complete MGE MIB for status, variables and commands, using IETF - MIB OIDs when needed. Macro have also been replaced by actual - numeric OID paths for better clarity. - * [r3410] drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups shutdown - support - - snmp-ups now provides support for UPS shutdown, based on - usbhid-ups mechanisms (composite commands and fallback). - Composite commands are also supported. This means, for example, - that if 'shutdown.return' is not supported, a combination of - 'load.off' + 'load.on' may be used. - * [r3409] drivers/ietf-mib.c: Fix invalid variable name - - Beeper status belongs to the 'ups' data collection - * [r3408] drivers/snmp-ups.c: Check validity of instant commands - before addition - - Prior to adding new instant commands, referenced OIDs are now - checked for existance. This avoid adding commands that are not + * drivers/mge-mib.c: Clean and complete MGE MIB Complete MGE MIB for + status, variables and commands, using IETF MIB OIDs when needed. + Macro have also been replaced by actual numeric OID paths for + better clarity. + * drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups shutdown support + snmp-ups now provides support for UPS shutdown, based on usbhid-ups + mechanisms (composite commands and fallback). Composite commands + are also supported. This means, for example, that if + 'shutdown.return' is not supported, a combination of 'load.off' + + 'load.on' may be used. + * drivers/ietf-mib.c: Fix invalid variable name Beeper status + belongs to the 'ups' data collection + * drivers/snmp-ups.c: Check validity of instant commands before + addition Prior to adding new instant commands, referenced OIDs are + now checked for existance. This avoid adding commands that are not supported - * [r3407] docs/man/upsmon.txt: Fix upsmon synopsis - - Add the missing '-K' (Test for the shutdown flag) to upsmon - synopsis (reported by Regid Ichira) + * docs/man/upsmon.txt: Fix upsmon synopsis Add the missing '-K' + (Test for the shutdown flag) to upsmon synopsis (reported by Regid + Ichira) 2012-01-20 Arnaud Quette - * [r3406] data/driver.list.in: Support for Riello Netman Plus 102 - SNMP Card - + * data/driver.list.in: Support for Riello Netman Plus 102 SNMP Card Add Riello Netman Plus 102 SNMP Card, and attached Sentinel SDL 6000-7 and Sentinel Dual SDH 1000-7 UPS, to the list of snmp-ups supported models (reported by Rainer Stumbaum) 2012-01-19 Arnaud Quette - * [r3400] drivers/bestfortress.c: Add more debug traces, to work on - the checksum corruption issue + * drivers/bestfortress.c: Add more debug traces, to work on the + checksum corruption issue 2012-01-18 Arnaud Quette - * [r3399] docs/nut-names.txt, drivers/usbhid-ups.c: Adjust - ups.start.auto value for shutdown commands - - When present, ups.start.auto value needs to be adjusted for - shutdown.{return,stayoff} to behave as expected. This is limited - to Eaton devices (reported by Rich Wrenn) + * docs/nut-names.txt, drivers/usbhid-ups.c: Adjust ups.start.auto + value for shutdown commands When present, ups.start.auto value + needs to be adjusted for shutdown.{return,stayoff} to behave as + expected. This is limited to Eaton devices (reported by Rich Wrenn) 2012-01-11 Arnaud Quette - * [r3395] UPGRADING: Cleanup garbage line - - Remove garbage line that was added by accident during the - AsciiDoc branch merge or work - * [r3394] tools/nut-scanner/Makefile.am, - tools/nut-scanner/nutscan-init.c, tools/nut-scanner/scan_nut.c: - Move libupsclient to weak runtime dependencies - - libupsclient, as other libraries used by nut-scanner, is now a - weak runtime dependency, through the use of lt_dl*() functions. - This means that libupsclient is not anymore required, but only - suggested. This should also solve the distcheck-light compilation - on Aix (on behalf of Frédéric Bohe, from Eaton) + * UPGRADING: Cleanup garbage line Remove garbage line that was added + by accident during the AsciiDoc branch merge or work + * tools/nut-scanner/Makefile.am, tools/nut-scanner/nutscan-init.c, + tools/nut-scanner/scan_nut.c: Move libupsclient to weak runtime + dependencies libupsclient, as other libraries used by nut-scanner, + is now a weak runtime dependency, through the use of lt_dl*() + functions. This means that libupsclient is not anymore required, + but only suggested. This should also solve the distcheck-light + compilation on Aix (on behalf of Frédéric Bohe, from Eaton) + +2012-01-10 Michal Hlavinka + + * drivers/dstate.c: do not forget to check send_to_one return value + send_to_one free()s connection, we can't use it after failure. + * drivers/bcmxcp.c: do not call getinfo twice, use returned value for + parsing result was stored, but never used. Another dstate_getinfo + call was used instead of stored value. Probably result of copy- + paste. + * tools/nut-scanner/scan_xml_http.c: do not use unterminated string + in strlen recvfrom returns raw data without null termination, this + string can't be used in strlen. Use number of recieved bytes + returned by recvfrom instead of strlen. + * clients/upssched.c: do not send garbage on retry because write and + read commands shared one buffer, on retry we did not send command + again, but last read data + * drivers/tripplite_usb.c: prevent buffer overflow in hexascdump + haxascdump uses fixed size static buffer, but it had no checks to + assure result can fit into that buffer. + * tools/nut-scanner/scan_nut.c: ups variable was allocated, but not + free()d + * drivers/rhino.c, drivers/solis.c: use automatic time_t variable + instead of allocated one time_t value is small enough to be + automatic variable instead of allocated one. It eliminates risk we + forget to free it again. + * drivers/bcmxcp.c: do not forget to free pTmp even if len is zero, + pTmp should be freed + * drivers/mge-utalk.c: prevent null pointer dereference in strchr in + some cases p can be null causing null pointer dereference of v + (initialized to 0) in strchr command + * drivers/bcmxcp_usb.c: Fix condition in re-try loop making error + checking unreachable for loop with condition retry <= MAX_TRIES + ends with retry = MAX_TRIES+1. This breaks following error check + with retry == MAX_TRIES condition, because it's true only in case + when last retry actualy succeeded. 2012-01-09 Arnaud Quette - * [r3382] drivers/bestups.c: Add the missing driver variable - "battvoltmult" (patch from Sadara Kael) + * drivers/bestups.c: Add the missing driver variable "battvoltmult" + (patch from Sadara Kael) 2012-01-06 Arnaud Quette - * [r3379] drivers/snmp-ups.c: Reword the message when sysOID - detection fails - * [r3378] drivers/compaq-mib.c: Add the sysOID value, and bump the - MIB version to 1.1 (reported by Jack Challen) - * [r3377] docs/download.txt: Remove inline SHA-256 sum, and provide - links to MD5 and SHA-256 sums + * drivers/snmp-ups.c: Reword the message when sysOID detection fails + * drivers/compaq-mib.c: Add the sysOID value, and bump the MIB + version to 1.1 (reported by Jack Challen) + * docs/download.txt: Remove inline SHA-256 sum, and provide links to + MD5 and SHA-256 sums 2012-01-05 Arnaud Quette - * [r3376] server/netget.c: GET UPSDESC does not need device sanity - checks (Ie connected, with fresh data) to answer (reported by - Emilien Kia, Alioth bug #313323) - * [r3374] data/driver.list.in: Add Dynamix 1000VA USB to the list - of blazer_usb supported models (requires "langid_fix=0x0409" in - ups.conf ; reported by Glen Ogilvie) + * server/netget.c: GET UPSDESC does not need device sanity checks + (i.e. connected, with fresh data) to answer (reported by Emilien + Kia, Alioth bug #313323) + * data/driver.list.in: Add Dynamix 1000VA USB to the list of + blazer_usb supported models (requires "langid_fix=0x0409" in + ups.conf; reported by Glen Ogilvie) 2012-01-04 Arnaud Quette - * [r3372] docs/download.txt: Add the missing SHA-256 sum on the - Download page / section (need to be generated after the - distribution package) - * [r3371] docs/website/news.txt: Update 2.6.3 release date + * docs/download.txt: Add the missing SHA-256 sum on the Download page + / section (needs to be generated after the distribution package) + * docs/website/news.txt: Update 2.6.3 release date 2012-01-03 Arnaud Quette - * [r3370] NEWS, UPGRADING, configure.in, docs/website/news.txt: - Final update for 2.6.3 release + * NEWS, UPGRADING, configure.in, docs/website/news.txt: Final update + for 2.6.3 release 2012-01-03 Frederic Bohe - * [r3369] docs/config-notes.txt: Add a note about file names with - space characters in the documentation. + * docs/config-notes.txt: Add a note about file names with space + characters in the documentation. 2012-01-03 Arnaud Quette - * [r3368] drivers/dummy-ups.c: Add a comment for further processing + * drivers/dummy-ups.c: Add a comment for further processing 2012-01-03 Frederic Bohe - * [r3367] tools/nut-scanner/nut-scanner.c: Fix nut scanner SNMP v3 - help message. - * [r3366] docs/man/nut-scanner.txt: Fix nut scanner SNMP v3 - documentation. + * tools/nut-scanner/nut-scanner.c: Fix nut scanner SNMP v3 help + message. + * docs/man/nut-scanner.txt: Fix nut scanner SNMP v3 documentation. + +2011-12-30 Prachi Gandhi + + * configure.in, scripts/Solaris/Makefile.am, + scripts/Solaris/checkinstall, scripts/Solaris/nut.in, + scripts/Solaris/pkginfo.in, scripts/Solaris/postinstall.in, + scripts/Solaris/postremove, scripts/Solaris/preinstall, + scripts/Solaris/preremove.in, scripts/Solaris/prototype: Added + Solaris Packaging scripts 2011-12-17 Arnaud Quette - * [r3364] drivers/blazer_usb.c: Actually apply the langid_fix - value, when calling usb_get_string (reported by Charles Lepple) - * [r3363] data/driver.list.in, docs/man/blazer.txt, - drivers/blazer_usb.c: Try to fix language ID support for USB - units from LDLC, Dynamix and no names in blazer_usb (reworked - patch, from Brian R. Smith and Aurélien Grenotton) + * drivers/blazer_usb.c: Actually apply the langid_fix value, ... + ...when calling usb_get_string (reported by Charles Lepple) + * data/driver.list.in, docs/man/blazer.txt, drivers/blazer_usb.c: Try + to fix language ID support for USB units from LDLC, Dynamix ... + ...and no names in blazer_usb (reworked patch, from Brian R. Smith + and Aurélien Grenotton) 2011-12-16 Arnaud Quette - * [r3362] scripts/HP-UX: Add the generated HP-UX packaging script - (.psf) to the list of Subversion ignored files - * [r3361] drivers/eaton-mib.c, drivers/snmp-ups.c: Fix newer Eaton - ePDU OIDs declaration ordering, so that it better supports the + * scripts/HP-UX/.gitignore: Add the generated HP-UX packaging script + (.psf) to the list of ignored files + * drivers/eaton-mib.c, drivers/snmp-ups.c: Fix newer Eaton ePDU OIDs + declaration ordering, ... ...so that it better supports the various models (switched or advanced monitored) 2011-12-15 Arnaud Quette - * [r3360] clients/upsclient.c, drivers/belkinunv.c, - drivers/etapro.c, drivers/gamatronic.c, drivers/isbmex.c, - drivers/libshut.c, drivers/metasys.c, drivers/mge-shut.c, - drivers/microdowell.c, drivers/nut-libfreeipmi.c, - drivers/rhino.c, drivers/solis.c: Fix set but not used variables - [-Wunused-but-set-variable] (including patch from Regid Ichira) + * clients/upsclient.c, drivers/belkinunv.c, drivers/etapro.c, + drivers/gamatronic.c, drivers/isbmex.c, drivers/libshut.c, + drivers/metasys.c, drivers/mge-shut.c, drivers/microdowell.c, + drivers/nut-libfreeipmi.c, drivers/rhino.c, drivers/solis.c: Fix + set but not used variables [-Wunused-but-set-variable] (including + patch from Regid Ichira) 2011-12-13 Arnaud Quette - * [r3359] Makefile.am, configure.in, docs/man, - docs/man/Makefile.am, docs/man/nutscan_init.txt, + * compile: Update compile script, as per the latest version available + in Automake (1.11) + * docs/man/.gitignore: Add the generated nutscan_init.3 Groff manual + page... ...to the list of ignored files + * tools/nut-scanner/Makefile.am, tools/nut-scanner/scan_ipmi.c: Add + IPMI power supplies discovery to nut-scanner + * drivers/nut-libfreeipmi.c, m4/nut_check_libfreeipmi.m4: Separate + IPMI requirements, between FRU lookup and monitoring. This way, we + can at least compile nut-scanner with IPMI support and a limited + (no monitoring) version of nut-ipmipsu, using older (pre 1.0.1) + FreeIPMI versions + +2011-12-12 Frederic Bohe + + * tools/nut-scanner/Makefile.am: Unconditional compile of scan_* + source code... ...since now they contains the relevant stub + function. + * tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_snmp.c, + tools/nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: + Clean call to nutscan include files + * tools/nut-scanner/nutscan-init.c: Fix wrong variable name + * tools/nut-scanner/nut-scanner.c: Fix wrong call to + nutscan_scan_avahi + * tools/nut-scanner/Makefile.am: Forgot to include nutscan-init.h in + Makefile + * docs/man/Makefile.am, docs/man/nutscan_init.txt, docs/man/nutscan_scan_avahi.txt, docs/man/nutscan_scan_ipmi.txt, docs/man/nutscan_scan_nut.txt, docs/man/nutscan_scan_snmp.txt, - docs/man/nutscan_scan_usb.txt, - docs/man/nutscan_scan_xml_http.txt, drivers/nut-libfreeipmi.c, - m4/nut_check_libfreeipmi.m4, m4/nut_check_libltdl.m4, - tools/nut-scanner/Makefile.am, tools/nut-scanner/nut-scan.h, - tools/nut-scanner/nut-scanner.c, - tools/nut-scanner/nutscan-init.c, - tools/nut-scanner/nutscan-init.h, tools/nut-scanner/scan_avahi.c, - tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, - tools/nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, - tools/nut-scanner/scan_xml_http.c: Merge nut-scanner_dlopen - branch, at revision 3358. This brings weak runtime dependencies - to nut-scanner, allowing to compile with all options and to run - according to the available dependencies. It also adds IPMI scan - * [r3358] compile: Update compile script, as per the latest version - available in Automake (1.11) + docs/man/nutscan_scan_usb.txt, docs/man/nutscan_scan_xml_http.txt: + Update documentation + * tools/nut-scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, + tools/nut-scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools + /nut-scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: Make + sure not to call any non-initialized function pointers. + * tools/nut-scanner/Makefile.am, tools/nut-scanner/nut-scan.h, tools + /nut-scanner/nut-scanner.c, tools/nut-scanner/nutscan-init.c, tools + /nut-scanner/nutscan-init.h, tools/nut-scanner/scan_avahi.c, tools + /nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_snmp.c, tools/nut- + scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: Keep the + same API whatever the library are at compile time... ...(so some + scan functions may be stub only) Add an init function + variable to + know the available scan method at run time. Update nut-scanner + accordingly. + +2011-12-09 Arnaud Quette + + * Makefile.am, configure.in, libltdl/COPYING.LIB, + libltdl/Makefile.am, libltdl/Makefile.in, libltdl/Makefile.inc, + libltdl/README, libltdl/aclocal.m4, libltdl/argz.c, + libltdl/argz_.h, libltdl/config-h.in, libltdl/config/compile, + libltdl/config/config.guess, libltdl/config/config.sub, + libltdl/config/depcomp, libltdl/config/edit-readme-alpha, + libltdl/config/general.m4sh, libltdl/config/getopt.m4sh, + libltdl/config/install-sh, libltdl/config/ltmain.m4sh, + libltdl/config/ltmain.sh, libltdl/config/mdate-sh, + libltdl/config/missing, libltdl/config/mkstamp, + libltdl/config/texinfo.tex, libltdl/configure, + libltdl/configure.ac, libltdl/libltdl/lt__alloc.h, + libltdl/libltdl/lt__dirent.h, libltdl/libltdl/lt__glibc.h, + libltdl/libltdl/lt__private.h, libltdl/libltdl/lt__strl.h, + libltdl/libltdl/lt_dlloader.h, libltdl/libltdl/lt_error.h, + libltdl/libltdl/lt_system.h, libltdl/libltdl/slist.h, + libltdl/loaders/dld_link.c, libltdl/loaders/dlopen.c, + libltdl/loaders/dyld.c, libltdl/loaders/load_add_on.c, + libltdl/loaders/loadlibrary.c, libltdl/loaders/preopen.c, + libltdl/loaders/shl_load.c, libltdl/lt__alloc.c, + libltdl/lt__dirent.c, libltdl/lt__strl.c, libltdl/lt_dlloader.c, + libltdl/lt_error.c, libltdl/ltdl.c, libltdl/ltdl.h, + libltdl/m4/argz.m4, libltdl/m4/autobuild.m4, libltdl/m4/libtool.m4, + libltdl/m4/ltdl.m4, libltdl/m4/ltoptions.m4, libltdl/m4/ltsugar.m4, + libltdl/m4/ltversion.in, libltdl/m4/ltversion.m4, + libltdl/m4/lt~obsolete.m4, libltdl/slist.c, libltdl/stamp-mk, + m4/nut_check_libltdl.m4, tools/nut-scanner/Makefile.am: Delete the + bundled version of libltdl, ... and add detection and integration + for the system provided version. nut-scanner build now depends on + the existence of libltdl on the system + * autogen.sh: Revert commit [[SVN:3344]], ...since it causes + problems with documentation build, due to INSTALL being overwritten + +2011-12-09 Charles Lepple + + * autogen.sh: Force files to be overwritten (especially for libtool) + +2011-12-07 Frederic Bohe + + * Makefile.am, configure.in, libltdl/COPYING.LIB, + libltdl/Makefile.am, libltdl/Makefile.in, libltdl/Makefile.inc, + libltdl/README, libltdl/aclocal.m4, libltdl/argz.c, + libltdl/argz_.h, libltdl/config-h.in, libltdl/config/compile, + libltdl/config/config.guess, libltdl/config/config.sub, + libltdl/config/depcomp, libltdl/config/edit-readme-alpha, + libltdl/config/general.m4sh, libltdl/config/getopt.m4sh, + libltdl/config/install-sh, libltdl/config/ltmain.m4sh, + libltdl/config/ltmain.sh, libltdl/config/mdate-sh, + libltdl/config/missing, libltdl/config/mkstamp, + libltdl/config/texinfo.tex, libltdl/configure, + libltdl/configure.ac, libltdl/libltdl/lt__alloc.h, + libltdl/libltdl/lt__dirent.h, libltdl/libltdl/lt__glibc.h, + libltdl/libltdl/lt__private.h, libltdl/libltdl/lt__strl.h, + libltdl/libltdl/lt_dlloader.h, libltdl/libltdl/lt_error.h, + libltdl/libltdl/lt_system.h, libltdl/libltdl/slist.h, + libltdl/loaders/dld_link.c, libltdl/loaders/dlopen.c, + libltdl/loaders/dyld.c, libltdl/loaders/load_add_on.c, + libltdl/loaders/loadlibrary.c, libltdl/loaders/preopen.c, + libltdl/loaders/shl_load.c, libltdl/lt__alloc.c, + libltdl/lt__dirent.c, libltdl/lt__strl.c, libltdl/lt_dlloader.c, + libltdl/lt_error.c, libltdl/ltdl.c, libltdl/ltdl.h, + libltdl/m4/argz.m4, libltdl/m4/autobuild.m4, libltdl/m4/libtool.m4, + libltdl/m4/ltdl.m4, libltdl/m4/ltoptions.m4, libltdl/m4/ltsugar.m4, + libltdl/m4/ltversion.in, libltdl/m4/ltversion.m4, + libltdl/m4/lt~obsolete.m4, libltdl/slist.c, libltdl/stamp-mk, tools + /nut-scanner/Makefile.am, tools/nut-scanner/scan_avahi.c, tools + /nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut- + scanner/scan_xml_http.c: First set of modification to include + libltdl 2011-12-05 Arnaud Quette - * [r3341] data/driver.list.in, docs/man/snmp-ups.txt, - drivers/Makefile.am, drivers/cyberpower-mib.c, - drivers/cyberpower-mib.h, drivers/snmp-ups.c: Add Cyber Power - Systems with SNMP RMCARD (100, 201, 202 and 301) to the list of - snmp-ups supported models (patch from Eric Schultz) - * [r3340] drivers/snmp-ups.c: Remove the Eaton Marlin hook, for - base outlet index, since it has been fixed by a new firmware - revision + * data/driver.list.in, docs/man/snmp-ups.txt, drivers/Makefile.am, + drivers/cyberpower-mib.c, drivers/cyberpower-mib.h, drivers/snmp- + ups.c: Add Cyber Power Systems with SNMP RMCARD (100, 201, 202 and + 301) ... ...to the list of snmp-ups supported models (patch from + Eric Schultz) + * drivers/snmp-ups.c: Remove the Eaton Marlin hook, for base outlet + index ... ...since it has been fixed by a new firmware revision 2011-11-29 Arnaud Quette - * [r3338] tools/nut-snmpinfo.py: Fix indentation and use open() - instead of file(), to better support Python 3 (Alioth bug - #313446, patch from Bohdan Popovych) + * tools/nut-snmpinfo.py: Fix indentation and use open() instead of + file(), to better support Python 3 (Alioth bug #313446, patch from + Bohdan Popovych) 2011-11-25 Arnaud Quette - * [r3335] drivers/nut-ipmi.h: Fix wrong prototype declaration, that - was causing a compilation warning (implicit declaration of - function ‘nut_ipmi_get_sensors_status’) + * drivers/nut-ipmi.h: Fix wrong prototype declaration, that was + causing a compilation warning (implicit declaration of function + ‘nut_ipmi_get_sensors_status’) + +2011-11-24 Arnaud Quette + + * scripts/Solaris/pkginfo.in: BASEDIR must also be adapted from + configure settings + * scripts/Solaris/Makefile.am: Add missing dependencies, and + distribution rules + * scripts/Makefile.am: There is no need to list Solaris/pkginfo.in + there, ... ...since 'Solaris' is listed in SUBDIRS, and + 'pkginfo.in' is listed in configure.in + * scripts/Solaris/Makefile.am: Remove makelocal.sh from + check_SCRIPTS, ... ...since it is not meant to be run at "make + check" time 2011-11-24 Prachi Gandhi - * [r3328] Makefile.am, configure.in, scripts/Makefile.am, - scripts/Solaris: Reverted changes made for Solaris packaging - files(revision 3326), added files in NUT_packaging branch - * [r3326] Makefile.am, configure.in, scripts/Makefile.am, - scripts/Solaris, scripts/Solaris/Makefile.am, - scripts/Solaris/makelocal.sh, scripts/Solaris/pkginfo.in, - scripts/Solaris/prototype: Solaris NUT package files added + * Makefile.am, configure.in, scripts/Makefile.am, + scripts/Solaris/Makefile.am, scripts/Solaris/makelocal.sh, + scripts/Solaris/pkginfo.in, scripts/Solaris/prototype: Reverted + changes made for Solaris packaging files in [[SVN:3326]] ... added + files in NUT_packaging branch + * Makefile.am, configure.in, scripts/Makefile.am, + scripts/Solaris/Makefile.am, scripts/Solaris/makelocal.sh, + scripts/Solaris/pkginfo.in, scripts/Solaris/prototype: Solaris NUT + package files added + * Makefile.am, configure.in, scripts/Makefile.am, + scripts/Solaris/Makefile.am, scripts/Solaris/makelocal.sh, + scripts/Solaris/pkginfo.in, scripts/Solaris/prototype: Solaris NUT + package files added 2011-11-15 Arnaud Quette - * [r3321] drivers/blazer_usb.c, drivers/usb-common.h: Revert commit - r2993 and r2994. This enables again inclusion of buggy USB Device - and Vendor IDs, supported by blazer_usb, in udev rules file - (Reported by Stanislav Brabec, from Suse) - * [r3320] tools/Makefile.am: Add missing comment + * drivers/blazer_usb.c, drivers/usb-common.h: Revert commit + [[SVN:2993]] and [[SVN:2994]]. This enables again inclusion of + buggy USB Device and Vendor IDs, supported by blazer_usb, in udev + rules file (Reported by Stanislav Brabec, from Suse) + * tools/Makefile.am: Add missing comment 2011-11-12 Arnaud Quette - * [r3318] drivers/mge-mib.c: Add upsmgBatteryLowCondition OID to - the status mapping (reported by Kiss Gabor (Bitman)) + * drivers/mge-mib.c: Add upsmgBatteryLowCondition OID to the status + mapping (reported by Kiss Gabor (Bitman)) 2011-11-11 Praveen Kumar - * [r3317] scripts/HP-UX/makedepot.sh: script file to create package - (depot) for HP-UX + * scripts/HP-UX/makedepot.sh: script file to create package (depot) + for HP-UX 2011-11-08 Arnaud Quette - * [r3316] docs/website/web-layout.conf: Complete search keywords - * [r3315] docs/website/web-layout.conf: Final fix for the - displaying of the legend, to work on all browsers, while still - being conforming to W3C validation + * docs/website/web-layout.conf: Complete search keywords + * docs/website/web-layout.conf: Final fix for the displaying of the + legend, to work on all browsers, ... ...while still being + conforming to W3C validation 2011-11-07 Arnaud Quette - * [r3314] docs/website/web-layout.conf: Fix displaying of the - legend + * docs/website/web-layout.conf: Fix displaying of the legend 2011-11-05 Michal Soltys - * [r3313] docs/cables.txt, docs/man/apcsmart.txt: apcsmart.txt: - minor documentation update - - Broken diagram link and 940-0024E cable mention (reported by - Jonathan Laventhol). + * docs/cables.txt, docs/man/apcsmart.txt: apcsmart.txt: minor + documentation update Broken diagram link and 940-0024E cable + mention (reported by Jonathan Laventhol). 2011-11-05 Arnaud Quette - * [r3312] conf/upsd.conf.sample, server/upsd.c: Don't fail to start - if at least one of the listening interface is available. This is - needed on systems where either IPv4 or IPv6 is disabled, and no - explicit LISTEN directive has been specified (Reported by Pavel - Zubkou, Debian bug #598741) + * conf/upsd.conf.sample, server/upsd.c: Don't fail to start if at + least one of the listening interface is available. This is needed + on systems where either IPv4 or IPv6 is disabled, and no explicit + LISTEN directive has been specified (Reported by Pavel Zubkou, + Debian bug #598741) 2011-11-02 Praveen Kumar - * [r3310] configure.in, scripts/HP-UX/nut.psf.in: Adding packaging - script for HPUX + * configure.in, scripts/HP-UX/nut.psf.in: Adding packaging script for + HPUX 2011-10-31 Arnaud Quette - * [r3308] docs/download.txt, docs/website/news.txt: Publish update - jNut 0.2, along with the new jNutWebAPI (contributed by Emilien - Kia, from Eaton) + * docs/download.txt, docs/website/news.txt: Publish update jNut 0.2, + along with the new jNutWebAPI (contributed by Emilien Kia, from + Eaton) -2011-10-28 Emilien Kia +2011-10-28 Emilien Kia - * [r3306] scripts/java/README, scripts/java/jNutWebAPI, - scripts/java/jNutWebAPI/README, scripts/java/jNutWebAPI/pom.xml, - scripts/java/jNutWebAPI/src, scripts/java/jNutWebAPI/src/main, - scripts/java/jNutWebAPI/src/main/java, - scripts/java/jNutWebAPI/src/main/java/org, - scripts/java/jNutWebAPI/src/main/java/org/networkupstools, - scripts/java/jNutWebAPI/src/main/java/org/networkupstools/jnutwebapi, - scripts/java/jNutWebAPI/src/main/java/org/networkupstools/jnutwebapi/NutRestProvider.java, - scripts/java/jNutWebAPI/src/main/java/org/networkupstools/jnutwebapi/RestWSApplication.java, - scripts/java/jNutWebAPI/src/main/java/org/networkupstools/jnutwebapi/ScannerProvider.java, - scripts/java/jNutWebAPI/src/main/resources, - scripts/java/jNutWebAPI/src/main/webapp, - scripts/java/jNutWebAPI/src/main/webapp/WEB-INF, - scripts/java/jNutWebAPI/src/main/webapp/WEB-INF/web.xml, - scripts/java/jNutWebAPI/src/test, - scripts/java/jNutWebAPI/src/test/java, - scripts/java/jNutWebAPI/src/test/java/org, - scripts/java/jNutWebAPI/src/test/java/org/networkupstools, - scripts/java/jNutWebAPI/src/test/java/org/networkupstools/jnutwebapi: - Initial commit of jNutWebAPI. - * [r3305] scripts/java/jNut, - scripts/java/jNut/src/main/java/org/networkupstools/jnut/Scanner.java: - Fix a little bug with function namming (get instead of set). + * scripts/java/README, scripts/java/jNutWebAPI/README, + scripts/java/jNutWebAPI/pom.xml, + .../jnutwebapi/NutRestProvider.java, + .../jnutwebapi/RestWSApplication.java, + .../jnutwebapi/ScannerProvider.java, .../jNutWebAPI/src/main/webapp + /WEB-INF/web.xml: Initial commit of jNutWebAPI. + * scripts/java/jNut/.gitignore, scripts/java/jNut/src/main/java/org/n + etworkupstools/jnut/Scanner.java: Fix a little bug with function + namming (get instead of set). 2011-10-27 Arnaud Quette - * [r3304] docs/maintainer-guide.txt: Create a basic NUT maintainer - guide, to start tracking and improving maintenance workflow - * [r3303] drivers/bcmxcp_usb.c: Handle disconnection issues and - reconnection mechanism (bug reported by Rich Wrenn) + * docs/maintainer-guide.txt: Create a basic NUT maintainer guide, ... + to start tracking and improving maintenance workflow + * drivers/bcmxcp_usb.c: Handle disconnection issues and reconnection + mechanism (bug reported by Rich Wrenn) -2011-10-25 Emilien Kia +2011-10-25 Emilien Kia - * [r3302] - scripts/java/jNut/src/test/java/org/networkupstools/jnut/ClientTest.java: - Add licence information. - * [r3301] scripts/java/jNut/README, scripts/java/jNut/pom.xml, - scripts/java/jNut/src/main/java/org/networkupstools/jnut/Scanner.java, - scripts/java/jNut/src/test/java/org/networkupstools/jnut/ScannerTest.java: - Add nut-scanner. + * .../test/java/org/networkupstools/jnut/ClientTest.java: Add licence + information. + * scripts/java/jNut/README, scripts/java/jNut/pom.xml, + .../java/org/networkupstools/jnut/Scanner.java, + .../java/org/networkupstools/jnut/ScannerTest.java: Add nut- + scanner. 2011-10-25 Frederic Bohe - * [r3300] tools/nut-scanner/scan_snmp.c: Add sanity checks - * [r3299] tools/nut-scanner/scan_avahi.c: Remove unused variable + * tools/nut-scanner/scan_snmp.c: Add sanity checks + * tools/nut-scanner/scan_avahi.c: Remove unused variable 2011-10-25 Michal Soltys - * [r3298] drivers/apcsmart.c: drivers/apcsmart.c: minor correction - - Assigning 0 directly was wrong (actually, a leftover from earlier - version of the code that was removed) - ser_set_speed() prepares - the port initially, we only adjust certain options. + * drivers/apcsmart.c: drivers/apcsmart.c: minor correction Assigning + 0 directly was wrong (actually, a leftover from earlier version of + the code that was removed) - ser_set_speed() prepares the port + initially, we only adjust certain options. 2011-10-24 Frederic Bohe - * [r3297] docs/man/nut-scanner.txt, - tools/nut-scanner/nut-scanner.c: Forgot to document "-q" option - (thanks to Emilien Kia for reporting this) + * docs/man/nut-scanner.txt, tools/nut-scanner/nut-scanner.c: Forgot + to document "-q" option (thanks to Emilien Kia for reporting this) 2011-10-21 Frederic Bohe - * [r3296] tools/nut-scanner/nut-scanner.c: Trivial layout - consistency - * [r3295] docs/man/nut-scanner.txt: Update man page with -V and -a + * tools/nut-scanner/nut-scanner.c: Trivial layout consistency + * docs/man/nut-scanner.txt: Update man page with -V and -a option + * tools/nut-scanner/nut-scanner.c: Add an option to display available + bus (usefull for wrapper). + * tools/nut-scanner/nut-scanner.c: return -1 on bad command line option - * [r3294] tools/nut-scanner/nut-scanner.c: Add an option to display - available bus (usefull for wrapper). - * [r3293] tools/nut-scanner/nut-scanner.c: return -1 on bad command - line option 2011-10-19 Frederic Bohe - * [r3292] tools/nut-scanner/nutscan-ip.c: Fix crash on 32bits - systems - * [r3291] tools/nut-scanner/nut-scanner.c: Add a switch to display - NUT version. + * tools/nut-scanner/nutscan-ip.c: Fix crash on 32bits systems + * tools/nut-scanner/nut-scanner.c: Add a switch to display NUT + version. 2011-10-19 Charles Lepple - * [r3290] docs/FAQ.txt: Add FAQ entry for LISTEN directive + * docs/FAQ.txt: Add FAQ entry for LISTEN directive 2011-10-18 Arnaud Quette - * [r3289] drivers/eaton-mib.c: Fix outlets reported current, which + * drivers/eaton-mib.c: Fix outlets reported current, ... ...which were off by 100 in aphel_genesisII MIB, and bump MIB version to 0.46 (patch from Sven Nilsson) 2011-10-14 Arnaud Quette - * [r3288] docs/Makefile.am, docs/images/nut-logo.png, - docs/images/nut.svg, docs/website/Makefile.am, - docs/website/css/web-layout.css, docs/website/faviconut.ico, - docs/website/faviconut.png, docs/website/web-layout.conf: Add the - new NUT logo (contributed by Luc Descotils, from Eaton) - * [r3287] docs/website/web-layout.conf: Fix another W3C validator - error (there is no attribute "language" anymore for - -endif::toc[] -ifdef::hcl[] - - - -endif::hcl[] - - - - -
    -
    - -
    Network UPS Tools
    -
    Power Devices support
    -
    -
    - -
    -
    -# Article, book header. -ifndef::doctype-manpage[] - -ifdef::toc[] -
    -
    Table of Contents
    - -
    -endif::toc[] -endif::doctype-manpage[] -# Man page header. -ifdef::doctype-manpage[] - -endif::doctype-manpage[] - -[footer] - -
    -
    - - -endif::analytics[] - - diff --git a/docs/website/website.txt b/docs/website/website.txt deleted file mode 100644 index 18ff58a..0000000 --- a/docs/website/website.txt +++ /dev/null @@ -1,19 +0,0 @@ -Welcome -======= - -The primary goal of the Network UPS Tools (NUT) project is to provide support -for Power Devices, such as Uninterruptible Power Supplies, Power Distribution -Units and Solar Controllers. - -NUT provides many control and monitoring link:features.html[features], with a -uniform control and management interface. - -More than 100 different manufacturers, and several thousands models are -link:stable-hcl.html[compatible]. - -This software is the combined effort of many -link:acknowledgements.html[individuals and companies]. - -News ----- -include::news.txt[] diff --git a/docs/xhtml.xsl b/docs/xhtml.xsl new file mode 100644 index 0000000..b84425d --- /dev/null +++ b/docs/xhtml.xsl @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/drivers/Makefile.am b/drivers/Makefile.am index f8158d5..be71e91 100644 --- a/drivers/Makefile.am +++ b/drivers/Makefile.am @@ -5,7 +5,6 @@ #FIXME: SERLIBS is only useful for LDADD_DRIVERS_SERIAL not for LDADD_COMMON LDADD_COMMON = ../common/libcommon.la ../common/libparseconf.la LDADD_DRIVERS = $(LDADD_COMMON) main.o dstate.o -LDADD_HAL_DRIVERS = $(LDADD_COMMON) libnuthalmain.a LDADD_DRIVERS_SERIAL = $(LDADD_DRIVERS) $(SERLIBS) serial.o # most targets are drivers, so make this the default @@ -14,9 +13,6 @@ LDADD = $(LDADD_DRIVERS_SERIAL) # files. In any case, CFLAGS are only -I options, so there is no harm, # but only add them if we really use the target. AM_CFLAGS = -I$(top_srcdir)/include -if WITH_HAL - AM_CFLAGS += $(LIBHAL_CFLAGS) -endif if WITH_USB AM_CFLAGS += $(LIBUSB_CFLAGS) endif @@ -42,11 +38,10 @@ SERIAL_DRIVERLIST = al175 bcmxcp belkin belkinunv bestfcom \ nutdrv_qx SNMP_DRIVERLIST = snmp-ups USB_LIBUSB_DRIVERLIST = usbhid-ups bcmxcp_usb tripplite_usb \ - blazer_usb richcomm_usb riello_usb nutdrv_qx + blazer_usb richcomm_usb riello_usb \ + nutdrv_atcl_usb \ + nutdrv_qx USB_DRIVERLIST = $(USB_LIBUSB_DRIVERLIST) -HAL_DRIVERLIST = hald-addon-usbhid-ups hald-addon-bcmxcp_usb \ - hald-addon-tripplite_usb hald-addon-blazer_usb hald-addon-riello_usb \ - hald-addon-nutdrv_qx NEONXML_DRIVERLIST = netxml-ups MACOSX_DRIVERLIST = macosx-ups @@ -67,10 +62,6 @@ endif if WITH_USB driverexec_PROGRAMS += $(USB_LIBUSB_DRIVERLIST) endif -if WITH_HAL - halexecdir = $(HAL_CALLOUTS_PATH) - halexec_PROGRAMS = $(HAL_DRIVERLIST) -endif if WITH_NEON driverexec_PROGRAMS += $(NEONXML_DRIVERLIST) endif @@ -88,7 +79,7 @@ else endif # always build upsdrvctl -driverexec_PROGRAMS += upsdrvctl +sbin_PROGRAMS = upsdrvctl # ========================================================================== # Driver build details @@ -185,12 +176,16 @@ bcmxcp_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) blazer_usb_SOURCES = blazer.c blazer_usb.c libusb.c usb-common.c blazer_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm +nutdrv_atcl_usb_SOURCES = nutdrv_atcl_usb.c usb-common.c +nutdrv_atcl_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) + richcomm_usb_SOURCES = richcomm_usb.c usb-common.c richcomm_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) riello_usb_SOURCES = riello.c riello_usb.c libusb.c usb-common.c riello_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm + # HID-over-serial mge_shut_SOURCES = usbhid-ups.c libshut.c libhid.c hidparser.c mge-hid.c # per-target CFLAGS are necessary here @@ -200,30 +195,10 @@ mge_shut_LDADD = $(LDADD) # SNMP snmp_ups_SOURCES = snmp-ups.c apc-mib.c baytech-mib.c compaq-mib.c eaton-mib.c \ ietf-mib.c mge-mib.c netvision-mib.c powerware-mib.c raritan-pdu-mib.c \ - bestpower-mib.c cyberpower-mib.c delta_ups-mib.c + bestpower-mib.c cyberpower-mib.c delta_ups-mib.c \ + xppc-mib.c snmp_ups_LDADD = $(LDADD_DRIVERS) $(LIBNETSNMP_LIBS) -# HAL -hald_addon_usbhid_ups_SOURCES = usbhid-ups.c libhid.c libusb.c hidparser.c \ - $(USBHID_UPS_SUBDRIVERS) -hald_addon_usbhid_ups_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) - -hald_addon_tripplite_usb_SOURCES = tripplite_usb.c libusb.c -hald_addon_tripplite_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm - -hald_addon_bcmxcp_usb_SOURCES = bcmxcp_usb.c bcmxcp.c -hald_addon_bcmxcp_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) - -hald_addon_blazer_usb_SOURCES = blazer.c blazer_usb.c libusb.c -hald_addon_blazer_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm - -hald_addon_riello_usb_SOURCES = riello.c riello_usb.c libusb.c -hald_addon_riello_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm - -hald_addon_nutdrv_qx_SOURCES = nutdrv_qx.c libusb.c $(NUTDRV_QX_SUBDRIVERS) -hald_addon_nutdrv_qx_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm -hald_addon_nutdrv_qx_CFLAGS = $(AM_CFLAGS) -DQX_USB - # NEON XML/HTTP netxml_ups_SOURCES = netxml-ups.c mge-xml.c netxml_ups_LDADD = $(LDADD_DRIVERS) $(LIBNEON_LIBS) @@ -259,7 +234,7 @@ nutdrv_qx_LDADD += $(LIBUSB_LIBS) endif NUTDRV_QX_SUBDRIVERS = nutdrv_qx_blazer-common.c nutdrv_qx_mecer.c \ nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c nutdrv_qx_mustek.c \ - nutdrv_qx_voltronic.c nutdrv_qx_zinto.c + nutdrv_qx_q1.c nutdrv_qx_voltronic.c nutdrv_qx_voltronic-qs.c nutdrv_qx_zinto.c nutdrv_qx_SOURCES += $(NUTDRV_QX_SUBDRIVERS) # ---------------------------------------------------------------------- @@ -269,30 +244,20 @@ nutdrv_qx_SOURCES += $(NUTDRV_QX_SUBDRIVERS) dist_noinst_HEADERS = apc-mib.h apc-hid.h baytech-mib.h bcmxcp.h \ bcmxcp_io.h belkin.h belkin-hid.h bestpower-mib.h blazer.h cps-hid.h dstate.h \ - dstate-hal.h dummy-ups.h eaton-mib.h explore-hid.h gamatronic.h genericups.h \ + dummy-ups.h eaton-mib.h explore-hid.h gamatronic.h genericups.h \ hidparser.h hidtypes.h ietf-mib.h libhid.h libshut.h libusb.h liebert-hid.h \ - main.h main-hal.h mge-hid.h mge-mib.h mge-shut.h mge-utalk.h \ + main.h mge-hid.h mge-mib.h mge-shut.h mge-utalk.h \ mge-xml.h microdowell.h netvision-mib.h netxml-ups.h nut-ipmi.h oneac.h \ powercom.h powerpanel.h powerp-bin.h powerp-txt.h powerware-mib.h raritan-pdu-mib.h \ safenet.h serial.h snmp-ups.h solis.h tripplite.h tripplite-hid.h \ upshandler.h usb-common.h usbhid-ups.h powercom-hid.h compaq-mib.h idowell-hid.h \ apcsmart.h apcsmart_tabs.h apcsmart-old.h apcupsd-ups.h cyberpower-mib.h riello.h openups-hid.h \ delta_ups-mib.h nutdrv_qx.h nutdrv_qx_blazer-common.h nutdrv_qx_mecer.h \ - nutdrv_qx_megatec.h nutdrv_qx_megatec-old.h nutdrv_qx_mustek.h nutdrv_qx_voltronic.h \ - nutdrv_qx_zinto.h + nutdrv_qx_megatec.h nutdrv_qx_megatec-old.h nutdrv_qx_mustek.h nutdrv_qx_q1.h \ + nutdrv_qx_voltronic.h nutdrv_qx_voltronic-qs.h nutdrv_qx_zinto.h \ + xppc-mib.h # Define a dummy library so that Automake builds rules for the # corresponding object files. This library is not actually built, EXTRA_LIBRARIES = libdummy.a libdummy_a_SOURCES = main.c dstate.c serial.c - -# the nuthalmain library combines the code for main-hal.c and -# dstate-hal.c. It is necessary for Automake-technical reasons, -# because per-object CFLAGS can only be specified for libraries, not -# for object files. This library is used during the build process, -# and is not meant to be installed. - -EXTRA_LIBRARIES += libnuthalmain.a -libnuthalmain_a_SOURCES = main-hal.c dstate-hal.c usb-common.c - -MOSTLYCLEANFILES = libnuthalmain.a diff --git a/drivers/Makefile.in b/drivers/Makefile.in index b85633c..11a9f93 100644 --- a/drivers/Makefile.in +++ b/drivers/Makefile.in @@ -55,42 +55,38 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -@WITH_HAL_TRUE@am__append_1 = $(LIBHAL_CFLAGS) -@WITH_USB_TRUE@am__append_2 = $(LIBUSB_CFLAGS) -@WITH_SNMP_TRUE@am__append_3 = $(LIBNETSNMP_CFLAGS) -@WITH_NEON_TRUE@am__append_4 = $(LIBNEON_CFLAGS) -@WITH_LIBPOWERMAN_TRUE@am__append_5 = $(LIBPOWERMAN_CFLAGS) -@WITH_IPMI_TRUE@am__append_6 = $(LIBIPMI_CFLAGS) +@WITH_USB_TRUE@am__append_1 = $(LIBUSB_CFLAGS) +@WITH_SNMP_TRUE@am__append_2 = $(LIBNETSNMP_CFLAGS) +@WITH_NEON_TRUE@am__append_3 = $(LIBNEON_CFLAGS) +@WITH_LIBPOWERMAN_TRUE@am__append_4 = $(LIBPOWERMAN_CFLAGS) +@WITH_IPMI_TRUE@am__append_5 = $(LIBIPMI_CFLAGS) EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) \ $(am__EXEEXT_5) $(am__EXEEXT_6) @SOME_DRIVERS_FALSE@driverexec_PROGRAMS = $(am__EXEEXT_7) \ @SOME_DRIVERS_FALSE@ $(am__EXEEXT_8) $(am__EXEEXT_9) \ @SOME_DRIVERS_FALSE@ $(am__EXEEXT_10) $(am__EXEEXT_11) \ -@SOME_DRIVERS_FALSE@ $(am__EXEEXT_12) $(am__EXEEXT_13) \ -@SOME_DRIVERS_FALSE@ upsdrvctl$(EXEEXT) +@SOME_DRIVERS_FALSE@ $(am__EXEEXT_12) $(am__EXEEXT_13) @SOME_DRIVERS_TRUE@driverexec_PROGRAMS = $(DRIVER_BUILD_LIST) \ @SOME_DRIVERS_TRUE@ $(am__EXEEXT_7) $(am__EXEEXT_8) \ @SOME_DRIVERS_TRUE@ $(am__EXEEXT_9) $(am__EXEEXT_10) \ @SOME_DRIVERS_TRUE@ $(am__EXEEXT_11) $(am__EXEEXT_12) \ -@SOME_DRIVERS_TRUE@ $(am__EXEEXT_13) skel$(EXEEXT) \ -@SOME_DRIVERS_TRUE@ upsdrvctl$(EXEEXT) -@SOME_DRIVERS_FALSE@@WITH_SERIAL_TRUE@am__append_7 = $(SERIAL_DRIVERLIST) -@SOME_DRIVERS_FALSE@@WITH_SNMP_TRUE@am__append_8 = $(SNMP_DRIVERLIST) -@SOME_DRIVERS_FALSE@@WITH_USB_TRUE@am__append_9 = $(USB_LIBUSB_DRIVERLIST) -@SOME_DRIVERS_FALSE@@WITH_HAL_TRUE@halexec_PROGRAMS = \ -@SOME_DRIVERS_FALSE@@WITH_HAL_TRUE@ $(am__EXEEXT_14) -@SOME_DRIVERS_FALSE@@WITH_NEON_TRUE@am__append_10 = $(NEONXML_DRIVERLIST) -@SOME_DRIVERS_FALSE@@WITH_LIBPOWERMAN_TRUE@am__append_11 = powerman-pdu -@SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__append_12 = nut-ipmipsu -@SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__append_13 = $(MACOSX_DRIVERLIST) -@WITH_SSL_TRUE@am__append_14 = $(LIBSSL_CFLAGS) -@WITH_SSL_TRUE@am__append_15 = $(LIBSSL_LIBS) -@WITH_FREEIPMI_TRUE@am__append_16 = nut-libfreeipmi.c -@WITH_SERIAL_TRUE@am__append_17 = -DQX_SERIAL -@WITH_SERIAL_TRUE@am__append_18 = $(SERLIBS) serial.o -@WITH_USB_TRUE@am__append_19 = -DQX_USB -@WITH_USB_TRUE@am__append_20 = libusb.c usb-common.c -@WITH_USB_TRUE@am__append_21 = $(LIBUSB_LIBS) +@SOME_DRIVERS_TRUE@ $(am__EXEEXT_13) skel$(EXEEXT) +@SOME_DRIVERS_FALSE@@WITH_SERIAL_TRUE@am__append_6 = $(SERIAL_DRIVERLIST) +@SOME_DRIVERS_FALSE@@WITH_SNMP_TRUE@am__append_7 = $(SNMP_DRIVERLIST) +@SOME_DRIVERS_FALSE@@WITH_USB_TRUE@am__append_8 = $(USB_LIBUSB_DRIVERLIST) +@SOME_DRIVERS_FALSE@@WITH_NEON_TRUE@am__append_9 = $(NEONXML_DRIVERLIST) +@SOME_DRIVERS_FALSE@@WITH_LIBPOWERMAN_TRUE@am__append_10 = powerman-pdu +@SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__append_11 = nut-ipmipsu +@SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__append_12 = $(MACOSX_DRIVERLIST) +sbin_PROGRAMS = upsdrvctl$(EXEEXT) +@WITH_SSL_TRUE@am__append_13 = $(LIBSSL_CFLAGS) +@WITH_SSL_TRUE@am__append_14 = $(LIBSSL_LIBS) +@WITH_FREEIPMI_TRUE@am__append_15 = nut-libfreeipmi.c +@WITH_SERIAL_TRUE@am__append_16 = -DQX_SERIAL +@WITH_SERIAL_TRUE@am__append_17 = $(SERLIBS) serial.o +@WITH_USB_TRUE@am__append_18 = -DQX_USB +@WITH_USB_TRUE@am__append_19 = libusb.c usb-common.c +@WITH_USB_TRUE@am__append_20 = $(LIBUSB_LIBS) subdir = drivers DIST_COMMON = $(dist_noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -104,7 +100,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -114,10 +109,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -130,11 +124,6 @@ libdummy_a_LIBADD = am_libdummy_a_OBJECTS = main.$(OBJEXT) dstate.$(OBJEXT) \ serial.$(OBJEXT) libdummy_a_OBJECTS = $(am_libdummy_a_OBJECTS) -libnuthalmain_a_AR = $(AR) $(ARFLAGS) -libnuthalmain_a_LIBADD = -am_libnuthalmain_a_OBJECTS = main-hal.$(OBJEXT) dstate-hal.$(OBJEXT) \ - usb-common.$(OBJEXT) -libnuthalmain_a_OBJECTS = $(am_libnuthalmain_a_OBJECTS) am__EXEEXT_1 = al175$(EXEEXT) bcmxcp$(EXEEXT) belkin$(EXEEXT) \ belkinunv$(EXEEXT) bestfcom$(EXEEXT) bestfortress$(EXEEXT) \ bestuferrups$(EXEEXT) bestups$(EXEEXT) dummy-ups$(EXEEXT) \ @@ -153,7 +142,8 @@ am__EXEEXT_1 = al175$(EXEEXT) bcmxcp$(EXEEXT) belkin$(EXEEXT) \ am__EXEEXT_2 = snmp-ups$(EXEEXT) am__EXEEXT_3 = usbhid-ups$(EXEEXT) bcmxcp_usb$(EXEEXT) \ tripplite_usb$(EXEEXT) blazer_usb$(EXEEXT) \ - richcomm_usb$(EXEEXT) riello_usb$(EXEEXT) nutdrv_qx$(EXEEXT) + richcomm_usb$(EXEEXT) riello_usb$(EXEEXT) \ + nutdrv_atcl_usb$(EXEEXT) nutdrv_qx$(EXEEXT) am__EXEEXT_4 = $(am__EXEEXT_3) am__EXEEXT_5 = netxml-ups$(EXEEXT) am__EXEEXT_6 = macosx-ups$(EXEEXT) @@ -165,14 +155,8 @@ am__EXEEXT_6 = macosx-ups$(EXEEXT) @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__EXEEXT_12 = \ @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@ nut-ipmipsu$(EXEEXT) @SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__EXEEXT_13 = $(am__EXEEXT_6) -am__installdirs = "$(DESTDIR)$(driverexecdir)" \ - "$(DESTDIR)$(halexecdir)" -am__EXEEXT_14 = hald-addon-usbhid-ups$(EXEEXT) \ - hald-addon-bcmxcp_usb$(EXEEXT) \ - hald-addon-tripplite_usb$(EXEEXT) \ - hald-addon-blazer_usb$(EXEEXT) hald-addon-riello_usb$(EXEEXT) \ - hald-addon-nutdrv_qx$(EXEEXT) -PROGRAMS = $(driverexec_PROGRAMS) $(halexec_PROGRAMS) +am__installdirs = "$(DESTDIR)$(driverexecdir)" "$(DESTDIR)$(sbindir)" +PROGRAMS = $(driverexec_PROGRAMS) $(sbin_PROGRAMS) am_al175_OBJECTS = al175.$(OBJEXT) al175_OBJECTS = $(am_al175_OBJECTS) al175_LDADD = $(LDADD) @@ -264,56 +248,6 @@ am_genericups_OBJECTS = genericups.$(OBJEXT) genericups_OBJECTS = $(am_genericups_OBJECTS) genericups_LDADD = $(LDADD) genericups_DEPENDENCIES = $(am__DEPENDENCIES_2) -am_hald_addon_bcmxcp_usb_OBJECTS = bcmxcp_usb.$(OBJEXT) \ - bcmxcp.$(OBJEXT) -hald_addon_bcmxcp_usb_OBJECTS = $(am_hald_addon_bcmxcp_usb_OBJECTS) -hald_addon_bcmxcp_usb_DEPENDENCIES = $(LDADD_HAL_DRIVERS) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am_hald_addon_blazer_usb_OBJECTS = blazer.$(OBJEXT) \ - blazer_usb.$(OBJEXT) libusb.$(OBJEXT) -hald_addon_blazer_usb_OBJECTS = $(am_hald_addon_blazer_usb_OBJECTS) -hald_addon_blazer_usb_DEPENDENCIES = $(LDADD_HAL_DRIVERS) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am__objects_1 = \ - hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.$(OBJEXT) \ - hald_addon_nutdrv_qx-nutdrv_qx_mecer.$(OBJEXT) \ - hald_addon_nutdrv_qx-nutdrv_qx_megatec.$(OBJEXT) \ - hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.$(OBJEXT) \ - hald_addon_nutdrv_qx-nutdrv_qx_mustek.$(OBJEXT) \ - hald_addon_nutdrv_qx-nutdrv_qx_voltronic.$(OBJEXT) \ - hald_addon_nutdrv_qx-nutdrv_qx_zinto.$(OBJEXT) -am_hald_addon_nutdrv_qx_OBJECTS = \ - hald_addon_nutdrv_qx-nutdrv_qx.$(OBJEXT) \ - hald_addon_nutdrv_qx-libusb.$(OBJEXT) $(am__objects_1) -hald_addon_nutdrv_qx_OBJECTS = $(am_hald_addon_nutdrv_qx_OBJECTS) -hald_addon_nutdrv_qx_DEPENDENCIES = $(LDADD_HAL_DRIVERS) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -hald_addon_nutdrv_qx_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -am_hald_addon_riello_usb_OBJECTS = riello.$(OBJEXT) \ - riello_usb.$(OBJEXT) libusb.$(OBJEXT) -hald_addon_riello_usb_OBJECTS = $(am_hald_addon_riello_usb_OBJECTS) -hald_addon_riello_usb_DEPENDENCIES = $(LDADD_HAL_DRIVERS) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am_hald_addon_tripplite_usb_OBJECTS = tripplite_usb.$(OBJEXT) \ - libusb.$(OBJEXT) -hald_addon_tripplite_usb_OBJECTS = \ - $(am_hald_addon_tripplite_usb_OBJECTS) -hald_addon_tripplite_usb_DEPENDENCIES = $(LDADD_HAL_DRIVERS) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am__objects_2 = apc-hid.$(OBJEXT) belkin-hid.$(OBJEXT) \ - cps-hid.$(OBJEXT) explore-hid.$(OBJEXT) liebert-hid.$(OBJEXT) \ - mge-hid.$(OBJEXT) powercom-hid.$(OBJEXT) \ - tripplite-hid.$(OBJEXT) idowell-hid.$(OBJEXT) \ - openups-hid.$(OBJEXT) -am_hald_addon_usbhid_ups_OBJECTS = usbhid-ups.$(OBJEXT) \ - libhid.$(OBJEXT) libusb.$(OBJEXT) hidparser.$(OBJEXT) \ - $(am__objects_2) -hald_addon_usbhid_ups_OBJECTS = $(am_hald_addon_usbhid_ups_OBJECTS) -hald_addon_usbhid_ups_DEPENDENCIES = $(LDADD_HAL_DRIVERS) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_isbmex_OBJECTS = isbmex.$(OBJEXT) isbmex_OBJECTS = $(am_isbmex_OBJECTS) isbmex_DEPENDENCIES = $(am__DEPENDENCIES_3) @@ -363,25 +297,32 @@ am_netxml_ups_OBJECTS = netxml-ups.$(OBJEXT) mge-xml.$(OBJEXT) netxml_ups_OBJECTS = $(am_netxml_ups_OBJECTS) netxml_ups_DEPENDENCIES = $(LDADD_DRIVERS) $(am__DEPENDENCIES_1) am__nut_ipmipsu_SOURCES_DIST = nut-ipmipsu.c nut-libfreeipmi.c -@WITH_FREEIPMI_TRUE@am__objects_3 = nut-libfreeipmi.$(OBJEXT) -am_nut_ipmipsu_OBJECTS = nut-ipmipsu.$(OBJEXT) $(am__objects_3) +@WITH_FREEIPMI_TRUE@am__objects_1 = nut-libfreeipmi.$(OBJEXT) +am_nut_ipmipsu_OBJECTS = nut-ipmipsu.$(OBJEXT) $(am__objects_1) nut_ipmipsu_OBJECTS = $(am_nut_ipmipsu_OBJECTS) nut_ipmipsu_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_1) +am_nutdrv_atcl_usb_OBJECTS = nutdrv_atcl_usb.$(OBJEXT) \ + usb-common.$(OBJEXT) +nutdrv_atcl_usb_OBJECTS = $(am_nutdrv_atcl_usb_OBJECTS) +nutdrv_atcl_usb_DEPENDENCIES = $(LDADD_DRIVERS) $(am__DEPENDENCIES_1) am__nutdrv_qx_SOURCES_DIST = nutdrv_qx.c libusb.c usb-common.c \ nutdrv_qx_blazer-common.c nutdrv_qx_mecer.c \ nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c nutdrv_qx_mustek.c \ - nutdrv_qx_voltronic.c nutdrv_qx_zinto.c -@WITH_USB_TRUE@am__objects_4 = nutdrv_qx-libusb.$(OBJEXT) \ + nutdrv_qx_q1.c nutdrv_qx_voltronic.c nutdrv_qx_voltronic-qs.c \ + nutdrv_qx_zinto.c +@WITH_USB_TRUE@am__objects_2 = nutdrv_qx-libusb.$(OBJEXT) \ @WITH_USB_TRUE@ nutdrv_qx-usb-common.$(OBJEXT) -am__objects_5 = nutdrv_qx-nutdrv_qx_blazer-common.$(OBJEXT) \ +am__objects_3 = nutdrv_qx-nutdrv_qx_blazer-common.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_mecer.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_megatec.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_megatec-old.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_mustek.$(OBJEXT) \ + nutdrv_qx-nutdrv_qx_q1.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_voltronic.$(OBJEXT) \ + nutdrv_qx-nutdrv_qx_voltronic-qs.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_zinto.$(OBJEXT) -am_nutdrv_qx_OBJECTS = nutdrv_qx-nutdrv_qx.$(OBJEXT) $(am__objects_4) \ - $(am__objects_5) +am_nutdrv_qx_OBJECTS = nutdrv_qx-nutdrv_qx.$(OBJEXT) $(am__objects_2) \ + $(am__objects_3) nutdrv_qx_OBJECTS = $(am_nutdrv_qx_OBJECTS) @WITH_SERIAL_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) serial.o @WITH_USB_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1) @@ -438,7 +379,7 @@ am_snmp_ups_OBJECTS = snmp-ups.$(OBJEXT) apc-mib.$(OBJEXT) \ ietf-mib.$(OBJEXT) mge-mib.$(OBJEXT) netvision-mib.$(OBJEXT) \ powerware-mib.$(OBJEXT) raritan-pdu-mib.$(OBJEXT) \ bestpower-mib.$(OBJEXT) cyberpower-mib.$(OBJEXT) \ - delta_ups-mib.$(OBJEXT) + delta_ups-mib.$(OBJEXT) xppc-mib.$(OBJEXT) snmp_ups_OBJECTS = $(am_snmp_ups_OBJECTS) snmp_ups_DEPENDENCIES = $(LDADD_DRIVERS) $(am__DEPENDENCIES_1) am_solis_OBJECTS = solis.$(OBJEXT) @@ -462,9 +403,14 @@ upscode2_DEPENDENCIES = $(am__DEPENDENCIES_3) am_upsdrvctl_OBJECTS = upsdrvctl.$(OBJEXT) upsdrvctl_OBJECTS = $(am_upsdrvctl_OBJECTS) upsdrvctl_DEPENDENCIES = $(LDADD_COMMON) +am__objects_4 = apc-hid.$(OBJEXT) belkin-hid.$(OBJEXT) \ + cps-hid.$(OBJEXT) explore-hid.$(OBJEXT) liebert-hid.$(OBJEXT) \ + mge-hid.$(OBJEXT) powercom-hid.$(OBJEXT) \ + tripplite-hid.$(OBJEXT) idowell-hid.$(OBJEXT) \ + openups-hid.$(OBJEXT) am_usbhid_ups_OBJECTS = usbhid-ups.$(OBJEXT) libhid.$(OBJEXT) \ libusb.$(OBJEXT) hidparser.$(OBJEXT) usb-common.$(OBJEXT) \ - $(am__objects_2) + $(am__objects_4) usbhid_ups_OBJECTS = $(am_usbhid_ups_OBJECTS) usbhid_ups_DEPENDENCIES = $(LDADD_DRIVERS) $(am__DEPENDENCIES_1) am_victronups_OBJECTS = victronups.$(OBJEXT) @@ -484,25 +430,20 @@ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -SOURCES = $(libdummy_a_SOURCES) $(libnuthalmain_a_SOURCES) \ - $(al175_SOURCES) $(apcsmart_SOURCES) $(apcsmart_old_SOURCES) \ - $(apcupsd_ups_SOURCES) $(bcmxcp_SOURCES) $(bcmxcp_usb_SOURCES) \ - $(belkin_SOURCES) $(belkinunv_SOURCES) $(bestfcom_SOURCES) \ - bestfortress.c $(bestuferrups_SOURCES) $(bestups_SOURCES) \ +SOURCES = $(libdummy_a_SOURCES) $(al175_SOURCES) $(apcsmart_SOURCES) \ + $(apcsmart_old_SOURCES) $(apcupsd_ups_SOURCES) \ + $(bcmxcp_SOURCES) $(bcmxcp_usb_SOURCES) $(belkin_SOURCES) \ + $(belkinunv_SOURCES) $(bestfcom_SOURCES) bestfortress.c \ + $(bestuferrups_SOURCES) $(bestups_SOURCES) \ $(blazer_ser_SOURCES) $(blazer_usb_SOURCES) $(clone_SOURCES) \ $(clone_outlet_SOURCES) $(dummy_ups_SOURCES) $(etapro_SOURCES) \ $(everups_SOURCES) $(gamatronic_SOURCES) $(genericups_SOURCES) \ - $(hald_addon_bcmxcp_usb_SOURCES) \ - $(hald_addon_blazer_usb_SOURCES) \ - $(hald_addon_nutdrv_qx_SOURCES) \ - $(hald_addon_riello_usb_SOURCES) \ - $(hald_addon_tripplite_usb_SOURCES) \ - $(hald_addon_usbhid_ups_SOURCES) $(isbmex_SOURCES) \ - $(ivtscd_SOURCES) $(liebert_SOURCES) $(liebert_esp2_SOURCES) \ - $(macosx_ups_SOURCES) $(masterguard_SOURCES) \ - $(metasys_SOURCES) $(mge_shut_SOURCES) $(mge_utalk_SOURCES) \ - $(microdowell_SOURCES) $(netxml_ups_SOURCES) \ - $(nut_ipmipsu_SOURCES) $(nutdrv_qx_SOURCES) \ + $(isbmex_SOURCES) $(ivtscd_SOURCES) $(liebert_SOURCES) \ + $(liebert_esp2_SOURCES) $(macosx_ups_SOURCES) \ + $(masterguard_SOURCES) $(metasys_SOURCES) $(mge_shut_SOURCES) \ + $(mge_utalk_SOURCES) $(microdowell_SOURCES) \ + $(netxml_ups_SOURCES) $(nut_ipmipsu_SOURCES) \ + $(nutdrv_atcl_usb_SOURCES) $(nutdrv_qx_SOURCES) \ $(oldmge_shut_SOURCES) $(oneac_SOURCES) $(optiups_SOURCES) \ $(powercom_SOURCES) $(powerman_pdu_SOURCES) \ $(powerpanel_SOURCES) $(rhino_SOURCES) $(richcomm_usb_SOURCES) \ @@ -512,25 +453,20 @@ SOURCES = $(libdummy_a_SOURCES) $(libnuthalmain_a_SOURCES) \ $(tripplitesu_SOURCES) $(upscode2_SOURCES) \ $(upsdrvctl_SOURCES) $(usbhid_ups_SOURCES) \ $(victronups_SOURCES) -DIST_SOURCES = $(libdummy_a_SOURCES) $(libnuthalmain_a_SOURCES) \ - $(al175_SOURCES) $(apcsmart_SOURCES) $(apcsmart_old_SOURCES) \ +DIST_SOURCES = $(libdummy_a_SOURCES) $(al175_SOURCES) \ + $(apcsmart_SOURCES) $(apcsmart_old_SOURCES) \ $(apcupsd_ups_SOURCES) $(bcmxcp_SOURCES) $(bcmxcp_usb_SOURCES) \ $(belkin_SOURCES) $(belkinunv_SOURCES) $(bestfcom_SOURCES) \ bestfortress.c $(bestuferrups_SOURCES) $(bestups_SOURCES) \ $(blazer_ser_SOURCES) $(blazer_usb_SOURCES) $(clone_SOURCES) \ $(clone_outlet_SOURCES) $(dummy_ups_SOURCES) $(etapro_SOURCES) \ $(everups_SOURCES) $(gamatronic_SOURCES) $(genericups_SOURCES) \ - $(hald_addon_bcmxcp_usb_SOURCES) \ - $(hald_addon_blazer_usb_SOURCES) \ - $(hald_addon_nutdrv_qx_SOURCES) \ - $(hald_addon_riello_usb_SOURCES) \ - $(hald_addon_tripplite_usb_SOURCES) \ - $(hald_addon_usbhid_ups_SOURCES) $(isbmex_SOURCES) \ - $(ivtscd_SOURCES) $(liebert_SOURCES) $(liebert_esp2_SOURCES) \ - $(macosx_ups_SOURCES) $(masterguard_SOURCES) \ - $(metasys_SOURCES) $(mge_shut_SOURCES) $(mge_utalk_SOURCES) \ - $(microdowell_SOURCES) $(netxml_ups_SOURCES) \ - $(am__nut_ipmipsu_SOURCES_DIST) $(am__nutdrv_qx_SOURCES_DIST) \ + $(isbmex_SOURCES) $(ivtscd_SOURCES) $(liebert_SOURCES) \ + $(liebert_esp2_SOURCES) $(macosx_ups_SOURCES) \ + $(masterguard_SOURCES) $(metasys_SOURCES) $(mge_shut_SOURCES) \ + $(mge_utalk_SOURCES) $(microdowell_SOURCES) \ + $(netxml_ups_SOURCES) $(am__nut_ipmipsu_SOURCES_DIST) \ + $(nutdrv_atcl_usb_SOURCES) $(am__nutdrv_qx_SOURCES_DIST) \ $(oldmge_shut_SOURCES) $(oneac_SOURCES) $(optiups_SOURCES) \ $(powercom_SOURCES) $(powerman_pdu_SOURCES) \ $(powerpanel_SOURCES) $(rhino_SOURCES) $(richcomm_usb_SOURCES) \ @@ -591,10 +527,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -606,8 +538,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -693,6 +623,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ @@ -740,7 +671,6 @@ udevdir = @udevdir@ #FIXME: SERLIBS is only useful for LDADD_DRIVERS_SERIAL not for LDADD_COMMON LDADD_COMMON = ../common/libcommon.la ../common/libparseconf.la LDADD_DRIVERS = $(LDADD_COMMON) main.o dstate.o -LDADD_HAL_DRIVERS = $(LDADD_COMMON) libnuthalmain.a LDADD_DRIVERS_SERIAL = $(LDADD_DRIVERS) $(SERLIBS) serial.o # most targets are drivers, so make this the default @@ -749,8 +679,7 @@ LDADD = $(LDADD_DRIVERS_SERIAL) # files. In any case, CFLAGS are only -I options, so there is no harm, # but only add them if we really use the target. AM_CFLAGS = -I$(top_srcdir)/include $(am__append_1) $(am__append_2) \ - $(am__append_3) $(am__append_4) $(am__append_5) \ - $(am__append_6) + $(am__append_3) $(am__append_4) $(am__append_5) SERIAL_DRIVERLIST = al175 bcmxcp belkin belkinunv bestfcom \ bestfortress bestuferrups bestups dummy-ups etapro everups \ gamatronic genericups isbmex liebert liebert-esp2 masterguard metasys \ @@ -761,16 +690,13 @@ SERIAL_DRIVERLIST = al175 bcmxcp belkin belkinunv bestfcom \ SNMP_DRIVERLIST = snmp-ups USB_LIBUSB_DRIVERLIST = usbhid-ups bcmxcp_usb tripplite_usb \ - blazer_usb richcomm_usb riello_usb nutdrv_qx + blazer_usb richcomm_usb riello_usb \ + nutdrv_atcl_usb \ + nutdrv_qx USB_DRIVERLIST = $(USB_LIBUSB_DRIVERLIST) -HAL_DRIVERLIST = hald-addon-usbhid-ups hald-addon-bcmxcp_usb \ - hald-addon-tripplite_usb hald-addon-blazer_usb hald-addon-riello_usb \ - hald-addon-nutdrv_qx - NEONXML_DRIVERLIST = netxml-ups MACOSX_DRIVERLIST = macosx-ups -@SOME_DRIVERS_FALSE@@WITH_HAL_TRUE@halexecdir = $(HAL_CALLOUTS_PATH) # ========================================================================== # Driver build details @@ -830,9 +756,9 @@ riello_ser_LDADD = $(LDADD) -lm # dummy dummy_ups_SOURCES = dummy-ups.c dummy_ups_CFLAGS = $(AM_CFLAGS) -I$(top_srcdir)/clients \ - $(am__append_14) + $(am__append_13) dummy_ups_LDADD = $(LDADD_DRIVERS) ../clients/libupsclient.la \ - $(am__append_15) + $(am__append_14) # Clone drivers clone_SOURCES = clone.c @@ -862,6 +788,8 @@ bcmxcp_usb_SOURCES = bcmxcp_usb.c bcmxcp.c usb-common.c bcmxcp_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) blazer_usb_SOURCES = blazer.c blazer_usb.c libusb.c usb-common.c blazer_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm +nutdrv_atcl_usb_SOURCES = nutdrv_atcl_usb.c usb-common.c +nutdrv_atcl_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) richcomm_usb_SOURCES = richcomm_usb.c usb-common.c richcomm_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) riello_usb_SOURCES = riello.c riello_usb.c libusb.c usb-common.c @@ -876,27 +804,11 @@ mge_shut_LDADD = $(LDADD) # SNMP snmp_ups_SOURCES = snmp-ups.c apc-mib.c baytech-mib.c compaq-mib.c eaton-mib.c \ ietf-mib.c mge-mib.c netvision-mib.c powerware-mib.c raritan-pdu-mib.c \ - bestpower-mib.c cyberpower-mib.c delta_ups-mib.c + bestpower-mib.c cyberpower-mib.c delta_ups-mib.c \ + xppc-mib.c snmp_ups_LDADD = $(LDADD_DRIVERS) $(LIBNETSNMP_LIBS) -# HAL -hald_addon_usbhid_ups_SOURCES = usbhid-ups.c libhid.c libusb.c hidparser.c \ - $(USBHID_UPS_SUBDRIVERS) - -hald_addon_usbhid_ups_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -hald_addon_tripplite_usb_SOURCES = tripplite_usb.c libusb.c -hald_addon_tripplite_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm -hald_addon_bcmxcp_usb_SOURCES = bcmxcp_usb.c bcmxcp.c -hald_addon_bcmxcp_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -hald_addon_blazer_usb_SOURCES = blazer.c blazer_usb.c libusb.c -hald_addon_blazer_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm -hald_addon_riello_usb_SOURCES = riello.c riello_usb.c libusb.c -hald_addon_riello_usb_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm -hald_addon_nutdrv_qx_SOURCES = nutdrv_qx.c libusb.c $(NUTDRV_QX_SUBDRIVERS) -hald_addon_nutdrv_qx_LDADD = $(LDADD_HAL_DRIVERS) $(LIBUSB_LIBS) $(LIBHAL_LIBS) -lm -hald_addon_nutdrv_qx_CFLAGS = $(AM_CFLAGS) -DQX_USB - # NEON XML/HTTP netxml_ups_SOURCES = netxml-ups.c mge-xml.c netxml_ups_LDADD = $(LDADD_DRIVERS) $(LIBNEON_LIBS) @@ -906,7 +818,7 @@ powerman_pdu_SOURCES = powerman-pdu.c powerman_pdu_LDADD = $(LDADD) $(LIBPOWERMAN_LIBS) # IPMI PSU -nut_ipmipsu_SOURCES = nut-ipmipsu.c $(am__append_16) +nut_ipmipsu_SOURCES = nut-ipmipsu.c $(am__append_15) nut_ipmipsu_LDADD = $(LDADD) $(LIBIPMI_LIBS) # Mac OS X metadriver @@ -915,14 +827,14 @@ macosx_ups_LDFLAGS = $(LDFLAGS) -framework IOKit -framework CoreFoundation macosx_ups_SOURCES = macosx-ups.c # nutdrv_qx USB/Serial -nutdrv_qx_SOURCES = nutdrv_qx.c $(am__append_20) \ +nutdrv_qx_SOURCES = nutdrv_qx.c $(am__append_19) \ $(NUTDRV_QX_SUBDRIVERS) -nutdrv_qx_LDADD = $(LDADD_DRIVERS) -lm $(am__append_18) \ - $(am__append_21) -nutdrv_qx_CFLAGS = $(AM_CFLAGS) $(am__append_17) $(am__append_19) +nutdrv_qx_LDADD = $(LDADD_DRIVERS) -lm $(am__append_17) \ + $(am__append_20) +nutdrv_qx_CFLAGS = $(AM_CFLAGS) $(am__append_16) $(am__append_18) NUTDRV_QX_SUBDRIVERS = nutdrv_qx_blazer-common.c nutdrv_qx_mecer.c \ nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c nutdrv_qx_mustek.c \ - nutdrv_qx_voltronic.c nutdrv_qx_zinto.c + nutdrv_qx_q1.c nutdrv_qx_voltronic.c nutdrv_qx_voltronic-qs.c nutdrv_qx_zinto.c # ---------------------------------------------------------------------- @@ -931,31 +843,24 @@ NUTDRV_QX_SUBDRIVERS = nutdrv_qx_blazer-common.c nutdrv_qx_mecer.c \ # distributed by "make dist". dist_noinst_HEADERS = apc-mib.h apc-hid.h baytech-mib.h bcmxcp.h \ bcmxcp_io.h belkin.h belkin-hid.h bestpower-mib.h blazer.h cps-hid.h dstate.h \ - dstate-hal.h dummy-ups.h eaton-mib.h explore-hid.h gamatronic.h genericups.h \ + dummy-ups.h eaton-mib.h explore-hid.h gamatronic.h genericups.h \ hidparser.h hidtypes.h ietf-mib.h libhid.h libshut.h libusb.h liebert-hid.h \ - main.h main-hal.h mge-hid.h mge-mib.h mge-shut.h mge-utalk.h \ + main.h mge-hid.h mge-mib.h mge-shut.h mge-utalk.h \ mge-xml.h microdowell.h netvision-mib.h netxml-ups.h nut-ipmi.h oneac.h \ powercom.h powerpanel.h powerp-bin.h powerp-txt.h powerware-mib.h raritan-pdu-mib.h \ safenet.h serial.h snmp-ups.h solis.h tripplite.h tripplite-hid.h \ upshandler.h usb-common.h usbhid-ups.h powercom-hid.h compaq-mib.h idowell-hid.h \ apcsmart.h apcsmart_tabs.h apcsmart-old.h apcupsd-ups.h cyberpower-mib.h riello.h openups-hid.h \ delta_ups-mib.h nutdrv_qx.h nutdrv_qx_blazer-common.h nutdrv_qx_mecer.h \ - nutdrv_qx_megatec.h nutdrv_qx_megatec-old.h nutdrv_qx_mustek.h nutdrv_qx_voltronic.h \ - nutdrv_qx_zinto.h + nutdrv_qx_megatec.h nutdrv_qx_megatec-old.h nutdrv_qx_mustek.h nutdrv_qx_q1.h \ + nutdrv_qx_voltronic.h nutdrv_qx_voltronic-qs.h nutdrv_qx_zinto.h \ + xppc-mib.h # Define a dummy library so that Automake builds rules for the # corresponding object files. This library is not actually built, - -# the nuthalmain library combines the code for main-hal.c and -# dstate-hal.c. It is necessary for Automake-technical reasons, -# because per-object CFLAGS can only be specified for libraries, not -# for object files. This library is used during the build process, -# and is not meant to be installed. -EXTRA_LIBRARIES = libdummy.a libnuthalmain.a +EXTRA_LIBRARIES = libdummy.a libdummy_a_SOURCES = main.c dstate.c serial.c -libnuthalmain_a_SOURCES = main-hal.c dstate-hal.c usb-common.c -MOSTLYCLEANFILES = libnuthalmain.a all: all-am .SUFFIXES: @@ -994,10 +899,6 @@ libdummy.a: $(libdummy_a_OBJECTS) $(libdummy_a_DEPENDENCIES) $(EXTRA_libdummy_a_ -rm -f libdummy.a $(libdummy_a_AR) libdummy.a $(libdummy_a_OBJECTS) $(libdummy_a_LIBADD) $(RANLIB) libdummy.a -libnuthalmain.a: $(libnuthalmain_a_OBJECTS) $(libnuthalmain_a_DEPENDENCIES) $(EXTRA_libnuthalmain_a_DEPENDENCIES) - -rm -f libnuthalmain.a - $(libnuthalmain_a_AR) libnuthalmain.a $(libnuthalmain_a_OBJECTS) $(libnuthalmain_a_LIBADD) - $(RANLIB) libnuthalmain.a install-driverexecPROGRAMS: $(driverexec_PROGRAMS) @$(NORMAL_INSTALL) @list='$(driverexec_PROGRAMS)'; test -n "$(driverexecdir)" || list=; \ @@ -1044,12 +945,12 @@ clean-driverexecPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -install-halexecPROGRAMS: $(halexec_PROGRAMS) +install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) - @list='$(halexec_PROGRAMS)'; test -n "$(halexecdir)" || list=; \ + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(halexecdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(halexecdir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ @@ -1067,23 +968,23 @@ install-halexecPROGRAMS: $(halexec_PROGRAMS) while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(halexecdir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(halexecdir)$$dir" || exit $$?; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done -uninstall-halexecPROGRAMS: +uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(halexec_PROGRAMS)'; test -n "$(halexecdir)" || list=; \ + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(halexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(halexecdir)" && rm -f $$files + echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(sbindir)" && rm -f $$files -clean-halexecPROGRAMS: - @list='$(halexec_PROGRAMS)'; test -n "$$list" || exit 0; \ +clean-sbinPROGRAMS: + @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ @@ -1153,24 +1054,6 @@ gamatronic$(EXEEXT): $(gamatronic_OBJECTS) $(gamatronic_DEPENDENCIES) $(EXTRA_ga genericups$(EXEEXT): $(genericups_OBJECTS) $(genericups_DEPENDENCIES) $(EXTRA_genericups_DEPENDENCIES) @rm -f genericups$(EXEEXT) $(LINK) $(genericups_OBJECTS) $(genericups_LDADD) $(LIBS) -hald-addon-bcmxcp_usb$(EXEEXT): $(hald_addon_bcmxcp_usb_OBJECTS) $(hald_addon_bcmxcp_usb_DEPENDENCIES) $(EXTRA_hald_addon_bcmxcp_usb_DEPENDENCIES) - @rm -f hald-addon-bcmxcp_usb$(EXEEXT) - $(LINK) $(hald_addon_bcmxcp_usb_OBJECTS) $(hald_addon_bcmxcp_usb_LDADD) $(LIBS) -hald-addon-blazer_usb$(EXEEXT): $(hald_addon_blazer_usb_OBJECTS) $(hald_addon_blazer_usb_DEPENDENCIES) $(EXTRA_hald_addon_blazer_usb_DEPENDENCIES) - @rm -f hald-addon-blazer_usb$(EXEEXT) - $(LINK) $(hald_addon_blazer_usb_OBJECTS) $(hald_addon_blazer_usb_LDADD) $(LIBS) -hald-addon-nutdrv_qx$(EXEEXT): $(hald_addon_nutdrv_qx_OBJECTS) $(hald_addon_nutdrv_qx_DEPENDENCIES) $(EXTRA_hald_addon_nutdrv_qx_DEPENDENCIES) - @rm -f hald-addon-nutdrv_qx$(EXEEXT) - $(hald_addon_nutdrv_qx_LINK) $(hald_addon_nutdrv_qx_OBJECTS) $(hald_addon_nutdrv_qx_LDADD) $(LIBS) -hald-addon-riello_usb$(EXEEXT): $(hald_addon_riello_usb_OBJECTS) $(hald_addon_riello_usb_DEPENDENCIES) $(EXTRA_hald_addon_riello_usb_DEPENDENCIES) - @rm -f hald-addon-riello_usb$(EXEEXT) - $(LINK) $(hald_addon_riello_usb_OBJECTS) $(hald_addon_riello_usb_LDADD) $(LIBS) -hald-addon-tripplite_usb$(EXEEXT): $(hald_addon_tripplite_usb_OBJECTS) $(hald_addon_tripplite_usb_DEPENDENCIES) $(EXTRA_hald_addon_tripplite_usb_DEPENDENCIES) - @rm -f hald-addon-tripplite_usb$(EXEEXT) - $(LINK) $(hald_addon_tripplite_usb_OBJECTS) $(hald_addon_tripplite_usb_LDADD) $(LIBS) -hald-addon-usbhid-ups$(EXEEXT): $(hald_addon_usbhid_ups_OBJECTS) $(hald_addon_usbhid_ups_DEPENDENCIES) $(EXTRA_hald_addon_usbhid_ups_DEPENDENCIES) - @rm -f hald-addon-usbhid-ups$(EXEEXT) - $(LINK) $(hald_addon_usbhid_ups_OBJECTS) $(hald_addon_usbhid_ups_LDADD) $(LIBS) isbmex$(EXEEXT): $(isbmex_OBJECTS) $(isbmex_DEPENDENCIES) $(EXTRA_isbmex_DEPENDENCIES) @rm -f isbmex$(EXEEXT) $(LINK) $(isbmex_OBJECTS) $(isbmex_LDADD) $(LIBS) @@ -1207,6 +1090,9 @@ netxml-ups$(EXEEXT): $(netxml_ups_OBJECTS) $(netxml_ups_DEPENDENCIES) $(EXTRA_ne nut-ipmipsu$(EXEEXT): $(nut_ipmipsu_OBJECTS) $(nut_ipmipsu_DEPENDENCIES) $(EXTRA_nut_ipmipsu_DEPENDENCIES) @rm -f nut-ipmipsu$(EXEEXT) $(LINK) $(nut_ipmipsu_OBJECTS) $(nut_ipmipsu_LDADD) $(LIBS) +nutdrv_atcl_usb$(EXEEXT): $(nutdrv_atcl_usb_OBJECTS) $(nutdrv_atcl_usb_DEPENDENCIES) $(EXTRA_nutdrv_atcl_usb_DEPENDENCIES) + @rm -f nutdrv_atcl_usb$(EXEEXT) + $(LINK) $(nutdrv_atcl_usb_OBJECTS) $(nutdrv_atcl_usb_LDADD) $(LIBS) nutdrv_qx$(EXEEXT): $(nutdrv_qx_OBJECTS) $(nutdrv_qx_DEPENDENCIES) $(EXTRA_nutdrv_qx_DEPENDENCIES) @rm -f nutdrv_qx$(EXEEXT) $(nutdrv_qx_LINK) $(nutdrv_qx_OBJECTS) $(nutdrv_qx_LDADD) $(LIBS) @@ -1308,7 +1194,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cps-hid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cyberpower-mib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delta_ups-mib.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dstate-hal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dstate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_ups-dummy-ups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaton-mib.Po@am__quote@ @@ -1317,15 +1202,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explore-hid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamatronic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genericups.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-libusb.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mecer.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mustek.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_voltronic.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_zinto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hidparser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idowell-hid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ietf-mib.Po@am__quote@ @@ -1337,7 +1213,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liebert-hid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liebert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macosx-ups.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-hal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/masterguard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metasys.Po@am__quote@ @@ -1356,6 +1231,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netxml-ups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nut-ipmipsu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nut-libfreeipmi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_atcl_usb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-libusb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Po@am__quote@ @@ -1363,6 +1239,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-usb-common.Po@am__quote@ @@ -1396,6 +1274,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usb-common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usbhid-ups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/victronups.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xppc-mib.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -1446,132 +1325,6 @@ dummy_ups-dummy-ups.obj: dummy-ups.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -c -o dummy_ups-dummy-ups.obj `if test -f 'dummy-ups.c'; then $(CYGPATH_W) 'dummy-ups.c'; else $(CYGPATH_W) '$(srcdir)/dummy-ups.c'; fi` -hald_addon_nutdrv_qx-nutdrv_qx.o: nutdrv_qx.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx.o `test -f 'nutdrv_qx.c' || echo '$(srcdir)/'`nutdrv_qx.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx.c' object='hald_addon_nutdrv_qx-nutdrv_qx.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx.o `test -f 'nutdrv_qx.c' || echo '$(srcdir)/'`nutdrv_qx.c - -hald_addon_nutdrv_qx-nutdrv_qx.obj: nutdrv_qx.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx.obj `if test -f 'nutdrv_qx.c'; then $(CYGPATH_W) 'nutdrv_qx.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx.c' object='hald_addon_nutdrv_qx-nutdrv_qx.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx.obj `if test -f 'nutdrv_qx.c'; then $(CYGPATH_W) 'nutdrv_qx.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx.c'; fi` - -hald_addon_nutdrv_qx-libusb.o: libusb.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-libusb.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-libusb.Tpo -c -o hald_addon_nutdrv_qx-libusb.o `test -f 'libusb.c' || echo '$(srcdir)/'`libusb.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-libusb.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-libusb.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libusb.c' object='hald_addon_nutdrv_qx-libusb.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-libusb.o `test -f 'libusb.c' || echo '$(srcdir)/'`libusb.c - -hald_addon_nutdrv_qx-libusb.obj: libusb.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-libusb.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-libusb.Tpo -c -o hald_addon_nutdrv_qx-libusb.obj `if test -f 'libusb.c'; then $(CYGPATH_W) 'libusb.c'; else $(CYGPATH_W) '$(srcdir)/libusb.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-libusb.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-libusb.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libusb.c' object='hald_addon_nutdrv_qx-libusb.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-libusb.obj `if test -f 'libusb.c'; then $(CYGPATH_W) 'libusb.c'; else $(CYGPATH_W) '$(srcdir)/libusb.c'; fi` - -hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.o: nutdrv_qx_blazer-common.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.o `test -f 'nutdrv_qx_blazer-common.c' || echo '$(srcdir)/'`nutdrv_qx_blazer-common.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_blazer-common.c' object='hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.o `test -f 'nutdrv_qx_blazer-common.c' || echo '$(srcdir)/'`nutdrv_qx_blazer-common.c - -hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.obj: nutdrv_qx_blazer-common.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.obj `if test -f 'nutdrv_qx_blazer-common.c'; then $(CYGPATH_W) 'nutdrv_qx_blazer-common.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_blazer-common.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_blazer-common.c' object='hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_blazer-common.obj `if test -f 'nutdrv_qx_blazer-common.c'; then $(CYGPATH_W) 'nutdrv_qx_blazer-common.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_blazer-common.c'; fi` - -hald_addon_nutdrv_qx-nutdrv_qx_mecer.o: nutdrv_qx_mecer.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_mecer.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mecer.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_mecer.o `test -f 'nutdrv_qx_mecer.c' || echo '$(srcdir)/'`nutdrv_qx_mecer.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mecer.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mecer.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mecer.c' object='hald_addon_nutdrv_qx-nutdrv_qx_mecer.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_mecer.o `test -f 'nutdrv_qx_mecer.c' || echo '$(srcdir)/'`nutdrv_qx_mecer.c - -hald_addon_nutdrv_qx-nutdrv_qx_mecer.obj: nutdrv_qx_mecer.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_mecer.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mecer.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_mecer.obj `if test -f 'nutdrv_qx_mecer.c'; then $(CYGPATH_W) 'nutdrv_qx_mecer.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mecer.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mecer.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mecer.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mecer.c' object='hald_addon_nutdrv_qx-nutdrv_qx_mecer.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_mecer.obj `if test -f 'nutdrv_qx_mecer.c'; then $(CYGPATH_W) 'nutdrv_qx_mecer.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mecer.c'; fi` - -hald_addon_nutdrv_qx-nutdrv_qx_megatec.o: nutdrv_qx_megatec.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_megatec.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec.o `test -f 'nutdrv_qx_megatec.c' || echo '$(srcdir)/'`nutdrv_qx_megatec.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec.c' object='hald_addon_nutdrv_qx-nutdrv_qx_megatec.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec.o `test -f 'nutdrv_qx_megatec.c' || echo '$(srcdir)/'`nutdrv_qx_megatec.c - -hald_addon_nutdrv_qx-nutdrv_qx_megatec.obj: nutdrv_qx_megatec.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_megatec.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec.obj `if test -f 'nutdrv_qx_megatec.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec.c' object='hald_addon_nutdrv_qx-nutdrv_qx_megatec.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec.obj `if test -f 'nutdrv_qx_megatec.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec.c'; fi` - -hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.o: nutdrv_qx_megatec-old.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.o `test -f 'nutdrv_qx_megatec-old.c' || echo '$(srcdir)/'`nutdrv_qx_megatec-old.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec-old.c' object='hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.o `test -f 'nutdrv_qx_megatec-old.c' || echo '$(srcdir)/'`nutdrv_qx_megatec-old.c - -hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.obj: nutdrv_qx_megatec-old.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.obj `if test -f 'nutdrv_qx_megatec-old.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec-old.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec-old.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec-old.c' object='hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_megatec-old.obj `if test -f 'nutdrv_qx_megatec-old.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec-old.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec-old.c'; fi` - -hald_addon_nutdrv_qx-nutdrv_qx_mustek.o: nutdrv_qx_mustek.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_mustek.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mustek.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_mustek.o `test -f 'nutdrv_qx_mustek.c' || echo '$(srcdir)/'`nutdrv_qx_mustek.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mustek.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mustek.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mustek.c' object='hald_addon_nutdrv_qx-nutdrv_qx_mustek.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_mustek.o `test -f 'nutdrv_qx_mustek.c' || echo '$(srcdir)/'`nutdrv_qx_mustek.c - -hald_addon_nutdrv_qx-nutdrv_qx_mustek.obj: nutdrv_qx_mustek.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_mustek.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mustek.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_mustek.obj `if test -f 'nutdrv_qx_mustek.c'; then $(CYGPATH_W) 'nutdrv_qx_mustek.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mustek.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mustek.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_mustek.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mustek.c' object='hald_addon_nutdrv_qx-nutdrv_qx_mustek.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_mustek.obj `if test -f 'nutdrv_qx_mustek.c'; then $(CYGPATH_W) 'nutdrv_qx_mustek.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mustek.c'; fi` - -hald_addon_nutdrv_qx-nutdrv_qx_voltronic.o: nutdrv_qx_voltronic.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_voltronic.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_voltronic.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_voltronic.o `test -f 'nutdrv_qx_voltronic.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_voltronic.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_voltronic.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic.c' object='hald_addon_nutdrv_qx-nutdrv_qx_voltronic.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_voltronic.o `test -f 'nutdrv_qx_voltronic.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic.c - -hald_addon_nutdrv_qx-nutdrv_qx_voltronic.obj: nutdrv_qx_voltronic.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_voltronic.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_voltronic.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_voltronic.obj `if test -f 'nutdrv_qx_voltronic.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_voltronic.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_voltronic.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic.c' object='hald_addon_nutdrv_qx-nutdrv_qx_voltronic.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_voltronic.obj `if test -f 'nutdrv_qx_voltronic.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic.c'; fi` - -hald_addon_nutdrv_qx-nutdrv_qx_zinto.o: nutdrv_qx_zinto.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_zinto.o -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_zinto.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_zinto.o `test -f 'nutdrv_qx_zinto.c' || echo '$(srcdir)/'`nutdrv_qx_zinto.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_zinto.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_zinto.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_zinto.c' object='hald_addon_nutdrv_qx-nutdrv_qx_zinto.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_zinto.o `test -f 'nutdrv_qx_zinto.c' || echo '$(srcdir)/'`nutdrv_qx_zinto.c - -hald_addon_nutdrv_qx-nutdrv_qx_zinto.obj: nutdrv_qx_zinto.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -MT hald_addon_nutdrv_qx-nutdrv_qx_zinto.obj -MD -MP -MF $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_zinto.Tpo -c -o hald_addon_nutdrv_qx-nutdrv_qx_zinto.obj `if test -f 'nutdrv_qx_zinto.c'; then $(CYGPATH_W) 'nutdrv_qx_zinto.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_zinto.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_zinto.Tpo $(DEPDIR)/hald_addon_nutdrv_qx-nutdrv_qx_zinto.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_zinto.c' object='hald_addon_nutdrv_qx-nutdrv_qx_zinto.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hald_addon_nutdrv_qx_CFLAGS) $(CFLAGS) -c -o hald_addon_nutdrv_qx-nutdrv_qx_zinto.obj `if test -f 'nutdrv_qx_zinto.c'; then $(CYGPATH_W) 'nutdrv_qx_zinto.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_zinto.c'; fi` - mge_shut-usbhid-ups.o: usbhid-ups.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-usbhid-ups.o -MD -MP -MF $(DEPDIR)/mge_shut-usbhid-ups.Tpo -c -o mge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-usbhid-ups.Tpo $(DEPDIR)/mge_shut-usbhid-ups.Po @@ -1754,6 +1507,20 @@ nutdrv_qx-nutdrv_qx_mustek.obj: nutdrv_qx_mustek.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mustek.obj `if test -f 'nutdrv_qx_mustek.c'; then $(CYGPATH_W) 'nutdrv_qx_mustek.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mustek.c'; fi` +nutdrv_qx-nutdrv_qx_q1.o: nutdrv_qx_q1.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_q1.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo -c -o nutdrv_qx-nutdrv_qx_q1.o `test -f 'nutdrv_qx_q1.c' || echo '$(srcdir)/'`nutdrv_qx_q1.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_q1.c' object='nutdrv_qx-nutdrv_qx_q1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_q1.o `test -f 'nutdrv_qx_q1.c' || echo '$(srcdir)/'`nutdrv_qx_q1.c + +nutdrv_qx-nutdrv_qx_q1.obj: nutdrv_qx_q1.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_q1.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo -c -o nutdrv_qx-nutdrv_qx_q1.obj `if test -f 'nutdrv_qx_q1.c'; then $(CYGPATH_W) 'nutdrv_qx_q1.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_q1.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_q1.c' object='nutdrv_qx-nutdrv_qx_q1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_q1.obj `if test -f 'nutdrv_qx_q1.c'; then $(CYGPATH_W) 'nutdrv_qx_q1.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_q1.c'; fi` + nutdrv_qx-nutdrv_qx_voltronic.o: nutdrv_qx_voltronic.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic.o `test -f 'nutdrv_qx_voltronic.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Po @@ -1768,6 +1535,20 @@ nutdrv_qx-nutdrv_qx_voltronic.obj: nutdrv_qx_voltronic.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic.obj `if test -f 'nutdrv_qx_voltronic.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic.c'; fi` +nutdrv_qx-nutdrv_qx_voltronic-qs.o: nutdrv_qx_voltronic-qs.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.o `test -f 'nutdrv_qx_voltronic-qs.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic-qs.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.o `test -f 'nutdrv_qx_voltronic-qs.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs.c + +nutdrv_qx-nutdrv_qx_voltronic-qs.obj: nutdrv_qx_voltronic-qs.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.obj `if test -f 'nutdrv_qx_voltronic-qs.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic-qs.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.obj `if test -f 'nutdrv_qx_voltronic-qs.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs.c'; fi` + nutdrv_qx-nutdrv_qx_zinto.o: nutdrv_qx_zinto.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_zinto.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo -c -o nutdrv_qx-nutdrv_qx_zinto.o `test -f 'nutdrv_qx_zinto.c' || echo '$(srcdir)/'`nutdrv_qx_zinto.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Po @@ -1874,7 +1655,7 @@ check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: - for dir in "$(DESTDIR)$(driverexecdir)" "$(DESTDIR)$(halexecdir)"; do \ + for dir in "$(DESTDIR)$(driverexecdir)" "$(DESTDIR)$(sbindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -1897,7 +1678,6 @@ install-strip: "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: - -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: @@ -1910,8 +1690,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-driverexecPROGRAMS clean-generic clean-halexecPROGRAMS \ - clean-libtool mostlyclean-am +clean-am: clean-driverexecPROGRAMS clean-generic clean-libtool \ + clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -1937,7 +1717,7 @@ install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-driverexecPROGRAMS install-halexecPROGRAMS +install-exec-am: install-driverexecPROGRAMS install-sbinPROGRAMS install-html: install-html-am @@ -1977,25 +1757,25 @@ ps: ps-am ps-am: -uninstall-am: uninstall-driverexecPROGRAMS uninstall-halexecPROGRAMS +uninstall-am: uninstall-driverexecPROGRAMS uninstall-sbinPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean \ - clean-driverexecPROGRAMS clean-generic clean-halexecPROGRAMS \ - clean-libtool ctags distclean distclean-compile \ + clean-driverexecPROGRAMS clean-generic clean-libtool \ + clean-sbinPROGRAMS ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-driverexecPROGRAMS \ install-dvi install-dvi-am install-exec install-exec-am \ - install-halexecPROGRAMS install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-sbinPROGRAMS install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-driverexecPROGRAMS \ - uninstall-halexecPROGRAMS + uninstall-sbinPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/drivers/al175.c b/drivers/al175.c index 4b4b652..7d0b02e 100644 --- a/drivers/al175.c +++ b/drivers/al175.c @@ -53,7 +53,7 @@ typedef uint8_t byte_t; #define DRIVER_NAME "Eltek AL175/COMLI driver" -#define DRIVER_VERSION "0.11" +#define DRIVER_VERSION "0.12" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -462,7 +462,7 @@ static int al_parse_reply_head(io_head_t *io, const raw_data_t raw_reply_head) const byte_t *reply_head = raw_reply_head.begin - 1; if ( (raw_reply_head.end - raw_reply_head.begin) != 10) { - upsdebugx(3, "%s: wrong size\t(%i != 10)", __func__, (raw_reply_head.end - raw_reply_head.begin)); + upsdebugx(3, "%s: wrong size\t(%i != 10)", __func__, (int)(raw_reply_head.end - raw_reply_head.begin)); return -1; /* wrong size */ } @@ -549,7 +549,7 @@ static int al_parse_reply(io_head_t *io_head, raw_data_t *io_buf, /*const*/ raw_ if ( (raw_reply.end - raw_reply.begin) != (ptrdiff_t)(10 + io_head->len)) { upsdebugx(3, "%s: corrupt sentence\t(%i != %i)", - __func__, raw_reply.end - raw_reply.begin, 10 + io_head->len); + __func__, (int)(raw_reply.end - raw_reply.begin), 10 + io_head->len); return -1; /* corrupt sentence */ } @@ -597,7 +597,7 @@ static int al_check_ack(/*const*/ raw_data_t raw_ack) const byte_t *ack = raw_ack.begin - 1; if ( (raw_ack.end - raw_ack.begin) !=5) { - upsdebugx(3, "%s: wrong size\t(%i != 5)", __func__, raw_ack.end - raw_ack.begin); + upsdebugx(3, "%s: wrong size\t(%i != 5)", __func__, (int)(raw_ack.end - raw_ack.begin)); return -1; /* wrong size */ } @@ -965,7 +965,8 @@ static int al175_read(byte_t *dst, unsigned addr, size_t count) if ( (io.addr != addr) || (io.len != count) ) { upsdebugx(3, "%s: io_head mismatch\t(%x,%x != %x,%x)", - __func__, io.addr, io.len, addr, count); + __func__, io.addr, io.len, addr, + (unsigned int)count); return -1; } diff --git a/drivers/apc-mib.c b/drivers/apc-mib.c index 8851a6f..b52ad1f 100644 --- a/drivers/apc-mib.c +++ b/drivers/apc-mib.c @@ -72,7 +72,7 @@ static info_lkp_t apcc_pwr_info[] = { { 1, "" }, /* unknown */ { 2, "OL" }, /* onLine */ { 3, "OB" }, /* onBattery */ - { 4, "BOOST" }, /* onSmartBoost */ + { 4, "OL BOOST" }, /* onSmartBoost */ { 5, "OFF" }, /* timedSleeping */ { 6, "OFF" }, /* softwareBypass */ { 7, "OFF" }, /* off */ @@ -80,7 +80,7 @@ static info_lkp_t apcc_pwr_info[] = { { 9, "BYPASS" }, /* switchedBypass */ { 10, "BYPASS" }, /* hardwareFailureBypass */ { 11, "OFF" }, /* sleepingUntilPowerReturn */ - { 12, "TRIM" }, /* onSmartTrim */ + { 12, "OL TRIM" }, /* onSmartTrim */ { 0, "NULL" } } ; diff --git a/drivers/belkin-hid.c b/drivers/belkin-hid.c index e95b17a..212d6f3 100644 --- a/drivers/belkin-hid.c +++ b/drivers/belkin-hid.c @@ -3,7 +3,7 @@ * Copyright (C) * 2003 - 2008 Arnaud Quette * 2005 Peter Selinger - * 2011 Charles Lepple + * 2011, 2014 Charles Lepple * * Sponsored by MGE UPS SYSTEMS * @@ -29,7 +29,7 @@ #include "belkin-hid.h" #include "usb-common.h" -#define BELKIN_HID_VERSION "Belkin HID 0.15" +#define BELKIN_HID_VERSION "Belkin HID 0.16" /* Belkin */ #define BELKIN_VENDORID 0x050d @@ -65,6 +65,8 @@ static usb_device_id_t belkin_usb_device_table[] = { /* Liebert PowerSure PSA UPS */ { USB_DEVICE(LIEBERT_VENDORID, 0x0001), NULL }, + /* Liebert PowerSure PSI 1440 */ + { USB_DEVICE(LIEBERT_VENDORID, 0x0004), NULL }, /* Terminating entry */ { -1, -1, NULL } diff --git a/drivers/blazer_ser.c b/drivers/blazer_ser.c index 5c75726..7fa7280 100644 --- a/drivers/blazer_ser.c +++ b/drivers/blazer_ser.c @@ -100,7 +100,7 @@ int blazer_command(const char *cmd, char *buf, size_t buflen) void upsdrv_help(void) { - printf("Read The Fine Manual ('man 8 blazer')\n"); + printf("Read The Fine Manual ('man 8 blazer_ser')\n"); } diff --git a/drivers/blazer_usb.c b/drivers/blazer_usb.c index e3ef3fc..7ba4df2 100644 --- a/drivers/blazer_usb.c +++ b/drivers/blazer_usb.c @@ -28,7 +28,7 @@ #include "blazer.h" #define DRIVER_NAME "Megatec/Q1 protocol USB driver" -#define DRIVER_VERSION "0.10" +#define DRIVER_VERSION "0.11" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -176,7 +176,7 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) static int ippon_command(const char *cmd, char *buf, size_t buflen) { char tmp[64]; - int ret; + int ret, len; size_t i; snprintf(tmp, sizeof(tmp), "%s", cmd); @@ -207,10 +207,19 @@ static int ippon_command(const char *cmd, char *buf, size_t buflen) return ret; } - snprintf(buf, buflen, "%.*s", ret, tmp); - - upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); - return ret; + /* + * As Ippon will always return 64 bytes in response, we have to + * calculate and return length of actual response data here. + * Empty response will look like 0x00 0x0D, otherwise it will be + * data string terminated by 0x0D. + */ + len = (int)strcspn(tmp, "\r"); + upsdebugx(3, "read: %.*s", len, tmp); + if (len > 0) { + len ++; + } + snprintf(buf, buflen, "%.*s", len, tmp); + return len; } @@ -443,7 +452,9 @@ int blazer_command(const char *cmd, char *buf, size_t buflen) case -ETIMEDOUT: /* Connection timed out */ case -EOVERFLOW: /* Value too large for defined data type */ +#ifdef EPROTO case -EPROTO: /* Protocol error */ +#endif default: break; } @@ -480,7 +491,7 @@ int blazer_command(const char *cmd, char *buf, size_t buflen) void upsdrv_help(void) { - printf("Read The Fine Manual ('man 8 blazer')\n"); + printf("Read The Fine Manual ('man 8 blazer_usb')\n"); } @@ -585,7 +596,7 @@ void upsdrv_initups(void) "and make sure you have an up-to-date version of NUT. If this does not help,\n" "try running the driver with at least 'subdriver', 'vendorid' and 'productid'\n" "options specified. Please refer to the man page for details about these options\n" - "(man 8 blazer).\n"); + "(man 8 blazer_usb).\n"); } if (!subdriver_command) { diff --git a/drivers/compaq-mib.c b/drivers/compaq-mib.c index febb9c0..fc9fdd9 100644 --- a/drivers/compaq-mib.c +++ b/drivers/compaq-mib.c @@ -30,7 +30,7 @@ #include "compaq-mib.h" -#define CPQPOWER_MIB_VERSION "1.5" +#define CPQPOWER_MIB_VERSION "1.6" #define DEFAULT_ONDELAY 30 #define DEFAULT_OFFDELAY 20 @@ -188,9 +188,10 @@ static snmp_info_t cpqpower_mib[] = { { "ups.L3.realpower", 0, 0.1, CPQPOWER_OID_OUT_POWER ".3", "", SU_OUTPUT_3, NULL }, { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, CPQPOWER_OID_POWER_STATUS, "OFF", SU_STATUS_PWR, cpqpower_pwr_info }, { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, CPQPOWER_OID_BATT_STATUS, "", SU_STATUS_PWR, cpqpower_battery_abm_status }, - { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, CPQPOWER_OID_ALARM_OB, "", SU_STATUS_BATT, cpqpower_alarm_ob }, - { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, CPQPOWER_OID_ALARM_LB, "", SU_STATUS_BATT, cpqpower_alarm_lb }, -/* { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, IETF_OID_BATT_STATUS, "", SU_STATUS_BATT, ietf_batt_info }, */ + /* The next two lines are no longer supported by MIB ver. 1.76 (Github issue 118) + * { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, CPQPOWER_OID_ALARM_OB, "", SU_STATUS_BATT, cpqpower_alarm_ob }, + * { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, CPQPOWER_OID_ALARM_LB, "", SU_STATUS_BATT, cpqpower_alarm_lb }, */ + /* { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, IETF_OID_BATT_STATUS, "", SU_STATUS_BATT, ietf_batt_info }, */ /* FIXME: this should use either .1.3.6.1.4.1.232.165.3.11.1.0 (upsTopologyType) * or .1.3.6.1.4.1.232.165.3.11.2.0 (upsTopoMachineCode) */ { "ups.type", ST_FLAG_STRING, SU_INFOSIZE, CPQPOWER_OID_POWER_STATUS, "", SU_STATUS_PWR, cpqpower_mode_info }, diff --git a/drivers/dstate-hal.c b/drivers/dstate-hal.c deleted file mode 100644 index 6728f0f..0000000 --- a/drivers/dstate-hal.c +++ /dev/null @@ -1,710 +0,0 @@ -/* dstate-hal.c - Network UPS Tools driver-side state management - This is a compatibility interface that encapsulate the HAL bridge - into the NUT dstate API for NUT drivers - - Copyright (C) 2006-2007 Arnaud Quette - - 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. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "config.h" -#include "dstate-hal.h" -#include "extstate.h" -/* #include "state.h" -#include "parseconf.h" */ - -#include - -/* FIXME: export command and RW variables (using the HAL example: addon-cpufreq and macbook addon) */ -/* beeper.enable, beeper.disable => SetBeeper(bool) - beeper.toggle => ToggleBeeper(void) - -org.freedesktop.Hal.Device.UPS.SetSounder (bool) - - -Shutdown() or ShutOff() - shutdown.return - shutdown.stayoff - shutdown.reboot - shutdown.reboot.graceful - -#define UPS_ERROR_GENERAL "GeneralError" -#define UPS_ERROR_UNSUPPORTED_FEATURE "FeatureNotSupported" -#define UPS_ERROR_PERMISSION_DENIED "PermissionDenied" - -****** implementation ******* - -#define DBUS_INTERFACE "org.freedesktop.Hal.Device.UPS" - -if (!libhal_device_claim_interface(halctx, udi, DBUS_INTERFACE, - - " \n" - " \n" - " \n" - " \n" - - &dbus_dbus_error)) { - fprintf(stderr, "Cannot claim interface: %s", dbus_dbus_error.message); - goto Error; - } - - -*/ - -/* - * static int sockfd = -1, stale = 1, alarm_active = 0; - * static struct st_tree_t *dtree_root = NULL; - * static struct conn_t *connhead = NULL; - * static struct cmdlist_t *cmdhead = NULL; - * static char *sockfn = NULL; - * static char status_buf[ST_MAX_VALUE_LEN], - * alarm_buf[ST_MAX_VALUE_LEN]; - */ - -struct ups_handler upsh; - -LibHalContext *halctx = NULL; -char *udi; -int ac_present = 0; /* 0 = false ; 1 = true */ -extern char *dbus_methods_introspection; - -static void* runtime_handler(LibHalChangeSet *cs, char* runtime); -static void* level_handler(LibHalChangeSet *cs, char* critical_level); -static void* battery_type_handler(LibHalChangeSet *cs, char* battery_type); - -/* Structure to lookup between NUT and HAL data */ -typedef struct { - const char *nut_name; /* NUT variable name */ - const char *hal_name; /* HAL variable name */ - int hal_type; /* HAL variable type */ - void *(*fun)(LibHalChangeSet *cs, - char *value); /* conversion function. */ -} info_lkp_t; - -enum hal_type_t -{ - NONE = 0, - HAL_TYPE_INT, - HAL_TYPE_BOOL, - HAL_TYPE_STRING -}; - -/* Structure to lookup between NUT commands and HAL/DBus methods */ -typedef struct { - char *nut_name; /* NUT command name */ - char *hal_name; /* HAL/DBus method name */ - char *xml_introspection; /* HAL/DBus method introspection */ -/* FIXME: how to lookup param values between HAL and NUT?? */ -/* void *(*fun)(LibHalChangeSet *cs, - char *value);*/ /* NUT function */ -} method_lkp_t; - -#if 0 -/* Data to lookup between NUT commands and HAL/DBus methods - * for dstate_addcmd() */ -static method_lkp_t nut2hal_cmd[] = -{ - /* ups.status is handled by status_set() calls */ - { - "beeper.enable", - "SetBeeper", - " \n" - " \n" - " \n" - " \n" - }, - - /* Terminating element */ - { NULL, NULL, NULL } -}; -#endif - -/* Data to lookup between NUT and HAL for dstate_setinfo() */ -static info_lkp_t nut2hal_info[] = -{ - /* ups.status is handled by status_set() calls */ - { "battery.charge.low", "battery.charge_level.low", HAL_TYPE_INT, *level_handler }, - /* { "battery.charge.low", "battery.reporting.low", HAL_TYPE_INT, NULL }, */ - { "battery.charge.low", "battery.alarm.design", HAL_TYPE_INT, NULL }, - - { "battery.charge", "battery.charge_level.current", HAL_TYPE_INT, NULL }, - { "battery.charge", "battery.charge_level.percentage", HAL_TYPE_INT, NULL }, - { "battery.charge", "battery.reporting.current", HAL_TYPE_INT, NULL }, - { "battery.charge", "battery.reporting.percentage", HAL_TYPE_INT, NULL }, - { "battery.runtime", "battery.remaining_time", HAL_TYPE_INT, *runtime_handler }, - /* raw version (PbAc) */ - { "battery.type", "battery.reporting.technology", HAL_TYPE_STRING, NULL }, - /* Human readable version */ - { "battery.type", "battery.technology", HAL_TYPE_STRING, *battery_type_handler }, - - /* AQ note: Not sure it fits! */ - /* HAL marked as mandatory! */ - { "battery.voltage", "battery.voltage.current", HAL_TYPE_INT, NULL }, - { "battery.voltage.nominal", "battery.voltage.design", HAL_TYPE_INT, NULL }, - - { "ups.mfr", "battery.vendor", HAL_TYPE_STRING, NULL }, - { "ups.model", "battery.model", HAL_TYPE_STRING, NULL }, - { "ups.serial", "battery.serial", HAL_TYPE_STRING, NULL }, - - /* Terminating element */ - { NULL, NULL, NONE, NULL } -}; - -/* Functions to lookup between NUT and HAL */ -static info_lkp_t *find_nut_info(const char *nut_varname, info_lkp_t *prev_info_item); - -/* HAL accessors wrappers */ -void hal_set_string(LibHalChangeSet *cs, const char *key, const char *value); -void hal_set_int(LibHalChangeSet *cs, const char *key, const int value); -void hal_set_bool(LibHalChangeSet *cs, const char *key, const dbus_bool_t value); -int hal_get_int(const char *key); -char *hal_get_string(const char *key); - -/* Handle warning charge level according to the critical level */ -static void* level_handler(LibHalChangeSet *cs, char* critical_level) -{ - /* Magic formula to generate the warning level */ - int int_critical_level = atoi(critical_level); - /* warning level = critical + 1/3 of (100 % - critical level), approx at the leat mod 10 */ - int int_warning_level = int_critical_level + ((100 - int_critical_level) / 3); - int_warning_level -= (int_warning_level % 10); - - /* Set the critical level value */ - hal_set_int (cs, "battery.charge_level.low", int_critical_level); - hal_set_int (cs, "battery.reporting.low", int_critical_level); - - /* Set the warning level value (FIXME: set to 50 % for now) */ - hal_set_int (cs, "battery.charge_level.warning", int_warning_level); - hal_set_int (cs, "battery.reporting.warning", int_warning_level); - - return NULL; /* Nothing to return */ -} - -/* Handle runtime exposition according to the AC status */ -static void* runtime_handler(LibHalChangeSet *cs, char* runtime) -{ - if (ac_present == 0) { - /* unSet the runtime auto computation and rely upon NUT.battery.runtime*/ - hal_set_bool (cs, "battery.remaining_time.calculate_per_time", FALSE); - - /* Set the runtime value */ - hal_set_int (cs, "battery.remaining_time", atoi(runtime)); - } - else { - /* Set the runtime auto computation */ - hal_set_bool (cs, "battery.remaining_time.calculate_per_time", TRUE); - - /* Set the runtime value */ - hal_set_int (cs, "battery.remaining_time", 0); - } - return NULL; /* Nothing to return */ -} - -/* Handle the battery technology reporting */ -static void* battery_type_handler(LibHalChangeSet *cs, char* battery_type) -{ - if (!strncmp (battery_type, "PbAc", 4)) { - hal_set_string(cs, "battery.technology", "lead-acid"); - } - /* FIXME: manage other types (lithium-ion, lithium-polymer, - * nickel-metal-hydride, unknown */ - - return NULL; /* Nothing to return */ -} - -/******************************************************************** - * dstate compatibility interface - *******************************************************************/ -void dstate_init(const char *prog, const char *port) -{ - DBusError dbus_error; - LibHalChangeSet *cs; - - dbus_error_init (&dbus_error); - - cs = libhal_device_new_changeset (udi); - if (cs == NULL) { - fatalx (EXIT_FAILURE, "Cannot initialize changeset"); - } - - /* UPS always report charge as percent */ - hal_set_string (cs, "battery.charge_level.unit", "percent"); - hal_set_string (cs, "battery.reporting.unit", "percent"); - hal_set_string (cs, "battery.alarm.unit", "percent"); - - /* Various UPSs assumptions */ - /****************************/ - /* UPS are always rechargeable! */ - /* FIXME: Check for NUT extension however: ie HID->UPS.PowerSummary.Rechargeable - * into battery.rechargeable - * or always expose it? - */ - hal_set_bool (cs, "battery.is_rechargeable", TRUE); - - /* UPS always has a max battery charge of 100 % */ - hal_set_int (cs, "battery.charge_level.design", 100); - hal_set_int (cs, "battery.charge_level.last_full", 100); - hal_set_int (cs, "battery.reporting.design", 100); - hal_set_int (cs, "battery.reporting.last_full", 100); - - /* NUT always express Voltage in Volts "V" */ - /* But not all UPSs provide the data - * battery.voltage.{design,current} */ - hal_set_string (cs, "battery.voltage.unit", "V"); - - /* UPS always have a battery! */ - /* Note(AQU): wrong with some solar panel usage, where the UPS */ - /* is just an energy source switch! */ - /* FIXME: to be processed (need possible NUT extension) */ - hal_set_bool (cs, "battery.present", TRUE); - - /* FIXME: can be improved?! (implies "info.recall.vendor") */ - hal_set_bool (cs, "info.is_recalled", FALSE); - - /* Set generic properties */ - hal_set_string (cs, "battery.type", "ups"); - libhal_device_add_capability (halctx, udi, "battery", &dbus_error); - libhal_device_add_capability (halctx, udi, "ac_adaptor", &dbus_error); - - /* FIXME: can be improved?! Set granularity (1 %)*/ - hal_set_int (cs, "battery.charge_level.granularity_1", 1); - hal_set_int (cs, "battery.charge_level.granularity_2", 1); - hal_set_int (cs, "battery.reporting.granularity_1", 1); - hal_set_int (cs, "battery.reporting.granularity_2", 1); - - dbus_error_init (&dbus_error); - /* NOTE: commit_changeset won't do IPC if set is empty */ - libhal_device_commit_changeset (halctx, cs, &dbus_error); - libhal_device_free_changeset (cs); - - if (dbus_error_is_set (&dbus_error)) - dbus_error_free (&dbus_error); -} - - -const char *dstate_getinfo(const char *var) -{ - info_lkp_t *nut2hal_info = find_nut_info(var, NULL); - -/* FIXME: use the data exposed by NUT on the DBus when available */ - - if (nut2hal_info != NULL) { - - switch (nut2hal_info->hal_type) - { -/* case HAL_TYPE_INT: - static char value[8]; - snprintf(value, sizeof(value), "%i", hal_get_int(nut2hal_info->hal_name)); - return value; - case HAL_TYPE_BOOL: - hal_set_bool(cs, nut2hal_info->hal_name, TRUE); - break; -*/ - case HAL_TYPE_STRING: - return hal_get_string(nut2hal_info->hal_name); - } - } - return NULL; -} - -int dstate_setinfo(const char *var, const char *fmt, ...) -{ - va_list ap; - int ret = 1; - LibHalChangeSet *cs; - DBusError dbus_error; - char value[ST_MAX_VALUE_LEN]; - info_lkp_t *nut2hal_info = NULL, *prev_nut2hal_info = NULL; - - va_start(ap, fmt); - vsnprintf(value, sizeof(value), fmt, ap); - va_end(ap); - - cs = libhal_device_new_changeset (udi); - if (cs == NULL) { - fatalx (EXIT_FAILURE, "Cannot initialize changeset"); - } - - /* Loop on getting HAL variable(s) matching this NUT variable */ - while ( (nut2hal_info = find_nut_info(var, prev_nut2hal_info)) != NULL) - { - upsdebugx(2, "dstate_setinfo: %s => %s (%s)\n", var, nut2hal_info->hal_name, value); - - if (nut2hal_info->fun != NULL) - nut2hal_info->fun(cs, value); - else { - switch (nut2hal_info->hal_type) - { - case HAL_TYPE_INT: - hal_set_int(cs, nut2hal_info->hal_name, atoi(value)); - break; - case HAL_TYPE_BOOL: - /* FIXME: howto lookup TRUE/FALSE? */ - hal_set_bool(cs, nut2hal_info->hal_name, TRUE); - break; - case HAL_TYPE_STRING: - hal_set_string(cs, nut2hal_info->hal_name, value); - break; - } - } - prev_nut2hal_info = nut2hal_info; - } - - dbus_error_init (&dbus_error); - /* NOTE: commit_changeset won't do IPC if set is empty */ - libhal_device_commit_changeset(halctx,cs,&dbus_error); - libhal_device_free_changeset (cs); - - if (dbus_error_is_set (&dbus_error)) - dbus_error_free (&dbus_error); - - return ret; -} - - -int dstate_addenum(const char *var, const char *fmt, ...) -{ - return 0; -} - -int dstate_addrange(const char *var, const int min, const int max) -{ - return 0; -} - -const st_tree_t *dstate_getroot(void) -{ - return NULL; -} - -int dstate_delinfo(const char *var) -{ - return 0; -} - -int dstate_delcmd(const char *var) -{ - return 0; -} - -void dstate_setflags(const char *var, int flags) -{ - return; -} - -void dstate_setaux(const char *var, int aux) -{ - return; -} - -void dstate_dataok(void) -{ - return; -} - -void dstate_datastale(void) -{ - return; -} - -void dstate_free(void) -{ - return; -} - -/* extrafd: provided for waking up based on the driver's UPS fd */ -int dstate_poll_fds(struct timeval timeout, int extrafd) -{ - /* drivers expect us to limit the polling rate here */ - sleep(timeout.tv_sec); - - /* the timeout expired */ - return 1; -} - -/* clean out the temp space for a new pass */ -void status_init(void) -{ - /* Nothing to do */ - return; -} - -/* ups.status element conversion */ -void status_set(const char *buf) -{ - upsdebugx(2, "status_set: %s", buf); - - /* Note: only usbhid-ups supported devices expose [DIS]CHRG status */ - /* along with the standard OL (online) / OB (on battery) status! */ - if ( (strcmp(buf, "DISCHRG") == 0) || (strcmp(buf, "OB") == 0) ) - { - ac_present = 0; - } - else if ( (strcmp(buf, "CHRG") == 0) || (strcmp(buf, "OL") == 0) ) - { - ac_present = 1; - } - else - upsdebugx(2, "status_set: dropping status %s (not managed)\n", buf); - - return; -} - -/* write the status_buf into the externally visible dstate storage */ -void status_commit(void) -{ - LibHalChangeSet *cs; - DBusError dbus_error; - int curlevel, warnlevel, lowlevel; - - upsdebugx(2, "status_commit"); - - cs = libhal_device_new_changeset (udi); - if (cs == NULL) { - fatalx (EXIT_FAILURE, "Cannot initialize changeset"); - } - - /* Retrieve the levels */ - curlevel = hal_get_int ("battery.charge_level.current"); - warnlevel = hal_get_int ("battery.charge_level.warning"); - lowlevel = hal_get_int ("battery.charge_level.low"); - - /* Set AC present status */ - /* Note: UPSs are also AC adaptors! */ - hal_set_bool (cs, "ac_adaptor.present", (ac_present == 0)?FALSE:TRUE); - - /* Set discharging status */ - hal_set_bool (cs, "battery.rechargeable.is_discharging", (ac_present == 0)?TRUE:FALSE); - - /* Set charging status */ - if (curlevel != 100) - hal_set_bool (cs, "battery.rechargeable.is_charging", (ac_present == 0)?FALSE:TRUE); - - /* Set the battery status (FIXME: are these values valid?) */ - if (curlevel <= lowlevel) - hal_set_string(cs, "battery.charge_level.capacity_state", "critical"); - else if (curlevel <= warnlevel) - hal_set_string(cs, "battery.charge_level.capacity_state", "warning"); /*low?*/ - else - hal_set_string(cs, "battery.charge_level.capacity_state", "ok"); - - dbus_error_init (&dbus_error); - /* NOTE: commit_changeset won't do IPC if set is empty */ - libhal_device_commit_changeset (halctx, cs, &dbus_error); - libhal_device_free_changeset (cs); - - if (dbus_error_is_set (&dbus_error)) - dbus_error_free (&dbus_error); - - return; -} - -/* similar functions for ups.alarm */ -void alarm_init(void) -{ - return; -} - -void alarm_set(const char *buf) -{ - return; -} - -void alarm_commit(void) -{ - return; -} - -/* FIXME: complete and use nut2hal_cmd */ -/* Register DBus methods, by feeling the methods buffer */ -void dstate_addcmd(const char *cmdname) -{ - DBusError dbus_error; - dbus_error_init (&dbus_error); - - upsdebugx(2, "dstate_addcmd: %s\n", cmdname); - - /* beeper.{on,off} */ - /* FIXME: how to deal with beeper.toggle */ - if (!strncasecmp(cmdname, "beeper.disable", 14)) - { - strcat(dbus_methods_introspection, - " \n" - " \n" - " \n" - " \n"); - } -} - - - -/******************************************************************* - * internal functions - *******************************************************************/ - -/**************** - * HAL wrappers * - ****************/ -/* Only update HAL string values if there are real changes */ -void hal_set_string(LibHalChangeSet *cs, const char *key, const char *value) -{ - DBusError dbus_error; - char *new_value = NULL; - - upsdebugx(2, "hal_set_string: %s => %s", key, value); - - dbus_error_init(&dbus_error); - - /* Check if the property already exists */ - if (libhal_device_property_exists (halctx, udi, key, &dbus_error) == TRUE) { - - new_value = libhal_device_get_property_string (halctx, udi, - key, &dbus_error); - - /* Check if the value has really changed */ - if (strcmp(value, new_value)) - libhal_changeset_set_property_string (cs, key, value); - - /* Free the new_value string */ - if (new_value != NULL) - libhal_free_string (new_value); - } - else { - libhal_changeset_set_property_string (cs, key, value); - } -} - -/* Only update HAL int values if there are real changes */ -void hal_set_int(LibHalChangeSet *cs, const char *key, const int value) -{ - DBusError dbus_error; - int new_value; - - upsdebugx(2, "hal_set_int: %s => %i", key, value); - - dbus_error_init(&dbus_error); - - /* Check if the property already exists */ - if (libhal_device_property_exists (halctx, udi, key, &dbus_error) == TRUE) { - - new_value = libhal_device_get_property_int (halctx, udi, - key, &dbus_error); - - /* Check if the value has really changed */ - if (value != new_value) - libhal_changeset_set_property_int (cs, key, value); - } - else { - libhal_changeset_set_property_int (cs, key, value); - } -} - -char *hal_get_string(const char *key) -{ - DBusError dbus_error; - char *value = NULL; - - upsdebugx(2, "hal_get_string: %s", key); - - dbus_error_init(&dbus_error); - - /* Check if the property already exists */ - if (libhal_device_property_exists (halctx, udi, key, &dbus_error) == TRUE) { - - value = libhal_device_get_property_string (halctx, udi, - key, &dbus_error); - } - return value; -} - -int hal_get_int(const char *key) -{ - DBusError dbus_error; - int value = -1; - - upsdebugx(2, "hal_get_int: %s", key); - - dbus_error_init(&dbus_error); - - /* Check if the property already exists */ - if (libhal_device_property_exists (halctx, udi, key, &dbus_error) == TRUE) { - - value = libhal_device_get_property_int (halctx, udi, - key, &dbus_error); - } - return value; -} - -/* Only update HAL int values if there are real changes */ -void hal_set_bool(LibHalChangeSet *cs, const char *key, const dbus_bool_t value) -{ - DBusError dbus_error; - dbus_bool_t new_value; - - upsdebugx(2, "hal_set_bool: %s => %s", key, (value==TRUE)?"true":"false"); - - dbus_error_init(&dbus_error); - - /* Check if the property already exists */ - if (libhal_device_property_exists (halctx, udi, key, &dbus_error) == TRUE) { - - new_value = libhal_device_get_property_bool (halctx, udi, - key, &dbus_error); - - /* Check if the value has really changed */ - if (value != new_value) - libhal_changeset_set_property_bool (cs, key, value); - } - else { - libhal_changeset_set_property_bool (cs, key, value); - } -} - -/* find the next info element definition in info array - * that matches nut_varname, and that is after prev_info_item - * if specified. - * Note that 1 nut item can matches several HAL items - */ -static info_lkp_t *find_nut_info(const char *nut_varname, info_lkp_t *prev_info_item) -{ - info_lkp_t *info_item; - - upsdebugx(2, "find_nut_info: looking up => %s\n", nut_varname); - - if (prev_info_item != NULL) { - /* Start from the item following prev_info_item */ - info_item = ++prev_info_item; - } - else { - info_item = nut2hal_info; - } - - for ( ; info_item != NULL && info_item->nut_name != NULL ; info_item++) { - - if (!strcasecmp(info_item->nut_name, nut_varname)) - return info_item; - } - - return NULL; -} diff --git a/drivers/dstate-hal.h b/drivers/dstate-hal.h deleted file mode 100644 index 6a2ad2f..0000000 --- a/drivers/dstate-hal.h +++ /dev/null @@ -1,94 +0,0 @@ -/* dstate-hal.h - Network UPS Tools driver-side state management - - Copyright (C) 2006 Arnaud Quette - - 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. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef DSTATE_HAL_H_SEEN -#define DSTATE_HAL_H_SEEN 1 - -#include "state.h" -#include "attribute.h" - -/*#include "parseconf.h"*/ -#include "upshandler.h" - -#include -#include -#include -#include - -#define DS_LISTEN_BACKLOG 16 -#define DS_MAX_READ 256 /* don't read forever from upsd */ - -/* HAL specific */ -#define DBUS_INTERFACE "org.freedesktop.Hal.Device.UPS" - -DBusHandlerResult dbus_filter_function(DBusConnection *connection, - DBusMessage *message, - void *user_data); - -gboolean dbus_init_local (void); - -#define HAL_WARNING - -/* track client connections */ -/* typedef struct conn_s { - * int fd; - * PCONF_CTX_t ctx; - * struct conn_s *next; - *} conn_t; - */ - extern struct ups_handler upsh; - -void dstate_init(const char *prog, const char *port); -int dstate_poll_fds(struct timeval timeout, int extrafd); -int dstate_setinfo(const char *var, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 2, 3))); -int dstate_addenum(const char *var, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 2, 3))); -int dstate_addrange(const char *var, const int min, const int max); -void dstate_setflags(const char *var, int flags); -void dstate_setaux(const char *var, int aux); -const char *dstate_getinfo(const char *var); -void dstate_addcmd(const char *cmdname); -int dstate_delinfo(const char *var); -int dstate_delenum(const char *var, const char *val); -int dstate_delcmd(const char *cmd); -void dstate_free(void); -const st_tree_t *dstate_getroot(void); -const cmdlist_t *dstate_getcmdlist(void); - -void dstate_dataok(void); -void dstate_datastale(void); - -int dstate_is_stale(void); - -/* clean out the temp space for a new pass */ -void status_init(void); - -/* add a status element */ -void status_set(const char *buf); - -/* write the temporary status_buf into ups.status */ -void status_commit(void); - -/* similar functions for ups.alarm */ -void alarm_init(void); -void alarm_set(const char *buf); -void alarm_commit(void); - -#endif /* DSTATE_HAL_H_SEEN */ diff --git a/drivers/libshut.c b/drivers/libshut.c index 30651d0..1e2cd8d 100644 --- a/drivers/libshut.c +++ b/drivers/libshut.c @@ -312,7 +312,7 @@ int libshut_open(int *upsfd, SHUTDevice_t *curDevice, char *device_path, /* FIXME: add variable baudrate detection */ *upsfd = ser_open(device_path); ser_set_speed(*upsfd, device_path, B2400); - setline(*upsfd, 0); + setline(*upsfd, 1); /* initialise communication */ if (!shut_synchronise(*upsfd)) diff --git a/drivers/libusb.c b/drivers/libusb.c index 234b9f1..fd8f5b9 100644 --- a/drivers/libusb.c +++ b/drivers/libusb.c @@ -33,9 +33,6 @@ #include "usb-common.h" #include "libusb.h" -/* USB standard timeout */ -#define USB_TIMEOUT 5000 - #define USB_DRIVER_NAME "USB communication driver" #define USB_DRIVER_VERSION "0.32" @@ -375,7 +372,9 @@ static int libusb_strerror(const int ret, const char *desc) return 0; case -EOVERFLOW: /* Value too large for defined data type */ +#ifdef EPROTO case -EPROTO: /* Protocol error */ +#endif upsdebugx(2, "%s: %s", desc, usb_strerror()); return 0; diff --git a/drivers/main-hal.c b/drivers/main-hal.c deleted file mode 100644 index 8cd3275..0000000 --- a/drivers/main-hal.c +++ /dev/null @@ -1,571 +0,0 @@ -/* main-hal.c - Network UPS Tools driver core for HAL - - Copyright (C) 2006 Arnaud Quette - Copyright (C) 1999 Russell Kroll - - 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. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/* TODO list: - * -more cleanup - * - dstate-hal: expose all data on org.freedesktop.NUT to prepare - * a full HAL/DBus enabled nut (remove the need of {d,s}state layer - * - use HAL logging functions - */ - -#include "main-hal.h" -#include "dstate-hal.h" -#include - -#ifdef HAVE_POLKIT -#include -#endif - - /* HAL specific */ - extern LibHalContext *halctx; - extern char *udi; - - /* data which may be useful to the drivers */ - int upsfd = -1; - char *device_path = NULL; - const char *progname = NULL, *upsname = NULL, - *device_name = NULL; - - /* may be set by the driver to wake up while in dstate_poll_fds */ - int extrafd = -1; - - /* for ser_open */ - int do_lock_port = 1; - - /* set by the drivers */ - int experimental_driver = 0; - int broken_driver = 0; - - static vartab_t *vartab_h = NULL; - - /* variables possibly set by the global part of ups.conf */ - unsigned int poll_interval = 2; - static char *chroot_path = NULL; - - /* signal handling */ - int exit_flag = 0; - - /* everything else */ - static char *pidfn = NULL; - GMainLoop *gmain; - char *dbus_methods_introspection; - -/* retrieve the value of variable if possible */ -char *getval(const char *var) -{ - vartab_t *tmp = vartab_h; - - while (tmp) { - if (!strcasecmp(tmp->var, var)) - return(tmp->val); - tmp = tmp->next; - } - - return NULL; -} - -/* see if has been defined, even if no value has been given to it */ -int testvar(const char *var) -{ - vartab_t *tmp = vartab_h; - - while (tmp) { - if (!strcasecmp(tmp->var, var)) - return tmp->found; - tmp = tmp->next; - } - - return 0; /* not found */ -} - -/* callback from driver - create the table for -x/conf entries */ -void addvar(int vartype, const char *name, const char *desc) -{ - vartab_t *tmp, *last; - - tmp = last = vartab_h; - - while (tmp) { - last = tmp; - tmp = tmp->next; - } - - tmp = xmalloc(sizeof(vartab_t)); - - tmp->vartype = vartype; - tmp->var = xstrdup(name); - tmp->val = NULL; - tmp->desc = xstrdup(desc); - tmp->found = 0; - tmp->next = NULL; - - if (last) - last->next = tmp; - else - vartab_h = tmp; -} - -static void vartab_free(void) -{ - vartab_t *tmp, *next; - - tmp = vartab_h; - - while (tmp) { - next = tmp->next; - - free(tmp->var); - free(tmp->val); - free(tmp->desc); - free(tmp); - - tmp = next; - } -} - -static void exit_cleanup(int sig) -{ - upsdebugx(2, "exit_cleanup(%i", sig); - - exit_flag = sig; - - upsdrv_cleanup(); - - free(chroot_path); - free(device_path); - - if (pidfn) { - unlink(pidfn); - free(pidfn); - } - - dstate_free(); - vartab_free(); - - /* break the main loop */ - g_main_loop_quit(gmain); -} - -static void setup_signals(void) -{ - struct sigaction sa; - - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART | SA_NOCLDSTOP; - - sa.sa_handler = exit_cleanup; - sigaction(SIGTERM, &sa, NULL); - sigaction(SIGINT, &sa, NULL); - sigaction(SIGQUIT, &sa, NULL); - -/* sa.sa_handler = SIG_IGN; - sigaction(SIGHUP, &sa, NULL); - sigaction(SIGPIPE, &sa, NULL);*/ -} - -/* (*GSourceFunc) wrapper */ -static gboolean update_data (gpointer data) -{ - upsdrv_updateinfo(); - return (exit_flag == 0); -} - -int main(int argc, char **argv) -{ - DBusError dbus_error; - DBusConnection *dbus_connection; - struct passwd *new_uid = NULL; - char *hal_debug_level; -/* int i, do_forceshutdown = 0; */ - - if (experimental_driver) { - printf("Warning: This is an experimental driver.\n"); - printf("Some features may not function correctly.\n\n"); - } - - progname = xbasename(argv[0]); - open_syslog(progname); - - dbus_methods_introspection = xmalloc(1024); - - /* Register the basic supported method (Shutdown) - * Leave other methods registration to driver core calls to - * dstate_addcmd(), at initinfo() time - */ - snprintf(dbus_methods_introspection, 1024, "%s", - " \n" -/* " \n" */ - " \n" - " \n"); - - /* initialise HAL and DBus interface*/ - halctx = NULL; - udi = getenv ("UDI"); - if (udi == NULL) { - fprintf(stderr, "Error: UDI is null.\n"); - exit(EXIT_FAILURE); - } - - dbus_error_init (&dbus_error); - if ((halctx = libhal_ctx_init_direct (&dbus_error)) == NULL) { - fprintf(stderr, "Error: can't initialise libhal.\n"); - exit(EXIT_FAILURE); - } - if (dbus_error_is_set (&dbus_error)) - { - fatalx(EXIT_FAILURE, "Error in context creation: %s\n", dbus_error.message); - dbus_error_free (&dbus_error); - } - - if ((dbus_connection = libhal_ctx_get_dbus_connection(halctx)) == NULL) { - fprintf(stderr, "Error: can't get DBus connection.\n"); - exit(EXIT_FAILURE); - } - - /* FIXME: rework HAL param interface! or get path/regex from UDI - * Example: - * /org/freedesktop/Hal/devices/usb_device_463_ffff_1H2E300AH - * => linux.device_file = /dev/bus/usb/002/065 - */ - /* FIXME: the naming should be abstracted to os.device_file! */ - device_path = xstrdup("auto"); - - /* FIXME: bridge debug/warning on HAL equivalent (need them - * to externalize these in a lib... */ - hal_debug_level = getenv ("NUT_HAL_DEBUG"); - if (hal_debug_level == NULL) - nut_debug_level = 0; - else - nut_debug_level = atoi(hal_debug_level); - - /* Sleep 2 seconds to be able to view the device through usbfs! */ - sleep(2); - - /* build the driver's extra (-x) variable table */ - upsdrv_makevartable(); - - /* Switch to the HAL user */ - new_uid = get_user_pwent(HAL_USER); - become_user(new_uid); - - /* Only switch to statepath if we're not powering off */ - /* This avoid case where ie /var is umounted */ -/* ?! Not needed for HAL !? - if (!do_forceshutdown) - if (chdir(dflt_statepath())) - fatal_with_errno(EXIT_FAILURE, "Can't chdir to %s", dflt_statepath()); -*/ - setup_signals(); - - /* clear out callback handler data */ - memset(&upsh, '\0', sizeof(upsh)); - - upsdrv_initups(); - -#if 0 - if (do_forceshutdown) - forceshutdown(); -#endif - - /* get the supported data and commands before allowing connections */ - upsdrv_initinfo(); - upsdrv_updateinfo(); - - /* now we can start servicing requests */ - dstate_init(NULL, NULL); - - /* Commit DBus methods */ - if (!libhal_device_claim_interface(halctx, udi, DBUS_INTERFACE, - dbus_methods_introspection, &dbus_error)) { - fprintf(stderr, "Cannot claim interface: %s\n", dbus_error.message); - } - else - fprintf(stdout, "Claimed the following DBus interfaces on %s:\n%s", - DBUS_INTERFACE, dbus_methods_introspection); - - /* Complete DBus binding */ - dbus_connection_setup_with_g_main(dbus_connection, NULL); - dbus_connection_add_filter(dbus_connection, dbus_filter_function, NULL, NULL); - dbus_connection_set_exit_on_disconnect(dbus_connection, 0); - - dbus_init_local(); - /* end of HAL init */ - -#if 0 - /* publish the top-level data: version number, driver name */ - dstate_setinfo("driver.version", "%s", UPS_VERSION); - dstate_setinfo("driver.name", "%s", progname); - - /* The poll_interval may have been changed from the default */ - dstate_setinfo("driver.parameter.pollinterval", "%d", poll_interval); - -/* FIXME: needed? */ - if (nut_debug_level == 0) { - background(); - writepid(pidfn); - } -#endif - /* End HAL init */ - dbus_error_init (&dbus_error); - if (!libhal_device_addon_is_ready (halctx, udi, &dbus_error)) { - fprintf(stderr, "Error (libhal): device addon is not ready\n"); - exit(EXIT_FAILURE); - } - - /* add a timer for data update */ -#ifdef HAVE_G_TIMEOUT_ADD_SECONDS - g_timeout_add_seconds (poll_interval, -#else - g_timeout_add (1000 * poll_interval, /* seconds */ -#endif - (GSourceFunc)update_data, - NULL); - - /* setup and run the main loop */ - gmain = g_main_loop_new(NULL, FALSE); - g_main_loop_run(gmain); - - /* reached upon addon exit */ - upslogx(LOG_INFO, "Signal %d: exiting", exit_flag); - exit(EXIT_SUCCESS); -} - -/******************************************************************** - * DBus interface functions and data - *******************************************************************/ - -static DBusHandlerResult dbus_filter_function_local(DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) { - upsdebugx(1, "DBus daemon disconnected. Trying to reconnect..."); - dbus_connection_unref(connection); - g_timeout_add(5000, (GSourceFunc)dbus_init_local, NULL); - } - return DBUS_HANDLER_RESULT_HANDLED; -} - -/* returns FALSE on success because it's used as a callback */ -gboolean dbus_init_local(void) -{ - DBusConnection *dbus_connection; - DBusError dbus_error; - - dbus_error_init(&dbus_error); - - dbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error); - if (dbus_error_is_set(&dbus_error)) { - upsdebugx(1, "Cannot get D-Bus connection"); -/* dbus_error_free (&dbus_error); */ - return TRUE; - } - - dbus_connection_setup_with_g_main(dbus_connection, NULL); - dbus_connection_add_filter(dbus_connection, dbus_filter_function_local, - NULL, NULL); - dbus_connection_set_exit_on_disconnect(dbus_connection, 0); - return FALSE; -} - -#ifdef HAVE_POLKIT -/** - * dbus_is_privileged: - * @connection: connection to D-Bus - * @message: Message - * @error: the error - * - * Returns: TRUE if the caller is privileged - * - * checks if caller of message possesses the CPUFREQ_POLKIT_PRIVILGE - */ -static gboolean -dbus_is_privileged (DBusConnection *connection, DBusMessage *message, DBusError *error) -{ - gboolean ret; - char *polkit_result; - const char *invoked_by_syscon_name; - - ret = FALSE; - polkit_result = NULL; -/* FIXME: CPUFREQ_POLKIT_PRIVILEGE, CPUFREQ_ERROR_GENERAL */ - invoked_by_syscon_name = dbus_message_get_sender (message); - - polkit_result = libhal_device_is_caller_privileged (halctx, - udi, - CPUFREQ_POLKIT_PRIVILEGE, - invoked_by_syscon_name, - error); - if (polkit_result == NULL) { - dbus_raise_error (connection, message, CPUFREQ_ERROR_GENERAL, - "Cannot determine if caller is privileged"); - } - else { - if (strcmp (polkit_result, "yes") != 0) { - - dbus_raise_error (connection, message, - "org.freedesktop.Hal.Device.PermissionDeniedByPolicy", - "%s %s <-- (action, result)", - CPUFREQ_POLKIT_PRIVILEGE, polkit_result); - } - else - ret = TRUE; - } - - if (polkit_result != NULL) - libhal_free_string (polkit_result); - return ret; -} -#endif - -/** - * dbus_send_reply: - * @connection: connection to D-Bus - * @message: Message - * @type: the type of data param - * @data: data to send - * - * Returns: TRUE/FALSE - * - * sends a reply to message with the given data and its dbus_type - */ -static gboolean dbus_send_reply(DBusConnection *connection, DBusMessage *message, - int dbus_type, void *data) -{ - DBusMessage *reply; - - if ((reply = dbus_message_new_method_return(message)) == NULL) { - upslogx(LOG_WARNING, "Could not allocate memory for the DBus reply"); - return FALSE; - } - - if (data != NULL) - dbus_message_append_args(reply, dbus_type, data, DBUS_TYPE_INVALID); - - if (!dbus_connection_send(connection, reply, NULL)) { - upslogx(LOG_WARNING, "Could not sent reply"); - return FALSE; - } - dbus_connection_flush(connection); - dbus_message_unref(reply); - - return TRUE; -} - -/** - * dbus_get_argument: - * @connection: connection to D-Bus - * @message: Message - * @dbus_error: the D-Bus error - * @type: the type of arg param - * @arg: the value to get from the message - * - * Returns: TRUE/FALSE - * - * gets one argument from message with the given dbus_type and stores it in arg - */ -static gboolean dbus_get_argument(DBusConnection *connection, DBusMessage *message, - DBusError *dbus_error, int dbus_type, void *arg) -{ - dbus_message_get_args(message, dbus_error, dbus_type, arg, - DBUS_TYPE_INVALID); - if (dbus_error_is_set(dbus_error)) { - upslogx(LOG_WARNING, "Could not get argument of DBus message: %s", - dbus_error->message); - dbus_error_free(dbus_error); - return FALSE; - } - return TRUE; -} - -/** - * dbus_filter_function: - * @connection: connection to D-Bus - * @message: message - * @user_data: pointer to the data - * - * Returns: the result - * - * @raises UnknownMethod - * - * D-Bus filter function - */ -DBusHandlerResult dbus_filter_function(DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - DBusError dbus_error; - int retcode = -1; - const char *member = dbus_message_get_member(message); - const char *path = dbus_message_get_path(message); -/* int ret = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; */ - - /* upsdebugx(2, "Received DBus message with member %s path %s", member, path); */ - fprintf(stdout, "Received DBus message with member %s on path %s\n", member, path); - - dbus_error_init(&dbus_error); - if (dbus_error_is_set (&dbus_error)) - { - fprintf (stderr, "an error occurred: %s\n", dbus_error.message); -/* dbus_error_free (&dbus_error); */ - } - else - { -#ifdef HAVE_POLKIT - if (!dbus_is_privileged(connection, message, &dbus_error)) - return DBUS_HANDLER_RESULT_HANDLED; -#endif - - if (dbus_message_is_method_call(message, DBUS_INTERFACE, "Shutdown")) { - - fprintf(stdout, "executing Shutdown\n"); - upsdrv_shutdown(); - dbus_send_reply(connection, message, DBUS_TYPE_INVALID, NULL); - - } else if (dbus_message_is_method_call(message, - DBUS_INTERFACE, "SetBeeper")) { - fprintf(stdout, "executing SetBeeper\n"); - gboolean b_enable; - if (!dbus_get_argument(connection, message, &dbus_error, - DBUS_TYPE_BOOLEAN, &b_enable)) { - fprintf(stderr, "Error receiving boolean argument\n"); - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - fprintf(stdout, "Received argument: %s\n", (b_enable==TRUE)?"true":"false"); - - if (b_enable==TRUE) { - if (upsh.instcmd("beeper.enable", NULL) != STAT_INSTCMD_HANDLED) { - dbus_send_reply(connection, message, DBUS_TYPE_INT32, &retcode); - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - } - else { - if (upsh.instcmd("beeper.disable", NULL) != STAT_INSTCMD_HANDLED) { - dbus_send_reply(connection, message, DBUS_TYPE_INT32, &retcode); - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - } - } else { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - } - dbus_send_reply(connection, message, DBUS_TYPE_INVALID, NULL); - return DBUS_HANDLER_RESULT_HANDLED; -} diff --git a/drivers/main-hal.h b/drivers/main-hal.h deleted file mode 100644 index e612133..0000000 --- a/drivers/main-hal.h +++ /dev/null @@ -1,51 +0,0 @@ -#include "common.h" -#include "config.h" -/* #include "upsconf.h" */ -#include "dstate.h" -#include "extstate.h" - -/* public functions & variables from main.c */ -extern const char *progname; -extern char *device_path; -extern const char *device_name; -extern int upsfd, extrafd, broken_driver, experimental_driver, exit_flag; -extern unsigned int poll_interval; - -/* functions & variables required in each driver */ -void upsdrv_initups(void); /* open connection to UPS, fail if not found */ -void upsdrv_initinfo(void); /* prep data, settings for UPS monitoring */ -void upsdrv_updateinfo(void); /* update state data if possible */ -void upsdrv_shutdown(void); /* make the UPS power off the load */ -void upsdrv_help(void); /* tack on anything useful for the -h text */ -void upsdrv_banner(void); /* print your version information */ -void upsdrv_cleanup(void); /* free any resources before shutdown */ - -/* --- details for the variable/value sharing --- */ - -/* main calls this driver function - it needs to call addvar */ -void upsdrv_makevartable(void); - -/* retrieve the value of variable if possible */ -char *getval(const char *var); - -/* see if has been defined, even if no value has been given to it */ -int testvar(const char *var); - -/* extended variable table - used for -x defines/flags */ -typedef struct vartab_s { - int vartype; /* VAR_* value, below */ - char *var; /* left side of =, or whole word if none */ - char *val; /* right side of = */ - char *desc; /* 40 character description for -h text */ - int found; /* set once encountered, for testvar() */ - struct vartab_s *next; -} vartab_t; - -/* flags to define types in the vartab */ - -#define VAR_FLAG 0x0001 /* argument is a flag (no value needed) */ -#define VAR_VALUE 0x0002 /* argument requires a value setting */ -#define VAR_SENSITIVE 0x0004 /* do not publish in driver.parameter */ - -/* callback from driver - create the table for future -x entries */ -void addvar(int vartype, const char *name, const char *desc); diff --git a/drivers/mge-hid.c b/drivers/mge-hid.c index 6383379..93ccde6 100644 --- a/drivers/mge-hid.c +++ b/drivers/mge-hid.c @@ -36,7 +36,7 @@ #include "usbhid-ups.h" #include "mge-hid.h" -#define MGE_HID_VERSION "MGE HID 1.32" +#define MGE_HID_VERSION "MGE HID 1.33" /* (prev. MGE Office Protection Systems, prev. MGE UPS SYSTEMS) */ /* Eaton */ @@ -98,7 +98,8 @@ typedef enum { MGE_PULSAR_M = 0x400, /* MGE Pulsar M series */ MGE_PULSAR_M_2200, MGE_PULSAR_M_3000, - MGE_PULSAR_M_3000_XL + MGE_PULSAR_M_3000_XL, + EATON_5P = 0x500 /* Eaton 5P / 5PX series */ } models_type_t; /* Default to line-interactive or online (ie, not offline). @@ -211,6 +212,7 @@ static const char *mge_battery_voltage_nominal_fun(double value) break; case MGE_PULSAR_M: + case EATON_5P: break; default: @@ -234,6 +236,7 @@ static const char *mge_battery_voltage_fun(double value) { case MGE_EVOLUTION: case MGE_PULSAR_M: + case EATON_5P: break; default: @@ -774,6 +777,12 @@ static models_name_t mge_model_names [] = { "Evolution", "S 2500", MGE_EVOLUTION_S_2500, NULL }, { "Evolution", "S 3000", MGE_EVOLUTION_S_3000, NULL }, + /* Eaton 5P */ + { "Eaton 5P", "650", EATON_5P, "5P 650" }, + { "Eaton 5P", "850", EATON_5P, "5P 850" }, + { "Eaton 5P", "1150", EATON_5P, "5P 1150" }, + { "Eaton 5P", "1550", EATON_5P, "5P 1550" }, + /* Pulsar M models */ { "PULSAR M", "2200", MGE_PULSAR_M_2200, NULL }, { "PULSAR M", "3000", MGE_PULSAR_M_3000, NULL }, diff --git a/drivers/mge-xml.c b/drivers/mge-xml.c index adb8262..560d432 100644 --- a/drivers/mge-xml.c +++ b/drivers/mge-xml.c @@ -31,7 +31,7 @@ #include "netxml-ups.h" #include "mge-xml.h" -#define MGE_XML_VERSION "MGEXML/0.22" +#define MGE_XML_VERSION "MGEXML/0.23" #define MGE_XML_INITUPS "/" #define MGE_XML_INITINFO "/mgeups/product.xml /product.xml /ws/product.xml" @@ -1489,7 +1489,7 @@ char *vvalue_mge_xml2nut(const char *name, const char *value, size_t len) { /* Convert */ if (NULL != info->convert) { - char *vconv = info->convert(vcpy); + char *vconv = (char *)info->convert(vcpy); free(vcpy); @@ -1510,7 +1510,7 @@ void vname_register_rw(void) { xml_info_t *info = mge_xml2nut + i; if (NULL != info->nutname && info->nutflags & ST_FLAG_RW) { - dstate_setinfo(info->nutname, ""); + dstate_setinfo(info->nutname, "%s", ""); dstate_setflags(info->nutname, ST_FLAG_RW); } } diff --git a/drivers/nutdrv_atcl_usb.c b/drivers/nutdrv_atcl_usb.c new file mode 100644 index 0000000..7424493 --- /dev/null +++ b/drivers/nutdrv_atcl_usb.c @@ -0,0 +1,498 @@ +/* + * nutdrv_atcl_usb.c - driver for generic-brand "ATCL FOR UPS" + * + * Copyright (C) 2013-2014 Charles Lepple + * + * Loosely based on richcomm_usb.c, + * Copyright (C) 2007 Peter van Valderen + * Dirk Teurlings + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "usb-common.h" + +/* driver version */ +#define DRIVER_NAME "'ATCL FOR UPS' USB driver" +#define DRIVER_VERSION "1.1" + +/* driver description structure */ +upsdrv_info_t upsdrv_info = { + DRIVER_NAME, + DRIVER_VERSION, + "Charles Lepple ", + DRV_EXPERIMENTAL, + { NULL } +}; + +#define STATUS_ENDPOINT (USB_ENDPOINT_IN | 1) +#define SHUTDOWN_ENDPOINT (USB_ENDPOINT_OUT | 2) +#define STATUS_PACKETSIZE 8 +#define SHUTDOWN_PACKETSIZE 8 + +/* Probably can reduce this, since the pcap file shows mostly 1050-ish ms response times */ +#define ATCL_USB_TIMEOUT USB_TIMEOUT + +/* limit the amount of spew that goes in the syslog when we lose the UPS (from nut_usb.h) */ +#define USB_ERR_LIMIT 10 /* start limiting after 10 in a row */ +#define USB_ERR_RATE 10 /* then only print every 10th error */ + +#define USB_VENDOR_STRING "ATCL FOR UPS" + +static usb_device_id_t atcl_usb_id[] = { + /* ATCL FOR UPS */ + { USB_DEVICE(0x0001, 0x0000), NULL }, + + /* end of list */ + {-1, -1, NULL} +}; + +static usb_dev_handle *udev = NULL; +static USBDevice_t usbdevice; +static unsigned int comm_failures = 0; + +static int device_match_func(USBDevice_t *device, void *privdata) +{ + char *requested_vendor; + switch (is_usb_device_supported(atcl_usb_id, device)) + { + case SUPPORTED: + if(!device->Vendor) { + upsdebugx(1, "Couldn't retrieve USB string descriptor for vendor. Check permissions?"); + requested_vendor = getval("vendor"); + if(requested_vendor) { + if(!strcmp("NULL", requested_vendor)) { + upsdebugx(3, "Matched device with NULL vendor string."); + return 1; + } + } + upsdebugx(1, "To keep trying (in case your device does not have a vendor string), use vendor=NULL"); + return 0; + } + + if(!strcmp(device->Vendor, USB_VENDOR_STRING)) { + upsdebugx(4, "Matched expected vendor='%s'.", USB_VENDOR_STRING); + return 1; + } + /* Didn't match, but the user provided an alternate vendor ID: */ + requested_vendor = getval("vendor"); + if(requested_vendor) { + if(!strcmp(device->Vendor, requested_vendor)) { + upsdebugx(3, "Matched device with vendor='%s'.", requested_vendor); + return 1; + } else { + upsdebugx(2, "idVendor=%04x and idProduct=%04x, but provided vendor '%s' does not match device: '%s'.", + device->VendorID, device->ProductID, requested_vendor, device->Vendor); + return 0; + } + } + + /* TODO: automatic way of suggesting other drivers? */ + upsdebugx(2, "idVendor=%04x and idProduct=%04x, but device vendor string '%s' does not match expected string '%s'. " + "Have you tried the nutdrv_qx driver?", + device->VendorID, device->ProductID, device->Vendor, USB_VENDOR_STRING); + return 0; + + case POSSIBLY_SUPPORTED: + case NOT_SUPPORTED: + default: + return 0; + } +} + +static USBDeviceMatcher_t device_matcher = { + &device_match_func, + NULL, + NULL +}; + +static int query_ups(char *reply) +{ + int ret; + + ret = usb_interrupt_read(udev, STATUS_ENDPOINT, reply, STATUS_PACKETSIZE, ATCL_USB_TIMEOUT); + + if (ret <= 0) { + upsdebugx(2, "status interrupt read: %s", ret ? usb_strerror() : "timeout"); + return ret; + } + + upsdebug_hex(3, "read", reply, ret); + return ret; +} + +static void usb_comm_fail(const char *fmt, ...) +{ + int ret; + char why[SMALLBUF]; + va_list ap; + + /* this means we're probably here because select was interrupted */ + if (exit_flag != 0) { + return; /* ignored, since we're about to exit anyway */ + } + + comm_failures++; + + if ((comm_failures == USB_ERR_LIMIT) || ((comm_failures % USB_ERR_RATE) == 0)) { + upslogx(LOG_WARNING, "Warning: excessive comm failures, limiting error reporting"); + } + + /* once it's past the limit, only log once every USB_ERR_LIMIT calls */ + if ((comm_failures > USB_ERR_LIMIT) && ((comm_failures % USB_ERR_LIMIT) != 0)) { + return; + } + + /* generic message if the caller hasn't elaborated */ + if (!fmt) { + upslogx(LOG_WARNING, "Communications with UPS lost - check cabling"); + return; + } + + va_start(ap, fmt); + ret = vsnprintf(why, sizeof(why), fmt, ap); + va_end(ap); + + if ((ret < 1) || (ret >= (int) sizeof(why))) { + upslogx(LOG_WARNING, "usb_comm_fail: vsnprintf needed more than %d bytes", (int)sizeof(why)); + } + + upslogx(LOG_WARNING, "Communications with UPS lost: %s", why); +} + +static void usb_comm_good(void) +{ + if (comm_failures == 0) { + return; + } + + upslogx(LOG_NOTICE, "Communications with UPS re-established"); + comm_failures = 0; +} + +/* + * Callback that is called by usb_device_open() that handles USB device + * settings prior to accepting the devide. At the very least claim the + * device here. Detaching the kernel driver will be handled by the + * caller, don't do this here. Return < 0 on error, 0 or higher on + * success. + */ +static int driver_callback(usb_dev_handle *handle, USBDevice_t *device) +{ + if (usb_set_configuration(handle, 1) < 0) { + upslogx(LOG_WARNING, "Can't set USB configuration: %s", usb_strerror()); + return -1; + } + + if (usb_claim_interface(handle, 0) < 0) { + upslogx(LOG_WARNING, "Can't claim USB interface: %s", usb_strerror()); + return -1; + } + + /* TODO: HID SET_IDLE to 0 (not necessary?) */ + + return 1; +} + +static int usb_device_close(usb_dev_handle *handle) +{ + if (!handle) { + return 0; + } + + /* usb_release_interface() sometimes blocks and goes + into uninterruptible sleep. So don't do it. */ + /* usb_release_interface(handle, 0); */ + return usb_close(handle); +} + +static int usb_device_open(usb_dev_handle **handlep, USBDevice_t *device, USBDeviceMatcher_t *matcher, + int (*callback)(usb_dev_handle *handle, USBDevice_t *device)) +{ + struct usb_bus *bus; + + /* libusb base init */ + usb_init(); + usb_find_busses(); + usb_find_devices(); + +#ifndef __linux__ /* SUN_LIBUSB (confirmed to work on Solaris and FreeBSD) */ + /* Causes a double free corruption in linux if device is detached! */ + usb_device_close(*handlep); +#endif + + for (bus = usb_busses; bus; bus = bus->next) { + + struct usb_device *dev; + usb_dev_handle *handle; + + for (dev = bus->devices; dev; dev = dev->next) { + + int i, ret; + USBDeviceMatcher_t *m; + + upsdebugx(3, "Checking USB device [%04x:%04x] (%s/%s)", dev->descriptor.idVendor, + dev->descriptor.idProduct, bus->dirname, dev->filename); + + /* supported vendors are now checked by the supplied matcher */ + + /* open the device */ + *handlep = handle = usb_open(dev); + if (!handle) { + upsdebugx(4, "Failed to open USB device, skipping: %s", usb_strerror()); + continue; + } + + /* collect the identifying information of this + device. Note that this is safe, because + there's no need to claim an interface for + this (and therefore we do not yet need to + detach any kernel drivers). */ + + free(device->Vendor); + free(device->Product); + free(device->Serial); + free(device->Bus); + + memset(device, 0, sizeof(*device)); + + device->VendorID = dev->descriptor.idVendor; + device->ProductID = dev->descriptor.idProduct; + device->Bus = strdup(bus->dirname); + + if (dev->descriptor.iManufacturer) { + char buf[SMALLBUF]; + ret = usb_get_string_simple(handle, dev->descriptor.iManufacturer, + buf, sizeof(buf)); + if (ret > 0) { + device->Vendor = strdup(buf); + } + } + + if (dev->descriptor.iProduct) { + char buf[SMALLBUF]; + ret = usb_get_string_simple(handle, dev->descriptor.iProduct, + buf, sizeof(buf)); + if (ret > 0) { + device->Product = strdup(buf); + } + } + + if (dev->descriptor.iSerialNumber) { + char buf[SMALLBUF]; + ret = usb_get_string_simple(handle, dev->descriptor.iSerialNumber, + buf, sizeof(buf)); + if (ret > 0) { + device->Serial = strdup(buf); + } + } + + upsdebugx(4, "- VendorID : %04x", device->VendorID); + upsdebugx(4, "- ProductID : %04x", device->ProductID); + upsdebugx(4, "- Manufacturer : %s", device->Vendor ? device->Vendor : "unknown"); + upsdebugx(4, "- Product : %s", device->Product ? device->Product : "unknown"); + upsdebugx(4, "- Serial Number: %s", device->Serial ? device->Serial : "unknown"); + upsdebugx(4, "- Bus : %s", device->Bus ? device->Bus : "unknown"); + + for (m = matcher; m; m = m->next) { + + switch (m->match_function(device, m->privdata)) + { + case 0: + upsdebugx(4, "Device does not match - skipping"); + goto next_device; + case -1: + fatal_with_errno(EXIT_FAILURE, "matcher"); + goto next_device; + case -2: + upsdebugx(4, "matcher: unspecified error"); + goto next_device; + } + } + + for (i = 0; i < 3; i++) { + + ret = callback(handle, device); + if (ret >= 0) { + upsdebugx(3, "USB device [%04x:%04x] opened", device->VendorID, device->ProductID); + return ret; + } +#ifdef HAVE_USB_DETACH_KERNEL_DRIVER_NP + /* this method requires at least libusb 0.1.8: + * it forces device claiming by unbinding + * attached driver... From libhid */ + if (usb_detach_kernel_driver_np(handle, 0) < 0) { + upsdebugx(1, "failed to detach kernel driver from USB device: %s", usb_strerror()); + } else { + upsdebugx(4, "detached kernel driver from USB device..."); + } +#endif + } + + fatalx(EXIT_FAILURE, "USB device [%04x:%04x] matches, but driver callback failed: %s", + device->VendorID, device->ProductID, usb_strerror()); + + next_device: + usb_close(handle); + } + } + + *handlep = NULL; + upsdebugx(3, "No matching USB device found"); + + return -1; +} + +/* + * Initialise the UPS + */ +void upsdrv_initups(void) +{ + int i; + + upsdebugx(1, "Searching for USB device..."); + + for (i = 0; usb_device_open(&udev, &usbdevice, &device_matcher, &driver_callback) < 0; i++) { + + if ((i < 3) && (sleep(5) == 0)) { + usb_comm_fail("Can't open USB device, retrying ..."); + continue; + } + + fatalx(EXIT_FAILURE, + "Unable to find ATCL FOR UPS\n\n" + + "Things to try:\n" + " - Connect UPS device to USB bus\n" + " - Run this driver as another user (upsdrvctl -u or 'user=...' in ups.conf).\n" + " See upsdrvctl(8) and ups.conf(5).\n\n" + + "Fatal error: unusable configuration"); + } + +} + +void upsdrv_cleanup(void) +{ + usb_device_close(udev); + + free(usbdevice.Vendor); + free(usbdevice.Product); + free(usbdevice.Serial); + free(usbdevice.Bus); +} + +void upsdrv_initinfo(void) +{ + dstate_setinfo("ups.mfr", "%s", usbdevice.Vendor ? usbdevice.Vendor : "unknown"); + dstate_setinfo("ups.model", "%s", usbdevice.Product ? usbdevice.Product : "unknown"); + if(usbdevice.Serial && usbdevice.Product && strcmp(usbdevice.Serial, usbdevice.Product)) { + /* Only set "ups.serial" if it isn't the same as "ups.model": */ + dstate_setinfo("ups.serial", "%s", usbdevice.Serial); + } + + dstate_setinfo("ups.vendorid", "%04x", usbdevice.VendorID); + dstate_setinfo("ups.productid", "%04x", usbdevice.ProductID); +} + +void upsdrv_updateinfo(void) +{ + char reply[STATUS_PACKETSIZE]; + int ret; + + if (!udev) { + ret = usb_device_open(&udev, &usbdevice, &device_matcher, &driver_callback); + + if (ret < 0) { + return; + } + } + + ret = query_ups(reply); + + if (ret != STATUS_PACKETSIZE) { + usb_comm_fail("Query to UPS failed"); + dstate_datastale(); + + usb_device_close(udev); + udev = NULL; + + return; + } + + usb_comm_good(); + dstate_dataok(); + + status_init(); + + switch(reply[0]) { + case 3: + upsdebugx(2, "reply[0] = 0x%02x -> OL", reply[0]); + status_set("OL"); + break; + case 2: + upsdebugx(2, "reply[0] = 0x%02x -> LB", reply[0]); + status_set("LB"); + /* fall through */ + case 1: + upsdebugx(2, "reply[0] = 0x%02x -> OB", reply[0]); + status_set("OB"); + break; + default: + upslogx(LOG_ERR, "Unknown status: 0x%02x", reply[0]); + } + if(strnlen(reply + 1, 7) != 0) { + upslogx(LOG_NOTICE, "Status bytes 1-7 are not all zero"); + } + + status_commit(); +} + +/* If the UPS is on battery, it should shut down about 30 seconds after + * receiving this packet. + */ +void upsdrv_shutdown(void) +{ + const char shutdown_packet[SHUTDOWN_PACKETSIZE] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + int ret; + + upslogx(LOG_DEBUG, "%s: attempting to call usb_interrupt_write(01 00 00 00 00 00 00 00)", __func__); + + ret = usb_interrupt_write(udev, SHUTDOWN_ENDPOINT, (char *)shutdown_packet, SHUTDOWN_PACKETSIZE, ATCL_USB_TIMEOUT); + + if (ret <= 0) { + upslogx(LOG_NOTICE, "%s: first usb_interrupt_write() failed: %s", __func__, ret ? usb_strerror() : "timeout"); + } + + /* Totally guessing from the .pcap file here. TODO: configurable delay? */ + usleep(170*1000); + + ret = usb_interrupt_write(udev, SHUTDOWN_ENDPOINT, (char *)shutdown_packet, SHUTDOWN_PACKETSIZE, ATCL_USB_TIMEOUT); + + if (ret <= 0) { + upslogx(LOG_ERR, "%s: second usb_interrupt_write() failed: %s", __func__, ret ? usb_strerror() : "timeout"); + } + +} + +void upsdrv_help(void) +{ +} + +void upsdrv_makevartable(void) +{ + addvar(VAR_VALUE, "vendor", "USB vendor string (or NULL if none)"); +} diff --git a/drivers/nutdrv_qx.c b/drivers/nutdrv_qx.c index efde86e..f27e89b 100644 --- a/drivers/nutdrv_qx.c +++ b/drivers/nutdrv_qx.c @@ -33,7 +33,7 @@ * */ -#define DRIVER_VERSION "0.01" +#define DRIVER_VERSION "0.06" #include "main.h" @@ -66,17 +66,22 @@ #include "nutdrv_qx_megatec.h" #include "nutdrv_qx_megatec-old.h" #include "nutdrv_qx_mustek.h" +#include "nutdrv_qx_q1.h" #include "nutdrv_qx_voltronic.h" +#include "nutdrv_qx_voltronic-qs.h" #include "nutdrv_qx_zinto.h" /* Master list of avaiable subdrivers */ static subdriver_t *subdriver_list[] = { &voltronic_subdriver, + &voltronic_qs_subdriver, &mustek_subdriver, &megatec_old_subdriver, - &megatec_subdriver, &mecer_subdriver, + &megatec_subdriver, &zinto_subdriver, + /* Fallback Q1 subdriver */ + &q1_subdriver, NULL }; @@ -534,7 +539,7 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) static int ippon_command(const char *cmd, char *buf, size_t buflen) { char tmp[64]; - int ret; + int ret, len; size_t i; /* Send command */ @@ -562,10 +567,19 @@ static int ippon_command(const char *cmd, char *buf, size_t buflen) return ret; } - snprintf(buf, buflen, "%.*s", ret, tmp); - - upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); - return ret; + /* + * As Ippon will always return 64 bytes in response, we have to + * calculate and return length of actual response data here. + * Empty response will look like 0x00 0x0D, otherwise it will be + * data string terminated by 0x0D. + */ + len = (int)strcspn(tmp, "\r"); + upsdebugx(3, "read: %.*s", len, tmp); + if (len > 0) { + len ++; + } + snprintf(buf, buflen, "%.*s", len, tmp); + return len; } /* Krauler communication subdriver */ @@ -1759,7 +1773,9 @@ static int qx_command(const char *cmd, char *buf, size_t buflen) case -ETIMEDOUT: /* Connection timed out */ case -EOVERFLOW: /* Value too large for defined data type */ +#ifdef EPROTO case -EPROTO: /* Protocol error */ +#endif default: break; } diff --git a/drivers/nutdrv_qx.h b/drivers/nutdrv_qx.h index e42e9a0..b904689 100644 --- a/drivers/nutdrv_qx.h +++ b/drivers/nutdrv_qx.h @@ -45,7 +45,11 @@ #define DEFAULT_OFFDELAY "30" /* Delay before power off, in seconds */ #define DEFAULT_POLLFREQ 30 /* Polling interval between full updates, in seconds; the driver will do quick polls in the meantime */ +#ifndef TRUE typedef enum { FALSE, TRUE } bool_t; +#else +typedef int bool_t; +#endif /* Structure for rw vars */ typedef struct { diff --git a/drivers/nutdrv_qx_blazer-common.c b/drivers/nutdrv_qx_blazer-common.c index 950dfc8..1221778 100644 --- a/drivers/nutdrv_qx_blazer-common.c +++ b/drivers/nutdrv_qx_blazer-common.c @@ -1,4 +1,4 @@ -/* nutdrv_qx_blazer-common.c - Common functions/settings for nutdrv_qx_{mecer,megatec,megatec-old,mustek,zinto}.{c,h} +/* nutdrv_qx_blazer-common.c - Common functions/settings for nutdrv_qx_{mecer,megatec,megatec-old,mustek,q1,voltronic-qs,zinto}.{c,h} * * Copyright (C) * 2013 Daniele Pezzini @@ -88,6 +88,30 @@ int blazer_claim(void) { } +/* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. + * NOTE: this 'light' version only checks for status (Q1/QS/D/..) */ +int blazer_claim_light(void) { + + /* To tell whether the UPS is supported or not, we'll check just status (Q1/QS/D/..). */ + + item_t *item = find_nut_info("input.voltage", 0, 0); + + /* Don't know what happened */ + if (!item) + return 0; + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) + return 0; + + /* Unable to process value */ + if (ups_infoval_set(item) != 1) + return 0; + + return 1; + +} + /* Subdriver-specific flags/vars */ void blazer_makevartable(void) { diff --git a/drivers/nutdrv_qx_blazer-common.h b/drivers/nutdrv_qx_blazer-common.h index ec5fb5c..aee3864 100644 --- a/drivers/nutdrv_qx_blazer-common.h +++ b/drivers/nutdrv_qx_blazer-common.h @@ -1,4 +1,4 @@ -/* nutdrv_qx_blazer-common.h - Common functions/settings for nutdrv_qx_{mecer,megatec,megatec-old,mustek,zinto}.{c,h} +/* nutdrv_qx_blazer-common.h - Common functions/settings for nutdrv_qx_{mecer,megatec,megatec-old,mustek,q1,voltronic-qs,zinto}.{c,h} * * Copyright (C) * 2013 Daniele Pezzini @@ -28,6 +28,7 @@ void blazer_makevartable(void); void blazer_initups(item_t *qx2nut); int blazer_claim(void); +int blazer_claim_light(void); /* Preprocess functions */ int blazer_process_command(item_t *item, char *value, size_t valuelen); diff --git a/drivers/nutdrv_qx_mecer.c b/drivers/nutdrv_qx_mecer.c index a8299db..5160343 100644 --- a/drivers/nutdrv_qx_mecer.c +++ b/drivers/nutdrv_qx_mecer.c @@ -1,4 +1,4 @@ -/* nutdrv_qx_mecer.c - Subdriver for Mecer UPSes +/* nutdrv_qx_mecer.c - Subdriver for Mecer/Voltronic Power P98 UPSes * * Copyright (C) * 2013 Daniele Pezzini @@ -25,11 +25,29 @@ #include "nutdrv_qx_mecer.h" -#define MECER_VERSION "Mecer 0.01" +#define MECER_VERSION "Mecer 0.02" -/* qx2nut lookup table */ +/* Support functions */ +static int mecer_claim(void); +static void mecer_initups(void); + +/* Preprocess functions */ +static int voltronic_p98_protocol(item_t *item, char *value, size_t valuelen); +static int mecer_process_test_battery(item_t *item, char *value, size_t valuelen); + + +/* == qx2nut lookup table == */ static item_t mecer_qx2nut[] = { + /* Query UPS for protocol (Voltronic Power UPSes) + * > [QPI\r] + * < [(PI98\r] + * 012345 + * 0 + */ + + { "ups.firmware.aux", 0, NULL, "QPI\r", "", 6, '(', "", 1, 4, "%s", QX_FLAG_STATIC, voltronic_p98_protocol }, + /* * > [Q1\r] * < [(226.0 195.0 226.0 014 49.0 27.5 30.0 00001000\r] @@ -87,7 +105,7 @@ static item_t mecer_qx2nut[] = { { "shutdown.return", 0, NULL, "S%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, { "shutdown.stop", 0, NULL, "C\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start", 0, NULL, "T%02d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, + { "test.battery.start", 0, NULL, "T%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, mecer_process_test_battery }, { "test.battery.start.deep", 0, NULL, "TL\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, { "test.battery.start.quick", 0, NULL, "T\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, { "test.battery.stop", 0, NULL, "CT\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, @@ -100,10 +118,12 @@ static item_t mecer_qx2nut[] = { { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } }; -/* Testing table */ + +/* == Testing table == */ #ifdef TESTING static testing_t mecer_testing[] = { { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, + { "QPI\r", "(PI98\r" }, { "F\r", "#230.0 000 024.0 50.0\r" }, { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r" }, { "Q\r", "(ACK\r" }, @@ -119,6 +139,68 @@ static testing_t mecer_testing[] = { }; #endif /* TESTING */ + +/* == Support functions == */ + +/* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. */ +static int mecer_claim(void) +{ + + /* Apart from status (Q1), try to identify protocol (QPI, for Voltronic Power P98 units) or whether the UPS uses '(ACK\r'/'(NAK\r' replies */ + + item_t *item = find_nut_info("input.voltage", 0, 0); + + /* Don't know what happened */ + if (!item) + return 0; + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) + return 0; + + /* Unable to process value */ + if (ups_infoval_set(item) != 1) + return 0; + + /* UPS Protocol */ + item = find_nut_info("ups.firmware.aux", 0, 0); + + /* Don't know what happened */ + if (!item) { + dstate_delinfo("input.voltage"); + return 0; + } + + /* No reply/Unable to get value/Command rejected */ + if (qx_process(item, NULL)) { + + /* No reply/Command echoed back or rejected with something other than '(NAK\r' -> Not a '(ACK/(NAK' unit */ + if (!strlen(item->answer) || strcasecmp(item->answer, "(NAK\r")) { + dstate_delinfo("input.voltage"); + return 0; + } + + /* Command rejected with '(NAK\r' -> '(ACK/(NAK' unit */ + + /* Skip protocol query from now on */ + item->qxflags |= QX_FLAG_SKIP; + + } else { + + /* Unable to process value/Command echoed back or rejected with something other than '(NAK\r'/Protocol not supported */ + if (ups_infoval_set(item) != 1) { + dstate_delinfo("input.voltage"); + return 0; + } + + /* Voltronic Power P98 unit */ + + } + + return 1; + +} + /* Subdriver-specific initups */ static void mecer_initups(void) { @@ -127,10 +209,72 @@ static void mecer_initups(void) } -/* Subdriver interface */ + +/* == Preprocess functions == */ + +/* Protocol used by the UPS */ +static int voltronic_p98_protocol(item_t *item, char *value, size_t valuelen) +{ + if (strcasecmp(item->value, "PI98")) { + upslogx(LOG_ERR, "Protocol [%s] is not supported by this driver", item->value); + return -1; + } + + snprintf(value, valuelen, item->dfl, "Voltronic Power P98"); + + return 0; +} + +/* *CMD* Preprocess 'test.battery.start' instant command */ +static int mecer_process_test_battery(item_t *item, char *value, size_t valuelen) +{ + const char *protocol = dstate_getinfo("ups.firmware.aux"); + char buf[SMALLBUF] = ""; + int min, test_time; + + /* Voltronic P98 units -> Accepted values for test time: .2 -> .9 (.2=12sec ..), 01 -> 99 (minutes) -> range = [12..5940] */ + if (protocol && !strcasecmp(protocol, "Voltronic Power P98")) + min = 12; + /* Other units: 01 -> 99 (minutes) -> [60..5940] */ + else + min = 60; + + if (strlen(value) != strspn(value, "0123456789")) { + upslogx(LOG_ERR, "%s: non numerical value [%s]", item->info_type, value); + return -1; + } + + test_time = strlen(value) > 0 ? strtol(value, NULL, 10) : 600; + + if ((test_time < min) || (test_time > 5940)) { + upslogx(LOG_ERR, "%s: battery test time '%d' out of range [%d..5940] seconds", item->info_type, test_time, min); + return -1; + } + + /* test time < 1 minute */ + if (test_time < 60) { + + test_time = test_time / 6; + snprintf(buf, sizeof(buf), ".%d", test_time); + + /* test time > 1 minute */ + } else { + + test_time = test_time / 60; + snprintf(buf, sizeof(buf), "%02d", test_time); + + } + + snprintf(value, valuelen, item->command, buf); + + return 0; +} + + +/* == Subdriver interface == */ subdriver_t mecer_subdriver = { MECER_VERSION, - blazer_claim, + mecer_claim, mecer_qx2nut, mecer_initups, NULL, diff --git a/drivers/nutdrv_qx_mecer.h b/drivers/nutdrv_qx_mecer.h index 43cae1f..7ad2914 100644 --- a/drivers/nutdrv_qx_mecer.h +++ b/drivers/nutdrv_qx_mecer.h @@ -1,4 +1,4 @@ -/* nutdrv_qx_mecer.h - Subdriver for Mecer UPSes +/* nutdrv_qx_mecer.h - Subdriver for Mecer/Voltronic Power P98 UPSes * * Copyright (C) * 2013 Daniele Pezzini diff --git a/drivers/nutdrv_qx_megatec-old.c b/drivers/nutdrv_qx_megatec-old.c index 37372b2..73173de 100644 --- a/drivers/nutdrv_qx_megatec-old.c +++ b/drivers/nutdrv_qx_megatec-old.c @@ -25,7 +25,7 @@ #include "nutdrv_qx_megatec-old.h" -#define MEGATEC_OLD_VERSION "Megatec/old 0.01" +#define MEGATEC_OLD_VERSION "Megatec/old 0.02" /* qx2nut lookup table */ static item_t megatec_old_qx2nut[] = { @@ -128,7 +128,7 @@ static void megatec_old_initups(void) /* Subdriver interface */ subdriver_t megatec_old_subdriver = { MEGATEC_OLD_VERSION, - blazer_claim, + blazer_claim_light, megatec_old_qx2nut, megatec_old_initups, NULL, diff --git a/drivers/nutdrv_qx_mustek.c b/drivers/nutdrv_qx_mustek.c index ce85ccc..3bdee1a 100644 --- a/drivers/nutdrv_qx_mustek.c +++ b/drivers/nutdrv_qx_mustek.c @@ -25,7 +25,7 @@ #include "nutdrv_qx_mustek.h" -#define MUSTEK_VERSION "Mustek 0.01" +#define MUSTEK_VERSION "Mustek 0.02" /* qx2nut lookup table */ static item_t mustek_qx2nut[] = { @@ -128,7 +128,7 @@ static void mustek_initups(void) /* Subdriver interface */ subdriver_t mustek_subdriver = { MUSTEK_VERSION, - blazer_claim, + blazer_claim_light, mustek_qx2nut, mustek_initups, NULL, diff --git a/drivers/nutdrv_qx_q1.c b/drivers/nutdrv_qx_q1.c new file mode 100644 index 0000000..b201497 --- /dev/null +++ b/drivers/nutdrv_qx_q1.c @@ -0,0 +1,118 @@ +/* nutdrv_qx_q1.c - Subdriver for Q1 protocol based UPSes + * + * Copyright (C) + * 2013 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * NOTE: + * This subdriver implements the same protocol as the one used by the 'megatec' subdriver minus the vendor (I) and ratings (F) queries. + * In the claim function: + * - it doesn't even try to get 'vendor' informations (I) + * - it checks only status (Q1), through 'input.voltage' variable + * Therefore it should be able to work even if the UPS doesn't support vendor/ratings *and* the user doesn't use the 'novendor'/'norating' flags, as long as: + * - the UPS replies a Q1-compliant answer (i.e. not necessary filled with all of the Q1-required data, but at least of the right length and with not available data filled with some replacement character) + * - the UPS reports a valid input.voltage (used in the claim function) + * - the UPS reports valid status bits (1st, 2nd, 3rd, 6th, 7th are the mandatory ones) + * + */ + +#include "main.h" +#include "nutdrv_qx.h" +#include "nutdrv_qx_blazer-common.h" + +#include "nutdrv_qx_q1.h" + +#define Q1_VERSION "Q1 0.02" + +/* qx2nut lookup table */ +static item_t q1_qx2nut[] = { + + /* + * > [Q1\r] + * < [(226.0 195.0 226.0 014 49.0 27.5 30.0 00001000\r] + * 01234567890123456789012345678901234567890123456 + * 0 1 2 3 4 + */ + + { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, + { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, + { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, + { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, + { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, + { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, + { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + /* Status bits */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + + /* Instant commands */ + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + + /* Server-side settable vars */ + { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + + /* End of structure. */ + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } +}; + +/* Testing table */ +#ifdef TESTING +static testing_t q1_testing[] = { + { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, + { "Q\r", "" }, + { "S03\r", "" }, + { "C\r", "" }, + { "S02R0005\r", "" }, + { "S.5R0000\r", "" }, + { "T04\r", "" }, + { "TL\r", "" }, + { "T\r", "" }, + { "CT\r", "" }, + { NULL } +}; +#endif /* TESTING */ + +/* Subdriver interface */ +subdriver_t q1_subdriver = { + Q1_VERSION, + blazer_claim_light, + q1_qx2nut, + NULL, + NULL, + NULL, + "ACK", + NULL, +#ifdef TESTING + q1_testing, +#endif /* TESTING */ +}; diff --git a/drivers/nutdrv_qx_q1.h b/drivers/nutdrv_qx_q1.h new file mode 100644 index 0000000..bad2f13 --- /dev/null +++ b/drivers/nutdrv_qx_q1.h @@ -0,0 +1,39 @@ +/* nutdrv_qx_q1.h - Subdriver for Q1 protocol based UPSes + * + * Copyright (C) + * 2013 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * NOTE: + * This subdriver implements the same protocol as the one used by the 'megatec' subdriver minus the vendor (I) and ratings (F) queries. + * In the claim function: + * - it doesn't even try to get 'vendor' informations (I) + * - it checks only status (Q1), through 'input.voltage' variable + * Therefore it should be able to work even if the UPS doesn't support vendor/ratings *and* the user doesn't use the 'novendor'/'norating' flags, as long as: + * - the UPS replies a Q1-compliant answer (i.e. not necessary filled with all of the Q1-required data, but at least of the right length and with not available data filled with some replacement character) + * - the UPS reports a valid input.voltage (used in the claim function) + * - the UPS reports valid status bits (1st, 2nd, 3rd, 6th, 7th are the mandatory ones) + * + */ + +#ifndef NUTDRV_QX_Q1_H +#define NUTDRV_QX_Q1_H + +#include "nutdrv_qx.h" + +extern subdriver_t q1_subdriver; + +#endif /* NUTDRV_QX_Q1_H */ diff --git a/drivers/nutdrv_qx_voltronic-qs.c b/drivers/nutdrv_qx_voltronic-qs.c new file mode 100644 index 0000000..9b86999 --- /dev/null +++ b/drivers/nutdrv_qx_voltronic-qs.c @@ -0,0 +1,214 @@ +/* nutdrv_qx_voltronic-qs.c - Subdriver for Voltronic Power UPSes with QS protocol + * + * Copyright (C) + * 2013 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "main.h" +#include "nutdrv_qx.h" +#include "nutdrv_qx_blazer-common.h" + +#include "nutdrv_qx_voltronic-qs.h" + +#define VOLTRONIC_QS_VERSION "Voltronic-QS 0.01" + +/* Support functions */ +static int voltronic_qs_claim(void); + +/* Preprocess functions */ +static int voltronic_qs_protocol(item_t *item, char *value, size_t valuelen); + + +/* == Ranges == */ + +/* Range for ups.delay.start */ +static info_rw_t voltronic_qs_r_ondelay[] = { + { "60", 0 }, + { "599940", 0 }, + { "", 0 } +}; + +/* Range for ups.delay.shutdown */ +static info_rw_t voltronic_qs_r_offdelay[] = { + { "12", 0 }, + { "540", 0 }, + { "", 0 } +}; + + +/* == qx2nut lookup table == */ +static item_t voltronic_qs_qx2nut[] = { + + /* Query UPS for protocol + * > [M\r] + * < [V\r] + * 01 + * 0 + */ + + { "ups.firmware.aux", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%s", QX_FLAG_STATIC, voltronic_qs_protocol }, + + /* Query UPS for status + * > [QS\r] + * < [(226.0 195.0 226.0 014 49.0 27.5 30.0 00001000\r] + * 01234567890123456789012345678901234567890123456 + * 0 1 2 3 4 + */ + + { "input.voltage", 0, NULL, "QS\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, + { "input.voltage.fault", 0, NULL, "QS\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, + { "output.voltage", 0, NULL, "QS\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, + { "ups.load", 0, NULL, "QS\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, + { "input.frequency", 0, NULL, "QS\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, + { "battery.voltage", 0, NULL, "QS\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, + { "ups.temperature", 0, NULL, "QS\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + /* Status bits */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "QS\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "QS\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + + /* Query UPS for ratings + * > [F\r] + * < [#220.0 000 024.0 50.0\r] + * 0123456789012345678901 + * 0 1 2 + */ + + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL }, + + /* Instant commands */ + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + + /* Server-side settable vars */ + { "ups.delay.start", ST_FLAG_RW, voltronic_qs_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, voltronic_qs_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + + /* End of structure. */ + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } +}; + + +/* == Testing table == */ +#ifdef TESTING +static testing_t voltronic_qs_testing[] = { + { "QS\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, + { "F\r", "#230.0 000 024.0 50.0\r" }, + { "M\r", "V\r" }, + { "Q\r", "" }, + { "C\r", "" }, + { "S02R0005\r", "" }, + { "S.5R0000\r", "" }, + { "T\r", "" }, + { NULL } +}; +#endif /* TESTING */ + + +/* == Support functions == */ + +/* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. */ +static int voltronic_qs_claim(void) +{ + + /* We need at least M and QS to run this subdriver */ + + /* UPS Protocol */ + item_t *item = find_nut_info("ups.firmware.aux", 0, 0); + + /* Don't know what happened */ + if (!item) + return 0; + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) + return 0; + + /* Unable to process value/Protocol not supported */ + if (ups_infoval_set(item) != 1) + return 0; + + item = find_nut_info("input.voltage", 0, 0); + + /* Don't know what happened */ + if (!item) { + dstate_delinfo("ups.firmware.aux"); + return 0; + } + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) { + dstate_delinfo("ups.firmware.aux"); + return 0; + } + + /* Unable to process value */ + if (ups_infoval_set(item) != 1) { + dstate_delinfo("ups.firmware.aux"); + return 0; + } + + return 1; + +} + + +/* == Preprocess functions == */ + +/* Protocol used by the UPS */ +static int voltronic_qs_protocol(item_t *item, char *value, size_t valuelen) +{ + if (strcasecmp(item->value, "V")) { + upsdebugx(2, "%s: invalid protocol [%s]", __func__, item->value); + return -1; + } + + snprintf(value, valuelen, item->dfl, "PMV"); + + return 0; +} + + +/* == Subdriver interface == */ +subdriver_t voltronic_qs_subdriver = { + VOLTRONIC_QS_VERSION, + voltronic_qs_claim, + voltronic_qs_qx2nut, + NULL, + NULL, + NULL, + "ACK", + "(NAK\r", +#ifdef TESTING + voltronic_qs_testing, +#endif /* TESTING */ +}; diff --git a/drivers/nutdrv_qx_voltronic-qs.h b/drivers/nutdrv_qx_voltronic-qs.h new file mode 100644 index 0000000..ac9f39b --- /dev/null +++ b/drivers/nutdrv_qx_voltronic-qs.h @@ -0,0 +1,29 @@ +/* nutdrv_qx_voltronic-qs.h - Subdriver for Voltronic Power UPSes with QS protocol + * + * Copyright (C) + * 2013 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef NUTDRV_QX_VOLTRONIC_QS_H +#define NUTDRV_QX_VOLTRONIC_QS_H + +#include "nutdrv_qx.h" + +extern subdriver_t voltronic_qs_subdriver; + +#endif /* NUTDRV_QX_VOLTRONIC_QS_H */ diff --git a/drivers/powercom.c b/drivers/powercom.c index 82e4898..62d8683 100644 --- a/drivers/powercom.c +++ b/drivers/powercom.c @@ -6,8 +6,10 @@ * See http://www.advice.co.il/product/inter/ups.html for its specifications. * This model is based on PowerCom (www.powercom.com) models. * -Socomec Sicon Egys 420 + * -OptiUPS VS 575C * * Copyrights: + * (C) 2013 Florian Bruhin * (C) 2002 Simon Rozman * (C) 1999 Peter Bieringer * @@ -58,6 +60,10 @@ * * Tested on: BNT-1500A * + * rev 0.14: Florian Bruhin (The Compiler) + * - Added support for OptiUPS VS 575C + * This probably also works with others, but I don't have their model numbers. + * */ #include "main.h" @@ -66,7 +72,7 @@ #include "math.h" #define DRIVER_NAME "PowerCom protocol UPS driver" -#define DRIVER_VERSION "0.13" +#define DRIVER_VERSION "0.14" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -74,7 +80,8 @@ upsdrv_info_t upsdrv_info = { DRIVER_VERSION, "Simon Rozman \n" \ "Peter Bieringer \n" \ - "Alexey Sidorov ", + "Alexey Sidorov \n" \ + "Florian Bruhin ", DRV_STABLE, { NULL } }; @@ -199,6 +206,17 @@ static struct type types[] = { { 1.0000, 0.0000, 0.0000, 1.0000, 0.0000 }, { 2.0000, 0.0000, 2.0000, 0.0000 }, }, + { + "OPTI", + 16, + { "no_flow_control", no_flow_control }, + { { 5U, 0xFFU }, { 7U, 0U }, { 8U, 0U } }, + { { 1U, 30U }, 'y' }, + { 0.0000, 0.0000 }, + { 1.0000, 0.0000, 1.0000, 0.0000 }, + { 1.0000, 0.0000, 0.0000, 1.0000, 0.0000 }, + { 2.0000, 0.0000, 2.0000, 0.0000 }, + }, }; /* values for sending to UPS */ @@ -249,6 +267,7 @@ unsigned int voltages[]={100,110,115,120,0,0,0,200,220,230,240,0,0,0,0,0}; unsigned int BNTmodels[]={0,400,500,600,800,801,1000,1200,1500,2000,0,0,0,0,0,0}; unsigned int KINmodels[]={0,425,500,525,625,800,1000,1200,1500,1600,2200,2200,2500,3000,5000,0}; unsigned int IMPmodels[]={0,425,525,625,825,1025,1200,1500,2000,0,0,0,0,0,0,0}; +unsigned int OPTImodels[]={0,0,0,575,0,0,0,0,0,0,0,0,0,0,0,0}; /* * local used functions @@ -398,7 +417,7 @@ static float input_voltage(void) } else { tmp=1.625*raw_data[INPUT_VOLTAGE]; } - } else if ( !strcmp(types[type].name, "IMP")) { + } else if ( !strcmp(types[type].name, "IMP") || !strcmp(types[type].name, "OPTI")) { tmp=raw_data[INPUT_VOLTAGE]*2.0; } else { tmp=linevoltage >= 220 ? @@ -489,7 +508,7 @@ static float output_voltage(void) tmp=sqrt(tmp)*rdatay; } } - } else if ( !strcmp(types[type].name, "IMP")) { + } else if ( !strcmp(types[type].name, "IMP") || !strcmp(types[type].name, "OPTI")) { tmp=raw_data[OUTPUT_VOLTAGE]*2.0; } else { tmp= linevoltage >= 220 ? @@ -506,7 +525,7 @@ static float input_freq(void) { if ( !strcmp(types[type].name, "BNT") || !strcmp(types[type].name, "KIN")) return 4807.0/raw_data[INPUT_FREQUENCY]; - else if ( !strcmp(types[type].name, "IMP")) + else if ( !strcmp(types[type].name, "IMP") || !strcmp(types[type].name, "OPTI")) return raw_data[INPUT_FREQUENCY]; return raw_data[INPUT_FREQUENCY] ? 1.0 / (types[type].freq[0] * @@ -518,7 +537,7 @@ static float output_freq(void) { if ( !strcmp(types[type].name, "BNT") || !strcmp(types[type].name, "KIN")) return 4807.0/raw_data[OUTPUT_FREQUENCY]; - else if ( !strcmp(types[type].name, "IMP")) + else if ( !strcmp(types[type].name, "IMP") || !strcmp(types[type].name, "OPTI")) return raw_data[OUTPUT_FREQUENCY]; return raw_data[OUTPUT_FREQUENCY] ? 1.0 / (types[type].freq[0] * @@ -588,7 +607,7 @@ static float load_level(void) if (model<2000) return raw_data[UPS_LOAD]*1.66; if (model>=2000) return raw_data[UPS_LOAD]*110.0/load2ki[voltage]; } - } else if ( !strcmp(types[type].name, "IMP")) { + } else if ( !strcmp(types[type].name, "IMP") || !strcmp(types[type].name, "OPTI")) { return raw_data[UPS_LOAD]; } return raw_data[STATUS_A] & MAINS_FAILURE ? @@ -644,7 +663,7 @@ static float batt_level(void) return 30.0+(battval-bat29)*70.0/(bat100-bat29); return 100; } - if ( !strcmp(types[type].name, "IMP")) + if ( !strcmp(types[type].name, "IMP") || !strcmp(types[type].name, "OPTI")) return raw_data[BATTERY_CHARGE]; return raw_data[STATUS_A] & ONLINE ? /* Are we on battery power? */ /* Yes */ @@ -885,10 +904,10 @@ void upsdrv_initups(void) types[type].flowControl.setup_flow_control(); /* Setup Model and LineVoltage */ - if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP")){ + if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP") || !strcmp(types[type].name, "OPTI")) { if (!ups_getinfo()) return; /* Give "BNT-other" a chance! */ - if (raw_data[MODELNAME]==0x42 || raw_data[MODELNAME]==0x4B){ + if (raw_data[MODELNAME]==0x42 || raw_data[MODELNAME]==0x4B || raw_data[MODELNAME]==0x4F){ model=BNTmodels[raw_data[MODELNUMBER]/16]; if (!strcmp(types[type].name, "BNT-other")) types[type].name="BNT-other"; @@ -897,6 +916,9 @@ void upsdrv_initups(void) else if (raw_data[MODELNAME]==0x4B){ types[type].name="KIN"; model=KINmodels[raw_data[MODELNUMBER]/16]; + } else if (raw_data[MODELNAME]==0x4F){ + types[type].name="OPTI"; + model=OPTImodels[raw_data[MODELNUMBER]/16]; } } else if (raw_data[UPSVERSION]==0xFF){ @@ -904,7 +926,11 @@ void upsdrv_initups(void) model=IMPmodels[raw_data[MODELNUMBER]/16]; } linevoltage=voltages[raw_data[MODELNUMBER]%16]; - snprintf(buf,sizeof(buf),"%s-%dAP",types[type].name,model); + if (!strcmp(types[type].name, "OPTI")) { + snprintf(buf,sizeof(buf),"%s-%d",types[type].name,model); + } else { + snprintf(buf,sizeof(buf),"%s-%dAP",types[type].name,model); + } if (!strcmp(modelname, "Unknown")) modelname=buf; upsdebugx(1,"Detected: %s , %dV",buf,linevoltage); @@ -962,7 +988,7 @@ void upsdrv_help(void) printf("\n"); printf("Specify UPS information in the ups.conf file.\n"); printf(" type: Type of UPS: 'Trust','Egys','KP625AP','IMP','KIN','BNT',\n"); - printf(" 'BNT-other' (default: 'Trust')\n"); + printf(" 'BNT-other', 'OPTI' (default: 'Trust')\n"); printf(" 'BNT-other' is a special type intended for BNT 100-120V models,\n"); printf(" but can be used to override ALL models.\n"); printf("You can additional specify these variables:\n"); @@ -1042,7 +1068,7 @@ void upsdrv_makevartable(void) // 1 2 3 4 5 6 7 8 //2345678901234567890123456789012345678901234567890123456789012345678901234567890 MAX addvar(VAR_VALUE, "type", - "Type of UPS: 'Trust','Egys','KP625AP','IMP','KIN','BNT','BNT-other'\n" + "Type of UPS: 'Trust','Egys','KP625AP','IMP','KIN','BNT','BNT-other','OPTI'\n" " (default: 'Trust')"); addvar(VAR_VALUE, "manufacturer", "Manufacturer name (default: 'PowerCom')"); diff --git a/drivers/riello_usb.c b/drivers/riello_usb.c index 799fb44..89909da 100644 --- a/drivers/riello_usb.c +++ b/drivers/riello_usb.c @@ -355,7 +355,9 @@ int riello_command(uint8_t *cmd, uint8_t *buf, uint16_t length, uint16_t buflen) case -ETIMEDOUT: /* Connection timed out */ case -EOVERFLOW: /* Value too large for defined data type */ +#ifdef EPROTO case -EPROTO: /* Protocol error */ +#endif default: break; } diff --git a/drivers/snmp-ups.c b/drivers/snmp-ups.c index 514c699..e99615d 100644 --- a/drivers/snmp-ups.c +++ b/drivers/snmp-ups.c @@ -3,7 +3,7 @@ * Based on NetSNMP API (Simple Network Management Protocol V1-2) * * Copyright (C) - * 2002 - 2012 Arnaud Quette + * 2002 - 2014 Arnaud Quette * 2002 - 2006 Dmitry Frolov * J.W. Hoogervorst * Niels Baggesen @@ -49,6 +49,7 @@ #include "cyberpower-mib.h" #include "delta_ups-mib.h" #include "ietf-mib.h" +#include "xppc-mib.h" /* Address API change */ #ifndef usmAESPrivProtocol @@ -71,6 +72,7 @@ static mib2nut_info_t *mib2nut[] = { &bestpower, &cyberpower, &delta_ups, + &xppc, /* * Prepend vendor specific MIB mappings before IETF, so that * if a device supports both IETF and vendor specific MIB, @@ -98,7 +100,7 @@ const char *mibvers; static void disable_transfer_oids(void); #define DRIVER_NAME "Generic SNMP UPS driver" -#define DRIVER_VERSION "0.70" +#define DRIVER_VERSION "0.72" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -586,6 +588,9 @@ struct snmp_pdu *nut_snmp_get(const char *OID) struct snmp_pdu ** pdu_array; struct snmp_pdu * ret_pdu; + if (OID == NULL) + return NULL; + upsdebugx(3, "nut_snmp_get(%s)", OID); pdu_array = nut_snmp_walk(OID,1); diff --git a/drivers/upsdrvctl.c b/drivers/upsdrvctl.c index 623f753..0cdaa2c 100644 --- a/drivers/upsdrvctl.c +++ b/drivers/upsdrvctl.c @@ -45,6 +45,12 @@ static int maxsdorder = 0, testmode = 0, exec_error = 0; /* timer - keeps us from getting stuck if a driver hangs */ static int maxstartdelay = 45; + /* counter - retry that many time(s) to start the driver if it fails to */ +static int maxretry = 1; + + /* timer - delay between each restart attempt of the driver(s) */ +static int retrydelay = 5; + /* Directory where driver executables live */ static char *driverpath = NULL; @@ -65,6 +71,12 @@ void do_upsconf_args(char *upsname, char *var, char *val) driverpath = xstrdup(val); } + if (!strcmp(var, "maxretry")) + maxretry = atoi(val); + + if (!strcmp(var, "retrydelay")) + retrydelay = atoi(val); + /* ignore anything else - it's probably for main */ return; @@ -248,6 +260,7 @@ static void start_driver(const ups_t *ups) char *argv[8]; char dfn[SMALLBUF]; int ret, arg = 0; + int initial_exec_error = exec_error, drv_maxretry = maxretry; struct stat fs; upsdebugx(1, "Starting UPS: %s", ups->upsname); @@ -276,10 +289,28 @@ static void start_driver(const ups_t *ups) /* tie it off */ argv[arg++] = NULL; - debugcmdline(2, "exec: ", argv); - if (!testmode) { - forkexec(argv, ups); + while (drv_maxretry > 0) { + int cur_exec_error = exec_error; + + upsdebugx(2, "%i remaining attempts", drv_maxretry); + debugcmdline(2, "exec: ", argv); + drv_maxretry--; + + if (!testmode) { + forkexec(argv, ups); + } + + /* driver command succeeded */ + if (cur_exec_error == exec_error) { + drv_maxretry = 0; + exec_error = initial_exec_error; + } + else { + /* otherwise, retry if still needed */ + if (drv_maxretry > 0) + sleep (retrydelay); + } } } diff --git a/drivers/usb-common.h b/drivers/usb-common.h index e160e76..ad08172 100644 --- a/drivers/usb-common.h +++ b/drivers/usb-common.h @@ -25,6 +25,9 @@ #include #include +/* USB standard timeout [ms] */ +#define USB_TIMEOUT 5000 + /*! * USBDevice_t: Describe a USB device. This structure contains exactly * the 5 pieces of information by which a USB device identifies diff --git a/drivers/usbhid-ups.c b/drivers/usbhid-ups.c index fcf628d..cdfbad7 100644 --- a/drivers/usbhid-ups.c +++ b/drivers/usbhid-ups.c @@ -1269,7 +1269,9 @@ static bool_t hid_ups_walk(walkmode_t mode) case -ETIMEDOUT: /* Connection timed out */ case -EOVERFLOW: /* Value too large for defined data type */ +#ifdef EPROTO case -EPROTO: /* Protocol error */ +#endif case -EPIPE: /* Broken pipe */ default: /* Don't know what happened, try again later... */ diff --git a/drivers/xppc-mib.c b/drivers/xppc-mib.c new file mode 100644 index 0000000..4562cd4 --- /dev/null +++ b/drivers/xppc-mib.c @@ -0,0 +1,126 @@ +/* xppc-mib.c - subdriver to monitor XPPC SNMP devices with NUT + * + * Copyright (C) + * 2011 - 2012 Arnaud Quette + * 2014 Charles Lepple + * + * Note: this subdriver was initially generated as a "stub" by the + * scripts/subdriver/gen-snmp-subdriver.sh script. + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "xppc-mib.h" + +#define XPPC_MIB_VERSION "0.2" + +#define XPPC_SYSOID ".1.3.6.1.4.1.935" + +/* To create a value lookup structure (as needed on the 2nd line of the example + * below), use the following kind of declaration, outside of the present snmp_info_t[]: + * static info_lkp_t onbatt_info[] = { + * { 1, "OB" }, + * { 2, "OL" }, + * { 0, "NULL" } + * }; + */ + +/* upsBaseBatteryStatus */ +static info_lkp_t xpcc_onbatt_info[] = { + { 1, "" }, /* unknown */ + { 2, "" }, /* batteryNormal */ + { 3, "LB" } /* batteryLow */ +}; + +/* +upsBaseOutputStatus OBJECT-TYPE + SYNTAX INTEGER { + unknown(1), + onLine(2), + onBattery(3), + onBoost(4), + sleeping(5), + onBypass(6), + rebooting(7), + standBy(8), + onBuck(9) } +*/ +static info_lkp_t xpcc_power_info[] = { + { 1, "" }, /* unknown */ + { 2, "OL" }, /* onLine */ + { 3, "OB" }, /* onBattery */ + { 4, "OL BOOST" }, /* onBoost */ + { 5, "OFF" }, /* sleeping */ + { 6, "BYPASS"}, /* onBypass */ + { 7, "" }, /* rebooting */ + { 8, "OFF" }, /* standBy */ + { 9, "OL TRIM"} /* onBuck */ +}; + +/* XPPC Snmp2NUT lookup table */ +static snmp_info_t xppc_mib[] = { + + /* Data format: + * { info_type, info_flags, info_len, OID, dfl, flags, oid2info, setvar }, + * + * info_type: NUT INFO_ or CMD_ element name + * info_flags: flags to set in addinfo + * info_len: length of strings if STR + * cmd value if CMD, multiplier otherwise + * OID: SNMP OID or NULL + * dfl: default value + * flags: snmp-ups internal flags (FIXME: ...) + * oid2info: lookup table between OID and NUT values + * setvar: variable to set for SU_FLAG_SETINT + * + * Example: + * { "input.voltage", 0, 0.1, ".1.3.6.1.4.1.705.1.6.2.1.2.1", "", SU_INPUT_1, NULL }, + * { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.705.1.7.3.0", "", SU_FLAG_OK | SU_STATUS_BATT, onbatt_info }, + * + * To create a value lookup structure (as needed on the 2nd line), use the + * following kind of declaration, outside of the present snmp_info_t[]: + * static info_lkp_t onbatt_info[] = { + * { 1, "OB" }, + * { 2, "OL" }, + * { 0, "NULL" } + * }; + */ + { "ups.mfr", ST_FLAG_STRING, SU_INFOSIZE, NULL, "Tripp Lite / Phoenixtec", + SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL }, + + /* upsBaseIdentModel.0 = STRING: "Intelligent" */ + { "ups.model", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.935.1.1.1.1.1.1.0", "Generic Phoenixtec SNMP device", SU_FLAG_OK, NULL }, + /* upsBaseBatteryStatus.0 = INTEGER: batteryNormal(2) */ + { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.935.1.1.1.2.1.1.0", "", SU_STATUS_BATT | SU_TYPE_INT | SU_FLAG_OK, xpcc_onbatt_info }, + /* upsSmartBatteryCapacity.0 = INTEGER: 100 */ + { "battery.charge", 0, 1, ".1.3.6.1.4.1.935.1.1.1.2.2.1.0", NULL, SU_TYPE_INT | SU_FLAG_OK, NULL }, + /* upsSmartBatteryTemperature.0 = INTEGER: 260 */ + { "ups.temperature", 0, 0.1, ".1.3.6.1.4.1.935.1.1.1.2.2.3.0", NULL, SU_TYPE_INT | SU_FLAG_OK, NULL }, + /* upsSmartInputLineVoltage.0 = INTEGER: 1998 */ + { "input.voltage", 0, 0.1, ".1.3.6.1.4.1.935.1.1.1.3.2.1.0", NULL, SU_TYPE_INT | SU_FLAG_OK, NULL }, + /* upsBaseOutputStatus.0 = INTEGER: onLine(2) */ + { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.935.1.1.1.4.1.1.0", "", SU_TYPE_INT | SU_STATUS_PWR, xpcc_power_info }, + /* upsSmartOutputVoltage.0 = INTEGER: 2309 */ + { "output.voltage", 0, 0.1, ".1.3.6.1.4.1.935.1.1.1.4.2.1.0", NULL, SU_TYPE_INT | SU_FLAG_OK, NULL }, + /* upsSmartOutputFrequency.0 = INTEGER: 500 */ + { "output.frequency", 0, 0.1, ".1.3.6.1.4.1.935.1.1.1.4.2.2.0", NULL, SU_TYPE_INT | SU_FLAG_OK, NULL }, + /* upsSmartOutputLoad.0 = INTEGER: 7 */ + { "ups.load", 0, 1, ".1.3.6.1.4.1.935.1.1.1.4.2.3.0", NULL, SU_TYPE_INT | SU_FLAG_OK, NULL }, + + /* end of structure. */ + { NULL, 0, 0, NULL, NULL, 0, NULL } +}; + +mib2nut_info_t xppc = { "xppc", XPPC_MIB_VERSION, NULL, NULL, xppc_mib, XPPC_SYSOID }; diff --git a/drivers/xppc-mib.h b/drivers/xppc-mib.h new file mode 100644 index 0000000..e2a360b --- /dev/null +++ b/drivers/xppc-mib.h @@ -0,0 +1,29 @@ +/* xppc-mib.h - subdriver to monitor XPPC SNMP devices with NUT + * + * Copyright (C) + * 2011 - 2012 Arnaud Quette + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef XPPC_MIB_H +#define XPPC_MIB_H + +#include "main.h" +#include "snmp-ups.h" + +extern mib2nut_info_t xppc; + +#endif /* XPPC_MIB_H */ diff --git a/include/Makefile.in b/include/Makefile.in index cc95d61..bd75cae 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -65,7 +65,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -75,10 +74,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -138,10 +136,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -153,8 +147,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -240,6 +232,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/include/config.h.in b/include/config.h.in index 7e8db11..f255496 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -1,4 +1,4 @@ -/* include/config.h.in. Generated from configure.in by autoheader. */ +/* include/config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD @@ -30,9 +30,6 @@ MSVC and with C++ compilers. */ #undef FLEXIBLE_ARRAY_MEMBER -/* addons run as user */ -#undef HAL_USER - /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT @@ -54,9 +51,6 @@ /* Define to 1 if C supports variable-length arrays. */ #undef HAVE_C_VARARRAYS -/* Define to 1 if you have the header file. */ -#undef HAVE_DBUS_DBUS_GLIB_H - /* Define to 1 if you have the declaration of `LOG_UPTO', and to 0 if you don't. */ #undef HAVE_DECL_LOG_UPTO @@ -116,12 +110,6 @@ /* Define to 1 if you have the `getpassphrase' function. */ #undef HAVE_GETPASSPHRASE -/* Define to 1 if you have the header file. */ -#undef HAVE_GLIB_H - -/* Define to 1 if you have the `g_timeout_add_seconds' function. */ -#undef HAVE_G_TIMEOUT_ADD_SECONDS - /* Define to 1 if you have the `init_snmp' function. */ #undef HAVE_INIT_SNMP @@ -134,12 +122,6 @@ /* Define if you have Boutell's libgd installed */ #undef HAVE_LIBGD -/* Define to 1 if you have the `libhal_device_new_changeset' function. */ -#undef HAVE_LIBHAL_DEVICE_NEW_CHANGESET - -/* Define to 1 if you have the header file. */ -#undef HAVE_LIBHAL_H - /* Define to enable libltdl support */ #undef HAVE_LIBLTDL @@ -391,9 +373,6 @@ /* Define to enable IPMI support using FreeIPMI */ #undef WITH_FREEIPMI -/* Define to enable HAL support */ -#undef WITH_HAL - /* Define to enable IPMI support */ #undef WITH_IPMI diff --git a/lib/Makefile.in b/lib/Makefile.in index a8296b1..0480c02 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -69,7 +69,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -79,10 +78,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -170,10 +168,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -185,8 +179,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -272,6 +264,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/m4/nut_check_libhal.m4 b/m4/nut_check_libhal.m4 deleted file mode 100644 index ec54068..0000000 --- a/m4/nut_check_libhal.m4 +++ /dev/null @@ -1,81 +0,0 @@ -dnl Check for LIBHAL compiler flags. On success, set nut_have_libhal="yes" -dnl and set LIBHAL_CFLAGS and LIBHAL_LIBS. On failure, set -dnl nut_have_libhal="no". This macro can be run multiple times, but will -dnl do the checking only once. -dnl NUT requires HAL version 0.5.8 at least - -AC_DEFUN([NUT_CHECK_LIBHAL], -[ -if test -z "${nut_have_libhal_seen}"; then - nut_have_libhal_seen=yes - - CFLAGS_ORIG="${CFLAGS}" - LIBS_ORIG="${LIBS}" - - AC_MSG_CHECKING(for libhal version via pkg-config (0.5.8 minimum required)) - HAL_VERSION="`pkg-config --silence-errors --modversion hal 2>/dev/null`" - if test "$?" != "0" -o -z "${HAL_VERSION}"; then - AC_MSG_RESULT(none found) - elif pkg-config --silence-errors --atleast-version=0.5.8 hal 2>/dev/null; then - AC_MSG_RESULT(${HAL_VERSION} found) - else - AC_MSG_WARN(${HAL_VERSION} is too old) - fi - - AC_MSG_CHECKING(for libhal cflags) - AC_ARG_WITH(hal-includes, - AS_HELP_STRING([@<:@--with-hal-includes=CFLAGS@:>@], [include flags for the HAL library]), - [ - case "${withval}" in - yes|no) - AC_MSG_ERROR(invalid option --with(out)-hal-includes - see docs/configure.txt) - ;; - *) - CFLAGS="${withval}" - ;; - esac - ], [ - dnl also get cflags from glib-2.0 to workaround a bug in dbus-glib - CFLAGS="`pkg-config --silence-errors --cflags hal dbus-glib-1 2>/dev/null`" - if test "$?" != "0"; then - CFLAGS="-DDBUS_API_SUBJECT_TO_CHANGE -I/usr/include/hal -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include" - fi - ]) - AC_MSG_RESULT([${CFLAGS}]) - - AC_MSG_CHECKING(for libhal ldflags) - AC_ARG_WITH(hal-libs, - AS_HELP_STRING([@<:@--with-hal-libs=LIBS@:>@], [linker flags for the HAL library]), - [ - case "${withval}" in - yes|no) - AC_MSG_ERROR(invalid option --with(out)-hal-libs - see docs/configure.txt) - ;; - *) - LIBS="${withval}" - ;; - esac - ], [ - dnl also get libs from glib-2.0 to workaround a bug in dbus-glib - LIBS="`pkg-config --silence-errors --libs hal dbus-glib-1 2>/dev/null`" - if test "$?" != "0"; then - LIBS="-lhal -ldbus-1 -lpthread" - fi - ]) - AC_MSG_RESULT([${LIBS}]) - - dnl check if HAL is usable - AC_CHECK_HEADERS(libhal.h, [nut_have_libhal=yes], [nut_have_libhal=no], [AC_INCLUDES_DEFAULT]) - AC_CHECK_HEADERS(glib.h dbus/dbus-glib.h, [], [nut_have_libhal=no], [AC_INCLUDES_DEFAULT]) - AC_CHECK_FUNCS(libhal_device_new_changeset, [], [nut_have_libhal=no]) - - if test "${nut_have_libhal}" = "yes"; then - AC_CHECK_FUNCS(g_timeout_add_seconds) - LIBHAL_CFLAGS="${CFLAGS}" - LIBHAL_LIBS="${LIBS}" - fi - - CFLAGS="${CFLAGS_ORIG}" - LIBS="${LIBS_ORIG}" -fi -]) diff --git a/m4/nut_config_libhal.m4 b/m4/nut_config_libhal.m4 deleted file mode 100644 index 23f6192..0000000 --- a/m4/nut_config_libhal.m4 +++ /dev/null @@ -1,102 +0,0 @@ -dnl Check for LIBHAL configuration if support for HAL was found. -dnl This keeps compile and link time options separate from runtime -dnl configuration items. This macro can be run multiple times, but -dnl will do the checking only once. - -AC_DEFUN([NUT_CONFIG_LIBHAL], -[ -if test -z "${nut_have_config_libhal_seen}" -a "${nut_have_libhal}" = "yes"; then - nut_have_config_libhal_seen=yes - - AC_REQUIRE([NUT_CHECK_LIBHAL]) - - AC_MSG_CHECKING(for libhal user) - AC_ARG_WITH(hal-user, - AS_HELP_STRING([@<:@--with-hal-user=USER@:>@], [addons run as user]), - [ - case "${withval}" in - yes|no) - AC_MSG_ERROR(invalid option --with(out)-hal-user - see docs/configure.txt) - ;; - *) - HAL_USER="${withval}" - ;; - esac - ], [ - dnl this will only work as of HAL 0.5.9 - HAL_USER="`pkg-config --silence-errors --variable=haluser hal 2>/dev/null`" - if test "$?" != "0" -o -z "${HAL_USER}"; then - HAL_USER="haldaemon" - fi - ]) - AC_MSG_RESULT(${HAL_USER}) - AC_DEFINE_UNQUOTED(HAL_USER, "${HAL_USER}", [addons run as user]) - - AC_MSG_CHECKING(for libhal device match key) - AC_ARG_WITH(hal-device-match-key, - AS_HELP_STRING([@<:@--with-hal-device-match-key=KEY@:>@], [device match key]), - [ - case "${withval}" in - yes|no) - AC_MSG_ERROR(invalid option --with(out)-hal-device-match-key - see docs/configure.txt) - ;; - *) - HAL_DEVICE_MATCH_KEY="${withval}" - ;; - esac - ], [ - dnl the device match key changed with HAL 0.5.11 - if pkg-config --silence-errors --atleast-version=0.5.11 hal 2>/dev/null; then - HAL_DEVICE_MATCH_KEY="info.bus" - else - HAL_DEVICE_MATCH_KEY="info.subsystem" - fi - ]) - AC_MSG_RESULT(${HAL_DEVICE_MATCH_KEY}) - - AC_MSG_CHECKING(for libhal Callouts path) - AC_ARG_WITH(hal-callouts-path, - AS_HELP_STRING([@<:@--with-hal-callouts-path=PATH@:>@], [installation path for callouts]), - [ - case "${withval}" in - yes|no) - AC_MSG_ERROR(invalid option --with(out)-hal-callouts-path - see docs/configure.txt) - ;; - *) - HAL_CALLOUTS_PATH="${withval}" - ;; - esac - ], [ - dnl Determine installation path for callouts - dnl As per HAL spec, §5 Callouts addon install path: $libdir/hal - HAL_CALLOUTS_PATH="`pkg-config --silence-errors --variable=libexecdir hal 2>/dev/null`" - if test "$?" != "0" -o -z "${HAL_CALLOUTS_PATH}"; then - HAL_CALLOUTS_PATH="${libdir}/hal" - fi - ]) - AC_MSG_RESULT(${HAL_CALLOUTS_PATH}) - - AC_MSG_CHECKING(for libhal Device Information path) - AC_ARG_WITH(hal-fdi-path, - AS_HELP_STRING([@<:@--with-hal-fdi-path=PATH@:>@], [installation path for device information files]), - [ - case "${withval}" in - yes|no) - AC_MSG_ERROR(invalid option --with(out)-hal-fdi-path - see docs/configure.txt) - ;; - *) - HAL_FDI_PATH="${withval}" - ;; - esac - ], [ - dnl Determine installation path for .fdi - dnl As per HAL spec, §2 Device Information Files - dnl fdi install path: $datarootdir/hal/fdi/information/20thirdparty - HAL_FDI_PATH="`pkg-config --silence-errors --variable=hal_fdidir hal 2>/dev/null`" - if test "$?" != "0" -o -z "${HAL_FDI_PATH}"; then - HAL_FDI_PATH="${datarootdir}/hal/fdi/information/20thirdparty" - fi - ]) - AC_MSG_RESULT(${HAL_FDI_PATH}) -fi -]) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index b6dde24..8e84e24 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -1,27 +1,28 @@ EXTRA_DIST = README \ -avahi/nut.service.in \ -HP-UX/nut-drvctl \ -HP-UX/nut-drvctl.sh \ -HP-UX/nut-upsd \ -HP-UX/nut-upsd.sh \ -HP-UX/nut-upsmon \ -HP-UX/nut-upsmon.sh \ -logrotate/nutlogd \ -misc/nut.bash_completion \ -misc/osd-notify \ -perl/Nut.pm \ -RedHat/halt.patch \ -RedHat/README \ -RedHat/ups \ -RedHat/upsd \ -RedHat/upsd.in \ -RedHat/upsmon \ -RedHat/upsmon.in \ -Solaris8/S99upsmon \ -subdriver/gen-usbhid-subdriver.sh \ -ufw/README \ -upower/95-upower-hid.rules \ -Windows/halt.c \ -Windows/Makefile + avahi/nut.service.in \ + HP-UX/nut-drvctl \ + HP-UX/nut-drvctl.sh \ + HP-UX/nut-upsd \ + HP-UX/nut-upsd.sh \ + HP-UX/nut-upsmon \ + HP-UX/nut-upsmon.sh \ + logrotate/nutlogd \ + misc/nut.bash_completion \ + misc/osd-notify \ + perl/Nut.pm \ + RedHat/halt.patch \ + RedHat/README \ + RedHat/ups \ + RedHat/upsd \ + RedHat/upsd.in \ + RedHat/upsmon \ + RedHat/upsmon.in \ + Solaris8/S99upsmon \ + subdriver/gen-usbhid-subdriver.sh \ + subdriver/gen-snmp-subdriver.sh \ + ufw/README \ + upower/95-upower-hid.rules \ + Windows/halt.c \ + Windows/Makefile -SUBDIRS = augeas hal hotplug python systemd udev Solaris +SUBDIRS = augeas devd hotplug python systemd udev Solaris diff --git a/scripts/Makefile.in b/scripts/Makefile.in index fad5e58..c260153 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -63,7 +63,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -73,10 +72,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -173,10 +171,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -188,8 +182,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -275,6 +267,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ @@ -317,32 +310,33 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ EXTRA_DIST = README \ -avahi/nut.service.in \ -HP-UX/nut-drvctl \ -HP-UX/nut-drvctl.sh \ -HP-UX/nut-upsd \ -HP-UX/nut-upsd.sh \ -HP-UX/nut-upsmon \ -HP-UX/nut-upsmon.sh \ -logrotate/nutlogd \ -misc/nut.bash_completion \ -misc/osd-notify \ -perl/Nut.pm \ -RedHat/halt.patch \ -RedHat/README \ -RedHat/ups \ -RedHat/upsd \ -RedHat/upsd.in \ -RedHat/upsmon \ -RedHat/upsmon.in \ -Solaris8/S99upsmon \ -subdriver/gen-usbhid-subdriver.sh \ -ufw/README \ -upower/95-upower-hid.rules \ -Windows/halt.c \ -Windows/Makefile + avahi/nut.service.in \ + HP-UX/nut-drvctl \ + HP-UX/nut-drvctl.sh \ + HP-UX/nut-upsd \ + HP-UX/nut-upsd.sh \ + HP-UX/nut-upsmon \ + HP-UX/nut-upsmon.sh \ + logrotate/nutlogd \ + misc/nut.bash_completion \ + misc/osd-notify \ + perl/Nut.pm \ + RedHat/halt.patch \ + RedHat/README \ + RedHat/ups \ + RedHat/upsd \ + RedHat/upsd.in \ + RedHat/upsmon \ + RedHat/upsmon.in \ + Solaris8/S99upsmon \ + subdriver/gen-usbhid-subdriver.sh \ + subdriver/gen-snmp-subdriver.sh \ + ufw/README \ + upower/95-upower-hid.rules \ + Windows/halt.c \ + Windows/Makefile -SUBDIRS = augeas hal hotplug python systemd udev Solaris +SUBDIRS = augeas devd hotplug python systemd udev Solaris all: all-recursive .SUFFIXES: diff --git a/scripts/README b/scripts/README index f4251da..f31e103 100644 --- a/scripts/README +++ b/scripts/README @@ -2,8 +2,6 @@ These directories hold various scripts: - example startup and shutdown scripts for various operating systems and distributions, - hotplug and udev integration for on the fly privileges settings (Linux only), -- Hardware Abstraction Layer script, for declaring and binding NUT addons to -specific USB devices, - UPower (previously DeviceKit-power) rules file, - Python Client module and application, - Perl client module, diff --git a/scripts/Solaris/Makefile.in b/scripts/Solaris/Makefile.in index d6f845b..e968d1f 100644 --- a/scripts/Solaris/Makefile.in +++ b/scripts/Solaris/Makefile.in @@ -65,7 +65,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -75,10 +74,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -135,10 +133,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -150,8 +144,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -237,6 +229,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/scripts/Solaris/nut.in b/scripts/Solaris/nut.in index b18b7fd..ab7ec94 100644 --- a/scripts/Solaris/nut.in +++ b/scripts/Solaris/nut.in @@ -12,7 +12,7 @@ fi ups_stop () { pkill -n upsmon pkill -n upsd - ${NUT_DIR}/bin/upsdrvctl stop > /dev/null 2>&1 + ${NUT_DIR}/sbin/upsdrvctl stop > /dev/null 2>&1 } ups_start () { @@ -22,7 +22,7 @@ ups_start () { fi if [ ! "$MODE" = "netclient" ];then - $NUT_DIR/bin/upsdrvctl start #> /dev/null 2>&1 + $NUT_DIR/sbin/upsdrvctl start #> /dev/null 2>&1 $NUT_DIR/sbin/upsd #> /dev/null 2>&1 fi $NUT_DIR/sbin/upsmon #> /dev/null 2>&1 @@ -49,7 +49,7 @@ case $1 in $NUT_DIR/sbin/upsmon -K >/dev/null 2>&1 if [ $? = 0 ]; then echo "Shutting down the UPS ..." - #$NUT_DIR/bin/upsdrvctl shutdown + #$NUT_DIR/sbin/upsdrvctl shutdown fi ;; *) diff --git a/scripts/Solaris/postinstall.in b/scripts/Solaris/postinstall.in index 3bf6226..136e077 100644 --- a/scripts/Solaris/postinstall.in +++ b/scripts/Solaris/postinstall.in @@ -59,7 +59,7 @@ ln -s /etc/init.d/nut /etc/rc3.d/K100nut > /dev/null 2>&1 # Start nut services #echo "Starting nut services" -#$NUT_DIR/bin/upsdrvctl start #> /dev/null 2>&1 +#$NUT_DIR/sbin/upsdrvctl start #> /dev/null 2>&1 #$NUT_DIR/sbin/upsd #> /dev/null 2>&1 #$NUT_DIR/sbin/upsmon #> /dev/null 2>&1 diff --git a/scripts/Solaris/preremove.in b/scripts/Solaris/preremove.in index 7096918..dc4a1a1 100644 --- a/scripts/Solaris/preremove.in +++ b/scripts/Solaris/preremove.in @@ -4,5 +4,5 @@ NUT_DIR="@prefix@" -#$NUT_DIR/bin/upsdrvctl stop +#$NUT_DIR/sbin/upsdrvctl stop diff --git a/scripts/augeas/Makefile.in b/scripts/augeas/Makefile.in index 2f7fc23..2c1d35c 100644 --- a/scripts/augeas/Makefile.in +++ b/scripts/augeas/Makefile.in @@ -68,7 +68,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -78,10 +77,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -140,10 +138,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -155,8 +149,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -242,6 +234,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/scripts/devd/Makefile.am b/scripts/devd/Makefile.am new file mode 100644 index 0000000..e5a9bbc --- /dev/null +++ b/scripts/devd/Makefile.am @@ -0,0 +1,14 @@ + +if WITH_DEVD + devdconfdir = $(devddir) + devdconf_DATA = +if WITH_USB + devdconf_DATA += nut-usb.conf +endif +endif + +EXTRA_DIST = README + +DISTCLEANFILES = nut-usb.conf +# we should never remove this one, apart from a distclean-check +#MAINTAINERCLEANFILES = nut-usbups.rules.in diff --git a/scripts/hal/Makefile.in b/scripts/devd/Makefile.in similarity index 88% rename from scripts/hal/Makefile.in rename to scripts/devd/Makefile.in index 4b5950d..2b564ce 100644 --- a/scripts/hal/Makefile.in +++ b/scripts/devd/Makefile.in @@ -52,9 +52,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -subdir = scripts/hal -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/ups-nut-device.fdi.in +@WITH_DEVD_TRUE@@WITH_USB_TRUE@am__append_1 = nut-usb.conf +subdir = scripts/devd +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/nut-usb.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -65,7 +66,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -75,15 +75,14 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = ups-nut-device.fdi +CONFIG_CLEAN_FILES = nut-usb.conf CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = @@ -119,8 +118,8 @@ am__uninstall_files_from_dir = { \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } -am__installdirs = "$(DESTDIR)$(halfdidir)" -DATA = $(halfdi_DATA) +am__installdirs = "$(DESTDIR)$(devdconfdir)" +DATA = $(devdconf_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ @@ -164,10 +163,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -179,8 +174,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -266,6 +259,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ @@ -307,13 +301,10 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ -@WITH_HAL_TRUE@halfdidir = $(HAL_FDI_PATH) -@WITH_HAL_TRUE@halfdi_DATA = 20-ups-nut-device.fdi -EXTRA_DIST = ups-nut-device.fdi.in -DISTCLEANFILES = ups-nut-device.fdi -# we should never remove this one, apart from a distclean-check -#MAINTAINERCLEANFILES = ups-nut-device.fdi.in -CLEANFILES = 20-ups-nut-device.fdi +@WITH_DEVD_TRUE@devdconfdir = $(devddir) +@WITH_DEVD_TRUE@devdconf_DATA = $(am__append_1) +EXTRA_DIST = README +DISTCLEANFILES = nut-usb.conf all: all-am .SUFFIXES: @@ -326,9 +317,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/hal/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/devd/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu scripts/hal/Makefile + $(AUTOMAKE) --gnu scripts/devd/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -347,7 +338,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -ups-nut-device.fdi: $(top_builddir)/config.status $(srcdir)/ups-nut-device.fdi.in +nut-usb.conf: $(top_builddir)/config.status $(srcdir)/nut-usb.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: @@ -355,27 +346,27 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -install-halfdiDATA: $(halfdi_DATA) +install-devdconfDATA: $(devdconf_DATA) @$(NORMAL_INSTALL) - @list='$(halfdi_DATA)'; test -n "$(halfdidir)" || list=; \ + @list='$(devdconf_DATA)'; test -n "$(devdconfdir)" || list=; \ if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(halfdidir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(halfdidir)" || exit 1; \ + echo " $(MKDIR_P) '$(DESTDIR)$(devdconfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(devdconfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(halfdidir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(halfdidir)" || exit $$?; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devdconfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(devdconfdir)" || exit $$?; \ done -uninstall-halfdiDATA: +uninstall-devdconfDATA: @$(NORMAL_UNINSTALL) - @list='$(halfdi_DATA)'; test -n "$(halfdidir)" || list=; \ + @list='$(devdconf_DATA)'; test -n "$(devdconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(halfdidir)'; $(am__uninstall_files_from_dir) + dir='$(DESTDIR)$(devdconfdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: @@ -417,7 +408,7 @@ check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: - for dir in "$(DESTDIR)$(halfdidir)"; do \ + for dir in "$(DESTDIR)$(devdconfdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -442,7 +433,6 @@ install-strip: mostlyclean-generic: clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) @@ -472,7 +462,7 @@ info: info-am info-am: -install-data-am: install-halfdiDATA +install-data-am: install-devdconfDATA install-dvi: install-dvi-am @@ -516,26 +506,24 @@ ps: ps-am ps-am: -uninstall-am: uninstall-halfdiDATA +uninstall-am: uninstall-devdconfDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-halfdiDATA install-html \ + install-data install-data-am install-devdconfDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-halfdiDATA + uninstall uninstall-am uninstall-devdconfDATA - -# FIXME: should be able to use $< here. -20-ups-nut-device.fdi: ups-nut-device.fdi - cp ups-nut-device.fdi $@ +# we should never remove this one, apart from a distclean-check +#MAINTAINERCLEANFILES = nut-usbups.rules.in # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/scripts/devd/README b/scripts/devd/README new file mode 100644 index 0000000..58f9fda --- /dev/null +++ b/scripts/devd/README @@ -0,0 +1,11 @@ +On FreeBSD, devd has a similar role to udev on Linux. The devd.conf file +defines actions to perform when devices are plugged in. + +The tools/nut-usbinfo.pl script generates nut-usb.conf.in by processing USB +macros in all of the drivers. In this case, the defined action for each +matching UPS is to change the permissions such that the NUT drivers can access +the devices without requiring root privileges. You may need to restart devd and +re-plug in the UPS to trigger the actions. + +The format of this configuration file should work with devd on FreeBSD 9.0 and +9.1, at the very least. diff --git a/scripts/devd/nut-usb.conf.in b/scripts/devd/nut-usb.conf.in new file mode 100644 index 0000000..05b6ffa --- /dev/null +++ b/scripts/devd/nut-usb.conf.in @@ -0,0 +1,850 @@ +# This file is generated and installed by the Network UPS Tools package. +# Homepage: http://www.networkupstools.org/ + +# ATCL FOR UPS - nutdrv_atcl_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0001"; + match "product" "0x0000"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Hewlett Packard +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x0001"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# T500 - bcmxcp_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1f01"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# T750 - bcmxcp_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1f02"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# HP T750 INTL - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1f06"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# HP T1000 INTL - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1f08"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# HP T1500 INTL - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1f09"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# HP R/T 2200 INTL (like SMART2200RMXL2U) - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1f0a"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# HP R1500 G2 and G3 INTL - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe0"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# HP T750 G2 - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe1"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe2"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# HP T1500 G3 - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe3"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# R/T3000 - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe5"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# R/T3000 - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe6"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# various models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe7"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# various models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x03f0"; + match "product" "0x1fe8"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Eaton +# various models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0463"; + match "product" "0x0001"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# various models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0463"; + match "product" "0xffff"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Dell +# various models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x047c"; + match "product" "0xffff"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Riello (Cypress Semiconductor Corp.) +# various models - riello_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x04b4"; + match "product" "0x5500"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Minibox +# openUPS Intelligent UPS (minimum required firmware 1.4) - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x04d8"; + match "product" "0xd004"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Belkin +# F6H375-USB - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0375"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C550-AVR - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0551"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C1250-TW-RK - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0750"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C1500-TW-RK - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0751"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C900-UNV - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0900"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C100-UNV - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0910"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C120-UNV - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0912"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C800-UNV - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0980"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# F6C1100-UNV, F6C1200-UNV - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x1100"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# APC +# various models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x051d"; + match "product" "0x0002"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# various 5G models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x051d"; + match "product" "0x0003"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Powerware +# various models - bcmxcp_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0592"; + match "product" "0x0002"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# PW 9140 - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0592"; + match "product" "0x0004"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Agiler UPS - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x05b8"; + match "product" "0x0000"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Belkin F6C1200-UNV - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0665"; + match "product" "0x5161"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Phoenixtec Power Co., Ltd +# Online Yunto YQ450 - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x06da"; + match "product" "0x0002"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Mustek Powermust - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x06da"; + match "product" "0x0003"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Phoenixtec Innova 3/1 T - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x06da"; + match "product" "0x0004"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Phoenixtec Innova RT - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x06da"; + match "product" "0x0005"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Phoenixtec Innova T - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x06da"; + match "product" "0x0201"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Online Zinto A - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x06da"; + match "product" "0x0601"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# various models - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x06da"; + match "product" "0xffff"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# iDowell +# iDowell - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x075d"; + match "product" "0x0300"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Cyber Power Systems +# 900AVR/BC900D, CP1200AVR/BC1200D - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0764"; + match "product" "0x0005"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Dynex DX-800U? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0764"; + match "product" "0x0501"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# OR2200LCDRM2U, OR700LCDRM1U, PR6000LCDRTXL5U - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0764"; + match "product" "0x0601"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Sweex 1000VA - richcomm_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0925"; + match "product" "0x1234"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# TrippLite +# e.g. OMNIVS1000, SMART550USB, ... - tripplite_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x0001"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite AVR550U - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x1003"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite AVR750U - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x1007"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite ECO550UPS - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x1008"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite ECO550UPS - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x1009"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite ECO550UPS - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x1010"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite OMNI1000LCD - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2005"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite OMNI900LCD - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2007"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2008"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite Smart1000LCD - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2009"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2010"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2011"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2012"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2013"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x2014"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3008"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3009"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3010"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3011"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite smart2200RMXL2U - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3012"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3013"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3014"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3015"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite Smart1500LCD (newer unit) - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x3016"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite SmartOnline SU1500RTXL2UA (older unit?) - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4001"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite SmartOnline SU6000RT4U? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4002"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite SmartOnline SU1500RTXL2ua - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4003"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. TrippLite SmartOnline SU1000XLA - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4004"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4005"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4006"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4007"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# e.g. ? - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x09ae"; + match "product" "0x4008"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# PowerCOM +# PowerCOM Vanguard and BNT-xxxAP - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0d9f"; + match "product" "0x0004"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# PowerCOM IMP - IMPERIAL Series - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0d9f"; + match "product" "0x00a2"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# PowerCOM SKP - Smart KING Pro (all Smart series) - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0d9f"; + match "product" "0x00a3"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# PowerCOM WOW - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0d9f"; + match "product" "0x00a4"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# PowerCOM VGD - Vanguard - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0d9f"; + match "product" "0x00a5"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# PowerCOM BNT - Black Knight Pro - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0d9f"; + match "product" "0x00a6"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Unitek Alpha 1200Sx - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0f03"; + match "product" "0x0001"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; + +# Liebert +# Liebert PowerSure PSA UPS - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x10af"; + match "product" "0x0001"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Liebert PowerSure PSI 1440 - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x10af"; + match "product" "0x0004"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# GE EP series - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x14f0"; + match "product" "0x00c9"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; +# Ablerex 625L USB - blazer_usb +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0xffff"; + match "product" "0x0000"; + action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; +}; diff --git a/scripts/hal/Makefile.am b/scripts/hal/Makefile.am deleted file mode 100644 index f639b22..0000000 --- a/scripts/hal/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ - -if WITH_HAL - halfdidir = $(HAL_FDI_PATH) - halfdi_DATA = 20-ups-nut-device.fdi -endif - -# FIXME: should be able to use $< here. -20-ups-nut-device.fdi: ups-nut-device.fdi - cp ups-nut-device.fdi $@ - -EXTRA_DIST = ups-nut-device.fdi.in - -DISTCLEANFILES = ups-nut-device.fdi -# we should never remove this one, apart from a distclean-check -#MAINTAINERCLEANFILES = ups-nut-device.fdi.in -CLEANFILES = 20-ups-nut-device.fdi diff --git a/scripts/hal/ups-nut-device.fdi.in b/scripts/hal/ups-nut-device.fdi.in deleted file mode 100644 index 235a636..0000000 --- a/scripts/hal/ups-nut-device.fdi.in +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - - - battery - battery - hald-addon-blazer_usb - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-bcmxcp_usb - ups - - - - battery - battery - hald-addon-bcmxcp_usb - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-riello_usb - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-bcmxcp_usb - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - battery - battery - hald-addon-blazer_usb - ups - - - - - - battery - battery - hald-addon-blazer_usb - ups - - - - - - - - battery - battery - hald-addon-blazer_usb - ups - - - - battery - battery - hald-addon-blazer_usb - ups - - - - battery - battery - hald-addon-blazer_usb - ups - - - - battery - battery - hald-addon-blazer_usb - ups - - - - battery - battery - hald-addon-blazer_usb - ups - - - - battery - battery - hald-addon-blazer_usb - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - battery - battery - hald-addon-richcomm_usb - ups - - - - - - - - battery - battery - hald-addon-tripplite_usb - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - battery - battery - hald-addon-blazer_usb - ups - - - - - - - - battery - battery - hald-addon-usbhid-ups - ups - - - - - - battery - battery - hald-addon-blazer_usb - ups - - - - - - battery - battery - hald-addon-blazer_usb - ups - - - - - diff --git a/scripts/hotplug/Makefile.in b/scripts/hotplug/Makefile.in index 3102c3c..4d6b47e 100644 --- a/scripts/hotplug/Makefile.in +++ b/scripts/hotplug/Makefile.in @@ -67,7 +67,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -77,10 +76,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -169,10 +167,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -184,8 +178,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -271,6 +263,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/scripts/hotplug/libhid.usermap b/scripts/hotplug/libhid.usermap index 493ce31..08f25c5 100644 --- a/scripts/hotplug/libhid.usermap +++ b/scripts/hotplug/libhid.usermap @@ -4,7 +4,7 @@ # libhidups 0x0003 0xVVVV 0xPPPP 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # # usb module match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info -# Krauler UP-M500VA +# ATCL FOR UPS libhidups 0x0003 0x0001 0x0000 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Hewlett Packard @@ -208,6 +208,8 @@ libhidups 0x0003 0x0f03 0x0001 0x0000 0x0000 0x00 # Liebert # Liebert PowerSure PSA UPS libhidups 0x0003 0x10af 0x0001 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 +# Liebert PowerSure PSI 1440 +libhidups 0x0003 0x10af 0x0004 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # GE EP series libhidups 0x0003 0x14f0 0x00c9 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Ablerex 625L USB diff --git a/scripts/python/Makefile.in b/scripts/python/Makefile.in index a3fd0df..d04e8aa 100644 --- a/scripts/python/Makefile.in +++ b/scripts/python/Makefile.in @@ -65,7 +65,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -75,10 +74,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -135,10 +133,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -150,8 +144,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -237,6 +229,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/scripts/subdriver/gen-snmp-subdriver.sh b/scripts/subdriver/gen-snmp-subdriver.sh new file mode 100755 index 0000000..b9aa44f --- /dev/null +++ b/scripts/subdriver/gen-snmp-subdriver.sh @@ -0,0 +1,348 @@ +#!/bin/bash +# +# an auxiliary script to produce a "stub" snmp-ups subdriver from +# SNMP data from a real agent or from dump files +# +# Version: 0.4 +# +# See also: docs/snmp-subdrivers.txt +# +# Copyright (C) +# 2011 - 2012 Arnaud Quette +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# TODO: +# - extend to SNMP v3 (auth.) + +usage() { + echo "Usage: $0 [options] [file]" + echo "Options:" + echo " -h, --help -- show this message and quit" + echo " -n name -- subdriver name (use natural capitalization)" + echo " -M DIRLIST -- colon separated list of directories to also search for MIBs" + echo " -k -- keep temporary files (for debugging)" + echo "" + echo "mode 1: get SNMP data from a real agent" + echo " -H host_address -- SNMP host IP address or name" + echo " -c community -- SNMP v1 community name (default: public)" + echo "" + echo "mode 2: get data from files (snmpwalk dumps of 'sysOID' subtree)" + echo " -s XXXX -- SNMP OID entry point (sysOID). Ex: '.1.3.6.1.4.1.705.1'" + echo " file1 file2 -- read from files instead of an host (using Net SNMP)" + echo " file1: numeric SNMP walk (snmpwalk -On ... )" + echo " file2: string SNMP walk (snmpwalk -Os ... )" + # FIXME: EXAMPLES +} + +# variables +DRIVER="" +KEEP="" +HOSTNAME="" +MIBS_DIRLIST="+." +COMMUNITY="public" +SYSOID="" +MODE=0 + +# constants +NAME=gen-snmp-subdriver +TMPDIR="${TEMPDIR:-/tmp}" +DEBUG=`mktemp "$TMPDIR/$NAME-DEBUG.XXXXXX"` +DFL_NUMWALKFILE=`mktemp "$TMPDIR/$NAME-NUMWALK.XXXXXX"` +DFL_STRWALKFILE=`mktemp "$TMPDIR/$NAME-STRWALK.XXXXXX"` +TMP_NUMWALKFILE=`mktemp "$TMPDIR/$NAME-TMP-NUMWALK.XXXXXX"` +TMP_STRWALKFILE=`mktemp "$TMPDIR/$NAME-TMP-STRWALK.XXXXXX"` + +get_snmp_data() { + # 1) get the sysOID (points the mfr specif MIB) + SYSOID=`snmpget -v1 -c $COMMUNITY $HOSTNAME .1.3.6.1.2.1.1.2.0 41` + + # 2) get the content of the mfr specif MIB + snmpwalk -On -v1 -c $COMMUNITY $HOSTNAME $SYSOID 2>/dev/null 1> $DFL_NUMWALKFILE + snmpwalk -Os -v1 -M $MIBS_DIRLIST -c $COMMUNITY $HOSTNAME $SYSOID 2>/dev/null 1> $DFL_STRWALKFILE +} + +# process command line options +while [ $# -gt 0 ]; do + if [ $# -gt 1 -a "$1" = "-n" ]; then + DRIVER="$2" + shift 2 + elif [ $# -gt 1 -a "$1" = "-M" ]; then + MIBS_DIRLIST="$MIBS_DIRLIST:$2" + shift 2 + elif [ "$1" = "-k" ]; then + KEEP=yes + shift + elif [ $# -gt 1 -a "$1" = "-H" ]; then + HOSTNAME="$2" + shift 2 + elif [ $# -gt 1 -a "$1" = "-c" ]; then + COMMUNITY="$2" + shift 2 + elif [ $# -gt 1 -a "$1" = "-s" ]; then + SYSOID="$2" + shift 2 + elif echo "$1" | grep -qv '^-'; then + if [ $# -gt 1 ]; then + NUMWALKFILE="$1" + shift + STRWALKFILE="$1" + shift + else + usage + exit 1 + fi + elif [ "$1" = "--help" -o "$1" = "-h" ]; then + usage + exit 0 + else + echo "Illegal option $1. Try --help for more info." >&2 + exit 1 + fi +done + +# check that the needed parameters are provided, depending on the mode +if [ -z "$NUMWALKFILE" ]; then + # mode 1: directly get SNMP data from a real agent + MODE=1 + NUMWALKFILE=$DFL_NUMWALKFILE + STRWALKFILE=$DFL_STRWALKFILE + + # check if Net SNMP is available + if [ -z "`which snmpget`" -o -z "`which snmpwalk`" ]; then + echo "Net SNMP not found! snmpget and snmpwalk commands are required." >&2 + exit 1 + fi + # hostname is also mandatory + while [ -z "$HOSTNAME" ]; do + echo " + Please enter the SNMP host IP address or name." + read -p "SNMP host IP name or address: " HOSTNAME < /dev/tty + if echo $HOSTNAME | egrep -q '[^a-zA-Z0-9]'; then + echo "Please use only letters and digits" + HOSTNAME="" + fi + done + # get data from the agent + get_snmp_data +else + # mode 2: get data from files + MODE=2 + + # get sysOID value from command line, if needed + while [ -z "$SYSOID" ]; do + echo " +Please enter the value of sysOID, as displayed by snmp-ups. For example '.1.3.6.1.4.1.2254.2.4'. +You can get it using: snmpget -v1 -c XXX .1.3.6.1.2.1.1.2.0" + read -p "Value of sysOID: " SYSOID < /dev/tty + if echo $SYSOID | egrep -q '[^0-9.]'; then + echo "Please use only the numeric form, with dots and digits" + SYSOID="" + fi + done + # check for actual files existence + if [ ! -f "$NUMWALKFILE" -o ! -f "$STRWALKFILE" ]; then + echo "SNMP walk dump files are missing on disk. Try --help for more info." >&2 + exit 1 + fi +fi + +# delete temporary files: this is called just before exiting. +cleanup () { + rm -f "$DEBUG $DFL_NUMWALKFILE $TMP_NUMWALKFILE $DFL_STRWALKFILE $TMP_STRWALKFILE" +} +if [ -z "$KEEP" ]; then + trap cleanup EXIT +fi + +# prompt use for name of driver +while [ -z "$DRIVER" ]; do + echo " +Please enter a name for this driver. Use only letters and numbers. Use +natural (upper- and lowercase) capitalization, e.g., 'Belkin', 'APC'." + read -p "Name of subdriver: " DRIVER < /dev/tty + if echo $DRIVER | egrep -q '[^a-zA-Z0-9]'; then + echo "Please use only letters and digits" + DRIVER="" + fi +done + +# remove blank and "End of MIB" lines +egrep -e "^[[:space:]]?$" -e "End of MIB" -v ${NUMWALKFILE} > ${TMP_NUMWALKFILE} +egrep -e "^[[:space:]]?$" -e "End of MIB" -v ${STRWALKFILE} > ${TMP_STRWALKFILE} +NUMWALKFILE=${TMP_NUMWALKFILE} +STRWALKFILE=${TMP_STRWALKFILE} + +# FIXME: sanity checks (! -z contents -a same `wc -l`) +NUM_OID_COUNT="`cat $NUMWALKFILE | wc -l`" +STR_OID_COUNT="`cat $STRWALKFILE | wc -l`" + +echo "COUNT = $NUM_OID_COUNT / $NUM_OID_COUNT" + +# create file names +LDRIVER=`echo $DRIVER | tr A-Z a-z` +UDRIVER=`echo $DRIVER | tr a-z A-Z` +CFILE="$LDRIVER-mib.c" +HFILE="$LDRIVER-mib.h" + +# generate header file +echo "Creating $HFILE" +cat > "$HFILE" < + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef ${UDRIVER}_MIB_H +#define ${UDRIVER}_MIB_H + +#include "main.h" +#include "snmp-ups.h" + +extern mib2nut_info_t ${LDRIVER}; + +#endif /* ${UDRIVER}_MIB_H */ +EOF + +# generate source file +# create header +echo "Creating $CFILE" +cat > "$CFILE" < + * + * Note: this subdriver was initially generated as a "stub" by the + * gen-snmp-subdriver script. It must be customized! + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "${HFILE}" + +#define ${UDRIVER}_MIB_VERSION "0.1" + +#define ${UDRIVER}_SYSOID "${SYSOID}" + +/* To create a value lookup structure (as needed on the 2nd line of the example + * below), use the following kind of declaration, outside of the present snmp_info_t[]: + * static info_lkp_t onbatt_info[] = { + * { 1, "OB" }, + * { 2, "OL" }, + * { 0, "NULL" } + * }; + */ + +/* ${UDRIVER} Snmp2NUT lookup table */ +static snmp_info_t ${LDRIVER}_mib[] = { + + /* Data format: + * { info_type, info_flags, info_len, OID, dfl, flags, oid2info, setvar }, + * + * info_type: NUT INFO_ or CMD_ element name + * info_flags: flags to set in addinfo + * info_len: length of strings if STR + * cmd value if CMD, multiplier otherwise + * OID: SNMP OID or NULL + * dfl: default value + * flags: snmp-ups internal flags (FIXME: ...) + * oid2info: lookup table between OID and NUT values + * setvar: variable to set for SU_FLAG_SETINT + * + * Example: + * { "input.voltage", 0, 0.1, ".1.3.6.1.4.1.705.1.6.2.1.2.1", "", SU_INPUT_1, NULL }, + * { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.705.1.7.3.0", "", SU_FLAG_OK | SU_STATUS_BATT, onbatt_info }, + * + * To create a value lookup structure (as needed on the 2nd line), use the + * following kind of declaration, outside of the present snmp_info_t[]: + * static info_lkp_t onbatt_info[] = { + * { 1, "OB" }, + * { 2, "OL" }, + * { 0, "NULL" } + * }; + */ +EOF + + +# extract OID string paths, one by one +LINENB="0" +while IFS= read -r line; do + LINENB="`expr $LINENB + 1`" + FULL_STR_OID="$line" + STR_OID="`echo $line | cut -d'.' -f1`" + echo $line | grep STRING > /dev/null + if [ $? -eq 0 ]; then + ST_FLAG_TYPE="ST_FLAG_STRING" + SU_INFOSIZE="SU_INFOSIZE" + else + ST_FLAG_TYPE="0" + SU_INFOSIZE="1" + fi + # get the matching numeric OID + NUM_OID="`sed -n ${LINENB}p ${NUMWALKFILE} | cut -d' ' -f1`" + printf "\t/* ${FULL_STR_OID} */\n\t{ \"unmapped.${STR_OID}\", ${ST_FLAG_TYPE}, ${SU_INFOSIZE}, \"${NUM_OID}\", NULL, SU_FLAG_OK, NULL },\n" +done < ${STRWALKFILE} >> ${CFILE} + +# append footer +cat >> "$CFILE" < "$CFILE" < * 2005 - 2006 Peter Selinger * 2008 - 2009 Arjen de Korte + * 2013 Charles Lepple * * Note: this subdriver was initially generated as a "stub" by the * gen-usbhid-subdriver script. It must be customized. @@ -263,7 +264,7 @@ static const char *${LDRIVER}_format_serial(HIDDevice_t *hd) { * the device is supported by this subdriver, else 0. */ static int ${LDRIVER}_claim(HIDDevice_t *hd) { - int status = is_usb_device_supported(${LDRIVER}_usb_device_table, hd->VendorID, hd->ProductID); + int status = is_usb_device_supported(${LDRIVER}_usb_device_table, hd); switch (status) { @@ -299,8 +300,8 @@ cat </dev/null 2>&1 && @driverexecdir@/upsdrvctl shutdown +@SBINDIR@/upsmon -K >/dev/null 2>&1 && @SBINDIR@/upsdrvctl shutdown diff --git a/scripts/udev/Makefile.in b/scripts/udev/Makefile.in index 6e6aa5c..c222218 100644 --- a/scripts/udev/Makefile.in +++ b/scripts/udev/Makefile.in @@ -67,7 +67,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -77,10 +76,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -166,10 +164,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -181,8 +175,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -268,6 +260,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/scripts/udev/nut-usbups.rules.in b/scripts/udev/nut-usbups.rules.in index d7285c8..d8961dd 100644 --- a/scripts/udev/nut-usbups.rules.in +++ b/scripts/udev/nut-usbups.rules.in @@ -6,7 +6,7 @@ SUBSYSTEM=="usb", GOTO="nut-usbups_rules_real" SUBSYSTEM!="usb", GOTO="nut-usbups_rules_end" LABEL="nut-usbups_rules_real" -# Krauler UP-M500VA - blazer_usb +# ATCL FOR UPS - nutdrv_atcl_usb ATTR{idVendor}=="0001", ATTR{idProduct}=="0000", MODE="664", GROUP="@RUN_AS_GROUP@" # Hewlett Packard @@ -210,6 +210,8 @@ ATTR{idVendor}=="0f03", ATTR{idProduct}=="0001", MODE="664", GROUP="@RUN_AS_GROU # Liebert # Liebert PowerSure PSA UPS - usbhid-ups ATTR{idVendor}=="10af", ATTR{idProduct}=="0001", MODE="664", GROUP="@RUN_AS_GROUP@" +# Liebert PowerSure PSI 1440 - usbhid-ups +ATTR{idVendor}=="10af", ATTR{idProduct}=="0004", MODE="664", GROUP="@RUN_AS_GROUP@" # GE EP series - blazer_usb ATTR{idVendor}=="14f0", ATTR{idProduct}=="00c9", MODE="664", GROUP="@RUN_AS_GROUP@" # Ablerex 625L USB - blazer_usb diff --git a/scripts/upower/95-upower-hid.rules b/scripts/upower/95-upower-hid.rules index 8af6415..31ffec2 100644 --- a/scripts/upower/95-upower-hid.rules +++ b/scripts/upower/95-upower-hid.rules @@ -123,5 +123,6 @@ ATTRS{idVendor}=="0d9f", ATTRS{idProduct}=="00a6", ENV{UPOWER_BATTERY_TYPE}="ups # Liebert ATTRS{idVendor}=="10af", ATTRS{idProduct}=="0001", ENV{UPOWER_BATTERY_TYPE}="ups" +ATTRS{idVendor}=="10af", ATTRS{idProduct}=="0004", ENV{UPOWER_BATTERY_TYPE}="ups" LABEL="up_hid_end" diff --git a/server/Makefile.in b/server/Makefile.in index 6ef6823..b6c8d7d 100644 --- a/server/Makefile.in +++ b/server/Makefile.in @@ -72,7 +72,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -82,10 +81,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -177,10 +175,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -192,8 +186,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -279,6 +271,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/server/netlist.c b/server/netlist.c index 91f7831..c226dc3 100644 --- a/server/netlist.c +++ b/server/netlist.c @@ -220,7 +220,7 @@ static void list_range(nut_ctype_t *client, const char *upsname, const char *var return; } - sendback(client, "END LIST ENUM %s %s\n", upsname, var); + sendback(client, "END LIST RANGE %s %s\n", upsname, var); } static void list_ups(nut_ctype_t *client) diff --git a/tests/Makefile.in b/tests/Makefile.in index 153fc11..1e9772c 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -67,7 +67,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -77,10 +76,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -164,10 +162,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -179,8 +173,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -266,6 +258,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/tools/Makefile.am b/tools/Makefile.am index bfcadf7..0e6501e 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -16,7 +16,7 @@ # sub-directory SUBDIRS = . nut-scanner -EXTRA_DIST = nut-usbinfo.pl nut-hclinfo.py nut-recorder.sh gitlog2changelog.py nut-snmpinfo.py +EXTRA_DIST = nut-usbinfo.pl nut-recorder.sh gitlog2changelog.py nut-snmpinfo.py all: nut-scanner-deps @@ -45,22 +45,9 @@ nut-scanner-deps: echo "----------------------------------------------------------------------"; \ fi -website: - @if python -c "import json,simplejson,lxml"; then \ - echo "Regenerating the HTML and JSON formated HCL tables."; \ - $(top_srcdir)/tools/nut-hclinfo.py; \ - else \ - echo "----------------------------------------------------------------------"; \ - echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \ - echo "is not available."; \ - echo "Skipping the HTML and JSON formated HCL tables regeneration."; \ - echo "----------------------------------------------------------------------"; \ - fi - # call the USB info script upon "make dist", and if Perl is present # call the SNMP info script upon "make dist", and if Python is present # and call both for building nut-scanner -# also generate HCL data files dist-hook: @if python -c 1; then \ echo "Regenerating the SNMP helper files."; \ @@ -82,15 +69,4 @@ dist-hook: echo "----------------------------------------------------------------------"; \ fi - @if python -c "import json,simplejson,lxml"; then \ - echo "Regenerating the HTML and JSON formated HCL tables."; \ - $(distdir)/nut-hclinfo.py; \ - else \ - echo "----------------------------------------------------------------------"; \ - echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \ - echo "is not available."; \ - echo "Skipping the HTML and JSON formated HCL tables regeneration."; \ - echo "----------------------------------------------------------------------"; \ - fi - .PHONY: nut-scanner-deps nut-scanner-snmp-deps nut-scanner-usb-deps diff --git a/tools/Makefile.in b/tools/Makefile.in index 0535d38..dcbf07d 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -65,7 +65,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -75,10 +74,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -175,10 +173,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -190,8 +184,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -277,6 +269,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ @@ -334,7 +327,7 @@ udevdir = @udevdir@ # to have nutscan-{usb,snmp}.h built before going into the nut-scanner # sub-directory SUBDIRS = . nut-scanner -EXTRA_DIST = nut-usbinfo.pl nut-hclinfo.py nut-recorder.sh gitlog2changelog.py nut-snmpinfo.py +EXTRA_DIST = nut-usbinfo.pl nut-recorder.sh gitlog2changelog.py nut-snmpinfo.py all: all-recursive .SUFFIXES: @@ -714,22 +707,9 @@ nut-scanner-deps: echo "----------------------------------------------------------------------"; \ fi -website: - @if python -c "import json,simplejson,lxml"; then \ - echo "Regenerating the HTML and JSON formated HCL tables."; \ - $(top_srcdir)/tools/nut-hclinfo.py; \ - else \ - echo "----------------------------------------------------------------------"; \ - echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \ - echo "is not available."; \ - echo "Skipping the HTML and JSON formated HCL tables regeneration."; \ - echo "----------------------------------------------------------------------"; \ - fi - # call the USB info script upon "make dist", and if Perl is present # call the SNMP info script upon "make dist", and if Python is present # and call both for building nut-scanner -# also generate HCL data files dist-hook: @if python -c 1; then \ echo "Regenerating the SNMP helper files."; \ @@ -751,17 +731,6 @@ dist-hook: echo "----------------------------------------------------------------------"; \ fi - @if python -c "import json,simplejson,lxml"; then \ - echo "Regenerating the HTML and JSON formated HCL tables."; \ - $(distdir)/nut-hclinfo.py; \ - else \ - echo "----------------------------------------------------------------------"; \ - echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \ - echo "is not available."; \ - echo "Skipping the HTML and JSON formated HCL tables regeneration."; \ - echo "----------------------------------------------------------------------"; \ - fi - .PHONY: nut-scanner-deps nut-scanner-snmp-deps nut-scanner-usb-deps # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/tools/nut-hclinfo.py b/tools/nut-hclinfo.py deleted file mode 100755 index 35b368e..0000000 --- a/tools/nut-hclinfo.py +++ /dev/null @@ -1,277 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2009 - Arnaud Quette -# Copyright (c) 2010 - Sébastien Volle -# -# 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. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -# This script convert the driver.list into HTML and JSON formated tables -# These tables are then used by the AsciiDoc generated website and -# documentation - -try: - import json -except ImportError: - import simplejson as json # Required for Python < 2.6 - -import re -import sys -import os, errno - -# HCL file location and name -rawHCL="../data/driver.list"; - -# Website output -webJsonHCL = "../docs/website/scripts/ups_data.js"; -webStaticHCL = "../docs/ups-html.txt"; - -# from http://wiki.python.org/moin/EscapingHtml - -html_escape_table = { - "&": "&", - '"': """, - "'": "'", - ">": ">", - "<": "<", - } - -def html_escape(text): - """Produce entities within text.""" - return "".join(html_escape_table.get(c,c) for c in text) - -# # # - -class WrongFieldNumberException(Exception): - pass - -def buildData(deviceDataFile): - """ - Read and parse data file under provided path. - Return a bi-dimensional list representing parsed data. - """ - - deviceData = [] - numFields = 6 # Manufacturer, type, support level, model comment, driver - - try: - file = open(deviceDataFile, "r") - except IOError: - print "Cannot open", deviceDataFile - exit(1) - - for line in file: - # Ignore empty lines or comments - if re.match(r"^$|^\s*#", line): - continue - - # Strip all trailing whitespace chars - line = re.sub(r"\s+$", "", line) - - # Replace all tabs by commas - line = re.sub(r"\t", ",", line) - - # Remove trailing comma - line = re.sub(r",$", "", line) - - # Split fields and append result to device data list - # We suppose there are no double-quotes in fields - row = re.findall(r'"([^"]*)",?', line) - - if len(row) != numFields: - print "Warning: Unexpected number of fields in line: %s" % row - print "\tLine will be skipped." - else: - deviceData.append(re.findall(r'"([^"]*)",?', line)) - - return deviceData - -def buildHTMLTable(deviceData): - """ - Convert provided device data into an HTML table. - Return string representation of the HTML table. - - Identical cells are merged vertically with rowspan attribute. - The driver column is color-coded on support level. - - A support level column is also provided. It should be hidden in a graphic - browser but should be visible from a console based browser (w3m). - """ - - from lxml import etree, html - from lxml.builder import E - - if not type(deviceData).__name__ == "list" or len(deviceData) == 0: - raise Exception("Incorrect data was provided") - - # HTML table columns definition - columns = [ - { - "name": "manufacturer", "id": "manufacturer-col", - "text": "Manufacturer", "fields": ["manufacturer"] - }, - { - "name": "model", "id": "model-col", - "text": "Model", "fields": ["model", "comment"] - }, - { - "name": "driver", "id": "driver-col", - "text": "Driver", "fields": ["driver"] - }, - { - "name": "support-level", "id": "support-level-col", - "text": "Support Level", "fields": ["support-level"] - }, - ] - # Device data fields definition - dataFields = [ - "manufacturer", "device-type", "support-level", - "model", "comment", "driver" - ] - - # FIXME: CSS classes should be defined in script global settings - supportLevelClasses = { - "0": "", "1": "red", "2": "orange", - "3": "yellow", "4": "blue", "5": "green" - } - hiddenClass = "hidden" - - # Build table header - table = E.table(id="ups_list", border="1") - header = E.tr() - - for column in columns: - td = E.td(column.get("text"), id=column.get("id")) - if column["id"] == "support-level-col": - td.set("class", hiddenClass) - header.append(td) - - table.append(E.thead(header)) - - # Build table body - tbody = E.tbody(id="ups_list_body") - - cellHistory = [] - rowHistory = deviceData[0][0] - rows = [] - classes = ("even", "odd") - currentClass = 0 - manufIndex = dataFields.index("manufacturer") - - # Build table rows - for device in deviceData: - - # Devices are expected to have a specified number of fields - if len(device) < len(dataFields): - print "Unexpected number of fields in device: %s" % device - print "Device will not be included in result set." - continue - - # Alternate CSS class if current manufacturer is different from the last - if device[manufIndex] != rowHistory : - currentClass = (currentClass + 1) % 2 - rowHistory = device[manufIndex] - - cells = [] - - colIndex = 0 - for column in columns: - cellContent = [] - for field in column["fields"]: - fieldIndex = dataFields.index(field) - fieldContent = device[fieldIndex] - cellContent.append(html_escape(fieldContent)) - cellContent = "
    ".join(cellContent) - - try: - cH = cellHistory[colIndex] - except: - cH = False - - if not column["name"] == "driver" and cH and cH.get("text") == cellContent: - cH["rowspan"] = cH.get("rowspan", 1) + 1 - else: - cell = { "text": cellContent, "rowspan": 1 } - if column["name"] == "driver": - cell["class"] = supportLevelClasses[device[dataFields.index("support-level")]] - else: - cell["class"] = classes[currentClass] - if column["name"] == "support-level": - cell["class"] = hiddenClass - - cells.append(cell) - try: - cellHistory[colIndex] = cell - except: - cellHistory.append(cell) - - colIndex += 1 - - rows.append(cells) - - for row in rows: - r = E.tr() - for cell in row: - attr = "" - innerHTML = "" - for key, value in cell.iteritems(): - val = unicode(str(value), "utf-8") - if key != "text": - attr += " %s='%s'" % (key, val) - else: - innerHTML = val - - r.append(html.fromstring("%s" % (attr, innerHTML))) - - tbody.append(r) - - table.append(tbody) - - return etree.tostring(table, pretty_print=True) - -# main program -deviceData = buildData(rawHCL) - -# Dump device data as JSON -jsonData = "var UPSData = %s" % json.dumps(deviceData, encoding="utf-8") - -# First, check if target directory exists (which is not the case for 'dist') -dir = os.path.dirname(webJsonHCL) -try: - os.makedirs(dir) -except OSError: - pass - -try: - file = open(webJsonHCL, "w") - file.write(jsonData) - file.close() - print "JSON HCL written" -except IOError: - print "Unable to write JSON device data to %s" % webJsonHCL - exit(1) - -# Create HTML table from device data -table = buildHTMLTable(deviceData) -try: - file = open(webStaticHCL, "w") - file.write("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n") - file.write(table) - file.write("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n") - print "HTML HCL written" -except IOError: - print "Unable to write HTML device table to %s" % webStaticHCL - exit(1) - diff --git a/tools/nut-scanner/Makefile.in b/tools/nut-scanner/Makefile.in index 6352714..dedf63c 100644 --- a/tools/nut-scanner/Makefile.in +++ b/tools/nut-scanner/Makefile.in @@ -77,7 +77,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libavahi.m4 \ $(top_srcdir)/m4/nut_check_libfreeipmi.m4 \ $(top_srcdir)/m4/nut_check_libgd.m4 \ - $(top_srcdir)/m4/nut_check_libhal.m4 \ $(top_srcdir)/m4/nut_check_libltdl.m4 \ $(top_srcdir)/m4/nut_check_libneon.m4 \ $(top_srcdir)/m4/nut_check_libnetsnmp.m4 \ @@ -87,10 +86,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/nut_check_libusb.m4 \ $(top_srcdir)/m4/nut_check_libwrap.m4 \ $(top_srcdir)/m4/nut_check_os.m4 \ - $(top_srcdir)/m4/nut_config_libhal.m4 \ $(top_srcdir)/m4/nut_report_feature.m4 \ $(top_srcdir)/m4/nut_type_socklen_t.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -221,10 +219,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@ -HAL_DEVICE_MATCH_KEY = @HAL_DEVICE_MATCH_KEY@ -HAL_FDI_PATH = @HAL_FDI_PATH@ -HAL_USER = @HAL_USER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -236,8 +230,6 @@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ -LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ -LIBHAL_LIBS = @LIBHAL_LIBS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ LIBIPMI_LIBS = @LIBIPMI_LIBS@ LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ @@ -323,6 +315,7 @@ builddir = @builddir@ cgiexecdir = @cgiexecdir@ datadir = @datadir@ datarootdir = @datarootdir@ +devddir = @devddir@ docdir = @docdir@ driverexecdir = @driverexecdir@ dvidir = @dvidir@ diff --git a/tools/nut-scanner/nutscan-snmp.h b/tools/nut-scanner/nutscan-snmp.h index 886916a..c66aa96 100644 --- a/tools/nut-scanner/nutscan-snmp.h +++ b/tools/nut-scanner/nutscan-snmp.h @@ -39,6 +39,7 @@ static snmp_device_id_t snmp_device_table[] = { { ".1.3.6.1.4.1.20677.1" , "pulizzi_switched2", ".1.3.6.1.4.1.20677.2"}, { ".1.3.6.1.4.1.2947.1.1.2.0" , "bestpower", NULL}, { ".1.3.6.1.4.1.3808.1.1.1.1.1.1.0" , "cyberpower", ".1.3.6.1.4.1.3808"}, + { "" , "xppc", ".1.3.6.1.4.1.935"}, { "" , "delta_ups", ".1.3.6.1.4.1.2254.2.4"}, { ".1.3.6.1.4.1.705.1.1.1.0" , "mge", ".1.3.6.1.4.1.705.1"}, { ".1.3.6.1.4.1.232.165.3.1.1.0" , "cpqpower", ".1.3.6.1.4.1.232.165.3"}, diff --git a/tools/nut-scanner/nutscan-usb.h b/tools/nut-scanner/nutscan-usb.h index d8085d8..c31466f 100644 --- a/tools/nut-scanner/nutscan-usb.h +++ b/tools/nut-scanner/nutscan-usb.h @@ -31,7 +31,7 @@ typedef struct { /* USB IDs device table */ static usb_device_id_t usb_device_table[] = { - { 0x0001, 0x0000, "blazer_usb" }, + { 0x0001, 0x0000, "nutdrv_atcl_usb" }, { 0x03f0, 0x0001, "usbhid-ups" }, { 0x03f0, 0x1f01, "bcmxcp_usb" }, { 0x03f0, 0x1f02, "bcmxcp_usb" }, @@ -119,6 +119,7 @@ static usb_device_id_t usb_device_table[] = { { 0x0d9f, 0x00a6, "usbhid-ups" }, { 0x0f03, 0x0001, "blazer_usb" }, { 0x10af, 0x0001, "usbhid-ups" }, + { 0x10af, 0x0004, "usbhid-ups" }, { 0x14f0, 0x00c9, "blazer_usb" }, { 0xffff, 0x0000, "blazer_usb" }, /* Terminating entry */ diff --git a/tools/nut-usbinfo.pl b/tools/nut-usbinfo.pl index 5e3592e..989cef2 100755 --- a/tools/nut-usbinfo.pl +++ b/tools/nut-usbinfo.pl @@ -1,8 +1,8 @@ #!/usr/bin/env perl -# Current Version : 1.2 -# Copyright (C) 2008 - 2012 -# Arnaud Quette -# dloic (loic.dardant AT gmail DOT com) +# Current Version : 1.3 +# Copyright (C) 2008 - 2012 dloic (loic.dardant AT gmail DOT com) +# Copyright (C) 2008 - 2014 Arnaud Quette +# Copyright (C) 2013 - 2014 Charles Lepple # # Based on the usbdevice.pl script, made for the Ubuntu Media Center # for the final use of the LIRC project. @@ -31,17 +31,18 @@ use strict; # path to scan for USB_DEVICE pattern my $scanPath="../drivers"; -# HAL output file -my $outputHAL="../scripts/hal/ups-nut-device.fdi.in"; - # Hotplug output file my $outputHotplug="../scripts/hotplug/libhid.usermap"; # udev output file my $outputUdev="../scripts/udev/nut-usbups.rules.in"; +# BSD devd output file +my $output_devd="../scripts/devd/nut-usb.conf.in"; + # UPower output file my $outputUPower="../scripts/upower/95-upower-hid.rules"; + # tmp output, to allow generating the ENV{UPOWER_VENDOR} header list my $tmpOutputUPower; # mfr header flag @@ -81,13 +82,6 @@ find(\&find_usbdevs,$scanPath); ################# SUB METHOD ################# sub gen_usb_files { - # HAL file header - open my $outHAL, ">$outputHAL" || die "error $outputHAL : $!"; - print $outHAL ' '."\n"; - print $outHAL ''."\n"; - print $outHAL ' '."\n"; - print $outHAL ' '."\n"; - # Hotplug file header open my $outHotplug, ">$outputHotplug" || die "error $outputHotplug : $!"; print $outHotplug '# This file is generated and installed by the Network UPS Tools package.'."\n"; @@ -109,6 +103,10 @@ sub gen_usb_files print $outUdev 'SUBSYSTEM!="usb", GOTO="nut-usbups_rules_end"'."\n\n"; print $outUdev 'LABEL="nut-usbups_rules_real"'."\n"; + open my $out_devd, ">$output_devd" || die "error $output_devd : $!"; + print $out_devd '# This file is generated and installed by the Network UPS Tools package.'."\n"; + print $out_devd "# Homepage: http://www.networkupstools.org/\n\n"; + # UPower file header open my $outputUPower, ">$outputUPower" || die "error $outputUPower : $!"; print $outputUPower '##############################################################################################################'."\n"; @@ -131,12 +129,6 @@ sub gen_usb_files # generate the file in alphabetical order (first for VendorID, then for ProductID) foreach my $vendorId (sort { lc $a cmp lc $b } keys %vendorName) { - # HAL vendor header - if ($vendorName{$vendorId}) { - print $outHAL "\n \n"; - } - print $outHAL " \n"; - # Hotplug vendor header if ($vendorName{$vendorId}) { print $outHotplug "\n# ".$vendorName{$vendorId}."\n"; @@ -147,20 +139,17 @@ sub gen_usb_files print $outUdev "\n# ".$vendorName{$vendorId}."\n"; } + # devd vendor header + if ($vendorName{$vendorId}) { + print $out_devd "\n# ".$vendorName{$vendorId}."\n"; + } + + # UPower vendor header flag $upowerMfrHeaderDone = 0; foreach my $productId (sort { lc $a cmp lc $b } keys %{$vendor{$vendorId}}) { - # HAL device entry - print $outHAL " \n"; - print $outHAL " \n"; - print $outHAL ' battery'."\n"; - print $outHAL ' battery'."\n"; - print $outHAL " hald-addon-".$vendor{$vendorId}{$productId}{"driver"}."\n"; - print $outHAL ' ups'."\n"; - print $outHAL ' '."\n"; - # Hotplug device entry print $outHotplug "# ".$vendor{$vendorId}{$productId}{"comment"}."\n"; print $outHotplug "libhidups 0x0003 ".$vendorId." ".$productId." 0x0000 0x0000 0x00"; @@ -172,6 +161,17 @@ sub gen_usb_files print $outUdev "\", ATTR{idProduct}==\"".removeHexPrefix($productId)."\","; print $outUdev ' MODE="664", GROUP="@RUN_AS_GROUP@"'."\n"; + # devd device entry + print $out_devd "# ".$vendor{$vendorId}{$productId}{"comment"}.' - '.$vendor{$vendorId}{$productId}{"driver"}."\n"; + print $out_devd "notify 100 {\n\tmatch \"system\"\t\t\"USB\";\n"; + print $out_devd "\tmatch \"subsystem\"\t\"DEVICE\";\n"; + print $out_devd "\tmatch \"type\"\t\t\"ATTACH\";\n"; + print $out_devd "\tmatch \"vendor\"\t\t\"$vendorId\";\n"; + # + print $out_devd "\tmatch \"product\"\t\t\"$productId\";\n"; + print $out_devd "\taction \"chgrp \@RUN_AS_GROUP\@ /dev/\$device-name*; chmod g+rw /dev/\$device-name*\";\n"; + print $out_devd "};\n"; + # UPower device entry (only for USB/HID devices!) if ($vendor{$vendorId}{$productId}{"driver"} eq "usbhid-ups") { @@ -192,14 +192,7 @@ sub gen_usb_files # Device scanner entry print $outputDevScanner "\t{ ".$vendorId.', '.$productId.", \"".$vendor{$vendorId}{$productId}{"driver"}."\" },\n"; } - # HAL vendor footer - print $outHAL " \n"; } - # HAL footer - print $outHAL " \n"; - print $outHAL " \n"; - print $outHAL "\n"; - # Udev footer print $outUdev "\n".'LABEL="nut-usbups_rules_end"'."\n"; @@ -297,6 +290,9 @@ sub find_usbdevs elsif ($nameFile eq "richcomm_usb.c") { $driver="richcomm_usb"; } + elsif ($nameFile eq "nutdrv_atcl_usb.c") { + $driver="nutdrv_atcl_usb"; + } elsif ($nameFile eq "riello_usb.c") { $driver="riello_usb"; } From d0947d03cc8543ff8bef0ee1a5f155ea41b52854 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 20:43:14 +0200 Subject: [PATCH 096/240] New upstream release * New upstream release - Fix the undefined references (Closes: #731156) --- debian/changelog | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 85d0316..fa0a536 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,12 +1,14 @@ -nut (2.7.1-2) UNRELEASED; urgency=low +nut (2.7.2-1) UNRELEASED; urgency=low + * New upstream release + - Fix the undefined references (Closes: #731156) * debian/rules, debian/control, d/p/0004-fix-systemd-service.patch: Use a symlink instead of an Alias= to mask the SysV initscript * debian/control: Bump Standards-Version to 3.9.5 (no further changes) * debian/tests/control: Add lsb-release and netcat to the dependencies (Closes: #733189) - -- Laurent Bigonville Sun, 29 Dec 2013 16:35:33 +0100 + -- Laurent Bigonville Tue, 22 Apr 2014 20:42:08 +0200 nut (2.7.1-1) unstable; urgency=low From a766575eca0f0f082a343af725fe1e1b478577b2 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 24 Nov 2013 18:20:21 +0100 Subject: [PATCH 097/240] debian/control, debian/rules: Call dh-autoreconf and pass LDFLAGS to minimize runtime dependencies --- debian/changelog | 2 ++ debian/control | 1 + debian/rules | 8 ++++++++ 3 files changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index fa0a536..4c88058 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,6 +7,8 @@ nut (2.7.2-1) UNRELEASED; urgency=low * debian/control: Bump Standards-Version to 3.9.5 (no further changes) * debian/tests/control: Add lsb-release and netcat to the dependencies (Closes: #733189) + * debian/control, debian/rules: Call dh-autoreconf and pass LDFLAGS to + minimize runtime dependencies -- Laurent Bigonville Tue, 22 Apr 2014 20:42:08 +0200 diff --git a/debian/control b/debian/control index 3e32d44..b821640 100644 --- a/debian/control +++ b/debian/control @@ -6,6 +6,7 @@ Uploaders: Laurent Bigonville Build-Depends: debhelper (>= 8.1.3), cdbs (>= 0.4.122~), autotools-dev, + dh-autoreconf, dh-systemd (>= 1.14), libgd-dev | libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, diff --git a/debian/rules b/debian/rules index 570cf28..4e13232 100755 --- a/debian/rules +++ b/debian/rules @@ -4,12 +4,20 @@ include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/autotools.mk include /usr/share/cdbs/1/class/python-module.mk +include /usr/share/cdbs/1/rules/autoreconf.mk +# We cannot call autoreconf -f -i as it updates INSTALL which is used for doc +# generation +DEB_DH_AUTORECONF_ARGS = --as-needed + DEB_HOST_ARCH_OS := $(shell dpkg-architecture -qDEB_HOST_ARCH_OS 2>/dev/null) # List any files which are not installed include /usr/share/cdbs/1/rules/utils.mk common-binary-post-install-arch:: list-missing +DEB_LDFLAGS_MAINT_APPEND=-Wl,-z,defs -Wl,-O1 -Wl,--as-needed +include /usr/share/dpkg/buildflags.mk + DEB_CONFIGURE_PREFIX := DEB_CONFIGURE_SYSCONFDIR := /etc/nut DEB_CONFIGURE_INCLUDEDIR := /usr/include From c94a1d80c66ce7e839e79c81cacb7fee402a704e Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 20:55:43 +0200 Subject: [PATCH 098/240] debian/patches/0004-fix-systemd-service.patch: Refreshed --- debian/changelog | 3 ++- debian/patches/0004-fix-systemd-service.patch | 14 +------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/debian/changelog b/debian/changelog index 4c88058..b8b9430 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low * New upstream release - Fix the undefined references (Closes: #731156) + - debian/patches/0004-fix-systemd-service.patch: Refreshed * debian/rules, debian/control, d/p/0004-fix-systemd-service.patch: Use a symlink instead of an Alias= to mask the SysV initscript * debian/control: Bump Standards-Version to 3.9.5 (no further changes) @@ -10,7 +11,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low * debian/control, debian/rules: Call dh-autoreconf and pass LDFLAGS to minimize runtime dependencies - -- Laurent Bigonville Tue, 22 Apr 2014 20:42:08 +0200 + -- Laurent Bigonville Tue, 22 Apr 2014 20:55:27 +0200 nut (2.7.1-1) unstable; urgency=low diff --git a/debian/patches/0004-fix-systemd-service.patch b/debian/patches/0004-fix-systemd-service.patch index b6dff75..16df1c7 100644 --- a/debian/patches/0004-fix-systemd-service.patch +++ b/debian/patches/0004-fix-systemd-service.patch @@ -4,7 +4,7 @@ Forwarded: not-needed --- a/scripts/systemd/nut-driver.service.in +++ b/scripts/systemd/nut-driver.service.in -@@ -1,10 +1,11 @@ +@@ -1,6 +1,7 @@ [Unit] Description=Network UPS Tools - power device driver controller -After=local-fs.target network.target @@ -13,15 +13,3 @@ Forwarded: not-needed StopWhenUnneeded=yes [Service] --ExecStart=@DRVPATH@/upsdrvctl start --ExecStop=@DRVPATH@/upsdrvctl stop -+ExecStart=@SBINDIR@/upsdrvctl start -+ExecStop=@SBINDIR@/upsdrvctl stop - Type=forking - ---- a/scripts/systemd/nutshutdown.in -+++ b/scripts/systemd/nutshutdown.in -@@ -1,2 +1,2 @@ - #!/bin/sh --@SBINDIR@/upsmon -K >/dev/null 2>&1 && @driverexecdir@/upsdrvctl shutdown -+@SBINDIR@/upsmon -K >/dev/null 2>&1 && @SBINDIR@/upsdrvctl shutdown From 6621b7de39f8b34545f9ee65d92e4c56c7d7a9f6 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 20:57:00 +0200 Subject: [PATCH 099/240] Drop d/p/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch: Merged upstream --- debian/changelog | 4 +- ...ry-options-for-upsdrvctl-and-drivers.patch | 133 ------------------ debian/patches/series | 1 - 3 files changed, 3 insertions(+), 135 deletions(-) delete mode 100644 debian/patches/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch diff --git a/debian/changelog b/debian/changelog index b8b9430..5245d7d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,8 @@ nut (2.7.2-1) UNRELEASED; urgency=low * New upstream release - Fix the undefined references (Closes: #731156) - debian/patches/0004-fix-systemd-service.patch: Refreshed + - Drop d/p/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch: + Merged upstream * debian/rules, debian/control, d/p/0004-fix-systemd-service.patch: Use a symlink instead of an Alias= to mask the SysV initscript * debian/control: Bump Standards-Version to 3.9.5 (no further changes) @@ -11,7 +13,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low * debian/control, debian/rules: Call dh-autoreconf and pass LDFLAGS to minimize runtime dependencies - -- Laurent Bigonville Tue, 22 Apr 2014 20:55:27 +0200 + -- Laurent Bigonville Tue, 22 Apr 2014 20:56:12 +0200 nut (2.7.1-1) unstable; urgency=low diff --git a/debian/patches/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch b/debian/patches/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch deleted file mode 100644 index ee3cb8f..0000000 --- a/debian/patches/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch +++ /dev/null @@ -1,133 +0,0 @@ -From ad1e78a22dc91b70bee871425cd5f74bb3c34c9f Mon Sep 17 00:00:00 2001 -From: Laurent Bigonville -Date: Thu, 21 Nov 2013 17:52:16 +0100 -Subject: [PATCH] Provide retry options for upsdrvctl and driver(s) - -As recently seen in Debian (bugs #694717 and #677143), it may be required to -have upsdrvctl retrying to start the driver in case of failure. More -specifically, a mix of init system (V and systemd), udev and USB device(s) can -result in the /dev entry not being available at driver startup, thus resulting -in a general failure to start NUT. This commit provides at least a way to -overcome this issue. A more suitable solution will require more work on NUT -design. - -This patch if based on Arnaud Quette proposal ---- - docs/man/ups.conf.txt | 15 +++++++++++++++ - docs/man/upsdrvctl.txt | 3 ++- - drivers/upsdrvctl.c | 37 ++++++++++++++++++++++++++++++++++--- - 3 files changed, 51 insertions(+), 4 deletions(-) - -diff --git a/docs/man/ups.conf.txt b/docs/man/ups.conf.txt -index 8a72a83..4877852 100644 ---- a/docs/man/ups.conf.txt -+++ b/docs/man/ups.conf.txt -@@ -58,6 +58,21 @@ directory, which is often /usr/local/ups/bin. - Optional. Same as the UPS field of the same name, but this is the - default for UPSes that don't have the field. - -+*maxretry*:: -+Optional. Specify the number of attempts to start the driver(s), in case of -+failure, before giving up. A delay of 'retrydelay' is inserted between each -+attempt. Caution should be taken when using this option, since it can -+impact the time taken by your system to start. -++ -+The default is 1 attempt. -+ -+*retrydelay*:: -+Optional. Specify the delay between each restart attempt of the driver(s), -+as specified by 'maxretry'. Caution should be taken when using this option, -+since it can impact the time taken by your system to start. -++ -+The default is 5 seconds. -+ - *pollinterval*:: - - Optional. The status of the UPS will be refreshed after a maximum -diff --git a/docs/man/upsdrvctl.txt b/docs/man/upsdrvctl.txt -index f19fd77..52e5509 100644 ---- a/docs/man/upsdrvctl.txt -+++ b/docs/man/upsdrvctl.txt -@@ -63,7 +63,8 @@ Without that argument, they operate on every UPS that is currently - configured. - - *start*:: --Start the UPS driver(s). -+Start the UPS driver(s). In case of failure, further attempts may be executed -+by using the 'maxretry' and 'retrydelay' options - see linkman:ups.conf[5]. - - *stop*:: - Stop the UPS driver(s). -diff --git a/drivers/upsdrvctl.c b/drivers/upsdrvctl.c -index 623f753..0cdaa2c 100644 ---- a/drivers/upsdrvctl.c -+++ b/drivers/upsdrvctl.c -@@ -45,6 +45,12 @@ - /* timer - keeps us from getting stuck if a driver hangs */ - static int maxstartdelay = 45; - -+ /* counter - retry that many time(s) to start the driver if it fails to */ -+static int maxretry = 1; -+ -+ /* timer - delay between each restart attempt of the driver(s) */ -+static int retrydelay = 5; -+ - /* Directory where driver executables live */ - static char *driverpath = NULL; - -@@ -65,6 +71,12 @@ void do_upsconf_args(char *upsname, char *var, char *val) - driverpath = xstrdup(val); - } - -+ if (!strcmp(var, "maxretry")) -+ maxretry = atoi(val); -+ -+ if (!strcmp(var, "retrydelay")) -+ retrydelay = atoi(val); -+ - /* ignore anything else - it's probably for main */ - - return; -@@ -248,6 +260,7 @@ static void start_driver(const ups_t *ups) - char *argv[8]; - char dfn[SMALLBUF]; - int ret, arg = 0; -+ int initial_exec_error = exec_error, drv_maxretry = maxretry; - struct stat fs; - - upsdebugx(1, "Starting UPS: %s", ups->upsname); -@@ -276,10 +289,28 @@ static void start_driver(const ups_t *ups) - /* tie it off */ - argv[arg++] = NULL; - -- debugcmdline(2, "exec: ", argv); - -- if (!testmode) { -- forkexec(argv, ups); -+ while (drv_maxretry > 0) { -+ int cur_exec_error = exec_error; -+ -+ upsdebugx(2, "%i remaining attempts", drv_maxretry); -+ debugcmdline(2, "exec: ", argv); -+ drv_maxretry--; -+ -+ if (!testmode) { -+ forkexec(argv, ups); -+ } -+ -+ /* driver command succeeded */ -+ if (cur_exec_error == exec_error) { -+ drv_maxretry = 0; -+ exec_error = initial_exec_error; -+ } -+ else { -+ /* otherwise, retry if still needed */ -+ if (drv_maxretry > 0) -+ sleep (retrydelay); -+ } - } - } - --- -1.8.4 - diff --git a/debian/patches/series b/debian/patches/series index 45dbe55..09a762e 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,6 +1,5 @@ 0003-install-dev-files-in-usr.patch 0002-nut-monitor-paths.patch 0004-fix-systemd-service.patch -0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch 0006-ups-conf-maxretry.patch 0007-killpower-path.patch From d551399f973b8a7d6c5eb5d3b12cddf6aa5b2aef Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 21:16:19 +0200 Subject: [PATCH 100/240] debian/nut-server.install: Upstream is now installing upsdrvctl /sbin --- debian/changelog | 3 ++- debian/nut-server.install | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 5245d7d..1094015 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low - debian/patches/0004-fix-systemd-service.patch: Refreshed - Drop d/p/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch: Merged upstream + - debian/nut-server.install: Upstream is now installing upsdrvctl /sbin * debian/rules, debian/control, d/p/0004-fix-systemd-service.patch: Use a symlink instead of an Alias= to mask the SysV initscript * debian/control: Bump Standards-Version to 3.9.5 (no further changes) @@ -13,7 +14,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low * debian/control, debian/rules: Call dh-autoreconf and pass LDFLAGS to minimize runtime dependencies - -- Laurent Bigonville Tue, 22 Apr 2014 20:56:12 +0200 + -- Laurent Bigonville Tue, 22 Apr 2014 21:15:52 +0200 nut (2.7.1-1) unstable; urgency=low diff --git a/debian/nut-server.install b/debian/nut-server.install index 1a61309..e515b0f 100644 --- a/debian/nut-server.install +++ b/debian/nut-server.install @@ -1,4 +1,5 @@ debian/tmp/sbin/upsd +debian/tmp/sbin/upsdrvctl debian/tmp/usr/share/nut/cmdvartab debian/tmp/usr/share/nut/driver.list debian/tmp/*/udev/rules.d/52-nut-usbups.rules @@ -44,7 +45,6 @@ debian/tmp/lib/nut/bcmxcp_usb debian/tmp/lib/nut/victronups debian/tmp/lib/nut/tripplitesu debian/tmp/lib/nut/optiups -debian/tmp/lib/nut/upsdrvctl /sbin debian/tmp/lib/nut/everups debian/tmp/lib/nut/dummy-ups debian/tmp/lib/nut/richcomm_usb From 8bd57e3e0131fd25c611792380f1087b1ef4ed03 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 21:25:56 +0200 Subject: [PATCH 101/240] Rename package libupsclient3 to libupsclient4, soname got bumped again --- debian/changelog | 3 +- debian/control | 4 +- debian/libupsclient3.symbols | 27 ------- ...sclient3.install => libupsclient4.install} | 0 debian/libupsclient4.symbols | 78 +++++++++++++++++++ debian/rules | 2 +- 6 files changed, 83 insertions(+), 31 deletions(-) delete mode 100644 debian/libupsclient3.symbols rename debian/{libupsclient3.install => libupsclient4.install} (100%) create mode 100644 debian/libupsclient4.symbols diff --git a/debian/changelog b/debian/changelog index 1094015..1a67944 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low - Drop d/p/0005-Provide-retry-options-for-upsdrvctl-and-drivers.patch: Merged upstream - debian/nut-server.install: Upstream is now installing upsdrvctl /sbin + - Rename package libupsclient3 to libupsclient4, soname got bumped again * debian/rules, debian/control, d/p/0004-fix-systemd-service.patch: Use a symlink instead of an Alias= to mask the SysV initscript * debian/control: Bump Standards-Version to 3.9.5 (no further changes) @@ -14,7 +15,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low * debian/control, debian/rules: Call dh-autoreconf and pass LDFLAGS to minimize runtime dependencies - -- Laurent Bigonville Tue, 22 Apr 2014 21:15:52 +0200 + -- Laurent Bigonville Tue, 22 Apr 2014 21:25:23 +0200 nut (2.7.1-1) unstable; urgency=low diff --git a/debian/control b/debian/control index b821640..11e4876 100644 --- a/debian/control +++ b/debian/control @@ -165,7 +165,7 @@ Description: network UPS tools - documentation . This package contains FAQ, user, developer and packager documentation. -Package: libupsclient3 +Package: libupsclient4 Section: libs Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} @@ -183,7 +183,7 @@ Description: network UPS tools - client library Package: libupsclient-dev Section: libdevel Architecture: any -Depends: libupsclient3 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Depends: libupsclient4 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} Conflicts: libupsclient1-dev Replaces: libupsclient1-dev Description: network UPS tools - development files diff --git a/debian/libupsclient3.symbols b/debian/libupsclient3.symbols deleted file mode 100644 index 4fc0a9f..0000000 --- a/debian/libupsclient3.symbols +++ /dev/null @@ -1,27 +0,0 @@ -libupsclient.so.3 libupsclient3 #MINVER# - pconf_char@Base 2.7.1 - pconf_encode@Base 2.7.1 - pconf_file_begin@Base 2.7.1 - pconf_file_next@Base 2.7.1 - pconf_finish@Base 2.7.1 - pconf_init@Base 2.7.1 - pconf_line@Base 2.7.1 - pconf_parse_error@Base 2.7.1 - upscli_add_host_cert@Base 2.7.1 - upscli_cleanup@Base 2.7.1 - upscli_connect@Base 2.7.1 - upscli_disconnect@Base 2.7.1 - upscli_errlist@Base 2.7.1 - upscli_fd@Base 2.7.1 - upscli_get@Base 2.7.1 - upscli_init@Base 2.7.1 - upscli_list_next@Base 2.7.1 - upscli_list_start@Base 2.7.1 - upscli_readline@Base 2.7.1 - upscli_sendline@Base 2.7.1 - upscli_splitaddr@Base 2.7.1 - upscli_splitname@Base 2.7.1 - upscli_ssl@Base 2.7.1 - upscli_strerror@Base 2.7.1 - upscli_upserror@Base 2.7.1 - upscli_tryconnect@Base 2.7.1 diff --git a/debian/libupsclient3.install b/debian/libupsclient4.install similarity index 100% rename from debian/libupsclient3.install rename to debian/libupsclient4.install diff --git a/debian/libupsclient4.symbols b/debian/libupsclient4.symbols new file mode 100644 index 0000000..c72efc4 --- /dev/null +++ b/debian/libupsclient4.symbols @@ -0,0 +1,78 @@ +libupsclient.so.4 libupsclient4 #MINVER# + UPS_VERSION@Base 2.7.2 + altpidpath@Base 2.7.2 + background@Base 2.7.2 + become_user@Base 2.7.2 + chroot_start@Base 2.7.2 + confpath@Base 2.7.2 + dflt_statepath@Base 2.7.2 + fatal_with_errno@Base 2.7.2 + fatalx@Base 2.7.2 + get_user_pwent@Base 2.7.2 + ltrim@Base 2.7.2 + nut_debug_level@Base 2.7.2 + nut_log_level@Base 2.7.2 + open_syslog@Base 2.7.2 + pconf_char@Base 2.7.2 + pconf_encode@Base 2.7.2 + pconf_file_begin@Base 2.7.2 + pconf_file_next@Base 2.7.2 + pconf_finish@Base 2.7.2 + pconf_init@Base 2.7.2 + pconf_line@Base 2.7.2 + pconf_parse_error@Base 2.7.2 + rtrim@Base 2.7.2 + select_read@Base 2.7.2 + select_write@Base 2.7.2 + sendsignal@Base 2.7.2 + sendsignalfn@Base 2.7.2 + snprintfcat@Base 2.7.2 + state_addcmd@Base 2.7.2 + state_addenum@Base 2.7.2 + state_addrange@Base 2.7.2 + state_cmdfree@Base 2.7.2 + state_delcmd@Base 2.7.2 + state_delenum@Base 2.7.2 + state_delinfo@Base 2.7.2 + state_delrange@Base 2.7.2 + state_getaux@Base 2.7.2 + state_getenumlist@Base 2.7.2 + state_getflags@Base 2.7.2 + state_getinfo@Base 2.7.2 + state_getrangelist@Base 2.7.2 + state_infofree@Base 2.7.2 + state_setaux@Base 2.7.2 + state_setflags@Base 2.7.2 + state_setinfo@Base 2.7.2 + state_tree_find@Base 2.7.2 + syslogbit_set@Base 2.7.2 + upscli_add_host_cert@Base 2.7.2 + upscli_cleanup@Base 2.7.2 + upscli_connect@Base 2.7.2 + upscli_disconnect@Base 2.7.2 + upscli_errlist@Base 2.7.2 + upscli_fd@Base 2.7.2 + upscli_get@Base 2.7.2 + upscli_init@Base 2.7.2 + upscli_list_next@Base 2.7.2 + upscli_list_start@Base 2.7.2 + upscli_readline@Base 2.7.2 + upscli_sendline@Base 2.7.2 + upscli_splitaddr@Base 2.7.2 + upscli_splitname@Base 2.7.2 + upscli_ssl@Base 2.7.2 + upscli_strerror@Base 2.7.2 + upscli_tryconnect@Base 2.7.2 + upscli_upserror@Base 2.7.2 + upsdebug_ascii@Base 2.7.2 + upsdebug_hex@Base 2.7.2 + upsdebug_with_errno@Base 2.7.2 + upsdebugx@Base 2.7.2 + upslog_with_errno@Base 2.7.2 + upslogx@Base 2.7.2 + writepid@Base 2.7.2 + xbasename@Base 2.7.2 + xcalloc@Base 2.7.2 + xmalloc@Base 2.7.2 + xrealloc@Base 2.7.2 + xstrdup@Base 2.7.2 diff --git a/debian/rules b/debian/rules index 4e13232..b169acd 100755 --- a/debian/rules +++ b/debian/rules @@ -74,7 +74,7 @@ common-install-arch:: mv $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/libupsclient.a \ $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.a rm -f $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so - ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.3 \ + ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.4 \ $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so # Install systemd files only on systems where it's supported From f26715942d235bdbbdfb1929ee038d47a2a436aa Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 21:46:02 +0200 Subject: [PATCH 102/240] debian/patches/0008-drop-w3c-icons.patch: Remove the link to external W3C icons to prevent privacy breach (privacy-breach-w3c-valid-html) --- debian/changelog | 4 +++- debian/patches/0008-drop-w3c-icons.patch | 26 ++++++++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 debian/patches/0008-drop-w3c-icons.patch diff --git a/debian/changelog b/debian/changelog index 1a67944..7184137 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,8 +14,10 @@ nut (2.7.2-1) UNRELEASED; urgency=low (Closes: #733189) * debian/control, debian/rules: Call dh-autoreconf and pass LDFLAGS to minimize runtime dependencies + * debian/patches/0008-drop-w3c-icons.patch: Remove the link to external W3C + icons to prevent privacy breach (privacy-breach-w3c-valid-html) - -- Laurent Bigonville Tue, 22 Apr 2014 21:25:23 +0200 + -- Laurent Bigonville Tue, 22 Apr 2014 21:44:35 +0200 nut (2.7.1-1) unstable; urgency=low diff --git a/debian/patches/0008-drop-w3c-icons.patch b/debian/patches/0008-drop-w3c-icons.patch new file mode 100644 index 0000000..ac05a34 --- /dev/null +++ b/debian/patches/0008-drop-w3c-icons.patch @@ -0,0 +1,26 @@ +--- a/conf/upsstats.html.sample ++++ b/conf/upsstats.html.sample +@@ -180,11 +180,4 @@ Network UPS Tools upsstats + + + +-
    +-Valid CSS! +- +-
    +- + +--- a/conf/upsstats-single.html.sample ++++ b/conf/upsstats-single.html.sample +@@ -286,9 +286,6 @@ + + + +-Valid HTML 4.0 Transitional + + + diff --git a/debian/patches/series b/debian/patches/series index 09a762e..5046408 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -3,3 +3,4 @@ 0004-fix-systemd-service.patch 0006-ups-conf-maxretry.patch 0007-killpower-path.patch +0008-drop-w3c-icons.patch From 1e664224b23d5bf959141eb85cd5ad4c3941704f Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 22:14:57 +0200 Subject: [PATCH 103/240] debian/nut-server.install, debian/nut-server.manpages: Install new nutdrv_atcl_usb driver --- debian/changelog | 4 +++- debian/nut-server.install | 1 + debian/nut-server.manpages | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 7184137..f3f767b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,8 +16,10 @@ nut (2.7.2-1) UNRELEASED; urgency=low minimize runtime dependencies * debian/patches/0008-drop-w3c-icons.patch: Remove the link to external W3C icons to prevent privacy breach (privacy-breach-w3c-valid-html) + * debian/nut-server.install, debian/nut-server.manpages: Install new + nutdrv_atcl_usb driver - -- Laurent Bigonville Tue, 22 Apr 2014 21:44:35 +0200 + -- Laurent Bigonville Tue, 22 Apr 2014 22:14:11 +0200 nut (2.7.1-1) unstable; urgency=low diff --git a/debian/nut-server.install b/debian/nut-server.install index e515b0f..8b67a85 100644 --- a/debian/nut-server.install +++ b/debian/nut-server.install @@ -52,6 +52,7 @@ debian/tmp/lib/nut/liebert-esp2 debian/tmp/lib/nut/microdowell debian/tmp/lib/nut/al175 debian/tmp/lib/nut/apcupsd-ups +debian/tmp/lib/nut/nutdrv_atcl_usb debian/tmp/lib/nut/nutdrv_qx debian/tmp/lib/nut/riello_ser debian/tmp/lib/nut/riello_usb diff --git a/debian/nut-server.manpages b/debian/nut-server.manpages index 44de902..d5cf07e 100644 --- a/debian/nut-server.manpages +++ b/debian/nut-server.manpages @@ -47,6 +47,7 @@ debian/tmp/usr/share/man/man8/al175.8 debian/tmp/usr/share/man/man8/apcupsd-ups.8 debian/tmp/usr/share/man/man8/blazer_ser.8 debian/tmp/usr/share/man/man8/blazer_usb.8 +debian/tmp/usr/share/man/man8/nutdrv_atcl_usb.8 debian/tmp/usr/share/man/man8/nutdrv_qx.8 debian/tmp/usr/share/man/man8/riello_ser.8 debian/tmp/usr/share/man/man8/riello_usb.8 From d504d6110114d00726a7bc9d3025bee81209c428 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 22 Apr 2014 22:46:17 +0200 Subject: [PATCH 104/240] Release to unstable --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index f3f767b..e940af1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nut (2.7.2-1) UNRELEASED; urgency=low +nut (2.7.2-1) unstable; urgency=low * New upstream release - Fix the undefined references (Closes: #731156) @@ -19,7 +19,7 @@ nut (2.7.2-1) UNRELEASED; urgency=low * debian/nut-server.install, debian/nut-server.manpages: Install new nutdrv_atcl_usb driver - -- Laurent Bigonville Tue, 22 Apr 2014 22:14:11 +0200 + -- Laurent Bigonville Tue, 22 Apr 2014 22:46:12 +0200 nut (2.7.1-1) unstable; urgency=low From 165791ea2ad25a48267b89079e4c3dde5923b854 Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Mon, 20 Oct 2014 20:06:06 +0200 Subject: [PATCH 105/240] New packages: libnutclient0 and libnutclient-dev --- debian/changelog | 10 ++ debian/control | 28 ++++ debian/libnutclient-dev.install | 4 + debian/libnutclient-dev.manpages | 34 +++++ debian/libnutclient0.install | 1 + debian/libnutclient0.symbols | 234 +++++++++++++++++++++++++++++++ debian/rules | 5 + 7 files changed, 316 insertions(+) create mode 100644 debian/libnutclient-dev.install create mode 100644 debian/libnutclient-dev.manpages create mode 100644 debian/libnutclient0.install create mode 100644 debian/libnutclient0.symbols diff --git a/debian/changelog b/debian/changelog index e940af1..687fd78 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +nut (2.7.2-2) UNRELEASED; urgency=low + + * debian/control: add new packages libnutclient0 and libnutclient-dev + * debian/rules: adapted for the new packages + * debian/libnutclient0.install, debian/libnutclient0.symbols, + debian/libnutclient-dev.install, debian/libnutclient-dev.manpages: + created for the new packages + + -- Arnaud Quette Mon, 20 Oct 2014 20:41:47 +0200 + nut (2.7.2-1) unstable; urgency=low * New upstream release diff --git a/debian/control b/debian/control index 11e4876..e6a2fbe 100644 --- a/debian/control +++ b/debian/control @@ -195,6 +195,34 @@ Description: network UPS tools - development files . This package provides the development files. +Package: libnutclient0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Description: network UPS tools - new client library + Network UPS Tools (NUT) is a client/server monitoring system that + allows computers to share uninterruptible power supply (UPS) and + power distribution unit (PDU) hardware. Clients access the hardware + through the server, and are notified whenever the power status + changes. + . + This package provides the new shared client library. + +Package: libnutclient-dev +Section: libdevel +Architecture: any +Depends: libnutclient0 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: network UPS tools - development files + Network UPS Tools (NUT) is a client/server monitoring system that + allows computers to share uninterruptible power supply (UPS) and + power distribution unit (PDU) hardware. Clients access the hardware + through the server, and are notified whenever the power status + changes. + . + This package provides the development files for the new client library. + Package: python-nut Section: python Architecture: all diff --git a/debian/libnutclient-dev.install b/debian/libnutclient-dev.install new file mode 100644 index 0000000..8d84fd6 --- /dev/null +++ b/debian/libnutclient-dev.install @@ -0,0 +1,4 @@ +usr/lib/*/libnutclient.so +usr/lib/*/libnutclient.a +usr/lib/*/pkgconfig/libnutclient.pc +usr/include/nutclient.h diff --git a/debian/libnutclient-dev.manpages b/debian/libnutclient-dev.manpages new file mode 100644 index 0000000..7ac2971 --- /dev/null +++ b/debian/libnutclient-dev.manpages @@ -0,0 +1,34 @@ +debian/tmp/usr/share/man/man3/libnutclient.3 +debian/tmp/usr/share/man/man3/libnutclient_commands.3 +debian/tmp/usr/share/man/man3/libnutclient_devices.3 +debian/tmp/usr/share/man/man3/libnutclient_general.3 +debian/tmp/usr/share/man/man3/libnutclient_misc.3 +debian/tmp/usr/share/man/man3/libnutclient_tcp.3 +debian/tmp/usr/share/man/man3/libnutclient_variables.3 +debian/tmp/usr/share/man/man3/nutclient_authenticate.3 +debian/tmp/usr/share/man/man3/nutclient_destroy.3 +debian/tmp/usr/share/man/man3/nutclient_device_forced_shutdown.3 +debian/tmp/usr/share/man/man3/nutclient_device_login.3 +debian/tmp/usr/share/man/man3/nutclient_device_master.3 +debian/tmp/usr/share/man/man3/nutclient_execute_device_command.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_command_description.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_commands.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_description.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_num_logins.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_rw_variables.3 +debian/tmp/usr/share/man/man3/nutclient_get_devices.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_variable_description.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_variables.3 +debian/tmp/usr/share/man/man3/nutclient_get_device_variable_values.3 +debian/tmp/usr/share/man/man3/nutclient_has_device.3 +debian/tmp/usr/share/man/man3/nutclient_has_device_command.3 +debian/tmp/usr/share/man/man3/nutclient_has_device_variable.3 +debian/tmp/usr/share/man/man3/nutclient_logout.3 +debian/tmp/usr/share/man/man3/nutclient_set_device_variable_value.3 +debian/tmp/usr/share/man/man3/nutclient_set_device_variable_values.3 +debian/tmp/usr/share/man/man3/nutclient_tcp_create_client.3 +debian/tmp/usr/share/man/man3/nutclient_tcp_disconnect.3 +debian/tmp/usr/share/man/man3/nutclient_tcp_get_timeout.3 +debian/tmp/usr/share/man/man3/nutclient_tcp_is_connected.3 +debian/tmp/usr/share/man/man3/nutclient_tcp_reconnect.3 +debian/tmp/usr/share/man/man3/nutclient_tcp_set_timeout.3 diff --git a/debian/libnutclient0.install b/debian/libnutclient0.install new file mode 100644 index 0000000..e5a792e --- /dev/null +++ b/debian/libnutclient0.install @@ -0,0 +1 @@ +lib/*/libnutclient.so.* diff --git a/debian/libnutclient0.symbols b/debian/libnutclient0.symbols new file mode 100644 index 0000000..dcc54cd --- /dev/null +++ b/debian/libnutclient0.symbols @@ -0,0 +1,234 @@ +libnutclient.so.0 libnutclient0 #MINVER# + _ZN3nut11IOExceptionD0Ev@Base 2.7.2 + _ZN3nut11IOExceptionD1Ev@Base 2.7.2 + _ZN3nut11IOExceptionD2Ev@Base 2.7.2 + _ZN3nut12NutExceptionC1ERKSs@Base 2.7.2 + _ZN3nut12NutExceptionC2ERKSs@Base 2.7.2 + _ZN3nut12NutExceptionD0Ev@Base 2.7.2 + _ZN3nut12NutExceptionD1Ev@Base 2.7.2 + _ZN3nut12NutExceptionD2Ev@Base 2.7.2 + _ZN3nut15SystemException3errEv@Base 2.7.2 + _ZN3nut15SystemExceptionC1Ev@Base 2.7.2 + _ZN3nut15SystemExceptionC2Ev@Base 2.7.2 + _ZN3nut15SystemExceptionD0Ev@Base 2.7.2 + _ZN3nut15SystemExceptionD1Ev@Base 2.7.2 + _ZN3nut15SystemExceptionD2Ev@Base 2.7.2 + _ZN3nut16TimeoutExceptionC1Ev@Base 2.7.2 + _ZN3nut16TimeoutExceptionC2Ev@Base 2.7.2 + _ZN3nut16TimeoutExceptionD0Ev@Base 2.7.2 + _ZN3nut16TimeoutExceptionD1Ev@Base 2.7.2 + _ZN3nut16TimeoutExceptionD2Ev@Base 2.7.2 + _ZN3nut20UnknownHostExceptionC1Ev@Base 2.7.2 + _ZN3nut20UnknownHostExceptionC2Ev@Base 2.7.2 + _ZN3nut20UnknownHostExceptionD0Ev@Base 2.7.2 + _ZN3nut20UnknownHostExceptionD1Ev@Base 2.7.2 + _ZN3nut20UnknownHostExceptionD2Ev@Base 2.7.2 + _ZN3nut21NotConnectedExceptionC1Ev@Base 2.7.2 + _ZN3nut21NotConnectedExceptionC2Ev@Base 2.7.2 + _ZN3nut21NotConnectedExceptionD0Ev@Base 2.7.2 + _ZN3nut21NotConnectedExceptionD1Ev@Base 2.7.2 + _ZN3nut21NotConnectedExceptionD2Ev@Base 2.7.2 + _ZN3nut6Client10getDevicesEv@Base 2.7.2 + _ZN3nut6Client16hasDeviceCommandERKSsS2_@Base 2.7.2 + _ZN3nut6Client17hasDeviceVariableERKSsS2_@Base 2.7.2 + _ZN3nut6Client23getDeviceVariableValuesERKSs@Base 2.7.2 + _ZN3nut6Client9getDeviceERKSs@Base 2.7.2 + _ZN3nut6Client9hasDeviceERKSs@Base 2.7.2 + _ZN3nut6ClientC1Ev@Base 2.7.2 + _ZN3nut6ClientC2Ev@Base 2.7.2 + _ZN3nut6ClientD1Ev@Base 2.7.2 + _ZN3nut6ClientD2Ev@Base 2.7.2 + _ZN3nut6Device10getCommandERKSs@Base 2.7.2 + _ZN3nut6Device11getCommandsEv@Base 2.7.2 + _ZN3nut6Device11getVariableERKSs@Base 2.7.2 + _ZN3nut6Device11setVariableERKSsRKSt6vectorISsSaISsEE@Base 2.7.2 + _ZN3nut6Device11setVariableERKSsS2_@Base 2.7.2 + _ZN3nut6Device12getNumLoginsEv@Base 2.7.2 + _ZN3nut6Device12getVariablesEv@Base 2.7.2 + _ZN3nut6Device14executeCommandERKSs@Base 2.7.2 + _ZN3nut6Device14forcedShutdownEv@Base 2.7.2 + _ZN3nut6Device14getDescriptionEv@Base 2.7.2 + _ZN3nut6Device14getRWVariablesEv@Base 2.7.2 + _ZN3nut6Device15getCommandNamesEv@Base 2.7.2 + _ZN3nut6Device16getVariableNamesEv@Base 2.7.2 + _ZN3nut6Device16getVariableValueERKSs@Base 2.7.2 + _ZN3nut6Device17getVariableValuesEv@Base 2.7.2 + _ZN3nut6Device18getRWVariableNamesEv@Base 2.7.2 + _ZN3nut6Device5loginEv@Base 2.7.2 + _ZN3nut6Device6masterEv@Base 2.7.2 + _ZN3nut6Device9getClientEv@Base 2.7.2 + _ZN3nut6DeviceC1EPNS_6ClientERKSs@Base 2.7.2 + _ZN3nut6DeviceC1ERKS0_@Base 2.7.2 + _ZN3nut6DeviceC2EPNS_6ClientERKSs@Base 2.7.2 + _ZN3nut6DeviceC2ERKS0_@Base 2.7.2 + _ZN3nut6DeviceD1Ev@Base 2.7.2 + _ZN3nut6DeviceD2Ev@Base 2.7.2 + _ZN3nut7Command14getDescriptionEv@Base 2.7.2 + _ZN3nut7Command7executeEv@Base 2.7.2 + _ZN3nut7Command9getDeviceEv@Base 2.7.2 + _ZN3nut7CommandC1EPNS_6DeviceERKSs@Base 2.7.2 + _ZN3nut7CommandC1ERKS0_@Base 2.7.2 + _ZN3nut7CommandC2EPNS_6DeviceERKSs@Base 2.7.2 + _ZN3nut7CommandC2ERKS0_@Base 2.7.2 + _ZN3nut7CommandD1Ev@Base 2.7.2 + _ZN3nut7CommandD2Ev@Base 2.7.2 + _ZN3nut8Variable14getDescriptionEv@Base 2.7.2 + _ZN3nut8Variable8getValueEv@Base 2.7.2 + _ZN3nut8Variable8setValueERKSs@Base 2.7.2 + _ZN3nut8Variable9getDeviceEv@Base 2.7.2 + _ZN3nut8Variable9setValuesERKSt6vectorISsSaISsEE@Base 2.7.2 + _ZN3nut8VariableC1EPNS_6DeviceERKSs@Base 2.7.2 + _ZN3nut8VariableC1ERKS0_@Base 2.7.2 + _ZN3nut8VariableC2EPNS_6DeviceERKSs@Base 2.7.2 + _ZN3nut8VariableC2ERKS0_@Base 2.7.2 + _ZN3nut8VariableD1Ev@Base 2.7.2 + _ZN3nut8VariableD2Ev@Base 2.7.2 + _ZN3nut8internal6Socket10disconnectEv@Base 2.7.2 + _ZN3nut8internal6Socket10setTimeoutEl@Base 2.7.2 + _ZN3nut8internal6Socket4readEPvm@Base 2.7.2 + _ZN3nut8internal6Socket4readEv@Base 2.7.2 + _ZN3nut8internal6Socket5writeEPKvm@Base 2.7.2 + _ZN3nut8internal6Socket5writeERKSs@Base 2.7.2 + _ZN3nut8internal6Socket7connectERKSsi@Base 2.7.2 + _ZN3nut8internal6SocketC1Ev@Base 2.7.2 + _ZN3nut8internal6SocketC2Ev@Base 2.7.2 + _ZN3nut9TcpClient10disconnectEv@Base 2.7.2 + _ZN3nut9TcpClient10setTimeoutEl@Base 2.7.2 + _ZN3nut9TcpClient11detectErrorERKSs@Base 2.7.2 + _ZN3nut9TcpClient11deviceLoginERKSs@Base 2.7.2 + _ZN3nut9TcpClient12authenticateERKSsS2_@Base 2.7.2 + _ZN3nut9TcpClient12deviceMasterERKSs@Base 2.7.2 + _ZN3nut9TcpClient14getDeviceNamesEv@Base 2.7.2 + _ZN3nut9TcpClient17setDeviceVariableERKSsS2_RKSt6vectorISsSaISsEE@Base 2.7.2 + _ZN3nut9TcpClient17setDeviceVariableERKSsS2_S2_@Base 2.7.2 + _ZN3nut9TcpClient18deviceGetNumLoginsERKSs@Base 2.7.2 + _ZN3nut9TcpClient20deviceForcedShutdownERKSs@Base 2.7.2 + _ZN3nut9TcpClient20executeDeviceCommandERKSsS2_@Base 2.7.2 + _ZN3nut9TcpClient20getDeviceDescriptionERKSs@Base 2.7.2 + _ZN3nut9TcpClient21getDeviceCommandNamesERKSs@Base 2.7.2 + _ZN3nut9TcpClient22getDeviceVariableNamesERKSs@Base 2.7.2 + _ZN3nut9TcpClient22getDeviceVariableValueERKSsS2_@Base 2.7.2 + _ZN3nut9TcpClient23getDeviceVariableValuesERKSs@Base 2.7.2 + _ZN3nut9TcpClient24getDeviceRWVariableNamesERKSs@Base 2.7.2 + _ZN3nut9TcpClient27getDeviceCommandDescriptionERKSsS2_@Base 2.7.2 + _ZN3nut9TcpClient28getDeviceVariableDescriptionERKSsS2_@Base 2.7.2 + _ZN3nut9TcpClient3getERKSsS2_@Base 2.7.2 + _ZN3nut9TcpClient4listERKSsS2_@Base 2.7.2 + _ZN3nut9TcpClient6escapeERKSs@Base 2.7.2 + _ZN3nut9TcpClient6logoutEv@Base 2.7.2 + _ZN3nut9TcpClient7connectERKSsi@Base 2.7.2 + _ZN3nut9TcpClient7connectEv@Base 2.7.2 + _ZN3nut9TcpClient7explodeERKSsm@Base 2.7.2 + _ZN3nut9TcpClient9getDeviceERKSs@Base 2.7.2 + _ZN3nut9TcpClient9sendQueryERKSs@Base 2.7.2 + _ZN3nut9TcpClientC1ERKSsi@Base 2.7.2 + _ZN3nut9TcpClientC1Ev@Base 2.7.2 + _ZN3nut9TcpClientC2ERKSsi@Base 2.7.2 + _ZN3nut9TcpClientC2Ev@Base 2.7.2 + _ZN3nut9TcpClientD1Ev@Base 2.7.2 + _ZN3nut9TcpClientD2Ev@Base 2.7.2 + _ZNK3nut12NutException3strEv@Base 2.7.2 + _ZNK3nut12NutException4whatEv@Base 2.7.2 + _ZNK3nut6Device4isOkEv@Base 2.7.2 + _ZNK3nut6Device7getNameEv@Base 2.7.2 + _ZNK3nut6Device9getClientEv@Base 2.7.2 + _ZNK3nut6DevicecvbEv@Base 2.7.2 + _ZNK3nut6DeviceeqERKS0_@Base 2.7.2 + _ZNK3nut6DeviceltERKS0_@Base 2.7.2 + _ZNK3nut6DevicentEv@Base 2.7.2 + _ZNK3nut7Command4isOkEv@Base 2.7.2 + _ZNK3nut7Command7getNameEv@Base 2.7.2 + _ZNK3nut7Command9getDeviceEv@Base 2.7.2 + _ZNK3nut7CommandcvbEv@Base 2.7.2 + _ZNK3nut7CommandeqERKS0_@Base 2.7.2 + _ZNK3nut7CommandltERKS0_@Base 2.7.2 + _ZNK3nut7CommandntEv@Base 2.7.2 + _ZNK3nut8Variable4isOkEv@Base 2.7.2 + _ZNK3nut8Variable7getNameEv@Base 2.7.2 + _ZNK3nut8Variable9getDeviceEv@Base 2.7.2 + _ZNK3nut8VariablecvbEv@Base 2.7.2 + _ZNK3nut8VariableeqERKS0_@Base 2.7.2 + _ZNK3nut8VariableltERKS0_@Base 2.7.2 + _ZNK3nut8VariablentEv@Base 2.7.2 + _ZNK3nut8internal6Socket11isConnectedEv@Base 2.7.2 + _ZNK3nut9TcpClient10getTimeoutEv@Base 2.7.2 + _ZNK3nut9TcpClient11isConnectedEv@Base 2.7.2 + _ZNK3nut9TcpClient7getHostEv@Base 2.7.2 + _ZNK3nut9TcpClient7getPortEv@Base 2.7.2 + _ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag@Base 2.7.2 + _ZNSt12_Destroy_auxILb0EE9__destroyIPSsEEvT_S3_@Base 2.7.2 + _ZNSt4pairIKSsSt6vectorISsSaISsEEED1Ev@Base 2.7.2 + _ZNSt4pairIKSsSt6vectorISsSaISsEEED2Ev@Base 2.7.2 + _ZNSt6vectorIS_ISsSaISsEESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_@Base 2.7.2 + _ZNSt6vectorIS_ISsSaISsEESaIS1_EED1Ev@Base 2.7.2 + _ZNSt6vectorIS_ISsSaISsEESaIS1_EED2Ev@Base 2.7.2 + _ZNSt6vectorISsSaISsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPSsS1_EERKSs@Base 2.7.2 + _ZNSt6vectorISsSaISsEED1Ev@Base 2.7.2 + _ZNSt6vectorISsSaISsEED2Ev@Base 2.7.2 + _ZNSt6vectorISsSaISsEEaSERKS1_@Base 2.7.2 + _ZNSt8_Rb_treeIN3nut6DeviceES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E@Base 2.7.2 + _ZNSt8_Rb_treeIN3nut7CommandES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E@Base 2.7.2 + _ZNSt8_Rb_treeIN3nut8VariableES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE16_M_insert_uniqueERKS1_@Base 2.7.2 + _ZNSt8_Rb_treeIN3nut8VariableES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E@Base 2.7.2 + _ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE16_M_insert_uniqueERKSs@Base 2.7.2 + _ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE4findERKSs@Base 2.7.2 + _ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE8_M_eraseEPSt13_Rb_tree_nodeISsE@Base 2.7.2 + _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE10_M_insert_EPSt18_Rb_tree_node_baseSD_RKS5_@Base 2.7.2 + _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE24_M_get_insert_unique_posERS1_@Base 2.7.2 + _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS5_ERS1_@Base 2.7.2 + _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE8_M_eraseEPSt13_Rb_tree_nodeIS5_E@Base 2.7.2 + _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@Base 2.7.2 + _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@Base 2.7.2 + _ZTIN3nut11IOExceptionE@Base 2.7.2 + _ZTIN3nut12NutExceptionE@Base 2.7.2 + _ZTIN3nut15SystemExceptionE@Base 2.7.2 + _ZTIN3nut16TimeoutExceptionE@Base 2.7.2 + _ZTIN3nut20UnknownHostExceptionE@Base 2.7.2 + _ZTIN3nut21NotConnectedExceptionE@Base 2.7.2 + _ZTIN3nut6ClientE@Base 2.7.2 + _ZTIN3nut9TcpClientE@Base 2.7.2 + _ZTSN3nut11IOExceptionE@Base 2.7.2 + _ZTSN3nut12NutExceptionE@Base 2.7.2 + _ZTSN3nut15SystemExceptionE@Base 2.7.2 + _ZTSN3nut16TimeoutExceptionE@Base 2.7.2 + _ZTSN3nut20UnknownHostExceptionE@Base 2.7.2 + _ZTSN3nut21NotConnectedExceptionE@Base 2.7.2 + _ZTSN3nut6ClientE@Base 2.7.2 + _ZTSN3nut9TcpClientE@Base 2.7.2 + _ZTVN3nut11IOExceptionE@Base 2.7.2 + _ZTVN3nut12NutExceptionE@Base 2.7.2 + _ZTVN3nut15SystemExceptionE@Base 2.7.2 + _ZTVN3nut16TimeoutExceptionE@Base 2.7.2 + _ZTVN3nut20UnknownHostExceptionE@Base 2.7.2 + _ZTVN3nut21NotConnectedExceptionE@Base 2.7.2 + _ZTVN3nut6ClientE@Base 2.7.2 + _ZTVN3nut9TcpClientE@Base 2.7.2 + nutclient_authenticate@Base 2.7.2 + nutclient_destroy@Base 2.7.2 + nutclient_device_forced_shutdown@Base 2.7.2 + nutclient_device_login@Base 2.7.2 + nutclient_device_master@Base 2.7.2 + nutclient_execute_device_command@Base 2.7.2 + nutclient_get_device_command_description@Base 2.7.2 + nutclient_get_device_commands@Base 2.7.2 + nutclient_get_device_description@Base 2.7.2 + nutclient_get_device_num_logins@Base 2.7.2 + nutclient_get_device_rw_variables@Base 2.7.2 + nutclient_get_device_variable_description@Base 2.7.2 + nutclient_get_device_variable_values@Base 2.7.2 + nutclient_get_device_variables@Base 2.7.2 + nutclient_get_devices@Base 2.7.2 + nutclient_has_device@Base 2.7.2 + nutclient_has_device_command@Base 2.7.2 + nutclient_has_device_variable@Base 2.7.2 + nutclient_logout@Base 2.7.2 + nutclient_set_device_variable_value@Base 2.7.2 + nutclient_set_device_variable_values@Base 2.7.2 + nutclient_tcp_create_client@Base 2.7.2 + nutclient_tcp_disconnect@Base 2.7.2 + nutclient_tcp_get_timeout@Base 2.7.2 + nutclient_tcp_is_connected@Base 2.7.2 + nutclient_tcp_reconnect@Base 2.7.2 + nutclient_tcp_set_timeout@Base 2.7.2 + strarr_alloc@Base 2.7.2 + strarr_free@Base 2.7.2 diff --git a/debian/rules b/debian/rules index b169acd..73abe42 100755 --- a/debian/rules +++ b/debian/rules @@ -76,6 +76,11 @@ common-install-arch:: rm -f $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.4 \ $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so + mv $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/libnutclient.a \ + $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libnutclient.a + rm -f $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/libnutclient.so + ln -s /lib/$(DEB_HOST_MULTIARCH)/libnutclient.so.0 \ + $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libnutclient.so # Install systemd files only on systems where it's supported ifeq (linux,$(DEB_HOST_ARCH_OS)) From c57ad7e8971e36fb7560e96ef82610544a79e1f4 Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Fri, 24 Oct 2014 23:02:25 +0200 Subject: [PATCH 106/240] Demangle C++ symbols --- debian/libnutclient0.symbols | 373 ++++++++++++++++------------------- 1 file changed, 169 insertions(+), 204 deletions(-) diff --git a/debian/libnutclient0.symbols b/debian/libnutclient0.symbols index dcc54cd..ccc230c 100644 --- a/debian/libnutclient0.symbols +++ b/debian/libnutclient0.symbols @@ -1,208 +1,173 @@ libnutclient.so.0 libnutclient0 #MINVER# - _ZN3nut11IOExceptionD0Ev@Base 2.7.2 - _ZN3nut11IOExceptionD1Ev@Base 2.7.2 - _ZN3nut11IOExceptionD2Ev@Base 2.7.2 - _ZN3nut12NutExceptionC1ERKSs@Base 2.7.2 - _ZN3nut12NutExceptionC2ERKSs@Base 2.7.2 - _ZN3nut12NutExceptionD0Ev@Base 2.7.2 - _ZN3nut12NutExceptionD1Ev@Base 2.7.2 - _ZN3nut12NutExceptionD2Ev@Base 2.7.2 - _ZN3nut15SystemException3errEv@Base 2.7.2 - _ZN3nut15SystemExceptionC1Ev@Base 2.7.2 - _ZN3nut15SystemExceptionC2Ev@Base 2.7.2 - _ZN3nut15SystemExceptionD0Ev@Base 2.7.2 - _ZN3nut15SystemExceptionD1Ev@Base 2.7.2 - _ZN3nut15SystemExceptionD2Ev@Base 2.7.2 - _ZN3nut16TimeoutExceptionC1Ev@Base 2.7.2 - _ZN3nut16TimeoutExceptionC2Ev@Base 2.7.2 - _ZN3nut16TimeoutExceptionD0Ev@Base 2.7.2 - _ZN3nut16TimeoutExceptionD1Ev@Base 2.7.2 - _ZN3nut16TimeoutExceptionD2Ev@Base 2.7.2 - _ZN3nut20UnknownHostExceptionC1Ev@Base 2.7.2 - _ZN3nut20UnknownHostExceptionC2Ev@Base 2.7.2 - _ZN3nut20UnknownHostExceptionD0Ev@Base 2.7.2 - _ZN3nut20UnknownHostExceptionD1Ev@Base 2.7.2 - _ZN3nut20UnknownHostExceptionD2Ev@Base 2.7.2 - _ZN3nut21NotConnectedExceptionC1Ev@Base 2.7.2 - _ZN3nut21NotConnectedExceptionC2Ev@Base 2.7.2 - _ZN3nut21NotConnectedExceptionD0Ev@Base 2.7.2 - _ZN3nut21NotConnectedExceptionD1Ev@Base 2.7.2 - _ZN3nut21NotConnectedExceptionD2Ev@Base 2.7.2 - _ZN3nut6Client10getDevicesEv@Base 2.7.2 - _ZN3nut6Client16hasDeviceCommandERKSsS2_@Base 2.7.2 - _ZN3nut6Client17hasDeviceVariableERKSsS2_@Base 2.7.2 - _ZN3nut6Client23getDeviceVariableValuesERKSs@Base 2.7.2 - _ZN3nut6Client9getDeviceERKSs@Base 2.7.2 - _ZN3nut6Client9hasDeviceERKSs@Base 2.7.2 - _ZN3nut6ClientC1Ev@Base 2.7.2 - _ZN3nut6ClientC2Ev@Base 2.7.2 - _ZN3nut6ClientD1Ev@Base 2.7.2 - _ZN3nut6ClientD2Ev@Base 2.7.2 - _ZN3nut6Device10getCommandERKSs@Base 2.7.2 - _ZN3nut6Device11getCommandsEv@Base 2.7.2 - _ZN3nut6Device11getVariableERKSs@Base 2.7.2 - _ZN3nut6Device11setVariableERKSsRKSt6vectorISsSaISsEE@Base 2.7.2 - _ZN3nut6Device11setVariableERKSsS2_@Base 2.7.2 - _ZN3nut6Device12getNumLoginsEv@Base 2.7.2 - _ZN3nut6Device12getVariablesEv@Base 2.7.2 - _ZN3nut6Device14executeCommandERKSs@Base 2.7.2 - _ZN3nut6Device14forcedShutdownEv@Base 2.7.2 - _ZN3nut6Device14getDescriptionEv@Base 2.7.2 - _ZN3nut6Device14getRWVariablesEv@Base 2.7.2 - _ZN3nut6Device15getCommandNamesEv@Base 2.7.2 - _ZN3nut6Device16getVariableNamesEv@Base 2.7.2 - _ZN3nut6Device16getVariableValueERKSs@Base 2.7.2 - _ZN3nut6Device17getVariableValuesEv@Base 2.7.2 - _ZN3nut6Device18getRWVariableNamesEv@Base 2.7.2 - _ZN3nut6Device5loginEv@Base 2.7.2 - _ZN3nut6Device6masterEv@Base 2.7.2 - _ZN3nut6Device9getClientEv@Base 2.7.2 - _ZN3nut6DeviceC1EPNS_6ClientERKSs@Base 2.7.2 - _ZN3nut6DeviceC1ERKS0_@Base 2.7.2 - _ZN3nut6DeviceC2EPNS_6ClientERKSs@Base 2.7.2 - _ZN3nut6DeviceC2ERKS0_@Base 2.7.2 - _ZN3nut6DeviceD1Ev@Base 2.7.2 - _ZN3nut6DeviceD2Ev@Base 2.7.2 - _ZN3nut7Command14getDescriptionEv@Base 2.7.2 - _ZN3nut7Command7executeEv@Base 2.7.2 - _ZN3nut7Command9getDeviceEv@Base 2.7.2 - _ZN3nut7CommandC1EPNS_6DeviceERKSs@Base 2.7.2 - _ZN3nut7CommandC1ERKS0_@Base 2.7.2 - _ZN3nut7CommandC2EPNS_6DeviceERKSs@Base 2.7.2 - _ZN3nut7CommandC2ERKS0_@Base 2.7.2 - _ZN3nut7CommandD1Ev@Base 2.7.2 - _ZN3nut7CommandD2Ev@Base 2.7.2 - _ZN3nut8Variable14getDescriptionEv@Base 2.7.2 - _ZN3nut8Variable8getValueEv@Base 2.7.2 - _ZN3nut8Variable8setValueERKSs@Base 2.7.2 - _ZN3nut8Variable9getDeviceEv@Base 2.7.2 - _ZN3nut8Variable9setValuesERKSt6vectorISsSaISsEE@Base 2.7.2 - _ZN3nut8VariableC1EPNS_6DeviceERKSs@Base 2.7.2 - _ZN3nut8VariableC1ERKS0_@Base 2.7.2 - _ZN3nut8VariableC2EPNS_6DeviceERKSs@Base 2.7.2 - _ZN3nut8VariableC2ERKS0_@Base 2.7.2 - _ZN3nut8VariableD1Ev@Base 2.7.2 - _ZN3nut8VariableD2Ev@Base 2.7.2 - _ZN3nut8internal6Socket10disconnectEv@Base 2.7.2 - _ZN3nut8internal6Socket10setTimeoutEl@Base 2.7.2 - _ZN3nut8internal6Socket4readEPvm@Base 2.7.2 - _ZN3nut8internal6Socket4readEv@Base 2.7.2 - _ZN3nut8internal6Socket5writeEPKvm@Base 2.7.2 - _ZN3nut8internal6Socket5writeERKSs@Base 2.7.2 - _ZN3nut8internal6Socket7connectERKSsi@Base 2.7.2 - _ZN3nut8internal6SocketC1Ev@Base 2.7.2 - _ZN3nut8internal6SocketC2Ev@Base 2.7.2 - _ZN3nut9TcpClient10disconnectEv@Base 2.7.2 - _ZN3nut9TcpClient10setTimeoutEl@Base 2.7.2 - _ZN3nut9TcpClient11detectErrorERKSs@Base 2.7.2 - _ZN3nut9TcpClient11deviceLoginERKSs@Base 2.7.2 - _ZN3nut9TcpClient12authenticateERKSsS2_@Base 2.7.2 - _ZN3nut9TcpClient12deviceMasterERKSs@Base 2.7.2 - _ZN3nut9TcpClient14getDeviceNamesEv@Base 2.7.2 - _ZN3nut9TcpClient17setDeviceVariableERKSsS2_RKSt6vectorISsSaISsEE@Base 2.7.2 - _ZN3nut9TcpClient17setDeviceVariableERKSsS2_S2_@Base 2.7.2 - _ZN3nut9TcpClient18deviceGetNumLoginsERKSs@Base 2.7.2 - _ZN3nut9TcpClient20deviceForcedShutdownERKSs@Base 2.7.2 - _ZN3nut9TcpClient20executeDeviceCommandERKSsS2_@Base 2.7.2 - _ZN3nut9TcpClient20getDeviceDescriptionERKSs@Base 2.7.2 - _ZN3nut9TcpClient21getDeviceCommandNamesERKSs@Base 2.7.2 - _ZN3nut9TcpClient22getDeviceVariableNamesERKSs@Base 2.7.2 - _ZN3nut9TcpClient22getDeviceVariableValueERKSsS2_@Base 2.7.2 - _ZN3nut9TcpClient23getDeviceVariableValuesERKSs@Base 2.7.2 - _ZN3nut9TcpClient24getDeviceRWVariableNamesERKSs@Base 2.7.2 - _ZN3nut9TcpClient27getDeviceCommandDescriptionERKSsS2_@Base 2.7.2 - _ZN3nut9TcpClient28getDeviceVariableDescriptionERKSsS2_@Base 2.7.2 - _ZN3nut9TcpClient3getERKSsS2_@Base 2.7.2 - _ZN3nut9TcpClient4listERKSsS2_@Base 2.7.2 - _ZN3nut9TcpClient6escapeERKSs@Base 2.7.2 - _ZN3nut9TcpClient6logoutEv@Base 2.7.2 - _ZN3nut9TcpClient7connectERKSsi@Base 2.7.2 - _ZN3nut9TcpClient7connectEv@Base 2.7.2 - _ZN3nut9TcpClient7explodeERKSsm@Base 2.7.2 - _ZN3nut9TcpClient9getDeviceERKSs@Base 2.7.2 - _ZN3nut9TcpClient9sendQueryERKSs@Base 2.7.2 - _ZN3nut9TcpClientC1ERKSsi@Base 2.7.2 - _ZN3nut9TcpClientC1Ev@Base 2.7.2 - _ZN3nut9TcpClientC2ERKSsi@Base 2.7.2 - _ZN3nut9TcpClientC2Ev@Base 2.7.2 - _ZN3nut9TcpClientD1Ev@Base 2.7.2 - _ZN3nut9TcpClientD2Ev@Base 2.7.2 - _ZNK3nut12NutException3strEv@Base 2.7.2 - _ZNK3nut12NutException4whatEv@Base 2.7.2 - _ZNK3nut6Device4isOkEv@Base 2.7.2 - _ZNK3nut6Device7getNameEv@Base 2.7.2 - _ZNK3nut6Device9getClientEv@Base 2.7.2 - _ZNK3nut6DevicecvbEv@Base 2.7.2 - _ZNK3nut6DeviceeqERKS0_@Base 2.7.2 - _ZNK3nut6DeviceltERKS0_@Base 2.7.2 - _ZNK3nut6DevicentEv@Base 2.7.2 - _ZNK3nut7Command4isOkEv@Base 2.7.2 - _ZNK3nut7Command7getNameEv@Base 2.7.2 - _ZNK3nut7Command9getDeviceEv@Base 2.7.2 - _ZNK3nut7CommandcvbEv@Base 2.7.2 - _ZNK3nut7CommandeqERKS0_@Base 2.7.2 - _ZNK3nut7CommandltERKS0_@Base 2.7.2 - _ZNK3nut7CommandntEv@Base 2.7.2 - _ZNK3nut8Variable4isOkEv@Base 2.7.2 - _ZNK3nut8Variable7getNameEv@Base 2.7.2 - _ZNK3nut8Variable9getDeviceEv@Base 2.7.2 - _ZNK3nut8VariablecvbEv@Base 2.7.2 - _ZNK3nut8VariableeqERKS0_@Base 2.7.2 - _ZNK3nut8VariableltERKS0_@Base 2.7.2 - _ZNK3nut8VariablentEv@Base 2.7.2 - _ZNK3nut8internal6Socket11isConnectedEv@Base 2.7.2 - _ZNK3nut9TcpClient10getTimeoutEv@Base 2.7.2 - _ZNK3nut9TcpClient11isConnectedEv@Base 2.7.2 - _ZNK3nut9TcpClient7getHostEv@Base 2.7.2 - _ZNK3nut9TcpClient7getPortEv@Base 2.7.2 - _ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag@Base 2.7.2 - _ZNSt12_Destroy_auxILb0EE9__destroyIPSsEEvT_S3_@Base 2.7.2 - _ZNSt4pairIKSsSt6vectorISsSaISsEEED1Ev@Base 2.7.2 - _ZNSt4pairIKSsSt6vectorISsSaISsEEED2Ev@Base 2.7.2 - _ZNSt6vectorIS_ISsSaISsEESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_@Base 2.7.2 - _ZNSt6vectorIS_ISsSaISsEESaIS1_EED1Ev@Base 2.7.2 - _ZNSt6vectorIS_ISsSaISsEESaIS1_EED2Ev@Base 2.7.2 - _ZNSt6vectorISsSaISsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPSsS1_EERKSs@Base 2.7.2 - _ZNSt6vectorISsSaISsEED1Ev@Base 2.7.2 - _ZNSt6vectorISsSaISsEED2Ev@Base 2.7.2 - _ZNSt6vectorISsSaISsEEaSERKS1_@Base 2.7.2 - _ZNSt8_Rb_treeIN3nut6DeviceES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E@Base 2.7.2 - _ZNSt8_Rb_treeIN3nut7CommandES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E@Base 2.7.2 - _ZNSt8_Rb_treeIN3nut8VariableES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE16_M_insert_uniqueERKS1_@Base 2.7.2 - _ZNSt8_Rb_treeIN3nut8VariableES1_St9_IdentityIS1_ESt4lessIS1_ESaIS1_EE8_M_eraseEPSt13_Rb_tree_nodeIS1_E@Base 2.7.2 - _ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE16_M_insert_uniqueERKSs@Base 2.7.2 - _ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE4findERKSs@Base 2.7.2 - _ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE8_M_eraseEPSt13_Rb_tree_nodeISsE@Base 2.7.2 - _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE10_M_insert_EPSt18_Rb_tree_node_baseSD_RKS5_@Base 2.7.2 - _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE24_M_get_insert_unique_posERS1_@Base 2.7.2 - _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS5_ERS1_@Base 2.7.2 - _ZNSt8_Rb_treeISsSt4pairIKSsSt6vectorISsSaISsEEESt10_Select1stIS5_ESt4lessISsESaIS5_EE8_M_eraseEPSt13_Rb_tree_nodeIS5_E@Base 2.7.2 - _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@Base 2.7.2 - _ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@Base 2.7.2 - _ZTIN3nut11IOExceptionE@Base 2.7.2 - _ZTIN3nut12NutExceptionE@Base 2.7.2 - _ZTIN3nut15SystemExceptionE@Base 2.7.2 - _ZTIN3nut16TimeoutExceptionE@Base 2.7.2 - _ZTIN3nut20UnknownHostExceptionE@Base 2.7.2 - _ZTIN3nut21NotConnectedExceptionE@Base 2.7.2 - _ZTIN3nut6ClientE@Base 2.7.2 - _ZTIN3nut9TcpClientE@Base 2.7.2 - _ZTSN3nut11IOExceptionE@Base 2.7.2 - _ZTSN3nut12NutExceptionE@Base 2.7.2 - _ZTSN3nut15SystemExceptionE@Base 2.7.2 - _ZTSN3nut16TimeoutExceptionE@Base 2.7.2 - _ZTSN3nut20UnknownHostExceptionE@Base 2.7.2 - _ZTSN3nut21NotConnectedExceptionE@Base 2.7.2 - _ZTSN3nut6ClientE@Base 2.7.2 - _ZTSN3nut9TcpClientE@Base 2.7.2 - _ZTVN3nut11IOExceptionE@Base 2.7.2 - _ZTVN3nut12NutExceptionE@Base 2.7.2 - _ZTVN3nut15SystemExceptionE@Base 2.7.2 - _ZTVN3nut16TimeoutExceptionE@Base 2.7.2 - _ZTVN3nut20UnknownHostExceptionE@Base 2.7.2 - _ZTVN3nut21NotConnectedExceptionE@Base 2.7.2 - _ZTVN3nut6ClientE@Base 2.7.2 - _ZTVN3nut9TcpClientE@Base 2.7.2 + (c++)"nut::IOException::~IOException()@Base" 2.7.2 + (c++)"nut::NutException::NutException(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::NutException::~NutException()@Base" 2.7.2 + (c++)"nut::SystemException::err()@Base" 2.7.2 + (c++)"nut::SystemException::SystemException()@Base" 2.7.2 + (c++)"nut::SystemException::~SystemException()@Base" 2.7.2 + (c++)"nut::TimeoutException::TimeoutException()@Base" 2.7.2 + (c++)"nut::TimeoutException::~TimeoutException()@Base" 2.7.2 + (c++)"nut::UnknownHostException::UnknownHostException()@Base" 2.7.2 + (c++)"nut::UnknownHostException::~UnknownHostException()@Base" 2.7.2 + (c++)"nut::NotConnectedException::NotConnectedException()@Base" 2.7.2 + (c++)"nut::NotConnectedException::~NotConnectedException()@Base" 2.7.2 + (c++)"nut::Client::getDevices()@Base" 2.7.2 + (c++)"nut::Client::hasDeviceCommand(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Client::hasDeviceVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Client::getDeviceVariableValues(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Client::getDevice(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Client::hasDevice(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Client::Client()@Base" 2.7.2 + (c++)"nut::Client::~Client()@Base" 2.7.2 + (c++)"nut::Device::getCommand(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Device::getCommands()@Base" 2.7.2 + (c++)"nut::Device::getVariable(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Device::setVariable(std::basic_string, std::allocator > const&, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 + (c++)"nut::Device::setVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Device::getNumLogins()@Base" 2.7.2 + (c++)"nut::Device::getVariables()@Base" 2.7.2 + (c++)"nut::Device::executeCommand(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Device::forcedShutdown()@Base" 2.7.2 + (c++)"nut::Device::getDescription()@Base" 2.7.2 + (c++)"nut::Device::getRWVariables()@Base" 2.7.2 + (c++)"nut::Device::getCommandNames()@Base" 2.7.2 + (c++)"nut::Device::getVariableNames()@Base" 2.7.2 + (c++)"nut::Device::getVariableValue(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Device::getVariableValues()@Base" 2.7.2 + (c++)"nut::Device::getRWVariableNames()@Base" 2.7.2 + (c++)"nut::Device::login()@Base" 2.7.2 + (c++)"nut::Device::master()@Base" 2.7.2 + (c++)"nut::Device::getClient()@Base" 2.7.2 + (c++)"nut::Device::Device(nut::Client*, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Device::Device(nut::Device const&)@Base" 2.7.2 + (c++)"nut::Device::~Device()@Base" 2.7.2 + (c++)"nut::Command::getDescription()@Base" 2.7.2 + (c++)"nut::Command::execute()@Base" 2.7.2 + (c++)"nut::Command::getDevice()@Base" 2.7.2 + (c++)"nut::Command::Command(nut::Device*, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Command::Command(nut::Command const&)@Base" 2.7.2 + (c++)"nut::Command::~Command()@Base" 2.7.2 + (c++)"nut::Variable::getDescription()@Base" 2.7.2 + (c++)"nut::Variable::getValue()@Base" 2.7.2 + (c++)"nut::Variable::setValue(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Variable::getDevice()@Base" 2.7.2 + (c++)"nut::Variable::setValues(std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 + (c++)"nut::Variable::Variable(nut::Device*, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::Variable::Variable(nut::Variable const&)@Base" 2.7.2 + (c++)"nut::Variable::~Variable()@Base" 2.7.2 + (c++)"nut::internal::Socket::disconnect()@Base" 2.7.2 + (c++)"nut::internal::Socket::setTimeout(long)@Base" 2.7.2 + (c++)"nut::internal::Socket::read(void*, unsigned long)@Base" 2.7.2 + (c++)"nut::internal::Socket::read()@Base" 2.7.2 + (c++)"nut::internal::Socket::write(void const*, unsigned long)@Base" 2.7.2 + (c++)"nut::internal::Socket::write(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::internal::Socket::connect(std::basic_string, std::allocator > const&, int)@Base" 2.7.2 + (c++)"nut::internal::Socket::Socket()@Base" 2.7.2 + (c++)"nut::TcpClient::disconnect()@Base" 2.7.2 + (c++)"nut::TcpClient::setTimeout(long)@Base" 2.7.2 + (c++)"nut::TcpClient::detectError(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::deviceLogin(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::authenticate(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::deviceMaster(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceNames()@Base" 2.7.2 + (c++)"nut::TcpClient::setDeviceVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::setDeviceVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::deviceGetNumLogins(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::deviceForcedShutdown(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::executeDeviceCommand(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceDescription(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceCommandNames(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceVariableNames(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceVariableValue(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceVariableValues(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceRWVariableNames(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceCommandDescription(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::getDeviceVariableDescription(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::get(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::list(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::escape(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::logout()@Base" 2.7.2 + (c++)"nut::TcpClient::connect(std::basic_string, std::allocator > const&, int)@Base" 2.7.2 + (c++)"nut::TcpClient::connect()@Base" 2.7.2 + (c++)"nut::TcpClient::explode(std::basic_string, std::allocator > const&, unsigned long)@Base" 2.7.2 + (c++)"nut::TcpClient::getDevice(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::sendQuery(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"nut::TcpClient::TcpClient(std::basic_string, std::allocator > const&, int)@Base" 2.7.2 + (c++)"nut::TcpClient::TcpClient()@Base" 2.7.2 + (c++)"nut::TcpClient::~TcpClient()@Base" 2.7.2 + (c++)"nut::NutException::str() const@Base" 2.7.2 + (c++)"nut::NutException::what() const@Base" 2.7.2 + (c++)"nut::Device::isOk() const@Base" 2.7.2 + (c++)"nut::Device::getName() const@Base" 2.7.2 + (c++)"nut::Device::getClient() const@Base" 2.7.2 + (c++)"nut::Device::operator bool() const@Base" 2.7.2 + (c++)"nut::Device::operator==(nut::Device const&) const@Base" 2.7.2 + (c++)"nut::Device::operator<(nut::Device const&) const@Base" 2.7.2 + (c++)"nut::Device::operator!() const@Base" 2.7.2 + (c++)"nut::Command::isOk() const@Base" 2.7.2 + (c++)"nut::Command::getName() const@Base" 2.7.2 + (c++)"nut::Command::getDevice() const@Base" 2.7.2 + (c++)"nut::Command::operator bool() const@Base" 2.7.2 + (c++)"nut::Command::operator==(nut::Command const&) const@Base" 2.7.2 + (c++)"nut::Command::operator<(nut::Command const&) const@Base" 2.7.2 + (c++)"nut::Command::operator!() const@Base" 2.7.2 + (c++)"nut::Variable::isOk() const@Base" 2.7.2 + (c++)"nut::Variable::getName() const@Base" 2.7.2 + (c++)"nut::Variable::getDevice() const@Base" 2.7.2 + (c++)"nut::Variable::operator bool() const@Base" 2.7.2 + (c++)"nut::Variable::operator==(nut::Variable const&) const@Base" 2.7.2 + (c++)"nut::Variable::operator<(nut::Variable const&) const@Base" 2.7.2 + (c++)"nut::Variable::operator!() const@Base" 2.7.2 + (c++)"nut::internal::Socket::isConnected() const@Base" 2.7.2 + (c++)"nut::TcpClient::getTimeout() const@Base" 2.7.2 + (c++)"nut::TcpClient::isConnected() const@Base" 2.7.2 + (c++)"nut::TcpClient::getHost() const@Base" 2.7.2 + (c++)"nut::TcpClient::getPort() const@Base" 2.7.2 + (c++)"char* std::basic_string, std::allocator >::_S_construct(char*, char*, std::allocator const&, std::forward_iterator_tag)@Base" 2.7.2 + (c++)"void std::_Destroy_aux::__destroy, std::allocator >*>(std::basic_string, std::allocator >*, std::basic_string, std::allocator >*)@Base" 2.7.2 + (c++)"std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >::~pair()@Base" 2.7.2 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > >::_M_insert_aux(__gnu_cxx::__normal_iterator, std::allocator >, std::allocator, std::allocator > > >*, std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > > >, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > >::~vector()@Base" 2.7.2 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::_M_insert_aux(__gnu_cxx::__normal_iterator, std::allocator >*, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::~vector()@Base" 2.7.2 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::operator=(std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_insert_unique(nut::Variable const&)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::allocator >, std::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::_M_insert_unique(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::allocator >, std::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::find(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::allocator >, std::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::_M_erase(std::_Rb_tree_node, std::allocator > >*)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_insert_(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > const&)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_get_insert_unique_pos(std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_erase(std::_Rb_tree_node, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >*)@Base" 2.7.2 + (c++)"std::basic_string, std::allocator > std::operator+, std::allocator >(char const*, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 + (c++)"typeinfo for nut::IOException@Base" 2.7.2 + (c++)"typeinfo for nut::NutException@Base" 2.7.2 + (c++)"typeinfo for nut::SystemException@Base" 2.7.2 + (c++)"typeinfo for nut::TimeoutException@Base" 2.7.2 + (c++)"typeinfo for nut::UnknownHostException@Base" 2.7.2 + (c++)"typeinfo for nut::NotConnectedException@Base" 2.7.2 + (c++)"typeinfo for nut::Client@Base" 2.7.2 + (c++)"typeinfo for nut::TcpClient@Base" 2.7.2 + (c++)"typeinfo name for nut::IOException@Base" 2.7.2 + (c++)"typeinfo name for nut::NutException@Base" 2.7.2 + (c++)"typeinfo name for nut::SystemException@Base" 2.7.2 + (c++)"typeinfo name for nut::TimeoutException@Base" 2.7.2 + (c++)"typeinfo name for nut::UnknownHostException@Base" 2.7.2 + (c++)"typeinfo name for nut::NotConnectedException@Base" 2.7.2 + (c++)"typeinfo name for nut::Client@Base" 2.7.2 + (c++)"typeinfo name for nut::TcpClient@Base" 2.7.2 + (c++)"vtable for nut::IOException@Base" 2.7.2 + (c++)"vtable for nut::NutException@Base" 2.7.2 + (c++)"vtable for nut::SystemException@Base" 2.7.2 + (c++)"vtable for nut::TimeoutException@Base" 2.7.2 + (c++)"vtable for nut::UnknownHostException@Base" 2.7.2 + (c++)"vtable for nut::NotConnectedException@Base" 2.7.2 + (c++)"vtable for nut::Client@Base" 2.7.2 + (c++)"vtable for nut::TcpClient@Base" 2.7.2 nutclient_authenticate@Base 2.7.2 nutclient_destroy@Base 2.7.2 nutclient_device_forced_shutdown@Base 2.7.2 From 819cab0654a2a599dae96550a120c9a37a6aae29 Mon Sep 17 00:00:00 2001 From: Neil Williams Date: Sat, 17 Jan 2015 10:29:11 +0000 Subject: [PATCH 107/240] Imported Debian patch 2.7.2-1.1 --- debian/changelog | 8 ++++++++ debian/rules | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index e940af1..f8ba3fa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +nut (2.7.2-1.1) unstable; urgency=medium + + * Non-maintainer upload. + * Port Ubuntu change to drop upstream systemd unit files to allow + sysvinit files for Jessie. (Closes: #747863) + + -- Neil Williams Sat, 17 Jan 2015 10:29:11 +0000 + nut (2.7.2-1) unstable; urgency=low * New upstream release diff --git a/debian/rules b/debian/rules index b169acd..084af15 100755 --- a/debian/rules +++ b/debian/rules @@ -78,7 +78,9 @@ common-install-arch:: $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so # Install systemd files only on systems where it's supported -ifeq (linux,$(DEB_HOST_ARCH_OS)) + # disabled in Ubuntu until the unit gets fixed to check nut.conf + # disabled in Debian Jessie to retain sysvinit support until fix is available +ifeq (linux-disabled,$(DEB_HOST_ARCH_OS)) install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-monitor.service \ $(CURDIR)/debian/nut-client/lib/systemd/system/nut-monitor.service install -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system-shutdown/nutshutdown \ From f07df515f5ce5a258e05d6e9f4174391edf3da75 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 25 Jan 2015 12:28:45 +0100 Subject: [PATCH 108/240] debian/gbp.conf: Switch to debian-jessie branch --- debian/changelog | 6 ++++++ debian/gbp.conf | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index f8ba3fa..bedfdc1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +nut (2.7.2-2) UNRELEASED; urgency=medium + + * debian/gbp.conf: Switch to debian-jessie branch + + -- Laurent Bigonville Sun, 25 Jan 2015 12:28:14 +0100 + nut (2.7.2-1.1) unstable; urgency=medium * Non-maintainer upload. diff --git a/debian/gbp.conf b/debian/gbp.conf index 6837223..2e63610 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -1,5 +1,5 @@ [DEFAULT] -debian-branch = debian +debian-branch = debian-jessie upstream-branch = upstream pristine-tar = True From fedf671e4dee3c649022eab07663c768a8d52163 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 25 Jan 2015 12:50:07 +0100 Subject: [PATCH 109/240] Revert the changes made in the previous NMU debian/rules: Revert the changes made in the previous NMU, I don't think that dropping the .service file that late in the release cycle is a good idea and anyway this was causing left-over files on upgrade. --- debian/changelog | 5 ++++- debian/rules | 4 +--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index bedfdc1..4968b14 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,11 @@ nut (2.7.2-2) UNRELEASED; urgency=medium * debian/gbp.conf: Switch to debian-jessie branch + * debian/rules: Revert the changes made in the previous NMU, I don't think + that dropping the .service file that late in the release cycle is a good + idea and anyway this was causing left-over files on upgrade. - -- Laurent Bigonville Sun, 25 Jan 2015 12:28:14 +0100 + -- Laurent Bigonville Sun, 25 Jan 2015 12:47:47 +0100 nut (2.7.2-1.1) unstable; urgency=medium diff --git a/debian/rules b/debian/rules index 084af15..b169acd 100755 --- a/debian/rules +++ b/debian/rules @@ -78,9 +78,7 @@ common-install-arch:: $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so # Install systemd files only on systems where it's supported - # disabled in Ubuntu until the unit gets fixed to check nut.conf - # disabled in Debian Jessie to retain sysvinit support until fix is available -ifeq (linux-disabled,$(DEB_HOST_ARCH_OS)) +ifeq (linux,$(DEB_HOST_ARCH_OS)) install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-monitor.service \ $(CURDIR)/debian/nut-client/lib/systemd/system/nut-monitor.service install -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system-shutdown/nutshutdown \ From 241119d464a2c8b1afdc20f0a15395ec2ef8e7fd Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 25 Jan 2015 12:54:03 +0100 Subject: [PATCH 110/240] Add wrappers that check the MODE in /etc/nut/nut.conf to avoid starting the daemons if nut is not configured (Closes: #747863). --- debian/changelog | 4 +++- debian/local/upsd | 19 +++++++++++++++++++ debian/local/upsmon | 19 +++++++++++++++++++ debian/nut-client.install | 1 + debian/nut-server.install | 1 + debian/rules | 6 ++++++ 6 files changed, 49 insertions(+), 1 deletion(-) create mode 100755 debian/local/upsd create mode 100755 debian/local/upsmon diff --git a/debian/changelog b/debian/changelog index 4968b14..acd59b2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,10 @@ nut (2.7.2-2) UNRELEASED; urgency=medium * debian/rules: Revert the changes made in the previous NMU, I don't think that dropping the .service file that late in the release cycle is a good idea and anyway this was causing left-over files on upgrade. + * Add wrappers that check the MODE in /etc/nut/nut.conf to avoid starting + the daemons if nut is not configured (Closes: #747863). - -- Laurent Bigonville Sun, 25 Jan 2015 12:47:47 +0100 + -- Laurent Bigonville Sun, 25 Jan 2015 12:53:03 +0100 nut (2.7.2-1.1) unstable; urgency=medium diff --git a/debian/local/upsd b/debian/local/upsd new file mode 100755 index 0000000..5e4d2a4 --- /dev/null +++ b/debian/local/upsd @@ -0,0 +1,19 @@ +#!/bin/sh + +# Include NUT nut.conf +[ -r /etc/nut/nut.conf ] && . /etc/nut/nut.conf + +case "$MODE" in + standalone|netserver) + exec /lib/nut/upsd "$@" + ;; + none|netclient) + echo "upsd disabled, please adjust the configuration to your needs" + echo "Then set MODE to a suitable value in /etc/nut/nut.conf to enable it" + # exit success to avoid breaking the install process! + exit 0 + ;; + *) + exit 1 + ;; +esac diff --git a/debian/local/upsmon b/debian/local/upsmon new file mode 100755 index 0000000..a9f6d1b --- /dev/null +++ b/debian/local/upsmon @@ -0,0 +1,19 @@ +#!/bin/sh + +# Include NUT nut.conf +[ -r /etc/nut/nut.conf ] && . /etc/nut/nut.conf + +case "$MODE" in + standalone|netserver|netclient) + exec /lib/nut/upsmon "$@" + ;; + none) + echo "upsmon disabled, please adjust the configuration to your needs" + echo "Then set MODE to a suitable value in /etc/nut/nut.conf to enable it" + # exit success to avoid breaking the install process! + exit 0 + ;; + *) + exit 1 + ;; +esac diff --git a/debian/nut-client.install b/debian/nut-client.install index b899f84..e9e32e4 100644 --- a/debian/nut-client.install +++ b/debian/nut-client.install @@ -3,6 +3,7 @@ debian/tmp/bin/upsc debian/tmp/bin/upsrw debian/tmp/bin/upscmd debian/tmp/sbin/upsmon +debian/tmp/lib/nut/upsmon debian/tmp/sbin/upssched debian/tmp/bin/upssched-cmd debian/tmp/etc/nut/nut.conf diff --git a/debian/nut-server.install b/debian/nut-server.install index 8b67a85..bbc50da 100644 --- a/debian/nut-server.install +++ b/debian/nut-server.install @@ -1,4 +1,5 @@ debian/tmp/sbin/upsd +debian/tmp/lib/nut/upsd debian/tmp/sbin/upsdrvctl debian/tmp/usr/share/nut/cmdvartab debian/tmp/usr/share/nut/driver.list diff --git a/debian/rules b/debian/rules index b169acd..c667da4 100755 --- a/debian/rules +++ b/debian/rules @@ -77,6 +77,12 @@ common-install-arch:: ln -s /lib/$(DEB_HOST_MULTIARCH)/libupsclient.so.4 \ $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libupsclient.so + # Move daemons and install wrappers + mv $(CURDIR)/debian/tmp/sbin/upsmon $(CURDIR)/debian/tmp/lib/nut/upsmon + mv $(CURDIR)/debian/tmp/sbin/upsd $(CURDIR)/debian/tmp/lib/nut/upsd + install -m 0755 debian/local/upsmon $(CURDIR)/debian/tmp/sbin/upsmon + install -m 0755 debian/local/upsd $(CURDIR)/debian/tmp/sbin/upsd + # Install systemd files only on systems where it's supported ifeq (linux,$(DEB_HOST_ARCH_OS)) install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-monitor.service \ From 1563b485dc5490a087a64f3da08cb41ebd553fa6 Mon Sep 17 00:00:00 2001 From: Michael Fincham Date: Fri, 13 Feb 2015 11:39:10 +1300 Subject: [PATCH 111/240] Add patch that detects and corrects unsafe permissions on ~/.nut-monitor left over from old installations during NUT-Monitor startup. (Closes: #777706) --- debian/NEWS | 13 ++++ debian/changelog | 8 ++- .../0009-fix-favorites-permissions.patch | 69 +++++++++++++++++++ debian/patches/series | 1 + 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 debian/patches/0009-fix-favorites-permissions.patch diff --git a/debian/NEWS b/debian/NEWS index e42605c..53ca695 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,3 +1,16 @@ +nut (2.7.2-2) unstable; urgency=medium + + Since version 1.2 NUT-Monitor uses safer directory permissions when + creating ~/.nut-monitor. + + NUT-Monitor will now detect a pre-1.2 settings directory on startup + and update its permissions. + + Please note that passwords stored in NUT-Monitor prior to this change + may have been exposed, and it is recommended that they be reset. + + -- Michael Fincham Fri, 13 Feb 2015 11:57:12 +1300 + nut (2.6.5-1) experimental; urgency=low mge-shut driver has been replaced by a new implementation (newmge-shut). diff --git a/debian/changelog b/debian/changelog index acd59b2..8332b74 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,6 @@ nut (2.7.2-2) UNRELEASED; urgency=medium + [ Laurent Bigonville ] * debian/gbp.conf: Switch to debian-jessie branch * debian/rules: Revert the changes made in the previous NMU, I don't think that dropping the .service file that late in the release cycle is a good @@ -7,7 +8,12 @@ nut (2.7.2-2) UNRELEASED; urgency=medium * Add wrappers that check the MODE in /etc/nut/nut.conf to avoid starting the daemons if nut is not configured (Closes: #747863). - -- Laurent Bigonville Sun, 25 Jan 2015 12:53:03 +0100 + [ Michael Fincham ] + * Add patch that detects and corrects unsafe permissions on ~/.nut-monitor + left over from old installations during NUT-Monitor startup. + (Closes: #777706) + + -- Michael Fincham Fri, 13 Feb 2015 11:39:10 +1300 nut (2.7.2-1.1) unstable; urgency=medium diff --git a/debian/patches/0009-fix-favorites-permissions.patch b/debian/patches/0009-fix-favorites-permissions.patch new file mode 100644 index 0000000..7128250 --- /dev/null +++ b/debian/patches/0009-fix-favorites-permissions.patch @@ -0,0 +1,69 @@ +If a ~/.nut-monitor directory is found with insecure permissions, change them to 0700. +--- a/scripts/python/app/NUT-Monitor ++++ b/scripts/python/app/NUT-Monitor +@@ -29,6 +29,7 @@ + import sys + import base64 + import os, os.path ++import stat + import platform + import time + import threading +@@ -44,21 +45,23 @@ + + class interface : + +- __widgets = {} +- __callbacks = {} +- __favorites = {} +- __favorites_file = None +- __favorites_path = "" +- __fav_menu_items = list() +- __window_visible = True +- __glade_file = None +- __connected = False +- __ups_handler = None +- __ups_commands = None +- __ups_vars = None +- __ups_rw_vars = None +- __gui_thread = None +- __current_ups = None ++ DESIRED_FAVORITES_DIRECTORY_MODE = 0700 ++ ++ __widgets = {} ++ __callbacks = {} ++ __favorites = {} ++ __favorites_file = None ++ __favorites_path = "" ++ __fav_menu_items = list() ++ __window_visible = True ++ __glade_file = None ++ __connected = False ++ __ups_handler = None ++ __ups_commands = None ++ __ups_vars = None ++ __ups_rw_vars = None ++ __gui_thread = None ++ __current_ups = None + + def __init__( self ) : + +@@ -528,6 +531,9 @@ + return + + try : ++ if ( not stat.S_IMODE( os.stat( self.__favorites_path ).st_mode ) == self.DESIRED_FAVORITES_DIRECTORY_MODE ) : # unsafe pre-1.2 directory found ++ os.chmod( self.__favorites_path, self.DESIRED_FAVORITES_DIRECTORY_MODE ) ++ + conf = ConfigParser.ConfigParser() + conf.read( self.__favorites_file ) + for current in conf.sections() : +@@ -573,7 +579,7 @@ + # If path does not exists, try to create it + if ( not os.path.exists( self.__favorites_file ) ) : + try : +- os.makedirs( self.__favorites_path, mode=0700 ) ++ os.makedirs( self.__favorites_path, mode=self.DESIRED_FAVORITES_DIRECTORY_MODE ) + except : + self.gui_status_message( _("Error while creating configuration folder (%s)") % sys.exc_info()[1] ) + diff --git a/debian/patches/series b/debian/patches/series index 5046408..fbaa314 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -4,3 +4,4 @@ 0006-ups-conf-maxretry.patch 0007-killpower-path.patch 0008-drop-w3c-icons.patch +0009-fix-favorites-permissions.patch From f8cfca1b183d27f69da4b08930b96415f7fc0875 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 17 Feb 2015 10:01:35 +0100 Subject: [PATCH 112/240] Release to unstable --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 8332b74..ac59e51 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nut (2.7.2-2) UNRELEASED; urgency=medium +nut (2.7.2-2) unstable; urgency=medium [ Laurent Bigonville ] * debian/gbp.conf: Switch to debian-jessie branch @@ -13,7 +13,7 @@ nut (2.7.2-2) UNRELEASED; urgency=medium left over from old installations during NUT-Monitor startup. (Closes: #777706) - -- Michael Fincham Fri, 13 Feb 2015 11:39:10 +1300 + -- Laurent Bigonville Tue, 17 Feb 2015 09:54:11 +0100 nut (2.7.2-1.1) unstable; urgency=medium From 47e0e45e3531240f8a08faa025acd982efa01de6 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 17 Feb 2015 10:43:27 +0100 Subject: [PATCH 113/240] debian/NEWS: Fix NEWS file syntax --- debian/NEWS | 12 ++++++------ debian/changelog | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/debian/NEWS b/debian/NEWS index 53ca695..c943bb7 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,13 +1,13 @@ nut (2.7.2-2) unstable; urgency=medium - Since version 1.2 NUT-Monitor uses safer directory permissions when - creating ~/.nut-monitor. + Since version 1.2 NUT-Monitor uses safer directory permissions when + creating ~/.nut-monitor. - NUT-Monitor will now detect a pre-1.2 settings directory on startup - and update its permissions. + NUT-Monitor will now detect a pre-1.2 settings directory on startup + and update its permissions. - Please note that passwords stored in NUT-Monitor prior to this change - may have been exposed, and it is recommended that they be reset. + Please note that passwords stored in NUT-Monitor prior to this change + may have been exposed, and it is recommended that they be reset. -- Michael Fincham Fri, 13 Feb 2015 11:57:12 +1300 diff --git a/debian/changelog b/debian/changelog index ac59e51..5e7a799 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +nut (2.7.2-3) UNRELEASED; urgency=medium + + * debian/NEWS: Fix NEWS file syntax + + -- Laurent Bigonville Tue, 17 Feb 2015 10:40:24 +0100 + nut (2.7.2-2) unstable; urgency=medium [ Laurent Bigonville ] From 64e656ba48ad625257835f9baad856f2e13ab9bf Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Tue, 17 Feb 2015 23:17:22 +0100 Subject: [PATCH 114/240] Release to unstable The changelog was not changed before releasing 2.7.2-3 --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 5e7a799..e31806e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,8 @@ -nut (2.7.2-3) UNRELEASED; urgency=medium +nut (2.7.2-3) unstable; urgency=medium * debian/NEWS: Fix NEWS file syntax - -- Laurent Bigonville Tue, 17 Feb 2015 10:40:24 +0100 + -- Laurent Bigonville Tue, 17 Feb 2015 23:13:02 +0100 nut (2.7.2-2) unstable; urgency=medium From 5dc71af1098a1774681f6cf632488e31a6f7a349 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 15 Mar 2015 11:14:01 +0100 Subject: [PATCH 115/240] Really fix package initial installation when PID1 is systemd (Closes: #747863) --- debian/changelog | 7 +++++++ debian/nut-client.postinst | 11 +++++++++++ debian/nut-client.prerm | 13 +++++++++++++ debian/nut-server.postinst | 13 +++++++++++++ debian/nut-server.prerm | 7 +++++++ debian/rules | 4 ++-- 6 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 debian/nut-client.prerm diff --git a/debian/changelog b/debian/changelog index e31806e..d2a67f2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nut (2.7.2-4) UNRELEASED; urgency=medium + + * Really fix package initial installation when PID1 is systemd (Closes: + #747863) + + -- Laurent Bigonville Fri, 20 Mar 2015 00:44:01 +0100 + nut (2.7.2-3) unstable; urgency=medium * debian/NEWS: Fix NEWS file syntax diff --git a/debian/nut-client.postinst b/debian/nut-client.postinst index 4b04850..5d68dae 100644 --- a/debian/nut-client.postinst +++ b/debian/nut-client.postinst @@ -1,5 +1,16 @@ #!/bin/sh -e +handle_start_failure () { +# The nut client part (upsmon) must run in all cases except when MODE in +# /etc/nut/nut.conf is set to "none" or not set at all. + [ -r /etc/nut/nut.conf ] && . /etc/nut/nut.conf + if [ -d /run/systemd/system ] && [ "$MODE" = "none" -o -z "$MODE" ]; then + return 0 + else + return 1 + fi +} + case "$1" in configure) diff --git a/debian/nut-client.prerm b/debian/nut-client.prerm new file mode 100644 index 0000000..e45a69b --- /dev/null +++ b/debian/nut-client.prerm @@ -0,0 +1,13 @@ +#!/bin/sh +set -e + +handle_start_failure () { +# The MODE defined in /etc/nut/nut.conf shouldn't affect the exit code when the +# daemon is stopped. If it fails to stop, the maintainer script should fail +# too. + return 1 +} + +#DEBHELPER# + +exit 0 diff --git a/debian/nut-server.postinst b/debian/nut-server.postinst index 3322126..f0e05c2 100644 --- a/debian/nut-server.postinst +++ b/debian/nut-server.postinst @@ -1,5 +1,18 @@ #!/bin/sh -e +handle_start_failure () { +# The nut server part (upsd) must run in all cases except when MODE in +# /etc/nut/nut.conf is set to "none", not set at all or if the machine is a +# client. + [ -r /etc/nut/nut.conf ] && . /etc/nut/nut.conf + if [ -d /run/systemd/system ] \ + && [ "$MODE" = "none" -o "$MODE" = "netclient" -o -z "$MODE" ]; then + return 0 + else + return 1 + fi +} + case "$1" in configure) diff --git a/debian/nut-server.prerm b/debian/nut-server.prerm index 6292ef8..b68c6d8 100644 --- a/debian/nut-server.prerm +++ b/debian/nut-server.prerm @@ -4,6 +4,13 @@ # because we don't want the daemon to be # stopped during an upgrade +handle_start_failure () { +# The MODE defined in /etc/nut/nut.conf shouldn't affect the exit code when the +# daemon is stopped. If it fails to stop, the maintainer script should fail +# too. + return 1 +} + case "$1" in remove) diff --git a/debian/rules b/debian/rules index c667da4..26bab23 100755 --- a/debian/rules +++ b/debian/rules @@ -119,8 +119,8 @@ common-install-indep:: binary-install/nut-monitor:: dh_python2 -pnut-monitor -DEB_DH_INSTALLINIT_ARGS_nut-server := --init-script=nut-server --restart-after-upgrade -DEB_DH_INSTALLINIT_ARGS_nut-client := --init-script=nut-client --restart-after-upgrade +DEB_DH_INSTALLINIT_ARGS_nut-server := --init-script=nut-server --restart-after-upgrade --error-handler=handle_start_failure +DEB_DH_INSTALLINIT_ARGS_nut-client := --init-script=nut-client --restart-after-upgrade --error-handler=handle_start_failure DEB_DH_SYSTEMD_START_ARGS_nut-server := --restart-after-upgrade DEB_DH_SYSTEMD_START_ARGS_nut-client := --restart-after-upgrade DEB_DH_COMPRESS_ARGS_nut-doc := -X.pdf From 564becd819124049542e5085a7159dd62e00ef97 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Fri, 20 Mar 2015 23:13:01 +0100 Subject: [PATCH 116/240] Release to unstable --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index d2a67f2..37bfd60 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,9 @@ -nut (2.7.2-4) UNRELEASED; urgency=medium +nut (2.7.2-4) unstable; urgency=medium * Really fix package initial installation when PID1 is systemd (Closes: #747863) - -- Laurent Bigonville Fri, 20 Mar 2015 00:44:01 +0100 + -- Laurent Bigonville Fri, 20 Mar 2015 23:12:53 +0100 nut (2.7.2-3) unstable; urgency=medium From fd413a316856dd5d5cd6aa815da07191595c83fb Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Thu, 30 Apr 2015 15:53:36 +0200 Subject: [PATCH 117/240] Imported Upstream version 2.7.3 --- AUTHORS | 4 + ChangeLog | 1120 ++++++++++++++++++++ INSTALL | 12 +- INSTALL.nut | 4 +- Makefile.am | 34 +- Makefile.in | 364 ++++--- NEWS | 70 ++ UPGRADING | 24 + aclocal.m4 | 885 ++++++++++------ clients/Makefile.in | 387 ++++--- clients/upsclient.c | 17 +- clients/upslog.c | 9 + common/Makefile.in | 253 +++-- common/common.c | 29 +- conf/Makefile.am | 2 +- conf/Makefile.in | 126 ++- conf/ups.conf.sample | 15 + conf/upsmon.conf.sample | 377 ------- conf/upsmon.conf.sample.in | 7 +- config.guess | 346 +++--- config.sub | 113 +- configure | 1068 ++++++++++++++----- configure.ac | 88 +- data/Makefile.in | 277 ++--- data/cmdvartab | 11 + data/driver.list.in | 79 +- data/html/Makefile.in | 114 +- depcomp | 457 ++++---- docs/FAQ.txt | 185 +++- docs/Makefile.am | 9 +- docs/Makefile.in | 270 ++--- docs/cables.txt | 65 +- docs/chunked.xsl | 5 - docs/common.xsl | 18 + docs/config-notes.txt | 6 +- docs/configure.txt | 10 +- docs/developers.txt | 80 +- docs/docinfo.xml | 10 - docs/docinfo.xml.in | 23 + docs/documentation.txt | 10 +- docs/download.txt | 9 +- docs/features.txt | 2 +- docs/history.txt | 2 +- docs/images/cables/mge-usb-rj45.jpg | Bin 0 -> 13921 bytes docs/man/Makefile.am | 58 +- docs/man/Makefile.in | 183 +++- docs/man/al175.8 | 15 +- docs/man/apcsmart-old.8 | 8 +- docs/man/apcsmart.8 | 78 +- docs/man/apcsmart.txt | 80 +- docs/man/apcupsd-ups.8 | 8 +- docs/man/asciidoc.conf | 4 + docs/man/asem.8 | 87 ++ docs/man/asem.txt | 83 ++ docs/man/bcmxcp.8 | 16 +- docs/man/bcmxcp_usb.8 | 8 +- docs/man/belkin.8 | 8 +- docs/man/belkinunv.8 | 8 +- docs/man/bestfcom.8 | 8 +- docs/man/bestfortress.8 | 8 +- docs/man/bestuferrups.8 | 8 +- docs/man/bestups.8 | 8 +- docs/man/blazer_ser.8 | 8 +- docs/man/blazer_usb.8 | 11 +- docs/man/clone.8 | 8 +- docs/man/dummy-ups.8 | 16 +- docs/man/dummy-ups.txt | 14 +- docs/man/etapro.8 | 8 +- docs/man/everups.8 | 8 +- docs/man/gamatronic.8 | 8 +- docs/man/genericups.8 | 8 +- docs/man/hosts.conf.5 | 8 +- docs/man/isbmex.8 | 8 +- docs/man/ivtscd.8 | 8 +- docs/man/libnutclient.3 | 8 +- docs/man/libnutclient_commands.3 | 8 +- docs/man/libnutclient_devices.3 | 8 +- docs/man/libnutclient_general.3 | 8 +- docs/man/libnutclient_misc.3 | 8 +- docs/man/libnutclient_tcp.3 | 8 +- docs/man/libnutclient_variables.3 | 8 +- docs/man/libupsclient-config.1 | 8 +- docs/man/liebert-esp2.8 | 8 +- docs/man/liebert.8 | 8 +- docs/man/macosx-ups.8 | 8 +- docs/man/masterguard.8 | 8 +- docs/man/metasys.8 | 8 +- docs/man/mge-shut.8 | 8 +- docs/man/mge-utalk.8 | 8 +- docs/man/microdowell.8 | 8 +- docs/man/netxml-ups.8 | 8 +- docs/man/nut-ipmipsu.8 | 11 +- docs/man/nut-recorder.8 | 8 +- docs/man/nut-scanner.8 | 25 +- docs/man/nut-scanner.txt | 4 +- docs/man/nut.conf.5 | 10 +- docs/man/nut.conf.txt | 2 +- docs/man/nutdrv_atcl_usb.8 | 8 +- docs/man/nutdrv_qx.8 | 142 ++- docs/man/nutdrv_qx.txt | 72 +- docs/man/nutscan.3 | 16 +- docs/man/nutscan_add_device_to_device.3 | 8 +- docs/man/nutscan_add_option_to_device.3 | 8 +- docs/man/nutscan_cidr_to_ip.3 | 8 +- docs/man/nutscan_display_parsable.3 | 8 +- docs/man/nutscan_display_ups_conf.3 | 8 +- docs/man/nutscan_free_device.3 | 8 +- docs/man/nutscan_get_serial_ports_list.3 | 8 +- docs/man/nutscan_init.3 | 8 +- docs/man/nutscan_new_device.3 | 8 +- docs/man/nutscan_scan_avahi.3 | 8 +- docs/man/nutscan_scan_eaton_serial.3 | 8 +- docs/man/nutscan_scan_ipmi.3 | 8 +- docs/man/nutscan_scan_nut.3 | 8 +- docs/man/nutscan_scan_snmp.3 | 8 +- docs/man/nutscan_scan_usb.3 | 8 +- docs/man/nutscan_scan_xml_http.3 | 8 +- docs/man/nutupsdrv.8 | 8 +- docs/man/oneac.8 | 8 +- docs/man/optiups.8 | 8 +- docs/man/powercom.8 | 8 +- docs/man/powerman-pdu.8 | 8 +- docs/man/powerpanel.8 | 8 +- docs/man/rhino.8 | 8 +- docs/man/richcomm_usb.8 | 8 +- docs/man/riello_ser.8 | 8 +- docs/man/riello_usb.8 | 8 +- docs/man/safenet.8 | 8 +- docs/man/snmp-ups.8 | 8 +- docs/man/solis.8 | 37 +- docs/man/solis.txt | 14 +- docs/man/tripplite.8 | 8 +- docs/man/tripplite_usb.8 | 14 +- docs/man/tripplite_usb.txt | 9 + docs/man/tripplitesu.8 | 8 +- docs/man/ups.conf.5 | 36 +- docs/man/ups.conf.txt | 31 + docs/man/upsc.8 | 8 +- docs/man/upscli_add_host_cert.3 | 8 +- docs/man/upscli_cleanup.3 | 8 +- docs/man/upscli_connect.3 | 8 +- docs/man/upscli_disconnect.3 | 8 +- docs/man/upscli_fd.3 | 8 +- docs/man/upscli_get.3 | 39 +- docs/man/upscli_get.txt | 18 +- docs/man/upscli_init.3 | 8 +- docs/man/upscli_list_next.3 | 12 +- docs/man/upscli_list_next.txt | 4 +- docs/man/upscli_list_start.3 | 15 +- docs/man/upscli_list_start.txt | 5 +- docs/man/upscli_readline.3 | 8 +- docs/man/upscli_sendline.3 | 8 +- docs/man/upscli_splitaddr.3 | 8 +- docs/man/upscli_splitname.3 | 8 +- docs/man/upscli_ssl.3 | 8 +- docs/man/upscli_strerror.3 | 8 +- docs/man/upscli_upserror.3 | 8 +- docs/man/upsclient.3 | 8 +- docs/man/upscmd.8 | 8 +- docs/man/upscode2.8 | 8 +- docs/man/upsd.8 | 8 +- docs/man/upsd.conf.5 | 11 +- docs/man/upsd.users.5 | 8 +- docs/man/upsdrvctl.8 | 8 +- docs/man/upsimage.cgi.8 | 8 +- docs/man/upslog.8 | 13 +- docs/man/upslog.txt | 12 +- docs/man/upsmon.8 | 12 +- docs/man/upsmon.conf.5 | 12 +- docs/man/upsmon.conf.txt | 5 +- docs/man/upsrw.8 | 8 +- docs/man/upssched.8 | 8 +- docs/man/upssched.conf.5 | 8 +- docs/man/upsset.cgi.8 | 8 +- docs/man/upsset.conf.5 | 8 +- docs/man/upsstats.cgi.8 | 8 +- docs/man/upsstats.html.5 | 8 +- docs/man/usbhid-ups.8 | 36 +- docs/man/usbhid-ups.txt | 13 +- docs/man/victronups.8 | 8 +- docs/new-drivers.txt | 30 +- docs/nut-names.txt | 97 +- docs/nut-qa.txt | 5 +- docs/nutdrv_qx-subdrivers.txt | 97 +- docs/packager-guide.txt | 2 +- docs/scheduling.txt | 2 +- docs/security.txt | 119 ++- docs/xhtml.xsl | 5 - drivers/Makefile.am | 21 +- drivers/Makefile.in | 901 ++++++++++------ drivers/apc-hid.c | 2 + drivers/apcsmart.c | 17 +- drivers/apcsmart.h | 2 +- drivers/asem.c | 373 +++++++ drivers/bcmxcp.c | 915 +++++++++++++--- drivers/bcmxcp.h | 30 + drivers/belkin-hid.c | 28 +- drivers/blazer_usb.c | 9 +- drivers/compaq-mib.c | 8 +- drivers/cps-hid.c | 53 +- drivers/dstate.c | 27 +- drivers/dstate.h | 4 + drivers/eaton-mib.c | 78 +- drivers/genericups.c | 38 + drivers/libhid.c | 10 +- drivers/libhid.h | 3 + drivers/libusb.c | 59 +- drivers/liebert-hid.c | 9 +- drivers/main.c | 27 +- drivers/mge-hid.c | 251 ++++- drivers/netvision-mib.c | 13 +- drivers/nutdrv_qx.c | 504 +++++++-- drivers/nutdrv_qx.h | 20 +- drivers/nutdrv_qx_bestups.c | 705 ++++++++++++ drivers/nutdrv_qx_bestups.h | 29 + drivers/nutdrv_qx_blazer-common.c | 61 +- drivers/nutdrv_qx_blazer-common.h | 2 + drivers/nutdrv_qx_mecer.c | 105 +- drivers/nutdrv_qx_megatec-old.c | 99 +- drivers/nutdrv_qx_megatec.c | 99 +- drivers/nutdrv_qx_mustek.c | 99 +- drivers/nutdrv_qx_q1.c | 89 +- drivers/nutdrv_qx_voltronic-qs-hex.c | 415 ++++++++ drivers/nutdrv_qx_voltronic-qs-hex.h | 29 + drivers/nutdrv_qx_voltronic-qs.c | 90 +- drivers/nutdrv_qx_voltronic.c | 783 +++++++------- drivers/nutdrv_qx_zinto.c | 99 +- drivers/openups-hid.c | 48 +- drivers/openups-hid.h | 7 +- drivers/powercom-hid.c | 205 +++- drivers/powercom.c | 34 +- drivers/powerware-mib.c | 28 +- drivers/riello_ser.c | 351 +++--- drivers/riello_usb.c | 455 ++++---- drivers/solis.c | 32 +- drivers/solis.h | 2 +- drivers/tripplite_usb.c | 254 ++++- drivers/usb-common.h | 2 + drivers/usbhid-ups.c | 41 +- include/Makefile.in | 182 ++-- include/common.h | 2 + include/config.h.in | 26 +- install-sh | 14 +- lib/Makefile.in | 117 +- ltmain.sh | 4 +- m4/libtool.m4 | 12 +- m4/nut_check_asciidoc.m4 | 21 +- missing | 412 +++---- scripts/Aix/nut-aix.spec.in | 330 ++++++ scripts/Makefile.in | 271 ++--- scripts/Solaris/Makefile.in | 114 +- scripts/augeas/Makefile.in | 109 +- scripts/augeas/nutupsconf.aug.in | 9 + scripts/devd/Makefile.in | 114 +- scripts/devd/nut-usb.conf.in | 233 ++-- scripts/hotplug/Makefile.in | 115 +- scripts/hotplug/libhid.usermap | 16 +- scripts/python/Makefile.am | 1 + scripts/python/Makefile.in | 111 +- scripts/python/app/NUT-Monitor | 41 +- scripts/python/app/gui-1.3.glade | 2 +- scripts/python/app/nut-monitor.appdata.xml | 42 + scripts/python/module/PyNUT.py | 37 +- scripts/subdriver/gen-snmp-subdriver.sh | 13 +- scripts/systemd/Makefile.in | 110 +- scripts/systemd/nut-server.service.in | 5 +- scripts/udev/Makefile.am | 10 +- scripts/udev/Makefile.in | 125 ++- scripts/udev/README | 4 +- scripts/udev/nut-usbups.rules.in | 16 +- scripts/upower/95-upower-hid.rules | 7 +- server/Makefile.in | 243 +++-- server/upsd.c | 6 +- test-driver | 139 +++ tests/Makefile.in | 704 +++++++++--- tools/Makefile.am | 3 +- tools/Makefile.in | 260 +++-- tools/nut-ddl-dump.sh | 53 + tools/nut-scanner/Makefile.am | 6 +- tools/nut-scanner/Makefile.in | 454 +++++--- tools/nut-scanner/nutscan-snmp.h | 18 +- tools/nut-scanner/nutscan-usb.h | 7 +- tools/nut-usbinfo.pl | 10 +- 283 files changed, 14978 insertions(+), 6511 deletions(-) delete mode 100644 conf/upsmon.conf.sample delete mode 100644 docs/docinfo.xml create mode 100644 docs/docinfo.xml.in create mode 100644 docs/images/cables/mge-usb-rj45.jpg create mode 100644 docs/man/asem.8 create mode 100644 docs/man/asem.txt create mode 100644 drivers/asem.c create mode 100644 drivers/nutdrv_qx_bestups.c create mode 100644 drivers/nutdrv_qx_bestups.h create mode 100644 drivers/nutdrv_qx_voltronic-qs-hex.c create mode 100644 drivers/nutdrv_qx_voltronic-qs-hex.h create mode 100644 scripts/Aix/nut-aix.spec.in create mode 100644 scripts/python/app/nut-monitor.appdata.xml create mode 100755 test-driver create mode 100755 tools/nut-ddl-dump.sh diff --git a/AUTHORS b/AUTHORS index 320efbe..c179b0c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -170,3 +170,7 @@ D: pwmib support for snmp-ups N: Kjell Claesson E: Kjell.claesson@epost.tidanet.se D: Author of bcmxcp driver, 3-phase work. + +N: Giuseppe Corbelli +E: giuseppe.corbelli@copanitalia.com +D: Author of asem driver diff --git a/ChangeLog b/ChangeLog index 1710194..96dc998 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,1051 @@ +2015-04-22 Arnaud Quette + + * configure.ac: Restore version 2.7.3 for release + * docs/security.txt: Missing link reference update The filename of + the previous GPG release key was not updated, leading to pointing + to the current release key + +2015-04-08 Nick Mayerhofer + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h: nutdrv_qx: clarify docs/inline comments + +2015-04-16 Arnaud Quette + + * configure.ac: bump version to 2.7.3.1 + +2015-04-15 Arnaud Quette + + * configure.ac: update version to 2.7.3 + * docs/security.txt: Update release signature verification The + release manager key has change. Update the documentation to reflect + it, along with keeping necessary for checking the previous releases + * docs/download.txt: Fix formatting issue + * NEWS, UPGRADING: Final update for release 2.7.3 Complete the + release information for NUT 2.7.3 + * docs/maintainer-guide.txt: Store some comments for latter + processing + +2015-04-10 Arnaud Quette + + * drivers/mge-hid.c: Improve Eaton ABM support for USB/HID units As + per clarifications from David G. Miller (Eaton ABM expert) and + customers request, when ABM is enabled, we now both publish the + following as per the ABM information: - the 5 status bits + {charging, discharging, floating, resting, off} under + battery.charger.status - the 2 historical status bits {CHRG, + DISCHRG} under ups.status When ABM is disabled, we just publish the + 2 historical status bits {CHRG, DISCHRG} under ups.status, as per + UPS.PowerSummary.PresentStatus.{Charging,Discharging}, as done + previously + +2015-04-02 Arnaud Quette + + * conf/ups.conf.sample, docs/man/ups.conf.txt, drivers/dstate.c, + drivers/dstate.h, drivers/main.c: Improve synchronous driver flag + implementation The previous commit was suffering a number of + issues. The present commit fixes these, along with adding more + documentation and a better and more understandable implementation + code. Thanks to Daniele Pezzini for the thorough review Closes: + https://github.com/networkupstools/nut/issues/197 + +2015-04-01 Arnaud Quette + + * docs/man/ups.conf.txt, drivers/dstate.c, drivers/dstate.h, + drivers/main.c: Implement synchronous driver flag As per issue + #197, NUT drivers work by default in asynchronous mode. This means + that all data are pushed by the driver on the communication socket + to upsd (Unix socket on Unix, Named pipe on Windows) without + waiting for these data to be actually consumed. With some HW, such + as ePDUs, that can produce a lot of data, asynchronous mode may + cause some congestion, resulting in the socket to be full, and the + driver to appear as not connected. By enabling the 'synchronous' + flag, the driver will wait for data to be consumed by upsd, prior + to publishing more. This can be enabled either globally or per + driver. + +2015-04-07 Arnaud Quette + + * scripts/systemd/nut-server.service.in: Do not Require systemd nut- + driver for nut-server Put the Requires=nut-driver.service in + comment for nut-server systemd unit file. Thus we don't require + drivers to be successfully started! This was a change of behavior + compared to init SysV, and could prevent from accessing + successfully started drivers, or at least to audit a system + Closes: https://github.com/networkupstools/nut/issues/200 + +2015-04-04 Charles Lepple + + * UPGRADING: UPGRADING: mention SSL permissions (#199) + * docs/security.txt: NSS SSL documentation Addresses new behavior as + part of the NSS forking fix (#199). Formatting and wording fixed as + well. + +2015-04-04 Émilien Kia + + * server/upsd.c: Initialize SSL after deamonize and downgrade to + user. Fix issue #190 - upsd: NSS SSL only working in debug mode + https://github.com/networkupstools/nut/issues/190 + +2015-04-02 Arnaud Quette + + * drivers/eaton-mib.c: Better input.realpower handling for Eaton + ePDUs G2/G3 Improve the way we declare and process + input.realpower, in order to address the variations between Eaton + ePDUs G2 and G3 + +2015-03-19 Arnaud Quette + + * docs/nut-names.txt: Document new variables and commands addition + The variables and commands that were added were not described in + the NUT namespace document. These are: input.transfer.delay - + battery.energysave.load - battery.energysave.delay - + battery.charger.status - outlet.1.shutdown.return - + outlet.2.shutdown.return + * drivers/bcmxcp.c: Fix the letter case of ABM and outlets status + For more coherence with NUT status publication, these status are + now lower case + * drivers/bcmxcp.c: Add missing Author + +2014-10-10 gavrilov-i + + * data/cmdvartab, drivers/bcmxcp.c, drivers/bcmxcp.h: drivers/bcmxcp: + advanced features Closes: #158 Added setvar function exec result + parsing Add command to turn load on after shutdown.stayoff and + shutdown.return. Outlet control changed. Outlet control via + commands "outlet.n.load.on/off" like in other drivers. Variable + outlet.n.staus now only for reading. Some code changes in + outlet.n.shutdown.return command - now supporting more than 3 + outlets (up to 9). Add descriptions to new and some old variables + and commands. Add "bypass.start" command, for enabling bypass. For + returning in On-Line mode exec "load.on" command. Additional + checks of UPS vars. Now add zero var only if it could be changed. + +2015-04-01 Arnaud Quette + + * drivers/eaton-mib.c: Workaround input.{power,realpower} for Eaton + ePDUs Add variable declarations to handle missing + input.{power,realpower} on Eaton ePDUs G2 and G3 1phase. On 3phase, + these variables point at SNMP OIDs that sum up the 3 phases + information. These OIDs should also be present on 1phase, however + it's actually not the case. So simply duplicate the L1 declaration + +2015-03-31 Arnaud Quette + + * drivers/powerware-mib.c: Implement battery.charger.status for Eaton + SNMP This new official variable now replaces the historic + 'vendor.specific.abmstatus', as per other similar implementations + (in usbhid-ups and bcmxcp drivers) + +2015-03-27 Arnaud Quette + + * drivers/mge-hid.c: Implement Eaton ABM support for USB/HID units + Add support for Eaton Advanced Battery Monitoring, for USB/HID + units. Information are provided through the new + battery.charger.status. For now, at least, when ABM is enabled, the + historic CHRG and DISCHRG flags are not published anymore in + ups.status + +2015-03-25 Daniele Pezzini + + * drivers/nutdrv_qx_voltronic.c: nutdrv_qx: add support in + 'voltronic' subdriver for P13 protocol + +2015-03-24 Arnaud Quette + + * drivers/mge-hid.c: Complementary Energy Saving data for Eaton USB + devices Add a 2nd HID path for battery.energysave.delay. Depending + on the exact device model, different implementations may be used + +2015-03-22 Daniele Pezzini + + * NEWS: nutdrv_qx: update NEWS about new 'fuji' USB subdriver + +2015-03-21 Daniele Pezzini + + * drivers/nutdrv_qx.c, drivers/nutdrv_qx.h: nutdrv_qx: typedef + testing_t only if TESTING is #defined First reported by GitHub + user @nickma82 + * docs/man/nutdrv_qx.txt, docs/nutdrv_qx-subdrivers.txt: nutdrv_qx: + document 'voltronic-qs-hex' subdriver in man pages + * docs/man/nutdrv_qx.txt, drivers/nutdrv_qx_bestups.c, drivers + /nutdrv_qx_blazer-common.c, drivers/nutdrv_qx_blazer-common.h, + drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_megatec-old.c, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_mustek.c, + drivers/nutdrv_qx_q1.c, drivers/nutdrv_qx_voltronic-qs-hex.c, + drivers/nutdrv_qx_voltronic-qs.c, drivers/nutdrv_qx_zinto.c: + nutdrv_qx: add 'ignoresab' flag to support bogus devices Some + UPSes incorrectly report the 'Shutdown Active' bit (7th bit of the + 'status byte') as always on (=1), consequently making the driver + believe the UPS is nearing a shutdown (and, as a result, ups.status + always contains FSD). To workaround this issue, add a new + 'ignoresab' flag that makes the driver do just what its name tells + (IGNORE Status Active Bit) skipping the relative item in qx2nut + tables. References: - http://lists.alioth.debian.org/pipermail + /nut-upsdev/2015-March/006896.html - + https://github.com/networkupstools/nut/issues/195 + +2015-03-11 Arnaud Quette + + * data/cmdvartab, docs/nut-names.txt: Add some new variable names, + related to ePDUs Add new variables names, related to ePDUs, such + as input.*.load, input.*.realpower and input.*.power + * drivers/eaton-mib.c: Minor update to comments + +2015-02-04 Arnaud Quette + + * drivers/eaton-mib.c: Fix outlet.{power,realpower} data mapping + According to the new mapping using the input collection, these two + data mapping were targeting at the wrong OIDs. + +2015-02-03 Arnaud Quette + + * drivers/eaton-mib.c: Fix and complete a bit Eaton ePDUs support + Add some new data mapping to improve support for Eaton ePDUs. This + commit includes some new NUT data names that requires approval + before being merged + +2015-03-19 Arnaud Quette + + * data/cmdvartab, docs/nut-names.txt, drivers/mge-hid.c: Add more + Energy Saving features for Eaton USB devices Add two new Energy + Saving features: - battery.energysave.delay: to configure the delay + before switching off the UPS if running on battery and load level + low (in minutes) - battery.energysave.realpower: to switch off the + UPS if running on battery and power consumption on UPS output is + lower than this value (expressed in Watts). Note that documentation + in nut-names.txt and cmdvartab was limited to difference with an + upcoming branch merge, that will add the others + * drivers/mge-hid.c: Align Energy Saving variable names Change + ups.load.energysave to battery.energysave.load, to be coherent with + the latest commit made in the bcmxcp driver + +2015-03-10 Arnaud Quette + + * data/cmdvartab, drivers/mge-hid.c: Add a new EnergySaving threshold + for Eaton UPSs Add 'ups.load.energysave' parameter, to enable + energy saving when the power consumption on the UPS output drops + below this value (in percent). This new variable however requires + to go through the NUT RFC process to get approved + +2015-03-19 Arnaud Quette + + * tools/Makefile.am: Also distribute nut-ddl-dump.sh helper script + +2015-03-18 Daniele Pezzini + + * data/driver.list.in: HCL: EUROCASE EA200N 2000VA supported by + nutdrv_qx Protocol: 'megatec' USB subdriver: 'fuji' Reference: ht + tp://thread.gmane.org/gmane.comp.monitoring.nut.user/8808/focus=908 + 1 + * drivers/nutdrv_qx_bestups.c, drivers/nutdrv_qx_blazer-common.c, + drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_megatec-old.c, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_mustek.c, + drivers/nutdrv_qx_q1.c, drivers/nutdrv_qx_voltronic-qs-hex.c, + drivers/nutdrv_qx_voltronic-qs.c, drivers/nutdrv_qx_zinto.c: + nutdrv_qx: remove redundancy in blazer-common-dependent subdrivers + Since main nutdrv_qx driver already sets an alarm when FSD arises + (see nutdrv_qx.c>ups_alarm_set()), there is no need to do so in the + various subdrivers. So, in order to prevent a duplicated alarm + message, remove all unneeded code from the affected subdrivers (all + the ones that depend on nutdrv_qx_blazer-common). + +2015-03-17 Daniele Pezzini + + * data/driver.list.in: HCL: update Mecer ME-1000-WTU (supported by + nutdrv_qx) Tested by @sliverc (Oliver Sauder) on NUT 2.7.1 + Reference: https://github.com/networkupstools/nut/issues/148 + +2015-03-16 Daniele Pezzini + + * docs/man/nutdrv_qx.txt: nutdrv_qx: document USB subdrivers' + glitches + * drivers/nutdrv_qx.c: nutdrv_qx: add workaround in 'fuji' subdriver + to support all shutdown.returns As 'fuji' subdriver discards all + the commands of more than 3 characters, in order to support 'SnRm' + shutdown.returns (and hence the standard 'S.5R0003' shutdown.return + with DEFAULT_{ON,OFF}DELAYs) map 'SnRm' shutdown.returns to the + corresponding 'Sn' commands, meanwhile ignoring ups.delay.start and + making the UPS turn on the load as soon as power is back. + * drivers/nutdrv_qx.c: nutdrv_qx: fix command handling in 'fuji' + subdriver 'fuji' subdriver supported devices only allow one 8 + bytes interrupt as a command/query: make the subdriver discard (and + echo back) all the too long commands. + +2014-11-08 Daniele Pezzini + + * docs/man/nutdrv_qx.txt: nutdrv_qx: update man for the new 'fabula' + and 'fuji' USB subdrivers + +2014-06-26 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: add new 'fuji' USB subdriver Add a + new USB subdriver ('fuji') to support models manufactured by Fuji + (and others) and accompained by UPSmart2000I software. + +2015-03-15 Charles Lepple + + * docs/developers.txt, docs/new-drivers.txt: doc: document build + dependencies, etc. Closes: + https://github.com/networkupstools/nut/issues/189 + * docs/nutdrv_qx-subdrivers.txt: doc: fold a few long preformatted + lines in nutdrv_qx developer guide + * docs/FAQ.txt: docs: FAQ update This addresses several issues: * + https://github.com/networkupstools/nut/issues/19 * + https://github.com/networkupstools/nut/issues/191 and Closes: + https://github.com/networkupstools/nut/issues/161 + * docs/man/Makefile.am: docs/man: provide additional detail for + missing asciidoc/a2x error + * configure.ac: configure: indicate required version of + Asciidoc/A2X/dblatex Still doesn't address data-only packages like + docbook-xsl, so leaving this issue open. Reference: + https://github.com/networkupstools/nut/issues/162 + * docs/Makefile.am, docs/man/Makefile.am: Pass --nonet to xsltproc + This prevents xsltproc from downloading DocBook XSL files for each + step in the documentation build process. Reference: + https://github.com/networkupstools/nut/issues/172 Still need to + document what to do if the build fails. + +2015-03-10 Arnaud Quette + + * docs/documentation.txt: Reference DDL on the Documentation page + Add a reference to the NUT Devices Dumps Library (DDL) on the + Documentation page, both for the website and the distributed + documentation. There are separate references, to distinguish the + DDL interest from a user and a developer point of view + +2015-03-06 Arnaud Quette + + * tools/nut-ddl-dump.sh: First stab at a helper script to generate + device dumps This preliminary version only generates .dev (static) + dump files. However, a merge with nut-recorder.sh, which generates + .seq files (dynamic simulation) is to be considered, along with an + improved version for the newer .nds format + +2015-02-24 Charles Lepple + + * data/driver.list.in: HCL: CPS Value 1500ELCD-RU @ 2.6.3 Source: + http://news.gmane.org/find- + root.php?message_id=1423241134.6830.8.camel%40ignatev + * data/driver.list.in: HCL: JAWAN JW-UPSLC02 with blazer_usb @ 2.7.2 + Source: http://news.gmane.org/find-root.php?message_id=SNT404%2dEAS + 8312A94DDAF0FAD4B7702BA52A0%40phx.gbl + +2015-02-22 Charles Lepple + + * scripts/python/app/NUT-Monitor, scripts/python/app/gui-1.3.glade: + NUT-Monitor: updated version to 1.3.1 + +2015-02-14 Charles Lepple + + * NEWS, UPGRADING: NEWS/UPGRADING for 2.7.3 + +2015-02-14 Daniele Pezzini + + * docs/man/nutdrv_qx.txt: nutdrv_qx: specify 'bestups' ranges in man + pages + +2015-01-03 Daniele Pezzini + + * drivers/nutdrv_qx_bestups.c: nutdrv_qx: bestups - add support for + 'M' query + +2014-11-02 Daniele Pezzini + + * docs/man/nutdrv_qx.txt, docs/nutdrv_qx-subdrivers.txt: nutdrv_qx: + update man pages for new 'bestups' subdriver + * drivers/Makefile.am, drivers/nutdrv_qx.c, + drivers/nutdrv_qx_bestups.c, drivers/nutdrv_qx_bestups.h: + nutdrv_qx: add BestUPS subdriver (protocol=bestups) A subdriver + using Best Power/Sola Australia protocol as described in + http://www.networkupstools.org/protocols/sola.html Based also on + bestups.c and meant to eventually replace it. + +2015-02-14 Michael Fincham + + * scripts/python/app/NUT-Monitor: Correct unsafe permissions on + ~/.nut-monitor (Debian #777706) fix-permissions-on-start.debdiff + from https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=777706#24 + Closes: https://github.com/networkupstools/nut/issues/185 + +2015-02-14 Michal Soltys + + * drivers/apcsmart.c: apcsmart: fix SEGV in apc_getcaps() ups ... + +2015-02-13 Michal Soltys + + * drivers/apcsmart.c, drivers/apcsmart.h: apcsmart: fix command set + parsing for protocol version 4 The issue was discovered with + Smart-UPS RT 10000 XL by surr, see + https://github.com/networkupstools/nut/issues/180 When protocol + version is 4, command set query returns string with additional + section after another '.' . This patch updates the code to handle + such string as well. + +2015-02-10 Charles Lepple + + * configure.ac: configure.ac: bump version to 2.7.2.6 for snapshots + * scripts/upower/95-upower-hid.rules: upower: regenerate for Powercom + PID 0001 (PR #121) + * configure.ac: configure.ac: add bug report URL Should be + compatible with Autoconf 2.59 and newer. + +2015-02-04 Arnaud Quette + + * drivers/netvision-mib.c: Improve support for on-battery detection + Add support for upsAlarmOnBattery OID, to better detect on-battery + events (reported by Henning Fehrmann) + * drivers/libhid.c, drivers/libhid.h: Fix compilation warning related + to sign comparison + +2015-01-31 Ryan Underwood + + * drivers/apc-hid.c, scripts/upower/95-upower-hid.rules: Add a + product ID for APC AP9584 USB kit. Resolves + networkupstools/nut#181 + +2015-01-12 Charles Lepple + + * scripts/upower/95-upower-hid.rules: upower: regenerate rules file + for OpenUPS PID 0xd005 + * Makefile.am: Add systemd unit dir fix for 'make distcheck' + +2015-01-11 Sergey Kvachonok + + * configure.ac: Undo ${systemdsystemunitdir} mangling. Running sed + 's/\/lib/\${libdir}/' destroys any ${systemdsystemunitdir} values + that don't start with '/lib' e.g. '/usr/lib64/systemd/system' + becomes '/usr/usr/lib6464/systemd/system'. If a local installation + prefix is needed use appropriately prefixed --with- + systemdsystemunitdir='' parameter instead. + +2015-01-02 Charles Lepple + + * docs/cables.txt, docs/config-notes.txt, docs/configure.txt, + docs/features.txt, docs/history.txt, docs/man/nutdrv_qx.txt, docs + /nut-names.txt, docs/scheduling.txt, docs/security.txt: docs: typo + fixes + +2015-01-01 Charles Lepple + + * docs/cables.txt: docs: MGE NMC pinout Closes + https://github.com/networkupstools/nut/issues/141 + * docs/cables.txt: docs: Best Power cable pinout Closes + https://github.com/networkupstools/nut/issues/164 + * INSTALL.nut: docs: clarify group ownership of directory in + INSTALL.nut Closes + https://github.com/networkupstools/nut/issues/151 + * docs/man/dummy-ups.txt: docs: dummy-ups repeater mode requires `@` + in port name Also reworded parts of the man page. + +2014-12-17 bsalvador + + * drivers/solis.c: Update solis.c to force ScanReceivePack() + +2014-12-12 Andy Juniper + + * clients/upslog.c, docs/man/upslog.txt: upslog: break out of sleep + on SIGUSR1 and log immediately Reference: http://news.gmane.org + /find-root.php?message_id=54863D44.3000902%40freeuk.com + +2014-11-25 Charles Lepple + + * data/driver.list.in: HCL: additional NHS models + +2014-11-17 Charles Lepple + + * data/driver.list.in: HCL: NHS Sistemas de Energia: Expert C + Isolador series Source: http://news.gmane.org/find-root.php?messag + e_id=CADe06rfE5MA%3dyWDZzofPsC7TOgGOU4TRSoi67uMXedymA9L7ow%40mail.g + mail.com + +2014-11-07 Arnaud Quette + + * scripts/subdriver/gen-snmp-subdriver.sh: Various minor fixes to the + SNMP subdriver generator + +2014-11-06 Charles Lepple + + * drivers/openups-hid.c: openups-hid: Fix scale factors for 0xd005 + (0.4) Previous commit had extra scale factors applied. + * drivers/openups-hid.c, drivers/openups-hid.h: openups-hid: voltage + scale factors based on product IDs + * drivers/openups-hid.c: openups-hid: remove a const; this will + require more thought The USB matching routines should have their + parameters marked as "const" to indicate that they do not modify + the matching tables, but that will require more invasive changes. + Roll this back for now. + +2014-11-05 Charles Lepple + + * drivers/openups-hid.c: openups-hid: const and float/double fixups + (0.2) + * drivers/openups-hid.c: openups-hid: add USB ProductID d005 for + OpenUPS2 + +2014-11-05 Arnaud Quette + + * Makefile.am: Store the git start point as a variable For + ChangeLog, we now store the git start point (older reference) in a + separate variable, to make the process more clear + +2014-10-31 Charles Lepple + + * docs/download.txt: Update VMware ESXi package link (from René + Garcia) + +2014-10-29 Charles Lepple + + * scripts/upower/95-upower-hid.rules: upower: Update Belkin and + Liebert rules Follow-up to issue #159. + * drivers/belkin-hid.c, drivers/liebert-hid.c: usbhid-ups: comments + describing Belkin/Liebert/Phoenixtec situation Follow-up to issue + #159. + * data/driver.list.in: HCL: Rucelf UPOII-3000-96-EL supported by + blazer_ser Manufacturer: + http://www.rucelf.ua/en/catalog/upoii-3000-96-el/ Closes: + https://github.com/networkupstools/nut/issues/165 + +2014-10-28 Elio Parisi + + * drivers/riello_usb.c: riello_usb: explicitly claim USB interface + Reference: http://news.gmane.org/find-root.php?message_id=7731ed2f9 + 8014b8a90e695a06d077970%40AM3PR07MB289.eurprd07.prod.outlook.com + and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738122 + +2014-10-20 Elio Parisi + + * drivers/riello_usb.c: riello_usb: timeouts and error handling + (0.03) Small changes in riello_usb.c that solved some problem with + managing transmission errors between the Raspberry Pi and Riello + ups (thanks to Fredrik Öberg): introducing timeout in reading ups + data in cypress_command; enhanced handling error codes + http://news.gmane.org/find-root.php?message_id=f5294e5579574bcbaf5c + dd95523e0b68%40AM3PR07MB289.eurprd07.prod.outlook.com + * drivers/riello_ser.c: riello_ser: enhanced handling error codes + (0.03) + +2014-10-20 Charles Lepple + + * docs/.gitignore: docs: docinfo.xml is now auto-generated + +2014-10-20 Nik Soggia + + * drivers/Makefile.am: missing -lm in drivers/Makefile.am Both + bcmxcp and bcmxcp_usb use ldexp(), so both need `-lm`. + http://news.gmane.org/find- + root.php?message_id=544515BA.4060804%40niksoggia.it + +2014-10-10 Paul Chavent + + * drivers/belkin-hid.c: drivers : add Liebert GXT3 device. + * drivers/main.c: drivers : fix possible memory leak. In arguments + parsing, if user option is passed. + +2014-09-30 Michal Soltys + + * drivers/apcsmart.c: apcsmart: increase passes in setvar_enum() + Current 6 is not enough for bigger units - especially if we swap to + the value directly preceeding the current setting. + +2014-09-27 Daniele Pezzini + + * configure.ac, docs/Makefile.am, docs/docinfo.xml, + docs/docinfo.xml.in: docs: add NUT version number/date in PDF + documents Reference: + https://github.com/networkupstools/nut/issues/150 + * docs/chunked.xsl, docs/common.xsl, docs/xhtml.xsl: docs: move + DocBook options common to html stylesheets to common.xsl + * docs/Makefile.am, docs/common.xsl: docs: add NUT version + number/date into footer of HTML pages Reference: + https://github.com/networkupstools/nut/issues/150 + +2014-09-28 Arnaud Quette + + * docs/configure.txt: Clarify a bit more Avahi build requirements + * tools/nut-scanner/Makefile.am: Don't reference subdir-object with + $(top_srcdir) Replace references to objects in separate + directories that were using $(top_srcdir) by the expanded version + '../../'. The variable was otherwise part of the path, resulting in + build failures. This completes commit f8abb9b Closes + networkupstools/nut#155 + * configure.ac: Explicitly use subdir-objects in automake init + Closes networkupstools/nut#155 + +2014-09-27 Arnaud Quette + + * configure.ac, m4/nut_check_asciidoc.m4: Also check for source- + highlight at configure time source-highlight is used for + documentation generation. It's however optional, so we just check + for the sake of completion + +2014-09-27 Arnaud Quette + + * docs/man/Makefile.am, docs/man/asciidoc.conf: Add NUT version + number into footer of HTML man pages Override AsciiDoc default for + footer-txt to include NUT version number into footer of HTML man + pages. This commit addresses the 2nd point of + networkupstools/nut#150 + +2014-09-26 Charles Lepple + + * drivers/tripplite_usb.c: tripplite_usb: set input.voltage.nominal + back to 230V (0.30) Keeps the input.voltage and output.voltage + scaling from 0.28 Discussion: + http://article.gmane.org/gmane.comp.monitoring.nut.user/8719 + +2014-09-26 Arnaud Quette + + * conf/upsmon.conf.sample.in, docs/man/nut.conf.txt, + docs/man/upsmon.conf.txt, docs/packager-guide.txt: Replace outdated + references to shutdown.txt shutdown.txt was merged into config- + notes.txt during the AsciiDoc conversion of the whole documentation + and website. This content is now available in the docs/config- + notes.txt file, section [[UPS_shutdown]] "Configuring automatic + shutdowns for low battery events" + * conf/upsmon.conf.sample.in: Fix default value of POWERDOWNFLAG + POWERDOWNFLAG path changed from the hard-coded value /etc/killpower + to the build-time generated @CONFPATH@/killpower. This resulted in + an unexpected value '/etc/nut/killpower', at least on Debian. + (reported by Laurent Bigonville) Closes networkupstools/nut#74 + +2014-09-25 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: move to ltrim_m()/rtrim_m() + functions + * common/common.c, include/common.h: Add ltrim_m()/rtrim_m() + functions to trim several chars at the same time Also, make + ltrim() / rtrim() wrappers around ltrim_m() / rtrim_m(). + * common/common.c: Make ltrim() modify the input string Also, always + check string length in both ltrim() and rtrim(). Reference: + https://github.com/networkupstools/nut/issues/154 + +2014-09-25 Charles Lepple + + * data/driver.list.in: HCL: sort Tripp Lite models by name, then + increasing power I know this doesn't allow the cell merging code + to do as much, but this should make it easier to find models. + * data/driver.list.in: HCL: add Tripp Lite OMNIVSINT800 + (tripplite_usb) Source: + http://article.gmane.org/gmane.comp.monitoring.nut.user/8713 + * drivers/tripplite_usb.c: tripplite_usb: scale min/max voltages for + SMART protocol (0.29) Observed in a dump file from driver version + 0.11. Scale input.voltage.minimum and input.voltage.maximum the + same way as other voltages. + * drivers/tripplite_usb.c: tripplite_usb: fix voltage scaling for + 240V/1001 (0.28) Reported by Dave Williams: + http://article.gmane.org/gmane.comp.monitoring.nut.user/8713 The + input.voltage and output.voltage scaling for Protocol 1001 did not + factor in the input_voltage_scaled value. + +2014-09-24 Arnaud Quette + + * scripts/python/app/nut-monitor.appdata.xml: Fix compliance of NUT- + Monitor FreeDesktop AppData file Following the upstream update (by + David Goncalves), update the screenshots width and height to + conform to AppData specification: + http://people.freedesktop.org/~hughsient/appdata/ Closes + networkupstools/nut#127 + +2014-05-18 Charles Lepple + + * drivers/genericups.c: genericups: log cable type overrides as they + are parsed Fixes networkupstools/nut#28 Better than nothing, but + without a unit to test against, I don't want to make any more + intrusive changes. + +2014-09-17 Arnaud Quette + + * docs/nut-qa.txt: Minor update and completion Use the new Debian + package tracker URL and add Redhat / Fedora bug tracker + +2014-09-15 Daniele Pezzini + + * data/driver.list.in: HCL: add devices supported by nutdrv_qx - + Fideltronik LUPUS 500 USB Protocol: 'megatec' USB subdriver: + 'fabula' Reference: http://lists.alioth.debian.org/pipermail/nut- + upsuser/2014-June/009059.html - FTUPS FT-1000BS(T) / Voltronic + Power Apex 1KVA Protocol: 'voltronic-qs-hex' USB devices -> USB + subdriver: 'cypress' - FTUPS FT-1000BS / Voltronic Power Imperial + 1KVA Protocol: 'voltronic-qs' USB devices -> USB subdriver: + 'cypress' + +2014-07-11 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: improve the USB matching procedure + Consider also the iManufacturer/iProduct strings when checking + devices (if subdriver is not specified) to assign the right + subdriver in case the VID:PID couple is not specific enough. + +2014-06-30 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: add new 'fabula' USB subdriver Add + a new USB subdriver ('fabula') to support models + manufactured/rebranded by Fideltronik and accompained by + UPSilon2000 software. Reference: + http://lists.alioth.debian.org/pipermail/nut- + upsuser/2014-June/009059.html + +2014-09-03 Daniele Pezzini + + * drivers/Makefile.am, drivers/nutdrv_qx.c, drivers + /nutdrv_qx_voltronic-qs-hex.c, drivers/nutdrv_qx_voltronic-qs- + hex.h: nutdrv_qx: add Voltronic-QS-Hex subdriver (protocol + =voltronic-qs-hex) A subdriver using a protocol, specific to UPSes + manufactured by Voltronic Power, partially Hex-encoded (e.g. 'QS' + reply) and supporting some megatec commands. + * docs/nutdrv_qx-subdrivers.txt: nutdrv_qx: update docs about added + support for more complex UPS answers + * drivers/nutdrv_qx.c, drivers/nutdrv_qx.h, + drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_megatec-old.c, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_mustek.c, + drivers/nutdrv_qx_q1.c, drivers/nutdrv_qx_voltronic-qs.c, + drivers/nutdrv_qx_voltronic.c, drivers/nutdrv_qx_zinto.c: + nutdrv_qx: add basic support for more complex UPS answers Add + support (also in 'TESTING' mode) for '\0' chars in raw UPS answers + and the ability to preprocess answers before anything else (e.g.: + for CRC, decoding, ...). Increase verbosity of USB subdrivers and + serial communication. Always print also the return code when + dealing with an error. Update all subdrivers accordingly, bump + versions. + +2014-09-08 Charles Lepple + + * docs/documentation.txt: docs: Add link to Roger Price's openSUSE + writeup + +2014-09-04 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: prevent a vicious loop when + unexpected answers happen If a 'QX_FLAG_QUICK_POLL' item gets an + unexpected (non-empty) answer and, after returning from + 'qx_ups_walk()', it is not followed by at least one item using a + different 'command', the driver will loop endlessly using the same + 'broken' answer instead of trying to get a new one from the UPS. To + solve this issue, make sure to have an empty 'previous_item' when + starting 'qx_ups_walk()'. Also, bail out of 'qx_ups_walk()' when a + 'QX_FLAG_QUICK_POLL' item can't be preprocessed properly through + 'ups_infoval_set()'. + +2014-09-04 Charles Lepple + + * docs/man/asem.txt: docs: recommend I2C bus name for asem driver + +2014-09-03 Arnaud Quette + + * docs/man/nut-scanner.txt: Fix typo error in nut-scanner doc The + example network range scanned when using 192.168.0.0/25 is actually + 192.168.0.0 to 192.168.0.12*7* not (i.e. not .128) as previously + stated (reported by Evgeny 'Jim' Klimov) Closes + networkupstools/nut#144 + +2014-09-02 Charles Lepple + + * data/driver.list.in, drivers/belkin-hid.c: HCL: Belkin Regulator + PRO-USB 050d:0f51 (0.17) + https://github.com/networkupstools/nut/issues/149 + +2014-08-22 Charles Lepple + + * data/driver.list.in: HCL: Mecer ME-100-WTU with blazer_usb USB + VID:PID = 0665:5161 Tested by @silvec (Oliver Sauder) on NUT 2.6.3 + Reference: https://github.com/networkupstools/nut/issues/148 + +2014-08-19 Charles Lepple + + * docs/documentation.txt: docs: update links for two articles + +2014-08-17 Charles Lepple + + * tools/nut-usbinfo.pl: nut-usbinfo: fix FreeBSD devd.conf to use + $cdev + * scripts/upower/95-upower-hid.rules: 95-upower-hid.rules: updated by + nut-usbinfo.pl URL updated in previous commit. + * tools/nut-usbinfo.pl: nut-usbinfo: change link from Alioth SVN to + GitHub + * scripts/udev/.gitignore: udev: ignore 62-nut-usbups.rules Follow- + up commit to networkupstools/nut#140 + +2014-08-17 Yann E. MORIN + + * conf/Makefile.am: conf/: fix parallel install Do not reference the + upsmon.conf.sample twice, otherwise install, with a high number of + make jobs, may fail, like so: http://autobuild.buildroot.net/result + s/256/2567e13cd5bc702bc3a38a1d6fc8e34022cc7db5/build-end.log --- + This is not a rare occurence, as my testing managed to trigger the + issue in about 1 test out of 10 on average, on a not-so-fast + machine. + +2014-08-16 Charles Lepple + + * tools/nut-usbinfo.pl: nut-usbinfo: ignore *.orig files + +2014-08-14 Émilien Kia + + * configure.ac, docs/man/Makefile.am, m4/nut_check_asciidoc.m4: Test + presence of xmllint for manpages doc generation. + * configure.ac, docs/man/Makefile.am, m4/nut_check_asciidoc.m4: Test + presence of xsltproc for manpages doc generation. + +2014-08-04 Charles Lepple + + * docs/man/ups.conf.txt, drivers/libusb.c: Remove redundant + usb_set_altinterface(), unless user requests it Adds flag/value to + USB driver options. Closes networkupstools/nut#138 + +2014-08-09 Charles Lepple + + * drivers/blazer_usb.c, drivers/libusb.c, drivers/nutdrv_qx.c, + drivers/tripplite_usb.c, drivers/usb-common.h, drivers/usbhid- + ups.c: libusb.c: consolidate USB-related addvar() calls + * drivers/cps-hid.c: usbhid-ups (CPS): determine battery.voltage + scale factor at runtime If the battery.voltage reading is greater + than 1.4x battery.voltage.nominal, apply a scale factor of 2/3 to + bring the voltage back in line. Closes networkupstools/nut#142 + +2014-08-08 Arnaud Quette + + * docs/man/nut-scanner.txt: Fix typo error Fix a typo error on "-B" + option (reported by Evgeny 'Jim' Klimov) + +2014-08-05 Arnaud Quette + + * scripts/python/Makefile.am: Distribute FreeDesktop AppData file for + NUT Monitor FreeDesktop AppData file for NUT Monitor was not + distributed, waiting for some approval + +2014-08-01 Arnaud Quette + + * scripts/udev/Makefile.am, scripts/udev/README: Fix USB permission + issues related to Linux / udev Rename udev rules file to 62-nut- + usbups.rules, to prevent NUT USB privileges from being overwritten + Closes #140 + * docs/cables.txt: Fix typo error on Eaton / MGE USB-RJ45 cable + +2014-07-14 Charles Lepple + + * scripts/Aix/.gitignore: Ignore generated AIX spec file + +2014-07-14 Giuseppe Corbelli + + * AUTHORS, docs/man/asem.txt: asem: additional documentation + http://article.gmane.org/gmane.comp.monitoring.nut.devel/6741 + +2014-07-13 Charles Lepple + + * docs/man/upscli_get.txt: upscli_get(): mention SIGPIPE handling + Closes: #132 + * data/driver.list.in: HCL: distinguish between Tripp Lite old and + new protocol 3005 + +2014-07-13 Arnaud Quette + + * scripts/python/app/nut-monitor.appdata.xml: Complete FreeDesktop + AppData file for NUT Monitor As per Richard Hughes comments, in + #127, complete the description field + +2014-07-12 Arnaud Quette + + * scripts/Aix/nut-aix.spec.in: Minor adjustments as per Github + comments + * docs/configure.txt: Add missing documentation for configure option + The new asem driver introduced --with-linux_i2c, for which + documentation was missing in configure documentation + +2014-07-11 Charles Lepple + + * NEWS, data/driver.list.in, docs/man/Makefile.am, docs/man/asem.txt, + docs/man/index.txt: asem: documentation + +2014-07-07 Giuseppe Corbelli + + * configure.ac, data/driver.list.in, drivers/Makefile.am, + drivers/asem.c: Support for ASEM UPS on Linux/i2c Patch from + http://article.gmane.org/gmane.comp.monitoring.nut.devel/6723 + Thread: http://news.gmane.org/find- + root.php?message_id=53A83FCB.1080808%40copanitalia.com Builds on + Ubuntu 12.10 and 14.04; requires libi2c-dev + +2014-07-05 Charles Lepple + + * drivers/tripplite_usb.c: tripplite_usb: fix typos in bin2d() and + control_outlet() (0.27) + * drivers/tripplite_usb.c: tripplite_usb: control_outlet() for + protocol 3005 (0.26) + * drivers/tripplite_usb.c: tripplite_usb: Additional 3005 protocol + support (0.25) http://news.gmane.org/find-root.php?message_id=CAFe + iwyG8HCfg%2dQqxcwhnm1Yo0z0F0BLyOPCYX%2d4yMMFg8sB4QQ%40mail.gmail.co + m + * drivers/tripplite_usb.c: tripplite_usb: basic support for 3005 + binary protocol (0.24) Based on logs from SMART500RT1U + +2014-07-04 vesnn + + * drivers/powercom.c: Update powercom.c Fix Powercom Imperial + initialization for models since 2009 with USB interface. + +2014-06-23 Arnaud Quette + + * scripts/python/app/nut-monitor.appdata.xml: Create a FreeDesktop + AppData file for NUT Monitor appData files provide to users long + descriptions, screenshots and other useful information on + application. This will mainly serve for Software Center like + applications + +2014-06-19 Charles Lepple + + * data/driver.list.in: HCL: Lacerda New Orion 800VA with blazer_usb + http://news.gmane.org/find-root.php?message_id=CANDysWwqgTUMYU03QbP + T8JxEtLd38mvwfTMMhZqS%3d%2diGpdvJDA%40mail.gmail.com + +2014-06-17 Charles Lepple + + * data/driver.list.in: HCL: add APC-Microsol entry for solis + * drivers/solis.c: solis: silence clang warnings about extra + parentheses Since we're in the neighborhood (#133)... Typically, + the idiom is either: if ( a == b ) for equality checking, or: if + ( ( a = b ) ) for assignment with a comparison. + * drivers/solis.c, drivers/solis.h: solis: eliminate fixed-length + string buffer for model name The new APC model name overflows the + buffer. (#133) + +2014-06-16 bsalvador + + * drivers/solis.c: Update on solis.c to add more support to Back-UPS + 1200BR + * drivers/solis.c: Update solis.c to support Microsol-APC Unit. + Added support to Back-UPS 1200BR (Microsol-APC) unit. + +2014-06-15 Charles Lepple + + * docs/man/upscli_get.txt, docs/man/upscli_list_next.txt, + docs/man/upscli_list_start.txt: docs: synchronize upscli_* + numq/numa with header There were a few leftover signed int + parameters in the man pages, but the headers and implementation use + 'unsigned int'. Closes: + https://github.com/networkupstools/nut/issues/131 + * docs/man/solis.txt: docs: mention APC in Microsol driver man page + * docs/man/apcsmart.txt: docs: point APC Microsol users from apcsmart + to solis Also make some of the formatting and grammar self- + consistent. + * drivers/solis.c: solis: recognize APC BZ1200-BR and BZ2200BI-BR + (0.62) Patch suggested by Bruno Salvador for BZ1200-BR, and also + tested by Douglas A. Augusto on BZ2200BI-BR. Reference: * + http://forums.freenas.org/index.php?threads/nobreak-bz1200-br-back- + ups-rs-1200va-600w-bivolt-115-nt.20247/ * http://news.gmane.org + /find-root.php?message_id=CACu22%2d3Nn2R%3dQQe9uy%5fPXHRduaPaFgCp2S + w4ra57Ow2qDQcOJQ%40mail.gmail.com + +2014-06-08 Arnaud Quette + + * scripts/subdriver/gen-snmp-subdriver.sh: Inline documentation fixes + +2014-06-03 george + + * scripts/python/module/PyNUT.py: Fixed version description. + * scripts/python/module/PyNUT.py: Added author information, bumped + version. According to the semantic versioning scheme + (http://semver.org/), adding features that do not break backwards + compatibility with previous releases means that the minor version + number should be incremented. + * scripts/python/module/PyNUT.py: Change format of raise keyword. + Fixes PyNUT Python 3 compatibility. + * scripts/python/module/PyNUT.py: PyNUT: Create a custom exception + class. This maintains backwards compatibility, and allows calling + programs to use "except PyNUTError" instead of "except Exception" + when using PyNUT methods. See + https://wiki.python.org/moin/HandlingExceptions for more + information. + * scripts/python/module/PyNUT.py: Fix error when raising without an + Exception. Raising without a valid exception is invalid: >>> + raise Traceback (most recent call last): File "", line 1, in + TypeError: exceptions must be old-style classes or derived + from BaseException, not NoneType >>> raise Exception Traceback + (most recent call last): File "", line 1, in + Exception Changing this to "raise Exception" fixes this problem. + +2014-06-01 Charles Lepple + + * docs/man/tripplite_usb.txt, drivers/tripplite_usb.c: tripplite_usb: + last tweaks, for now. Initialize bv_12V to a dummy value, since + gcc can't see that it is used in the union of both conditionals + where it is set. Also, align the documentation with the strange + definition of empty used by the Tripp Lite state-of-charge + approximation. + * drivers/tripplite_usb.c: tripplite_usb: silence warning (0.23) + Pedantic, to be sure, but someone might try the driver with a + protocol not listed, and sure enough, bv_12V won't be initialized. + * docs/man/tripplite_usb.txt, drivers/tripplite_usb.c: tripplite_usb: + expose battery_min/_max as variables (0.22) http://news.gmane.org + /find- + root.php?message_id=21370.36829.817425.464627%40godel.bruda.ca + +2014-05-27 Charles Lepple + + * data/driver.list.in: HCL: GRAFENTHAL PR-3000-HS supported by snmp- + ups Tested with 2.6.5-3 (0.68) on Windows (IETF MIB 1.4). Some + NUT variables are zero - further testing may be needed. Reference: + http://news.gmane.org/find-root.php?message_id=75FC7A5479BA4A4E8ADF + 76BC3AD3E568581EC753%40MS03.MACLE.DE + +2014-05-23 Charles Lepple + + * drivers/tripplite_usb.c: tripplite_usb: use dv/dq charge + calculation for all models (0.21) + +2014-05-20 Andrew Burdo + + * drivers/powercom-hid.c: Add comments for some values. + * drivers/usbhid-ups.c: Reuse variable. + * drivers/usbhid-ups.c: Add default case. + +2014-05-18 Charles Lepple + + * scripts/upower/95-upower-hid.rules: upower: regenerate rules file + USB VID:PID = 10af:0004 This dependency graph makes my head spin. + * configure.ac: configure.ac: version to 2.7.2.5 for snapshots + +2014-05-13 Daniele Pezzini + + * drivers/compaq-mib.c: compaq-mib: comment out no longer used items + As per 31827d5faa86377efb7a92b7aec322cc4c7a275f + +2014-05-03 Daniele Pezzini + + * docs/download.txt: docs: add Void Linux in download/Binary packages + Reference: https://github.com/networkupstools/nut/issues/125 + +2014-05-03 Charles Lepple + + * docs/Makefile.am: docs: add mge-usb-rj45.jpg to distribution + +2014-05-02 Arnaud Quette + + * docs/images/cables/mge-usb-rj45.jpg: Add MGE information on USB- + RJ45 cable The illustration matching the previous commit was still + needed on the nut repository, and not on the nut-website on + * docs/cables.txt: Add MGE information on USB-RJ45 cable These + information were provided by MGE years ago, and were waiting for + counter testing. Martin De Graaf - Loyer has now fixed this. Note + that the matching illustration will be committed on the new nut- + website repository + +2014-04-29 Andrew Burdo + + * drivers/powercom-hid.c, drivers/usbhid-ups.c: Bump versions. + * data/driver.list.in, docs/man/usbhid-ups.txt: Update documentation. + * drivers/usbhid-ups.c: Reconnect on interrupt read error. + * drivers/libhid.c, drivers/libhid.h, drivers/powercom-hid.c, drivers + /usbhid-ups.c: Reading from the interrupt pipe implies that you use + INPUT flagged objects. + * drivers/powercom-hid.c: Remove erroneous status. + * drivers/powercom-hid.c: Comment non-compliant variables. + +2014-04-17 Andrew Burdo + + * drivers/libhid.c, drivers/libhid.h, drivers/powercom-hid.c, drivers + /usbhid-ups.c: Add support for 0d9f:0001 (USB HID, Powercom). + 2014-04-17 Arnaud Quette * NEWS, UPGRADING, configure.ac: Update for release 2.7.2 Complete @@ -68,6 +1116,78 @@ * UPGRADING: Added note about --enable-option-checking=fatal Closes #99 (really) +2014-03-05 Émilien Kia + + * scripts/Aix/nut-aix.spec.in: Make web source path independant from + specific version. + * scripts/Aix/nut-aix.spec.in: Use configure-dependant variables + instead of statically defined ones for user and group. + * configure.ac: Use $target_cpu instead of calling uname to know cpu + type. Fix crosscompilation. + +2013-06-14 Vaclav Krpec + + * scripts/Aix/nut-aix.spec.in, scripts/Aix/nut.init: AIX: packaging & + init script improvements (cherry picked from commit + ce195e3a2eff1abbd8e192f4d3e278017d7ffb21) + +2013-06-12 Vaclav Krpec + + * scripts/Aix/nut.init: Fixed client startup detection (cherry + picked from commit 23df5e811cc9008bfa0a37bd174b59890a3760a6) + * scripts/Aix/nut-aix.spec.in: Fixed AIX RPM specfile (cherry picked + from commit 11ba37bf36dcda0398c8c62fab838dd00e54c5db) + +2013-06-11 Vaclav Krpec + + * scripts/Aix/nut-aix.spec.in: Allow libneon-based XML driver & + scanning for AIX (cherry picked from commit + 4c2e89ec584b2015b22f4599d1571c26f2f94e3d) + +2013-06-10 Vaclav Krpec + + * clients/Makefile.am: Fix of AIX-specific parseconf linking bug + Added dummy do_upsconf_args to binaries that use libcommon to + satisfy the linker. libcommon links libparseconf, which calls + do_upsconf_args supplied from above as an implementation-specific + routine. (cherry picked from commit + 0078f9383d3a7af4f3edfed6c78de387a12c6b2b) + +2013-04-25 Vaclav Krpec + + * clients/Makefile.am, clients/upsclient.c, configure.ac: + linupsclient: NUT scanning on AIX bugfix 1/ A simmilar bug like in + Solaris is in AIX itself---non-blocking connect may return -1 while + errno == 0. Shall be treated as EINPROGRESS. 2/ Linking of + libupsclent.so on AIX requires libcommon, otherwise scanning for + NUT crashes with SIGSEGV on unresolved usplogx (cherry picked from + commit 16177f99bc995852bb86d2183958f24f11993632) + +2013-03-13 Vaclav Krpec + + * Makefile.am: AIX packages: make package does the trick (cherry + picked from commit 1d25bd2868339decace5b3028c834746f2824670) + +2013-03-12 Vaclav Krpec + + * scripts/Aix/nut-aix.spec.in, scripts/Aix/nut.init: AIX packaging: + nut-client uninstal bugfix Packages clean uninstallation + (lost/forgotten commit) (cherry picked from commit + f6dd1aec5d2157a3ba3654621fa8e2ac88b060f9) + +2013-03-08 Vaclav Krpec + + * clients/upsclient.c, configure.ac: Solaris/i386: non-blocking + connect WA (cherry picked from commit + d2b466b9ee5402074ccbf7f2967433350affdbcc) + +2013-03-04 Vaclav Krpec + + * Makefile.am, configure.ac, scripts/Aix/nut-aix.spec.in, + scripts/Aix/nut.init: AIX packaging AIX init script and RPM spec. + file added (cherry picked from commit + 3851525edcb417f96a5d1c12fb786b85095b54d4) + 2014-03-03 Charles Lepple * data/driver.list.in: HCL: various updates * Closes diff --git a/INSTALL b/INSTALL index a1e89e1..2099840 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ Installation Instructions ************************* -Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, @@ -12,8 +12,8 @@ without warranty of any kind. Basic Installation ================== - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented @@ -309,9 +309,10 @@ causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== @@ -367,4 +368,3 @@ operates. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. - diff --git a/INSTALL.nut b/INSTALL.nut index bc754cc..160b558 100644 --- a/INSTALL.nut +++ b/INSTALL.nut @@ -141,7 +141,7 @@ State path creation Create the state path directory for the driver(s) and server to use for storing UPS status data and other auxiliary files, and make it -owned by the user you created. +group-writable by the group of the system user you created. mkdir -p /var/state/ups chmod 0770 /var/state/ups @@ -183,7 +183,7 @@ drivers; this should allow you to follow the below instructions. However, don't forget to set up the correct permissions later!). -NOTE: if you are using something like devfs or udev, make sure +NOTE: if you are using something like udev or devd, make sure these permissions stay set across a reboot. If they revert to the old values, your drivers may fail to start. diff --git a/Makefile.am b/Makefile.am index 2d67519..aebe618 100644 --- a/Makefile.am +++ b/Makefile.am @@ -21,6 +21,7 @@ DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto DISTCHECK_LIGHT_FLAGS = --with-all=auto --with-ssl=auto --with-doc=auto DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \ + --with-systemdsystemunitdir='$${prefix}/lib/systemd/system' \ --with-hotplug-dir='$${prefix}/etc/hotplug' \ --with-udev-dir='$${prefix}/etc/udev' \ --with-devd-dir='$${prefix}/etc/devd' @@ -36,15 +37,23 @@ distcheck-light: distcleancheck: @: +# ---------------------------------------------------------------------- # Automatically generate the ChangeLog from Git logs: MAINTAINERCLEAN_FILES = ChangeLog + +# Older boundary of the ChangeLog commits range +# It can be a tag ('v2.2.0'), a commit hash, a date, ... +# See gitrevisions for more information on specifying ranges +GITLOG_START_POINT=v2.6.0 + # Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'), # in case it has already been generated previously dummy-stamp: ChangeLog: tools/gitlog2changelog.py dummy-stamp - $(top_srcdir)/tools/gitlog2changelog.py v2.6.0 || \ + $(top_srcdir)/tools/gitlog2changelog.py $(GITLOG_START_POINT) || \ echo "gitlog2changelog.py failed to generate the ChangeLog. See https://github.com/networkupstools/nut/commits/master" > $@ +# ---------------------------------------------------------------------- # Maintainers targets: distribution signature and hashes dist-sig: gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz @@ -113,14 +122,17 @@ package: cd scripts/HP-UX; \ make package; \ mv NUT_HPUX_package.depot NUT_HPUX_package@PACKAGE_VERSION@.depot; \ - else \ - if test `uname -s` = "SunOS"; then \ - make; \ - rm -rf @prefix@; \ - make install; \ - cd scripts/Solaris; \ - make package; \ - make uninstall; \ - rm -rf @prefix@; \ - fi; \ + elif test `uname -s` = "SunOS"; then \ + make; \ + rm -rf @prefix@; \ + make install; \ + cd scripts/Solaris; \ + make package; \ + make uninstall; \ + rm -rf @prefix@; \ + elif test `uname -s` = "AIX"; then \ + make dist; \ + cp scripts/Aix/nut-aix.spec /usr/src/packages/SPECS; \ + cp scripts/Aix/nut.init nut-*.tar.gz /usr/src/packages/SOURCES; \ + rpm -ba /usr/src/packages/SPECS/nut-aix.spec; \ fi; diff --git a/Makefile.in b/Makefile.in index f702014..44ffd6b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,23 +16,51 @@ # top-level Makefile for NUT VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -54,14 +81,16 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/configure \ +DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(top_srcdir)/scripts/Aix/nut-aix.spec.in \ + $(top_srcdir)/scripts/avahi/nut.service.in \ $(top_srcdir)/scripts/HP-UX/nut.psf.in \ $(top_srcdir)/scripts/HP-UX/postinstall.in \ - $(top_srcdir)/scripts/avahi/nut.service.in \ - $(top_srcdir)/scripts/ufw/nut.ufw.profile.in AUTHORS COPYING \ - ChangeLog INSTALL NEWS TODO compile config.guess config.sub \ - depcomp install-sh ltmain.sh missing + $(top_srcdir)/scripts/ufw/nut.ufw.profile.in COPYING TODO \ + compile config.guess config.sub depcomp install-sh missing \ + ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -90,18 +119,32 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = scripts/avahi/nut.service scripts/HP-UX/nut.psf \ +CONFIG_CLEAN_FILES = scripts/Aix/nut-aix.spec \ + scripts/avahi/nut.service scripts/HP-UX/nut.psf \ scripts/HP-UX/postinstall scripts/ufw/nut.ufw.profile CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -109,11 +152,32 @@ am__can_run_installinfo = \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) @@ -124,6 +188,7 @@ am__remove_distdir = \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi +am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ @@ -151,6 +216,7 @@ am__relativize = \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best +DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' @@ -158,6 +224,7 @@ distcleancheck_listfiles = find . -type f -print A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -264,12 +331,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -314,6 +384,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -356,14 +427,21 @@ EXTRA_DIST = INSTALL.nut LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto DISTCHECK_LIGHT_FLAGS = --with-all=auto --with-ssl=auto --with-doc=auto DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \ + --with-systemdsystemunitdir='$${prefix}/lib/systemd/system' \ --with-hotplug-dir='$${prefix}/etc/hotplug' \ --with-udev-dir='$${prefix}/etc/udev' \ --with-devd-dir='$${prefix}/etc/devd' +# ---------------------------------------------------------------------- # Automatically generate the ChangeLog from Git logs: MAINTAINERCLEAN_FILES = ChangeLog +# Older boundary of the ChangeLog commits range +# It can be a tag ('v2.2.0'), a commit hash, a date, ... +# See gitrevisions for more information on specifying ranges +GITLOG_START_POINT = v2.6.0 + # ---------------------------------------------------------------------- # targets from old build system (pre-automake). # supported for a period of time for backward "compatibility". @@ -405,6 +483,8 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): +scripts/Aix/nut-aix.spec: $(top_builddir)/config.status $(top_srcdir)/scripts/Aix/nut-aix.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ scripts/avahi/nut.service: $(top_builddir)/config.status $(top_srcdir)/scripts/avahi/nut.service.in cd $(top_builddir) && $(SHELL) ./config.status $@ scripts/HP-UX/nut.psf: $(top_builddir)/config.status $(top_srcdir)/scripts/HP-UX/nut.psf.in @@ -424,22 +504,25 @@ distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -454,57 +537,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -520,12 +558,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -537,15 +570,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -554,9 +583,31 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) @@ -624,40 +675,42 @@ distdir: $(DISTFILES) || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__remove_distdir) + $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) + $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) + $(am__post_remove_distdir) dist-shar: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) + $(am__post_remove_distdir) -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -668,8 +721,6 @@ distcheck: dist GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ @@ -681,18 +732,19 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir); chmod u+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -715,7 +767,7 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__remove_distdir) + $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' @@ -839,14 +891,13 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ - dist-zip distcheck distclean distclean-generic \ +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ @@ -856,7 +907,7 @@ uninstall-am: install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am tags tags-recursive uninstall uninstall-am + ps ps-am tags tags-am uninstall uninstall-am distcheck-light: @@ -869,13 +920,15 @@ distcheck-light: # find . -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';' distcleancheck: @: + # Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'), # in case it has already been generated previously dummy-stamp: ChangeLog: tools/gitlog2changelog.py dummy-stamp - $(top_srcdir)/tools/gitlog2changelog.py v2.6.0 || \ + $(top_srcdir)/tools/gitlog2changelog.py $(GITLOG_START_POINT) || \ echo "gitlog2changelog.py failed to generate the ChangeLog. See https://github.com/networkupstools/nut/commits/master" > $@ +# ---------------------------------------------------------------------- # Maintainers targets: distribution signature and hashes dist-sig: gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz @@ -938,16 +991,19 @@ package: cd scripts/HP-UX; \ make package; \ mv NUT_HPUX_package.depot NUT_HPUX_package@PACKAGE_VERSION@.depot; \ - else \ - if test `uname -s` = "SunOS"; then \ - make; \ - rm -rf @prefix@; \ - make install; \ - cd scripts/Solaris; \ - make package; \ - make uninstall; \ - rm -rf @prefix@; \ - fi; \ + elif test `uname -s` = "SunOS"; then \ + make; \ + rm -rf @prefix@; \ + make install; \ + cd scripts/Solaris; \ + make package; \ + make uninstall; \ + rm -rf @prefix@; \ + elif test `uname -s` = "AIX"; then \ + make dist; \ + cp scripts/Aix/nut-aix.spec /usr/src/packages/SPECS; \ + cp scripts/Aix/nut.init nut-*.tar.gz /usr/src/packages/SOURCES; \ + rpm -ba /usr/src/packages/SPECS/nut-aix.spec; \ fi; # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/NEWS b/NEWS index c45fc6a..1e6fbde 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,76 @@ If you're upgrading from an earlier version, see the UPGRADING file. For a complete and more detailed list of changes, please refer to the ChangeLog file. +--------------------------------------------------------------------------- +Release notes for NUT 2.7.3 - what's new since 2.7.2: + + - reverted POWERDOWNFLAG to /etc/killpower as in 2.6.5 (packagers may want to + put this in another filesystem, though) + + - configure/make fixes for ${systemdsystemunitdir} + + - apcsmart: fix command set parsing for protocol version 4 (e.g. Smart-UPS + RT 10000 XL) + + - upslog: SIGUSR1 forces an immediate log entry + + - riello_usb/_ser: USB interface claim fix; improved error handling + + - usbhid-ups: add support for OpenUPS2 (PID: D005), Liebert GXT3 (PID: 0008) + APC AP9584 Serial->USB kit (PID: 0000), and some Powercom models + (PID: 0001). Fixed scaling for Cyberpower 0764:0501. + + - USB core: do not call usb_set_altinterface(0) by default + + - nutdrv_qx: added fabula, fuji USB and Voltronic-QS-HEX subdrivers; add + bestups subdriver to supersede the old standalone bestups driver + + - NUT Monitor: added FreeDesktop AppData file (including screenshots) + + - renamed udev rules file to 62-nut-usbups.rules (permissions fix) + + - added AIX packaging + + - asem: added a driver for the UPS in ASEM PB1300 embedded PCs + + - solis: updated to support APC Microsol units sold in Brazil + + - tripplite_usb: updated to use dv/dq charge calculation for all models (also + exposes battery_min and battery max as configuration variables); added + binary 3005 protocol support (such as for SMART500RT1U) + + - genericups: better debugging while parsing the cable description flags + + - all drivers: a new 'synchronous' driver flag is available for very verbose + units, such as some ePDUs + + - Eaton: + * Add support for EnergySaving features for Eaton UPSs (HID USB/SHUT and + XCP USB/serial) + * Fix and complete Eaton ePDUs G2/G3 support + * ABM (Advanced Battery Monitoring) support through battery.charger.status + in HID (USB and SHUT), XCP (USB and serial) and SNMP (Powerware XUPS + MIB) + + - support for new devices: + APC Back-UPS 1200BR and Back-UPS BZ2200BI-BR (Microsol) + ASEM SPA PB1300 UPS + Belkin Regulator PRO-USB + Cyber Power Systems Value 1500ELCD-RU + EUROCASE EA200N 2000VA + Fideltronik LUPUS 500 + Flight Technic & International (FTUPS) FT-1000BS and FT-1000BS(T) + Grafenthal PR-3000-HS + JAWAN JW-UPSLC02 + Lacerda New Orion 800VA + Mecer ME-1000-WTU + NHS Sistemas de Energia Expert C Online 6000/8000/10000 + NHS Sistemas de Energia Expert S Online 6000/8000/10000 + Powercom BNT-xxxAP (USB product id: 0001) + Rucelf UPOII-3000-96-EL + Tripp Lite OMNIVSINT800 + Voltronic Power Apex 1KVA and Imperial 1KVA + --------------------------------------------------------------------------- Release notes for NUT 2.7.2 - what's new since 2.7.1: diff --git a/UPGRADING b/UPGRADING index f2d19c0..3b14a40 100644 --- a/UPGRADING +++ b/UPGRADING @@ -7,6 +7,30 @@ This file lists changes that affect users who installed older versions of this software. When upgrading from an older version, be sure to check this file to see if you need to make changes to your system. +Changes from 2.7.2 to 2.7.3 +--------------------------- + +- The linkman:nutdrv_qx[8] driver will eventually supersede linkman:bestups[8]. + It has been tested on a U-series Patriot Pro II. Please test the new driver + on your hardware during your next maintenance window, and report any bugs. + +- If you are upgrading from a new install of 2.7.1 or 2.7.2, double-check the + value of POWERDOWNFLAG in $prefix/etc/upsmon.conf - it has been restored to + /etc/killpower as in 2.6.5 and earlier. + +- If you use upslog with a large sleep value, you may be interested in adding + `killall -SIGUSR1 upslog` to any OB/OL script actions. This will force + upslog to write a log entry to catch short power transients. + +- Be sure that your SSL keys are readable by the NUT system user. The SSL + subsystem is now initialized after `upsd` forks, to work around issues in the + NSS library. + +- The systemd nut-server.service does not Require nut-driver to be started + successfully. This was previously preventing upsd startup, even for just + one driver failure among many. This also matches the behavior of sysV + initscripts. + Changes from 2.7.1 to 2.7.2 --------------------------- diff --git a/aclocal.m4 b/aclocal.m4 index 4e5d1df..709a8d0 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,8 +1,7 @@ -# generated automatically by aclocal 1.11.6 -*- Autoconf -*- +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, -# Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,16 +11,17 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# longlong.m4 serial 14 -dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc. +# longlong.m4 serial 17 +dnl Copyright (C) 1999-2007, 2009-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -29,8 +29,8 @@ dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_LONG_LONG_INT if 'long long int' works. -# This fixes a bug in Autoconf 2.61, but can be removed once we -# assume 2.62 everywhere. +# This fixes a bug in Autoconf 2.61, and can be faster +# than what's in Autoconf 2.62 through 2.68. # Note: If the type 'long long int' exists but is only 32 bits large # (as on some very old compilers), HAVE_LONG_LONG_INT will not be @@ -38,44 +38,48 @@ dnl From Paul Eggert. AC_DEFUN([AC_TYPE_LONG_LONG_INT], [ + AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int], - [AC_LINK_IFELSE( - [_AC_TYPE_LONG_LONG_SNIPPET], - [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. - dnl If cross compiling, assume the bug isn't important, since - dnl nobody cross compiles for this platform as far as we know. - AC_RUN_IFELSE( - [AC_LANG_PROGRAM( - [[@%:@include - @%:@ifndef LLONG_MAX - @%:@ define HALF \ - (1LL << (sizeof (long long int) * CHAR_BIT - 2)) - @%:@ define LLONG_MAX (HALF - 1 + HALF) - @%:@endif]], - [[long long int n = 1; - int i; - for (i = 0; ; i++) - { - long long int m = n << i; - if (m >> i != n) - return 1; - if (LLONG_MAX / 2 < m) - break; - } - return 0;]])], - [ac_cv_type_long_long_int=yes], - [ac_cv_type_long_long_int=no], - [ac_cv_type_long_long_int=yes])], - [ac_cv_type_long_long_int=no])]) + [ac_cv_type_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int + if test $ac_cv_type_long_long_int = yes; then + dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. + dnl If cross compiling, assume the bug is not important, since + dnl nobody cross compiles for this platform as far as we know. + AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[@%:@include + @%:@ifndef LLONG_MAX + @%:@ define HALF \ + (1LL << (sizeof (long long int) * CHAR_BIT - 2)) + @%:@ define LLONG_MAX (HALF - 1 + HALF) + @%:@endif]], + [[long long int n = 1; + int i; + for (i = 0; ; i++) + { + long long int m = n << i; + if (m >> i != n) + return 1; + if (LLONG_MAX / 2 < m) + break; + } + return 0;]])], + [], + [ac_cv_type_long_long_int=no], + [:]) + fi + fi]) if test $ac_cv_type_long_long_int = yes; then AC_DEFINE([HAVE_LONG_LONG_INT], [1], - [Define to 1 if the system has the type `long long int'.]) + [Define to 1 if the system has the type 'long long int'.]) fi ]) # Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works. -# This fixes a bug in Autoconf 2.61, but can be removed once we -# assume 2.62 everywhere. +# This fixes a bug in Autoconf 2.61, and can be faster +# than what's in Autoconf 2.62 through 2.68. # Note: If the type 'unsigned long long int' exists but is only 32 bits # large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT @@ -86,13 +90,16 @@ AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT], [ AC_CACHE_CHECK([for unsigned long long int], [ac_cv_type_unsigned_long_long_int], - [AC_LINK_IFELSE( - [_AC_TYPE_LONG_LONG_SNIPPET], - [ac_cv_type_unsigned_long_long_int=yes], - [ac_cv_type_unsigned_long_long_int=no])]) + [ac_cv_type_unsigned_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + AC_LINK_IFELSE( + [_AC_TYPE_LONG_LONG_SNIPPET], + [], + [ac_cv_type_unsigned_long_long_int=no]) + fi]) if test $ac_cv_type_unsigned_long_long_int = yes; then AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1], - [Define to 1 if the system has the type `unsigned long long int'.]) + [Define to 1 if the system has the type 'unsigned long long int'.]) fi ]) @@ -287,25 +294,77 @@ else fi[]dnl ])# PKG_CHECK_MODULES -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software -# Foundation, Inc. + +# PKG_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable pkgconfigdir as the location where a module +# should install pkg-config .pc files. By default the directory is +# $libdir/pkgconfig, but the default can be changed by passing +# DIRECTORY. The user can override through the --with-pkgconfigdir +# parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_INSTALLDIR + + +# PKG_NOARCH_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable noarch_pkgconfigdir as the location where a +# module should install arch-independent pkg-config .pc files. By +# default the directory is $datadir/pkgconfig, but the default can be +# changed by passing DIRECTORY. The user can override through the +# --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_NOARCH_INSTALLDIR + + +# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ------------------------------------------- +# Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])# PKG_CHECK_VAR + +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' +[am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.6], [], +m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -321,24 +380,22 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.6])dnl +[AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -357,7 +414,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you +# harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -375,30 +432,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 9 - # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -417,16 +470,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, -# 2010, 2011 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 12 -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -436,7 +487,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -449,12 +500,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -462,8 +514,8 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -503,16 +555,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -521,8 +573,8 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -530,7 +582,7 @@ AC_CACHE_CHECK([dependency style of $depcc], fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -578,7 +630,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -588,9 +640,13 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' @@ -605,20 +661,18 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -631,7 +685,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -643,21 +697,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -675,7 +727,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will +# is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -685,18 +737,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 16 - # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -709,7 +764,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -738,31 +793,40 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl @@ -773,34 +837,79 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi ]) -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -822,15 +931,12 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, -# Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 - # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. @@ -844,16 +950,14 @@ if test x"${install_sh}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST(install_sh)]) +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -870,20 +974,17 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, -# 2011 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. -# Default is to disable them, unless `enable' is passed literally. -# For symmetry, `disable' may be passed as well. Anyway, the user +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), @@ -894,10 +995,11 @@ AC_DEFUN([AM_MAINTAINER_MODE], AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], -[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - [USE_MAINTAINER_MODE=$enableval], - [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE @@ -905,18 +1007,14 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) ] ) -AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) - # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -934,7 +1032,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -959,52 +1057,14 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) -# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) - # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 6 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -1012,11 +1072,10 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) - # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -1029,54 +1088,22 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, -# Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 1 - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software -# Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], @@ -1086,7 +1113,7 @@ AC_DEFUN([_AM_MANGLE_OPTION], # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ @@ -1100,24 +1127,82 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -1128,32 +1213,40 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$[2]" = conftest.file ) then @@ -1163,46 +1256,118 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) -# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 1 +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize +# always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. +# Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 - # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -1216,18 +1381,16 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. +# Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -1237,76 +1400,114 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar +# AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. + +# We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - # tar/untar a dummy directory, and stop if the command works + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR diff --git a/clients/Makefile.in b/clients/Makefile.in index e004931..7e58b62 100644 --- a/clients/Makefile.in +++ b/clients/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -21,23 +20,51 @@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -67,8 +94,9 @@ sbin_PROGRAMS = upsmon$(EXEEXT) upssched$(EXEEXT) @WITH_CGI_TRUE@ upsimage.cgi$(EXEEXT) upsset.cgi$(EXEEXT) @WITH_SSL_TRUE@am__append_4 = $(LIBSSL_LIBS) subdir = clients -DIST_COMMON = $(am__include_HEADERS_DIST) $(dist_bin_SCRIPTS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(dist_bin_SCRIPTS) $(top_srcdir)/depcomp \ + $(am__include_HEADERS_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -131,18 +159,24 @@ LTLIBRARIES = $(lib_LTLIBRARIES) libnutclient_la_LIBADD = am_libnutclient_la_OBJECTS = nutclient.lo libnutclient_la_OBJECTS = $(am_libnutclient_la_OBJECTS) -libnutclient_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(libnutclient_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libnutclient_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(libnutclient_la_LDFLAGS) \ + $(LDFLAGS) -o $@ am__DEPENDENCIES_1 = @WITH_SSL_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) libupsclient_la_DEPENDENCIES = ../common/libcommonclient.la \ $(am__DEPENDENCIES_2) am_libupsclient_la_OBJECTS = upsclient.lo libupsclient_la_OBJECTS = $(am_libupsclient_la_OBJECTS) -libupsclient_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libupsclient_la_LDFLAGS) $(LDFLAGS) -o $@ +libupsclient_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libupsclient_la_LDFLAGS) $(LDFLAGS) \ + -o $@ PROGRAMS = $(bin_PROGRAMS) $(cgiexec_PROGRAMS) $(sbin_PROGRAMS) am_upsc_OBJECTS = upsc.$(OBJEXT) upsc_OBJECTS = $(am_upsc_OBJECTS) @@ -190,28 +224,58 @@ upsstats_cgi_LDADD = $(LDADD) upsstats_cgi_DEPENDENCIES = ../common/libcommon.la libupsclient.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) SCRIPTS = $(dist_bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = SOURCES = $(libnutclient_la_SOURCES) $(libupsclient_la_SOURCES) \ $(upsc_SOURCES) $(upscmd_SOURCES) $(upsimage_cgi_SOURCES) \ $(upslog_SOURCES) $(upsmon_SOURCES) $(upsrw_SOURCES) \ @@ -230,12 +294,30 @@ am__can_run_installinfo = \ am__include_HEADERS_DIST = upsclient.h ../include/parseconf.h \ nutclient.h HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -342,12 +424,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -392,6 +477,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -482,6 +568,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ @@ -508,16 +595,20 @@ uninstall-libLTLIBRARIES: clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + libnutclient.la: $(libnutclient_la_OBJECTS) $(libnutclient_la_DEPENDENCIES) $(EXTRA_libnutclient_la_DEPENDENCIES) - $(libnutclient_la_LINK) -rpath $(libdir) $(libnutclient_la_OBJECTS) $(libnutclient_la_LIBADD) $(LIBS) + $(AM_V_CXXLD)$(libnutclient_la_LINK) -rpath $(libdir) $(libnutclient_la_OBJECTS) $(libnutclient_la_LIBADD) $(LIBS) + libupsclient.la: $(libupsclient_la_OBJECTS) $(libupsclient_la_DEPENDENCIES) $(EXTRA_libupsclient_la_DEPENDENCIES) - $(libupsclient_la_LINK) -rpath $(libdir) $(libupsclient_la_OBJECTS) $(libupsclient_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(libupsclient_la_LINK) -rpath $(libdir) $(libupsclient_la_OBJECTS) $(libupsclient_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ @@ -527,10 +618,12 @@ install-binPROGRAMS: $(bin_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -551,7 +644,8 @@ uninstall-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -573,10 +667,12 @@ install-cgiexecPROGRAMS: $(cgiexec_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -597,7 +693,8 @@ uninstall-cgiexecPROGRAMS: @list='$(cgiexec_PROGRAMS)'; test -n "$(cgiexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(cgiexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(cgiexecdir)" && rm -f $$files @@ -619,10 +716,12 @@ install-sbinPROGRAMS: $(sbin_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -643,7 +742,8 @@ uninstall-sbinPROGRAMS: @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files @@ -656,33 +756,42 @@ clean-sbinPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list + upsc$(EXEEXT): $(upsc_OBJECTS) $(upsc_DEPENDENCIES) $(EXTRA_upsc_DEPENDENCIES) @rm -f upsc$(EXEEXT) - $(LINK) $(upsc_OBJECTS) $(upsc_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsc_OBJECTS) $(upsc_LDADD) $(LIBS) + upscmd$(EXEEXT): $(upscmd_OBJECTS) $(upscmd_DEPENDENCIES) $(EXTRA_upscmd_DEPENDENCIES) @rm -f upscmd$(EXEEXT) - $(LINK) $(upscmd_OBJECTS) $(upscmd_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upscmd_OBJECTS) $(upscmd_LDADD) $(LIBS) + upsimage.cgi$(EXEEXT): $(upsimage_cgi_OBJECTS) $(upsimage_cgi_DEPENDENCIES) $(EXTRA_upsimage_cgi_DEPENDENCIES) @rm -f upsimage.cgi$(EXEEXT) - $(LINK) $(upsimage_cgi_OBJECTS) $(upsimage_cgi_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsimage_cgi_OBJECTS) $(upsimage_cgi_LDADD) $(LIBS) + upslog$(EXEEXT): $(upslog_OBJECTS) $(upslog_DEPENDENCIES) $(EXTRA_upslog_DEPENDENCIES) @rm -f upslog$(EXEEXT) - $(LINK) $(upslog_OBJECTS) $(upslog_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upslog_OBJECTS) $(upslog_LDADD) $(LIBS) + upsmon$(EXEEXT): $(upsmon_OBJECTS) $(upsmon_DEPENDENCIES) $(EXTRA_upsmon_DEPENDENCIES) @rm -f upsmon$(EXEEXT) - $(LINK) $(upsmon_OBJECTS) $(upsmon_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsmon_OBJECTS) $(upsmon_LDADD) $(LIBS) + upsrw$(EXEEXT): $(upsrw_OBJECTS) $(upsrw_DEPENDENCIES) $(EXTRA_upsrw_DEPENDENCIES) @rm -f upsrw$(EXEEXT) - $(LINK) $(upsrw_OBJECTS) $(upsrw_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsrw_OBJECTS) $(upsrw_LDADD) $(LIBS) + upssched$(EXEEXT): $(upssched_OBJECTS) $(upssched_DEPENDENCIES) $(EXTRA_upssched_DEPENDENCIES) @rm -f upssched$(EXEEXT) - $(LINK) $(upssched_OBJECTS) $(upssched_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upssched_OBJECTS) $(upssched_LDADD) $(LIBS) + upsset.cgi$(EXEEXT): $(upsset_cgi_OBJECTS) $(upsset_cgi_DEPENDENCIES) $(EXTRA_upsset_cgi_DEPENDENCIES) @rm -f upsset.cgi$(EXEEXT) - $(LINK) $(upsset_cgi_OBJECTS) $(upsset_cgi_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsset_cgi_OBJECTS) $(upsset_cgi_LDADD) $(LIBS) + upsstats.cgi$(EXEEXT): $(upsstats_cgi_OBJECTS) $(upsstats_cgi_DEPENDENCIES) $(EXTRA_upsstats_cgi_DEPENDENCIES) @rm -f upsstats.cgi$(EXEEXT) - $(LINK) $(upsstats_cgi_OBJECTS) $(upsstats_cgi_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsstats_cgi_OBJECTS) $(upsstats_cgi_LDADD) $(LIBS) install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ @@ -739,46 +848,52 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsstats.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cpp.o: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -807,26 +922,15 @@ uninstall-includeHEADERS: files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -838,15 +942,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -855,6 +955,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -1006,25 +1121,25 @@ uninstall-am: uninstall-binPROGRAMS uninstall-cgiexecPROGRAMS \ .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-cgiexecPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool clean-sbinPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-binPROGRAMS install-cgiexecPROGRAMS \ - install-data install-data-am install-dist_binSCRIPTS \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-includeHEADERS \ - install-info install-info-am install-libLTLIBRARIES \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-sbinPROGRAMS install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-binPROGRAMS \ - uninstall-cgiexecPROGRAMS uninstall-dist_binSCRIPTS \ - uninstall-includeHEADERS uninstall-libLTLIBRARIES \ - uninstall-sbinPROGRAMS +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-cgiexecPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-sbinPROGRAMS \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-cgiexecPROGRAMS install-data \ + install-data-am install-dist_binSCRIPTS install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-includeHEADERS install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-cgiexecPROGRAMS \ + uninstall-dist_binSCRIPTS uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-sbinPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/clients/upsclient.c b/clients/upsclient.c index 797786b..43c0e79 100644 --- a/clients/upsclient.c +++ b/clients/upsclient.c @@ -20,6 +20,7 @@ */ #include "config.h" /* safe because it doesn't contain prototypes */ +#include "nut_platform.h" #ifdef HAVE_PTHREAD /* this include is needed on AIX to have errno stored in thread local storage */ @@ -41,6 +42,20 @@ #include "common.h" #include "timehead.h" +/* WA for Solaris/i386 bug: non-blocking connect sets errno to ENOENT */ +#if (defined NUT_PLATFORM_SOLARIS && CPU_TYPE == i386) + #define SOLARIS_i386_NBCONNECT_ENOENT(status) (ENOENT == (status)) +#else + #define SOLARIS_i386_NBCONNECT_ENOENT(status) (0) +#endif /* end of Solaris/i386 WA for non-blocking connect */ + +/* WA for AIX bug: non-blocking connect sets errno to 0 */ +#if (defined NUT_PLATFORM_AIX) + #define AIX_NBCONNECT_0(status) (0 == (status)) +#else + #define AIX_NBCONNECT_0(status) (0) +#endif /* end of AIX WA for non-blocking connect */ + #ifdef WITH_NSS #include #include @@ -916,7 +931,7 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru } while ((v = connect(sock_fd, ai->ai_addr, ai->ai_addrlen)) < 0) { - if(errno == EINPROGRESS) { + if(errno == EINPROGRESS || SOLARIS_i386_NBCONNECT_ENOENT(errno) || AIX_NBCONNECT_0(errno)) { FD_ZERO(&wfds); FD_SET(sock_fd, &wfds); select(sock_fd+1,NULL,&wfds,NULL, diff --git a/clients/upslog.c b/clients/upslog.c index 7c534c7..325cdc9 100644 --- a/clients/upslog.c +++ b/clients/upslog.c @@ -77,6 +77,11 @@ static void set_exit_flag(int sig) exit_flag = sig; } +static void set_print_now_flag(int sig) +{ + /* no need to do anything, the signal will cause sleep to be interrupted */ +} + /* handlers: reload on HUP, exit on INT/QUIT/TERM */ static void setup_signals(void) { @@ -97,6 +102,10 @@ static void setup_signals(void) fatal_with_errno(EXIT_FAILURE, "Can't install SIGQUIT handler"); if (sigaction(SIGTERM, &sa, NULL) < 0) fatal_with_errno(EXIT_FAILURE, "Can't install SIGTERM handler"); + + sa.sa_handler = set_print_now_flag; + if (sigaction(SIGUSR1, &sa, NULL) < 0) + fatal_with_errno(EXIT_FAILURE, "Can't install SIGUSR1 handler"); } static void help(const char *prog) diff --git a/common/Makefile.in b/common/Makefile.in index daa0324..6a5149e 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,23 +17,51 @@ # Network UPS Tools: common VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -55,8 +82,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = common -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in atexit.c \ - setenv.c snprintf.c strerror.c +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am strerror.c \ + atexit.c setenv.c snprintf.c $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -89,25 +116,50 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) libcommon_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@ am_libcommon_la_OBJECTS = common.lo state.lo upsconf.lo libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = libcommonclient_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@ am_libcommonclient_la_OBJECTS = common.lo state.lo libcommonclient_la_OBJECTS = $(am_libcommonclient_la_OBJECTS) libparseconf_la_LIBADD = am_libparseconf_la_OBJECTS = parseconf.lo libparseconf_la_OBJECTS = $(am_libparseconf_la_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(libcommon_la_SOURCES) $(libcommonclient_la_SOURCES) \ $(libparseconf_la_SOURCES) DIST_SOURCES = $(libcommon_la_SOURCES) $(libcommonclient_la_SOURCES) \ @@ -117,12 +169,30 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -229,12 +299,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -279,6 +352,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -351,18 +425,23 @@ $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + libcommon.la: $(libcommon_la_OBJECTS) $(libcommon_la_DEPENDENCIES) $(EXTRA_libcommon_la_DEPENDENCIES) - $(LINK) $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS) + libcommonclient.la: $(libcommonclient_la_OBJECTS) $(libcommonclient_la_DEPENDENCIES) $(EXTRA_libcommonclient_la_DEPENDENCIES) - $(LINK) $(libcommonclient_la_OBJECTS) $(libcommonclient_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libcommonclient_la_OBJECTS) $(libcommonclient_la_LIBADD) $(LIBS) + libparseconf.la: $(libparseconf_la_OBJECTS) $(libparseconf_la_DEPENDENCIES) $(EXTRA_libparseconf_la_DEPENDENCIES) - $(LINK) $(libparseconf_la_OBJECTS) $(libparseconf_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libparseconf_la_OBJECTS) $(libparseconf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -380,25 +459,28 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsconf.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -406,26 +488,15 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -437,15 +508,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -454,6 +521,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -595,18 +677,19 @@ uninstall-am: .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/common/common.c b/common/common.c index ce3c573..d7c74d3 100644 --- a/common/common.c +++ b/common/common.c @@ -586,13 +586,21 @@ char *xstrdup(const char *string) /* modify in - strip all trailing instances of */ char *rtrim(char *in, const char sep) +{ + char seps[2] = { sep, '\0' }; + + return rtrim_m(in, seps); +} + +/* modify in - strip all trailing instances of each char in */ +char *rtrim_m(char *in, const char *seps) { char *p; - if (in) { + if (in && strlen(in)) { p = &in[strlen(in) - 1]; - while ((p >= in) && (*p == sep)) + while ((p >= in) && (strchr(seps, *p) != NULL)) *p-- = '\0'; } return in; @@ -601,16 +609,19 @@ char *rtrim(char *in, const char sep) /* modify in - strip all leading instances of */ char* ltrim(char *in, const char sep) { - char *p; + char seps[2] = { sep, '\0' }; - if (in) { - p = in; + return ltrim_m(in, seps); +} - while ((*p != '\0') && (*p == sep)) - *p++ = *in++; - - p = '\0'; +/* modify in - strip all leading instances of each char in */ +char* ltrim_m(char *in, const char *seps) +{ + if (in && strlen(in)) { + while ((*in != '\0') && (strchr(seps, *in) != NULL)) + memmove(in, in + 1, strlen(in)); } + return in; } diff --git a/conf/Makefile.am b/conf/Makefile.am index 681f33c..95c0173 100644 --- a/conf/Makefile.am +++ b/conf/Makefile.am @@ -2,7 +2,7 @@ INSTALL_0600 = $(INSTALL) -m 0600 -SECFILES = upsmon.conf.sample upsd.conf.sample upsd.users.sample +SECFILES = upsd.conf.sample upsd.users.sample PUBFILES = nut.conf.sample ups.conf.sample CGIPUB = hosts.conf.sample upsset.conf.sample upsstats.html.sample \ upsstats-single.html.sample diff --git a/conf/Makefile.in b/conf/Makefile.in index 6b374f8..4afc1f8 100644 --- a/conf/Makefile.in +++ b/conf/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,23 +17,51 @@ # Network UPS Tools: conf VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -55,9 +82,10 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = conf -DIST_COMMON = $(am__dist_sysconf_DATA_DIST) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/upsmon.conf.sample.in \ - $(srcdir)/upssched.conf.sample.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/upsmon.conf.sample.in \ + $(srcdir)/upssched.conf.sample.in \ + $(am__dist_sysconf_DATA_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -86,6 +114,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = upsmon.conf.sample upssched.conf.sample CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -93,9 +133,9 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -am__dist_sysconf_DATA_DIST = upsmon.conf.sample upsd.conf.sample \ - upsd.users.sample nut.conf.sample ups.conf.sample \ - hosts.conf.sample upsset.conf.sample upsstats.html.sample \ +am__dist_sysconf_DATA_DIST = upsd.conf.sample upsd.users.sample \ + nut.conf.sample ups.conf.sample hosts.conf.sample \ + upsset.conf.sample upsstats.html.sample \ upsstats-single.html.sample am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ @@ -126,10 +166,12 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(sysconfdir)" "$(DESTDIR)$(sysconfdir)" DATA = $(dist_sysconf_DATA) $(nodist_sysconf_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -236,12 +278,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -286,6 +331,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -308,7 +354,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ INSTALL_0600 = $(INSTALL) -m 0600 -SECFILES = upsmon.conf.sample upsd.conf.sample upsd.users.sample +SECFILES = upsd.conf.sample upsd.users.sample PUBFILES = nut.conf.sample ups.conf.sample CGIPUB = hosts.conf.sample upsset.conf.sample upsstats.html.sample \ upsstats-single.html.sample @@ -402,11 +448,11 @@ uninstall-nodist_sysconfDATA: @list='$(nodist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -545,17 +591,19 @@ uninstall-am: uninstall-dist_sysconfDATA uninstall-nodist_sysconfDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dist_sysconfDATA \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-nodist_sysconfDATA install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_sysconfDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-nodist_sysconfDATA install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-dist_sysconfDATA uninstall-nodist_sysconfDATA + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-dist_sysconfDATA \ + uninstall-nodist_sysconfDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/conf/ups.conf.sample b/conf/ups.conf.sample index 365a6f7..d8faef2 100644 --- a/conf/ups.conf.sample +++ b/conf/ups.conf.sample @@ -75,6 +75,21 @@ # # The default is 45 seconds. # +# synchronous: optional. The driver work by default in asynchronous +# mode (i.e *synchronous=no*). This means that all data +# are pushed by the driver on the communication socket to +# upsd (Unix socket on Unix, Named pipe on Windows) without +# waiting for these data to be actually consumed. With +# some HW, such as ePDUs, that can produce a lot of data, +# asynchronous mode may cause some congestion, resulting in +# the socket to be full, and the driver to appear as not +# connected. By enabling the 'synchronous' flag +# (value = 'yes'), the driver will wait for data to be +# consumed by upsd, prior to publishing more. This can be +# enabled either globally or per driver. +# +# The default is 'no' (i.e. asynchronous mode) for backward +# compatibility of the driver behavior. # # Anything else is passed through to the hardware-specific part of # the driver. diff --git a/conf/upsmon.conf.sample b/conf/upsmon.conf.sample deleted file mode 100644 index 9b44237..0000000 --- a/conf/upsmon.conf.sample +++ /dev/null @@ -1,377 +0,0 @@ -# Network UPS Tools: example upsmon configuration -# -# This file contains passwords, so keep it secure. - -# -------------------------------------------------------------------------- -# RUN_AS_USER -# -# By default, upsmon splits into two processes. One stays as root and -# waits to run the SHUTDOWNCMD. The other one switches to another userid -# and does everything else. -# -# The default nonprivileged user is set at compile-time with -# 'configure --with-user=...'. -# -# You can override it with '-u ' when starting upsmon, or just -# define it here for convenience. -# -# Note: if you plan to use the reload feature, this file (upsmon.conf) -# must be readable by this user! Since it contains passwords, DO NOT -# make it world-readable. Also, do not make it writable by the upsmon -# user, since it creates an opportunity for an attack by changing the -# SHUTDOWNCMD to something malicious. -# -# For best results, you should create a new normal user like "nutmon", -# and make it a member of a "nut" group or similar. Then specify it -# here and grant read access to the upsmon.conf for that group. -# -# This user should not have write access to upsmon.conf. -# -# RUN_AS_USER nut - -# -------------------------------------------------------------------------- -# MONITOR ("master"|"slave") -# -# List systems you want to monitor. Not all of these may supply power -# to the system running upsmon, but if you want to watch it, it has to -# be in this section. -# -# You must have at least one of these declared. -# -# is a UPS identifier in the form @[:] -# like ups@localhost, su700@mybox, etc. -# -# Examples: -# -# - "su700@mybox" means a UPS called "su700" on a system called "mybox" -# -# - "fenton@bigbox:5678" is a UPS called "fenton" on a system called -# "bigbox" which runs upsd on port "5678". -# -# The UPS names like "su700" and "fenton" are set in your ups.conf -# in [brackets] which identify a section for a particular driver. -# -# If the ups.conf on host "doghouse" has a section called "snoopy", the -# identifier for it would be "snoopy@doghouse". -# -# is an integer - the number of power supplies that this UPS -# feeds on this system. Most computers only have one power supply, so this -# is normally set to 1. You need a pretty big or special box to have any -# other value here. -# -# You can also set this to 0 for a system that doesn't supply any power, -# but you still want to monitor. Use this when you want to hear about -# changes for a given UPS without shutting down when it goes critical, -# unless is 0. -# -# and must match an entry in that system's -# upsd.users. If your username is "monmaster" and your password is -# "blah", the upsd.users would look like this: -# -# [monmaster] -# password = blah -# upsmon master (or slave) -# -# "master" means this system will shutdown last, allowing the slaves -# time to shutdown first. -# -# "slave" means this system shuts down immediately when power goes critical. -# -# Examples: -# -# MONITOR myups@bigserver 1 monmaster blah master -# MONITOR su700@server.example.com 1 upsmon secretpass slave -# MONITOR myups@localhost 1 upsmon pass master (or slave) - -# -------------------------------------------------------------------------- -# MINSUPPLIES -# -# Give the number of power supplies that must be receiving power to keep -# this system running. Most systems have one power supply, so you would -# put "1" in this field. -# -# Large/expensive server type systems usually have more, and can run with -# a few missing. The HP NetServer LH4 can run with 2 out of 4, for example, -# so you'd set that to 2. The idea is to keep the box running as long -# as possible, right? -# -# Obviously you have to put the redundant supplies on different UPS circuits -# for this to make sense! See big-servers.txt in the docs subdirectory -# for more information and ideas on how to use this feature. - -MINSUPPLIES 1 - -# -------------------------------------------------------------------------- -# SHUTDOWNCMD "" -# -# upsmon runs this command when the system needs to be brought down. -# -# This should work just about everywhere ... if it doesn't, well, change it. - -SHUTDOWNCMD "/sbin/shutdown -h +0" - -# -------------------------------------------------------------------------- -# NOTIFYCMD -# -# upsmon calls this to send messages when things happen -# -# This command is called with the full text of the message as one argument. -# The environment string NOTIFYTYPE will contain the type string of -# whatever caused this event to happen. -# -# Note that this is only called for NOTIFY events that have EXEC set with -# NOTIFYFLAG. See NOTIFYFLAG below for more details. -# -# Making this some sort of shell script might not be a bad idea. For more -# information and ideas, see docs/scheduling.txt -# -# Example: -# NOTIFYCMD /usr/local/ups/bin/notifyme - -# -------------------------------------------------------------------------- -# POLLFREQ -# -# Polling frequency for normal activities, measured in seconds. -# -# Adjust this to keep upsmon from flooding your network, but don't make -# it too high or it may miss certain short-lived power events. - -POLLFREQ 5 - -# -------------------------------------------------------------------------- -# POLLFREQALERT -# -# Polling frequency in seconds while UPS on battery. -# -# You can make this number lower than POLLFREQ, which will make updates -# faster when any UPS is running on battery. This is a good way to tune -# network load if you have a lot of these things running. -# -# The default is 5 seconds for both this and POLLFREQ. - -POLLFREQALERT 5 - -# -------------------------------------------------------------------------- -# HOSTSYNC - How long upsmon will wait before giving up on another upsmon -# -# The master upsmon process uses this number when waiting for slaves to -# disconnect once it has set the forced shutdown (FSD) flag. If they -# don't disconnect after this many seconds, it goes on without them. -# -# Similarly, upsmon slave processes wait up to this interval for the -# master upsmon to set FSD when a UPS they are monitoring goes critical - -# that is, on battery and low battery. If the master doesn't do its job, -# the slaves will shut down anyway to avoid damage to the file systems. -# -# This "wait for FSD" is done to avoid races where the status changes -# to critical and back between polls by the master. - -HOSTSYNC 15 - -# -------------------------------------------------------------------------- -# DEADTIME - Interval to wait before declaring a stale ups "dead" -# -# upsmon requires a UPS to provide status information every few seconds -# (see POLLFREQ and POLLFREQALERT) to keep things updated. If the status -# fetch fails, the UPS is marked stale. If it stays stale for more than -# DEADTIME seconds, the UPS is marked dead. -# -# A dead UPS that was last known to be on battery is assumed to have gone -# to a low battery condition. This may force a shutdown if it is providing -# a critical amount of power to your system. -# -# Note: DEADTIME should be a multiple of POLLFREQ and POLLFREQALERT. -# Otherwise you'll have "dead" UPSes simply because upsmon isn't polling -# them quickly enough. Rule of thumb: take the larger of the two -# POLLFREQ values, and multiply by 3. - -DEADTIME 15 - -# -------------------------------------------------------------------------- -# POWERDOWNFLAG - Flag file for forcing UPS shutdown on the master system -# -# upsmon will create a file with this name in master mode when it's time -# to shut down the load. You should check for this file's existence in -# your shutdown scripts and run 'upsdrvctl shutdown' if it exists. -# -# See the shutdown.txt file in the docs subdirectory for more information. - -POWERDOWNFLAG /etc/nut/killpower - -# -------------------------------------------------------------------------- -# NOTIFYMSG - change messages sent by upsmon when certain events occur -# -# You can change the default messages to something else if you like. -# -# NOTIFYMSG "message" -# -# NOTIFYMSG ONLINE "UPS %s on line power" -# NOTIFYMSG ONBATT "UPS %s on battery" -# NOTIFYMSG LOWBATT "UPS %s battery is low" -# NOTIFYMSG FSD "UPS %s: forced shutdown in progress" -# NOTIFYMSG COMMOK "Communications with UPS %s established" -# NOTIFYMSG COMMBAD "Communications with UPS %s lost" -# NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding" -# NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced" -# NOTIFYMSG NOCOMM "UPS %s is unavailable" -# NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible" -# -# Note that %s is replaced with the identifier of the UPS in question. -# -# Possible values for : -# -# ONLINE : UPS is back online -# ONBATT : UPS is on battery -# LOWBATT : UPS has a low battery (if also on battery, it's "critical") -# FSD : UPS is being shutdown by the master (FSD = "Forced Shutdown") -# COMMOK : Communications established with the UPS -# COMMBAD : Communications lost to the UPS -# SHUTDOWN : The system is being shutdown -# REPLBATT : The UPS battery is bad and needs to be replaced -# NOCOMM : A UPS is unavailable (can't be contacted for monitoring) -# NOPARENT : The process that shuts down the system has died (shutdown impossible) - -# -------------------------------------------------------------------------- -# NOTIFYFLAG - change behavior of upsmon when NOTIFY events occur -# -# By default, upsmon sends walls (global messages to all logged in users) -# and writes to the syslog when things happen. You can change this. -# -# NOTIFYFLAG [+][+] ... -# -# NOTIFYFLAG ONLINE SYSLOG+WALL -# NOTIFYFLAG ONBATT SYSLOG+WALL -# NOTIFYFLAG LOWBATT SYSLOG+WALL -# NOTIFYFLAG FSD SYSLOG+WALL -# NOTIFYFLAG COMMOK SYSLOG+WALL -# NOTIFYFLAG COMMBAD SYSLOG+WALL -# NOTIFYFLAG SHUTDOWN SYSLOG+WALL -# NOTIFYFLAG REPLBATT SYSLOG+WALL -# NOTIFYFLAG NOCOMM SYSLOG+WALL -# NOTIFYFLAG NOPARENT SYSLOG+WALL -# -# Possible values for the flags: -# -# SYSLOG - Write the message in the syslog -# WALL - Write the message to all users on the system -# EXEC - Execute NOTIFYCMD (see above) with the message -# IGNORE - Don't do anything -# -# If you use IGNORE, don't use any other flags on the same line. - -# -------------------------------------------------------------------------- -# RBWARNTIME - replace battery warning time in seconds -# -# upsmon will normally warn you about a battery that needs to be replaced -# every 43200 seconds, which is 12 hours. It does this by triggering a -# NOTIFY_REPLBATT which is then handled by the usual notify structure -# you've defined above. -# -# If this number is not to your liking, override it here. - -RBWARNTIME 43200 - -# -------------------------------------------------------------------------- -# NOCOMMWARNTIME - no communications warning time in seconds -# -# upsmon will let you know through the usual notify system if it can't -# talk to any of the UPS entries that are defined in this file. It will -# trigger a NOTIFY_NOCOMM by default every 300 seconds unless you -# change the interval with this directive. - -NOCOMMWARNTIME 300 - -# -------------------------------------------------------------------------- -# FINALDELAY - last sleep interval before shutting down the system -# -# On a master, upsmon will wait this long after sending the NOTIFY_SHUTDOWN -# before executing your SHUTDOWNCMD. If you need to do something in between -# those events, increase this number. Remember, at this point your UPS is -# almost depleted, so don't make this too high. -# -# Alternatively, you can set this very low so you don't wait around when -# it's time to shut down. Some UPSes don't give much warning for low -# battery and will require a value of 0 here for a safe shutdown. -# -# Note: If FINALDELAY on the slave is greater than HOSTSYNC on the master, -# the master will give up waiting for the slave to disconnect. - -FINALDELAY 5 - -# -------------------------------------------------------------------------- -# CERTPATH - path to certificates (database directory or directory with CA's) -# -# When compiled with SSL support, you can enter the certificate path here. -# -# With NSS: -# Certificates are stored in a dedicated database (splitted in 3 files). -# Specify the path of the database directory. -# -# CERTPATH /etc/nut/cert/upsmon -# -# With OpenSSL: -# Directory containing CA certificates in PEM format, used to verify -# the server certificate presented by the upsd server. The files each -# contain one CA certificate. The files are looked up by the CA subject -# name hash value, which must hence be available. -# -# CERTPATH /usr/ssl/certs -# -# See 'docs/security.txt' or the Security chapter of NUT user manual -# for more information on the SSL support in NUT. - -# -------------------------------------------------------------------------- -# CERTIDENT - self certificate name and database password -# CERTIDENT -# -# When compiled with SSL support with NSS, you can specify the certificate -# name to retrieve from database to authenticate itself and the password -# required to access certificate related private key. -# -# CERTIDENT "my nut monitor" "MyPasSw0rD" -# -# See 'docs/security.txt' or the Security chapter of NUT user manual -# for more information on the SSL support in NUT. - -# -------------------------------------------------------------------------- -# CERTHOST - security properties for an host -# CERTHOST -# -# When compiled with SSL support with NSS, you can specify security directive -# for each server you can contact. -# Each entry maps server name with the expected certificate name and flags -# indicating if the server certificate is verified and if the connection -# must be secure. -# -# CERTHOST localhost "My nut server" 1 1 -# -# See 'docs/security.txt' or the Security chapter of NUT user manual -# for more information on the SSL support in NUT. - -# -------------------------------------------------------------------------- -# CERTVERIFY - make upsmon verify all connections with certificates -# CERTVERIFY 1 -# -# When compiled with SSL support, make upsmon verify all connections with -# certificates. -# Without this, there is no guarantee that the upsd is the right host. -# Enabling this greatly reduces the risk of man in the middle attacks. -# This effectively forces the use of SSL, so don't use this unless -# all of your upsd hosts are ready for SSL and have their certificates -# in order. -# When compiled with NSS support of SSL, can be overriden for host -# specified with a CERTHOST directive. - - -# -------------------------------------------------------------------------- -# FORCESSL - force upsmon to use SSL -# FORCESSL 1 -# -# When compiled with SSL, specify that a secured connection must be used -# to communicate with upsd. -# If you don't use 'CERTVERIFY 1', then this will at least make sure -# that nobody can sniff your sessions without a large effort. Setting -# this will make upsmon drop connections if the remote upsd doesn't -# support SSL, so don't use it unless all of them have it running. -# When compiled with NSS support of SSL, can be overriden for host -# specified with a CERTHOST directive. diff --git a/conf/upsmon.conf.sample.in b/conf/upsmon.conf.sample.in index 6bb6a04..8703eb4 100644 --- a/conf/upsmon.conf.sample.in +++ b/conf/upsmon.conf.sample.in @@ -194,9 +194,12 @@ DEADTIME 15 # to shut down the load. You should check for this file's existence in # your shutdown scripts and run 'upsdrvctl shutdown' if it exists. # -# See the shutdown.txt file in the docs subdirectory for more information. +# See the config-notes.txt file in the docs subdirectory for more information. +# Refer to the section: +# [[UPS_shutdown]] "Configuring automatic shutdowns for low battery events" +# or refer to the online version. -POWERDOWNFLAG @CONFPATH@/killpower +POWERDOWNFLAG /etc/killpower # -------------------------------------------------------------------------- # NOTIFYMSG - change messages sent by upsmon when certain events occur diff --git a/config.guess b/config.guess index d622a44..1f5c50c 100755 --- a/config.guess +++ b/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2014-03-23' # This file 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 +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -22,19 +20,17 @@ timestamp='2012-02-10' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in @@ -200,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} @@ -302,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -801,10 +820,13 @@ EOF i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -852,21 +874,21 @@ EOF exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -879,59 +901,54 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build @@ -950,54 +967,63 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1201,6 +1227,9 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; @@ -1227,19 +1256,31 @@ EOF exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) @@ -1256,7 +1297,7 @@ EOF NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; - NSE-?:NONSTOP_KERNEL:*:*) + NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) @@ -1330,157 +1371,6 @@ EOF exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 <. @@ -26,11 +20,12 @@ timestamp='2012-04-18' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -73,9 +68,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -123,7 +116,7 @@ esac maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) @@ -156,7 +149,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) + -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; @@ -259,10 +252,12 @@ case $basic_machine in | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ | bfin \ - | c4x | clipper \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ @@ -270,10 +265,11 @@ case $basic_machine in | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ + | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -287,23 +283,26 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ - | nios | nios2 \ + | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or32 \ + | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ @@ -328,7 +327,7 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; @@ -370,13 +369,13 @@ case $basic_machine in | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ @@ -385,11 +384,13 @@ case $basic_machine in | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ + | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -403,18 +404,22 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ @@ -788,11 +793,15 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; - microblaze) + microblaze*) basic_machine=microblaze-xilinx ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; mingw32) - basic_machine=i386-pc + basic_machine=i686-pc os=-mingw32 ;; mingw32ce) @@ -820,6 +829,10 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos @@ -828,7 +841,7 @@ case $basic_machine in basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) - basic_machine=i386-pc + basic_machine=i686-pc os=-msys ;; mvs) @@ -1019,7 +1032,11 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) basic_machine=i386-pc os=-rdos ;; @@ -1346,29 +1363,29 @@ case $os in -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ + | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1492,9 +1509,6 @@ case $os in -aros*) os=-aros ;; - -kaos*) - os=-kaos - ;; -zvmoe) os=-zvmoe ;; @@ -1543,6 +1557,9 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + c8051-*) + os=-elf + ;; hexagon-*) os=-elf ;; diff --git a/configure b/configure index 2fd661d..3210ecd 100755 --- a/configure +++ b/configure @@ -1,6 +1,8 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for nut 2.7.2. +# Generated by GNU Autoconf 2.69 for nut 2.7.3. +# +# Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -272,10 +274,11 @@ fi $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, -$0: including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: https://github.com/networkupstools/nut/issues about +$0: your system, including any error possibly output before +$0: this message. Then install a modern shell, or manually +$0: run the script under such a shell if you do have one." fi exit 1 fi @@ -587,9 +590,9 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='nut' PACKAGE_TARNAME='nut' -PACKAGE_VERSION='2.7.2' -PACKAGE_STRING='nut 2.7.2' -PACKAGE_BUGREPORT='' +PACKAGE_VERSION='2.7.3' +PACKAGE_STRING='nut 2.7.3' +PACKAGE_BUGREPORT='https://github.com/networkupstools/nut/issues' PACKAGE_URL='' ac_unique_file="server/upsd.c" @@ -682,6 +685,9 @@ LIBSSL_CFLAGS NUT_NETVERSION TREE_VERSION OS_NAME +now +SYSTEM_AIX_FALSE +SYSTEM_AIX_TRUE HAVE_ASPELL_FALSE HAVE_ASPELL_TRUE ASPELL @@ -723,6 +729,9 @@ HAVE_ASCIIDOC_FALSE HAVE_ASCIIDOC_TRUE WITH_ASCIIDOC_FALSE WITH_ASCIIDOC_TRUE +SOURCE_HIGHLIGHT +XMLLINT +XSLTPROC DBLATEX A2X ASCIIDOC @@ -738,6 +747,8 @@ WITH_OPENSSL_FALSE WITH_OPENSSL_TRUE WITH_NSS_FALSE WITH_NSS_TRUE +WITH_LINUX_I2C_FALSE +WITH_LINUX_I2C_TRUE WITH_MACOSX_FALSE WITH_MACOSX_TRUE WITH_FREEIPMI_FALSE @@ -795,6 +806,10 @@ CPPFLAGS LDFLAGS CFLAGS CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V am__untar am__tar AMTAR @@ -871,6 +886,7 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules enable_dependency_tracking enable_maintainer_mode with_all @@ -897,6 +913,7 @@ with_freeipmi with_freeipmi_includes with_freeipmi_libs with_macosx_ups +with_linux_i2c with_ssl with_nss with_openssl @@ -1494,7 +1511,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures nut 2.7.2 to adapt to many kinds of systems. +\`configure' configures nut 2.7.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1565,7 +1582,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of nut 2.7.2:";; + short | recursive ) echo "Configuration of nut 2.7.3:";; esac cat <<\_ACEOF @@ -1573,10 +1590,15 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] @@ -1588,7 +1610,7 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-all enable serial, usb, snmp, neon, ipmi, powerman, cgi, - dev, avahi + dev, avahi, linux_i2c --with-dev build and install the development files (no) --with-serial build and install serial drivers (yes) --with-usb build and install USB drivers (auto) @@ -1622,6 +1644,7 @@ Optional Packages: linker flags for the FreeIPMI library --with-macosx_ups build and install Mac OS X Power Sources meta-driver (auto) + --with-linux_i2c build and install i2c drivers (auto) --with-ssl enable SSL support (either NSS or OpenSSL) (auto) --with-nss enable SSL support using Mozilla NSS (auto) --with-openssl enable SSL support using OpenSSL (auto) @@ -1698,7 +1721,7 @@ Some influential environment variables: Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. -Report bugs to the package provider. +Report bugs to . _ACEOF ac_status=$? fi @@ -1761,7 +1784,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -nut configure 2.7.2 +nut configure 2.7.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1920,6 +1943,10 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------------------------------ ## +## Report this to https://github.com/networkupstools/nut/issues ## +## ------------------------------------------------------------ ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 @@ -2347,7 +2374,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by nut $as_me 2.7.2, which was +It was created by nut $as_me 2.7.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2857,7 +2884,7 @@ test -n "$target_alias" && *-aix*) echo 'aix' ;; *-freebsd*) echo 'freebsd' ;; *-darwin*) echo 'darwin' ;; - *solaris*) echo 'Linux x86_64 + *solaris*) echo 'Linux unknown ' ;; *-hpux*) echo 'hpux' ;; esac @@ -2980,7 +3007,7 @@ $as_echo "$dist_cv_build_flavor" >&6; } ac_config_headers="$ac_config_headers include/config.h" -am__api_version='1.11' +am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -3077,9 +3104,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -3090,32 +3114,40 @@ case `pwd` in esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$2" = conftest.file ) then @@ -3127,6 +3159,16 @@ Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -3137,8 +3179,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -3149,12 +3191,12 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then @@ -3166,10 +3208,10 @@ if test x"${install_sh}" != xset; then esac fi -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. +# will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. @@ -3308,12 +3350,6 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -3396,6 +3432,45 @@ else fi rmdir .tst 2>/dev/null +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." @@ -3418,7 +3493,7 @@ fi # Define the identity of the package. PACKAGE='nut' - VERSION='2.7.2' + VERSION='2.7.3' cat >>confdefs.h <<_ACEOF @@ -3446,12 +3521,22 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' @@ -3459,6 +3544,49 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for autoconf macro to enable system extensions" >&5 $as_echo_n "checking for autoconf macro to enable system extensions... " >&6; } @@ -3483,7 +3611,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -4316,6 +4444,65 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 @@ -4327,8 +4514,8 @@ else # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -4363,16 +4550,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -4381,8 +4568,8 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -4390,7 +4577,7 @@ else fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -5526,6 +5713,65 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 @@ -5537,8 +5783,8 @@ else # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -5573,16 +5819,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -5591,8 +5837,8 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -5600,7 +5846,7 @@ else fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -5654,131 +5900,6 @@ else fi -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && - test -f conftest2.$ac_objext && { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -6185,8 +6306,8 @@ else # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -6221,16 +6342,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -6239,8 +6360,8 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else @@ -6248,7 +6369,7 @@ else fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -6903,6 +7024,63 @@ cat >>confdefs.h <<_ACEOF _ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 +$as_echo_n "checking for unsigned long long int... " >&6; } +if ${ac_cv_type_unsigned_long_long_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_type_unsigned_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ + /* Test literals. */ + long long int ll = 9223372036854775807ll; + long long int nll = -9223372036854775807LL; + unsigned long long int ull = 18446744073709551615ULL; + /* Test constant expressions. */ + typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) + ? 1 : -1)]; + typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 + ? 1 : -1)]; + int i = 63; +int +main () +{ +/* Test availability of runtime routines for shift and division. */ + long long int llmax = 9223372036854775807ll; + unsigned long long int ullmax = 18446744073709551615ull; + return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull)); + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + ac_cv_type_unsigned_long_long_int=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 +$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; } + if test $ac_cv_type_unsigned_long_long_int = yes; then + +$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h + + fi + for ac_func in vsnprintf snprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` @@ -6963,75 +7141,47 @@ $as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 $as_echo_n "checking for long long int... " >&6; } if ${ac_cv_type_long_long_int+:} false; then : $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - /* For now, do not test the preprocessor; as of 2007 there are too many - implementations with broken preprocessors. Perhaps this can - be revisited in 2012. In the meantime, code should not expect - #if to work with literals wider than 32 bits. */ - /* Test literals. */ - long long int ll = 9223372036854775807ll; - long long int nll = -9223372036854775807LL; - unsigned long long int ull = 18446744073709551615ULL; - /* Test constant expressions. */ - typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) - ? 1 : -1)]; - typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 - ? 1 : -1)]; - int i = 63; -int -main () -{ -/* Test availability of runtime routines for shift and division. */ - long long int llmax = 9223372036854775807ll; - unsigned long long int ullmax = 18446744073709551615ull; - return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) - | (llmax / ll) | (llmax % ll) - | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) - | (ullmax / ull) | (ullmax % ull)); - ; - return 0; -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if test "$cross_compiling" = yes; then : ac_cv_type_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int + if test $ac_cv_type_long_long_int = yes; then + if test "$cross_compiling" = yes; then : + : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include - #ifndef LLONG_MAX - # define HALF \ - (1LL << (sizeof (long long int) * CHAR_BIT - 2)) - # define LLONG_MAX (HALF - 1 + HALF) - #endif + #ifndef LLONG_MAX + # define HALF \ + (1LL << (sizeof (long long int) * CHAR_BIT - 2)) + # define LLONG_MAX (HALF - 1 + HALF) + #endif int main () { long long int n = 1; - int i; - for (i = 0; ; i++) - { - long long int m = n << i; - if (m >> i != n) - return 1; - if (LLONG_MAX / 2 < m) - break; - } - return 0; + int i; + for (i = 0; ; i++) + { + long long int m = n << i; + if (m >> i != n) + return 1; + if (LLONG_MAX / 2 < m) + break; + } + return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : - ac_cv_type_long_long_int=yes + else ac_cv_type_long_long_int=no fi @@ -7039,11 +7189,8 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi -else - ac_cv_type_long_long_int=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + fi + fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 $as_echo "$ac_cv_type_long_long_int" >&6; } @@ -7778,6 +7925,7 @@ if test "${with_all+set}" = set; then : if test -z "${with_dev}"; then with_dev="${withval}"; fi if test -z "${with_avahi}"; then with_avahi="${withval}"; fi if test -z "${with_ipmi}"; then with_ipmi="${withval}"; fi + if test -z "${with_linux_i2c}"; then with_linux_i2c="${withval}"; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"${withval}\"" >&5 $as_echo "\"${withval}\"" >&6; } else @@ -9918,6 +10066,115 @@ _ACEOF +# Check whether --with-linux_i2c was given. +if test "${with_linux_i2c+set}" = set; then : + withval=$with_linux_i2c; nut_with_linux_i2c="${withval}" +else + nut_with_linux_i2c="auto" + +fi + + +if test "${nut_with_linux_i2c}" != no; then + case ${target_os} in + linux* ) + ac_fn_c_check_decl "$LINENO" "i2c_smbus_read_word_data" "ac_cv_have_decl_i2c_smbus_read_word_data" "#include + #include + + +" +if test "x$ac_cv_have_decl_i2c_smbus_read_word_data" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_I2C_SMBUS_READ_WORD_DATA $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + nut_with_linux_i2c="yes" +else + nut_with_linux_i2c="no" +fi +ac_fn_c_check_decl "$LINENO" "i2c_smbus_write_word_data" "ac_cv_have_decl_i2c_smbus_write_word_data" "#include + #include + + +" +if test "x$ac_cv_have_decl_i2c_smbus_write_word_data" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_I2C_SMBUS_WRITE_WORD_DATA $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + nut_with_linux_i2c="yes" +else + nut_with_linux_i2c="no" +fi +ac_fn_c_check_decl "$LINENO" "i2c_smbus_read_block_data" "ac_cv_have_decl_i2c_smbus_read_block_data" "#include + #include + + +" +if test "x$ac_cv_have_decl_i2c_smbus_read_block_data" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_I2C_SMBUS_READ_BLOCK_DATA $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + nut_with_linux_i2c="yes" +else + nut_with_linux_i2c="no" +fi + + ;; + * ) + nut_with_linux_i2c="no" + ;; + esac +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build i2c based drivers" >&5 +$as_echo_n "checking whether to build i2c based drivers... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${nut_with_linux_i2c} " >&5 +$as_echo "${nut_with_linux_i2c} " >&6; } + if test -z "${nut_report_feature_flag}"; then + nut_report_feature_flag="1" + ac_clean_files="${ac_clean_files} conf_nut_report_feature" + echo > conf_nut_report_feature + echo "Configuration summary:" >> conf_nut_report_feature + echo "======================" >> conf_nut_report_feature + fi + echo "build i2c based drivers: ${nut_with_linux_i2c} " >> conf_nut_report_feature + + + if test "${nut_with_linux_i2c}" = "yes"; then + WITH_LINUX_I2C_TRUE= + WITH_LINUX_I2C_FALSE='#' +else + WITH_LINUX_I2C_TRUE='#' + WITH_LINUX_I2C_FALSE= +fi + + if test "${nut_with_linux_i2c}" = "yes"; then + +cat >>confdefs.h <<_ACEOF +#define WITH_LINUX_I2C 1 +_ACEOF + + fi + + + nut_ssl_lib="" @@ -11248,8 +11505,162 @@ $as_echo_n "checking for dblatex version... " >&6; } $as_echo "${DBLATEX_VERSION} found" >&6; } fi + for ac_prog in xsltproc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XSLTPROC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XSLTPROC in + [\\/]* | ?:[\\/]*) + ac_cv_path_XSLTPROC="$XSLTPROC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XSLTPROC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XSLTPROC=$ac_cv_path_XSLTPROC +if test -n "$XSLTPROC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 +$as_echo "$XSLTPROC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$XSLTPROC" && break +done + + if test -n "${XSLTPROC}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xsltproc version" >&5 +$as_echo_n "checking for xsltproc version... " >&6; } + XSLTPROC_VERSION="`${XSLTPROC} --version 2>/dev/null`" + XSLTPROC_VERSION="${XSLTPROC_VERSION##* }" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${XSLTPROC_VERSION} found" >&5 +$as_echo "${XSLTPROC_VERSION} found" >&6; } fi + for ac_prog in xmllint +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XMLLINT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XMLLINT in + [\\/]* | ?:[\\/]*) + ac_cv_path_XMLLINT="$XMLLINT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XMLLINT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XMLLINT=$ac_cv_path_XMLLINT +if test -n "$XMLLINT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLLINT" >&5 +$as_echo "$XMLLINT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$XMLLINT" && break +done + + if test -n "${XMLLINT}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmllint version" >&5 +$as_echo_n "checking for xmllint version... " >&6; } + XMLLINT_VERSION="`${XMLLINT} --version 2>/dev/null`" + XMLLINT_VERSION="${XMLLINT_VERSION##* }" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${XMLLINT_VERSION} found" >&5 +$as_echo "${XMLLINT_VERSION} found" >&6; } + fi + + for ac_prog in source-highlight +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SOURCE_HIGHLIGHT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SOURCE_HIGHLIGHT in + [\\/]* | ?:[\\/]*) + ac_cv_path_SOURCE_HIGHLIGHT="$SOURCE_HIGHLIGHT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SOURCE_HIGHLIGHT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SOURCE_HIGHLIGHT=$ac_cv_path_SOURCE_HIGHLIGHT +if test -n "$SOURCE_HIGHLIGHT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SOURCE_HIGHLIGHT" >&5 +$as_echo "$SOURCE_HIGHLIGHT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$SOURCE_HIGHLIGHT" && break +done + + +fi + case "${nut_with_doc}" in yes|all|auto) @@ -11266,8 +11677,8 @@ esac for nut_doc_build_target in ${nut_doc_build_list}; do case "${nut_doc_build_target}" in html-single) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asciidoc version can build ${nut_doc_build_target}" >&5 -$as_echo_n "checking if asciidoc version can build ${nut_doc_build_target}... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asciidoc version can build ${nut_doc_build_target} (minimum required 8.6.3)" >&5 +$as_echo_n "checking if asciidoc version can build ${nut_doc_build_target} (minimum required 8.6.3)... " >&6; } @@ -11315,8 +11726,8 @@ $as_echo "no" >&6; } ;; html-chunked) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if a2x version can build ${nut_doc_build_target}" >&5 -$as_echo_n "checking if a2x version can build ${nut_doc_build_target}... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if a2x version can build ${nut_doc_build_target} (minimum required 8.6.3)" >&5 +$as_echo_n "checking if a2x version can build ${nut_doc_build_target} (minimum required 8.6.3)... " >&6; } @@ -11364,8 +11775,8 @@ $as_echo "no" >&6; } ;; pdf) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if dblatex version can build ${nut_doc_build_target}" >&5 -$as_echo_n "checking if dblatex version can build ${nut_doc_build_target}... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if dblatex version can build ${nut_doc_build_target} (minimum required 0.2.5)" >&5 +$as_echo_n "checking if dblatex version can build ${nut_doc_build_target} (minimum required 0.2.5)... " >&6; } @@ -11428,7 +11839,7 @@ no) if test -z "${DOC_NOBUILD_LIST}"; then nut_with_doc="yes" else - as_fn_error $? "\"Unable to build ${DOC_NOBUILD_LIST} documentation\"" "$LINENO" 5 + as_fn_error $? "\"Unable to build ${DOC_NOBUILD_LIST} documentation (check for 'no' results above)\"" "$LINENO" 5 fi ;; esac @@ -11526,6 +11937,38 @@ $as_echo "no" >&6; } fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if xsltproc is present (mandatory for man page regeneration)" >&5 +$as_echo_n "checking if xsltproc is present (mandatory for man page regeneration)... " >&6; } +if test -n "${XSLTPROC}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + nut_have_asciidoc="no" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if xmllint is present (mandatory for man page regeneration)" >&5 +$as_echo_n "checking if xmllint is present (mandatory for man page regeneration)... " >&6; } +if test -n "${XMLLINT}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + nut_have_asciidoc="no" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if source-highlight is present (preferable for documentation generation)" >&5 +$as_echo_n "checking if source-highlight is present (preferable for documentation generation)... " >&6; } +if test -n "${SOURCE_HIGHLIGHT}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build and install documentation" >&5 $as_echo_n "checking whether to build and install documentation... " >&6; } @@ -13785,7 +14228,7 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext @@ -13810,7 +14253,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -13829,7 +14275,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) @@ -22532,7 +22981,6 @@ if test -n "${systemdsystemunitdir}"; then systemdsystemshutdowndir="${libdir}/systemd/system-shutdown" { $as_echo "$as_me:${as_lineno-$LINENO}: result: using ${systemdsystemunitdir}" >&5 $as_echo "using ${systemdsystemunitdir}" >&6; } - systemdsystemunitdir="`echo ${systemdsystemunitdir} | sed 's/\/lib/\${libdir}/'`" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -22830,6 +23278,21 @@ else fi + if test "xAIX" = "x`uname -s 2>/dev/null`"; then + SYSTEM_AIX_TRUE= + SYSTEM_AIX_FALSE='#' +else + SYSTEM_AIX_TRUE='#' + SYSTEM_AIX_FALSE= +fi + + + +cat >>confdefs.h <<_ACEOF +#define CPU_TYPE $target_cpu +_ACEOF + + conftemp="${sysconfdir}" eval conftemp=\"${conftemp}\" eval conftemp=\"${conftemp}\" @@ -22870,6 +23333,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF +now=`TZ=UTC date +%Y-%m-%d` @@ -22920,7 +23384,9 @@ _ACEOF -ac_config_files="$ac_config_files clients/Makefile common/Makefile conf/Makefile conf/upsmon.conf.sample conf/upssched.conf.sample data/html/header.html data/html/Makefile data/Makefile data/driver.list docs/Makefile docs/man/Makefile drivers/Makefile include/Makefile lib/libupsclient-config lib/libupsclient.pc lib/libnutclient.pc lib/libnutscan.pc lib/Makefile scripts/augeas/Makefile scripts/augeas/nutnutconf.aug scripts/augeas/nutupsconf.aug scripts/augeas/nutupsdconf.aug scripts/augeas/nutupsdusers.aug scripts/augeas/nutupsmonconf.aug scripts/augeas/nutupsschedconf.aug scripts/augeas/nuthostsconf.aug scripts/augeas/nutupssetconf.aug scripts/avahi/nut.service scripts/devd/Makefile scripts/devd/nut-usb.conf scripts/hotplug/Makefile scripts/hotplug/libhidups scripts/HP-UX/nut.psf scripts/HP-UX/postinstall scripts/python/Makefile scripts/systemd/Makefile scripts/systemd/nut-driver.service scripts/systemd/nut-monitor.service scripts/systemd/nut-server.service scripts/systemd/nutshutdown scripts/Solaris/Makefile scripts/Solaris/pkginfo scripts/Solaris/postinstall scripts/Solaris/preremove scripts/Solaris/nut scripts/udev/Makefile scripts/udev/nut-ipmipsu.rules scripts/udev/nut-usbups.rules scripts/ufw/nut.ufw.profile scripts/Makefile server/Makefile tools/Makefile tools/nut-scanner/Makefile tests/Makefile Makefile" + + +ac_config_files="$ac_config_files clients/Makefile common/Makefile conf/Makefile conf/upsmon.conf.sample conf/upssched.conf.sample data/html/header.html data/html/Makefile data/Makefile data/driver.list docs/Makefile docs/docinfo.xml docs/man/Makefile drivers/Makefile include/Makefile lib/libupsclient-config lib/libupsclient.pc lib/libnutclient.pc lib/libnutscan.pc lib/Makefile scripts/Aix/nut-aix.spec scripts/augeas/Makefile scripts/augeas/nutnutconf.aug scripts/augeas/nutupsconf.aug scripts/augeas/nutupsdconf.aug scripts/augeas/nutupsdusers.aug scripts/augeas/nutupsmonconf.aug scripts/augeas/nutupsschedconf.aug scripts/augeas/nuthostsconf.aug scripts/augeas/nutupssetconf.aug scripts/avahi/nut.service scripts/devd/Makefile scripts/devd/nut-usb.conf scripts/hotplug/Makefile scripts/hotplug/libhidups scripts/HP-UX/nut.psf scripts/HP-UX/postinstall scripts/python/Makefile scripts/systemd/Makefile scripts/systemd/nut-driver.service scripts/systemd/nut-monitor.service scripts/systemd/nut-server.service scripts/systemd/nutshutdown scripts/Solaris/Makefile scripts/Solaris/pkginfo scripts/Solaris/postinstall scripts/Solaris/preremove scripts/Solaris/nut scripts/udev/Makefile scripts/udev/nut-ipmipsu.rules scripts/udev/nut-usbups.rules scripts/ufw/nut.ufw.profile scripts/Makefile server/Makefile tools/Makefile tools/nut-scanner/Makefile tests/Makefile Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -23031,6 +23497,14 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -23100,6 +23574,10 @@ if test -z "${WITH_MACOSX_TRUE}" && test -z "${WITH_MACOSX_FALSE}"; then as_fn_error $? "conditional \"WITH_MACOSX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${WITH_LINUX_I2C_TRUE}" && test -z "${WITH_LINUX_I2C_FALSE}"; then + as_fn_error $? "conditional \"WITH_LINUX_I2C\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${WITH_NSS_TRUE}" && test -z "${WITH_NSS_FALSE}"; then as_fn_error $? "conditional \"WITH_NSS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -23172,6 +23650,10 @@ if test -z "${HAVE_ASPELL_TRUE}" && test -z "${HAVE_ASPELL_FALSE}"; then as_fn_error $? "conditional \"HAVE_ASPELL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${SYSTEM_AIX_TRUE}" && test -z "${SYSTEM_AIX_FALSE}"; then + as_fn_error $? "conditional \"SYSTEM_AIX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 @@ -23569,7 +24051,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by nut $as_me 2.7.2, which was +This file was extended by nut $as_me 2.7.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23629,13 +24111,13 @@ $config_headers Configuration commands: $config_commands -Report bugs to the package provider." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -nut config.status 2.7.2 +nut config.status 2.7.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -24152,6 +24634,7 @@ do "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "data/driver.list") CONFIG_FILES="$CONFIG_FILES data/driver.list" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; + "docs/docinfo.xml") CONFIG_FILES="$CONFIG_FILES docs/docinfo.xml" ;; "docs/man/Makefile") CONFIG_FILES="$CONFIG_FILES docs/man/Makefile" ;; "drivers/Makefile") CONFIG_FILES="$CONFIG_FILES drivers/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; @@ -24160,6 +24643,7 @@ do "lib/libnutclient.pc") CONFIG_FILES="$CONFIG_FILES lib/libnutclient.pc" ;; "lib/libnutscan.pc") CONFIG_FILES="$CONFIG_FILES lib/libnutscan.pc" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "scripts/Aix/nut-aix.spec") CONFIG_FILES="$CONFIG_FILES scripts/Aix/nut-aix.spec" ;; "scripts/augeas/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/augeas/Makefile" ;; "scripts/augeas/nutnutconf.aug") CONFIG_FILES="$CONFIG_FILES scripts/augeas/nutnutconf.aug" ;; "scripts/augeas/nutupsconf.aug") CONFIG_FILES="$CONFIG_FILES scripts/augeas/nutupsconf.aug" ;; @@ -24793,7 +25277,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -24806,7 +25290,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -24840,21 +25324,19 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || diff --git a/configure.ac b/configure.ac index ce8b2c5..f87be6d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,9 +1,9 @@ dnl +------------------------------------------------------------------+ -dnl | Network UPS Tools: configure.in | +dnl | Network UPS Tools: configure.ac | dnl +------------------------------------------------------------------+ dnl NUT version number is defined here, with a Git suffix in include/nut_version.h -AC_INIT(nut, 2.7.2) +AC_INIT(nut, 2.7.3, [https://github.com/networkupstools/nut/issues]) AC_CONFIG_SRCDIR(server/upsd.c) AC_CONFIG_MACRO_DIR([m4]) echo "Network UPS Tools version ${PACKAGE_VERSION}" @@ -11,7 +11,7 @@ AC_CANONICAL_SYSTEM NUT_CHECK_OS AC_CONFIG_HEADER(include/config.h) AC_PREFIX_DEFAULT(/usr/local/ups) -AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE([subdir-objects]) dnl we need Autoconf 2.60 or better to enable features of Posix that are extensions to C AC_MSG_CHECKING(for autoconf macro to enable system extensions) @@ -23,7 +23,7 @@ m4_version_prereq(2.60, [ ]) dnl Use "./configure --enable-maintainer-mode" to keep Makefile.in and Makefile -dnl in sync after SVN updates. +dnl in sync after Git updates. AM_MAINTAINER_MODE dnl PKG_PROG_PKG_CONFIG @@ -42,6 +42,8 @@ dnl However, automatically define the tree version (mostly for AC_SUBST) TREE_VERSION="`echo ${PACKAGE_VERSION} | awk '{ print substr($0,1,3) }'`" AC_DEFINE_UNQUOTED(TREE_VERSION, "${TREE_VERSION}", [NUT tree version]) +dnl Should not be necessary, since old servers have well-defined errors for +dnl unsupported commands: NUT_NETVERSION="1.2" AC_DEFINE_UNQUOTED(NUT_NETVERSION, "${NUT_NETVERSION}", [NUT network protocol version]) @@ -221,7 +223,7 @@ dnl check for --with-all (or --without-all, or --with-all=auto) flag AC_MSG_CHECKING(for --with-all) AC_ARG_WITH(all, - AS_HELP_STRING([--with-all], [enable serial, usb, snmp, neon, ipmi, powerman, cgi, dev, avahi]), + AS_HELP_STRING([--with-all], [enable serial, usb, snmp, neon, ipmi, powerman, cgi, dev, avahi, linux_i2c]), [ if test -n "${withval}"; then dnl Note: we allow "no" as a positive value, because @@ -235,6 +237,7 @@ AC_ARG_WITH(all, if test -z "${with_dev}"; then with_dev="${withval}"; fi if test -z "${with_avahi}"; then with_avahi="${withval}"; fi if test -z "${with_ipmi}"; then with_ipmi="${withval}"; fi + if test -z "${with_linux_i2c}"; then with_linux_i2c="${withval}"; fi AC_MSG_RESULT("${withval}") else AC_MSG_RESULT(not given) @@ -464,6 +467,35 @@ NUT_REPORT_FEATURE([build Mac OS X meta-driver], [${nut_with_macosx_ups}], [${nut_macosx_ups_lib}], [WITH_MACOSX], [Define to enable Mac OS X meta-driver]) +dnl ---------------------------------------------------------------------- +dnl checks related to --with_linux_i2c +dnl Check for i2c header on Linux, used for ASEM UPS driver +NUT_ARG_WITH([linux_i2c], [build and install i2c drivers], [auto]) +if test "${nut_with_linux_i2c}" != no; then + case ${target_os} in + linux* ) + AC_CHECK_DECLS( + [i2c_smbus_read_word_data, i2c_smbus_write_word_data, i2c_smbus_read_block_data], + [nut_with_linux_i2c="yes"], + [nut_with_linux_i2c="no"], + [#include + #include + ] + ) + ;; + * ) + nut_with_linux_i2c="no" + ;; + esac +fi +NUT_REPORT_FEATURE( + [build i2c based drivers], + [${nut_with_linux_i2c}], + [], + [WITH_LINUX_I2C], + [Define to enable I2C support] +) + dnl ---------------------------------------------------------------------- dnl Check for with-ssl, and --with-nss or --with-openssl dnl Only one can be enabled at a time, with a preference for OpenSSL @@ -611,7 +643,7 @@ esac for nut_doc_build_target in ${nut_doc_build_list}; do case "${nut_doc_build_target}" in html-single) - AC_MSG_CHECKING([if asciidoc version can build ${nut_doc_build_target}]) + AC_MSG_CHECKING([if asciidoc version can build ${nut_doc_build_target} (minimum required 8.6.3)]) AX_COMPARE_VERSION([${ASCIIDOC_VERSION}], [ge], [8.6.3], [ AC_MSG_RESULT(yes) DOC_BUILD_LIST="${DOC_BUILD_LIST} ${nut_doc_build_target}" @@ -622,7 +654,7 @@ for nut_doc_build_target in ${nut_doc_build_list}; do ;; html-chunked) - AC_MSG_CHECKING([if a2x version can build ${nut_doc_build_target}]) + AC_MSG_CHECKING([if a2x version can build ${nut_doc_build_target} (minimum required 8.6.3)]) AX_COMPARE_VERSION([${A2X_VERSION}], [ge], [8.6.3], [ AC_MSG_RESULT(yes) DOC_BUILD_LIST="${DOC_BUILD_LIST} ${nut_doc_build_target}" @@ -633,7 +665,7 @@ for nut_doc_build_target in ${nut_doc_build_list}; do ;; pdf) - AC_MSG_CHECKING([if dblatex version can build ${nut_doc_build_target}]) + AC_MSG_CHECKING([if dblatex version can build ${nut_doc_build_target} (minimum required 0.2.5)]) AX_COMPARE_VERSION([${DBLATEX_VERSION}], [ge], [0.2.5], [ AC_MSG_RESULT(yes) DOC_BUILD_LIST="${DOC_BUILD_LIST} ${nut_doc_build_target}" @@ -659,7 +691,7 @@ no) if test -z "${DOC_NOBUILD_LIST}"; then nut_with_doc="yes" else - AC_MSG_ERROR(["Unable to build ${DOC_NOBUILD_LIST} documentation"]) + AC_MSG_ERROR(["Unable to build ${DOC_NOBUILD_LIST} documentation (check for 'no' results above)"]) fi ;; esac @@ -681,6 +713,31 @@ AX_COMPARE_VERSION([${A2X_VERSION}], [ge], [8.6.3], [ nut_have_asciidoc="no" ]) +dnl TODO: test for docbook-xsl files (maybe build a test man page?) +dnl https://github.com/networkupstools/nut/issues/162 +AC_MSG_CHECKING([if xsltproc is present (mandatory for man page regeneration)]) +if test -n "${XSLTPROC}"; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) + nut_have_asciidoc="no" +fi + +AC_MSG_CHECKING([if xmllint is present (mandatory for man page regeneration)]) +if test -n "${XMLLINT}"; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) + nut_have_asciidoc="no" +fi + +AC_MSG_CHECKING([if source-highlight is present (preferable for documentation generation)]) +if test -n "${SOURCE_HIGHLIGHT}"; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + NUT_REPORT_FEATURE([build and install documentation], [${nut_with_doc}], [], [WITH_ASCIIDOC], [Define to enable Asciidoc support]) @@ -1010,7 +1067,6 @@ dnl files will try to get intalled to the actual system directories if test -n "${systemdsystemunitdir}"; then systemdsystemshutdowndir="${libdir}/systemd/system-shutdown" AC_MSG_RESULT(using ${systemdsystemunitdir}) - systemdsystemunitdir="`echo ${systemdsystemunitdir} | sed 's/\/lib/\${libdir}/'`" else AC_MSG_RESULT(no) fi @@ -1112,6 +1168,12 @@ dnl check for spell checking deps AC_PATH_PROGS([ASPELL], [aspell], [none]) AM_CONDITIONAL([HAVE_ASPELL], [test "x$ASPELL" != "xnone"]) +dnl AIX system +AM_CONDITIONAL([SYSTEM_AIX], [test "xAIX" = "x`uname -s 2>/dev/null`"]) + +dnl processor type +AC_DEFINE_UNQUOTED(CPU_TYPE, $target_cpu, [Define processor type]) + dnl expand ${sysconfdir} and write it out conftemp="${sysconfdir}" eval conftemp=\"${conftemp}\" @@ -1140,6 +1202,10 @@ eval conftemp=\"${conftemp}\" SBINDIR=${conftemp} AC_DEFINE_UNQUOTED(SBINDIR, "${conftemp}", [Default path for system executables]) +dnl Current date +now=`TZ=UTC date +%Y-%m-%d` + +AC_SUBST(now) AC_SUBST(OS_NAME) AC_SUBST(TREE_VERSION) AC_SUBST(NUT_NETVERSION) @@ -1201,6 +1267,7 @@ AC_OUTPUT([ data/Makefile data/driver.list docs/Makefile + docs/docinfo.xml docs/man/Makefile drivers/Makefile include/Makefile @@ -1209,6 +1276,7 @@ AC_OUTPUT([ lib/libnutclient.pc lib/libnutscan.pc lib/Makefile + scripts/Aix/nut-aix.spec scripts/augeas/Makefile scripts/augeas/nutnutconf.aug scripts/augeas/nutupsconf.aug diff --git a/data/Makefile.in b/data/Makefile.in index 96bf232..5a010e3 100644 --- a/data/Makefile.in +++ b/data/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,23 +17,51 @@ # Network UPS Tools: data VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -55,8 +82,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = data -DIST_COMMON = $(dist_data_DATA) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/driver.list.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/driver.list.in $(dist_data_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -85,15 +112,28 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = driver.list CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -130,9 +170,29 @@ am__installdirs = "$(DESTDIR)$(datadir)" "$(DESTDIR)$(datadir)" DATA = $(dist_data_DATA) $(nodist_data_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) @@ -165,6 +225,7 @@ am__relativize = \ A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -271,12 +332,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -321,6 +385,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -431,22 +496,25 @@ uninstall-nodist_dataDATA: dir='$(DESTDIR)$(datadir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -461,57 +529,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -527,12 +550,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -544,15 +562,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -561,6 +575,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -724,24 +753,22 @@ ps-am: uninstall-am: uninstall-dist_dataDATA uninstall-nodist_dataDATA -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dist_dataDATA install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-nodist_dataDATA install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-dist_dataDATA \ - uninstall-nodist_dataDATA +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_dataDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-nodist_dataDATA \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-dist_dataDATA uninstall-nodist_dataDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/data/cmdvartab b/data/cmdvartab index 8bef408..ef68d70 100644 --- a/data/cmdvartab +++ b/data/cmdvartab @@ -20,6 +20,7 @@ VARDESC ups.firmware "UPS firmware" VARDESC ups.firmware.aux "Auxiliary device firmware" VARDESC ups.temperature "UPS temperature (degrees C)" VARDESC ups.load "Load on UPS (percent of full)" +VARDESC ups.load.energysave "Load on UPS that triggers energysave (percent)" VARDESC ups.load.high "Load when UPS switches to overload condition (percent)" VARDESC ups.id "UPS system identifier" VARDESC ups.delay.start "Interval to wait before (re)starting the load (seconds)" @@ -67,6 +68,10 @@ VARDESC input.transfer.boost.low "Low voltage boosting transfer point (V)" VARDESC input.transfer.boost.high "High voltage boosting transfer point (V)" VARDESC input.transfer.trim.low "Low voltage trimming transfer point (V)" VARDESC input.transfer.trim.high "High voltage trimming transfer point (V)" +VARDESC input.transfer.delay "Delay before transfer to mains" +VARDESC input.load "Load on (ePDU) input (percent of full)" +VARDESC input.realpower "Current sum value of all (ePDU) phases real power (W)" +VARDESC input.power "Current sum value of all (ePDU) phases apparent power (VA)" VARDESC output.voltage "Output voltage (V)" VARDESC output.voltage.nominal "Nominal output voltage (V)" @@ -94,6 +99,10 @@ VARDESC battery.packs.bad "Number of bad battery packs" VARDESC battery.type "Battery chemistry" VARDESC battery.protection "Prevent deep discharge of battery" VARDESC battery.energysave "Switch off when running on battery and no/low load" +VARDESC battery.energysave.load "Switch off UPS if on battery and load level lower (percent)" +VARDESC battery.energysave.delay "Delay before switch off UPS if on battery and load level low (min)" +VARDESC battery.energysave.realpower "Switch off UPS if on battery and load level lower (Watts)" +VARDESC battery.charger.status "Battery charger status" VARDESC ambient.temperature "Ambient temperature (degrees C)" VARDESC ambient.temperature.alarm "Ambient temperature alarm is active" @@ -179,8 +188,10 @@ CMDDESC beeper.mute "Temporarily mute the UPS beeper" CMDDESC beeper.toggle "Toggle the UPS beeper" CMDDESC outlet.1.load.off "Turn off the load on outlet 1 immediately" CMDDESC outlet.1.load.on "Turn on the load on outlet 1 immediately" +CMDDESC outlet.1.shutdown.return "Turn off the outlet 1 and return when power is back" CMDDESC outlet.2.load.off "Turn off the load on outlet 2 immediately" CMDDESC outlet.2.load.on "Turn on the load on outlet 2 immediately" +CMDDESC outlet.2.shutdown.return "Turn off the outlet 2 and return when power is back" # The following two commands should *only* be defined when you need # to compose a 'shutdown.return' command by sending both a switch-off diff --git a/data/driver.list.in b/data/driver.list.in index 45db598..a0e82fb 100644 --- a/data/driver.list.in +++ b/data/driver.list.in @@ -48,6 +48,8 @@ "AEG Power Solutions" "ups" "2" "PROTECT HOME" "" "blazer_ser or blazer_usb" +"APC" "ups" "2" "Back-UPS 1200BR (Microsol)" "" "solis" +"APC" "ups" "2" "Back-UPS BZ2200BI-BR (Microsol)" "" "solis" "APC" "ups" "1" "Back-UPS Pro" "" "apcsmart" "APC" "ups" "1" "Matrix-UPS" "" "apcsmart" "APC" "ups" "1" "Smart-UPS" "" "apcsmart" @@ -91,6 +93,8 @@ "ARTronic" "ups" "2" "ARTon Platinium Combo 3.1 10/15/20 kVA" "USB" "blazer_usb" "ARTronic" "ups" "2" "ARTon Platinium RT 1/2/3/6/10 kVA" "USB" "blazer_usb" +"ASEM SPA" "UPS" "5" "PB1300 UPS" "i2c" "asem" + "ATEK" "ups" "2" "Defensor 1K Tower / Rack" "USB" "blazer_usb" "ATEK" "ups" "2" "Defensor 2K Tower / Rack" "USB" "blazer_usb" "ATEK" "ups" "2" "Defensor 3K Tower / Rack" "USB" "blazer_usb" @@ -120,6 +124,7 @@ "Belkin" "ups" "2" "F6H375-USB" "USB (<= 2005 models, vendor id: 050d)" "usbhid-ups" "Belkin" "ups" "2" "F6H375-USB" "USB (2007 models, vendor id: 0665)" "blazer_usb" "Belkin" "ups" "2" "Office Series F6C550-AVR" "USB" "usbhid-ups" +"Belkin" "ups" "3" "Regulator PRO-USB" "USB (~2000, product id: 0f51)" "usbhid-ups" "Belkin" "ups" "2" "Regulator Pro" "F6C525-SER, F6C625-SER" "belkin" "Belkin" "ups" "1" "Resource" "" "genericups upstype=4" "Belkin" "ups" "2" "Small Enterprise F6C1500-TW-RK" "serial port" "belkin" @@ -203,6 +208,7 @@ "Cyber Power Systems" "ups" "2" "Value 400E" "USB" "usbhid-ups" "Cyber Power Systems" "ups" "2" "Value 600E" "USB" "usbhid-ups" "Cyber Power Systems" "ups" "2" "Value 800E" "USB" "usbhid-ups" +"Cyber Power Systems" "ups" "2" "Value 1500ELCD-RU" "USB" "usbhid-ups" "Cyber Power Systems" "ups" "2" "CP900AVR" "USB" "usbhid-ups" "Cyber Power Systems" "ups" "2" "CP1000AVRLCD" "USB" "usbhid-ups" "Cyber Power Systems" "ups" "2" "CP1350AVRLCD" "USB" "usbhid-ups" @@ -319,6 +325,8 @@ "ETA" "ups" "1" "mini+UPS" "WinNT/Upsoft cable" "genericups upstype=7" "ETA" "ups" "1" "mini+UPS PRO" "UPS Explorer cable" "etapro" +"EUROCASE" "ups" "2" "EA200N 2000VA" "USB" "nutdrv_qx" # http://partis.cz/index.php?gid=2551 + "EVER" "ups" "1" "NET DPC series" "Serial port" "everups" "EVER" "ups" "1" "AP Pro series" "Serial port" "everups" "EVER" "ups" "1" "625/1000" "" "safenet" @@ -341,6 +349,7 @@ "Fairstone" "ups" "1" "L525/L625/L750" "" "safenet" "Fideltronik" "ups" "1" "Ares 700 and larger" "" "genericups upstype=6" +"Fideltronik" "ups" "2" "LUPUS 500" "USB" "nutdrv_qx" "Fideltronik" "ups" "1" "Other Ares models" "" "genericups upstype=19" "Fiskars" "ups" "4" "PowerRite MAX" "" "upscode2" @@ -348,6 +357,10 @@ "Fiskars" "ups" "4" "PowerServer 30" "" "upscode2" "Fiskars" "ups" "4" "9200" "UPS Information Unit" "upscode2" +"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS" "Serial" "nutdrv_qx" +"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS" "USB" "nutdrv_qx" +"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS(T)" "Serial" "nutdrv_qx" +"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS(T)" "USB" "nutdrv_qx" "Flight Technic & International (FTUPS)" "ups" "2" "Smart On Line UPS 1KVA" "Serial" "nutdrv_qx" "Flight Technic & International (FTUPS)" "ups" "2" "Smart On Line UPS 1KVA" "USB" "nutdrv_qx" "Flight Technic & International (FTUPS)" "ups" "2" "(various)" "Serial" "nutdrv_qx" @@ -372,6 +385,8 @@ "Gemini" "ups" "1" "UPS625/UPS1000" "" "safenet" +"Grafenthal" "ups" "2" "PR-3000-HS" "SNMP/Web Minislot card (ref 149G0006)" "snmp-ups" # http://grafenthal.de/produkte/usv/online/pr-hs-serie/pr-3000-hs/?L=3et8 + "Gtec" "ups" "2" "ZP120N-1K / ZP120N-1KS / ZP120N-2K / ZP120N-2KS / ZP120N-3K / ZP120N-3KS" "" "blazer_usb" "Gtec" "ups" "2" "ZP120N-6K / ZP120N-6KS / ZP120N-10K-11 / ZP120N-10KS-11" "" "blazer_usb" "Gtec" "ups" "2" "ZP120N-10K-31-00 / ZP120N-10K-31-07 / ZP120N-10K-31-09 / ZP120N-10K-31-99 / ZP120N-20K" "USB port" "blazer_usb" @@ -445,6 +460,8 @@ "Jageson Technology" "ups" "1" "Jasuny USPS" "" "genericups upstype=4" +"JAWAN" "ups" "2" "JW-UPSLC02" "USB" "blazer_usb" + "Kanji" "ups" "1" "800 VA" "USB" "nutdrv_atcl_usb" "Kebo" "ups" "2" "1200D/D Series" "" "blazer_ser" @@ -457,6 +474,8 @@ "Krauler" "ups" "2" "UP-D1200VA" "USB" "blazer_usb" "Krauler" "ups" "2" "UP-M500VA" "USB" "blazer_usb" +"Lacerda" "ups" "2" "New Orion 800VA" "USB" "blazer_usb" + "LDLC" "ups" "2" "UPS-1200D" "" "blazer_usb langid_fix=0x4095" "Lestar" "ups" "2" "MD-800E" "" "blazer_ser" @@ -478,6 +497,7 @@ "Maxxtro" "ups" "2" "UPS 600 VA" "serial port" "blazer_ser" +"Mecer" "ups" "2" "ME-1000-WTU" "USB" "nutdrv_qx" # http://www.comx-computers.co.za/download/mecer/ME-1000-WTU.pdf "Mecer" "ups" "2" "ME-2000" "" "blazer_ser" "Meta System" "ups" "1" "HF Line" "1..4 boards" "metasys" @@ -696,6 +716,14 @@ "Neus" "ups" "2" "400va / 600va" "" "blazer_ser" +"NHS Sistemas de Energia" "ups" "5" "Expert C Online 6000" "" "gamatronic" # http://www.nhs.com.br/produtos_interna/id/TWpFeQ== +"NHS Sistemas de Energia" "ups" "5" "Expert C Online 8000" "" "gamatronic" +"NHS Sistemas de Energia" "ups" "5" "Expert C Online 10000" "" "gamatronic" +"NHS Sistemas de Energia" "ups" "5" "Expert S Online 6000" "" "gamatronic" +"NHS Sistemas de Energia" "ups" "5" "Expert S Online 8000" "" "gamatronic" +"NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic" +"NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic" + "Nitram" "ups" "1" "Elite 500" "" "genericups upstype=8" "Nitram" "ups" "1" "Elite 2002" "" "genericups upstype=16" "Nitram" "ups" "1" "Elite 2005" "" "powerpanel" @@ -760,6 +788,7 @@ "Powercom" "ups" "4" "(various)" "USB (<= 2009 models, product id: 0002)" "powercom (requires 'usbserial' kernel module)" "Powercom" "ups" "5" "(various)" "USB (2009 models, product id: 00a?)" "usbhid-ups (experimental)" "Powercom" "ups" "5" "BNT-xxxAP" "USB (product id: 0004)" "usbhid-ups (experimental)" +"Powercom" "ups" "1" "BNT-xxxAP" "USB (product id: 0001)" "usbhid-ups (experimental)" "POWEREX" "ups" "2" "VI 1000 LED" "" "blazer_usb" @@ -864,6 +893,8 @@ "Rocketfish" "ups" "2" "RF-1000VA / RF-1025VA" "" "usbhid-ups" +"Rucelf" "ups" "2" "Rucelf UPOII-3000-96-EL" "" "blazer_ser" # http://www.rucelf.ua/en/catalog/upoii-3000-96-el/ + "SmartLabs" "pdu" "1" "2412S Power Line Modem" "for X10/Insteon" "powerman-pdu (experimental)" "SMS (Brazil)" "ups" "2" "Manager III" "" "blazer_ser" @@ -913,16 +944,6 @@ "Tecnoware" "ups" "2" "Easy Power 1200" "" "blazer_ser" "Tecnoware" "ups" "2" "UPS ERA LCD 0.65" "" "blazer_usb langid_fix=0x409" -"Tripp Lite" "ups" "1" "INTERNETOFFICE700" "USB (older; product ID: 0001)" "tripplite_usb" -"Tripp Lite" "ups" "2" "OMNIVS1000" "USB (older; product ID: 0001)" "tripplite_usb" -"Tripp Lite" "ups" "1" "OMNIVS1500XL" "USB" "tripplite_usb" -"Tripp Lite" "ups" "1" "SMART700USB" "USB" "tripplite_usb" -"Tripp Lite" "ups" "1" "SMART1500RM2U" "USB (older; product ID: 0001)" "tripplite_usb" -"Tripp Lite" "ups" "1" "SMART550USB" "USB (older; product ID: 0001)" "tripplite_usb" -"Tripp Lite" "ups" "1" "OMNISMART500" "USB (older; product ID: 0001)" "tripplite_usb" -"Tripp Lite" "ups" "1" "SMART2200RMXL2U" "USB (older; product ID: 0001)" "tripplite_usb (experimental)" -"Tripp Lite" "ups" "1" "SmartUPS" "" "tripplite" -"Tripp Lite" "ups" "1" "SmartOnline" "" "tripplitesu" "Tripp Lite" "ups" "1" "(various)" "Lan 2.2 interface - black 73-0844 cable" "genericups upstype=5" "Tripp Lite" "ups" "2" "1500 LCD" "USB" "usbhid-ups" "Tripp Lite" "ups" "3" "AVR550U" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=3090 @@ -952,23 +973,39 @@ "Tripp Lite" "ups" "3" "INTERNET750U" "USB (protocol 1007)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3142 "Tripp Lite" "ups" "3" "INTERNET900U" "USB (protocol 1007)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=3657 "Tripp Lite" "ups" "3" "INTERNETOFFICE500" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=11 +"Tripp Lite" "ups" "1" "INTERNETOFFICE700" "USB (older; product ID: 0001)" "tripplite_usb" "Tripp Lite" "ups" "3" "INTERNETOFFICE700" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=14 "Tripp Lite" "ups" "3" "OMNI650LCD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3195 "Tripp Lite" "ups" "3" "OMNI900LCD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=3082 "Tripp Lite" "ups" "2" "OMNI1000LCD" "USB" "usbhid-ups" "Tripp Lite" "ups" "3" "OMNISMART300PNP" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=19 +"Tripp Lite" "ups" "1" "OMNISMART500" "USB (older; product ID: 0001)" "tripplite_usb" "Tripp Lite" "ups" "3" "OMNISMART500" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=21 "Tripp Lite" "ups" "3" "OMNISMART700" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=23 -"Tripp Lite" "ups" "3" "OMNIVS1000" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2656 +"Tripp Lite" "ups" "2" "OMNIVSINT800" "USB (older; product ID: 0001)" "tripplite_usb" "Tripp Lite" "ups" "3" "OMNIVS800" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2729 +"Tripp Lite" "ups" "2" "OMNIVS1000" "USB (older; product ID: 0001)" "tripplite_usb" +"Tripp Lite" "ups" "3" "OMNIVS1000" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2656 +"Tripp Lite" "ups" "1" "OMNIVS1500XL" "USB" "tripplite_usb" "Tripp Lite" "ups" "3" "POS500" "USB (protocol 2007)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3742 "Tripp Lite" "ups" "3" "SM2200RMDVTAA" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=4648 +"Tripp Lite" "ups" "1" "SmartUPS" "" "tripplite" +"Tripp Lite" "ups" "1" "SmartOnline" "" "tripplitesu" +"Tripp Lite" "ups" "1" "SMART550USB" "USB (older; product ID: 0001)" "tripplite_usb" +"Tripp Lite" "ups" "3" "SMART550USB" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2002 +"Tripp Lite" "ups" "3" "SMART550USBWD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2591 +"Tripp Lite" "ups" "1" "SMART700USB" "USB" "tripplite_usb" +"Tripp Lite" "ups" "3" "SMART750RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3020 +"Tripp Lite" "ups" "3" "SMART750SLT" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3007 +"Tripp Lite" "ups" "3" "SMART750USB" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2679 +"Tripp Lite" "ups" "3" "SMART750XLA" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3820 "Tripp Lite" "ups" "3" "SMART1000LCD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=3071 "Tripp Lite" "ups" "3" "SMART1000RM2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2657 "Tripp Lite" "ups" "3" "SMART1000RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5262 "Tripp Lite" "ups" "3" "SMART1050SLT" "USB (protocol 3012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3253 "Tripp Lite" "ups" "3" "SMART1050SLTAA" "USB (protocol 3012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=4389 "Tripp Lite" "ups" "3" "SMART1200LCD" "USB (protocol 2009)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3193 +"Tripp Lite" "ups" "1" "SMART1500RM2U" "USB (older; product ID: 0001)" "tripplite_usb" "Tripp Lite" "ups" "3" "SMART1500CRMXL" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3826 "Tripp Lite" "ups" "3" "SMART1500LCD" "USB (protocol 2009)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=3151 "Tripp Lite" "ups" "3" "SMART1500LCDXL" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=4978 @@ -980,6 +1017,7 @@ "Tripp Lite" "ups" "3" "SMART2200CRMXL" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3825 "Tripp Lite" "ups" "3" "SMART2200RM2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=4403 "Tripp Lite" "ups" "3" "SMART2200RM2UN" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5428 +"Tripp Lite" "ups" "1" "SMART2200RMXL2U" "USB (older; product ID: 0001)" "tripplite_usb (experimental)" "Tripp Lite" "ups" "3" "SMART2200RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3264 "Tripp Lite" "ups" "3" "SMART2200RMXL2UP" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=4672 "Tripp Lite" "ups" "3" "SMART2200RMXLN" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5427 @@ -994,13 +1032,8 @@ "Tripp Lite" "ups" "3" "SMART3000RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=4418 "Tripp Lite" "ups" "3" "SMART3000RMXLN" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5425 "Tripp Lite" "ups" "3" "SMART3000SLT" "USB (protocol 3013)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3490 -"Tripp Lite" "ups" "3" "SMART500RT1U" "USB (protocol 3005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2853 -"Tripp Lite" "ups" "3" "SMART550USB" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2002 -"Tripp Lite" "ups" "3" "SMART550USBWD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2591 -"Tripp Lite" "ups" "3" "SMART750RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3020 -"Tripp Lite" "ups" "3" "SMART750SLT" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3007 -"Tripp Lite" "ups" "3" "SMART750USB" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2679 -"Tripp Lite" "ups" "3" "SMART750XLA" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3820 +"Tripp Lite" "ups" "2" "SMART500RT1U" "USB (older; product ID 0001, protocol 3005)" "tripplite_usb" +"Tripp Lite" "ups" "3" "SMART500RT1U" "USB (newer; protocol/product ID 3005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2853 "Tripp Lite" "ups" "3" "SMX1000LCD" "USB (protocol 2005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3200 "Tripp Lite" "ups" "3" "SMX1000RT2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2798 "Tripp Lite" "ups" "3" "SMX1050SLT" "USB (protocol 3012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3249 @@ -1013,6 +1046,9 @@ "Tripp Lite" "ups" "3" "SMX3000XLRT2UA" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=5658 "Tripp Lite" "ups" "3" "SMX500RT1U" "USB (protocol 3005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2691 "Tripp Lite" "ups" "3" "SMX750SLT" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3021 +"Tripp Lite" "ups" "3" "SU750RTXL2U" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3194 +"Tripp Lite" "ups" "3" "SU750RTXLCD2U" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=5070 +"Tripp Lite" "ups" "3" "SU750XL" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3299 "Tripp Lite" "ups" "3" "SU1000RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=2948 "Tripp Lite" "ups" "3" "SU1000RTXLCD2U" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=745&txtModelID=4980 "Tripp Lite" "ups" "3" "SU1000XLA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=3180 @@ -1032,9 +1068,6 @@ "Tripp Lite" "ups" "3" "SU3000RTXR3UHW" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=4976 "Tripp Lite" "ups" "3" "SU3000XL" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=3601 "Tripp Lite" "ups" "3" "SU3000XLCD" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=744&txtModelID=5342 -"Tripp Lite" "ups" "3" "SU750RTXL2U" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3194 -"Tripp Lite" "ups" "3" "SU750RTXLCD2U" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=5070 -"Tripp Lite" "ups" "3" "SU750XL" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3299 "Tripp Lite" "ups" "3" "SUINT1000RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3983 "Tripp Lite" "ups" "3" "SUINT1500RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=2720 "Tripp Lite" "ups" "3" "SUINT2200RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=3970 @@ -1084,10 +1117,14 @@ "Vivaldi" "ups" "1" "EA200 LED" "USB" "richcomm_usb" +"Voltronic Power" "ups" "2" "Apex 1KVA" "Serial" "nutdrv_qx" +"Voltronic Power" "ups" "2" "Apex 1KVA" "USB" "nutdrv_qx" "Voltronic Power" "ups" "2" "Frigate TX 1KVA" "Serial" "nutdrv_qx" "Voltronic Power" "ups" "2" "Frigate TX 1KVA" "USB" "nutdrv_qx" "Voltronic Power" "ups" "2" "Galleon 1KVA" "Serial" "nutdrv_qx" "Voltronic Power" "ups" "2" "Galleon 1KVA" "USB" "nutdrv_qx" +"Voltronic Power" "ups" "2" "Imperial 1KVA" "Serial" "nutdrv_qx" +"Voltronic Power" "ups" "2" "Imperial 1KVA" "USB" "nutdrv_qx" "Voltronic Power" "ups" "2" "Prosine 800" "Serial" "nutdrv_qx" "Voltronic Power" "ups" "2" "Prosine 800" "USB" "nutdrv_qx" "Voltronic Power" "ups" "2" "Vesta LED 850VA" "USB" "nutdrv_qx" diff --git a/data/html/Makefile.in b/data/html/Makefile.in index 602ffcf..8ec093f 100644 --- a/data/html/Makefile.in +++ b/data/html/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -16,23 +15,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -53,8 +80,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = data/html -DIST_COMMON = README $(am__dist_html_DATA_DIST) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/header.html.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/header.html.in $(am__dist_html_DATA_DIST) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -83,6 +110,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = header.html CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -120,10 +159,12 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)" DATA = $(dist_html_DATA) $(nodist_html_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -230,12 +271,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -280,6 +324,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -390,11 +435,11 @@ uninstall-nodist_htmlDATA: @list='$(nodist_html_DATA)'; test -n "$(htmldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -533,16 +578,17 @@ uninstall-am: uninstall-dist_htmlDATA uninstall-nodist_htmlDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dist_htmlDATA install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-nodist_htmlDATA install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am uninstall-dist_htmlDATA \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_htmlDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-nodist_htmlDATA \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am uninstall-dist_htmlDATA \ uninstall-nodist_htmlDATA diff --git a/depcomp b/depcomp index 25a39e6..4ebd5b3 100755 --- a/depcomp +++ b/depcomp @@ -1,10 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2012-03-27.16; # UTC +scriptversion=2013-05-30.07; # UTC -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # 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 @@ -28,9 +27,9 @@ scriptversion=2012-03-27.16; # UTC case $1 in '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] @@ -57,11 +56,65 @@ EOF ;; esac +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + # A tabulation character. tab=' ' # A newline character. nl=' ' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 @@ -75,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" +# Avoid interferences from the environment. +gccflag= dashmflag= + # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case @@ -86,32 +142,32 @@ if test "$depmode" = hp; then fi if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvisualcpp + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then - # This is just like msvc7 but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvc7 + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 fi if test "$depmode" = xlc; then - # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. - gccflag=-qmakedep=gcc,-MF - depmode=gcc + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc fi case "$depmode" in @@ -134,8 +190,7 @@ gcc3) done "$@" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -143,13 +198,17 @@ gcc3) ;; gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then @@ -157,15 +216,14 @@ gcc) fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. + # The second -e expression handles DOS-style file names with drive + # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. @@ -174,15 +232,15 @@ gcc) ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. - tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -200,8 +258,7 @@ sgi) "$@" -MDupdate "$tmpdepfile" fi stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -209,7 +266,6 @@ sgi) if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" - # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in @@ -217,19 +273,15 @@ sgi) # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr "$nl" ' ' >> "$depfile" + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" - # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" + make_dummy_depfile fi rm -f "$tmpdepfile" ;; @@ -247,9 +299,8 @@ aix) # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + set_dir_from "$object" + set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u @@ -262,9 +313,7 @@ aix) "$@" -M fi stat=$? - - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi @@ -273,65 +322,113 @@ aix) do test -f "$tmpdepfile" && break done - if test -f "$tmpdepfile"; then - # Each line is of the form 'foo.o: dependent.h'. - # Do two passes, one to just change these to - # '$object: dependent.h' and one to simply 'dependent.h:'. - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" + aix_post_process_depfile ;; -icc) - # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. - # However on - # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using '\': - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - # tcc 0.9.26 (FIXME still under development at the moment of writing) - # will emit a similar output, but also prepend the continuation lines - # with horizontal tabulation characters. +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" - # Each line is of the form 'foo.o: dependent.h', - # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to - # '$object: dependent.h' and one to simply 'dependent.h:'. - sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ - < "$tmpdepfile" > "$depfile" - sed ' - s/[ '"$tab"'][ '"$tab"']*/ /g - s/^ *// - s/ *\\*$// - s/^[^:]*: *// - /^$/d - /:$/d - s/$/ :/ - ' < "$tmpdepfile" >> "$depfile" + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -342,9 +439,8 @@ hp2) # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + set_dir_from "$object" + set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d @@ -355,8 +451,7 @@ hp2) "$@" +Maked fi stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi @@ -366,76 +461,61 @@ hp2) test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" else - echo "#dummy" > "$depfile" + make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in 'foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; msvc7) if test "$libtool" = yes; then @@ -446,8 +526,7 @@ msvc7) "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" - if test "$stat" = 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -473,6 +552,7 @@ $ { G p }' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; @@ -524,13 +604,14 @@ dashmstdout) # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | - sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" - tr ' ' "$nl" < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -583,10 +664,12 @@ makedepend) # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; @@ -622,10 +705,10 @@ cpp) esac done - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" @@ -657,15 +740,15 @@ msvisualcpp) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; + set fnord "$@" + shift + shift + ;; *) - set fnord "$@" "$arg" - shift - shift - ;; + set fnord "$@" "$arg" + shift + shift + ;; esac done "$@" -E 2>/dev/null | diff --git a/docs/FAQ.txt b/docs/FAQ.txt index 0eff1a4..8ce0b14 100644 --- a/docs/FAQ.txt +++ b/docs/FAQ.txt @@ -10,15 +10,6 @@ right? If not, go read it now, then come back to this file if your question wasn't answered in there. -== upsstats says 'Error: can't open template file (upsstats.html)'. -Go into your configuration path (/usr/local/ups/etc by default) and -copy the sample template files over to their real names. The sample -template files are installed with 'make install' and can -also be found inside the source distribution in the conf directory. - -== upsmon fails the login and says 'username required' now. -Go read the link:UPGRADING[UPGRADING] file again. - == My UPS driver now says it's 'broken', and won't start. What now? Or a variation like... @@ -108,6 +99,19 @@ tcp-wrappers or kernel firewall rules. This isn't a NUT-specific limitation - it applies equally to your web server or mailer daemon. +== Which UPS should I buy? + +One with a no-questions-asked money-back guarantee. Seriously. The NUT +developers cannot take responsibility for recommending an UPS (see the LICENSE +file for more details on the explicit lack of warranty), only to find out that +the manufacturer has changed the internals of the UPS without changing the +model name. + +That said, from time to time, certain vendors have helped out by providing +hardware for testing, results of their testing efforts, or protocol +specifications. We try to publish this information on the NUT website, so you +can take this into consideration when selecting an UPS brand. + == I have an APC Smart-UPS connected with a grey APC serial cable and it won't work. The Back-UPS type in the genericups driver works but then I don't get to use @@ -158,7 +162,7 @@ hardware properly. *Answer 1* -I try to follow the "tool for the job" philosophy. It may mean +We try to follow the "tool for the job" philosophy. It may mean more programs running, but the flexibility you get is usually worth it. @@ -172,7 +176,8 @@ Besides, if upsmon were rolled into upsd, upsd would get even bigger than it is now. You'd have one less process, but the RAM consumption would be pretty close to now. -See data-room.txt for more configuration ideas and explanations. +See the "Data Room" section in docs/config-notes.txt for more configuration +ideas and explanations. *Answer 2* @@ -225,7 +230,7 @@ driver supports the older Best hardware. There is a similar problem with the tripplite_usb driver: it only supports the older, proprietary protocol. Newer standards-compliant Tripp Lite UPS models are supported by usbhid-ups. We name drivers based on the information -available at that time, which often is incomplete. +available at the time the driver was first written, which often is incomplete. == What's this about 'data stale'? @@ -237,9 +242,9 @@ If this happens to you, make sure your driver is still running. Also look at the syslog. Sometimes the driver loses the connection to the UPS, and that will also make the data go stale. -Note: some very slow machines have trouble keeping up with the -serial ports during periods of extreme load. My old 486 used to -flip between "stale" and "OK" while running backups. +This might also happen on certain virtualization platforms. If you cannot +reproduce the problem on a physical machine, please report the bug to the +virtualization software vendor. If this happens a lot, you might consider cranking up DEADTIME in the upsmon.conf to suppress some of the warnings for shorter @@ -250,8 +255,8 @@ what's going on with the UPS. Note: some drivers occasionally need more time to update than the default value of MAXAGE (in upsd.conf) allows. As a result, they are temporarily marked stale even though everything is fine. This -can happen with MGE Ellipse equipment - see the mge-shut man page. -In such cases, you can raise the value of MAXAGE to avoid these +can happen with MGE Ellipse equipment - see the mge-shut or usbhid-ups man +pages. In such cases, you can raise the value of MAXAGE to avoid these warnings; try a value like 25 or 30. == Why do the client programs say 'Driver not connected' when I try to run them? @@ -267,6 +272,17 @@ Note: if you jumped in with both feet and didn't follow the INSTALL.nut document, you probably started upsd by itself. You have to run 'upsdrvctl start' to start the drivers after configuring ups.conf. +== Why don't the pathnames in your documentation match the package I installed? + +Each distribution has conventions for where specific file types should be +stored. The NUT project cannot possibly track all of these conventions, so the +documentation assumes the default installation directory prefix of +`/usr/local/ups` when describing file locations. The distributions tend not to +change the base name of the files, so you can search for drivers and +configuration files in the package database of installed files. For instance, +on Debian or Ubuntu derivatives, you can use `dpkg --search usbhid-ups` to see +where the drivers are stored. + == Everything works perfectly during the shutdown, and the UPS comes back on, but my system stays off. What's happening? Assuming you don't have the problem in the next question, then you @@ -518,45 +534,65 @@ file. There are several driver to support USB models. -- usbhid-ups supports various manufacturers complying to the HID standard, -- tripplite_usb supports various Tripp-Lite units, +- usbhid-ups supports various manufacturers complying to the HID Power Device Class (PDC) standard, +- tripplite_usb supports various older Tripp-Lite units (with USB ProductID 0001) - bcmxcp_usb supports various Powerware units, -- blazer_usb supports various manufacturers that use the Megatec / Q1 protocol. +- nutdrv_qx and blazer_usb support various manufacturers that use the Megatec / Q1 protocol. Refer to the 'driver-name' (8) manpage for more information. -== What is this usbhid-ups (formerly newhidups) about? - -The basic USB UPS support was done until NUT 2.2 using hidups. To allow -a wider support accross platforms for USB/HID compliant devices, -usbhid-ups driver uses libusb (which is available for a wide range of -operating systems) and libhid (currently, a modified internal version -of it). - -As of NUT 2.2, usbhid-ups completely replaces the legacy hidups driver, -and provides support for various manufacturers. At that time, newhidups was -renamed to usbhid-ups. - -usbhid-ups is built automatically if possible (libusb development files -need to be installed) and installed by the "make install" command. +You can also consult the Hardware Compatibility List (HCL) and filter on USB: +http://www.networkupstools.org/stable-hcl.html?connection=USB == My USB UPS is supported but doesn't work! On Linux, udev rules are provided to set the correct permissions on device file. This allows the NUT driver to communicate with the UPS, through this device file. -However, the driver may still failed to start and support the device, with a +However, the driver may still fail to start and support the device, with a message like: failed to claim USB device: could not claim interface 0: Operation not permitted -*Operation not permitted* is a message pointing a privilege issue. +*Operation not permitted* is a message pointing to a privilege issue. The most frequent issue is that udev has not actually applied the rule: - if NUT has been freshly installed, -- and if the device USB cord was already plugged when installing nut. +- and if the device USB cord was already plugged when installing NUT. -In this case, just unplug and plug back the USB cord, then restart nut. +In this case, just unplug and plug back the USB cord, then restart NUT. + +There was a mistake in the naming of the NUT udev rules file which resulted in +the rules being overridden by another udev configuration file. While this has +been fixed in the Git master branch, your distribution may still be affected. +Details are available in the following Github issue: +https://github.com/networkupstools/nut/issues/140 + +== Why do you not use the Linux kernel HID driver when communicating with USB UPSes? + +When the `usbhid-ups` was first written, it replaced an older driver `hidups` +which used the Linux kernel USB HID API. At the time, the kernel HID API could +not distinguish between identical Usage IDs that were nested in different +parent IDs, so many common measurements were not available from `hidups`. For +this reason, the libusb approach was chosen, which has the added side effect +of being more portable than the Linux HID API. The Linux hiddev device nodes +have very similar permissions problems as the `/dev/bus/usb` nodes that the +libusb approach uses. + +Due to difficulties in running libusb on OS X and Windows, those platforms +might benefit more from a native HID approach. + +== I get a message from the kernel that the driver "did not claim interface 0 before use" + +On Linux, if two copies of a driver are competing for the UPS, these messages +will appear in dmesg: + + usbfs: process 29641 (usbhid-ups) did not claim interface 0 before use + +This can be a symptom of a source install conflicting with a package install. +There is a rudimetary locking mechanism in NUT, but there is a chance that the +packages might not use the same directory as the NUT default, and the conflict +will be reported by the kernel. == Why doesn't my package work? @@ -587,23 +623,50 @@ root, start upsmon with -p and it will go back to being one big process. This is not recommended, so don't blame us if something bad happens in this mode. +== I get the following error while building: `make[4]: don't know how to make HP-UX/nut-drvctl.sh. Stop` + +NUT still has some hidden dependencies on GNU Make which show up while running +`make distcheck`. If you are running `make distcheck` or its variants, you +will need to install GNU Make (`devel/gmake` in the ports tree), which is +incidentally what the official FreeBSD port of NUT does for all builds. + == I have 'some problem' with 'some old version' ... Get the latest stable release, and see if it still happens. If it goes away, it means someone else reported it and got it fixed a long time ago. -If that doesn't work, try the latest development version. +You may want to search the mailing lists to see if someone else has +experienced the same problem. If so, there is a good chance that someone else +has worked through the process necessary to shoehorn the latest NUT version +into your distribution (potentially with unofficial packages). -If your problem is STILL there, then contact the mailing lists. +Some OS distributions contain old versions of NUT. If your hardware is newer +than the NUT release, there is a good chance that support has not been added +yet. Please do not tell us you have the "latest version for Distro XYZ" - even +if the developers are familiar with that distribution, it helps others if you +quote the exact package version. NOTE: check the release date on the version you have. If it's more -than about 6 months old, there's probably a newer stable tree +than about 6-12 months old, there's probably a newer stable tree version out there. +== I built NUT from Git, and it complains about lots of missing files. What happened? + +If you are not actively developing a driver, can you use a snapshot instead? +The NUT instance of Buildbot generates tar files of the latest NUT source +after each successful build, and these snapshots include a prebuilt version of +the `./configure` script. + +Otherwise, you will need recent versions of autoconf, automake, libtool, +asciidoc, a2x and its dependencies for DocBook/dblatex. Rather than publish a +list of the exact versions needed (which will quickly become out of date), we +recommend you consult your distribution's dependency list for building a NUT +package, and use that as a starting point. + == Do I have to use a serial connection to monitor the UPS? What about direct network connections (SNMP or otherwise)? -No. NUT currently support USB communication through several drivers, +NUT currently supports USB communication through several drivers, and also SNMP and XML/HTTP (Eaton and MGE) communications. Since NUT is very extensible, support for a new communication bus can be added @@ -616,15 +679,10 @@ turn an owner into a developer or vice-versa. == What happened to the patch I sent? -If a release goes by and your patch hasn't been included, it was -probably dropped. There can be a lot of patches waiting for -inclusion at some points, and occasionally some have to be -rejected. - -Design issues or severe coding style problems can be the reason -for this. I try to point out what the problems are, but there are -limits. See developers.txt for some pointers on submitting -patches. +We try to prioritize emails with patches, but you should understand that a +simple fix for your bug might be complicated to integrate with the rest of +NUT. Changing the way a fundamental component works, such as USB support, +means a lot of testing to ensure that your fix does not break other drivers. Sometimes patches are put on hold due to a feature freeze. If it doesn't show up once the new version opens up, send it again. @@ -632,7 +690,7 @@ doesn't show up once the new version opens up, send it again. == I'm not much of a programmer. How can I help? There's always work to be done outside of the realm of code bashing. -Documentation might not always be so clear. A user's perspective +Documentation can always be improved. A user's perspective is sometimes needed to appreciate this. Bug reports on a project's documentation are just as valuable as those for the actual source. @@ -686,10 +744,13 @@ upsstats.html and change it from TEMPC to TEMPF. == Why is the mailing list ignoring me? -You probably asked a question that's answered in this FAQ or -somewhere else in the documentation and nobody wants to quote it +You probably asked a question that's answered in this FAQ, or +somewhere else in the documentation, and nobody wants to quote it for you. +There is a small chance that the mailing list spam filter ate your message. +Check the list archives to see if your message appears there. + Convincing the other subscribers that you've actually read down this far might be useful. You might mention "queequeg" for better results. @@ -697,6 +758,22 @@ This URL may also be helpful: http://www.catb.org/~esr/faqs/smart-questions.html +== Why are you so insistent about sending emails to public mailing lists instead of to individuals? + +By and large, NUT is a volunteer effort. By emailing one person, you are +asking them to take care of your question. If you email the list instead, you +give others the opportunity to answer. + +In addition, the mailing lists are publicly archived, and therefore easily +searchable. Chances are, you aren't the only person who will ever have that +question. + +== If you want mailing list replies to go to the list, why don't you add a Reply-To: header? + +We are not going to rehash all of the arguments for and against this in a +simple FAQ entry. If you intend for your reply to go to more than just the +last person who posted, it is not too much trouble to hit "reply all". + == I found some information about another kind of UPS protocol you don't support yet, but I don't know what to do with it. Can you help? If you're not a programmer, you can still help others by making diff --git a/docs/Makefile.am b/docs/Makefile.am index c7907c2..8ca7afd 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -32,6 +32,7 @@ CABLES_IMAGES = images/cables/73-0724.png images/cables/940-0024C.jpg \ images/cables/belkin-f6cx-rkm-xu-cable.jpg images/cables/Lansafecable.jpg \ images/cables/mac-940-0024C.png images/cables/mge-66049.png \ images/cables/mge-db9-rj12.jpg images/cables/mge-db9-rj45.jpg \ + images/cables/mge-usb-rj45.jpg \ images/cables/SOLA-330.png ALL_TXT_SRC = nut-names.txt $(USER_MANUAL_DEPS) $(DEVELOPER_GUIDE_DEPS) \ @@ -39,7 +40,7 @@ ALL_TXT_SRC = nut-names.txt $(USER_MANUAL_DEPS) $(DEVELOPER_GUIDE_DEPS) \ NUT_SPELL_DICT = nut.dict EXTRA_DIST = $(ALL_TXT_SRC) $(SHARED_DEPS) $(IMAGE_FILES) \ - $(CABLES_IMAGES) docinfo.xml $(NUT_SPELL_DICT) \ + $(CABLES_IMAGES) $(NUT_SPELL_DICT) \ common.xsl xhtml.xsl chunked.xsl ASCIIDOC_HTML_SINGLE = user-manual.html \ @@ -90,8 +91,10 @@ packager-guide.html packager-guide.chunked packager-guide.pdf: packager-guide.tx # variable ASCIIDOC_VERBOSE to "-v", ie: # $ ASCIIDOC_VERBOSE=-v make A2X_COMMON_OPTS = $(ASCIIDOC_VERBOSE) --attribute icons \ - --attribute localdate=`TZ=UTC date +%Y-%m-%d` \ - --attribute localtime=`TZ=UTC date +%H:%M:%S` \ + --xsltproc-opts "--nonet" \ + --xsltproc-opts "--stringparam nut.localdate \"`TZ=UTC date +%Y-%m-%d`\"" \ + --xsltproc-opts "--stringparam nut.localtime \"`TZ=UTC date +%H:%M:%S`\"" \ + --xsltproc-opts "--stringparam nut.nutversion \"@PACKAGE_VERSION@\"" \ --attribute iconsdir=$(srcdir)/images \ --attribute=badges \ --attribute=external_title \ diff --git a/docs/Makefile.in b/docs/Makefile.in index ad9ac5c..037296f 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,23 +14,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -52,7 +79,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = docs -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/docinfo.xml.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -79,17 +107,30 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = +CONFIG_CLEAN_FILES = docinfo.xml CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -97,9 +138,29 @@ am__can_run_installinfo = \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) @@ -132,6 +193,7 @@ am__relativize = \ A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -238,12 +300,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -288,6 +353,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -343,6 +409,7 @@ CABLES_IMAGES = images/cables/73-0724.png images/cables/940-0024C.jpg \ images/cables/belkin-f6cx-rkm-xu-cable.jpg images/cables/Lansafecable.jpg \ images/cables/mac-940-0024C.png images/cables/mge-66049.png \ images/cables/mge-db9-rj12.jpg images/cables/mge-db9-rj45.jpg \ + images/cables/mge-usb-rj45.jpg \ images/cables/SOLA-330.png ALL_TXT_SRC = nut-names.txt $(USER_MANUAL_DEPS) $(DEVELOPER_GUIDE_DEPS) \ @@ -350,7 +417,7 @@ ALL_TXT_SRC = nut-names.txt $(USER_MANUAL_DEPS) $(DEVELOPER_GUIDE_DEPS) \ NUT_SPELL_DICT = nut.dict EXTRA_DIST = $(ALL_TXT_SRC) $(SHARED_DEPS) $(IMAGE_FILES) \ - $(CABLES_IMAGES) docinfo.xml $(NUT_SPELL_DICT) \ + $(CABLES_IMAGES) $(NUT_SPELL_DICT) \ common.xsl xhtml.xsl chunked.xsl ASCIIDOC_HTML_SINGLE = user-manual.html \ @@ -387,8 +454,10 @@ FULL_DEVELOPER_GUIDE_DEPS = $(DEVELOPER_GUIDE_DEPS) $(SHARED_DEPS) \ # variable ASCIIDOC_VERBOSE to "-v", ie: # $ ASCIIDOC_VERBOSE=-v make A2X_COMMON_OPTS = $(ASCIIDOC_VERBOSE) --attribute icons \ - --attribute localdate=`TZ=UTC date +%Y-%m-%d` \ - --attribute localtime=`TZ=UTC date +%H:%M:%S` \ + --xsltproc-opts "--nonet" \ + --xsltproc-opts "--stringparam nut.localdate \"`TZ=UTC date +%Y-%m-%d`\"" \ + --xsltproc-opts "--stringparam nut.localtime \"`TZ=UTC date +%H:%M:%S`\"" \ + --xsltproc-opts "--stringparam nut.nutversion \"@PACKAGE_VERSION@\"" \ --attribute iconsdir=$(srcdir)/images \ --attribute=badges \ --attribute=external_title \ @@ -429,6 +498,8 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): +docinfo.xml: $(top_builddir)/config.status $(srcdir)/docinfo.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo @@ -437,22 +508,25 @@ clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -467,57 +541,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -533,12 +562,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -550,15 +574,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -567,6 +587,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -725,12 +760,11 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - clean-local ctags ctags-recursive distclean distclean-generic \ +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool clean-local \ + cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ @@ -739,8 +773,8 @@ uninstall-am: install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am all: doc diff --git a/docs/cables.txt b/docs/cables.txt index fde660a..afc2c29 100644 --- a/docs/cables.txt +++ b/docs/cables.txt @@ -55,7 +55,7 @@ Documents in this section are provided courtesy of Eaton. MGE Office Protection Systems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The two first cables also applies to MGE UPS SYSTEMS. +The three first cables also applies to MGE UPS SYSTEMS and Eaton. DB9-DB9 cable (ref 66049) ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -67,11 +67,36 @@ image::images/cables/mge-66049.png[DB9-DB9 cable] DB9-RJ45 cable ^^^^^^^^^^^^^^ -This cable is used on the more recent models, including Ellipse MAX, Protection -Station, ... +This cable is used on the more recent models, including Ellipse MAX, +Protection Station, ... image::images/cables/mge-db9-rj45.jpg[DB9-RJ45 cable] +NMC DB9-RJ45 cable +^^^^^^^^^^^^^^^^^^ + +The following applies to the MGE 66102 NMC (Network Management Card), and +possibly other models. The NMC connection is an 8P8C RJ45-style jack. + +|==== +|Signal | PC | NMC +| | 1,4,6 | +|TxD | 2 | 3 +|RxD | 3 | 6 +|GND | 5 | 4 +| | 7,8 | +| | shield | shield +|==== + + +USB-RJ45 cable +^^^^^^^^^^^^^^ + +This cable is used also on the more recent models, including Ellipse MAX, +Protection Station, ... + +image::images/cables/mge-usb-rj45.jpg[USB-RJ45 cable] + DB9-RJ12 cable ^^^^^^^^^^^^^^ @@ -104,17 +129,37 @@ T700, T1000, T1500, T1500j, T700h, T1000h, T1500h, R1500, R1500j, R1500h, T2000, T2000j, T2400h, T2400h-NA, R3000 / R3000j, R3000h, R3000h-International, R3000h-NA, R6000h-NA, R6000i, R6000j. -UPS PC 9 pin connector + UPS PC 9 pin connector - 1 --------- 3 - 2 --------- 2 - 4 -\ - 4 --------- 5 | - 6 -/ - 6 --------- 7 + 1 --------- 3 + 2 --------- 2 + 4 -\ + 4 --------- 5 | + 6 -/ + 6 --------- 7 Contributed by Kjell Claesson and Arnaud Quette. +Phoenixtec (Best Power) +----------------------- + +Many Best Power units (including the Patriot Pro II) have a female DB-9 socket +with a non-standard pinout. + +|==== +|Signal | PC | UPS +| | 1,4,6 | NC +|TxD | 2 | 2 +|RxD | 3 | 1 +|GND | 5 | 4 +| | 7,8 | NC +|==== + +Sources: + +* http://pinoutsguide.com/UPS/best_power_pinout.shtml +* http://lit.powerware.com/ll_download.asp?file=m_patriotproii_jan99.pdf +* Stan Gammons Tripp-Lite ---------- diff --git a/docs/chunked.xsl b/docs/chunked.xsl index a8b698c..7f09a80 100644 --- a/docs/chunked.xsl +++ b/docs/chunked.xsl @@ -14,9 +14,4 @@ images/icons/ images/icons/ - - - - - diff --git a/docs/common.xsl b/docs/common.xsl index 2e5cbc2..eed9099 100644 --- a/docs/common.xsl +++ b/docs/common.xsl @@ -103,4 +103,22 @@ book nop + + + + + + + + + + + + + + + diff --git a/docs/config-notes.txt b/docs/config-notes.txt index 700d8fa..021033b 100644 --- a/docs/config-notes.txt +++ b/docs/config-notes.txt @@ -76,7 +76,7 @@ Much better. The *=* character should be used with care too. There should be only one "simple" *=* character in a line: between the parameter name and its value. -All other *=* characters should be either escaped or whithin "quotes". +All other *=* characters should be either escaped or within "quotes". password = 123=123 @@ -648,9 +648,9 @@ shut down completely in the middle. In order for this to work, you need to shutdown NUT (UPS driver, upsd server and upsmon client) in the suspend script and start them again in the resume script. Don't try to keep them running. The upsd server -will latch the FSD state (so it won't be useable after resuming) and so +will latch the FSD state (so it won't be usable after resuming) and so will the upsmon client. Some drivers may work after resuming, but many -don't and some UPS'es will require re-initialization, so it's best not +don't and some UPSs will require re-initialization, so it's best not to keep this running either. After stopping driver, server and client you'll have to send the UPS diff --git a/docs/configure.txt b/docs/configure.txt index 282a1c9..9b12481 100644 --- a/docs/configure.txt +++ b/docs/configure.txt @@ -44,6 +44,11 @@ on servers. Note that you need to install freeipmi (0.8.5 or higher) development package or files. + --with-linux_i2c + +Build and install i2c drivers (default: auto-detect) +Note that you need to install libi2c development package or files. + --with-drivers=,,... Specify exactly which driver or drivers to build and install (this @@ -101,7 +106,7 @@ library). Enable SSL support, using either Mozilla NSS or OpenSSL. If both are present, and nothing was specified, OpenSSL support will -be prefered. Read docs/security.txt for instructions on SSL support. +be preferred. Read docs/security.txt for instructions on SSL support. --with-wrap (default: auto-detect) @@ -115,7 +120,8 @@ Enable IPv6 support. --with-avahi (default: auto-detect) Build and install Avahi support, to publish NUT server availability -using mDNS protocol. +using mDNS protocol. This requires Avahi development files for the +Core and Client parts. --with-libltdl (default: auto-detect) diff --git a/docs/developers.txt b/docs/developers.txt index 7b2ec36..9d52065 100644 --- a/docs/developers.txt +++ b/docs/developers.txt @@ -371,16 +371,22 @@ Most developers will be well served by committing to their own Git repository, and having the NUT team merge their changes. Git offers a little more flexibility than the +svn update+ command. You may -fetch other developers' changes from SVN into your repository, but hold off on +fetch other developers' changes into your repository, but hold off on actually combining them with your branch until you have compared the two branches (for instance, with `gitk --all`). Git also allows you to accumulate more than one commit worth of changes before pushing to another repository. +This allows development to continue without a constant network connection. For a quick change to a file in the Git working copy, you can use `git diff` to generate a patch to send to the nut-upsdev mailing list. If you have more extensive changes, you can use `git format-patch` on a complete commit or branch, and send the resulting series of patches to the list. +If you use GitHub's web-based editor to make changes, it tends to create lots +of small commits, one per change per file. Unless there is reason to keep the +intermediate history, we will probably collapse the entire branch into one +commit with `git rebase -i` before merging. + The link:https://git.wiki.kernel.org/index.php/GitSvnCrashCourse[GitSvnCrashCourse] wiki page has some useful information for long-time users of Subversion. @@ -479,7 +485,7 @@ best to add some context such as the commit title or a date. You may notice that some older commits have `[[SVN:####]]` tags and Fossil-ID footers. These were lifted from the old SVN commit messages using reposurgeon, -and should not be used as a guide for future commits. +and should *not* be used as a guide for future commits. Repository etiquette and quality assurance ------------------------------------------ @@ -500,28 +506,9 @@ will need to rebase on top of your rebased branch. Obviously, this hinders collaboration. In this case, we recommend that you rebase only in your private repository, and push when things are ready for discussion. Merging instead of rebasing will help with collaboration, but please do not turn the repository -history into a pile of spaghetti by merging unnecessarily. Be sure that your -commit messages are descriptive when merging. - -Before pushing your commits upstream, please remember to run +make -distcheck-light+. This checks that the Makefiles are not broken, that all the -relevant files are distributed, and that there are no compilation or -installation errors. - -Running +make distcheck-light+ is especially important if you have added or -removed files, or updated configure.in or some Makefile.am. Remember: simply -adding a file to Git does not mean it will be distributed. To distribute a -file, you must update the corresponding Makefile.am. - -There is also +make distcheck+, which runs an even stricter set of -tests than +make distcheck-light+, but will not work unless you have all the -optional libraries and features installed. - -You may create as many branches as you like in your local Git repository. When -using Git, our preferred way to combine small changes with the upstream -upstream repository is to use `git rebase` on your local branch. This is -equivalent to treating your branch as a series of patches, and re-applying your -patches on top of the upstream changes. +history into a pile of spaghetti by merging unnecessarily. (Test merges can be +done on integration branches, which can be discarded if the merge is trivial.) +Be sure that your commit messages are descriptive when merging. If you haven't created a commit out of your local changes yet, and you want to fetch the latest code, you can also use +git stash+ before pulling, then +git @@ -561,4 +548,49 @@ Here is an example workflow: If you are new to Git, but are familiar with SVN, the link:http://git-scm.com/course/svn.html[following link] may be of use. +[[building]] +Building the Code +----------------- + +For a developer, the NUT build process starts with `./autogen.sh`. This script +generates the `./configure` script that end users typically invoke to build +NUT. If you are making a number of changes to the NUT source tree, configuring +with the `--enable-maintainer-mode` flag will ensure that after you change +`Makefile.am`, the `Makefile.in` and `Makefile` get regenerated. At a +minimum, you will need: + +* autoconf +* automake +* libtool +* Python +* Perl + +After running `./autogen.sh`, you can pass your local configuration options to +`./configure` and run `make` from the top-level directory. To avoid the need +for root privileges when testing new NUT code, you may wish to use +`--prefix=$HOME/local/nut --with-statepath=/tmp`. You can also keep +compilation times down by only building the driver you are currently working +on: `--with-drivers=driver1,dummy-ups`. + +Before pushing your commits upstream, please run +make distcheck-light+. This +checks that the Makefiles are not broken, that all the +relevant files are distributed, and that there are no compilation or +installation errors. Note that this requires all of the dependencies necessary +to build the documentation, including asciidoc, a2x, xsltproc, dblatex and any +additional XSL stylesheets. + +Running +make distcheck-light+ is especially important if you have added or +removed files, or updated configure.in or some Makefile.am. Remember: simply +adding a file to Git does not mean it will be distributed. To distribute a +file, you must update the corresponding Makefile.am. + +There is also +make distcheck+, which runs an even stricter set of +tests than +make distcheck-light+, but will not work unless you have all the +optional libraries and features installed. + +Even if you do not use your distribution's packages of NUT, installing the +distribution's list of build dependencies for NUT can reduce the amount of +trial-and-error when installing dependencies. For instance, in Debian, you can +run `apt-get build-dep nut` to install all of the auto* tools as well as any +development libraries and headers. diff --git a/docs/docinfo.xml b/docs/docinfo.xml deleted file mode 100644 index a8650ec..0000000 --- a/docs/docinfo.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - 2.6.0 - 2011-01-14 - - - First release of AsciiDoc documentation for Network UPS Tools (NUT). - - - diff --git a/docs/docinfo.xml.in b/docs/docinfo.xml.in new file mode 100644 index 0000000..ed3faaf --- /dev/null +++ b/docs/docinfo.xml.in @@ -0,0 +1,23 @@ + + + + + @PACKAGE_VERSION@ + @now@ + + + Current release of Network UPS Tools (NUT). + + + + + + 2.6.0 + 2011-01-14 + + + First release of AsciiDoc documentation for Network UPS Tools (NUT). + + + + diff --git a/docs/documentation.txt b/docs/documentation.txt index b7cf5ee..4483117 100644 --- a/docs/documentation.txt +++ b/docs/documentation.txt @@ -3,6 +3,7 @@ Documentation ============= endif::website[] + User Documentation ------------------ @@ -11,12 +12,14 @@ ifdef::website[] - NUT User Manual (link:docs/user-manual.chunked/index.html[online]) (link:docs/user-manual.pdf[PDF]) - Cables information (link:cables.html[online]) (link:docs/cables.pdf[PDF]) - link:docs/man/index.html#User_man[User manual pages] +- link:ddl/index.html#_supported_devices[Devices Dumps Library (DDL)]: Provides information on how devices are supported endif::website[] ifndef::website[] - link:../FAQ.html[FAQ - Frequently Asked Questions] - linkdoc:user-manual[NUT user manual] - <> - link:../man/index.html#User_man[User manual pages] +- link:http://www.networkupstools.org/ddl/index.html#_supported_devices[Devices Dumps Library (DDL)]: Provides information on how devices are supported endif::website[] Developer Documentation @@ -28,6 +31,7 @@ ifdef::website[] - link:ups-protocols.html[UPS protocols library] - link:docs/man/index.html#Developer_man[Developer manual pages] - link:nut-qa.html[NUT Quality Assurance] +- link:ddl/index.html[Devices Dumps Library (DDL)]: Provides simulation data to the linkman:dummy-ups[8] driver endif::website[] ifndef::website[] - linkdoc:developer-guide[NUT Developer Guide] @@ -35,6 +39,7 @@ ifndef::website[] - link:ups-protocols.html[UPS protocols library] - link:../man/index.html#Developer_man[Developer manual pages] - link:nut-qa.html[NUT Quality Assurance] +- link:http://www.networkupstools.org/ddl/index.html[Devices Dumps Library (DDL)]: Provides simulation data to the linkman:dummy-ups[8] driver endif::website[] Offsite Links @@ -51,6 +56,7 @@ These are general information about UPS and PDU. These are writeups by users of the software. +- link:http://rogerprice.org/NUT.html[NUT Setup with openSUSE] '(Roger Price)' - link:http://www.dimat.unina2.it/LCS/MonitoraggioUpsNutUbuntu10-eng.htm[Deploying NUT on an Ubuntu 10.04 cluster] '(Stefano Angelone)' - link:http://blog.shadypixel.com/monitoring-a-ups-with-nut-on-debian-or-ubuntu-linux[Monitoring a UPS with nut on Debian or Ubuntu Linux] '(Avery Fay)' - link:http://linux.developpez.com/cours/upsusb/[Installation et gestion d'un UPS USB en réseau sous linux] '(Olivier Van Hoof, french)' @@ -67,5 +73,5 @@ These are writeups by users of the software. News articles and Press releases -------------------------------- -- link:http://www.crn.com/white-box/199000818?pgno=1[Linux UPS Without Tears] '(A. Lizard)' -- link:http://networking.earthweb.com/netsysm/article.php/10954_3295841_1[Graceful UPS shutdowns on Linux] '(Carla Schroder)' +- link:http://www.crn.com/news/channel-programs/199000818/linux-ups-without-tears.htm[Linux UPS Without Tears] '(A. Lizard)' +- link:http://www.enterprisenetworkingplanet.com/netsysm/article.php/3295841/Graceful-UPS-Shutdowns-on-Linux.htm[Graceful UPS shutdowns on Linux] '(Carla Schroder)' diff --git a/docs/download.txt b/docs/download.txt index 8436094..3991b1c 100644 --- a/docs/download.txt +++ b/docs/download.txt @@ -15,7 +15,7 @@ ifdef::website[] link:docs/user-manual.chunked/ar01s09.html#verifySourceSig[following procedure] endif::website[] ifndef::website[] -- Else, you can read the <>. +<>. endif::website[] to do so. ================================================================================ @@ -110,7 +110,8 @@ Mandriva, link:https://admin.fedoraproject.org/pkgdb/acls/name/nut[Red Hat / Fedora], link:http://software.opensuse.org/package/nut[Novell Suse / openSUSE], link:https://forum.openwrt.org/viewtopic.php?id=26269[OpenWrt], -link:http://packages.ubuntu.com/nut[Ubuntu]. +link:http://packages.ubuntu.com/nut[Ubuntu], +link:https://github.com/voidlinux/xbps-packages/blob/master/srcpkgs/network-ups-tools/template[Void Linux]. - BSD systems: link:http://www.FreeBSD.org/cgi/ports.cgi?query=^nut-&stype=name[FreeBSD], @@ -143,7 +144,7 @@ Virtualization packages VMware ~~~~~~ -- NUT client for ESXi 5.0 (offsite, René Garcia) +- NUT client 2.7.2 for ESXi 5.x (offsite, René Garcia) * link:http://rene.margar.fr/2012/05/client-nut-pour-esxi-5-0/[blog entry (French)] - * link:http://rene.margar.fr/downloads/NutClient-ESXi500-1.2.0.tar.gz[VIB package (v1.2.0)] + * link:http://rene.margar.fr/downloads/NutClient-ESXi500-1.3.0.tar.gz[VIB package (v1.3.0)] diff --git a/docs/features.txt b/docs/features.txt index 65690ba..8e25259 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -120,7 +120,7 @@ no mysteries or secrets in your critical monitoring tools. UPS management and control -------------------------- -- Writable variables may be edited on higher end equipment for local customizations +- Writable variables may be edited on higher end equipment for local customization - Status monitoring can generate notifications (email/pager/SMS/...) on alert conditions diff --git a/docs/history.txt b/docs/history.txt index da66cec..e31c933 100644 --- a/docs/history.txt +++ b/docs/history.txt @@ -234,7 +234,7 @@ On July 25, 2003, 1.4.0 was released. It contained support for both the old "REQ July 2003: pushing towards 2.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -1.5.0 forked from 1.4.0 and was released on July 29, 2003. The first changes were to throw out anything which was providing compatibilty with the older versions of the software. This means that 1.5 and the eventual 2.0 will not talk to anything older than 1.4. +1.5.0 forked from 1.4.0 and was released on July 29, 2003. The first changes were to throw out anything which was providing compatibility with the older versions of the software. This means that 1.5 and the eventual 2.0 will not talk to anything older than 1.4. This tree continues to evolve with new serial routines for the drivers which are intended to replace the aging upscommon code which dates back to the early 0.x releases. The original routines would call alarm and read in a tight loop while fetching characters. The new functions are much cleaner, and wait for data with select. This makes for much cleaner code and easier strace/ktrace logs, since the number of syscalls has been greatly reduced. diff --git a/docs/images/cables/mge-usb-rj45.jpg b/docs/images/cables/mge-usb-rj45.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9104a5dc4c06d79dc03cb7657fb2d38a6f78314 GIT binary patch literal 13921 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 literal 0 HcmV?d00001 diff --git a/docs/man/Makefile.am b/docs/man/Makefile.am index d45d1f7..e793657 100644 --- a/docs/man/Makefile.am +++ b/docs/man/Makefile.am @@ -516,6 +516,15 @@ endif HTML_MACOSX_MANS = macosx-ups.html +SRC_LINUX_I2C_PAGES = asem.txt +MAN_LINUX_I2C_PAGES = asem.8 + +if WITH_LINUX_I2C + man8_MANS += $(LINUX_I2C_PAGES) +endif + +HTML_LINUX_I2C_MANS = asem.html + # SOME_DRIVERS endif @@ -533,7 +542,8 @@ MAN_MANS = \ $(MAN_NETXML_PAGES) \ $(MAN_POWERMAN_PAGES) \ $(MAN_IPMIPSU_PAGES) \ - $(MAN_MACOSX_PAGES) + $(MAN_MACOSX_PAGES) \ + $(MAN_LINUX_I2C_PAGES) # distribute everything, even those not installed by default # Note that 'dist' target requires AsciiDoc! @@ -550,6 +560,7 @@ EXTRA_DIST = \ $(SRC_POWERMAN_PAGES) \ $(SRC_IPMIPSU_PAGES) \ $(SRC_MACOSX_PAGES) \ + $(SRC_LINUX_I2C_PAGES) \ $(MAN_MANS) \ asciidoc.conf @@ -565,7 +576,8 @@ HTML_MANS = \ $(HTML_NETXML_MANS) \ $(HTML_POWERMAN_MANS) \ $(HTML_IPMIPSU_MANS) \ - $(HTML_MACOSX_MANS) + $(HTML_MACOSX_MANS) \ + $(HTML_LINUX_I2C_MANS) all: @@ -581,10 +593,12 @@ if HAVE_ASCIIDOC $(ASCIIDOC) --backend=xhtml11 \ --attribute localdate=`TZ=UTC date +%Y-%m-%d` \ --attribute localtime=`TZ=UTC date +%H:%M:%S` \ + --attribute nutversion="@PACKAGE_VERSION@" \ -o $@ $< ### Prior to Asciidoc ~8.6.8, the --destination-dir flag didn't seem to affect the location of the intermediate .xml file. A2X_MANPAGE_OPTS = --doctype manpage --format manpage \ + --xsltproc-opts "--nonet" \ --attribute mansource="Network UPS Tools" \ --attribute manversion="@PACKAGE_VERSION@" \ --attribute manmanual="NUT Manual" \ @@ -605,18 +619,48 @@ A2X_MANPAGE_OPTS = --doctype manpage --format manpage \ else !HAVE_ASCIIDOC .txt.html: - @echo "Not (re)building $@ manual page, since 'asciidoc' was not found." + @if [ -r "$@" ]; then \ + echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ + else \ + echo "Could not find prebuilt $@ manual page." ; \ + echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ + exit 1; \ + fi .txt.1: - @echo "Using existing $@ manual page, since 'asciidoc' was not found." + @if [ -r "$@" ]; then \ + echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ + else \ + echo "Could not find prebuilt $@ manual page." ; \ + echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ + exit 1; \ + fi .txt.3: - @echo "Using existing $@ manual page, since 'asciidoc' was not found." + @if [ -r "$@" ]; then \ + echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ + else \ + echo "Could not find prebuilt $@ manual page." ; \ + echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ + exit 1; \ + fi .txt.5: - @echo "Using existing $@ manual page, since 'asciidoc' was not found." + @if [ -r "$@" ]; then \ + echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ + else \ + echo "Could not find prebuilt $@ manual page." ; \ + echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ + exit 1; \ + fi .txt.8: - @echo "Using existing $@ manual page, since 'asciidoc' was not found." + @if [ -r "$@" ]; then \ + echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ + else \ + echo "Could not find prebuilt $@ manual page." ; \ + echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ + exit 1; \ + fi endif !HAVE_ASCIIDOC diff --git a/docs/man/Makefile.in b/docs/man/Makefile.in index 7936892..e2fb1a8 100644 --- a/docs/man/Makefile.in +++ b/docs/man/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -29,23 +28,51 @@ # FIXME: investigate an autogen.sh hook # - Ref: http://www.gnu.org/software/hello/manual/automake/Man-pages.html VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -79,8 +106,9 @@ target_triplet = @target@ @SOME_DRIVERS_FALSE@@WITH_LIBPOWERMAN_TRUE@am__append_8 = $(MAN_POWERMAN_PAGES) @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__append_9 = $(MAN_IPMIPSU_PAGES) @SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__append_10 = $(MAN_MACOSX_PAGES) +@SOME_DRIVERS_FALSE@@WITH_LINUX_I2C_TRUE@am__append_11 = $(LINUX_I2C_PAGES) subdir = docs/man -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -109,6 +137,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -151,10 +191,12 @@ man5dir = $(mandir)/man5 man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -261,12 +303,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -311,6 +356,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -384,7 +430,7 @@ MAN_CLIENT_PAGES = \ man8_MANS = $(MAN_CLIENT_PAGES) $(MAN_TOOL_PAGES) $(am__append_2) \ $(am__append_3) $(am__append_4) $(am__append_5) \ $(am__append_6) $(am__append_7) $(am__append_8) \ - $(am__append_9) $(am__append_10) + $(am__append_9) $(am__append_10) $(am__append_11) HTML_CLIENT_MANS = \ nutupsdrv.html \ upsc.html \ @@ -782,6 +828,9 @@ HTML_DEV_MANS = \ @SOME_DRIVERS_FALSE@SRC_MACOSX_PAGES = macosx-ups.txt @SOME_DRIVERS_FALSE@MAN_MACOSX_PAGES = macosx-ups.8 @SOME_DRIVERS_FALSE@HTML_MACOSX_MANS = macosx-ups.html +@SOME_DRIVERS_FALSE@SRC_LINUX_I2C_PAGES = asem.txt +@SOME_DRIVERS_FALSE@MAN_LINUX_I2C_PAGES = asem.8 +@SOME_DRIVERS_FALSE@HTML_LINUX_I2C_MANS = asem.html # SOME_DRIVERS MAN_MANS = \ @@ -798,7 +847,8 @@ MAN_MANS = \ $(MAN_NETXML_PAGES) \ $(MAN_POWERMAN_PAGES) \ $(MAN_IPMIPSU_PAGES) \ - $(MAN_MACOSX_PAGES) + $(MAN_MACOSX_PAGES) \ + $(MAN_LINUX_I2C_PAGES) # distribute everything, even those not installed by default @@ -816,6 +866,7 @@ EXTRA_DIST = \ $(SRC_POWERMAN_PAGES) \ $(SRC_IPMIPSU_PAGES) \ $(SRC_MACOSX_PAGES) \ + $(SRC_LINUX_I2C_PAGES) \ $(MAN_MANS) \ asciidoc.conf @@ -831,13 +882,15 @@ HTML_MANS = \ $(HTML_NETXML_MANS) \ $(HTML_POWERMAN_MANS) \ $(HTML_IPMIPSU_MANS) \ - $(HTML_MACOSX_MANS) + $(HTML_MACOSX_MANS) \ + $(HTML_LINUX_I2C_MANS) CLEANFILES = *.xml *.html SUFFIXES = .txt .html .1 .3 .5 .8 ### Prior to Asciidoc ~8.6.8, the --destination-dir flag didn't seem to affect the location of the intermediate .xml file. @HAVE_ASCIIDOC_TRUE@A2X_MANPAGE_OPTS = --doctype manpage --format manpage \ +@HAVE_ASCIIDOC_TRUE@ --xsltproc-opts "--nonet" \ @HAVE_ASCIIDOC_TRUE@ --attribute mansource="Network UPS Tools" \ @HAVE_ASCIIDOC_TRUE@ --attribute manversion="@PACKAGE_VERSION@" \ @HAVE_ASCIIDOC_TRUE@ --attribute manmanual="NUT Manual" \ @@ -1047,27 +1100,14 @@ uninstall-man8: } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) - @list='$(MANS)'; if test -n "$$list"; then \ - list=`for p in $$list; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ - if test -n "$$list" && \ - grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ - echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ - grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ - echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ - echo " typically \`make maintainer-clean' will remove them" >&2; \ - exit 1; \ - else :; fi; \ - else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -1207,18 +1247,18 @@ uninstall-man: uninstall-man1 uninstall-man3 uninstall-man5 \ .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-man1 \ - install-man3 install-man5 install-man8 install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-man uninstall-man1 uninstall-man3 uninstall-man5 \ - uninstall-man8 + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-man3 install-man5 install-man8 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am uninstall-man uninstall-man1 \ + uninstall-man3 uninstall-man5 uninstall-man8 all: @@ -1229,6 +1269,7 @@ html-man: $(HTML_MANS) index.html @HAVE_ASCIIDOC_TRUE@ $(ASCIIDOC) --backend=xhtml11 \ @HAVE_ASCIIDOC_TRUE@ --attribute localdate=`TZ=UTC date +%Y-%m-%d` \ @HAVE_ASCIIDOC_TRUE@ --attribute localtime=`TZ=UTC date +%H:%M:%S` \ +@HAVE_ASCIIDOC_TRUE@ --attribute nutversion="@PACKAGE_VERSION@" \ @HAVE_ASCIIDOC_TRUE@ -o $@ $< @HAVE_ASCIIDOC_TRUE@.txt.1: @@ -1244,19 +1285,49 @@ html-man: $(HTML_MANS) index.html @HAVE_ASCIIDOC_TRUE@ $(A2X) $(A2X_MANPAGE_OPTS) $< @HAVE_ASCIIDOC_FALSE@.txt.html: -@HAVE_ASCIIDOC_FALSE@ @echo "Not (re)building $@ manual page, since 'asciidoc' was not found." +@HAVE_ASCIIDOC_FALSE@ @if [ -r "$@" ]; then \ +@HAVE_ASCIIDOC_FALSE@ echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ +@HAVE_ASCIIDOC_FALSE@ else \ +@HAVE_ASCIIDOC_FALSE@ echo "Could not find prebuilt $@ manual page." ; \ +@HAVE_ASCIIDOC_FALSE@ echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ +@HAVE_ASCIIDOC_FALSE@ exit 1; \ +@HAVE_ASCIIDOC_FALSE@ fi @HAVE_ASCIIDOC_FALSE@.txt.1: -@HAVE_ASCIIDOC_FALSE@ @echo "Using existing $@ manual page, since 'asciidoc' was not found." +@HAVE_ASCIIDOC_FALSE@ @if [ -r "$@" ]; then \ +@HAVE_ASCIIDOC_FALSE@ echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ +@HAVE_ASCIIDOC_FALSE@ else \ +@HAVE_ASCIIDOC_FALSE@ echo "Could not find prebuilt $@ manual page." ; \ +@HAVE_ASCIIDOC_FALSE@ echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ +@HAVE_ASCIIDOC_FALSE@ exit 1; \ +@HAVE_ASCIIDOC_FALSE@ fi @HAVE_ASCIIDOC_FALSE@.txt.3: -@HAVE_ASCIIDOC_FALSE@ @echo "Using existing $@ manual page, since 'asciidoc' was not found." +@HAVE_ASCIIDOC_FALSE@ @if [ -r "$@" ]; then \ +@HAVE_ASCIIDOC_FALSE@ echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ +@HAVE_ASCIIDOC_FALSE@ else \ +@HAVE_ASCIIDOC_FALSE@ echo "Could not find prebuilt $@ manual page." ; \ +@HAVE_ASCIIDOC_FALSE@ echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ +@HAVE_ASCIIDOC_FALSE@ exit 1; \ +@HAVE_ASCIIDOC_FALSE@ fi @HAVE_ASCIIDOC_FALSE@.txt.5: -@HAVE_ASCIIDOC_FALSE@ @echo "Using existing $@ manual page, since 'asciidoc' was not found." +@HAVE_ASCIIDOC_FALSE@ @if [ -r "$@" ]; then \ +@HAVE_ASCIIDOC_FALSE@ echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ +@HAVE_ASCIIDOC_FALSE@ else \ +@HAVE_ASCIIDOC_FALSE@ echo "Could not find prebuilt $@ manual page." ; \ +@HAVE_ASCIIDOC_FALSE@ echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ +@HAVE_ASCIIDOC_FALSE@ exit 1; \ +@HAVE_ASCIIDOC_FALSE@ fi @HAVE_ASCIIDOC_FALSE@.txt.8: -@HAVE_ASCIIDOC_FALSE@ @echo "Using existing $@ manual page, since 'asciidoc' was not found." +@HAVE_ASCIIDOC_FALSE@ @if [ -r "$@" ]; then \ +@HAVE_ASCIIDOC_FALSE@ echo "Not (re)building $@ manual page, since 'asciidoc', 'xmllint' or 'xsltproc' were not found." ; \ +@HAVE_ASCIIDOC_FALSE@ else \ +@HAVE_ASCIIDOC_FALSE@ echo "Could not find prebuilt $@ manual page." ; \ +@HAVE_ASCIIDOC_FALSE@ echo "If you are building from Git, do you have all of the asciidoc/a2x tools installed?"; \ +@HAVE_ASCIIDOC_FALSE@ exit 1; \ +@HAVE_ASCIIDOC_FALSE@ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/docs/man/al175.8 b/docs/man/al175.8 index c86d122..297d4f7 100644 --- a/docs/man/al175.8 +++ b/docs/man/al175.8 @@ -1,13 +1,13 @@ '\" t .\" Title: al175 .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "AL175" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "AL175" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -77,7 +77,6 @@ Besides status, this driver reads UPS state into following variables: .sp -1 .IP \(bu 2.3 .\} - \fBups\&.test\&.result\fR .RE .sp @@ -89,7 +88,6 @@ Besides status, this driver reads UPS state into following variables: .sp -1 .IP \(bu 2.3 .\} - \fBoutput\&.voltage\&.nominal\fR .RE .sp @@ -101,7 +99,6 @@ Besides status, this driver reads UPS state into following variables: .sp -1 .IP \(bu 2.3 .\} - \fBoutput\&.current\fR .RE .sp @@ -113,7 +110,6 @@ Besides status, this driver reads UPS state into following variables: .sp -1 .IP \(bu 2.3 .\} - \fBbattery\&.voltage\&.nominal\fR .RE .sp @@ -125,7 +121,6 @@ Besides status, this driver reads UPS state into following variables: .sp -1 .IP \(bu 2.3 .\} - \fBbattery\&.current\fR .RE .sp @@ -137,7 +132,6 @@ Besides status, this driver reads UPS state into following variables: .sp -1 .IP \(bu 2.3 .\} - \fBbattery\&.temperature\fR .RE .sp @@ -149,7 +143,6 @@ Besides status, this driver reads UPS state into following variables: .sp -1 .IP \(bu 2.3 .\} - \fBinput\&.transfer\&.boost\&.low\fR .RE .SH "KNOWN ISSUES AND BUGS" diff --git a/docs/man/apcsmart-old.8 b/docs/man/apcsmart-old.8 index 9aa7c06..dc8c5d0 100644 --- a/docs/man/apcsmart-old.8 +++ b/docs/man/apcsmart-old.8 @@ -1,13 +1,13 @@ '\" t .\" Title: apcsmart-old .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "APCSMART\-OLD" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "APCSMART\-OLD" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/apcsmart.8 b/docs/man/apcsmart.8 index 6b9b69f..7dc6cfd 100644 --- a/docs/man/apcsmart.8 +++ b/docs/man/apcsmart.8 @@ -1,13 +1,13 @@ '\" t .\" Title: apcsmart .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "APCSMART" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "APCSMART" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -33,7 +33,7 @@ apcsmart \- Driver for American Power Conversion Smart Protocol UPS equipment .sp \fBapcsmart\fR \-h .sp -\fBapcsmart\fR \-a \*(AqUPS_NAME\*(Aq [\-x option=value \&...] +\fBapcsmart\fR \-a \fIUPS_NAME\fR [\-x option=value \&...] .if n \{\ .sp .\} @@ -52,15 +52,15 @@ This man page only documents the hardware\-specific features of the apcsmart dri .RE .SH "SUPPORTED HARDWARE" .sp -The apcsmart driver should recognize (or at the very least work with) majority of Smart\-UPS models \- which includes Smart\-UPS, Matrix\-UPS and Back\-UPS lineups, among few other ones\&. +The apcsmart driver should recognize (or at the very least, work with) the majority of Smart\-UPS models \- which includes Smart\-UPS, Matrix\-UPS and Back\-UPS lineups, among few other ones\&. .sp -Currently we can roughly divide APC hardware into 3 groups (note that the division isn\*(Aqt strict by any means, and the borders between those are pretty fuzzy): +Currently, we can roughly divide APC hardware into four groups (note that the division isn\(cqt strict by any means, and the borders between those are pretty fuzzy): .PP [very] "old" models .RS 4 These models usually have old APC logo, white color and \fIno\fR -programmable eeprom; You won\*(Aqt find them listed anywhere on APC\(cqs site either\&. The support for those will be usually based on driver\*(Aqs compatibility tables, or if the model (firmware) is not listed in those \- the driver will try to follow the very basic subset of features, while still trying to remain useful\&. Despite "smart" tagname, they often tend to behave in pretty dumb way (see the section below about shutdown behaviour)\&. +programmable EEPROM; you won\(cqt find them listed anywhere on APC\(cqs site either\&. The support for those will be usually based on driver\(cqs compatibility tables, or if the model (firmware) is not listed in those \- the driver will try to follow the very basic subset of features, while still trying to remain useful\&. Despite "smart" tagname, they often tend to behave in pretty dumb way (see the section below about shutdown behaviour)\&. .PP \fBExample models:\fR .sp @@ -89,16 +89,52 @@ Smart\-UPS 900I .PP "new" models .RS 4 -These models usually come from late 1990s / pre\-2009 times\&. They are often referred as "3rd\&. gen"\&. For the most part, they have programmable eeprom, report supported commands and capabilites, and should work just fine with the apcsmart driver\&. +These models usually come from late 1990s / pre\-2009 times\&. They are often referred as "3rd\&. gen"\&. For the most part, they have programmable EEPROM, report supported commands and capabilites, and should work just fine with the apcsmart driver\&. .RE .PP "microlink" models .RS 4 WARNING: these are not \fInatively\fR -supported by apcsmart (or apcupsd for that matter, if you\(cqre wondering)\&. Around 2007 APC (now APC Schneider) decided to go back to its proprietry roots and all the new models (SMT, SMX, SURTD) use completely different protocol and cables\&. If you purchased a new APC UPS, that uses cable with rj45 on the one end, and db\-9 on the other \- then you have such model\&. Your only option to support it through +supported by +\fBapcsmart\fR +(or +\fBapcupsd\fR, for that matter, if you\(cqre wondering)\&. Around 2007, APC (now APC Schneider) decided to go back to its proprietry roots, and all the new models (SMT, SMX, SURTD) use completely different protocol and cables\&. If you purchased a new APC UPS \- that uses cable with RJ45 on the one end, and DB\-9 on the other \- then you have such model\&. Your only option to support it through \fBNUT\fR -is to purchase "legacy communications card" \- part #AP9620 (google \*(AqAP9620\*(Aq for more details)\&. Or if that\*(Aqs not an option, rely on official software\&. +is to purchase a "legacy communications card" \- part #AP9620 (google \*(AqAP9620\*(Aq for more details)\&. Or if that\(cqs not an option, rely on official software\&. +.RE +.PP +Microsol models +.RS 4 +Several Microsol serial models sold in Brazil have been rebranded as APC Back\-UPS, and the model numbers tend to start with "BZ"\&. If you have one of these "Nobreaks", they will not work with the +\fBapcsmart\fR +driver \- please see the +\fBsolis\fR(8) +driver instead\&. +.PP +\fBExample models:\fR +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Back\-UPS BZ1200\-BR +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Back\-UPS BZ2200BI\-BR +.RE .RE .sp Another thing to remember is that Smart protocol is not USB protocol\&. If you have UPS with both USB and serial ports, then depending on how you connect it, you will need either apcsmart or usbhid\-ups driver\&. @@ -135,7 +171,7 @@ Alternatively, you can also provide it on the command line using: \-x \fBcable\fR=940\-0095B .SH "TTY MODES" .sp -By default the driver works in canonical mode, but it showed to be a problem in windows systems\&. Furthermore there\(cqs a possibility of some obscure serial cards or serial\-usb convertes that could cause problems as well\&. You can use \*(Aqttymode=\*(Aq option to force non\-canonical discipline in \fBups.conf\fR(5): +By default the driver works in canonical mode, but it proved to be a problem in Windows systems\&. Furthermore there\(cqs a possibility of some obscure serial cards or serial\-USB converters that could cause problems as well\&. You can use \*(Aqttymode=\*(Aq option to force non\-canonical discipline in \fBups.conf\fR(5): .sp \fBttymode\fR=raw .sp @@ -165,7 +201,7 @@ APC hardware supports a lot of shutdown methods, that themselves can differ in b \fBS\fR (soft hibernate) .RS 4 This is most basic command present in probably all APC models\&. It will hibernate the UPS, and subsequently wake it up when the mains supply returns\&. -\fBThe command doesn\*(Aqt work if UPS is running on mains\&.\fR +\fBThe command doesn\(cqt work if the UPS is running on mains\&.\fR .PP "old" models .RS 4 @@ -174,7 +210,7 @@ The behaviour here is unfortunately pretty primitive \- when the power returns, .PP "new" models .RS 4 -The behaviour here is as expected \- the power is cut off after the eeprom defined grace period\&. The UPS will wake up when the power returns, after the eeprom defined delay AND if the eeprom defined min\&. battery charge level is met\&. The delay is counted from the power\*(Aqs return\&. +The behaviour here is as expected \- the power is cut off after the EEPROM defined grace period\&. The UPS will wake up when the power returns, after the EEPROM defined delay AND if the EEPROM defined min\&. battery charge level is met\&. The delay is counted from the power\*(Aqs return\&. .RE .RE .PP @@ -206,8 +242,8 @@ If nnn = 000, then UPS will do precisely nothing\&. On those models you\*(Aqre b .PP "new" models .RS 4 -All the usual variables defined in eeprom are respected (see -\fBS\fR)\&. Additionally, if nnn > 0, the nnn*6 minutes are added to eeprom defined delay\&. UPS will not power up if it\*(Aqs running on batteries, contrary to what "old" models used to do \- the combined delay is counted from the moment of power return\&. +All the usual variables defined in EEPROM are respected (see +\fBS\fR)\&. Additionally, if nnn > 0, the nnn*6 minutes are added to EEPROM defined delay\&. UPS will not power up if it\*(Aqs running on batteries, contrary to what "old" models used to do \- the combined delay is counted from the moment of power return\&. .RE .sp Supposedly there exist models that take 2 digits instead of 3\&. Just in case, NUT also supports such variation\&. You have to provide exactly 2 digits to trigger it (\fBawd\fR @@ -216,7 +252,7 @@ option, or argument to one of the supported instant commands)\&. .PP \fBK\fR (delayed poweroff) .RS 4 -This is permanent poweroff \- the UPS will not wake up automatically\&. On newer units, it will respect applicable eeprom variables\&. +This is permanent poweroff \- the UPS will not wake up automatically\&. On newer units, it will respect applicable EEPROM variables\&. .RE .PP \fBZ\fR (instant poweroff) @@ -366,7 +402,7 @@ Hard hibernate\*(Aqs additional wakeup delay can be provided by \fBawd\fR\&. .RE .SH "IGNORING LB STATE" .sp -APC units \- even if they report LB mode \- will not go into shutdown automatically\&. This gives us even more control with reference to "when to actually shutdown psu"\&. Since version 2\&.6\&.2, NUT supports \fBignorelb\fR option in driver\*(Aqs section of \fBups.conf\fR(5)\&. When such option is in effect, the core driver will ignore LB state as reported by specific driver and start shutdown basing the decision \fIonly\fR on two conditions: +APC units \- even if they report LB mode \- will not go into shutdown automatically\&. This gives us even more control with reference to "when to actually shutdown PSU"\&. Since version 2\&.6\&.2, NUT supports \fBignorelb\fR option in driver\(cqs section of \fBups.conf\fR(5)\&. When such option is in effect, the core driver will ignore LB state as reported by specific driver and start shutdown basing the decision \fIonly\fR on two conditions: .sp battery\&.charge < battery\&.charge\&.low .sp @@ -376,7 +412,7 @@ battery\&.runtime < battery\&.runtime\&.low .sp Of course \- if any of the variables are not available, the appropriate condition is not checked\&. If you want to explicitly disable one of the conditions, simply override the right hand variable causing the condition to always evaluate to false (you can even provide negative numbers)\&. .sp -APC UPSes don\*(Aqt have battery\&.charge\&.low \- you will have to define it if you want to use such condition (prefix the variable with override\&. or default\&.)\&. +APC UPSes don\(cqt have battery\&.charge\&.low \- you will have to define it if you want to use such condition (prefix the variable with override\&. or default\&.)\&. .sp "New" units have battery\&.runtime\&.low, but depending on battery quality, firmware version, calibration and UPS load \- this variable can be underestimated quite a bit \- especially right after going into OB state\&. This in turn can cause LB to be asserted, which under normal conditions will cause \fBNUT\fR to initiate the shutdown\&. You might want to disable this condition entirely, when relying on \fBignorelb\fR option (this was actually the main motivation behind introduction of such feature)\&. .sp @@ -535,7 +571,7 @@ calibrate\&.stop .RE .SH "PREVIOUS DRIVER VERSION" .sp -Previous driver is still available as apcsmart\-old \- should there be any need to use earlier version (bugs, incompatiblities with new functionality, etc\&.)\&. In due time apcsmart\-old will be phased out completely, but this won\(cqt happen until the new version gets solid exposure with no pending issues\&. +Previous driver is still available as \fBapcsmart\-old\fR, should there be any need to use earlier version (bugs, incompatiblities with new functionality, etc\&.)\&. In due time, \fBapcsmart\-old\fR will be phased out completely, but this won\(cqt happen until the new version gets solid exposure with no pending issues\&. .SH "BUGS" .sp Some older APC UPS models return bogus data in the status register during a front panel test\&. This is usually detected and discarded, but some other unexpected values have occasionally slipped through\&. @@ -546,7 +582,7 @@ APC UPS models with both USB and serial ports require a power cycle when switchi Nigel Metheringham (drawing heavily on the original apcsmart driver by Russell Kroll)\&. This driver was called newapc for a time and was renamed in the 1\&.5 series\&. In 2\&.6\&.2 it was renamed to apcsmart\-old, being superseded by updated version with new features, which is maintained by Michal Soltys .SH "SEE ALSO" .sp -\fBnutupsdrv\fR(8), \fBups.conf\fR(5) +\fBnutupsdrv\fR(8), \fBups.conf\fR(5), \fBusbhid-ups\fR(8), \fBsolis\fR(8) .SS "Internet resources:" .sp The NUT (Network UPS Tools) home page: http://www\&.networkupstools\&.org/ diff --git a/docs/man/apcsmart.txt b/docs/man/apcsmart.txt index 2ec0a34..6a474c7 100644 --- a/docs/man/apcsmart.txt +++ b/docs/man/apcsmart.txt @@ -11,7 +11,7 @@ SYNOPSIS *apcsmart* -h -*apcsmart* -a \'UPS_NAME' [-x option=value ...] +*apcsmart* -a 'UPS_NAME' [-x option=value ...] NOTE: This man page only documents the hardware-specific features of the apcsmart driver. For information about the core driver, see @@ -21,17 +21,17 @@ linkman:nutupsdrv[8]. SUPPORTED HARDWARE ------------------ -The apcsmart driver should recognize (or at the very least work with) majority -of Smart-UPS models - which includes Smart-UPS, Matrix-UPS and Back-UPS lineups, -among few other ones. +The apcsmart driver should recognize (or at the very least, work with) the +majority of Smart-UPS models - which includes Smart-UPS, Matrix-UPS and Back-UPS +lineups, among few other ones. -Currently we can roughly divide APC hardware into 3 groups (note that the -division isn\'t strict by any means, and the borders between those are pretty fuzzy): +Currently, we can roughly divide APC hardware into four groups (note that the +division isn't strict by any means, and the borders between those are pretty fuzzy): [very] "old" models:: These models usually have old APC logo, white color and _no_ programmable - eeprom; You won\'t find them listed anywhere on APC's site either. The support - for those will be usually based on driver\'s compatibility tables, or if the + EEPROM; you won't find them listed anywhere on APC's site either. The support + for those will be usually based on driver's compatibility tables, or if the model (firmware) is not listed in those - the driver will try to follow the very basic subset of features, while still trying to remain useful. Despite "smart" tagname, they often tend to behave in pretty dumb way (see the @@ -45,19 +45,32 @@ division isn\'t strict by any means, and the borders between those are pretty fu "new" models:: These models usually come from late 1990s / pre-2009 times. They are often - referred as "3rd. gen". For the most part, they have programmable eeprom, + referred as "3rd. gen". For the most part, they have programmable EEPROM, report supported commands and capabilites, and should work just fine with the apcsmart driver. "microlink" models:: - WARNING: these are not _natively_ supported by apcsmart (or apcupsd for that - matter, if you\'re wondering). Around 2007 APC (now APC Schneider) decided to - go back to its proprietry roots and all the new models (SMT, SMX, SURTD) use - completely different protocol and cables. If you purchased a new APC UPS, - that uses cable with rj45 on the one end, and db-9 on the other - then you - have such model. Your only option to support it through *NUT* is to - purchase "legacy communications card" - part #AP9620 (google \'AP9620' for - more details). Or if that\'s not an option, rely on official software. + WARNING: these are not _natively_ supported by *apcsmart* (or *apcupsd*, + for that matter, if you're wondering). Around 2007, APC (now APC Schneider) + decided to go back to its proprietry roots, and all the new models (SMT, + SMX, SURTD) use completely different protocol and cables. If you purchased + a new APC UPS - that uses cable with RJ45 on the one end, and DB-9 on the + other - then you have such model. Your only option to support it through + *NUT* is to purchase a "legacy communications card" - part #AP9620 (google + \'AP9620' for more details). Or if that's not an option, rely on official + software. + +Microsol models:: + Several Microsol serial models sold in Brazil have been rebranded as APC + Back-UPS, and the model numbers tend to start with "BZ". If you have one + of these "Nobreaks", they will not work with the *apcsmart* driver - please + see the linkman:solis[8] driver instead. ++ +-- +.Example models: + * Back-UPS BZ1200-BR + * Back-UPS BZ2200BI-BR +-- Another thing to remember is that Smart protocol is not USB protocol. If you have UPS with both USB and serial ports, then depending on how you connect it, @@ -92,9 +105,9 @@ Alternatively, you can also provide it on the command line using: TTY MODES --------- -By default the driver works in canonical mode, but it showed to be a problem in -windows systems. Furthermore there's a possibility of some obscure serial cards -or serial-usb convertes that could cause problems as well. You can use +By default the driver works in canonical mode, but it proved to be a problem in +Windows systems. Furthermore there's a possibility of some obscure serial cards +or serial-USB converters that could cause problems as well. You can use \'ttymode=' option to force non-canonical discipline in linkman:ups.conf[5]: *ttymode*=raw @@ -114,7 +127,7 @@ behaviour quite a bit, depending on the model. *S* (soft hibernate):: This is most basic command present in probably all APC models. It will hibernate the UPS, and subsequently wake it up when the mains supply - returns. *The command doesn\'t work if UPS is running on mains.* + returns. *The command doesn't work if the UPS is running on mains.* "old" models::: The behaviour here is unfortunately pretty primitive - when the power @@ -123,8 +136,8 @@ behaviour quite a bit, depending on the model. "new" models::: The behaviour here is as expected - the power is cut off after the - eeprom defined grace period. The UPS will wake up when the power - returns, after the eeprom defined delay AND if the eeprom defined min. + EEPROM defined grace period. The UPS will wake up when the power + returns, after the EEPROM defined delay AND if the EEPROM defined min. battery charge level is met. The delay is counted from the power\'s return. @@ -154,8 +167,8 @@ command if your UPS supports it (and is not too old, see below). connection is kept alive). "new" models::: - All the usual variables defined in eeprom are respected (see *S*). - Additionally, if nnn > 0, the $$nnn*6$$ minutes are added to eeprom + All the usual variables defined in EEPROM are respected (see *S*). + Additionally, if nnn > 0, the $$nnn*6$$ minutes are added to EEPROM defined delay. UPS will not power up if it\'s running on batteries, contrary to what "old" models used to do - the combined delay is counted from the moment of power return. @@ -167,7 +180,7 @@ trigger it (*awd* option, or argument to one of the supported instant commands). *K* (delayed poweroff):: This is permanent poweroff - the UPS will not wake up automatically. On - newer units, it will respect applicable eeprom variables. + newer units, it will respect applicable EEPROM variables. *Z* (instant poweroff):: This is also permanent poweroff - the UPS will not wake up automatically. @@ -248,8 +261,8 @@ IGNORING LB STATE APC units - even if they report LB mode - will not go into shutdown automatically. This gives us even more control with reference to "when to -actually shutdown psu". Since version 2.6.2, NUT supports *ignorelb* option in -driver\'s section of linkman:ups.conf[5]. When such option is in effect, +actually shutdown PSU". Since version 2.6.2, NUT supports *ignorelb* option in +driver's section of linkman:ups.conf[5]. When such option is in effect, the core driver will ignore LB state as reported by specific driver and start shutdown basing the decision _only_ on two conditions: @@ -264,8 +277,8 @@ is not checked. If you want to explicitly disable one of the conditions, simply override the right hand variable causing the condition to always evaluate to false (you can even provide negative numbers). -APC UPSes don\'t have battery.charge.low - you will have to define it if you want -to use such condition (prefix the variable with override. or default.). +APC UPSes don't have battery.charge.low - you will have to define it if you want +to use such condition (prefix the variable with `override.` or `default.`). "New" units have battery.runtime.low, but depending on battery quality, firmware version, calibration and UPS load - this variable can be underestimated quite a bit - @@ -335,9 +348,9 @@ Other supported commands: PREVIOUS DRIVER VERSION ----------------------- -Previous driver is still available as apcsmart-old - should there be any need to +Previous driver is still available as *apcsmart-old*, should there be any need to use earlier version (bugs, incompatiblities with new functionality, etc.). In -due time apcsmart-old will be phased out completely, but this won't happen until +due time, *apcsmart-old* will be phased out completely, but this won't happen until the new version gets solid exposure with no pending issues. BUGS @@ -362,7 +375,8 @@ new features, which is maintained by Michal Soltys SEE ALSO -------- -linkman:nutupsdrv[8], linkman:ups.conf[5] +linkman:nutupsdrv[8], linkman:ups.conf[5], linkman:usbhid-ups[8], +linkman:solis[8] Internet resources: ~~~~~~~~~~~~~~~~~~~ diff --git a/docs/man/apcupsd-ups.8 b/docs/man/apcupsd-ups.8 index 8da8d88..a6bb2f5 100644 --- a/docs/man/apcupsd-ups.8 +++ b/docs/man/apcupsd-ups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: apcupsd-ups .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "APCUPSD\-UPS" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "APCUPSD\-UPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/asciidoc.conf b/docs/man/asciidoc.conf index d294d23..9b4533d 100644 --- a/docs/man/asciidoc.conf +++ b/docs/man/asciidoc.conf @@ -23,6 +23,10 @@ ifdef::backend-xhtml11[] [linkman-inlinemacro] {target}{0?({0})} +# Override HTML footer, to include NUT version +[footer-text] +Last updated {docdate} {doctime} -- Network UPS Tools {nutversion} + # Format-detection to prevent smartphones from being too smart [+docinfo] diff --git a/docs/man/asem.8 b/docs/man/asem.8 new file mode 100644 index 0000000..7f1328f --- /dev/null +++ b/docs/man/asem.8 @@ -0,0 +1,87 @@ +'\" t +.\" Title: asem +.\" Author: [see the "AUTHORS" section] +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 +.\" Manual: NUT Manual +.\" Source: Network UPS Tools 2.7.3 +.\" Language: English +.\" +.TH "ASEM" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +asem \- driver for UPS in ASEM PB1300 +.SH "NOTE" +.sp +This man page only documents the hardware\-specific features of the \fBasem\fR driver\&. For information about the core driver, see \fBnutupsdrv\fR(8)\&. +.SH "SUPPORTED HARDWARE" +.sp +The \fBasem\fR driver supports the UPS in ASEM PB1300 embedded PCs\&. Likely other I2C devices from the same manufacturer will work too, since this is a "custom" charger\&. +.sp +Seems that there are two versions of the charger\&. Older one is based on Max1667, newer one is a custom solution\&. Both are on I2C address 0x09\&. To be compatible with both versions, the driver just reads bit 15 of address 0x13 which yields online/on battery status\&. Battery monitor is a BQ2060 at address 0x0B\&. +.SH "EXTRA ARGUMENTS" +.sp +The required parameter for this driver is the I2C bus name: +.PP +\fBport\fR=\fIdev\-node\fR +.RS 4 +On the Asem PB1300, this should be +/dev/i2c\-7 +for the i801 SMBUS adapter\&. +.RE +.sp +This driver also supports the following optional settings: +.PP +\fBlb\fR=\fInum\fR +.RS 4 +Set the low battery threshold to +\fInum\fR +volts\&. +.RE +.PP +\fBhb\fR=\fInum\fR +.RS 4 +Set the high battery threshold to +\fInum\fR +volts\&. +.RE +.SH "INSTALLATION" +.sp +This driver is specific to the Linux I2C API, and requires the lm_sensors libi2c\-dev or its equivalent to compile\&. +.sp +Beware that the SystemIO memory used by the I2C controller is reserved by ACPI\&. If only a native I2C driver (e\&.g\&. i2c_i801, as of 3\&.5\&.X Linux kernels) is available, then you\(cqll need to relax the ACPI resources check\&. For example, you can boot with the acpi_enforce_resources=lax option\&. +.SH "KNOWN ISSUES AND BUGS" +.sp +The driver shutdown function is not implemented, so other arrangements must be made to turn off the UPS\&. +.SH "AUTHORS" +.sp +Giuseppe Corbelli +.SH "SEE ALSO" +.SS "The core driver:" +.sp +\fBnutupsdrv\fR(8) +.SS "Internet resources:" +.sp +PB1300 specifications: http://www\&.asem\&.it/en/products/industrial\-automation/box\-pcs/performance/pb1300/ +.sp +BQ2060 datasheet: http://www\&.ti\&.com/lit/ds/symlink/bq2060\&.pdf +.sp +The NUT (Network UPS Tools) home page: http://www\&.networkupstools\&.org/ diff --git a/docs/man/asem.txt b/docs/man/asem.txt new file mode 100644 index 0000000..25f67ab --- /dev/null +++ b/docs/man/asem.txt @@ -0,0 +1,83 @@ +ASEM(8) +======= + +NAME +---- +asem - driver for UPS in ASEM PB1300 + +NOTE +---- +This man page only documents the hardware-specific features of the +*asem* driver. For information about the core driver, see +linkman:nutupsdrv[8]. + +SUPPORTED HARDWARE +------------------ +The *asem* driver supports the UPS in ASEM PB1300 embedded PCs. Likely other +I2C devices from the same manufacturer will work too, since this is a "custom" +charger. + +Seems that there are two versions of the charger. Older one is based on +Max1667, newer one is a custom solution. Both are on I2C address 0x09. +To be compatible with both versions, the driver just reads bit 15 of address +0x13 which yields online/on battery status. +Battery monitor is a BQ2060 at address 0x0B. + +EXTRA ARGUMENTS +--------------- + +The required parameter for this driver is the I2C bus name: + +*port*='dev-node':: +On the Asem PB1300, this should be `/dev/i2c-7` for the i801 SMBUS adapter. + +This driver also supports the following optional settings: + +*lb*='num':: +Set the low battery threshold to 'num' volts. + +*hb*='num':: +Set the high battery threshold to 'num' volts. + +INSTALLATION +------------ +This driver is specific to the Linux I2C API, and requires the lm_sensors +libi2c-dev or its equivalent to compile. + +Beware that the SystemIO memory used by the I2C controller is reserved by ACPI. +If only a native I2C driver (e.g. i2c_i801, as of 3.5.X Linux kernels) is +available, then you'll need to relax the ACPI resources check. For example, you +can boot with the `acpi_enforce_resources=lax` option. + +////////////////////////////////////////// +Optional: use DIAGNOSTICS to describe troubleshooting techniques that are +longer than what can be conveniently described in the driver error messages. + +DIAGNOSTICS +----------- + +////////////////////////////////////////// + +KNOWN ISSUES AND BUGS +--------------------- +The driver shutdown function is not implemented, so other arrangements must be +made to turn off the UPS. + +AUTHORS +------- +Giuseppe Corbelli + +SEE ALSO +-------- + +The core driver: +~~~~~~~~~~~~~~~~ +linkman:nutupsdrv[8] + +Internet resources: +~~~~~~~~~~~~~~~~~~~ +PB1300 specifications: http://www.asem.it/en/products/industrial-automation/box-pcs/performance/pb1300/ + +BQ2060 datasheet: http://www.ti.com/lit/ds/symlink/bq2060.pdf + +The NUT (Network UPS Tools) home page: http://www.networkupstools.org/ diff --git a/docs/man/bcmxcp.8 b/docs/man/bcmxcp.8 index bcd38c2..0d6fa26 100644 --- a/docs/man/bcmxcp.8 +++ b/docs/man/bcmxcp.8 @@ -1,13 +1,13 @@ '\" t .\" Title: bcmxcp .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BCMXCP" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BCMXCP" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -58,9 +58,7 @@ Communication speed for the UPS\&. If this is set to 9600, it tries to connect t .sp -1 .IP \(bu 2.3 .\} - -\fBshutdown_delay =\fR -\fI120\fR +\fBshutdown_delay =\fR\fI120\fR .RE .sp .RS 4 @@ -71,9 +69,7 @@ Communication speed for the UPS\&. If this is set to 9600, it tries to connect t .sp -1 .IP \(bu 2.3 .\} - -\fBbaud_rate =\fR -\fInone\fR +\fBbaud_rate =\fR\fInone\fR .RE .SH "INSTANT COMMANDS" .sp diff --git a/docs/man/bcmxcp_usb.8 b/docs/man/bcmxcp_usb.8 index c46b557..5e40a3e 100644 --- a/docs/man/bcmxcp_usb.8 +++ b/docs/man/bcmxcp_usb.8 @@ -1,13 +1,13 @@ '\" t .\" Title: bcmxcp_usb .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BCMXCP_USB" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BCMXCP_USB" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/belkin.8 b/docs/man/belkin.8 index 5c3716d..9788c80 100644 --- a/docs/man/belkin.8 +++ b/docs/man/belkin.8 @@ -1,13 +1,13 @@ '\" t .\" Title: belkin .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BELKIN" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BELKIN" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/belkinunv.8 b/docs/man/belkinunv.8 index 83cb1c8..528147a 100644 --- a/docs/man/belkinunv.8 +++ b/docs/man/belkinunv.8 @@ -1,13 +1,13 @@ '\" t .\" Title: belkinunv .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BELKINUNV" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BELKINUNV" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestfcom.8 b/docs/man/bestfcom.8 index 702aea2..bc55212 100644 --- a/docs/man/bestfcom.8 +++ b/docs/man/bestfcom.8 @@ -1,13 +1,13 @@ '\" t .\" Title: bestfcom .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BESTFCOM" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BESTFCOM" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestfortress.8 b/docs/man/bestfortress.8 index 3710a39..8edf6d2 100644 --- a/docs/man/bestfortress.8 +++ b/docs/man/bestfortress.8 @@ -1,13 +1,13 @@ '\" t .\" Title: bestfortress .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BESTFORTRESS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BESTFORTRESS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestuferrups.8 b/docs/man/bestuferrups.8 index 9561420..70338bd 100644 --- a/docs/man/bestuferrups.8 +++ b/docs/man/bestuferrups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: bestuferrups .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BESTUFERRUPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BESTUFERRUPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestups.8 b/docs/man/bestups.8 index 45cebad..f2c5b07 100644 --- a/docs/man/bestups.8 +++ b/docs/man/bestups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: bestups .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BESTUPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BESTUPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/blazer_ser.8 b/docs/man/blazer_ser.8 index c163ff4..883a139 100644 --- a/docs/man/blazer_ser.8 +++ b/docs/man/blazer_ser.8 @@ -1,13 +1,13 @@ '\" t .\" Title: blazer_ser .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BLAZER_SER" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BLAZER_SER" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/blazer_usb.8 b/docs/man/blazer_usb.8 index e552504..3f6b5b7 100644 --- a/docs/man/blazer_usb.8 +++ b/docs/man/blazer_usb.8 @@ -1,13 +1,13 @@ '\" t .\" Title: blazer_usb .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "BLAZER_USB" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "BLAZER_USB" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -154,7 +154,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x vendor="Foo\&.Corporation\&.*" .RE .sp @@ -166,7 +165,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x vendorid=051d* (APC) .RE @@ -179,7 +177,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x product="\&.*(Smart|Back)\-?UPS\&.*" .RE .RE diff --git a/docs/man/clone.8 b/docs/man/clone.8 index 8637a95..7f92efb 100644 --- a/docs/man/clone.8 +++ b/docs/man/clone.8 @@ -1,13 +1,13 @@ '\" t .\" Title: clone .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "CLONE" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "CLONE" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/dummy-ups.8 b/docs/man/dummy-ups.8 index ea9d41b..eaba7fd 100644 --- a/docs/man/dummy-ups.8 +++ b/docs/man/dummy-ups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: dummy-ups .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "DUMMY\-UPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "DUMMY\-UPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -95,7 +95,7 @@ Port is the name of a remote UPS, using the NUT form, ie: .RS 4 .\} .nf -[@[:]] +@[:] .fi .if n \{\ .RE @@ -115,6 +115,8 @@ For instance: .if n \{\ .RE .\} +.sp +Unlike UPS specifications in the rest of NUT, the @hostname portion is not optional \- it is the @ character which enables Repeater Mode\&. To refer to an UPS on the same host as \fBdummy\-ups\fR, use port = upsname@localhost\&. .SH "INTERACTION" .sp Once the driver is loaded in dummy mode, you can change any variables, except those of the driver\&.* and server\&.* collections\&. You can do this by either editing the definition file, or use the \fBupsrw\fR(1) and \fBupscmd\fR(1) commands\&. @@ -124,9 +126,9 @@ Note that in simulation mode, new variables can be added on the fly, by adding t In repeater mode, the driver acts according to the capabilities of the UPS, and so support the same instant commands and settable values\&. .SH "BACKGROUND" .sp -This driver was written in one evening to replace the previous dummycons testing driver\&. It was too limited and required to work from a terminal to interact\&. +Dummy Mode was originally written in one evening to replace the previous dummycons testing driver, which was too limited, and required a terminal for interaction\&. .sp -\fBdummy\-ups\fR is useful for NUT client development, and other testing purpose\&. +\fBdummy\-ups\fR is useful for NUT client development, and other testing purposes\&. .sp It also helps the NUT Quality Assurance effort, by automating some tests on the NUT framework\&. .sp diff --git a/docs/man/dummy-ups.txt b/docs/man/dummy-ups.txt index 766d17e..385f5be 100644 --- a/docs/man/dummy-ups.txt +++ b/docs/man/dummy-ups.txt @@ -86,7 +86,7 @@ Repeater Mode Port is the name of a remote UPS, using the NUT form, ie: - [@[:]] + @[:] For instance: @@ -95,6 +95,10 @@ For instance: port = ups@hostname desc = "dummy-ups in repeater mode" +Unlike UPS specifications in the rest of NUT, the `@hostname` portion is not +optional - it is the `@` character which enables Repeater Mode. To refer to an +UPS on the same host as *dummy-ups*, use `port = upsname@localhost`. + INTERACTION ----------- @@ -114,11 +118,11 @@ so support the same instant commands and settable values. BACKGROUND ---------- -This driver was written in one evening to replace the previous dummycons -testing driver. It was too limited and required to work from a terminal to -interact. +Dummy Mode was originally written in one evening to replace the previous +dummycons testing driver, which was too limited, and required a terminal for +interaction. -*dummy-ups* is useful for NUT client development, and other testing purpose. +*dummy-ups* is useful for NUT client development, and other testing purposes. It also helps the NUT Quality Assurance effort, by automating some tests on the NUT framework. diff --git a/docs/man/etapro.8 b/docs/man/etapro.8 index 868a0bc..e327592 100644 --- a/docs/man/etapro.8 +++ b/docs/man/etapro.8 @@ -1,13 +1,13 @@ '\" t .\" Title: etapro .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "ETAPRO" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "ETAPRO" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/everups.8 b/docs/man/everups.8 index 34c2e67..784627e 100644 --- a/docs/man/everups.8 +++ b/docs/man/everups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: everups .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "EVERUPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "EVERUPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/gamatronic.8 b/docs/man/gamatronic.8 index 161d14f..12ef3be 100644 --- a/docs/man/gamatronic.8 +++ b/docs/man/gamatronic.8 @@ -1,13 +1,13 @@ '\" t .\" Title: gamatronic .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "GAMATRONIC" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "GAMATRONIC" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/genericups.8 b/docs/man/genericups.8 index 7d9f4df..a7f883f 100644 --- a/docs/man/genericups.8 +++ b/docs/man/genericups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: genericups .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "GENERICUPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "GENERICUPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/hosts.conf.5 b/docs/man/hosts.conf.5 index 8044fd5..c2d62fe 100644 --- a/docs/man/hosts.conf.5 +++ b/docs/man/hosts.conf.5 @@ -1,13 +1,13 @@ '\" t .\" Title: hosts.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "HOSTS\&.CONF" "5" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "HOSTS\&.CONF" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/isbmex.8 b/docs/man/isbmex.8 index 7c0ba16..06a2041 100644 --- a/docs/man/isbmex.8 +++ b/docs/man/isbmex.8 @@ -1,13 +1,13 @@ '\" t .\" Title: isbmex .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "ISBMEX" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "ISBMEX" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/ivtscd.8 b/docs/man/ivtscd.8 index be2e1ee..66d51c7 100644 --- a/docs/man/ivtscd.8 +++ b/docs/man/ivtscd.8 @@ -1,13 +1,13 @@ '\" t .\" Title: ivtscd .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "IVTSCD" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "IVTSCD" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libnutclient.3 b/docs/man/libnutclient.3 index cab68f1..fced59c 100644 --- a/docs/man/libnutclient.3 +++ b/docs/man/libnutclient.3 @@ -1,13 +1,13 @@ '\" t .\" Title: libnutclient .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBNUTCLIENT" "3" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBNUTCLIENT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libnutclient_commands.3 b/docs/man/libnutclient_commands.3 index 9899bf7..7a30319 100644 --- a/docs/man/libnutclient_commands.3 +++ b/docs/man/libnutclient_commands.3 @@ -1,13 +1,13 @@ '\" t .\" Title: libnutclient_commands .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBNUTCLIENT_COMMAND" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBNUTCLIENT_COMMAND" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libnutclient_devices.3 b/docs/man/libnutclient_devices.3 index 2323630..4c048eb 100644 --- a/docs/man/libnutclient_devices.3 +++ b/docs/man/libnutclient_devices.3 @@ -1,13 +1,13 @@ '\" t .\" Title: libnutclient_devices .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBNUTCLIENT_DEVICES" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBNUTCLIENT_DEVICES" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libnutclient_general.3 b/docs/man/libnutclient_general.3 index 3b7f5cb..4b3504e 100644 --- a/docs/man/libnutclient_general.3 +++ b/docs/man/libnutclient_general.3 @@ -1,13 +1,13 @@ '\" t .\" Title: libnutclient_general .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBNUTCLIENT_GENERAL" "3" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBNUTCLIENT_GENERAL" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libnutclient_misc.3 b/docs/man/libnutclient_misc.3 index c2ef69b..0d83919 100644 --- a/docs/man/libnutclient_misc.3 +++ b/docs/man/libnutclient_misc.3 @@ -1,13 +1,13 @@ '\" t .\" Title: libnutclient_misc .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBNUTCLIENT_MISC" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBNUTCLIENT_MISC" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libnutclient_tcp.3 b/docs/man/libnutclient_tcp.3 index 7af1ddc..b91b7b7 100644 --- a/docs/man/libnutclient_tcp.3 +++ b/docs/man/libnutclient_tcp.3 @@ -1,13 +1,13 @@ '\" t .\" Title: libnutclient_tcp .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBNUTCLIENT_TCP" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBNUTCLIENT_TCP" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libnutclient_variables.3 b/docs/man/libnutclient_variables.3 index 0733cf2..da3f2ce 100644 --- a/docs/man/libnutclient_variables.3 +++ b/docs/man/libnutclient_variables.3 @@ -1,13 +1,13 @@ '\" t .\" Title: libnutclient_variables .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBNUTCLIENT_VARIABL" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBNUTCLIENT_VARIABL" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libupsclient-config.1 b/docs/man/libupsclient-config.1 index b368ec0..e2a0dde 100644 --- a/docs/man/libupsclient-config.1 +++ b/docs/man/libupsclient-config.1 @@ -1,13 +1,13 @@ '\" t .\" Title: libupsclient-config .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIBUPSCLIENT\-CONFIG" "1" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIBUPSCLIENT\-CONFIG" "1" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/liebert-esp2.8 b/docs/man/liebert-esp2.8 index 916b704..24debf7 100644 --- a/docs/man/liebert-esp2.8 +++ b/docs/man/liebert-esp2.8 @@ -1,13 +1,13 @@ '\" t .\" Title: liebert-esp2 .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIEBERT\-ESP2" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIEBERT\-ESP2" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/liebert.8 b/docs/man/liebert.8 index 67a949c..9600054 100644 --- a/docs/man/liebert.8 +++ b/docs/man/liebert.8 @@ -1,13 +1,13 @@ '\" t .\" Title: liebert .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "LIEBERT" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "LIEBERT" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/macosx-ups.8 b/docs/man/macosx-ups.8 index 4d29a0b..f3a8327 100644 --- a/docs/man/macosx-ups.8 +++ b/docs/man/macosx-ups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: macosx-ups .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "MACOSX\-UPS" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "MACOSX\-UPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/masterguard.8 b/docs/man/masterguard.8 index 423c696..f793cff 100644 --- a/docs/man/masterguard.8 +++ b/docs/man/masterguard.8 @@ -1,13 +1,13 @@ '\" t .\" Title: masterguard .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "MASTERGUARD" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "MASTERGUARD" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/metasys.8 b/docs/man/metasys.8 index edfe9a3..321d8c6 100644 --- a/docs/man/metasys.8 +++ b/docs/man/metasys.8 @@ -1,13 +1,13 @@ '\" t .\" Title: metasys .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "METASYS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "METASYS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/mge-shut.8 b/docs/man/mge-shut.8 index cef01bb..fd0fb04 100644 --- a/docs/man/mge-shut.8 +++ b/docs/man/mge-shut.8 @@ -1,13 +1,13 @@ '\" t .\" Title: mge-shut .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "MGE\-SHUT" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "MGE\-SHUT" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/mge-utalk.8 b/docs/man/mge-utalk.8 index 445b862..c8dac81 100644 --- a/docs/man/mge-utalk.8 +++ b/docs/man/mge-utalk.8 @@ -1,13 +1,13 @@ '\" t .\" Title: mge-utalk .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "MGE\-UTALK" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "MGE\-UTALK" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/microdowell.8 b/docs/man/microdowell.8 index d09dd0e..2252f58 100644 --- a/docs/man/microdowell.8 +++ b/docs/man/microdowell.8 @@ -1,13 +1,13 @@ '\" t .\" Title: microdowell .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "MICRODOWELL" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "MICRODOWELL" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/netxml-ups.8 b/docs/man/netxml-ups.8 index 65dae82..3784370 100644 --- a/docs/man/netxml-ups.8 +++ b/docs/man/netxml-ups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: netxml-ups .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NETXML\-UPS" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NETXML\-UPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nut-ipmipsu.8 b/docs/man/nut-ipmipsu.8 index 845c935..aa2d1a5 100644 --- a/docs/man/nut-ipmipsu.8 +++ b/docs/man/nut-ipmipsu.8 @@ -1,13 +1,13 @@ '\" t .\" Title: nut-ipmipsu .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUT\-IPMIPSU" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUT\-IPMIPSU" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -153,7 +153,6 @@ status of the PSU: .sp -1 .IP \(bu 2.3 .\} - \fIOL\fR means that the PSU is present and providing power, .RE @@ -166,7 +165,6 @@ means that the PSU is present and providing power, .sp -1 .IP \(bu 2.3 .\} - \fIOFF\fR means that the PSU is present but not providing power (power cable removed), .RE @@ -179,7 +177,6 @@ means that the PSU is present but not providing power (power cable removed), .sp -1 .IP \(bu 2.3 .\} - \fIstale\fR (no data) means that the PSU is not present (ie physically removed)\&. .RE diff --git a/docs/man/nut-recorder.8 b/docs/man/nut-recorder.8 index 4467a37..54d6f50 100644 --- a/docs/man/nut-recorder.8 +++ b/docs/man/nut-recorder.8 @@ -1,13 +1,13 @@ '\" t .\" Title: nut-recorder .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUT\-RECORDER" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUT\-RECORDER" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nut-scanner.8 b/docs/man/nut-scanner.8 index f154875..8cb91fd 100644 --- a/docs/man/nut-scanner.8 +++ b/docs/man/nut-scanner.8 @@ -1,13 +1,13 @@ '\" t .\" Title: nut-scanner .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUT\-SCANNER" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUT\-SCANNER" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -115,7 +115,6 @@ can be expressed in various forms: .sp -1 .IP \(bu 2.3 .\} - \fIauto\fR to scan all serial ports\&. .RE @@ -266,7 +265,7 @@ Set the username used for authenticating IPMI over LAN connections (mandatory fo .PP \fB\-B\fR | \fB\-\-password\fR \fIpassword\fR .RS 4 -Specify the password to use when authenticationg with the remote host (mandatory for IPMI over LAN\&. No default)\&. +Specify the password to use when authenticating with the remote host (mandatory for IPMI over LAN\&. No default)\&. .RE .PP \fB\-d\fR | \fB\-\-authType\fR \fIauthentication type\fR @@ -290,7 +289,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB0\fR: None; None; None .RE .sp @@ -302,7 +300,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB1\fR: HMAC\-SHA1; None; None .RE .sp @@ -314,7 +311,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB2\fR: HMAC\-SHA1; HMAC\-SHA1\-96; None .RE .sp @@ -326,7 +322,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB3\fR: HMAC\-SHA1; HMAC\-SHA1\-96; AES\-CBC\-128 .RE .sp @@ -338,7 +333,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB6\fR: HMAC\-MD5; None; None .RE .sp @@ -350,7 +344,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB7\fR: HMAC\-MD5; HMAC\-MD5\-128; None .RE .sp @@ -362,7 +355,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB8\fR: HMAC\-MD5; HMAC\-MD5\-128; AES\-CBC\-128 .RE .sp @@ -374,7 +366,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB11\fR: HMAC\-MD5; MD5\-128; None .RE .sp @@ -386,7 +377,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB12\fR: HMAC\-MD5; MD5\-128; AES\-CBC\-128 .RE .sp @@ -398,7 +388,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB15\fR: HMAC\-SHA256; None; None .RE .sp @@ -410,7 +399,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB16\fR: HMAC\-SHA256; HMAC_SHA256_128; None .RE .sp @@ -422,7 +410,6 @@ The following cipher suite ids are currently supported (Authentication; Integrit .sp -1 .IP \(bu 2.3 .\} - \fB17\fR: HMAC\-SHA256; HMAC_SHA256_128; AES\-CBC\-128 .RE .RE @@ -456,7 +443,7 @@ The same using CIDR notation: .sp \fBnut\-scanner \-S \-m 192\&.168\&.0\&.0/24\fR .sp -To scan NUT servers with a timeout of 10 seconds on IP range 192\&.168\&.0\&.0 to 192\&.168\&.0\&.128 using CIDR notation: +To scan NUT servers with a timeout of 10 seconds on IP range 192\&.168\&.0\&.0 to 192\&.168\&.0\&.127 using CIDR notation: .sp \fBnut\-scanner \-O \-t 10 \-m 192\&.168\&.0\&.0/25\fR .sp diff --git a/docs/man/nut-scanner.txt b/docs/man/nut-scanner.txt index 359806f..7f99465 100644 --- a/docs/man/nut-scanner.txt +++ b/docs/man/nut-scanner.txt @@ -134,7 +134,7 @@ IPMI OPTIONS Set the username used for authenticating IPMI over LAN connections (mandatory for IPMI over LAN. No default). *-B* | *--password* 'password':: -Specify the password to use when authenticationg with the remote host (mandatory for IPMI over LAN. No default). +Specify the password to use when authenticating with the remote host (mandatory for IPMI over LAN. No default). *-d* | *--authType* 'authentication type':: Specify the IPMI 1.5 authentication type to use (NONE, STRAIGHT_PASSWORD_KEY, MD2, and MD5) with the remote host (default=MD5). @@ -188,7 +188,7 @@ The same using CIDR notation: *nut-scanner -S -m 192.168.0.0/24* -To scan NUT servers with a timeout of 10 seconds on IP range 192.168.0.0 to 192.168.0.128 using CIDR notation: +To scan NUT servers with a timeout of 10 seconds on IP range 192.168.0.0 to 192.168.0.127 using CIDR notation: *nut-scanner -O -t 10 -m 192.168.0.0/25* diff --git a/docs/man/nut.conf.5 b/docs/man/nut.conf.5 index 726ce8f..d291731 100644 --- a/docs/man/nut.conf.5 +++ b/docs/man/nut.conf.5 @@ -1,13 +1,13 @@ '\" t .\" Title: nut.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUT\&.CONF" "5" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUT\&.CONF" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -94,7 +94,7 @@ above indicates that no upsmon should be running\&. .PP \fBPOWEROFF_WAIT\fR .RS 4 -Optional\&. At the end of an emergency system halt, the upsmon master will signal the UPS to switch off\&. This may fail for a number of reasons\&. Most notably is the case that mains power returns during the shutdown process\&. See the section "Power races" in /usr/share/doc/nut/docs/shutdown\&.txt\&.gz\&. The system will wait this long for the UPS to cut power, and then reboot\&. It should be long enough to exhaust the batteries, in case line power continues to be unavailable\&. On the other hand, it should not be so long that the system remains offline for an unreasonable amount of time if line power has returned\&. See sleep(1) for compatible time syntax\&. If you specify the time in seconds, use the "s" suffix\&. +Optional\&. At the end of an emergency system halt, the upsmon master will signal the UPS to switch off\&. This may fail for a number of reasons\&. Most notably is the case that mains power returns during the shutdown process\&. See the section "Power races" in /usr/share/doc/nut/FAQ\&.txt\&.gz\&. The system will wait this long for the UPS to cut power, and then reboot\&. It should be long enough to exhaust the batteries, in case line power continues to be unavailable\&. On the other hand, it should not be so long that the system remains offline for an unreasonable amount of time if line power has returned\&. See sleep(1) for compatible time syntax\&. If you specify the time in seconds, use the "s" suffix\&. .RE .if n \{\ .sp diff --git a/docs/man/nut.conf.txt b/docs/man/nut.conf.txt index 074ff95..881a08a 100644 --- a/docs/man/nut.conf.txt +++ b/docs/man/nut.conf.txt @@ -68,7 +68,7 @@ Optional. At the end of an emergency system halt, the upsmon master will signal the UPS to switch off. This may fail for a number of reasons. Most notably is the case that mains power returns during the shutdown process. See the section "Power races" in -/usr/share/doc/nut/docs/shutdown.txt.gz. The system will wait this +/usr/share/doc/nut/FAQ.txt.gz. The system will wait this long for the UPS to cut power, and then reboot. It should be long enough to exhaust the batteries, in case line power continues to be unavailable. On the other hand, it should not be so long that the diff --git a/docs/man/nutdrv_atcl_usb.8 b/docs/man/nutdrv_atcl_usb.8 index 78b4804..7f73147 100644 --- a/docs/man/nutdrv_atcl_usb.8 +++ b/docs/man/nutdrv_atcl_usb.8 @@ -1,13 +1,13 @@ '\" t .\" Title: nutdrv_atcl_usb .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTDRV_ATCL_USB" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTDRV_ATCL_USB" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutdrv_qx.8 b/docs/man/nutdrv_qx.8 index 60c2591..df98321 100644 --- a/docs/man/nutdrv_qx.8 +++ b/docs/man/nutdrv_qx.8 @@ -1,13 +1,13 @@ '\" t .\" Title: nutdrv_qx .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/22/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTDRV_QX" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTDRV_QX" "8" "04/22/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -112,13 +112,15 @@ seconds (if mains meanwhile returned)\&. \fBprotocol =\fR \fIstring\fR .RS 4 Skip autodetection of the protocol to use and only use the one specified\&. Supported values: +\fIbestups\fR, \fImecer\fR, \fImegatec\fR, \fImegatec/old\fR, \fImustek\fR, \fIq1\fR, \fIvoltronic\fR, -\fIvoltronic\-qs\fR +\fIvoltronic\-qs\fR, +\fIvoltronic\-qs\-hex\fR and \fIzinto\fR\&. .sp @@ -201,6 +203,13 @@ Minimum battery load used by the driver to estimate the runtime\&. If not specif \fBruntimecal\fR is also specified\&. .RE +.SS "BESTUPS, MECER, MEGATAEC, MEGATEC/OLD, MUSTEK, Q1, VOLTRONIC\-QS, VOLTRONIC\-QS\-HEX, ZINTO PROTOCOLS" +.PP +\fBignoresab\fR +.RS 4 +Some UPSes incorrectly report the \(oqShutdown Active\(cq bit as always on, consequently making the driver believe the UPS is nearing a shutdown (and, as a result, ups\&.status always contains +FSD\&... and you know what this means)\&. Setting this flag will make the driver ignore the \(oqShutdown Active\(cq bit\&. +.RE .SS "MECER, MEGATAEC, MEGATEC/OLD, MUSTEK, ZINTO PROTOCOLS" .PP \fBondelay\fR @@ -226,6 +235,30 @@ Some UPSes will lock up if you attempt to read rating information from them\&. S .RS 4 Some UPSes will lock up if you attempt to read vendor information from them\&. Setting this flag will make the driver skip this step\&. .RE +.SS "BESTUPS PROTOCOL" +.PP +\fBondelay\fR +.RS 4 +The acceptable range is +60\&.\&.599940 +seconds\&. +.RE +.PP +\fBoffdelay\fR +.RS 4 +The acceptable range is +12\&.\&.5940 +seconds\&. +.RE +.PP +\fBpins_shutdown_mode =\fR \fIvalue\fR +.RS 4 +Set +shutdown mode functionality of Pin 1 and Pin 7 +on the UPS DB9 communication port (Per Best Power\(cqs EPS\-0059) to +\fIvalue\fR +[0\&.\&.6]\&. +.RE .SS "Q1 PROTOCOL" .PP \fBondelay\fR @@ -241,7 +274,7 @@ The acceptable range is 12\&.\&.600 seconds\&. .RE -.SS "VOLTRONIC\-QS PROTOCOL" +.SS "VOLTRONIC\-QS, VOLTRONIC\-QS\-HEX PROTOCOLS" .PP \fBondelay\fR .RS 4 @@ -374,7 +407,7 @@ Enable or disable Battery Open Status Check [enabled/disabled]\&. If enabled, wh Enable or disable site fault detection [enabled/disabled]\&. If enabled, the UPS will beep when the input neutral and hot wires are reversed\&. .RE .PP -\fBcostant_phase_angle =\fR \fIstring\fR +\fBconstant_phase_angle =\fR \fIstring\fR .RS 4 Enable or disable Constant Phase Angle Function (output and input phase angles are not equal) [enabled/disabled]\&. .RE @@ -484,7 +517,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x vendor="Foo\&.Corporation\&.*" .RE .sp @@ -496,7 +528,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x vendorid=051d* (APC) .RE @@ -509,7 +540,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x product="\&.*(Smart|Back)\-?UPS\&.*" .RE .RE @@ -524,10 +554,13 @@ bus="00[2\-3]")\&. \fBsubdriver =\fR \fIstring\fR .RS 4 Select a serial\-over\-USB subdriver to use\&. You have a choice between -\fBphoenix\fR, +\fBcypress\fR, +\fBfabula\fR, +\fBfuji\fR, \fBippon\fR, -\fBcypress\fR, and -\fBkrauler\fR\&. When using this option, it is mandatory to also specify the +\fBkrauler\fR +and +\fBphoenix\fR\&. When using this option, it is mandatory to also specify the \fBvendorid\fR and \fBproductid\fR\&. @@ -543,6 +576,60 @@ subdriver\&. This is mandatory for some devices to work (LDLC, Dynamix and other or 0x4095), according to your device entry in NUT hardware compatibility list (HCL)\&. .RE +.sp +.it 1 an-trap +.nr an-no-space-flag 1 +.nr an-break-flag 1 +.br +.ps +1 +\fBIMPLEMENTATION NOTES\fR +.RS 4 +.PP +\fB\fIfabula\fR\fR\fB subdriver\fR +.RS 4 +This subdriver, meant to be used with the +\fImegatec\fR +protocol, does +\fBnot\fR +support the various +\fBtest\&.battery\fR +commands\&. Plus, the +\fBshutdown\&.return\fR +command ignores the values set in +\fIups\&.delay\&.start\fR/\fBondelay\fR +and makes the UPS turn on the load as soon as power is back\&. +.RE +.PP +\fB\fIfuji\fR\fR\fB subdriver\fR +.RS 4 +This subdriver, meant to be used with the +\fImegatec\fR +protocol, does +\fBnot\fR +support the +\fBshutdown\&.stayoff\fR +and +\fBload\&.off\fR +commands\&. Plus, the +\fBshutdown\&.return\fR +command ignores the values set in +\fIups\&.delay\&.start\fR/\fBondelay\fR +and makes the UPS turn on the load as soon as power is back\&. +.RE +.PP +\fB\fIkrauler\fR\fR\fB subdriver\fR +.RS 4 +This subdriver, meant to be used with the +\fImegatec\fR +protocol, does +\fBnot\fR +support the shutdown commands, i\&.e\&.: +\fBshutdown\&.return\fR, +\fBshutdown\&.stayoff\fR +and +\fBload\&.off\fR\&. +.RE +.RE .SH "UPS COMMANDS" .sp This driver supports some instant commands (see \fBupscmd\fR(8)): @@ -554,7 +641,7 @@ Toggle the UPS beeper\&. (Not available on some hardware) .PP \fBload\&.on\fR .RS 4 -Turn on the load immediately\&. +Turn on the load immediately\&. (Not available on some hardware) .RE .PP \fBload\&.off\fR @@ -597,7 +684,7 @@ Perform a quick (10 second) battery test\&. .RS 4 Stop a running battery test\&. (Not available on some hardware) .RE -.SS "MECER, MEGATEC, MEGATEC/OLD, MUSTEK, Q1, ZINTO PROTOCOLS" +.SS "BESTUPS, MECER, MEGATEC, MEGATEC/OLD, MUSTEK, Q1, ZINTO PROTOCOLS" .PP \fBtest\&.battery\&.start\fR \fIvalue\fR .RS 4 @@ -763,6 +850,22 @@ driver wants a \fIvalue\fR in seconds\&. .RE +.SH "NOTES FOR THE PREVIOUS USER OF BESTUPS DRIVER" +.sp +The \fBnutdrv_qx\fR driver having replaced the bestups one, some configuration changes may be required by users switching to \fBnutdrv_qx\fR\&. +.sp +Part of this, the following bestups options, in \fBups.conf\fR(5), are no longer supported by this driver: +.PP +\fBnombattvolt\fR, \fBbattvoltmult\fR +.RS 4 +See +BATTERY CHARGE\&. +.RE +.PP +\fBID\fR +.RS 4 +Discarded\&. +.RE .SH "NOTES FOR THE PREVIOUS USER OF VOLTRONIC DRIVERS" .sp The \fBnutdrv_qx\fR driver having replaced the voltronic ones, some configuration changes may be required by users switching to \fBnutdrv_qx\fR\&. @@ -971,11 +1074,9 @@ After issuing a \fBshutdown\&.return\fR instant command, the UPS won\(cqt wait \ .IP \(bu 2.3 .\} if the load has been previously (no matter how long before) powered off through -\fBload\&.off\fR/\fBshutdown\&.stayoff\fR -\fIand\fR +\fBload\&.off\fR/\fBshutdown\&.stayoff\fR\fIand\fR powered on through -\fBload\&.on\fR/\fBshutdown\&.stop\fR -\fIand\fR +\fBload\&.on\fR/\fBshutdown\&.stop\fR\fIand\fR .RE .sp .RS 4 @@ -1006,6 +1107,9 @@ command .RE .sp In this case, as soon as mains returns the load will be powered\&. +.SS "VOLTRONIC\-QS\-HEX UNITS" +.sp +\fBshutdown\&.return\fR, \fBload\&.off\fR, and \fBshutdown\&.stayoff\fR instant commands are known to work as expected only if mains is present, otherwise, as soon as mains returns the load will be powered\&. .SH "UPS WARNINGS (VOLTRONIC PROTOCOL)" .sp The UPSes supported by \fIvoltronic\fR protocol report warnings through a 64bit flag (bit1bit2\&...bit63bit64) where 1 means that a warning arose, while 0 means no warning\&. Since more than one warning at a time can be signaled, and because of the limited space in the ups\&.alarm variable, if the length of the warnings exceeds that of ups\&.alarms variable, they will be reported as bits\&. If you want to know the explanation of that bit you can either watch the log or see the next table (unlisted bits equal to unknown warnings)\&. diff --git a/docs/man/nutdrv_qx.txt b/docs/man/nutdrv_qx.txt index 963342c..5d08901 100644 --- a/docs/man/nutdrv_qx.txt +++ b/docs/man/nutdrv_qx.txt @@ -52,7 +52,7 @@ If you set stayoff in linkman:ups.conf[5] when FSD arises the UPS will call a *s *protocol =* 'string':: Skip autodetection of the protocol to use and only use the one specified. -Supported values: 'mecer', 'megatec', 'megatec/old', 'mustek', 'q1', 'voltronic', 'voltronic-qs' and 'zinto'. +Supported values: 'bestups', 'mecer', 'megatec', 'megatec/old', 'mustek', 'q1', 'voltronic', 'voltronic-qs', 'voltronic-qs-hex' and 'zinto'. + Note that if you end up using the 'q1' protocol, you may want to give a try to the 'mecer', 'megatec' and 'zinto' ones setting the <> (only one, or both). @@ -103,6 +103,14 @@ If not specified, the driver defaults to 10%. Only used if *runtimecal* is also specified. +BESTUPS, MECER, MEGATAEC, MEGATEC/OLD, MUSTEK, Q1, VOLTRONIC-QS, VOLTRONIC-QS-HEX, ZINTO PROTOCOLS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +*ignoresab*:: +Some UPSes incorrectly report the `Shutdown Active' bit as always on, consequently making the driver believe the UPS is nearing a shutdown (and, as a result, ups.status always contains +FSD+... and you know what this means). +Setting this flag will make the driver ignore the `Shutdown Active' bit. + + [[old-blazer-protocols-options]] MECER, MEGATAEC, MEGATEC/OLD, MUSTEK, ZINTO PROTOCOLS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -122,6 +130,19 @@ Some UPSes will lock up if you attempt to read vendor information from them. Setting this flag will make the driver skip this step. +BESTUPS PROTOCOL +~~~~~~~~~~~~~~~~ + +*ondelay*:: +The acceptable range is +60..599940+ seconds. + +*offdelay*:: +The acceptable range is +12..5940+ seconds. + +*pins_shutdown_mode =* 'value':: +Set http://www.networkupstools.org/protocols/sola.html#_shutdown_set_command[shutdown mode functionality of Pin 1 and Pin 7] on the UPS DB9 communication port (Per Best Power’s EPS-0059) to 'value' [+0..6+]. + + Q1 PROTOCOL ~~~~~~~~~~~ @@ -132,8 +153,8 @@ The acceptable range is +0..599940+ seconds. The acceptable range is +12..600+ seconds. -VOLTRONIC-QS PROTOCOL -~~~~~~~~~~~~~~~~~~~~~ +VOLTRONIC-QS, VOLTRONIC-QS-HEX PROTOCOLS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *ondelay*:: The acceptable range is +60..599940+ seconds. @@ -215,7 +236,7 @@ If enabled, when the UPS is turned on, it will check if the battery is connected Enable or disable site fault detection [+enabled+/+disabled+]. If enabled, the UPS will beep when the input neutral and hot wires are reversed. -*costant_phase_angle =* 'string':: +*constant_phase_angle =* 'string':: Enable or disable Constant Phase Angle Function (output and input phase angles are not equal) [+enabled+/+disabled+]. *limited_runtime_on_battery =* 'string':: @@ -301,7 +322,7 @@ The argument is a regular expression that must match the bus name where the UPS *subdriver =* 'string':: Select a serial-over-USB subdriver to use. -You have a choice between *phoenix*, *ippon*, *cypress*, and *krauler*. +You have a choice between *cypress*, *fabula*, *fuji*, *ippon*, *krauler* and *phoenix*. When using this option, it is mandatory to also specify the *vendorid* and *productid*. *langid_fix =* 'value':: @@ -310,6 +331,21 @@ This is mandatory for some devices to work (LDLC, Dynamix and others). You must provide *value* (+0x409+ or +0x4095+), according to your device entry in NUT hardware compatibility list (HCL). +IMPLEMENTATION NOTES +^^^^^^^^^^^^^^^^^^^^ + +*'fabula' subdriver*:: +This subdriver, meant to be used with the 'megatec' protocol, does *not* support the various *test.battery* commands. +Plus, the *shutdown.return* command ignores the values set in 'ups.delay.start'/*ondelay* and makes the UPS turn on the load as soon as power is back. + +*'fuji' subdriver*:: +This subdriver, meant to be used with the 'megatec' protocol, does *not* support the *shutdown.stayoff* and *load.off* commands. +Plus, the *shutdown.return* command ignores the values set in 'ups.delay.start'/*ondelay* and makes the UPS turn on the load as soon as power is back. + +*'krauler' subdriver*:: +This subdriver, meant to be used with the 'megatec' protocol, does *not* support the shutdown commands, i.e.: *shutdown.return*, *shutdown.stayoff* and *load.off*. + + UPS COMMANDS ------------ @@ -321,6 +357,7 @@ Toggle the UPS beeper. *load.on*:: Turn on the load immediately. +(Not available on some hardware) *load.off*:: Turn off the load immediately (see <<_known_problems,KNOWN PROBLEMS>>). @@ -348,8 +385,8 @@ Stop a running battery test. (Not available on some hardware) -MECER, MEGATEC, MEGATEC/OLD, MUSTEK, Q1, ZINTO PROTOCOLS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BESTUPS, MECER, MEGATEC, MEGATEC/OLD, MUSTEK, Q1, ZINTO PROTOCOLS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *test.battery.start* 'value':: Perform a battery test for the duration of 'value' seconds (truncated to 60 seconds) [+60..5940+]. @@ -470,6 +507,21 @@ The following instant command has also been changed: While the old blazer drivers expected a 'value' in minutes, the *nutdrv_qx* driver wants a 'value' in seconds. +NOTES FOR THE PREVIOUS USER OF BESTUPS DRIVER +--------------------------------------------- + +The *nutdrv_qx* driver having replaced the bestups one, some configuration changes may be required by users switching to *nutdrv_qx*. + +Part of this, the following bestups options, in linkman:ups.conf[5], are no longer supported by this driver: + +*nombattvolt*:: +*battvoltmult*:: +See <<_battery_charge,BATTERY CHARGE>>. + +*ID*:: +Discarded. + + NOTES FOR THE PREVIOUS USER OF VOLTRONIC DRIVERS ------------------------------------------------ @@ -593,6 +645,12 @@ After issuing a *shutdown.return* instant command, the UPS won't wait *ondelay* In this case, as soon as mains returns the load will be powered. +VOLTRONIC-QS-HEX UNITS +~~~~~~~~~~~~~~~~~~~~~~ + +*shutdown.return*, *load.off*, and *shutdown.stayoff* instant commands are known to work as expected only if mains is present, otherwise, as soon as mains returns the load will be powered. + + UPS WARNINGS (VOLTRONIC PROTOCOL) --------------------------------- diff --git a/docs/man/nutscan.3 b/docs/man/nutscan.3 index 0f5e677..49211d7 100644 --- a/docs/man/nutscan.3 +++ b/docs/man/nutscan.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -58,7 +58,6 @@ Then, to discover new devices, use the appropriate function: .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_scan_usb\fR(3) for supported USB devices, .RE @@ -71,7 +70,6 @@ for supported USB devices, .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_scan_snmp\fR(3) for supported SNMP agents, .RE @@ -84,7 +82,6 @@ for supported SNMP agents, .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_scan_xml_http\fR(3) for Eaton Network Management Card, .RE @@ -97,7 +94,6 @@ for Eaton Network Management Card, .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_scan_nut\fR(3) for NUT servers (upsd), using the classic method, .RE @@ -110,7 +106,6 @@ for NUT servers (upsd), using the classic method, .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_scan_avahi\fR(3) for NUT servers (upsd), using the mDNS (Avahi) method, .RE @@ -123,7 +118,6 @@ for NUT servers (upsd), using the mDNS (Avahi) method, .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_scan_ipmi\fR(3) for supported IPMI PSU\&. .RE @@ -140,7 +134,6 @@ Helper functions are also provided to output data using standard formats: .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_display_parsable\fR(3) for parsable output, .RE @@ -153,7 +146,6 @@ for parsable output, .sp -1 .IP \(bu 2.3 .\} - \fBnutscan_display_ups_conf\fR(3) for ups\&.conf style\&. .RE diff --git a/docs/man/nutscan_add_device_to_device.3 b/docs/man/nutscan_add_device_to_device.3 index 875732d..f98dfac 100644 --- a/docs/man/nutscan_add_device_to_device.3 +++ b/docs/man/nutscan_add_device_to_device.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_add_device_to_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_ADD_DEVICE_T" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_ADD_DEVICE_T" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_add_option_to_device.3 b/docs/man/nutscan_add_option_to_device.3 index bb1bd59..c591587 100644 --- a/docs/man/nutscan_add_option_to_device.3 +++ b/docs/man/nutscan_add_option_to_device.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_add_option_to_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_ADD_OPTION_T" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_ADD_OPTION_T" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_cidr_to_ip.3 b/docs/man/nutscan_cidr_to_ip.3 index 0e2ae46..aedb836 100644 --- a/docs/man/nutscan_cidr_to_ip.3 +++ b/docs/man/nutscan_cidr_to_ip.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_cidr_to_ip .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_CIDR_TO_IP" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_CIDR_TO_IP" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_display_parsable.3 b/docs/man/nutscan_display_parsable.3 index f812757..0b1ac06 100644 --- a/docs/man/nutscan_display_parsable.3 +++ b/docs/man/nutscan_display_parsable.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_display_parsable .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_DISPLAY_PARS" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_DISPLAY_PARS" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_display_ups_conf.3 b/docs/man/nutscan_display_ups_conf.3 index 917707f..6df43c5 100644 --- a/docs/man/nutscan_display_ups_conf.3 +++ b/docs/man/nutscan_display_ups_conf.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_display_ups_conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_DISPLAY_UPS_" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_DISPLAY_UPS_" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_free_device.3 b/docs/man/nutscan_free_device.3 index c05bb8e..962cd4b 100644 --- a/docs/man/nutscan_free_device.3 +++ b/docs/man/nutscan_free_device.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_free_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_FREE_DEVICE" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_FREE_DEVICE" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_get_serial_ports_list.3 b/docs/man/nutscan_get_serial_ports_list.3 index 47b3bd4..567eb8e 100644 --- a/docs/man/nutscan_get_serial_ports_list.3 +++ b/docs/man/nutscan_get_serial_ports_list.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_get_serial_ports_list .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_GET_SERIAL_P" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_GET_SERIAL_P" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_init.3 b/docs/man/nutscan_init.3 index 549cf0d..0691ee5 100644 --- a/docs/man/nutscan_init.3 +++ b/docs/man/nutscan_init.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_init .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_INIT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_INIT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_new_device.3 b/docs/man/nutscan_new_device.3 index 5248d3f..9bdcab1 100644 --- a/docs/man/nutscan_new_device.3 +++ b/docs/man/nutscan_new_device.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_new_device .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_NEW_DEVICE" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_NEW_DEVICE" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_avahi.3 b/docs/man/nutscan_scan_avahi.3 index d113387..921d61f 100644 --- a/docs/man/nutscan_scan_avahi.3 +++ b/docs/man/nutscan_scan_avahi.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_scan_avahi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_SCAN_AVAHI" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_SCAN_AVAHI" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_eaton_serial.3 b/docs/man/nutscan_scan_eaton_serial.3 index 0d34a97..13f2bdf 100644 --- a/docs/man/nutscan_scan_eaton_serial.3 +++ b/docs/man/nutscan_scan_eaton_serial.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_scan_eaton_serial .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_SCAN_EATON_S" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_SCAN_EATON_S" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_ipmi.3 b/docs/man/nutscan_scan_ipmi.3 index 3731954..c782ec7 100644 --- a/docs/man/nutscan_scan_ipmi.3 +++ b/docs/man/nutscan_scan_ipmi.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_scan_ipmi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_SCAN_IPMI" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_SCAN_IPMI" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_nut.3 b/docs/man/nutscan_scan_nut.3 index 482aea7..d3e34d7 100644 --- a/docs/man/nutscan_scan_nut.3 +++ b/docs/man/nutscan_scan_nut.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_scan_nut .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_SCAN_NUT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_SCAN_NUT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_snmp.3 b/docs/man/nutscan_scan_snmp.3 index f255dc8..40cdb3b 100644 --- a/docs/man/nutscan_scan_snmp.3 +++ b/docs/man/nutscan_scan_snmp.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_scan_snmp .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_SCAN_SNMP" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_SCAN_SNMP" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_usb.3 b/docs/man/nutscan_scan_usb.3 index 9e223df..fca4e54 100644 --- a/docs/man/nutscan_scan_usb.3 +++ b/docs/man/nutscan_scan_usb.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_scan_usb .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_SCAN_USB" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_SCAN_USB" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutscan_scan_xml_http.3 b/docs/man/nutscan_scan_xml_http.3 index 75f35c0..64a6797 100644 --- a/docs/man/nutscan_scan_xml_http.3 +++ b/docs/man/nutscan_scan_xml_http.3 @@ -1,13 +1,13 @@ '\" t .\" Title: nutscan_scan_xml_http .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTSCAN_SCAN_XML_HTT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTSCAN_SCAN_XML_HTT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutupsdrv.8 b/docs/man/nutupsdrv.8 index 991d88a..234f103 100644 --- a/docs/man/nutupsdrv.8 +++ b/docs/man/nutupsdrv.8 @@ -1,13 +1,13 @@ '\" t .\" Title: nutupsdrv .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "NUTUPSDRV" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "NUTUPSDRV" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/oneac.8 b/docs/man/oneac.8 index f4c54bc..4b69624 100644 --- a/docs/man/oneac.8 +++ b/docs/man/oneac.8 @@ -1,13 +1,13 @@ '\" t .\" Title: oneac .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "ONEAC" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "ONEAC" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/optiups.8 b/docs/man/optiups.8 index df62f9d..6713849 100644 --- a/docs/man/optiups.8 +++ b/docs/man/optiups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: optiups .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "OPTIUPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "OPTIUPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/powercom.8 b/docs/man/powercom.8 index 17f0ae3..6782a26 100644 --- a/docs/man/powercom.8 +++ b/docs/man/powercom.8 @@ -1,13 +1,13 @@ '\" t .\" Title: powercom .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "POWERCOM" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "POWERCOM" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/powerman-pdu.8 b/docs/man/powerman-pdu.8 index 839b963..23549ea 100644 --- a/docs/man/powerman-pdu.8 +++ b/docs/man/powerman-pdu.8 @@ -1,13 +1,13 @@ '\" t .\" Title: powerman-pdu .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "POWERMAN\-PDU" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "POWERMAN\-PDU" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/powerpanel.8 b/docs/man/powerpanel.8 index b36a90b..1ca1c84 100644 --- a/docs/man/powerpanel.8 +++ b/docs/man/powerpanel.8 @@ -1,13 +1,13 @@ '\" t .\" Title: powerpanel .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "POWERPANEL" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "POWERPANEL" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/rhino.8 b/docs/man/rhino.8 index 280b4c6..f13dc8f 100644 --- a/docs/man/rhino.8 +++ b/docs/man/rhino.8 @@ -1,13 +1,13 @@ '\" t .\" Title: rhino .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "RHINO" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "RHINO" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/richcomm_usb.8 b/docs/man/richcomm_usb.8 index cbc27d5..b171425 100644 --- a/docs/man/richcomm_usb.8 +++ b/docs/man/richcomm_usb.8 @@ -1,13 +1,13 @@ '\" t .\" Title: richcomm_usb .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "RICHCOMM_USB" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "RICHCOMM_USB" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/riello_ser.8 b/docs/man/riello_ser.8 index 8d6227f..e4f41fe 100644 --- a/docs/man/riello_ser.8 +++ b/docs/man/riello_ser.8 @@ -1,13 +1,13 @@ '\" t .\" Title: riello_ser .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "RIELLO_SER" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "RIELLO_SER" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/riello_usb.8 b/docs/man/riello_usb.8 index 6297a49..b29e0ba 100644 --- a/docs/man/riello_usb.8 +++ b/docs/man/riello_usb.8 @@ -1,13 +1,13 @@ '\" t .\" Title: riello_usb .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "RIELLO_USB" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "RIELLO_USB" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/safenet.8 b/docs/man/safenet.8 index 813a87e..2cdd042 100644 --- a/docs/man/safenet.8 +++ b/docs/man/safenet.8 @@ -1,13 +1,13 @@ '\" t .\" Title: safenet .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "SAFENET" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "SAFENET" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/snmp-ups.8 b/docs/man/snmp-ups.8 index 4f12539..594e1bf 100644 --- a/docs/man/snmp-ups.8 +++ b/docs/man/snmp-ups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: snmp-ups .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "SNMP\-UPS" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "SNMP\-UPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/solis.8 b/docs/man/solis.8 index f643df6..434079e 100644 --- a/docs/man/solis.8 +++ b/docs/man/solis.8 @@ -1,13 +1,13 @@ '\" t .\" Title: solis .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "SOLIS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "SOLIS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -80,7 +80,31 @@ Solis 2000 VA Solis 3000 VA .RE .sp -All Solis models are sinusoidal on\-line +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Back\-UPS BZ1200\-BR +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Back\-UPS BZ2200BI\-BR +.RE +.sp +All Solis models are sinusoidal on\-line\&. +.sp +In 2009, Schneider Electric acquired Microsol Technologies, and by 2012, the entire Microsol line of equipment was being sold under the APC brand\&. .SH "EXTRA ARGUMENTS" .sp This driver support the following extra optional settings in the \fBups.conf\fR(5)\&. @@ -111,6 +135,9 @@ shutdown\&.return \- Shut down in \&.3 minutes and restart in \&.3 minutes .\} shutdown\&.stayoff \- Shut down in \&.3 minutes and do not return .RE +.SH "ISSUES" +.sp +The APC version of the Microsol protocol is slightly incompatible with the \fBsolis\fR driver\&. As of version 0\&.62 of the \fBsolis\fR driver, the driver will connect to the UPS, but some values are read incorrectly\&. .SH "AUTHOR" .sp Silvino B\&. Magalhães diff --git a/docs/man/solis.txt b/docs/man/solis.txt index 37bc48d..d009b60 100644 --- a/docs/man/solis.txt +++ b/docs/man/solis.txt @@ -21,8 +21,13 @@ This driver has been tested with : * Solis 1500 VA * Solis 2000 VA * Solis 3000 VA + * Back-UPS BZ1200-BR + * Back-UPS BZ2200BI-BR -All Solis models are sinusoidal on-line +All Solis models are sinusoidal on-line. + +In 2009, Schneider Electric acquired Microsol Technologies, and by 2012, the +entire Microsol line of equipment was being sold under the APC brand. EXTRA ARGUMENTS --------------- @@ -41,6 +46,13 @@ COMMANDS * shutdown.stayoff - Shut down in .3 minutes and do not return +ISSUES +------ + +The APC version of the Microsol protocol is slightly incompatible with the +*solis* driver. As of version 0.62 of the *solis* driver, the driver will +connect to the UPS, but some values are read incorrectly. + AUTHOR ------ Silvino B. Magalhães diff --git a/docs/man/tripplite.8 b/docs/man/tripplite.8 index fcf979c..f8fde31 100644 --- a/docs/man/tripplite.8 +++ b/docs/man/tripplite.8 @@ -1,13 +1,13 @@ '\" t .\" Title: tripplite .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "TRIPPLITE" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "TRIPPLITE" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/tripplite_usb.8 b/docs/man/tripplite_usb.8 index feecd83..82e80a5 100644 --- a/docs/man/tripplite_usb.8 +++ b/docs/man/tripplite_usb.8 @@ -1,13 +1,13 @@ '\" t .\" Title: tripplite_usb .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "TRIPPLITE_USB" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "TRIPPLITE_USB" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -173,6 +173,12 @@ This driver supports the following optional settings in the \fBups.conf\fR(5) fi This setting controls the delay between receiving the "kill" command (\fI\-k\fR) and actually cutting power to the computer\&. .RE .PP +\fBbattery_min\fR, \fBbattery_max\fR +.RS 4 +These floating\-point values correspond to the "empty" (10%) and "full" (100%) voltages of the battery\&. They are used for an approximation of the battery state\-of\-charge\&. The calculated battery\&.charge value will be clamped to the range of 10% through 100%, so the resting voltage of the charged battery can be used for +\fBbattery_max\fR, and the higher float charge voltage should not cause problems\&. +.RE +.PP \fBbus\fR .RS 4 This regular expression is used to match the USB bus (as seen in diff --git a/docs/man/tripplite_usb.txt b/docs/man/tripplite_usb.txt index 9e4e59e..1d67caa 100644 --- a/docs/man/tripplite_usb.txt +++ b/docs/man/tripplite_usb.txt @@ -60,6 +60,15 @@ file (or with '-x' on the command line): This setting controls the delay between receiving the "kill" command ('-k') and actually cutting power to the computer. +*battery_min*, *battery_max*:: + +These floating-point values correspond to the "empty" (10%) and "full" (100%) +voltages of the battery. They are used for an approximation of the battery +state-of-charge. The calculated battery.charge value will be clamped to the +range of 10% through 100%, so the resting voltage of the charged battery can be +used for *battery_max*, and the higher float charge voltage should not cause +problems. + *bus*:: This regular expression is used to match the USB bus (as seen in diff --git a/docs/man/tripplitesu.8 b/docs/man/tripplitesu.8 index d9bc32e..afb2789 100644 --- a/docs/man/tripplitesu.8 +++ b/docs/man/tripplitesu.8 @@ -1,13 +1,13 @@ '\" t .\" Title: tripplitesu .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "TRIPPLITESU" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "TRIPPLITESU" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/ups.conf.5 b/docs/man/ups.conf.5 index 14584c8..835ae8e 100644 --- a/docs/man/ups.conf.5 +++ b/docs/man/ups.conf.5 @@ -1,13 +1,13 @@ '\" t .\" Title: ups.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/22/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPS\&.CONF" "5" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPS\&.CONF" "5" "04/22/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -107,6 +107,19 @@ The default is 5 seconds\&. Optional\&. The status of the UPS will be refreshed after a maximum delay which is controlled by this setting\&. This is normally 2 seconds\&. This may be useful if the driver is creating too much of a load on your system or network\&. .RE .PP +\fBsynchronous\fR +.RS 4 +Optional\&. The driver work by default in asynchronous mode (i\&.e +\fBsynchronous=no\fR)\&. This means that all data are pushed by the driver on the communication socket to upsd (Unix socket on Unix, Named pipe on Windows) without waiting for these data to be actually consumed\&. With some HW, such as ePDUs, that can produce a lot of data, asynchronous mode may cause some congestion, resulting in the socket to be full, and the driver to appear as not connected\&. By enabling the +\fIsynchronous\fR +flag (value = +\fIyes\fR), the driver will wait for data to be consumed by upsd, prior to publishing more\&. This can be enabled either globally or per driver\&. +.sp +The default is +\fIno\fR +(i\&.e\&. asynchronous mode) for backward compatibility of the driver behavior\&. +.RE +.PP \fBuser\fR .RS 4 Optional\&. If started as root, the driver will setuid(2) to the user id associated with @@ -189,6 +202,21 @@ Optional\&. This can be set as a global variable above your first UPS definition The default is 45 seconds\&. .RE .PP +\fBsynchronous\fR +.RS 4 +Optional\&. Same as the global directive of the same name, but this is for a specific device\&. +.RE +.PP +\fBusb_set_altinterface\fR[=\fIaltinterface\fR] +.RS 4 +Optional\&. Force the USB code to call +usb_set_altinterface(0), as was done in NUT 2\&.7\&.2 and earlier\&. This should not be necessary, since the default for +bAlternateSetting +(as shown in lsusb) is zero on all USB devices seen to date\&. However, this redundant call to +usb_set_altinterface() +prevents certain UPSes from working on Mac OS X\&. If your UPS requires explicitly setting the alternate interface, include this flag, and email the nut\-upsdev list with details about your UPS and operating system\&. +.RE +.PP \fBdefault\&.\fR .RS 4 Optional\&. Set a default value for which is used in case the UPS doesn\(cqt provide a value, but will be overwritten if a value is available from the UPS: diff --git a/docs/man/ups.conf.txt b/docs/man/ups.conf.txt index 4877852..dd145bd 100644 --- a/docs/man/ups.conf.txt +++ b/docs/man/ups.conf.txt @@ -80,6 +80,22 @@ delay which is controlled by this setting. This is normally 2 seconds. This may be useful if the driver is creating too much of a load on your system or network. +*synchronous*:: + +Optional. The driver work by default in asynchronous mode (i.e +*synchronous=no*). This means that all data are pushed by the driver +on the communication socket to upsd (Unix socket on Unix, Named pipe +on Windows) without waiting for these data to be actually consumed. +With some HW, such as ePDUs, that can produce a lot of data, +asynchronous mode may cause some congestion, resulting in the socket to +be full, and the driver to appear as not connected. By enabling the +'synchronous' flag (value = 'yes'), the driver will wait for data to be +consumed by upsd, prior to publishing more. This can be enabled either +globally or per driver. ++ +The default is 'no' (i.e. asynchronous mode) for backward compatibility +of the driver behavior. + *user*:: Optional. If started as root, the driver will setuid(2) to the user id @@ -154,6 +170,21 @@ system from getting stuck due to a broken driver or UPS. + The default is 45 seconds. +*synchronous*:: + +Optional. Same as the global directive of the same name, but this is +for a specific device. + +*usb_set_altinterface*[='altinterface']:: + +Optional. Force the USB code to call `usb_set_altinterface(0)`, as was done in +NUT 2.7.2 and earlier. This should not be necessary, since the default for +`bAlternateSetting` (as shown in lsusb) is zero on all USB devices seen to +date. However, this redundant call to `usb_set_altinterface()` prevents +certain UPSes from working on Mac OS X. If your UPS requires explicitly setting +the alternate interface, include this flag, and email the nut-upsdev list with +details about your UPS and operating system. + *default.*:: Optional. Set a default value for which is used in case the UPS diff --git a/docs/man/upsc.8 b/docs/man/upsc.8 index dab4787..1914da4 100644 --- a/docs/man/upsc.8 +++ b/docs/man/upsc.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsc .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSC" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSC" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_add_host_cert.3 b/docs/man/upscli_add_host_cert.3 index ae8d6f1..aff4f80 100644 --- a/docs/man/upscli_add_host_cert.3 +++ b/docs/man/upscli_add_host_cert.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_add_host_cert .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_ADD_HOST_CERT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_ADD_HOST_CERT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_cleanup.3 b/docs/man/upscli_cleanup.3 index 6364c26..4ed07ef 100644 --- a/docs/man/upscli_cleanup.3 +++ b/docs/man/upscli_cleanup.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_cleanup .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_CLEANUP" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_CLEANUP" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_connect.3 b/docs/man/upscli_connect.3 index f5743bc..bf5e5ff 100644 --- a/docs/man/upscli_connect.3 +++ b/docs/man/upscli_connect.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_connect .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_CONNECT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_CONNECT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_disconnect.3 b/docs/man/upscli_disconnect.3 index fff9b19..05dd513 100644 --- a/docs/man/upscli_disconnect.3 +++ b/docs/man/upscli_disconnect.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_disconnect .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_DISCONNECT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_DISCONNECT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_fd.3 b/docs/man/upscli_fd.3 index 338eca3..9efb4cf 100644 --- a/docs/man/upscli_fd.3 +++ b/docs/man/upscli_fd.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_fd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_FD" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_FD" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_get.3 b/docs/man/upscli_get.3 index 8c88bd3..590711f 100644 --- a/docs/man/upscli_get.3 +++ b/docs/man/upscli_get.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_get .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_GET" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_GET" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -36,8 +36,8 @@ upscli_get \- retrieve data from a UPS .fi .sp .nf -int upscli_get(UPSCONN_t *ups, int numq, const char **query, - int *numa, char ***answer) +int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query, + unsigned int *numa, char ***answer) .fi .SH "DESCRIPTION" .sp @@ -121,7 +121,7 @@ To generate a request for GET NUMLOGINS su700, you would populate query and numq .RS 4 .\} .nf -int numq; +unsigned int numq; const char *query[2]; .fi .if n \{\ @@ -149,6 +149,16 @@ The raw response from upsd to the above query would be NUMLOGINS su700 1\&. Sinc .RS 4 .\} .nf +unsigned int numa; +.fi +.if n \{\ +.RE +.\} +.sp +.if n \{\ +.RS 4 +.\} +.nf numa = 3; answer[0] = "NUMLOGINS" answer[1] = "su700" @@ -174,6 +184,21 @@ The array will be deleted after calling \fBupscli_disconnect\fR(3)\&. Any access .SH "RETURN VALUE" .sp The \fBupscli_get()\fR function returns 0 on success, or \-1 if an error occurs\&. +.sp +If \fBupsd\fR disconnects, you may need to handle or ignore SIGPIPE in order to prevent your program from terminating the next time that the library writes to the disconnected socket\&. The following code in your initialization function will allow the \fBupscli_get()\fR call to return an error in that case: +.sp +.if n \{\ +.RS 4 +.\} +.nf +#include +\&.\&.\&. +signal (SIGPIPE, SIG_IGN); +\&.\&.\&. +.fi +.if n \{\ +.RE +.\} .SH "SEE ALSO" .sp \fBupscli_list_start\fR(3), \fBupscli_list_next\fR(3), \fBupscli_strerror\fR(3), \fBupscli_upserror\fR(3) diff --git a/docs/man/upscli_get.txt b/docs/man/upscli_get.txt index 00aea76..71cdf1a 100644 --- a/docs/man/upscli_get.txt +++ b/docs/man/upscli_get.txt @@ -10,8 +10,8 @@ SYNOPSIS #include - int upscli_get(UPSCONN_t *ups, int numq, const char **query, - int *numa, char ***answer) + int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query, + unsigned int *numa, char ***answer) DESCRIPTION ----------- @@ -43,7 +43,7 @@ QUERY FORMATTING To generate a request for `GET NUMLOGINS su700`, you would populate query and numq as follows: - int numq; + unsigned int numq; const char *query[2]; query[0] = "NUMLOGINS"; @@ -58,6 +58,8 @@ ANSWER FORMATTING The raw response from upsd to the above query would be `NUMLOGINS su700 1`. Since this is split up for you, the values work out like this: + unsigned int numa; + numa = 3; answer[0] = "NUMLOGINS" answer[1] = "su700" @@ -96,6 +98,16 @@ RETURN VALUE The *upscli_get()* function returns 0 on success, or -1 if an error occurs. +If *upsd* disconnects, you may need to handle or ignore `SIGPIPE` in order to +prevent your program from terminating the next time that the library writes to +the disconnected socket. The following code in your initialization function +will allow the *upscli_get()* call to return an error in that case: + + #include + ... + signal (SIGPIPE, SIG_IGN); + ... + SEE ALSO -------- linkman:upscli_list_start[3], linkman:upscli_list_next[3], diff --git a/docs/man/upscli_init.3 b/docs/man/upscli_init.3 index 9a666a0..67afe20 100644 --- a/docs/man/upscli_init.3 +++ b/docs/man/upscli_init.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_init .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_INIT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_INIT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_list_next.3 b/docs/man/upscli_list_next.3 index 6e64479..00a231d 100644 --- a/docs/man/upscli_list_next.3 +++ b/docs/man/upscli_list_next.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_list_next .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_LIST_NEXT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_LIST_NEXT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -36,8 +36,8 @@ upscli_list_next \- retrieve list items from a UPS .fi .sp .nf -int upscli_list_next(UPSCONN_t *ups, int numq, const char **query, - int *numa, char ***answer) +int upscli_list_next(UPSCONN_t *ups, unsigned int numq, const char **query, + unsigned int *numa, char ***answer) .fi .SH "DESCRIPTION" .sp diff --git a/docs/man/upscli_list_next.txt b/docs/man/upscli_list_next.txt index 30fc7b3..20c1174 100644 --- a/docs/man/upscli_list_next.txt +++ b/docs/man/upscli_list_next.txt @@ -11,8 +11,8 @@ SYNOPSIS #include - int upscli_list_next(UPSCONN_t *ups, int numq, const char **query, - int *numa, char ***answer) + int upscli_list_next(UPSCONN_t *ups, unsigned int numq, const char **query, + unsigned int *numa, char ***answer) DESCRIPTION ----------- diff --git a/docs/man/upscli_list_start.3 b/docs/man/upscli_list_start.3 index 9b66ccf..e26f750 100644 --- a/docs/man/upscli_list_start.3 +++ b/docs/man/upscli_list_start.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_list_start .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_LIST_START" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_LIST_START" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -33,7 +33,10 @@ upscli_list_start \- begin multi\-item retrieval from a UPS .sp .nf #include -int upscli_list_start(UPSCONN_t *ups, int numq, const char **query) +.fi +.sp +.nf +int upscli_list_start(UPSCONN_t *ups, unsigned int numq, const char **query) .fi .SH "DESCRIPTION" .sp @@ -117,7 +120,7 @@ To see the list of variables on a UPS called \fIsu700\fR, the protocol command w .RS 4 .\} .nf -int numq; +unsigned int numq; const char *query[2]; .fi .if n \{\ diff --git a/docs/man/upscli_list_start.txt b/docs/man/upscli_list_start.txt index e041934..e425f9e 100644 --- a/docs/man/upscli_list_start.txt +++ b/docs/man/upscli_list_start.txt @@ -10,7 +10,8 @@ SYNOPSIS -------- #include - int upscli_list_start(UPSCONN_t *ups, int numq, const char **query) + + int upscli_list_start(UPSCONN_t *ups, unsigned int numq, const char **query) DESCRIPTION ----------- @@ -46,7 +47,7 @@ To see the list of variables on a UPS called 'su700', the protocol command would be `LIST VAR su700`. To start that list with this function, you would populate query and numq as follows: - int numq; + unsigned int numq; const char *query[2]; query[0] = "VAR"; diff --git a/docs/man/upscli_readline.3 b/docs/man/upscli_readline.3 index 925d683..523bbdc 100644 --- a/docs/man/upscli_readline.3 +++ b/docs/man/upscli_readline.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_readline .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_READLINE" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_READLINE" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_sendline.3 b/docs/man/upscli_sendline.3 index 1f54d10..61bfac1 100644 --- a/docs/man/upscli_sendline.3 +++ b/docs/man/upscli_sendline.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_sendline .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_SENDLINE" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_SENDLINE" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_splitaddr.3 b/docs/man/upscli_splitaddr.3 index 1db69f3..ec231d7 100644 --- a/docs/man/upscli_splitaddr.3 +++ b/docs/man/upscli_splitaddr.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_splitaddr .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_SPLITADDR" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_SPLITADDR" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_splitname.3 b/docs/man/upscli_splitname.3 index 2dc54da..bfd993b 100644 --- a/docs/man/upscli_splitname.3 +++ b/docs/man/upscli_splitname.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_splitname .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_SPLITNAME" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_SPLITNAME" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_ssl.3 b/docs/man/upscli_ssl.3 index 2460c43..a5b5bc1 100644 --- a/docs/man/upscli_ssl.3 +++ b/docs/man/upscli_ssl.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_ssl .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_SSL" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_SSL" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_strerror.3 b/docs/man/upscli_strerror.3 index 28069f8..af15ed9 100644 --- a/docs/man/upscli_strerror.3 +++ b/docs/man/upscli_strerror.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_strerror .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_STRERROR" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_STRERROR" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_upserror.3 b/docs/man/upscli_upserror.3 index bcfb5a3..b2f2d9c 100644 --- a/docs/man/upscli_upserror.3 +++ b/docs/man/upscli_upserror.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upscli_upserror .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLI_UPSERROR" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLI_UPSERROR" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsclient.3 b/docs/man/upsclient.3 index 3f822f8..8583d22 100644 --- a/docs/man/upsclient.3 +++ b/docs/man/upsclient.3 @@ -1,13 +1,13 @@ '\" t .\" Title: upsclient .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCLIENT" "3" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCLIENT" "3" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscmd.8 b/docs/man/upscmd.8 index d21afa1..f86c873 100644 --- a/docs/man/upscmd.8 +++ b/docs/man/upscmd.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upscmd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCMD" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCMD" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscode2.8 b/docs/man/upscode2.8 index 1ea0a85..3163168 100644 --- a/docs/man/upscode2.8 +++ b/docs/man/upscode2.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upscode2 .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSCODE2" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSCODE2" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.8 b/docs/man/upsd.8 index 026be3d..5c81855 100644 --- a/docs/man/upsd.8 +++ b/docs/man/upsd.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSD" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSD" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.conf.5 b/docs/man/upsd.conf.5 index 7e13883..24dc318 100644 --- a/docs/man/upsd.conf.5 +++ b/docs/man/upsd.conf.5 @@ -1,13 +1,13 @@ '\" t .\" Title: upsd.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSD\&.CONF" "5" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSD\&.CONF" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -110,7 +110,6 @@ When compiled with SSL support with NSS backend and client certificate validatio .sp -1 .IP \(bu 2.3 .\} - \fI0\fR to not request to clients to provide any certificate .RE @@ -123,7 +122,6 @@ to not request to clients to provide any certificate .sp -1 .IP \(bu 2.3 .\} - \fI1\fR to require to all clients a certificate .RE @@ -136,7 +134,6 @@ to require to all clients a certificate .sp -1 .IP \(bu 2.3 .\} - \fI2\fR to require to all clients a valid certificate .RE diff --git a/docs/man/upsd.users.5 b/docs/man/upsd.users.5 index ee73e73..7367139 100644 --- a/docs/man/upsd.users.5 +++ b/docs/man/upsd.users.5 @@ -1,13 +1,13 @@ '\" t .\" Title: upsd.users .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSD\&.USERS" "5" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSD\&.USERS" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsdrvctl.8 b/docs/man/upsdrvctl.8 index a8610d8..ae4e846 100644 --- a/docs/man/upsdrvctl.8 +++ b/docs/man/upsdrvctl.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsdrvctl .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSDRVCTL" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSDRVCTL" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsimage.cgi.8 b/docs/man/upsimage.cgi.8 index 8847895..6464d23 100644 --- a/docs/man/upsimage.cgi.8 +++ b/docs/man/upsimage.cgi.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsimage.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 03/21/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSIMAGE\&.CGI" "8" "03/21/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSIMAGE\&.CGI" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upslog.8 b/docs/man/upslog.8 index 1f3da75..a79cf23 100644 --- a/docs/man/upslog.8 +++ b/docs/man/upslog.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upslog .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSLOG" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSLOG" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -138,6 +138,9 @@ is not defined, it will use the value that was compiled into the program\&. This .SH "SERVICE DELAYS" .sp The interval value is merely the number given to \fBsleep\fR(3) after running through the format string\&. Therefore, a query will actually take slightly longer than the interval, depending on the speed of your system\&. +.SH "ON-DEMAND LOGGING" +.sp +Sending a USR1 signal to a running \fBupslog\fR process makes it wake from the current sleep and log immediately\&. This is useful when triggered from a \fBupssched\fR event trigger (e\&.g\&. AT ONBATT or AT ONLINE) to ensure that an entry always exists, even if the power goes away for a period of time shorter than that specified by the \-i argument\&. .SH "LOG ROTATION" .sp \fBupslog\fR writes its PID to upslog\&.pid, and will reopen the log file if you send it a SIGHUP\&. This allows it to keep running when the log is rotated by an external program\&. @@ -147,7 +150,7 @@ The interval value is merely the number given to \fBsleep\fR(3) after running th \fBupsd\fR(8) .SS "Clients:" .sp -\fBupsc\fR(8), \fBupscmd\fR(8), \fBupsrw\fR(8), \fBupsmon\fR(8) +\fBupsc\fR(8), \fBupscmd\fR(8), \fBupsrw\fR(8), \fBupsmon\fR(8), \fBupssched\fR(8) .SS "Internet resources:" .sp The NUT (Network UPS Tools) home page: http://www\&.networkupstools\&.org/ diff --git a/docs/man/upslog.txt b/docs/man/upslog.txt index b3603d8..4571cc3 100644 --- a/docs/man/upslog.txt +++ b/docs/man/upslog.txt @@ -86,6 +86,16 @@ The interval value is merely the number given to *sleep*(3) after running through the format string. Therefore, a query will actually take slightly longer than the interval, depending on the speed of your system. +ON-DEMAND LOGGING +----------------- + +Sending a USR1 signal to a running *upslog* process makes it wake from the +current sleep and log immediately. This is useful when triggered from a +*upssched* event trigger (e.g. `AT ONBATT` or `AT ONLINE`) to ensure that an +entry always exists, even if the power goes away for a period of time shorter +than that specified by the `-i` argument. + + LOG ROTATION ------------ @@ -103,7 +113,7 @@ linkman:upsd[8] Clients: ~~~~~~~~ linkman:upsc[8], linkman:upscmd[8], -linkman:upsrw[8], linkman:upsmon[8] +linkman:upsrw[8], linkman:upsmon[8], linkman:upssched[8] Internet resources: ~~~~~~~~~~~~~~~~~~~ diff --git a/docs/man/upsmon.8 b/docs/man/upsmon.8 index 7830762..9421226 100644 --- a/docs/man/upsmon.8 +++ b/docs/man/upsmon.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsmon .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSMON" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSMON" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -233,7 +233,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - NOTIFYFLAG ONLINE SYSLOG .RE .sp @@ -245,7 +244,6 @@ NOTIFYFLAG ONLINE SYSLOG .sp -1 .IP \(bu 2.3 .\} - NOTIFYFLAG ONBATT SYSLOG+WALL .RE .sp @@ -257,7 +255,6 @@ NOTIFYFLAG ONBATT SYSLOG+WALL .sp -1 .IP \(bu 2.3 .\} - NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC .RE .sp @@ -301,7 +298,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - NOTIFYMSG ONLINE "UPS %s is getting line power" .RE .sp diff --git a/docs/man/upsmon.conf.5 b/docs/man/upsmon.conf.5 index 9c7b002..d2e3526 100644 --- a/docs/man/upsmon.conf.5 +++ b/docs/man/upsmon.conf.5 @@ -1,13 +1,13 @@ '\" t .\" Title: upsmon.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSMON\&.CONF" "5" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSMON\&.CONF" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -339,7 +339,9 @@ if it exists\&. .sp This is done to forcibly reset the slaves, so they don\(cqt get stuck at the "halted" stage even if the power returns during the shutdown process\&. This usually does not work well on contact\-closure UPSes that use the genericups driver\&. .sp -See the shutdown\&.txt file in the docs subdirectory for more information\&. +See the config\-notes\&.txt file in the docs subdirectory for more information\&. Refer to the section: + +"Configuring automatic shutdowns for low battery events", or refer to the online version\&. .RE .PP \fBRBWARNTIME\fR \fIseconds\fR diff --git a/docs/man/upsmon.conf.txt b/docs/man/upsmon.conf.txt index 4ae285b..fccf495 100644 --- a/docs/man/upsmon.conf.txt +++ b/docs/man/upsmon.conf.txt @@ -275,7 +275,10 @@ the "halted" stage even if the power returns during the shutdown process. This usually does not work well on contact-closure UPSes that use the genericups driver. + -See the shutdown.txt file in the docs subdirectory for more information. +See the config-notes.txt file in the docs subdirectory for more information. +Refer to the section: +[[UPS_shutdown]] "Configuring automatic shutdowns for low battery events", +or refer to the online version. *RBWARNTIME* 'seconds':: diff --git a/docs/man/upsrw.8 b/docs/man/upsrw.8 index 280505d..ed61839 100644 --- a/docs/man/upsrw.8 +++ b/docs/man/upsrw.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsrw .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSRW" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSRW" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upssched.8 b/docs/man/upssched.8 index 05b759a..0c3f838 100644 --- a/docs/man/upssched.8 +++ b/docs/man/upssched.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upssched .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSSCHED" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSSCHED" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upssched.conf.5 b/docs/man/upssched.conf.5 index 0483b31..8770d33 100644 --- a/docs/man/upssched.conf.5 +++ b/docs/man/upssched.conf.5 @@ -1,13 +1,13 @@ '\" t .\" Title: upssched.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSSCHED\&.CONF" "5" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSSCHED\&.CONF" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsset.cgi.8 b/docs/man/upsset.cgi.8 index b5b563a..d74c140 100644 --- a/docs/man/upsset.cgi.8 +++ b/docs/man/upsset.cgi.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsset.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSSET\&.CGI" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSSET\&.CGI" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsset.conf.5 b/docs/man/upsset.conf.5 index 87a5601..4292322 100644 --- a/docs/man/upsset.conf.5 +++ b/docs/man/upsset.conf.5 @@ -1,13 +1,13 @@ '\" t .\" Title: upsset.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSSET\&.CONF" "5" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSSET\&.CONF" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsstats.cgi.8 b/docs/man/upsstats.cgi.8 index 1458bad..4a2aea9 100644 --- a/docs/man/upsstats.cgi.8 +++ b/docs/man/upsstats.cgi.8 @@ -1,13 +1,13 @@ '\" t .\" Title: upsstats.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSSTATS\&.CGI" "8" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSSTATS\&.CGI" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsstats.html.5 b/docs/man/upsstats.html.5 index e9639ca..0864821 100644 --- a/docs/man/upsstats.html.5 +++ b/docs/man/upsstats.html.5 @@ -1,13 +1,13 @@ '\" t .\" Title: upsstats.html .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/25/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "UPSSTATS\&.HTML" "5" "02/25/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "UPSSTATS\&.HTML" "5" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/usbhid-ups.8 b/docs/man/usbhid-ups.8 index 6fd4034..0972045 100644 --- a/docs/man/usbhid-ups.8 +++ b/docs/man/usbhid-ups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: usbhid-ups .\" Author: [see the "AUTHORS" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "USBHID\-UPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "USBHID\-UPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -103,7 +103,7 @@ some Belkin models, .sp -1 .IP \(bu 2.3 .\} -some Cyber Power Systems models\&. +some Cyber Power Systems models, .RE .sp .RS 4 @@ -114,7 +114,18 @@ some Cyber Power Systems models\&. .sp -1 .IP \(bu 2.3 .\} -some TrippLite models +some Powercom models, +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +some TrippLite models\&. .RE .sp For a more complete list, refer to the NUT hardware compatibility list, available in the source distribution as data/drivers\&.list, or on the NUT website\&. You may use the "explore" driver option to gather information from HID UPSes which are not yet supported; see below for details\&. @@ -223,7 +234,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x vendor="Foo\&.Corporation\&.*" .RE .sp @@ -235,7 +245,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x vendorid=051d* (APC) .RE @@ -248,7 +257,6 @@ Examples: .sp -1 .IP \(bu 2.3 .\} - \-x product="\&.*(Smart|Back)\-?UPS\&.*" .RE .RE @@ -267,6 +275,16 @@ With this option, the driver will connect to any device, including ones that are .RS 4 With this option, the driver activates a tweak to workaround buggy firmware returning invalid HID report length\&. Some APC Back\-UPS units are known to have this bug\&. .RE +.PP +\fBinterruptonly\fR +.RS 4 +If this flag is set, the driver will not poll UPS\&. This also implies using of INPUT flagged objects\&. Some Powercom units need this option\&. +.RE +.PP +\fBinterruptsize\fR=\fInum\fR +.RS 4 +Limit the number of bytes to read from interrupt pipe\&. For some Powercom units this option should be equal to 8\&. +.RE .SH "INSTALLATION" .sp This driver is not built by default\&. You can build it by using "configure \-\-with\-usb=yes"\&. Note that it will also install other USB drivers\&. diff --git a/docs/man/usbhid-ups.txt b/docs/man/usbhid-ups.txt index 1f6f729..a125837 100644 --- a/docs/man/usbhid-ups.txt +++ b/docs/man/usbhid-ups.txt @@ -31,8 +31,9 @@ At the present time, usbhid-ups supports: - all Dell USB models, - some APC models, - some Belkin models, - - some Cyber Power Systems models. - - some TrippLite models + - some Cyber Power Systems models, + - some Powercom models, + - some TrippLite models. For a more complete list, refer to the NUT hardware compatibility list, available in the source distribution as data/drivers.list, or on the @@ -120,6 +121,14 @@ With this option, the driver activates a tweak to workaround buggy firmware returning invalid HID report length. Some APC Back-UPS units are known to have this bug. +*interruptonly*:: +If this flag is set, the driver will not poll UPS. This also implies using of +INPUT flagged objects. Some Powercom units need this option. + +*interruptsize*='num':: +Limit the number of bytes to read from interrupt pipe. For some Powercom units +this option should be equal to 8. + INSTALLATION ------------ diff --git a/docs/man/victronups.8 b/docs/man/victronups.8 index 6934487..d400151 100644 --- a/docs/man/victronups.8 +++ b/docs/man/victronups.8 @@ -1,13 +1,13 @@ '\" t .\" Title: victronups .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 02/15/2014 +.\" Generator: DocBook XSL Stylesheets v1.78.1 +.\" Date: 04/17/2015 .\" Manual: NUT Manual -.\" Source: Network UPS Tools 2.7.1.5 +.\" Source: Network UPS Tools 2.7.3 .\" Language: English .\" -.TH "VICTRONUPS" "8" "02/15/2014" "Network UPS Tools 2\&.7\&.1\&." "NUT Manual" +.TH "VICTRONUPS" "8" "04/17/2015" "Network UPS Tools 2\&.7\&.3" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/new-drivers.txt b/docs/new-drivers.txt index bdd5084..9145f49 100644 --- a/docs/new-drivers.txt +++ b/docs/new-drivers.txt @@ -1,15 +1,15 @@ Creating a new driver to support another device =============================================== -This chapter will present the process to create a new driver to support +This chapter will present the process of creating a new driver to support another device. -Since NUT already supports all major power devices protocols, through -several generic drivers (genericups, usbhid-ups, snmp-ups, blazer_*, ...), -creation of new drivers has become rare. +Since NUT already supports many major power devices protocols through +several generic drivers (genericups, usbhid-ups, snmp-ups, blazer_* and +nutdrv_qx), creation of new drivers has become rare. So most of the time, it will be limited to completing one of these -generic driver. +generic drivers. Smart vs. Contact-closure ------------------------- @@ -698,6 +698,26 @@ latter accepts either "\n", "\n\r" or "\r\n" as line termination. You can define other termination characters as well, but can't undefine "\r" and "\n" (so if you need these as data, this is not for you). +Adding the driver into the tree +------------------------------- + +In order to build your new driver, it needs to be added to +`drivers/Makefile.am`. At the moment, there are several driver list variables +corresponding to the general protocol of the driver (`SERIAL_DRIVERLIST`, +`SNMP_DRIVERLIST`, etc.). If your driver does not fit into one of these +categories, please discuss it on the nut-upsdev mailing list. + +There are also `*_SOURCES` and optional `*_LDADD` variables to list the source +files, and any additional linker flags. If your driver uses the C math +library, be sure to add `-lm`, since this flag is not always included by +default on embedded systems. + +When you add a driver to one of these lists, pay attention to the backslash +continuation characters (`\\`) at the end of the lines. + +The `automake` program converts the `Makefile.am` files into `Makefile.in` +files to be processed by `./configure`. See the discussion in <> +about automating the rebuild process for these files. [[contact-closure]] diff --git a/docs/nut-names.txt b/docs/nut-names.txt index ebee1fe..cb81b7b 100644 --- a/docs/nut-names.txt +++ b/docs/nut-names.txt @@ -122,7 +122,7 @@ ups: General unit information NOTE: When present, the value of *ups.start.auto* has an impact on shutdown.* commands. For the sake of coherence, shutdown commands will set *ups.start.auto* -to the right value before issuing the command. Ie, shutdown.stayoff will first +to the right value before issuing the command. That is, shutdown.stayoff will first set *ups.start.auto* to *no*, while shutdown.return will set it to *yes*. input: Incoming line/power information @@ -136,6 +136,8 @@ input: Incoming line/power information | input.voltage.minimum | Minimum incoming voltage seen | 100 | input.voltage.nominal | Nominal input voltage | 120 | input.voltage.extended | Extended input voltage range | no +| input.transfer.delay | Delay before transfer to mains + (seconds) | 60 | input.transfer.reason | Reason for last transfer to battery (*** opaque) | T | input.transfer.low | Low voltage transfer point | 91 @@ -167,9 +169,14 @@ input: Incoming line/power information transfer point | 230 | input.transfer.trim.high | High voltage trimming transfer point | 240 +| input.load | Load on (ePDU) input (percent + of full) | 25 +| input.realpower | Current sum value of all (ePDU) + phases real power (W) | 300 +| input.power | Current sum value of all (ePDU) + phases apparent power (VA) | 500 |=============================================================================== - output: Outgoing power/inverter information ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -239,14 +246,14 @@ Valid CONTEXTs L3-N / L1 \ - L2 for currrent and power measurements + L2 for current and power measurements L3 / N - for current measurement Valid SPECs ^^^^^^^^^^^ -Valid with/without context (ie. per phase or aggregated/averaged) +Valid with/without context (i.e. per phase or aggregated/averaged) [options="header"] |=============================================================================== @@ -268,15 +275,18 @@ Valid with/without context (ie. per phase or aggregated/averaged) | realpower | Real power (W) | powerfactor | Power Factor (dimensionless value between 0.00 and 1.00) | crestfactor | Crest Factor (dimensionless value greater or equal to 1) +| load | Load on (ePDU) input |=============================================================================== -Valid without context (ie. aggregation of all phases): +Valid without context (i.e. aggregation of all phases): [options="header"] |=============================================================================== | Name | Description | frequency | Frequency (Hz) | frequency.nominal | Nominal frequency (Hz) +| realpower | Current value of real power (Watts) +| power | Current value of apparent power (Volt-Amps) |=============================================================================== EXAMPLES @@ -309,41 +319,47 @@ battery: Any battery details [options="header"] |=============================================================================== -| Name | Description | Example value -| battery.charge | Battery charge (percent) | 100.0 -| battery.charge.low | Remaining battery level when - UPS switches to LB (percent) | 20 -| battery.charge.restart | Minimum battery level for - UPS restart after power-off | 20 -| battery.charge.warning | Battery level when UPS switches - to "Warning" state (percent) | 50 -| battery.voltage | Battery voltage (V) | 24.84 -| battery.voltage.nominal | Nominal battery voltage (V) | 024 -| battery.voltage.low | Minimum battery voltage, that - triggers FSD status | 21,52 -| battery.voltage.high | Maximum battery voltage - (Ie battery.charge = 100) | 26,9 -| battery.capacity | Battery capacity (Ah) | 7.2 -| battery.current | Battery current (A) | 1.19 -| battery.current.total | Total battery current (A) | 1.19 -| battery.temperature | Battery temperature (degrees C) | 050.7 -| battery.runtime | Battery runtime (seconds) | 1080 -| battery.runtime.low | Remaining battery runtime when - UPS switches to LB (seconds) | 180 -| battery.runtime.restart | Minimum battery runtime for UPS - restart after power-off (seconds) | 120 -| battery.alarm.threshold | Battery alarm threshold | 0 (immediate) -| battery.date | Battery change date (opaque string) | 11/14/00 -| battery.mfr.date | Battery manufacturing date - (opaque string) | 2005/04/02 -| battery.packs | Number of battery packs | 001 -| battery.packs.bad | Number of bad battery packs | 000 -| battery.type | Battery chemistry (opaque - string) | PbAc -| battery.protection | Prevent deep discharge of - battery | yes -| battery.energysave | Switch off when running on - battery and no/low load | no +| Name | Description | Example value +| battery.charge | Battery charge (percent) | 100.0 +| battery.charge.low | Remaining battery level when + UPS switches to LB (percent) | 20 +| battery.charge.restart | Minimum battery level for + UPS restart after power-off | 20 +| battery.charge.warning | Battery level when UPS switches + to "Warning" state (percent) | 50 +| battery.voltage | Battery voltage (V) | 24.84 +| battery.voltage.nominal | Nominal battery voltage (V) | 024 +| battery.voltage.low | Minimum battery voltage, that + triggers FSD status | 21,52 +| battery.voltage.high | Maximum battery voltage + (i.e. battery.charge = 100) | 26,9 +| battery.capacity | Battery capacity (Ah) | 7.2 +| battery.current | Battery current (A) | 1.19 +| battery.current.total | Total battery current (A) | 1.19 +| battery.temperature | Battery temperature (degrees C) | 050.7 +| battery.runtime | Battery runtime (seconds) | 1080 +| battery.runtime.low | Remaining battery runtime when + UPS switches to LB (seconds) | 180 +| battery.runtime.restart | Minimum battery runtime for UPS + restart after power-off (seconds) | 120 +| battery.alarm.threshold | Battery alarm threshold | 0 (immediate) +| battery.date | Battery change date (opaque string) | 11/14/00 +| battery.mfr.date | Battery manufacturing date + (opaque string) | 2005/04/02 +| battery.packs | Number of battery packs | 001 +| battery.packs.bad | Number of bad battery packs | 000 +| battery.type | Battery chemistry (opaque + string) | PbAc +| battery.protection | Prevent deep discharge of + battery | yes +| battery.energysave | Switch off when running on + battery and no/low load | no +| battery.energysave.load | Switch off UPS if on battery and + load level lower (percent) | 5 +| battery.energysave.delay | Delay before switch off UPS if on + battery and load level low (min) | 3 +| battery.energysave.realpower | Switch off UPS if on battery + and load level lower (Watts) | 10 |=============================================================================== @@ -508,4 +524,5 @@ Instant commands | outlet.n.load.off | Turn off the outlet immediately | outlet.n.load.on | Turn on the outlet immediately | outlet.n.load.cycle | Power cycle the outlet immediately +| outlet.n.shutdown.return | Turn off the outlet and return when power is back |======================================================================== diff --git a/docs/nut-qa.txt b/docs/nut-qa.txt index 604e101..ebf256f 100644 --- a/docs/nut-qa.txt +++ b/docs/nut-qa.txt @@ -78,7 +78,7 @@ mailing list, and fixed quickly. - a project portal with trackers for bugs, feature request, patchs and tasks -NUT QA also relies on external tools, like: +NUT QA also relies on external tools and trackers, like: //////////////////////////////////////////////////////////////////////////////// FIXME (POST): @@ -91,7 +91,7 @@ FIXME (POST): //////////////////////////////////////////////////////////////////////////////// - Clang -- the Debian QA tools, available through the link:http://packages.qa.debian.org/n/nut.html[NUT Package Tracking System]: +- the Debian QA tools, available through the link:https://tracker.debian.org/pkg/nut[NUT Package Tracking System]: * Lintian general QA checks, * link:http://piuparts.debian.org/sid/source/n/nut.html[piuparts] automates @@ -104,6 +104,7 @@ is available in the link:https://code.edge.launchpad.net/qa-regression-testing[U It installs NUT, configures it with the dummy-ups driver, changes a few data and checks that these are well propagated with upsc. +- link:https://bugzilla.redhat.com/buglist.cgi?component=nut[Redhat / Fedora Bug tracker] Runtime quality ~~~~~~~~~~~~~~~ diff --git a/docs/nutdrv_qx-subdrivers.txt b/docs/nutdrv_qx-subdrivers.txt index 56d19f3..aa7fe50 100644 --- a/docs/nutdrv_qx-subdrivers.txt +++ b/docs/nutdrv_qx-subdrivers.txt @@ -85,7 +85,37 @@ String to match if the driver is expecting a reply from the UPS in case of error Note that this comparison is done on the answer we got back from the UPS before it has been processed, so include also the trailing carriage return (+\r+) and whatever character is expected. *+testing+*:: -Testing table that will hold the commands and the replies used for testing the subdriver. +Testing table (an array of +testing_t+) that will hold the commands and the replies used for testing the subdriver. ++ +-- ++testing_t+: + +---- +typedef struct { + const char *cmd; + const char answer[SMALLBUF]; + const int answer_len; +} testing_t; +---- + +Where: + +*+cmd+*:: +Command to match. + +*+answer+*:: +Answer for that command. ++ +NOTE: If +answer+ contains inner ++\0++s, in order to preserve them, +answer_len+ as well as an +item_t+'s +preprocess_answer()+ function must be set. + +*+answer_len+*:: +Answer length: ++ +- if set to +-1+ -> auto calculate answer length (treat +answer+ as a null-terminated string), +- otherwise -> use the provided length (if reasonable) and preserve inner ++\0++s (treat +answer+ as a sequence of bytes till the +item_t+'s +preprocess_answer()+ function gets called). + +For more informations, see <<_mapping_an_idiom_to_nut,Mapping an idiom to NUT>>. +-- Mapping an idiom to NUT @@ -107,6 +137,7 @@ typedef struct item_t { const int to; const char *dfl; unsigned long qxflags; + int (*preprocess_answer)(struct item_t *item, const int len); int (*preprocess)(struct item_t *item, char *value, size_t valuelen); } item_t; ---- @@ -155,6 +186,8 @@ Command sent to the UPS to get answer/to execute a instant command/to set a vari *+answer+*:: Answer from the UPS, filled at runtime. ++ +NOTE: If you expect a nonvalid C string (e.g.: inner ++\0++s) or need to perform actions before the answer is used (and treated as a null-terminated string), you should set a +preprocess_answer()+ function. *+answer_len+*:: Expected minimum length of the answer. @@ -164,7 +197,7 @@ Set it to +0+ if there's no minimum length to look after. Expected leading character of the answer (optional), e.g. +#+, +(+ ... *+value+*:: -Value from the answer, filled at runtime (i.e. +answer+ between +from+ and +to+). +Value from the answer, filled at runtime (i.e. +answer+ in the interval [+from+ to +to+]). *+from+*:: Position of the starting character of the info we're after in the answer. @@ -212,6 +245,11 @@ If there's a problem with a var in +QX_WALKMODE_INIT+, the driver will automagic ==== -- +*+preprocess_answer(item, len)+*:: +Function to preprocess the answer we got from the UPS before we do anything else (e.g. for CRC, decoding, ...). +This function is given the currently processed item (+item+) with the answer we got from the UPS unmolested and already stored in +item+'s +answer+ and the length of that answer (+len+). +Return +-1+ in case of errors, else the length of the newly allocated +item+'s +answer+ (from now on, treated as a null-terminated string). + *+preprocess(item, value, valuelen)+*:: Function to preprocess the data from/to the UPS: you are given the currently processed item (+item+), a char array (+value+) and its +size_t+ (+valuelen+). Return +-1+ in case of errors, else +0+. @@ -252,7 +290,7 @@ We know that when the UPS is queried for status with +QGS\r+, it replies with so Here's the +item_t+: ---- -{ "output.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 12, 16, "%.1f", 0, NULL }, +{ "output.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 12, 16, "%.1f", 0, NULL, NULL }, ---- [horizontal] @@ -295,6 +333,9 @@ Because of that we need to provide a floating point specifier. +qxflags+:: +0+ ++preprocess_answer+:: ++NULL+ + +preprocess+:: +NULL+ @@ -314,7 +355,7 @@ Also from +QGS\r+, we want to process the 9th status bit +10000000+*`0`*+001+ th Here's the +item_t+: ---- -{ "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 71, 71, "%s", QX_FLAG_QUICK_POLL, voltronic_status }, +{ "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 71, 71, "%s", QX_FLAG_QUICK_POLL, NULL, voltronic_status }, ---- [horizontal] @@ -357,6 +398,9 @@ Since a +preprocess+ function is defined for this item, this could have been +NU +QX_FLAG_QUICK_POLL+ -> this item will be polled every time the driver will check for updates. Since this item is mandatory to run the driver, if a problem arises in +QX_WALKMODE_INIT+ the driver won't skip it an it'll set +datastale+. ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_status+ + @@ -378,7 +422,8 @@ So your UPS reports its battery type when queried for +QBT\r+; we are expecting Here's the +item_t+: ---- -{ "battery.type", ST_FLAG_RW, voltronic_e_batt_type, "QBT\r", "", 4, '(', "", 1, 2, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, voltronic_p31b }, +{ "battery.type", ST_FLAG_RW, voltronic_e_batt_type, "QBT\r", "", 4, '(', "", 1, 2, "%s", + QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, NULL, voltronic_p31b }, ---- [horizontal] @@ -424,6 +469,9 @@ Since a +preprocess+ function is defined for this item, this could have been +NU + +QX_FLAG_ENUM+ -> this r/w variable is of the enumerated type and the enumerated values are listed in the +info_rw+ structure (i.e. +voltronic_e_batt_type+) ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_p31b+ + @@ -441,7 +489,8 @@ We also know that we can change battery type with the +PBTnn\r+ command; we are Here's the +item_t+: ---- -{ "battery.type", 0, voltronic_e_batt_type, "PBT%02.0f\r", "", 5, '(', "", 1, 4, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM, voltronic_p31b_set }, +{ "battery.type", 0, voltronic_e_batt_type, "PBT%02.0f\r", "", 5, '(', "", 1, 4, NULL, + QX_FLAG_SETVAR | QX_FLAG_ENUM, NULL, voltronic_p31b_set }, ---- [horizontal] @@ -485,6 +534,9 @@ Not used for +QX_FLAG_SETVAR+ + +QX_FLAG_ENUM+ -> this r/w variable is of the enumerated type and the enumerated values are listed in the +info_rw+ structure (i.e. +voltronic_e_batt_type+) ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_p31b_set+ + @@ -506,7 +558,7 @@ We know that we have to send to the UPS +Tnn\r+ or +T.n\r+ in order to start a b Here's the +item_t+: ---- -{ "test.battery.start", 0, NULL, "T%s\r", "", 5, '(', "", 1, 4, NULL, QX_FLAG_CMD, voltronic_process_command }, +{ "test.battery.start", 0, NULL, "T%s\r", "", 5, '(', "", 1, 4, NULL, QX_FLAG_CMD, NULL, voltronic_process_command }, ---- [horizontal] @@ -546,6 +598,9 @@ Not used for +QX_FLAG_CMD+ +qxflags+:: +QX_FLAG_CMD+ -> this item is an instant command that will be fired when +info_type+ (i.e. +test.battery.start+) is called ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_process_command+ + @@ -558,7 +613,8 @@ Informations absent in the device In order to set the server-side var +ups.delay.start+, that will be then used by the driver, we have to provide the following +item_t+: ---- -{ "ups.delay.start", ST_FLAG_RW, voltronic_r_ondelay, NULL, "", 0, 0, "", 0, 0, "180", QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, voltronic_process_setvar }, +{ "ups.delay.start", ST_FLAG_RW, voltronic_r_ondelay, NULL, "", 0, 0, "", 0, 0, "180", + QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, voltronic_process_setvar }, ---- [horizontal] @@ -605,6 +661,9 @@ Not used for +QX_FLAG_ABSENT+ + +QX_FLAG_RANGE+ -> this r/w variable has a settable range and its boundaries are listed in the +info_rw+ structure (i.e. +voltronic_r_ondelay+) ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_process_setvar+ + @@ -628,7 +687,8 @@ So we know that the UPS reports actual input/output phase angles when queried fo Here's the +item_t+ for input phase angle: ---- -{ "input_phase_angle", 0, NULL, "QPD\r", "", 9, '(', "", 1, 3, "%03.0f", QX_FLAG_STATIC | QX_FLAG_NONUT, voltronic_phase }, +{ "input_phase_angle", 0, NULL, "QPD\r", "", 9, '(', "", 1, 3, "%03.0f", + QX_FLAG_STATIC | QX_FLAG_NONUT, NULL, voltronic_phase }, ---- [horizontal] @@ -675,6 +735,9 @@ Here instead it's used by the +preprocess+ function. + +QX_FLAG_NONUT+ -> this item doesn't have yet a NUT variable ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_phase+ + @@ -683,7 +746,8 @@ This function will be called *after* the +command+ has been sent to the UPS so t Here's the +item_t+ for output phase angle: ---- -{ "output_phase_angle", ST_FLAG_RW, voltronic_e_phase, "QPD\r", "", 9, '(', "", 5, 7, "%03.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_NONUT, voltronic_phase }, +{ "output_phase_angle", ST_FLAG_RW, voltronic_e_phase, "QPD\r", "", 9, '(', "", 5, 7, "%03.0f", + QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_NONUT, NULL, voltronic_phase }, ---- [horizontal] @@ -737,6 +801,9 @@ Here instead it's used by the +preprocess+ function. + +QX_FLAG_NONUT+ -> this item doesn't have yet a NUT variable ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_phase+ + @@ -759,7 +826,8 @@ We know we can set output phase angle sending +PPDnnn\r+ to the UPS: Here's the +item_t+ ---- -{ "output_phase_angle", 0, voltronic_e_phase, "PPD%03.0f\r", "", 5, '(', "", 1, 4, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT, voltronic_phase_set }, +{ "output_phase_angle", 0, voltronic_e_phase, "PPD%03.0f\r", "", 5, '(', "", 1, 4, NULL, + QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT, NULL, voltronic_phase_set }, ---- [horizontal] @@ -809,6 +877,9 @@ Not used for +QX_FLAG_SETVAR+ + +QX_FLAG_NONUT+ -> this item doesn't have yet a NUT variable ++preprocess_answer+:: ++NULL+ + +preprocess+:: +voltronic_phase_set+ + @@ -838,7 +909,7 @@ Send +command+ or, if it is +NULL+, send the command stored in the +item+ to the Return +-1+ on errors, +0+ on success. *+int ups_infoval_set(item_t *item)+*:: -Process the value we got back from the UPS (set status bits and set the value of other parameters), calling its +preprocess+ function, if any. +Process the value we got back from the UPS (set status bits and set the value of other parameters), calling its +preprocess+ function, if any, otherwise executing the standard preprocessing (including trimming if +QX_FLAG_TRIM+ is set). Return +-1+ on failure, +0+ for a status update and +1+ in all other cases. *+int qx_status(void)+*:: @@ -860,6 +931,7 @@ You can then recompile +nutdrv_qx+, and start experimenting with the new subdriv For more informations, have a look at the currently available subdrivers: +- +nutdrv_qx_bestups.+{+c+,+h+} - +nutdrv_qx_mecer.+{+c+,+h+} - +nutdrv_qx_megatec.+{+c+,+h+} - +nutdrv_qx_megatec-old.+{+c+,+h+} @@ -867,5 +939,6 @@ For more informations, have a look at the currently available subdrivers: - +nutdrv_qx_q1.+{+c+,+h+} - +nutdrv_qx_voltronic.+{+c+,+h+} - +nutdrv_qx_voltronic-qs.+{+c+,+h+} +- +nutdrv_qx_voltronic-qs-hex.+{+c+,+h+} - +nutdrv_qx_zinto.+{+c+,+h+} diff --git a/docs/packager-guide.txt b/docs/packager-guide.txt index c6ea86b..2d40b83 100644 --- a/docs/packager-guide.txt +++ b/docs/packager-guide.txt @@ -35,7 +35,7 @@ support and maintenance accross the supported OSes. ------------------------------------------------------------------------ *sandbox* This document assumes that you have read the other NUT document such -as INSTALL.nut, FAQ, shutdown.txt, ... +as INSTALL.nut, FAQ, config-notes.txt, ... Facts about NUT packaging ========================= diff --git a/docs/scheduling.txt b/docs/scheduling.txt index 8bb2b91..922bea3 100644 --- a/docs/scheduling.txt +++ b/docs/scheduling.txt @@ -270,7 +270,7 @@ The design of the timer handler is also geared towards minimizing impact. It will come and go from the process list as necessary. When a new timer is started, a process will be forked to actually watch the clock and eventually start the CMDSCRIPT. When a timer triggers, it is removed from -the queue. Cancelling a timer will also remove it from the queue. When +the queue. Canceling a timer will also remove it from the queue. When no timers are present in the queue, the background process exits. This means that you will only see upssched running when one of two things diff --git a/docs/security.txt b/docs/security.txt index 808b26d..fd6b747 100644 --- a/docs/security.txt +++ b/docs/security.txt @@ -26,16 +26,24 @@ In order to verify the NUT source code signature for releases, perform the follo $ gpg --fetch-keys http://www.networkupstools.org/source/nut-key.gpg +NOTE: As of NUT 2.7.3, a new release key is used. In order to verify previous release, please use +link:http://www.networkupstools.org/source/nut-old-key.gpg[NUT old maintainer's signature] + - Launch the GPG checking using the following command: $ gpg --verify nut-X.Y.Z.tar.gz.sig - You should see a message mentioning a "Good signature", like: - gpg: Signature made Thu Jul 5 16:15:05 2007 CEST using DSA key ID 204DDF1B + gpg: Signature made Wed Apr 15 15:55:30 2015 CEST using RSA key ID 55CA5976 gpg: Good signature from "Arnaud Quette ..." ... +NOTE: the previously used maintainer's signature would output: ++ + gpg: Signature made Thu Jul 5 16:15:05 2007 CEST using DSA key ID 204DDF1B + gpg: Good signature from "Arnaud Quette ..." + ... System level privileges and ownership ------------------------------------- @@ -142,7 +150,7 @@ TCP Wrappers If the server is build with tcp-wrappers support enabled, it will check if the NUT username is allowed to connect from the client address through the -'/etc/hosts.allow' and '/etc/hosts.deny' files. +`/etc/hosts.allow` and `/etc/hosts.deny` files. NOTE: this will only be done for commands that require the user to be logged into the server. @@ -162,7 +170,7 @@ Further details are described in hosts_access(5). Configuring SSL --------------- -SSL is available as a build option ('--with-ssl'). +SSL is available as a build option (`--with-ssl`). It encrypts sessions between upsd and clients, and can also be used to authenticate servers. @@ -174,9 +182,9 @@ Several things must happen before this will work, however. This chapter will present these steps. SSL is available via two back-end libraries : NSS and OpenSSL (historically). -You can choose to use one of them by specifying it with abuild option -('--with-nss' or '--with-openssl'). If any is specified, configure script will -try to detect one of them and use it with a precedence for OpenSSL. +You can choose to use one of them by specifying it with a build option +(`--with-nss` or `--with-openssl`). If neither is specified, the configure +script will try to detect one of them, with a precedence for OpenSSL. OpenSSL backend usage ~~~~~~~~~~~~~~~~~~~~~ @@ -188,12 +196,13 @@ Install OpenSSL ^^^^^^^^^^^^^^^ Install link:http://www.openssl.org[OpenSSL] as usual, either from source -or binary packages including nss-tools. +or binary packages. If using binary packages, be sure to include the developer +libraries. Recompile and install NUT ^^^^^^^^^^^^^^^^^^^^^^^^^ -Recompile NUT from source, starting with 'configure --with-openssl'. +Recompile NUT from source, starting with `configure --with-openssl`. Then install everything as usual. @@ -207,7 +216,7 @@ Use the following command to create the certificate: openssl req -new -x509 -nodes -out upsd.crt -keyout upsd.key -You can also put a '-days nnn' in there to set the expiration. If +You can also put a `-days nnn` in there to set the expiration. If you skip this, it may default to 30 days. This is probably not what you want. @@ -271,7 +280,8 @@ hold of port 3493. Having it be owned by 'root' and readable by group 'nut' allows upsd to read the file without being able to change the contents. This -is done to minimize the impact if someone should break into upsd. +is done to minimize the impact if someone should break into upsd. NUT reads the +key and certificate files after dropping privileges and forking. Note on certification authorities (CAs) and signed keys ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -340,7 +350,7 @@ Again in upsmon.conf: FORCESSL 1 -If you don't use 'CERTVERIFY 1', then this will at least make sure +If you don't use `CERTVERIFY 1`, then this will at least make sure that nobody can sniff your sessions without a large effort. Setting this will make upsmon drop connections if the remote upsd doesn't support SSL, so don't use it unless all of them have it running. @@ -355,12 +365,13 @@ Install NSS ^^^^^^^^^^^ Install link:http://www.mozilla.org/projects/security/pki/nss/[Mozilla NSS] as -usual, either from source or binary packages. +usual, either from source or binary packages. If using binary packages, be sure +to include the developer libraries, and nss-tools (for `certutil`). Recompile and install NUT ^^^^^^^^^^^^^^^^^^^^^^^^^ -Recompile NUT from source, starting with 'configure --with-nss'. +Recompile NUT from source, starting with `configure --with-nss`. Then install everything as usual. @@ -368,7 +379,7 @@ Create certificate and key for the host ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NSS (package generally called libnss3-tools) will install a tool called -'certutil'. +`certutil`. It will be used to generate certificates and manage certificate database. Certificates should be signed by a certification authorities (CAs). @@ -376,19 +387,19 @@ Following commands are typical samples, contact your SSL guru or security office to follow your company procedures. .Generate a server certificate for upsd: -- Create a directory where store the certificate database: 'mkdir cert_db' -- Create the certificate database : 'certutil -N -d cert_db' +- Create a directory where store the certificate database: `mkdir cert_db` +- Create the certificate database : `certutil -N -d cert_db` - Import the CA certificate: - 'certutil -A -d cert_db -n "My Root CA" -t "TC,," -a -i rootca.crt' + `certutil -A -d cert_db -n "My Root CA" -t "TC,," -a -i rootca.crt` - Create a server certificate request (here called 'My nut server'): - 'certutil -R -d cert_db -s "CN=My nut server,O=MyCompany,ST=MyState,C=US" -a -o server.req' + `certutil -R -d cert_db -s "CN=My nut server,O=MyCompany,ST=MyState,C=US" -a -o server.req` - Make your CA sign the certificate (produces server.crt) - Import the signed certificate into server database: - 'certutil -A -d cert_db -n "My nut server" -a -i server.crt -t ",,"' + `certutil -A -d cert_db -n "My nut server" -a -i server.crt -t ",,"` - Display the content of certificate server: - 'certutil -L -d cert_db' + `certutil -L -d cert_db` -Clients and servers in the same host could share the same certificate to authentify them +Clients and servers in the same host could share the same certificate to authenticate them or use different ones in same or different databases. The same operation can be done in same or different databases to generate other certificates. @@ -397,27 +408,27 @@ Create a self-signed CA certificate ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NSS provides a way to create self-signed certificate which can acting as -CA certificate and to sign other certificates with this CA certificate. -This method can be used to provide CA certification chain without passing -by an 'official' CA provider. +CA certificate, and to sign other certificates with this CA certificate. +This method can be used to provide a CA certification chain without using +an "official" certificate authority. .Generate a self-signed CA certificate: -- Create a directory where store the CA certificate database: 'mkdir CA_db' +- Create a directory where store the CA certificate database: `mkdir CA_db` - Create the certificate database: - 'certutil -N -d CA_db' + `certutil -N -d CA_db` - Generate a certificate for CA: - 'certutil -S -d CA_db -n "My Root CA" -s "CN=My CA,O=MyCompany,ST=MyState,C=US" -t "CT,," -x -2' -Do not forget to answer 'Yes' to the question 'Is this a CA certificate [y/N]?' + `certutil -S -d CA_db -n "My Root CA" -s "CN=My CA,O=MyCompany,ST=MyState,C=US" -t "CT,," -x -2` +(Do not forget to answer 'Yes' to the question 'Is this a CA certificate [y/N]?') - Extract the CA certificate to be able to import it in upsd (or upsmon) certificate database: - 'certutil -L -d CA_db -n "My Root CA" -a -o rootca.crt' + `certutil -L -d CA_db -n "My Root CA" -a -o rootca.crt` - Sign a certificate request with the CA certificate (simulate a real CA signature): - 'certutil -C -d CA_db -c "My Root CA" -a -i server.req -o server.crt -2 -6' + `certutil -C -d CA_db -c "My Root CA" -a -i server.req -o server.crt -2 -6` Install the server-side certificate ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Just copy the database directory (just the directory and included 3 -database .db files) at the right place like in '/usr/local/ups/etc/': +database .db files) to the right place, such as `/usr/local/ups/etc/`: mv cert_db /usr/local/ups/etc/ @@ -441,12 +452,12 @@ upsd (optional): client authentication ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOTE: This functionality is disabled by default. To activate it, recompile -NUT with 'WITH_CLIENT_CERTIFICATE_VALIDATION' defined: +NUT with `WITH_CLIENT_CERTIFICATE_VALIDATION` defined: make CFLAGS="-DWITH_CLIENT_CERTIFICATE_VALIDATION" UPSD can accept three levels of client authentication. Just specify it with -the directive 'CERTREQUEST' with the corresponding value in the upsd.conf file: +the directive `CERTREQUEST` with the corresponding value in the upsd.conf file: - NO: no client authentication. - REQUEST: a certificate is request to the client but it is not strictly validated. @@ -465,36 +476,37 @@ In order for upsmon to securely connect to upsd, it must authenticate it. You must associate an upsd host name to security rules in upsmon.conf with the directive 'CERTHOST'. -'CERTHOST' associate to an hostname a certificate name and if a SSL connection -is mandatory and if its certificate must be validated. +'CERTHOST' associates a hostname to a certificate name. It also determines +whether a SSL connection is mandatory, and if the server certificate must be +validated. CERTHOST 'hostname' 'certificate name' 'certverify' 'forcessl' -If the flag 'forcessl' is set to '1' and the upsd answer that it can not -connect in SSL, the connection closes. -If the flag 'certverify' is set to '1' and the connection is done in ssl, +If the flag `forcessl` is set to `1`, and upsd answers that it can not +connect with SSL, the connection closes. +If the flag `certverify` is set to `1` and the connection is done in SSL, upsd's certificate is verified and its name must be the specified 'certificate name'. -To prevent security leaks, you should set all 'certverify' and 'forcessl' -flags to '1' (force SSL connection and validate all certificates for all +To prevent security leaks, you should set all `certverify` and `forcessl` +flags to `1` (force SSL connection and validate all certificates for all peers). -You can specify 'CERTVERIFY' and 'FORCESSL' directive (to '1' or '0') to +You can specify `CERTVERIFY` and `FORCESSL` directive (to `1` or `0`) to define a default security rule to apply to all host not specified with a -dedicated 'CERTHOST' directive. +dedicated `CERTHOST` directive. -If a host is not specified in a 'CERTHOST' directive, its expected certificate +If a host is not specified in a `CERTHOST` directive, its expected certificate name is its hostname. upsmon (optional): certificate database and self certificate ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Like upsd, upsmon may need to authenticate itself (upsd's 'CERTREQUEST' -directive set to 'REQUEST' or 'REQUIRE'). +Like upsd, upsmon may need to authenticate itself (upsd's `CERTREQUEST` +directive set to `REQUEST` or `REQUIRE`). It must access to a certificate (and its private key) in a certificate database -configuring 'CERTPATH' and 'CERTIDENT' in upsmon.conf in the same way than upsd. +configuring `CERTPATH` and `CERTIDENT` in upsmon.conf in the same way than upsd. CERTPATH /usr/local/ups/etc/cert_db CERTIDENT 'certificate name' 'database password' @@ -506,8 +518,9 @@ Restart upsd It should come back up without any complaints. If it says something about keys or certificates, then you probably missed a step. -If you run upsd as a separate user id (like nutsrv), make sure that -user can read files in certificate directory. +If you run upsd as a separate user ID (like nutsrv), make sure that +user can read files in the certificate directory. NUT reads the keys and +certificates after forking and dropping privileges. Restart upsmon ~~~~~~~~~~~~~~ @@ -516,7 +529,7 @@ You should see something like this in the syslog from upsd: foo upsd[1234]: Client mon@localhost logged in to UPS [myups] (SSL) -If upsd or upsmon give any error messages, or the (SSL) is missing, +If upsd or upsmon give any error messages, or the `(SSL)` is missing, then something isn't right. If in doubt about upsmon, start it with -D so it will stay in @@ -525,14 +538,14 @@ like this every couple of seconds: polling ups: myups@localhost [SSL] -Obviously, if the '[SSL]' isn't there, something's broken. +Obviously, if the `[SSL]` isn't there, something's broken. Recommended: sniff the connection to see it for yourself ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Using tcpdump, Wireshark (Ethereal), or another network sniffer tool, tell it to monitor port 3493/tcp and see what happens. You should only -see 'STARTTLS' go out, 'OK STARTTLS' come back, and the rest will be +see `STARTTLS` go out, `OK STARTTLS` come back, and the rest will be certificate data and then seemingly random characters. If you see any plaintext besides that (USERNAME, PASSWORD, etc.) @@ -561,7 +574,7 @@ pair using the procedure above. Conclusion ~~~~~~~~~~ -SSL support should be considered stable but purposely underdocumented +SSL support should be considered stable but purposely under-documented since various bits of the implementation or configuration may change in the future. In other words, if you use this and it stops working after an upgrade, come back to this file to find out what changed. @@ -583,7 +596,7 @@ license change. This is actually a feature, since it means nobody can unilaterally run off with the source - not even the NUT team. Note that the replacement of OpenSSL by Mozilla Network Security Services -(NSS) is scheduled in the future, to avoid the above licensing issues. +(NSS) should avoid the above licensing issues. chrooting and other forms of paranoia diff --git a/docs/xhtml.xsl b/docs/xhtml.xsl index b84425d..e8dc331 100644 --- a/docs/xhtml.xsl +++ b/docs/xhtml.xsl @@ -11,9 +11,4 @@ - - - - - diff --git a/drivers/Makefile.am b/drivers/Makefile.am index be71e91..bf36319 100644 --- a/drivers/Makefile.am +++ b/drivers/Makefile.am @@ -44,6 +44,7 @@ USB_LIBUSB_DRIVERLIST = usbhid-ups bcmxcp_usb tripplite_usb \ USB_DRIVERLIST = $(USB_LIBUSB_DRIVERLIST) NEONXML_DRIVERLIST = netxml-ups MACOSX_DRIVERLIST = macosx-ups +LINUX_I2C_DRIVERLIST = asem # distribute all drivers, even ones that are not built by default EXTRA_PROGRAMS = $(SERIAL_DRIVERLIST) $(SNMP_DRIVERLIST) $(USB_DRIVERLIST) $(NEONXML_DRIVERLIST) $(MACOSX_DRIVERLIST) @@ -74,6 +75,9 @@ endif if WITH_MACOSX driverexec_PROGRAMS += $(MACOSX_DRIVERLIST) endif +if WITH_LINUX_I2C + driverexec_PROGRAMS += $(LINUX_I2C_DRIVERLIST) +endif else driverexec_PROGRAMS += skel endif @@ -171,7 +175,7 @@ tripplite_usb_SOURCES = tripplite_usb.c libusb.c usb-common.c tripplite_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm bcmxcp_usb_SOURCES = bcmxcp_usb.c bcmxcp.c usb-common.c -bcmxcp_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) +bcmxcp_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm blazer_usb_SOURCES = blazer.c blazer_usb.c libusb.c usb-common.c blazer_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm @@ -219,6 +223,10 @@ macosx_ups_LDADD = $(LDADD_DRIVERS) macosx_ups_LDFLAGS = $(LDFLAGS) -framework IOKit -framework CoreFoundation macosx_ups_SOURCES = macosx-ups.c +# Asem +asem_LDADD = $(LDADD_DRIVERS) +asem_SOURCES = asem.c + # nutdrv_qx USB/Serial nutdrv_qx_SOURCES = nutdrv_qx.c nutdrv_qx_LDADD = $(LDADD_DRIVERS) -lm @@ -232,9 +240,10 @@ nutdrv_qx_CFLAGS += -DQX_USB nutdrv_qx_SOURCES += libusb.c usb-common.c nutdrv_qx_LDADD += $(LIBUSB_LIBS) endif -NUTDRV_QX_SUBDRIVERS = nutdrv_qx_blazer-common.c nutdrv_qx_mecer.c \ - nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c nutdrv_qx_mustek.c \ - nutdrv_qx_q1.c nutdrv_qx_voltronic.c nutdrv_qx_voltronic-qs.c nutdrv_qx_zinto.c +NUTDRV_QX_SUBDRIVERS = nutdrv_qx_bestups.c nutdrv_qx_blazer-common.c \ + nutdrv_qx_mecer.c nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c \ + nutdrv_qx_mustek.c nutdrv_qx_q1.c nutdrv_qx_voltronic.c \ + nutdrv_qx_voltronic-qs.c nutdrv_qx_voltronic-qs-hex.c nutdrv_qx_zinto.c nutdrv_qx_SOURCES += $(NUTDRV_QX_SUBDRIVERS) # ---------------------------------------------------------------------- @@ -252,9 +261,9 @@ dist_noinst_HEADERS = apc-mib.h apc-hid.h baytech-mib.h bcmxcp.h \ safenet.h serial.h snmp-ups.h solis.h tripplite.h tripplite-hid.h \ upshandler.h usb-common.h usbhid-ups.h powercom-hid.h compaq-mib.h idowell-hid.h \ apcsmart.h apcsmart_tabs.h apcsmart-old.h apcupsd-ups.h cyberpower-mib.h riello.h openups-hid.h \ - delta_ups-mib.h nutdrv_qx.h nutdrv_qx_blazer-common.h nutdrv_qx_mecer.h \ + delta_ups-mib.h nutdrv_qx.h nutdrv_qx_bestups.h nutdrv_qx_blazer-common.h nutdrv_qx_mecer.h \ nutdrv_qx_megatec.h nutdrv_qx_megatec-old.h nutdrv_qx_mustek.h nutdrv_qx_q1.h \ - nutdrv_qx_voltronic.h nutdrv_qx_voltronic-qs.h nutdrv_qx_zinto.h \ + nutdrv_qx_voltronic.h nutdrv_qx_voltronic-qs.h nutdrv_qx_voltronic-qs-hex.h nutdrv_qx_zinto.h \ xppc-mib.h # Define a dummy library so that Automake builds rules for the diff --git a/drivers/Makefile.in b/drivers/Makefile.in index 11a9f93..6824bc3 100644 --- a/drivers/Makefile.in +++ b/drivers/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -19,23 +18,51 @@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -65,12 +92,14 @@ EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) \ @SOME_DRIVERS_FALSE@driverexec_PROGRAMS = $(am__EXEEXT_7) \ @SOME_DRIVERS_FALSE@ $(am__EXEEXT_8) $(am__EXEEXT_9) \ @SOME_DRIVERS_FALSE@ $(am__EXEEXT_10) $(am__EXEEXT_11) \ -@SOME_DRIVERS_FALSE@ $(am__EXEEXT_12) $(am__EXEEXT_13) +@SOME_DRIVERS_FALSE@ $(am__EXEEXT_12) $(am__EXEEXT_13) \ +@SOME_DRIVERS_FALSE@ $(am__EXEEXT_15) @SOME_DRIVERS_TRUE@driverexec_PROGRAMS = $(DRIVER_BUILD_LIST) \ @SOME_DRIVERS_TRUE@ $(am__EXEEXT_7) $(am__EXEEXT_8) \ @SOME_DRIVERS_TRUE@ $(am__EXEEXT_9) $(am__EXEEXT_10) \ @SOME_DRIVERS_TRUE@ $(am__EXEEXT_11) $(am__EXEEXT_12) \ -@SOME_DRIVERS_TRUE@ $(am__EXEEXT_13) skel$(EXEEXT) +@SOME_DRIVERS_TRUE@ $(am__EXEEXT_13) $(am__EXEEXT_15) \ +@SOME_DRIVERS_TRUE@ skel$(EXEEXT) @SOME_DRIVERS_FALSE@@WITH_SERIAL_TRUE@am__append_6 = $(SERIAL_DRIVERLIST) @SOME_DRIVERS_FALSE@@WITH_SNMP_TRUE@am__append_7 = $(SNMP_DRIVERLIST) @SOME_DRIVERS_FALSE@@WITH_USB_TRUE@am__append_8 = $(USB_LIBUSB_DRIVERLIST) @@ -78,18 +107,19 @@ EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) \ @SOME_DRIVERS_FALSE@@WITH_LIBPOWERMAN_TRUE@am__append_10 = powerman-pdu @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__append_11 = nut-ipmipsu @SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__append_12 = $(MACOSX_DRIVERLIST) +@SOME_DRIVERS_FALSE@@WITH_LINUX_I2C_TRUE@am__append_13 = $(LINUX_I2C_DRIVERLIST) sbin_PROGRAMS = upsdrvctl$(EXEEXT) -@WITH_SSL_TRUE@am__append_13 = $(LIBSSL_CFLAGS) -@WITH_SSL_TRUE@am__append_14 = $(LIBSSL_LIBS) -@WITH_FREEIPMI_TRUE@am__append_15 = nut-libfreeipmi.c -@WITH_SERIAL_TRUE@am__append_16 = -DQX_SERIAL -@WITH_SERIAL_TRUE@am__append_17 = $(SERLIBS) serial.o -@WITH_USB_TRUE@am__append_18 = -DQX_USB -@WITH_USB_TRUE@am__append_19 = libusb.c usb-common.c -@WITH_USB_TRUE@am__append_20 = $(LIBUSB_LIBS) +@WITH_SSL_TRUE@am__append_14 = $(LIBSSL_CFLAGS) +@WITH_SSL_TRUE@am__append_15 = $(LIBSSL_LIBS) +@WITH_FREEIPMI_TRUE@am__append_16 = nut-libfreeipmi.c +@WITH_SERIAL_TRUE@am__append_17 = -DQX_SERIAL +@WITH_SERIAL_TRUE@am__append_18 = $(SERLIBS) serial.o +@WITH_USB_TRUE@am__append_19 = -DQX_USB +@WITH_USB_TRUE@am__append_20 = libusb.c usb-common.c +@WITH_USB_TRUE@am__append_21 = $(LIBUSB_LIBS) subdir = drivers -DIST_COMMON = $(dist_noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp $(dist_noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -119,6 +149,10 @@ CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = libdummy_a_AR = $(AR) $(ARFLAGS) libdummy_a_LIBADD = am_libdummy_a_OBJECTS = main.$(OBJEXT) dstate.$(OBJEXT) \ @@ -155,6 +189,9 @@ am__EXEEXT_6 = macosx-ups$(EXEEXT) @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@am__EXEEXT_12 = \ @SOME_DRIVERS_FALSE@@WITH_IPMI_TRUE@ nut-ipmipsu$(EXEEXT) @SOME_DRIVERS_FALSE@@WITH_MACOSX_TRUE@am__EXEEXT_13 = $(am__EXEEXT_6) +am__EXEEXT_14 = asem$(EXEEXT) +@SOME_DRIVERS_FALSE@@WITH_LINUX_I2C_TRUE@am__EXEEXT_15 = \ +@SOME_DRIVERS_FALSE@@WITH_LINUX_I2C_TRUE@ $(am__EXEEXT_14) am__installdirs = "$(DESTDIR)$(driverexecdir)" "$(DESTDIR)$(sbindir)" PROGRAMS = $(driverexec_PROGRAMS) $(sbin_PROGRAMS) am_al175_OBJECTS = al175.$(OBJEXT) @@ -163,6 +200,10 @@ al175_LDADD = $(LDADD) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = $(LDADD_DRIVERS) $(am__DEPENDENCIES_1) serial.o al175_DEPENDENCIES = $(am__DEPENDENCIES_2) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = am_apcsmart_OBJECTS = apcsmart.$(OBJEXT) apcsmart_tabs.$(OBJEXT) apcsmart_OBJECTS = $(am_apcsmart_OBJECTS) apcsmart_LDADD = $(LDADD) @@ -174,9 +215,12 @@ apcsmart_old_DEPENDENCIES = $(am__DEPENDENCIES_2) am_apcupsd_ups_OBJECTS = apcupsd_ups-apcupsd-ups.$(OBJEXT) apcupsd_ups_OBJECTS = $(am_apcupsd_ups_OBJECTS) apcupsd_ups_DEPENDENCIES = $(LDADD_DRIVERS) -apcupsd_ups_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +apcupsd_ups_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(apcupsd_ups_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_asem_OBJECTS = asem.$(OBJEXT) +asem_OBJECTS = $(am_asem_OBJECTS) +asem_DEPENDENCIES = $(LDADD_DRIVERS) am_bcmxcp_OBJECTS = bcmxcp.$(OBJEXT) bcmxcp_ser.$(OBJEXT) bcmxcp_OBJECTS = $(am_bcmxcp_OBJECTS) am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) @@ -229,7 +273,7 @@ dummy_ups_OBJECTS = $(am_dummy_ups_OBJECTS) @WITH_SSL_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) dummy_ups_DEPENDENCIES = $(LDADD_DRIVERS) ../clients/libupsclient.la \ $(am__DEPENDENCIES_4) -dummy_ups_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +dummy_ups_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dummy_ups_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_etapro_OBJECTS = etapro.$(OBJEXT) @@ -266,7 +310,7 @@ liebert_esp2_DEPENDENCIES = $(am__DEPENDENCIES_2) am_macosx_ups_OBJECTS = macosx-ups.$(OBJEXT) macosx_ups_OBJECTS = $(am_macosx_ups_OBJECTS) macosx_ups_DEPENDENCIES = $(LDADD_DRIVERS) -macosx_ups_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +macosx_ups_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(macosx_ups_LDFLAGS) $(LDFLAGS) -o $@ am_masterguard_OBJECTS = masterguard.$(OBJEXT) @@ -282,9 +326,9 @@ am_mge_shut_OBJECTS = mge_shut-usbhid-ups.$(OBJEXT) \ mge_shut-hidparser.$(OBJEXT) mge_shut-mge-hid.$(OBJEXT) mge_shut_OBJECTS = $(am_mge_shut_OBJECTS) mge_shut_DEPENDENCIES = $(am__DEPENDENCIES_3) -mge_shut_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(mge_shut_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +mge_shut_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mge_shut_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_mge_utalk_OBJECTS = mge-utalk.$(OBJEXT) mge_utalk_OBJECTS = $(am_mge_utalk_OBJECTS) mge_utalk_LDADD = $(LDADD) @@ -306,13 +350,15 @@ am_nutdrv_atcl_usb_OBJECTS = nutdrv_atcl_usb.$(OBJEXT) \ nutdrv_atcl_usb_OBJECTS = $(am_nutdrv_atcl_usb_OBJECTS) nutdrv_atcl_usb_DEPENDENCIES = $(LDADD_DRIVERS) $(am__DEPENDENCIES_1) am__nutdrv_qx_SOURCES_DIST = nutdrv_qx.c libusb.c usb-common.c \ - nutdrv_qx_blazer-common.c nutdrv_qx_mecer.c \ - nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c nutdrv_qx_mustek.c \ - nutdrv_qx_q1.c nutdrv_qx_voltronic.c nutdrv_qx_voltronic-qs.c \ + nutdrv_qx_bestups.c nutdrv_qx_blazer-common.c \ + nutdrv_qx_mecer.c nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c \ + nutdrv_qx_mustek.c nutdrv_qx_q1.c nutdrv_qx_voltronic.c \ + nutdrv_qx_voltronic-qs.c nutdrv_qx_voltronic-qs-hex.c \ nutdrv_qx_zinto.c @WITH_USB_TRUE@am__objects_2 = nutdrv_qx-libusb.$(OBJEXT) \ @WITH_USB_TRUE@ nutdrv_qx-usb-common.$(OBJEXT) -am__objects_3 = nutdrv_qx-nutdrv_qx_blazer-common.$(OBJEXT) \ +am__objects_3 = nutdrv_qx-nutdrv_qx_bestups.$(OBJEXT) \ + nutdrv_qx-nutdrv_qx_blazer-common.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_mecer.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_megatec.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_megatec-old.$(OBJEXT) \ @@ -320,6 +366,7 @@ am__objects_3 = nutdrv_qx-nutdrv_qx_blazer-common.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_q1.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_voltronic.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_voltronic-qs.$(OBJEXT) \ + nutdrv_qx-nutdrv_qx_voltronic-qs-hex.$(OBJEXT) \ nutdrv_qx-nutdrv_qx_zinto.$(OBJEXT) am_nutdrv_qx_OBJECTS = nutdrv_qx-nutdrv_qx.$(OBJEXT) $(am__objects_2) \ $(am__objects_3) @@ -328,7 +375,7 @@ nutdrv_qx_OBJECTS = $(am_nutdrv_qx_OBJECTS) @WITH_USB_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1) nutdrv_qx_DEPENDENCIES = $(LDADD_DRIVERS) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_6) -nutdrv_qx_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +nutdrv_qx_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(nutdrv_qx_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_oldmge_shut_OBJECTS = mge-shut.$(OBJEXT) hidparser.$(OBJEXT) @@ -417,21 +464,42 @@ am_victronups_OBJECTS = victronups.$(OBJEXT) victronups_OBJECTS = $(am_victronups_OBJECTS) victronups_LDADD = $(LDADD) victronups_DEPENDENCIES = $(am__DEPENDENCIES_2) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(libdummy_a_SOURCES) $(al175_SOURCES) $(apcsmart_SOURCES) \ - $(apcsmart_old_SOURCES) $(apcupsd_ups_SOURCES) \ + $(apcsmart_old_SOURCES) $(apcupsd_ups_SOURCES) $(asem_SOURCES) \ $(bcmxcp_SOURCES) $(bcmxcp_usb_SOURCES) $(belkin_SOURCES) \ $(belkinunv_SOURCES) $(bestfcom_SOURCES) bestfortress.c \ $(bestuferrups_SOURCES) $(bestups_SOURCES) \ @@ -455,26 +523,26 @@ SOURCES = $(libdummy_a_SOURCES) $(al175_SOURCES) $(apcsmart_SOURCES) \ $(victronups_SOURCES) DIST_SOURCES = $(libdummy_a_SOURCES) $(al175_SOURCES) \ $(apcsmart_SOURCES) $(apcsmart_old_SOURCES) \ - $(apcupsd_ups_SOURCES) $(bcmxcp_SOURCES) $(bcmxcp_usb_SOURCES) \ - $(belkin_SOURCES) $(belkinunv_SOURCES) $(bestfcom_SOURCES) \ - bestfortress.c $(bestuferrups_SOURCES) $(bestups_SOURCES) \ - $(blazer_ser_SOURCES) $(blazer_usb_SOURCES) $(clone_SOURCES) \ - $(clone_outlet_SOURCES) $(dummy_ups_SOURCES) $(etapro_SOURCES) \ - $(everups_SOURCES) $(gamatronic_SOURCES) $(genericups_SOURCES) \ - $(isbmex_SOURCES) $(ivtscd_SOURCES) $(liebert_SOURCES) \ - $(liebert_esp2_SOURCES) $(macosx_ups_SOURCES) \ - $(masterguard_SOURCES) $(metasys_SOURCES) $(mge_shut_SOURCES) \ - $(mge_utalk_SOURCES) $(microdowell_SOURCES) \ - $(netxml_ups_SOURCES) $(am__nut_ipmipsu_SOURCES_DIST) \ - $(nutdrv_atcl_usb_SOURCES) $(am__nutdrv_qx_SOURCES_DIST) \ - $(oldmge_shut_SOURCES) $(oneac_SOURCES) $(optiups_SOURCES) \ - $(powercom_SOURCES) $(powerman_pdu_SOURCES) \ - $(powerpanel_SOURCES) $(rhino_SOURCES) $(richcomm_usb_SOURCES) \ - $(riello_ser_SOURCES) $(riello_usb_SOURCES) $(safenet_SOURCES) \ - $(skel_SOURCES) $(snmp_ups_SOURCES) $(solis_SOURCES) \ - $(tripplite_SOURCES) $(tripplite_usb_SOURCES) \ - $(tripplitesu_SOURCES) $(upscode2_SOURCES) \ - $(upsdrvctl_SOURCES) $(usbhid_ups_SOURCES) \ + $(apcupsd_ups_SOURCES) $(asem_SOURCES) $(bcmxcp_SOURCES) \ + $(bcmxcp_usb_SOURCES) $(belkin_SOURCES) $(belkinunv_SOURCES) \ + $(bestfcom_SOURCES) bestfortress.c $(bestuferrups_SOURCES) \ + $(bestups_SOURCES) $(blazer_ser_SOURCES) $(blazer_usb_SOURCES) \ + $(clone_SOURCES) $(clone_outlet_SOURCES) $(dummy_ups_SOURCES) \ + $(etapro_SOURCES) $(everups_SOURCES) $(gamatronic_SOURCES) \ + $(genericups_SOURCES) $(isbmex_SOURCES) $(ivtscd_SOURCES) \ + $(liebert_SOURCES) $(liebert_esp2_SOURCES) \ + $(macosx_ups_SOURCES) $(masterguard_SOURCES) \ + $(metasys_SOURCES) $(mge_shut_SOURCES) $(mge_utalk_SOURCES) \ + $(microdowell_SOURCES) $(netxml_ups_SOURCES) \ + $(am__nut_ipmipsu_SOURCES_DIST) $(nutdrv_atcl_usb_SOURCES) \ + $(am__nutdrv_qx_SOURCES_DIST) $(oldmge_shut_SOURCES) \ + $(oneac_SOURCES) $(optiups_SOURCES) $(powercom_SOURCES) \ + $(powerman_pdu_SOURCES) $(powerpanel_SOURCES) $(rhino_SOURCES) \ + $(richcomm_usb_SOURCES) $(riello_ser_SOURCES) \ + $(riello_usb_SOURCES) $(safenet_SOURCES) $(skel_SOURCES) \ + $(snmp_ups_SOURCES) $(solis_SOURCES) $(tripplite_SOURCES) \ + $(tripplite_usb_SOURCES) $(tripplitesu_SOURCES) \ + $(upscode2_SOURCES) $(upsdrvctl_SOURCES) $(usbhid_ups_SOURCES) \ $(victronups_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ @@ -482,12 +550,30 @@ am__can_run_installinfo = \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(dist_noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -594,12 +680,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -644,6 +733,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -697,6 +787,7 @@ USB_LIBUSB_DRIVERLIST = usbhid-ups bcmxcp_usb tripplite_usb \ USB_DRIVERLIST = $(USB_LIBUSB_DRIVERLIST) NEONXML_DRIVERLIST = netxml-ups MACOSX_DRIVERLIST = macosx-ups +LINUX_I2C_DRIVERLIST = asem # ========================================================================== # Driver build details @@ -756,9 +847,9 @@ riello_ser_LDADD = $(LDADD) -lm # dummy dummy_ups_SOURCES = dummy-ups.c dummy_ups_CFLAGS = $(AM_CFLAGS) -I$(top_srcdir)/clients \ - $(am__append_13) -dummy_ups_LDADD = $(LDADD_DRIVERS) ../clients/libupsclient.la \ $(am__append_14) +dummy_ups_LDADD = $(LDADD_DRIVERS) ../clients/libupsclient.la \ + $(am__append_15) # Clone drivers clone_SOURCES = clone.c @@ -785,7 +876,7 @@ usbhid_ups_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) tripplite_usb_SOURCES = tripplite_usb.c libusb.c usb-common.c tripplite_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm bcmxcp_usb_SOURCES = bcmxcp_usb.c bcmxcp.c usb-common.c -bcmxcp_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) +bcmxcp_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm blazer_usb_SOURCES = blazer.c blazer_usb.c libusb.c usb-common.c blazer_usb_LDADD = $(LDADD_DRIVERS) $(LIBUSB_LIBS) -lm nutdrv_atcl_usb_SOURCES = nutdrv_atcl_usb.c usb-common.c @@ -818,7 +909,7 @@ powerman_pdu_SOURCES = powerman-pdu.c powerman_pdu_LDADD = $(LDADD) $(LIBPOWERMAN_LIBS) # IPMI PSU -nut_ipmipsu_SOURCES = nut-ipmipsu.c $(am__append_15) +nut_ipmipsu_SOURCES = nut-ipmipsu.c $(am__append_16) nut_ipmipsu_LDADD = $(LDADD) $(LIBIPMI_LIBS) # Mac OS X metadriver @@ -826,15 +917,20 @@ macosx_ups_LDADD = $(LDADD_DRIVERS) macosx_ups_LDFLAGS = $(LDFLAGS) -framework IOKit -framework CoreFoundation macosx_ups_SOURCES = macosx-ups.c +# Asem +asem_LDADD = $(LDADD_DRIVERS) +asem_SOURCES = asem.c + # nutdrv_qx USB/Serial -nutdrv_qx_SOURCES = nutdrv_qx.c $(am__append_19) \ +nutdrv_qx_SOURCES = nutdrv_qx.c $(am__append_20) \ $(NUTDRV_QX_SUBDRIVERS) -nutdrv_qx_LDADD = $(LDADD_DRIVERS) -lm $(am__append_17) \ - $(am__append_20) -nutdrv_qx_CFLAGS = $(AM_CFLAGS) $(am__append_16) $(am__append_18) -NUTDRV_QX_SUBDRIVERS = nutdrv_qx_blazer-common.c nutdrv_qx_mecer.c \ - nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c nutdrv_qx_mustek.c \ - nutdrv_qx_q1.c nutdrv_qx_voltronic.c nutdrv_qx_voltronic-qs.c nutdrv_qx_zinto.c +nutdrv_qx_LDADD = $(LDADD_DRIVERS) -lm $(am__append_18) \ + $(am__append_21) +nutdrv_qx_CFLAGS = $(AM_CFLAGS) $(am__append_17) $(am__append_19) +NUTDRV_QX_SUBDRIVERS = nutdrv_qx_bestups.c nutdrv_qx_blazer-common.c \ + nutdrv_qx_mecer.c nutdrv_qx_megatec.c nutdrv_qx_megatec-old.c \ + nutdrv_qx_mustek.c nutdrv_qx_q1.c nutdrv_qx_voltronic.c \ + nutdrv_qx_voltronic-qs.c nutdrv_qx_voltronic-qs-hex.c nutdrv_qx_zinto.c # ---------------------------------------------------------------------- @@ -851,9 +947,9 @@ dist_noinst_HEADERS = apc-mib.h apc-hid.h baytech-mib.h bcmxcp.h \ safenet.h serial.h snmp-ups.h solis.h tripplite.h tripplite-hid.h \ upshandler.h usb-common.h usbhid-ups.h powercom-hid.h compaq-mib.h idowell-hid.h \ apcsmart.h apcsmart_tabs.h apcsmart-old.h apcupsd-ups.h cyberpower-mib.h riello.h openups-hid.h \ - delta_ups-mib.h nutdrv_qx.h nutdrv_qx_blazer-common.h nutdrv_qx_mecer.h \ + delta_ups-mib.h nutdrv_qx.h nutdrv_qx_bestups.h nutdrv_qx_blazer-common.h nutdrv_qx_mecer.h \ nutdrv_qx_megatec.h nutdrv_qx_megatec-old.h nutdrv_qx_mustek.h nutdrv_qx_q1.h \ - nutdrv_qx_voltronic.h nutdrv_qx_voltronic-qs.h nutdrv_qx_zinto.h \ + nutdrv_qx_voltronic.h nutdrv_qx_voltronic-qs.h nutdrv_qx_voltronic-qs-hex.h nutdrv_qx_zinto.h \ xppc-mib.h @@ -895,10 +991,11 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): + libdummy.a: $(libdummy_a_OBJECTS) $(libdummy_a_DEPENDENCIES) $(EXTRA_libdummy_a_DEPENDENCIES) - -rm -f libdummy.a - $(libdummy_a_AR) libdummy.a $(libdummy_a_OBJECTS) $(libdummy_a_LIBADD) - $(RANLIB) libdummy.a + $(AM_V_at)-rm -f libdummy.a + $(AM_V_AR)$(libdummy_a_AR) libdummy.a $(libdummy_a_OBJECTS) $(libdummy_a_LIBADD) + $(AM_V_at)$(RANLIB) libdummy.a install-driverexecPROGRAMS: $(driverexec_PROGRAMS) @$(NORMAL_INSTALL) @list='$(driverexec_PROGRAMS)'; test -n "$(driverexecdir)" || list=; \ @@ -908,10 +1005,12 @@ install-driverexecPROGRAMS: $(driverexec_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -932,7 +1031,8 @@ uninstall-driverexecPROGRAMS: @list='$(driverexec_PROGRAMS)'; test -n "$(driverexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(driverexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(driverexecdir)" && rm -f $$files @@ -954,10 +1054,12 @@ install-sbinPROGRAMS: $(sbin_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -978,7 +1080,8 @@ uninstall-sbinPROGRAMS: @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files @@ -991,174 +1094,234 @@ clean-sbinPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list + al175$(EXEEXT): $(al175_OBJECTS) $(al175_DEPENDENCIES) $(EXTRA_al175_DEPENDENCIES) @rm -f al175$(EXEEXT) - $(LINK) $(al175_OBJECTS) $(al175_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(al175_OBJECTS) $(al175_LDADD) $(LIBS) + apcsmart$(EXEEXT): $(apcsmart_OBJECTS) $(apcsmart_DEPENDENCIES) $(EXTRA_apcsmart_DEPENDENCIES) @rm -f apcsmart$(EXEEXT) - $(LINK) $(apcsmart_OBJECTS) $(apcsmart_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(apcsmart_OBJECTS) $(apcsmart_LDADD) $(LIBS) + apcsmart-old$(EXEEXT): $(apcsmart_old_OBJECTS) $(apcsmart_old_DEPENDENCIES) $(EXTRA_apcsmart_old_DEPENDENCIES) @rm -f apcsmart-old$(EXEEXT) - $(LINK) $(apcsmart_old_OBJECTS) $(apcsmart_old_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(apcsmart_old_OBJECTS) $(apcsmart_old_LDADD) $(LIBS) + apcupsd-ups$(EXEEXT): $(apcupsd_ups_OBJECTS) $(apcupsd_ups_DEPENDENCIES) $(EXTRA_apcupsd_ups_DEPENDENCIES) @rm -f apcupsd-ups$(EXEEXT) - $(apcupsd_ups_LINK) $(apcupsd_ups_OBJECTS) $(apcupsd_ups_LDADD) $(LIBS) + $(AM_V_CCLD)$(apcupsd_ups_LINK) $(apcupsd_ups_OBJECTS) $(apcupsd_ups_LDADD) $(LIBS) + +asem$(EXEEXT): $(asem_OBJECTS) $(asem_DEPENDENCIES) $(EXTRA_asem_DEPENDENCIES) + @rm -f asem$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(asem_OBJECTS) $(asem_LDADD) $(LIBS) + bcmxcp$(EXEEXT): $(bcmxcp_OBJECTS) $(bcmxcp_DEPENDENCIES) $(EXTRA_bcmxcp_DEPENDENCIES) @rm -f bcmxcp$(EXEEXT) - $(LINK) $(bcmxcp_OBJECTS) $(bcmxcp_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(bcmxcp_OBJECTS) $(bcmxcp_LDADD) $(LIBS) + bcmxcp_usb$(EXEEXT): $(bcmxcp_usb_OBJECTS) $(bcmxcp_usb_DEPENDENCIES) $(EXTRA_bcmxcp_usb_DEPENDENCIES) @rm -f bcmxcp_usb$(EXEEXT) - $(LINK) $(bcmxcp_usb_OBJECTS) $(bcmxcp_usb_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(bcmxcp_usb_OBJECTS) $(bcmxcp_usb_LDADD) $(LIBS) + belkin$(EXEEXT): $(belkin_OBJECTS) $(belkin_DEPENDENCIES) $(EXTRA_belkin_DEPENDENCIES) @rm -f belkin$(EXEEXT) - $(LINK) $(belkin_OBJECTS) $(belkin_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(belkin_OBJECTS) $(belkin_LDADD) $(LIBS) + belkinunv$(EXEEXT): $(belkinunv_OBJECTS) $(belkinunv_DEPENDENCIES) $(EXTRA_belkinunv_DEPENDENCIES) @rm -f belkinunv$(EXEEXT) - $(LINK) $(belkinunv_OBJECTS) $(belkinunv_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(belkinunv_OBJECTS) $(belkinunv_LDADD) $(LIBS) + bestfcom$(EXEEXT): $(bestfcom_OBJECTS) $(bestfcom_DEPENDENCIES) $(EXTRA_bestfcom_DEPENDENCIES) @rm -f bestfcom$(EXEEXT) - $(LINK) $(bestfcom_OBJECTS) $(bestfcom_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(bestfcom_OBJECTS) $(bestfcom_LDADD) $(LIBS) + bestfortress$(EXEEXT): $(bestfortress_OBJECTS) $(bestfortress_DEPENDENCIES) $(EXTRA_bestfortress_DEPENDENCIES) @rm -f bestfortress$(EXEEXT) - $(LINK) $(bestfortress_OBJECTS) $(bestfortress_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(bestfortress_OBJECTS) $(bestfortress_LDADD) $(LIBS) + bestuferrups$(EXEEXT): $(bestuferrups_OBJECTS) $(bestuferrups_DEPENDENCIES) $(EXTRA_bestuferrups_DEPENDENCIES) @rm -f bestuferrups$(EXEEXT) - $(LINK) $(bestuferrups_OBJECTS) $(bestuferrups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(bestuferrups_OBJECTS) $(bestuferrups_LDADD) $(LIBS) + bestups$(EXEEXT): $(bestups_OBJECTS) $(bestups_DEPENDENCIES) $(EXTRA_bestups_DEPENDENCIES) @rm -f bestups$(EXEEXT) - $(LINK) $(bestups_OBJECTS) $(bestups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(bestups_OBJECTS) $(bestups_LDADD) $(LIBS) + blazer_ser$(EXEEXT): $(blazer_ser_OBJECTS) $(blazer_ser_DEPENDENCIES) $(EXTRA_blazer_ser_DEPENDENCIES) @rm -f blazer_ser$(EXEEXT) - $(LINK) $(blazer_ser_OBJECTS) $(blazer_ser_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(blazer_ser_OBJECTS) $(blazer_ser_LDADD) $(LIBS) + blazer_usb$(EXEEXT): $(blazer_usb_OBJECTS) $(blazer_usb_DEPENDENCIES) $(EXTRA_blazer_usb_DEPENDENCIES) @rm -f blazer_usb$(EXEEXT) - $(LINK) $(blazer_usb_OBJECTS) $(blazer_usb_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(blazer_usb_OBJECTS) $(blazer_usb_LDADD) $(LIBS) + clone$(EXEEXT): $(clone_OBJECTS) $(clone_DEPENDENCIES) $(EXTRA_clone_DEPENDENCIES) @rm -f clone$(EXEEXT) - $(LINK) $(clone_OBJECTS) $(clone_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(clone_OBJECTS) $(clone_LDADD) $(LIBS) + clone-outlet$(EXEEXT): $(clone_outlet_OBJECTS) $(clone_outlet_DEPENDENCIES) $(EXTRA_clone_outlet_DEPENDENCIES) @rm -f clone-outlet$(EXEEXT) - $(LINK) $(clone_outlet_OBJECTS) $(clone_outlet_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(clone_outlet_OBJECTS) $(clone_outlet_LDADD) $(LIBS) + dummy-ups$(EXEEXT): $(dummy_ups_OBJECTS) $(dummy_ups_DEPENDENCIES) $(EXTRA_dummy_ups_DEPENDENCIES) @rm -f dummy-ups$(EXEEXT) - $(dummy_ups_LINK) $(dummy_ups_OBJECTS) $(dummy_ups_LDADD) $(LIBS) + $(AM_V_CCLD)$(dummy_ups_LINK) $(dummy_ups_OBJECTS) $(dummy_ups_LDADD) $(LIBS) + etapro$(EXEEXT): $(etapro_OBJECTS) $(etapro_DEPENDENCIES) $(EXTRA_etapro_DEPENDENCIES) @rm -f etapro$(EXEEXT) - $(LINK) $(etapro_OBJECTS) $(etapro_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(etapro_OBJECTS) $(etapro_LDADD) $(LIBS) + everups$(EXEEXT): $(everups_OBJECTS) $(everups_DEPENDENCIES) $(EXTRA_everups_DEPENDENCIES) @rm -f everups$(EXEEXT) - $(LINK) $(everups_OBJECTS) $(everups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(everups_OBJECTS) $(everups_LDADD) $(LIBS) + gamatronic$(EXEEXT): $(gamatronic_OBJECTS) $(gamatronic_DEPENDENCIES) $(EXTRA_gamatronic_DEPENDENCIES) @rm -f gamatronic$(EXEEXT) - $(LINK) $(gamatronic_OBJECTS) $(gamatronic_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(gamatronic_OBJECTS) $(gamatronic_LDADD) $(LIBS) + genericups$(EXEEXT): $(genericups_OBJECTS) $(genericups_DEPENDENCIES) $(EXTRA_genericups_DEPENDENCIES) @rm -f genericups$(EXEEXT) - $(LINK) $(genericups_OBJECTS) $(genericups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(genericups_OBJECTS) $(genericups_LDADD) $(LIBS) + isbmex$(EXEEXT): $(isbmex_OBJECTS) $(isbmex_DEPENDENCIES) $(EXTRA_isbmex_DEPENDENCIES) @rm -f isbmex$(EXEEXT) - $(LINK) $(isbmex_OBJECTS) $(isbmex_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(isbmex_OBJECTS) $(isbmex_LDADD) $(LIBS) + ivtscd$(EXEEXT): $(ivtscd_OBJECTS) $(ivtscd_DEPENDENCIES) $(EXTRA_ivtscd_DEPENDENCIES) @rm -f ivtscd$(EXEEXT) - $(LINK) $(ivtscd_OBJECTS) $(ivtscd_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(ivtscd_OBJECTS) $(ivtscd_LDADD) $(LIBS) + liebert$(EXEEXT): $(liebert_OBJECTS) $(liebert_DEPENDENCIES) $(EXTRA_liebert_DEPENDENCIES) @rm -f liebert$(EXEEXT) - $(LINK) $(liebert_OBJECTS) $(liebert_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(liebert_OBJECTS) $(liebert_LDADD) $(LIBS) + liebert-esp2$(EXEEXT): $(liebert_esp2_OBJECTS) $(liebert_esp2_DEPENDENCIES) $(EXTRA_liebert_esp2_DEPENDENCIES) @rm -f liebert-esp2$(EXEEXT) - $(LINK) $(liebert_esp2_OBJECTS) $(liebert_esp2_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(liebert_esp2_OBJECTS) $(liebert_esp2_LDADD) $(LIBS) + macosx-ups$(EXEEXT): $(macosx_ups_OBJECTS) $(macosx_ups_DEPENDENCIES) $(EXTRA_macosx_ups_DEPENDENCIES) @rm -f macosx-ups$(EXEEXT) - $(macosx_ups_LINK) $(macosx_ups_OBJECTS) $(macosx_ups_LDADD) $(LIBS) + $(AM_V_CCLD)$(macosx_ups_LINK) $(macosx_ups_OBJECTS) $(macosx_ups_LDADD) $(LIBS) + masterguard$(EXEEXT): $(masterguard_OBJECTS) $(masterguard_DEPENDENCIES) $(EXTRA_masterguard_DEPENDENCIES) @rm -f masterguard$(EXEEXT) - $(LINK) $(masterguard_OBJECTS) $(masterguard_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(masterguard_OBJECTS) $(masterguard_LDADD) $(LIBS) + metasys$(EXEEXT): $(metasys_OBJECTS) $(metasys_DEPENDENCIES) $(EXTRA_metasys_DEPENDENCIES) @rm -f metasys$(EXEEXT) - $(LINK) $(metasys_OBJECTS) $(metasys_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(metasys_OBJECTS) $(metasys_LDADD) $(LIBS) + mge-shut$(EXEEXT): $(mge_shut_OBJECTS) $(mge_shut_DEPENDENCIES) $(EXTRA_mge_shut_DEPENDENCIES) @rm -f mge-shut$(EXEEXT) - $(mge_shut_LINK) $(mge_shut_OBJECTS) $(mge_shut_LDADD) $(LIBS) + $(AM_V_CCLD)$(mge_shut_LINK) $(mge_shut_OBJECTS) $(mge_shut_LDADD) $(LIBS) + mge-utalk$(EXEEXT): $(mge_utalk_OBJECTS) $(mge_utalk_DEPENDENCIES) $(EXTRA_mge_utalk_DEPENDENCIES) @rm -f mge-utalk$(EXEEXT) - $(LINK) $(mge_utalk_OBJECTS) $(mge_utalk_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(mge_utalk_OBJECTS) $(mge_utalk_LDADD) $(LIBS) + microdowell$(EXEEXT): $(microdowell_OBJECTS) $(microdowell_DEPENDENCIES) $(EXTRA_microdowell_DEPENDENCIES) @rm -f microdowell$(EXEEXT) - $(LINK) $(microdowell_OBJECTS) $(microdowell_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(microdowell_OBJECTS) $(microdowell_LDADD) $(LIBS) + netxml-ups$(EXEEXT): $(netxml_ups_OBJECTS) $(netxml_ups_DEPENDENCIES) $(EXTRA_netxml_ups_DEPENDENCIES) @rm -f netxml-ups$(EXEEXT) - $(LINK) $(netxml_ups_OBJECTS) $(netxml_ups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(netxml_ups_OBJECTS) $(netxml_ups_LDADD) $(LIBS) + nut-ipmipsu$(EXEEXT): $(nut_ipmipsu_OBJECTS) $(nut_ipmipsu_DEPENDENCIES) $(EXTRA_nut_ipmipsu_DEPENDENCIES) @rm -f nut-ipmipsu$(EXEEXT) - $(LINK) $(nut_ipmipsu_OBJECTS) $(nut_ipmipsu_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(nut_ipmipsu_OBJECTS) $(nut_ipmipsu_LDADD) $(LIBS) + nutdrv_atcl_usb$(EXEEXT): $(nutdrv_atcl_usb_OBJECTS) $(nutdrv_atcl_usb_DEPENDENCIES) $(EXTRA_nutdrv_atcl_usb_DEPENDENCIES) @rm -f nutdrv_atcl_usb$(EXEEXT) - $(LINK) $(nutdrv_atcl_usb_OBJECTS) $(nutdrv_atcl_usb_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(nutdrv_atcl_usb_OBJECTS) $(nutdrv_atcl_usb_LDADD) $(LIBS) + nutdrv_qx$(EXEEXT): $(nutdrv_qx_OBJECTS) $(nutdrv_qx_DEPENDENCIES) $(EXTRA_nutdrv_qx_DEPENDENCIES) @rm -f nutdrv_qx$(EXEEXT) - $(nutdrv_qx_LINK) $(nutdrv_qx_OBJECTS) $(nutdrv_qx_LDADD) $(LIBS) + $(AM_V_CCLD)$(nutdrv_qx_LINK) $(nutdrv_qx_OBJECTS) $(nutdrv_qx_LDADD) $(LIBS) + oldmge-shut$(EXEEXT): $(oldmge_shut_OBJECTS) $(oldmge_shut_DEPENDENCIES) $(EXTRA_oldmge_shut_DEPENDENCIES) @rm -f oldmge-shut$(EXEEXT) - $(LINK) $(oldmge_shut_OBJECTS) $(oldmge_shut_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(oldmge_shut_OBJECTS) $(oldmge_shut_LDADD) $(LIBS) + oneac$(EXEEXT): $(oneac_OBJECTS) $(oneac_DEPENDENCIES) $(EXTRA_oneac_DEPENDENCIES) @rm -f oneac$(EXEEXT) - $(LINK) $(oneac_OBJECTS) $(oneac_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(oneac_OBJECTS) $(oneac_LDADD) $(LIBS) + optiups$(EXEEXT): $(optiups_OBJECTS) $(optiups_DEPENDENCIES) $(EXTRA_optiups_DEPENDENCIES) @rm -f optiups$(EXEEXT) - $(LINK) $(optiups_OBJECTS) $(optiups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(optiups_OBJECTS) $(optiups_LDADD) $(LIBS) + powercom$(EXEEXT): $(powercom_OBJECTS) $(powercom_DEPENDENCIES) $(EXTRA_powercom_DEPENDENCIES) @rm -f powercom$(EXEEXT) - $(LINK) $(powercom_OBJECTS) $(powercom_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(powercom_OBJECTS) $(powercom_LDADD) $(LIBS) + powerman-pdu$(EXEEXT): $(powerman_pdu_OBJECTS) $(powerman_pdu_DEPENDENCIES) $(EXTRA_powerman_pdu_DEPENDENCIES) @rm -f powerman-pdu$(EXEEXT) - $(LINK) $(powerman_pdu_OBJECTS) $(powerman_pdu_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(powerman_pdu_OBJECTS) $(powerman_pdu_LDADD) $(LIBS) + powerpanel$(EXEEXT): $(powerpanel_OBJECTS) $(powerpanel_DEPENDENCIES) $(EXTRA_powerpanel_DEPENDENCIES) @rm -f powerpanel$(EXEEXT) - $(LINK) $(powerpanel_OBJECTS) $(powerpanel_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(powerpanel_OBJECTS) $(powerpanel_LDADD) $(LIBS) + rhino$(EXEEXT): $(rhino_OBJECTS) $(rhino_DEPENDENCIES) $(EXTRA_rhino_DEPENDENCIES) @rm -f rhino$(EXEEXT) - $(LINK) $(rhino_OBJECTS) $(rhino_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(rhino_OBJECTS) $(rhino_LDADD) $(LIBS) + richcomm_usb$(EXEEXT): $(richcomm_usb_OBJECTS) $(richcomm_usb_DEPENDENCIES) $(EXTRA_richcomm_usb_DEPENDENCIES) @rm -f richcomm_usb$(EXEEXT) - $(LINK) $(richcomm_usb_OBJECTS) $(richcomm_usb_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(richcomm_usb_OBJECTS) $(richcomm_usb_LDADD) $(LIBS) + riello_ser$(EXEEXT): $(riello_ser_OBJECTS) $(riello_ser_DEPENDENCIES) $(EXTRA_riello_ser_DEPENDENCIES) @rm -f riello_ser$(EXEEXT) - $(LINK) $(riello_ser_OBJECTS) $(riello_ser_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(riello_ser_OBJECTS) $(riello_ser_LDADD) $(LIBS) + riello_usb$(EXEEXT): $(riello_usb_OBJECTS) $(riello_usb_DEPENDENCIES) $(EXTRA_riello_usb_DEPENDENCIES) @rm -f riello_usb$(EXEEXT) - $(LINK) $(riello_usb_OBJECTS) $(riello_usb_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(riello_usb_OBJECTS) $(riello_usb_LDADD) $(LIBS) + safenet$(EXEEXT): $(safenet_OBJECTS) $(safenet_DEPENDENCIES) $(EXTRA_safenet_DEPENDENCIES) @rm -f safenet$(EXEEXT) - $(LINK) $(safenet_OBJECTS) $(safenet_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(safenet_OBJECTS) $(safenet_LDADD) $(LIBS) + skel$(EXEEXT): $(skel_OBJECTS) $(skel_DEPENDENCIES) $(EXTRA_skel_DEPENDENCIES) @rm -f skel$(EXEEXT) - $(LINK) $(skel_OBJECTS) $(skel_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(skel_OBJECTS) $(skel_LDADD) $(LIBS) + snmp-ups$(EXEEXT): $(snmp_ups_OBJECTS) $(snmp_ups_DEPENDENCIES) $(EXTRA_snmp_ups_DEPENDENCIES) @rm -f snmp-ups$(EXEEXT) - $(LINK) $(snmp_ups_OBJECTS) $(snmp_ups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(snmp_ups_OBJECTS) $(snmp_ups_LDADD) $(LIBS) + solis$(EXEEXT): $(solis_OBJECTS) $(solis_DEPENDENCIES) $(EXTRA_solis_DEPENDENCIES) @rm -f solis$(EXEEXT) - $(LINK) $(solis_OBJECTS) $(solis_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(solis_OBJECTS) $(solis_LDADD) $(LIBS) + tripplite$(EXEEXT): $(tripplite_OBJECTS) $(tripplite_DEPENDENCIES) $(EXTRA_tripplite_DEPENDENCIES) @rm -f tripplite$(EXEEXT) - $(LINK) $(tripplite_OBJECTS) $(tripplite_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(tripplite_OBJECTS) $(tripplite_LDADD) $(LIBS) + tripplite_usb$(EXEEXT): $(tripplite_usb_OBJECTS) $(tripplite_usb_DEPENDENCIES) $(EXTRA_tripplite_usb_DEPENDENCIES) @rm -f tripplite_usb$(EXEEXT) - $(LINK) $(tripplite_usb_OBJECTS) $(tripplite_usb_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(tripplite_usb_OBJECTS) $(tripplite_usb_LDADD) $(LIBS) + tripplitesu$(EXEEXT): $(tripplitesu_OBJECTS) $(tripplitesu_DEPENDENCIES) $(EXTRA_tripplitesu_DEPENDENCIES) @rm -f tripplitesu$(EXEEXT) - $(LINK) $(tripplitesu_OBJECTS) $(tripplitesu_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(tripplitesu_OBJECTS) $(tripplitesu_LDADD) $(LIBS) + upscode2$(EXEEXT): $(upscode2_OBJECTS) $(upscode2_DEPENDENCIES) $(EXTRA_upscode2_DEPENDENCIES) @rm -f upscode2$(EXEEXT) - $(LINK) $(upscode2_OBJECTS) $(upscode2_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upscode2_OBJECTS) $(upscode2_LDADD) $(LIBS) + upsdrvctl$(EXEEXT): $(upsdrvctl_OBJECTS) $(upsdrvctl_DEPENDENCIES) $(EXTRA_upsdrvctl_DEPENDENCIES) @rm -f upsdrvctl$(EXEEXT) - $(LINK) $(upsdrvctl_OBJECTS) $(upsdrvctl_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsdrvctl_OBJECTS) $(upsdrvctl_LDADD) $(LIBS) + usbhid-ups$(EXEEXT): $(usbhid_ups_OBJECTS) $(usbhid_ups_DEPENDENCIES) $(EXTRA_usbhid_ups_DEPENDENCIES) @rm -f usbhid-ups$(EXEEXT) - $(LINK) $(usbhid_ups_OBJECTS) $(usbhid_ups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(usbhid_ups_OBJECTS) $(usbhid_ups_LDADD) $(LIBS) + victronups$(EXEEXT): $(victronups_OBJECTS) $(victronups_DEPENDENCIES) $(EXTRA_victronups_DEPENDENCIES) @rm -f victronups$(EXEEXT) - $(LINK) $(victronups_OBJECTS) $(victronups_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(victronups_OBJECTS) $(victronups_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -1173,6 +1336,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apcsmart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apcsmart_tabs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apcupsd_ups-apcupsd-ups.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/baytech-mib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcmxcp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcmxcp_ser.Po@am__quote@ @@ -1234,12 +1398,14 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_atcl_usb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-libusb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_bestups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs-hex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Po@am__quote@ @@ -1277,291 +1443,322 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xppc-mib.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< apcupsd_ups-apcupsd-ups.o: apcupsd-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -MT apcupsd_ups-apcupsd-ups.o -MD -MP -MF $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo -c -o apcupsd_ups-apcupsd-ups.o `test -f 'apcupsd-ups.c' || echo '$(srcdir)/'`apcupsd-ups.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo $(DEPDIR)/apcupsd_ups-apcupsd-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='apcupsd-ups.c' object='apcupsd_ups-apcupsd-ups.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -MT apcupsd_ups-apcupsd-ups.o -MD -MP -MF $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo -c -o apcupsd_ups-apcupsd-ups.o `test -f 'apcupsd-ups.c' || echo '$(srcdir)/'`apcupsd-ups.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo $(DEPDIR)/apcupsd_ups-apcupsd-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='apcupsd-ups.c' object='apcupsd_ups-apcupsd-ups.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -c -o apcupsd_ups-apcupsd-ups.o `test -f 'apcupsd-ups.c' || echo '$(srcdir)/'`apcupsd-ups.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -c -o apcupsd_ups-apcupsd-ups.o `test -f 'apcupsd-ups.c' || echo '$(srcdir)/'`apcupsd-ups.c apcupsd_ups-apcupsd-ups.obj: apcupsd-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -MT apcupsd_ups-apcupsd-ups.obj -MD -MP -MF $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo -c -o apcupsd_ups-apcupsd-ups.obj `if test -f 'apcupsd-ups.c'; then $(CYGPATH_W) 'apcupsd-ups.c'; else $(CYGPATH_W) '$(srcdir)/apcupsd-ups.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo $(DEPDIR)/apcupsd_ups-apcupsd-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='apcupsd-ups.c' object='apcupsd_ups-apcupsd-ups.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -MT apcupsd_ups-apcupsd-ups.obj -MD -MP -MF $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo -c -o apcupsd_ups-apcupsd-ups.obj `if test -f 'apcupsd-ups.c'; then $(CYGPATH_W) 'apcupsd-ups.c'; else $(CYGPATH_W) '$(srcdir)/apcupsd-ups.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/apcupsd_ups-apcupsd-ups.Tpo $(DEPDIR)/apcupsd_ups-apcupsd-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='apcupsd-ups.c' object='apcupsd_ups-apcupsd-ups.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -c -o apcupsd_ups-apcupsd-ups.obj `if test -f 'apcupsd-ups.c'; then $(CYGPATH_W) 'apcupsd-ups.c'; else $(CYGPATH_W) '$(srcdir)/apcupsd-ups.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(apcupsd_ups_CFLAGS) $(CFLAGS) -c -o apcupsd_ups-apcupsd-ups.obj `if test -f 'apcupsd-ups.c'; then $(CYGPATH_W) 'apcupsd-ups.c'; else $(CYGPATH_W) '$(srcdir)/apcupsd-ups.c'; fi` dummy_ups-dummy-ups.o: dummy-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -MT dummy_ups-dummy-ups.o -MD -MP -MF $(DEPDIR)/dummy_ups-dummy-ups.Tpo -c -o dummy_ups-dummy-ups.o `test -f 'dummy-ups.c' || echo '$(srcdir)/'`dummy-ups.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dummy_ups-dummy-ups.Tpo $(DEPDIR)/dummy_ups-dummy-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dummy-ups.c' object='dummy_ups-dummy-ups.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -MT dummy_ups-dummy-ups.o -MD -MP -MF $(DEPDIR)/dummy_ups-dummy-ups.Tpo -c -o dummy_ups-dummy-ups.o `test -f 'dummy-ups.c' || echo '$(srcdir)/'`dummy-ups.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_ups-dummy-ups.Tpo $(DEPDIR)/dummy_ups-dummy-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dummy-ups.c' object='dummy_ups-dummy-ups.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -c -o dummy_ups-dummy-ups.o `test -f 'dummy-ups.c' || echo '$(srcdir)/'`dummy-ups.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -c -o dummy_ups-dummy-ups.o `test -f 'dummy-ups.c' || echo '$(srcdir)/'`dummy-ups.c dummy_ups-dummy-ups.obj: dummy-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -MT dummy_ups-dummy-ups.obj -MD -MP -MF $(DEPDIR)/dummy_ups-dummy-ups.Tpo -c -o dummy_ups-dummy-ups.obj `if test -f 'dummy-ups.c'; then $(CYGPATH_W) 'dummy-ups.c'; else $(CYGPATH_W) '$(srcdir)/dummy-ups.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dummy_ups-dummy-ups.Tpo $(DEPDIR)/dummy_ups-dummy-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dummy-ups.c' object='dummy_ups-dummy-ups.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -MT dummy_ups-dummy-ups.obj -MD -MP -MF $(DEPDIR)/dummy_ups-dummy-ups.Tpo -c -o dummy_ups-dummy-ups.obj `if test -f 'dummy-ups.c'; then $(CYGPATH_W) 'dummy-ups.c'; else $(CYGPATH_W) '$(srcdir)/dummy-ups.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dummy_ups-dummy-ups.Tpo $(DEPDIR)/dummy_ups-dummy-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dummy-ups.c' object='dummy_ups-dummy-ups.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -c -o dummy_ups-dummy-ups.obj `if test -f 'dummy-ups.c'; then $(CYGPATH_W) 'dummy-ups.c'; else $(CYGPATH_W) '$(srcdir)/dummy-ups.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dummy_ups_CFLAGS) $(CFLAGS) -c -o dummy_ups-dummy-ups.obj `if test -f 'dummy-ups.c'; then $(CYGPATH_W) 'dummy-ups.c'; else $(CYGPATH_W) '$(srcdir)/dummy-ups.c'; fi` mge_shut-usbhid-ups.o: usbhid-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-usbhid-ups.o -MD -MP -MF $(DEPDIR)/mge_shut-usbhid-ups.Tpo -c -o mge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-usbhid-ups.Tpo $(DEPDIR)/mge_shut-usbhid-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usbhid-ups.c' object='mge_shut-usbhid-ups.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-usbhid-ups.o -MD -MP -MF $(DEPDIR)/mge_shut-usbhid-ups.Tpo -c -o mge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-usbhid-ups.Tpo $(DEPDIR)/mge_shut-usbhid-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='usbhid-ups.c' object='mge_shut-usbhid-ups.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-usbhid-ups.o `test -f 'usbhid-ups.c' || echo '$(srcdir)/'`usbhid-ups.c mge_shut-usbhid-ups.obj: usbhid-ups.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-usbhid-ups.obj -MD -MP -MF $(DEPDIR)/mge_shut-usbhid-ups.Tpo -c -o mge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-usbhid-ups.Tpo $(DEPDIR)/mge_shut-usbhid-ups.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usbhid-ups.c' object='mge_shut-usbhid-ups.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-usbhid-ups.obj -MD -MP -MF $(DEPDIR)/mge_shut-usbhid-ups.Tpo -c -o mge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-usbhid-ups.Tpo $(DEPDIR)/mge_shut-usbhid-ups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='usbhid-ups.c' object='mge_shut-usbhid-ups.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-usbhid-ups.obj `if test -f 'usbhid-ups.c'; then $(CYGPATH_W) 'usbhid-ups.c'; else $(CYGPATH_W) '$(srcdir)/usbhid-ups.c'; fi` mge_shut-libshut.o: libshut.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libshut.o -MD -MP -MF $(DEPDIR)/mge_shut-libshut.Tpo -c -o mge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libshut.Tpo $(DEPDIR)/mge_shut-libshut.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libshut.c' object='mge_shut-libshut.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libshut.o -MD -MP -MF $(DEPDIR)/mge_shut-libshut.Tpo -c -o mge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-libshut.Tpo $(DEPDIR)/mge_shut-libshut.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libshut.c' object='mge_shut-libshut.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libshut.o `test -f 'libshut.c' || echo '$(srcdir)/'`libshut.c mge_shut-libshut.obj: libshut.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libshut.obj -MD -MP -MF $(DEPDIR)/mge_shut-libshut.Tpo -c -o mge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libshut.Tpo $(DEPDIR)/mge_shut-libshut.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libshut.c' object='mge_shut-libshut.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libshut.obj -MD -MP -MF $(DEPDIR)/mge_shut-libshut.Tpo -c -o mge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-libshut.Tpo $(DEPDIR)/mge_shut-libshut.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libshut.c' object='mge_shut-libshut.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libshut.obj `if test -f 'libshut.c'; then $(CYGPATH_W) 'libshut.c'; else $(CYGPATH_W) '$(srcdir)/libshut.c'; fi` mge_shut-libhid.o: libhid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libhid.o -MD -MP -MF $(DEPDIR)/mge_shut-libhid.Tpo -c -o mge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libhid.Tpo $(DEPDIR)/mge_shut-libhid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libhid.c' object='mge_shut-libhid.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libhid.o -MD -MP -MF $(DEPDIR)/mge_shut-libhid.Tpo -c -o mge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-libhid.Tpo $(DEPDIR)/mge_shut-libhid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libhid.c' object='mge_shut-libhid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libhid.o `test -f 'libhid.c' || echo '$(srcdir)/'`libhid.c mge_shut-libhid.obj: libhid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libhid.obj -MD -MP -MF $(DEPDIR)/mge_shut-libhid.Tpo -c -o mge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-libhid.Tpo $(DEPDIR)/mge_shut-libhid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libhid.c' object='mge_shut-libhid.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-libhid.obj -MD -MP -MF $(DEPDIR)/mge_shut-libhid.Tpo -c -o mge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-libhid.Tpo $(DEPDIR)/mge_shut-libhid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libhid.c' object='mge_shut-libhid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-libhid.obj `if test -f 'libhid.c'; then $(CYGPATH_W) 'libhid.c'; else $(CYGPATH_W) '$(srcdir)/libhid.c'; fi` mge_shut-hidparser.o: hidparser.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-hidparser.o -MD -MP -MF $(DEPDIR)/mge_shut-hidparser.Tpo -c -o mge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-hidparser.Tpo $(DEPDIR)/mge_shut-hidparser.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hidparser.c' object='mge_shut-hidparser.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-hidparser.o -MD -MP -MF $(DEPDIR)/mge_shut-hidparser.Tpo -c -o mge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-hidparser.Tpo $(DEPDIR)/mge_shut-hidparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hidparser.c' object='mge_shut-hidparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-hidparser.o `test -f 'hidparser.c' || echo '$(srcdir)/'`hidparser.c mge_shut-hidparser.obj: hidparser.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-hidparser.obj -MD -MP -MF $(DEPDIR)/mge_shut-hidparser.Tpo -c -o mge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-hidparser.Tpo $(DEPDIR)/mge_shut-hidparser.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hidparser.c' object='mge_shut-hidparser.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-hidparser.obj -MD -MP -MF $(DEPDIR)/mge_shut-hidparser.Tpo -c -o mge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-hidparser.Tpo $(DEPDIR)/mge_shut-hidparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hidparser.c' object='mge_shut-hidparser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-hidparser.obj `if test -f 'hidparser.c'; then $(CYGPATH_W) 'hidparser.c'; else $(CYGPATH_W) '$(srcdir)/hidparser.c'; fi` mge_shut-mge-hid.o: mge-hid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-mge-hid.o -MD -MP -MF $(DEPDIR)/mge_shut-mge-hid.Tpo -c -o mge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-mge-hid.Tpo $(DEPDIR)/mge_shut-mge-hid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mge-hid.c' object='mge_shut-mge-hid.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-mge-hid.o -MD -MP -MF $(DEPDIR)/mge_shut-mge-hid.Tpo -c -o mge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-mge-hid.Tpo $(DEPDIR)/mge_shut-mge-hid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mge-hid.c' object='mge_shut-mge-hid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-mge-hid.o `test -f 'mge-hid.c' || echo '$(srcdir)/'`mge-hid.c mge_shut-mge-hid.obj: mge-hid.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-mge-hid.obj -MD -MP -MF $(DEPDIR)/mge_shut-mge-hid.Tpo -c -o mge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mge_shut-mge-hid.Tpo $(DEPDIR)/mge_shut-mge-hid.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mge-hid.c' object='mge_shut-mge-hid.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -MT mge_shut-mge-hid.obj -MD -MP -MF $(DEPDIR)/mge_shut-mge-hid.Tpo -c -o mge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mge_shut-mge-hid.Tpo $(DEPDIR)/mge_shut-mge-hid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mge-hid.c' object='mge_shut-mge-hid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mge_shut_CFLAGS) $(CFLAGS) -c -o mge_shut-mge-hid.obj `if test -f 'mge-hid.c'; then $(CYGPATH_W) 'mge-hid.c'; else $(CYGPATH_W) '$(srcdir)/mge-hid.c'; fi` nutdrv_qx-nutdrv_qx.o: nutdrv_qx.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo -c -o nutdrv_qx-nutdrv_qx.o `test -f 'nutdrv_qx.c' || echo '$(srcdir)/'`nutdrv_qx.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx.c' object='nutdrv_qx-nutdrv_qx.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo -c -o nutdrv_qx-nutdrv_qx.o `test -f 'nutdrv_qx.c' || echo '$(srcdir)/'`nutdrv_qx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx.c' object='nutdrv_qx-nutdrv_qx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx.o `test -f 'nutdrv_qx.c' || echo '$(srcdir)/'`nutdrv_qx.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx.o `test -f 'nutdrv_qx.c' || echo '$(srcdir)/'`nutdrv_qx.c nutdrv_qx-nutdrv_qx.obj: nutdrv_qx.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo -c -o nutdrv_qx-nutdrv_qx.obj `if test -f 'nutdrv_qx.c'; then $(CYGPATH_W) 'nutdrv_qx.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx.c' object='nutdrv_qx-nutdrv_qx.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo -c -o nutdrv_qx-nutdrv_qx.obj `if test -f 'nutdrv_qx.c'; then $(CYGPATH_W) 'nutdrv_qx.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx.c' object='nutdrv_qx-nutdrv_qx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx.obj `if test -f 'nutdrv_qx.c'; then $(CYGPATH_W) 'nutdrv_qx.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx.obj `if test -f 'nutdrv_qx.c'; then $(CYGPATH_W) 'nutdrv_qx.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx.c'; fi` nutdrv_qx-libusb.o: libusb.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-libusb.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-libusb.Tpo -c -o nutdrv_qx-libusb.o `test -f 'libusb.c' || echo '$(srcdir)/'`libusb.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-libusb.Tpo $(DEPDIR)/nutdrv_qx-libusb.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libusb.c' object='nutdrv_qx-libusb.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-libusb.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-libusb.Tpo -c -o nutdrv_qx-libusb.o `test -f 'libusb.c' || echo '$(srcdir)/'`libusb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-libusb.Tpo $(DEPDIR)/nutdrv_qx-libusb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libusb.c' object='nutdrv_qx-libusb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-libusb.o `test -f 'libusb.c' || echo '$(srcdir)/'`libusb.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-libusb.o `test -f 'libusb.c' || echo '$(srcdir)/'`libusb.c nutdrv_qx-libusb.obj: libusb.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-libusb.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-libusb.Tpo -c -o nutdrv_qx-libusb.obj `if test -f 'libusb.c'; then $(CYGPATH_W) 'libusb.c'; else $(CYGPATH_W) '$(srcdir)/libusb.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-libusb.Tpo $(DEPDIR)/nutdrv_qx-libusb.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libusb.c' object='nutdrv_qx-libusb.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-libusb.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-libusb.Tpo -c -o nutdrv_qx-libusb.obj `if test -f 'libusb.c'; then $(CYGPATH_W) 'libusb.c'; else $(CYGPATH_W) '$(srcdir)/libusb.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-libusb.Tpo $(DEPDIR)/nutdrv_qx-libusb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libusb.c' object='nutdrv_qx-libusb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-libusb.obj `if test -f 'libusb.c'; then $(CYGPATH_W) 'libusb.c'; else $(CYGPATH_W) '$(srcdir)/libusb.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-libusb.obj `if test -f 'libusb.c'; then $(CYGPATH_W) 'libusb.c'; else $(CYGPATH_W) '$(srcdir)/libusb.c'; fi` nutdrv_qx-usb-common.o: usb-common.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-usb-common.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-usb-common.Tpo -c -o nutdrv_qx-usb-common.o `test -f 'usb-common.c' || echo '$(srcdir)/'`usb-common.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-usb-common.Tpo $(DEPDIR)/nutdrv_qx-usb-common.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usb-common.c' object='nutdrv_qx-usb-common.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-usb-common.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-usb-common.Tpo -c -o nutdrv_qx-usb-common.o `test -f 'usb-common.c' || echo '$(srcdir)/'`usb-common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-usb-common.Tpo $(DEPDIR)/nutdrv_qx-usb-common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='usb-common.c' object='nutdrv_qx-usb-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-usb-common.o `test -f 'usb-common.c' || echo '$(srcdir)/'`usb-common.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-usb-common.o `test -f 'usb-common.c' || echo '$(srcdir)/'`usb-common.c nutdrv_qx-usb-common.obj: usb-common.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-usb-common.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-usb-common.Tpo -c -o nutdrv_qx-usb-common.obj `if test -f 'usb-common.c'; then $(CYGPATH_W) 'usb-common.c'; else $(CYGPATH_W) '$(srcdir)/usb-common.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-usb-common.Tpo $(DEPDIR)/nutdrv_qx-usb-common.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='usb-common.c' object='nutdrv_qx-usb-common.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-usb-common.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-usb-common.Tpo -c -o nutdrv_qx-usb-common.obj `if test -f 'usb-common.c'; then $(CYGPATH_W) 'usb-common.c'; else $(CYGPATH_W) '$(srcdir)/usb-common.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-usb-common.Tpo $(DEPDIR)/nutdrv_qx-usb-common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='usb-common.c' object='nutdrv_qx-usb-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-usb-common.obj `if test -f 'usb-common.c'; then $(CYGPATH_W) 'usb-common.c'; else $(CYGPATH_W) '$(srcdir)/usb-common.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-usb-common.obj `if test -f 'usb-common.c'; then $(CYGPATH_W) 'usb-common.c'; else $(CYGPATH_W) '$(srcdir)/usb-common.c'; fi` + +nutdrv_qx-nutdrv_qx_bestups.o: nutdrv_qx_bestups.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_bestups.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_bestups.Tpo -c -o nutdrv_qx-nutdrv_qx_bestups.o `test -f 'nutdrv_qx_bestups.c' || echo '$(srcdir)/'`nutdrv_qx_bestups.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_bestups.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_bestups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_bestups.c' object='nutdrv_qx-nutdrv_qx_bestups.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_bestups.o `test -f 'nutdrv_qx_bestups.c' || echo '$(srcdir)/'`nutdrv_qx_bestups.c + +nutdrv_qx-nutdrv_qx_bestups.obj: nutdrv_qx_bestups.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_bestups.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_bestups.Tpo -c -o nutdrv_qx-nutdrv_qx_bestups.obj `if test -f 'nutdrv_qx_bestups.c'; then $(CYGPATH_W) 'nutdrv_qx_bestups.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_bestups.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_bestups.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_bestups.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_bestups.c' object='nutdrv_qx-nutdrv_qx_bestups.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_bestups.obj `if test -f 'nutdrv_qx_bestups.c'; then $(CYGPATH_W) 'nutdrv_qx_bestups.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_bestups.c'; fi` nutdrv_qx-nutdrv_qx_blazer-common.o: nutdrv_qx_blazer-common.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_blazer-common.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo -c -o nutdrv_qx-nutdrv_qx_blazer-common.o `test -f 'nutdrv_qx_blazer-common.c' || echo '$(srcdir)/'`nutdrv_qx_blazer-common.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_blazer-common.c' object='nutdrv_qx-nutdrv_qx_blazer-common.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_blazer-common.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo -c -o nutdrv_qx-nutdrv_qx_blazer-common.o `test -f 'nutdrv_qx_blazer-common.c' || echo '$(srcdir)/'`nutdrv_qx_blazer-common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_blazer-common.c' object='nutdrv_qx-nutdrv_qx_blazer-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_blazer-common.o `test -f 'nutdrv_qx_blazer-common.c' || echo '$(srcdir)/'`nutdrv_qx_blazer-common.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_blazer-common.o `test -f 'nutdrv_qx_blazer-common.c' || echo '$(srcdir)/'`nutdrv_qx_blazer-common.c nutdrv_qx-nutdrv_qx_blazer-common.obj: nutdrv_qx_blazer-common.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_blazer-common.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo -c -o nutdrv_qx-nutdrv_qx_blazer-common.obj `if test -f 'nutdrv_qx_blazer-common.c'; then $(CYGPATH_W) 'nutdrv_qx_blazer-common.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_blazer-common.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_blazer-common.c' object='nutdrv_qx-nutdrv_qx_blazer-common.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_blazer-common.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo -c -o nutdrv_qx-nutdrv_qx_blazer-common.obj `if test -f 'nutdrv_qx_blazer-common.c'; then $(CYGPATH_W) 'nutdrv_qx_blazer-common.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_blazer-common.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_blazer-common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_blazer-common.c' object='nutdrv_qx-nutdrv_qx_blazer-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_blazer-common.obj `if test -f 'nutdrv_qx_blazer-common.c'; then $(CYGPATH_W) 'nutdrv_qx_blazer-common.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_blazer-common.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_blazer-common.obj `if test -f 'nutdrv_qx_blazer-common.c'; then $(CYGPATH_W) 'nutdrv_qx_blazer-common.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_blazer-common.c'; fi` nutdrv_qx-nutdrv_qx_mecer.o: nutdrv_qx_mecer.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mecer.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo -c -o nutdrv_qx-nutdrv_qx_mecer.o `test -f 'nutdrv_qx_mecer.c' || echo '$(srcdir)/'`nutdrv_qx_mecer.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mecer.c' object='nutdrv_qx-nutdrv_qx_mecer.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mecer.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo -c -o nutdrv_qx-nutdrv_qx_mecer.o `test -f 'nutdrv_qx_mecer.c' || echo '$(srcdir)/'`nutdrv_qx_mecer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_mecer.c' object='nutdrv_qx-nutdrv_qx_mecer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mecer.o `test -f 'nutdrv_qx_mecer.c' || echo '$(srcdir)/'`nutdrv_qx_mecer.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mecer.o `test -f 'nutdrv_qx_mecer.c' || echo '$(srcdir)/'`nutdrv_qx_mecer.c nutdrv_qx-nutdrv_qx_mecer.obj: nutdrv_qx_mecer.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mecer.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo -c -o nutdrv_qx-nutdrv_qx_mecer.obj `if test -f 'nutdrv_qx_mecer.c'; then $(CYGPATH_W) 'nutdrv_qx_mecer.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mecer.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mecer.c' object='nutdrv_qx-nutdrv_qx_mecer.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mecer.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo -c -o nutdrv_qx-nutdrv_qx_mecer.obj `if test -f 'nutdrv_qx_mecer.c'; then $(CYGPATH_W) 'nutdrv_qx_mecer.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mecer.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mecer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_mecer.c' object='nutdrv_qx-nutdrv_qx_mecer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mecer.obj `if test -f 'nutdrv_qx_mecer.c'; then $(CYGPATH_W) 'nutdrv_qx_mecer.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mecer.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mecer.obj `if test -f 'nutdrv_qx_mecer.c'; then $(CYGPATH_W) 'nutdrv_qx_mecer.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mecer.c'; fi` nutdrv_qx-nutdrv_qx_megatec.o: nutdrv_qx_megatec.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec.o `test -f 'nutdrv_qx_megatec.c' || echo '$(srcdir)/'`nutdrv_qx_megatec.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec.c' object='nutdrv_qx-nutdrv_qx_megatec.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec.o `test -f 'nutdrv_qx_megatec.c' || echo '$(srcdir)/'`nutdrv_qx_megatec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_megatec.c' object='nutdrv_qx-nutdrv_qx_megatec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec.o `test -f 'nutdrv_qx_megatec.c' || echo '$(srcdir)/'`nutdrv_qx_megatec.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec.o `test -f 'nutdrv_qx_megatec.c' || echo '$(srcdir)/'`nutdrv_qx_megatec.c nutdrv_qx-nutdrv_qx_megatec.obj: nutdrv_qx_megatec.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec.obj `if test -f 'nutdrv_qx_megatec.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec.c' object='nutdrv_qx-nutdrv_qx_megatec.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec.obj `if test -f 'nutdrv_qx_megatec.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_megatec.c' object='nutdrv_qx-nutdrv_qx_megatec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec.obj `if test -f 'nutdrv_qx_megatec.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec.obj `if test -f 'nutdrv_qx_megatec.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec.c'; fi` nutdrv_qx-nutdrv_qx_megatec-old.o: nutdrv_qx_megatec-old.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec-old.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec-old.o `test -f 'nutdrv_qx_megatec-old.c' || echo '$(srcdir)/'`nutdrv_qx_megatec-old.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec-old.c' object='nutdrv_qx-nutdrv_qx_megatec-old.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec-old.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec-old.o `test -f 'nutdrv_qx_megatec-old.c' || echo '$(srcdir)/'`nutdrv_qx_megatec-old.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_megatec-old.c' object='nutdrv_qx-nutdrv_qx_megatec-old.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec-old.o `test -f 'nutdrv_qx_megatec-old.c' || echo '$(srcdir)/'`nutdrv_qx_megatec-old.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec-old.o `test -f 'nutdrv_qx_megatec-old.c' || echo '$(srcdir)/'`nutdrv_qx_megatec-old.c nutdrv_qx-nutdrv_qx_megatec-old.obj: nutdrv_qx_megatec-old.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec-old.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec-old.obj `if test -f 'nutdrv_qx_megatec-old.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec-old.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec-old.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_megatec-old.c' object='nutdrv_qx-nutdrv_qx_megatec-old.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_megatec-old.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo -c -o nutdrv_qx-nutdrv_qx_megatec-old.obj `if test -f 'nutdrv_qx_megatec-old.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec-old.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec-old.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_megatec-old.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_megatec-old.c' object='nutdrv_qx-nutdrv_qx_megatec-old.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec-old.obj `if test -f 'nutdrv_qx_megatec-old.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec-old.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec-old.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_megatec-old.obj `if test -f 'nutdrv_qx_megatec-old.c'; then $(CYGPATH_W) 'nutdrv_qx_megatec-old.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_megatec-old.c'; fi` nutdrv_qx-nutdrv_qx_mustek.o: nutdrv_qx_mustek.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mustek.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo -c -o nutdrv_qx-nutdrv_qx_mustek.o `test -f 'nutdrv_qx_mustek.c' || echo '$(srcdir)/'`nutdrv_qx_mustek.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mustek.c' object='nutdrv_qx-nutdrv_qx_mustek.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mustek.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo -c -o nutdrv_qx-nutdrv_qx_mustek.o `test -f 'nutdrv_qx_mustek.c' || echo '$(srcdir)/'`nutdrv_qx_mustek.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_mustek.c' object='nutdrv_qx-nutdrv_qx_mustek.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mustek.o `test -f 'nutdrv_qx_mustek.c' || echo '$(srcdir)/'`nutdrv_qx_mustek.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mustek.o `test -f 'nutdrv_qx_mustek.c' || echo '$(srcdir)/'`nutdrv_qx_mustek.c nutdrv_qx-nutdrv_qx_mustek.obj: nutdrv_qx_mustek.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mustek.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo -c -o nutdrv_qx-nutdrv_qx_mustek.obj `if test -f 'nutdrv_qx_mustek.c'; then $(CYGPATH_W) 'nutdrv_qx_mustek.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mustek.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_mustek.c' object='nutdrv_qx-nutdrv_qx_mustek.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_mustek.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo -c -o nutdrv_qx-nutdrv_qx_mustek.obj `if test -f 'nutdrv_qx_mustek.c'; then $(CYGPATH_W) 'nutdrv_qx_mustek.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mustek.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_mustek.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_mustek.c' object='nutdrv_qx-nutdrv_qx_mustek.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mustek.obj `if test -f 'nutdrv_qx_mustek.c'; then $(CYGPATH_W) 'nutdrv_qx_mustek.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mustek.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_mustek.obj `if test -f 'nutdrv_qx_mustek.c'; then $(CYGPATH_W) 'nutdrv_qx_mustek.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_mustek.c'; fi` nutdrv_qx-nutdrv_qx_q1.o: nutdrv_qx_q1.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_q1.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo -c -o nutdrv_qx-nutdrv_qx_q1.o `test -f 'nutdrv_qx_q1.c' || echo '$(srcdir)/'`nutdrv_qx_q1.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_q1.c' object='nutdrv_qx-nutdrv_qx_q1.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_q1.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo -c -o nutdrv_qx-nutdrv_qx_q1.o `test -f 'nutdrv_qx_q1.c' || echo '$(srcdir)/'`nutdrv_qx_q1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_q1.c' object='nutdrv_qx-nutdrv_qx_q1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_q1.o `test -f 'nutdrv_qx_q1.c' || echo '$(srcdir)/'`nutdrv_qx_q1.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_q1.o `test -f 'nutdrv_qx_q1.c' || echo '$(srcdir)/'`nutdrv_qx_q1.c nutdrv_qx-nutdrv_qx_q1.obj: nutdrv_qx_q1.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_q1.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo -c -o nutdrv_qx-nutdrv_qx_q1.obj `if test -f 'nutdrv_qx_q1.c'; then $(CYGPATH_W) 'nutdrv_qx_q1.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_q1.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_q1.c' object='nutdrv_qx-nutdrv_qx_q1.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_q1.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo -c -o nutdrv_qx-nutdrv_qx_q1.obj `if test -f 'nutdrv_qx_q1.c'; then $(CYGPATH_W) 'nutdrv_qx_q1.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_q1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_q1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_q1.c' object='nutdrv_qx-nutdrv_qx_q1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_q1.obj `if test -f 'nutdrv_qx_q1.c'; then $(CYGPATH_W) 'nutdrv_qx_q1.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_q1.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_q1.obj `if test -f 'nutdrv_qx_q1.c'; then $(CYGPATH_W) 'nutdrv_qx_q1.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_q1.c'; fi` nutdrv_qx-nutdrv_qx_voltronic.o: nutdrv_qx_voltronic.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic.o `test -f 'nutdrv_qx_voltronic.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic.c' object='nutdrv_qx-nutdrv_qx_voltronic.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic.o `test -f 'nutdrv_qx_voltronic.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_voltronic.c' object='nutdrv_qx-nutdrv_qx_voltronic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic.o `test -f 'nutdrv_qx_voltronic.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic.o `test -f 'nutdrv_qx_voltronic.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic.c nutdrv_qx-nutdrv_qx_voltronic.obj: nutdrv_qx_voltronic.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic.obj `if test -f 'nutdrv_qx_voltronic.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic.c' object='nutdrv_qx-nutdrv_qx_voltronic.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic.obj `if test -f 'nutdrv_qx_voltronic.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_voltronic.c' object='nutdrv_qx-nutdrv_qx_voltronic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic.obj `if test -f 'nutdrv_qx_voltronic.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic.obj `if test -f 'nutdrv_qx_voltronic.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic.c'; fi` nutdrv_qx-nutdrv_qx_voltronic-qs.o: nutdrv_qx_voltronic-qs.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.o `test -f 'nutdrv_qx_voltronic-qs.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic-qs.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.o `test -f 'nutdrv_qx_voltronic-qs.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_voltronic-qs.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.o `test -f 'nutdrv_qx_voltronic-qs.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.o `test -f 'nutdrv_qx_voltronic-qs.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs.c nutdrv_qx-nutdrv_qx_voltronic-qs.obj: nutdrv_qx_voltronic-qs.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.obj `if test -f 'nutdrv_qx_voltronic-qs.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_voltronic-qs.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.obj `if test -f 'nutdrv_qx_voltronic-qs.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_voltronic-qs.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.obj `if test -f 'nutdrv_qx_voltronic-qs.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs.obj `if test -f 'nutdrv_qx_voltronic-qs.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs.c'; fi` + +nutdrv_qx-nutdrv_qx_voltronic-qs-hex.o: nutdrv_qx_voltronic-qs-hex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs-hex.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs-hex.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs-hex.o `test -f 'nutdrv_qx_voltronic-qs-hex.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs-hex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs-hex.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs-hex.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_voltronic-qs-hex.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs-hex.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs-hex.o `test -f 'nutdrv_qx_voltronic-qs-hex.c' || echo '$(srcdir)/'`nutdrv_qx_voltronic-qs-hex.c + +nutdrv_qx-nutdrv_qx_voltronic-qs-hex.obj: nutdrv_qx_voltronic-qs-hex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_voltronic-qs-hex.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs-hex.Tpo -c -o nutdrv_qx-nutdrv_qx_voltronic-qs-hex.obj `if test -f 'nutdrv_qx_voltronic-qs-hex.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs-hex.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs-hex.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs-hex.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_voltronic-qs-hex.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_voltronic-qs-hex.c' object='nutdrv_qx-nutdrv_qx_voltronic-qs-hex.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_voltronic-qs-hex.obj `if test -f 'nutdrv_qx_voltronic-qs-hex.c'; then $(CYGPATH_W) 'nutdrv_qx_voltronic-qs-hex.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_voltronic-qs-hex.c'; fi` nutdrv_qx-nutdrv_qx_zinto.o: nutdrv_qx_zinto.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_zinto.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo -c -o nutdrv_qx-nutdrv_qx_zinto.o `test -f 'nutdrv_qx_zinto.c' || echo '$(srcdir)/'`nutdrv_qx_zinto.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_zinto.c' object='nutdrv_qx-nutdrv_qx_zinto.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_zinto.o -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo -c -o nutdrv_qx-nutdrv_qx_zinto.o `test -f 'nutdrv_qx_zinto.c' || echo '$(srcdir)/'`nutdrv_qx_zinto.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_zinto.c' object='nutdrv_qx-nutdrv_qx_zinto.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_zinto.o `test -f 'nutdrv_qx_zinto.c' || echo '$(srcdir)/'`nutdrv_qx_zinto.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_zinto.o `test -f 'nutdrv_qx_zinto.c' || echo '$(srcdir)/'`nutdrv_qx_zinto.c nutdrv_qx-nutdrv_qx_zinto.obj: nutdrv_qx_zinto.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_zinto.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo -c -o nutdrv_qx-nutdrv_qx_zinto.obj `if test -f 'nutdrv_qx_zinto.c'; then $(CYGPATH_W) 'nutdrv_qx_zinto.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_zinto.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutdrv_qx_zinto.c' object='nutdrv_qx-nutdrv_qx_zinto.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -MT nutdrv_qx-nutdrv_qx_zinto.obj -MD -MP -MF $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo -c -o nutdrv_qx-nutdrv_qx_zinto.obj `if test -f 'nutdrv_qx_zinto.c'; then $(CYGPATH_W) 'nutdrv_qx_zinto.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_zinto.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Tpo $(DEPDIR)/nutdrv_qx-nutdrv_qx_zinto.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutdrv_qx_zinto.c' object='nutdrv_qx-nutdrv_qx_zinto.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_zinto.obj `if test -f 'nutdrv_qx_zinto.c'; then $(CYGPATH_W) 'nutdrv_qx_zinto.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_zinto.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nutdrv_qx_CFLAGS) $(CFLAGS) -c -o nutdrv_qx-nutdrv_qx_zinto.obj `if test -f 'nutdrv_qx_zinto.c'; then $(CYGPATH_W) 'nutdrv_qx_zinto.c'; else $(CYGPATH_W) '$(srcdir)/nutdrv_qx_zinto.c'; fi` mostlyclean-libtool: -rm -f *.lo @@ -1569,26 +1766,15 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -1600,15 +1786,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -1617,6 +1799,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -1761,21 +1958,21 @@ uninstall-am: uninstall-driverexecPROGRAMS uninstall-sbinPROGRAMS .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-driverexecPROGRAMS clean-generic clean-libtool \ - clean-sbinPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-driverexecPROGRAMS \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-sbinPROGRAMS install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-driverexecPROGRAMS \ - uninstall-sbinPROGRAMS + clean-sbinPROGRAMS cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-driverexecPROGRAMS install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-driverexecPROGRAMS uninstall-sbinPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/drivers/apc-hid.c b/drivers/apc-hid.c index 1d85621..34601d5 100644 --- a/drivers/apc-hid.c +++ b/drivers/apc-hid.c @@ -79,6 +79,8 @@ static void *general_apc_check(USBDevice_t *device) /* USB IDs device table */ static usb_device_id_t apc_usb_device_table[] = { + /* APC AP9584 Serial->USB kit */ + { USB_DEVICE(APC_VENDORID, 0x0000), NULL }, /* various models */ { USB_DEVICE(APC_VENDORID, 0x0002), general_apc_check }, /* various 5G models */ diff --git a/drivers/apcsmart.c b/drivers/apcsmart.c index 018b29d..d437467 100644 --- a/drivers/apcsmart.c +++ b/drivers/apcsmart.c @@ -1004,7 +1004,7 @@ static void apc_getcaps(int qco) /* make sure setvar knows what this is */ vt->flags |= APC_RW | APC_ENUM; - } else if (vt->flags & APC_PACK) + } else if (vt && (vt->flags & APC_PACK)) /* * Currently we assume - basing on the following * feedback: @@ -1208,7 +1208,7 @@ static int getbaseinfo(void) { unsigned int i; int ret, qco; - char *cmds, temp[APC_LBUF]; + char *cmds, *tail, temp[APC_LBUF]; /* * try firmware lookup first; we could start with 'a', but older models @@ -1243,9 +1243,16 @@ static int getbaseinfo(void) /* * returned set is verified for validity above, so just extract * what's interesting for us + * + * the known format is: + * ver.alerts.commands[.stuff] */ - cmds = strrchr(temp, '.'); - for (i = 1; i < strlen(cmds); i++) + cmds = strchr(temp, '.'); + cmds = strchr(cmds + 1, '.'); + tail = strchr(++cmds, '.'); + if (tail) + *tail = 0; + for (i = 0; i < strlen(cmds); i++) protocol_verify(cmds[i]); deprecate_vars(); @@ -1691,7 +1698,7 @@ static int setvar_enum(apc_vartab_t *vt, const char *val) return STAT_SET_HANDLED; /* FUTURE: no change */ } - for (i = 0; i < 6; i++) { + for (i = 0; i < 32; i++) { if (apc_write(APC_NEXTVAL) != 1) return STAT_SET_FAILED; diff --git a/drivers/apcsmart.h b/drivers/apcsmart.h index c0155db..8bfc914 100644 --- a/drivers/apcsmart.h +++ b/drivers/apcsmart.h @@ -143,7 +143,7 @@ #define APC_GOSMART 'Y' #define APC_GODUMB 'R' #define APC_CMDSET 'a' -#define APC_CMDSET_FMT "^[0-9]\\.[^.]*\\.[^.]+$" +#define APC_CMDSET_FMT "^[0-9]\\.[^.]*\\.[^.]+(\\.[^.]+)?$" #define APC_CAPS '\032' /* ^Z */ #define APC_NEXTVAL '-' #define APC_FW_OLD 'V' diff --git a/drivers/asem.c b/drivers/asem.c new file mode 100644 index 0000000..d5d6ea5 --- /dev/null +++ b/drivers/asem.c @@ -0,0 +1,373 @@ +/* asem.c - driver for ASEM PB 1300 hardware, accessible through i2c. + + Copyright (C) 2014 Giuseppe Corbelli + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ASEM SPA contributed with support and documentation. + Copan Italia SPA funded the development. + + There are 2 versions of the charger. Older one is based on Max1667, + newer one is a custom solution. Both are on address 0x09. + To be compatible with both versions just read bit 15 of address 0x13 + to have online/on battery status. + Battery monitor is a BQ2060 at address 0x0B. + + Beware that the SystemIO memory used by the i2c controller is reserved by ACPI. + On Linux, as of 3.5.x kernel only a native driver (i2c_i801) is available, + so you need to boot with acpi_enforce_resources=lax option. +*/ + +/* Depends on i2c-dev.h, Linux only */ +#include +#include +#include +#include + +#include "main.h" + +#ifndef __STR__ +# define __STR__(x) #x +#endif +#ifndef __XSTR__ +# define __XSTR__(x) __STR__(x) +#endif + +#define DRIVER_NAME "ASEM" +#define DRIVER_VERSION "0.10" + +/* Valid on ASEM PB1300 UPS */ +#define BQ2060_ADDRESS 0x0B +#define CHARGER_ADDRESS 0x09 + +#define CMD_DEVICENAME 0x21 + +#define LOW_BATTERY_THRESHOLD 25 +#define HIGH_BATTERY_THRESHOLD 75 + +#define ACCESS_DEVICE(fd, address) \ + if (ioctl(fd, I2C_SLAVE, address) < 0) { \ + fatal_with_errno(EXIT_FAILURE, "Failed to acquire bus access and/or talk to slave 0x%02X", address); \ + } + +static unsigned long lb_threshold = LOW_BATTERY_THRESHOLD; +static unsigned long hb_threshold = HIGH_BATTERY_THRESHOLD; + +static char *valid_devicename_data[] = { + "ASEM SPA", + NULL +}; + +upsdrv_info_t upsdrv_info = { + DRIVER_NAME, + DRIVER_VERSION, + "Giuseppe Corbelli ", + DRV_EXPERIMENTAL, + {NULL} +}; + +void upsdrv_initinfo(void) +{ + __s32 i2c_status; + __u8 buffer[10]; + unsigned short year, month, day; + + ACCESS_DEVICE(upsfd, BQ2060_ADDRESS); + + /* Set capacity mode in mA(h) */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x03); + if (i2c_status == -1) { + fatal_with_errno(EXIT_FAILURE, "Could not read BatteryMode word data"); + } + /* Clear 15th bit */ + i2c_status = i2c_smbus_write_word_data(upsfd, 0x03, i2c_status & ~0x8000); + if (i2c_status == -1) { + fatal_with_errno(EXIT_FAILURE, "Could not set BatteryMode word data"); + } + + /* Device name */ + memset(buffer, 0, 10); + i2c_status = i2c_smbus_read_block_data(upsfd, 0x21, buffer); + if (i2c_status == -1) { + fatal_with_errno(EXIT_FAILURE, "Could not read DeviceName block data"); + } + upsdebugx(1, "UPS model %s", (char *) buffer); + dstate_setinfo("ups.model", "%s", (char *) buffer); + + /* Manufacturing date */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x1B); + if (i2c_status == -1) { + fatal_with_errno(EXIT_FAILURE, "Could not read ManufactureDate word data"); + } + /* (Year - 1980) * 512 */ + year = (i2c_status >> 9) & 0x000000FF; + /* Month * 32 */ + month = (i2c_status >> 4) & 0x0000001F; + day = i2c_status & 0x0000001F; + upsdebugx(1, "UPS manufacturing date %d-%02d-%02d (%d)", year + 1980, month, day, i2c_status); + dstate_setinfo("ups.mfr.date", "%d-%02d-%02d", year + 1980, month, day); + + /* Device chemistry */ + memset(buffer, 0, 10); + i2c_status = i2c_smbus_read_block_data(upsfd, 0x22, buffer); + if (i2c_status == -1) { + fatal_with_errno(EXIT_FAILURE, "Could not read DeviceChemistry block data"); + } + upsdebugx(1, "Battery chemistry %s", (char *) buffer); + dstate_setinfo("battery.type", "%s", (char *) buffer); + + /* Serial number */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x1C); + if (i2c_status == -1) { + fatal_with_errno(EXIT_FAILURE, "Could not read SerialNumber block data"); + } + upsdebugx(1, "Serial Number %d", i2c_status); + dstate_setinfo("ups.serial", "%d", i2c_status); +} + +void upsdrv_updateinfo(void) +{ + static char online; + static char discharging; + static char fully_charged; + static unsigned short charge_percentage; + static unsigned short voltage; + static unsigned short capacity; + static signed short current; + static __s32 i2c_status; + static __s32 temperature; + static __s32 runtime_to_empty; + + ACCESS_DEVICE(upsfd, CHARGER_ADDRESS); + /* Charger only supplies online/offline status */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x13); + if (i2c_status == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read charger status word at address 0x13"); + return; + } + online = (i2c_status & 0x8000) != 0; + upsdebugx(3, "Charger status 0x%02X, online %d", i2c_status, online); + + ACCESS_DEVICE(upsfd, BQ2060_ADDRESS); + i2c_status = i2c_smbus_read_word_data(upsfd, 0x16); + if (i2c_status == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read bq2060 status word at address 0x16"); + return; + } + upsdebugx(3, "bq2060 status 0x04%X", i2c_status); + /* Busy, leave data as stale, try next time */ + if (i2c_status & 0x0001) { + dstate_datastale(); + upslogx(LOG_NOTICE, "bq2060 is busy"); + return; + } + /* Error, leave data as stale, try next time */ + if (i2c_status & 0x000F) { + dstate_datastale(); + upslogx(LOG_WARNING, "bq2060 returned error code 0x%02X", i2c_status & 0x000F); + return; + } + + discharging = (i2c_status & 0x0040); + fully_charged = (i2c_status & 0x0020); + + /* Charge percentage */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x0D); + if (i2c_status == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read charge percentage from bq2060 at address 0x0D"); + return; + } + charge_percentage = i2c_status & 0xFFFF; + upsdebugx(3, "Charge percentage %03d", charge_percentage); + + /* Battery voltage in mV */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x09); + if (i2c_status == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read voltage from bq2060 at address 0x09"); + return; + } + voltage = i2c_status & 0x0000FFFF; + upsdebugx(3, "Battery voltage %d mV", voltage); + + /* Temperature in °K */ + temperature = i2c_smbus_read_word_data(upsfd, 0x08); + if (temperature == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read temperature from bq2060 at address 0x08"); + return; + } + upsdebugx(3, "Temperature %4.1f K", temperature / 10.0); + + /* Current load in mA, positive for charge, negative for discharge */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x0A); + if (i2c_status == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read current from bq2060 at address 0x0A"); + return; + } + current = i2c_status & 0x0000FFFF; + upsdebugx(3, "Current %d mA", current); + + /* Current capacity */ + i2c_status = i2c_smbus_read_word_data(upsfd, 0x0F); + if (i2c_status == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read RemainingCapacity word data"); + return; + } + capacity = i2c_status & 0x0000FFFF; + upsdebugx(3, "Current capacity %d mAh", capacity); + + /* Expected runtime capacity, averaged by gauge */ + runtime_to_empty = i2c_smbus_read_word_data(upsfd, 0x12); + if (runtime_to_empty == -1) { + dstate_datastale(); + upslogx(LOG_ERR, "Could not read AverageTimeToEmpty word data"); + return; + } + upsdebugx(3, "Expected run-time to empty %d m", runtime_to_empty); + + status_init(); + status_set(online ? "OL" : "OB"); + if (!discharging & !fully_charged) + status_set("CHRG"); + else if (discharging && current < 0) + status_set("DISCHRG"); + + if (charge_percentage >= hb_threshold) + status_set("HB"); + else if (charge_percentage <= lb_threshold) + status_set("LB"); + + /* In V */ + dstate_setinfo("battery.voltage", "%2.3f", voltage / 1000.0); + /* In mAh */ + dstate_setinfo("battery.current", "%2.3f", current / 1000.0); + dstate_setinfo("battery.charge", "%d", charge_percentage); + /* In mAh */ + dstate_setinfo("battery.capacity", "%2.3f", capacity / 1000.0); + /* In °C */ + dstate_setinfo("ups.temperature", "%4.1f", (temperature / 10.0) - 273.15); + /* In seconds */ + dstate_setinfo("battery.runtime", "%d", runtime_to_empty * 60); + status_commit(); + dstate_dataok(); +} + +void upsdrv_shutdown(void) +{ + /* tell the UPS to shut down, then return - DO NOT SLEEP HERE */ + + /* maybe try to detect the UPS here, but try a shutdown even if + it doesn't respond at first if possible */ + + /* replace with a proper shutdown function */ + fatalx(EXIT_FAILURE, "shutdown not supported"); + + /* you may have to check the line status since the commands + for toggling power are frequently different for OL vs. OB */ + + /* OL: this must power cycle the load if possible */ + + /* OB: the load must remain off until the power returns */ +} + +void upsdrv_help(void) +{ + /* Redundant */ + printf("\nASEM options\n"); + printf(" HIGH/low battery thresholds\n"); + printf(" lb = " __XSTR__(LOW_BATTERY_THRESHOLD) " (battery is low under this level)\n"); + printf(" hb = " __XSTR__(HIGH_BATTERY_THRESHOLD) " (battery is high above this level)\n"); +} + +/* list flags and values that you want to receive via -x */ +void upsdrv_makevartable(void) +{ + addvar(VAR_VALUE, "lb", "Low battery threshold, default " __XSTR__(LOW_BATTERY_THRESHOLD)); + addvar(VAR_VALUE, "hb", "High battery threshold, default " __XSTR__(HIGH_BATTERY_THRESHOLD)); +} + +void upsdrv_initups(void) +{ + __s32 i2c_status; + __u8 DeviceName_buffer[10]; + unsigned int i; + unsigned long x; + char *DeviceName; + char *option; + + upsfd = open(device_path, O_RDWR); + if (upsfd < 0) { + fatal_with_errno(EXIT_FAILURE, "Could not open device port '%s'", device_path); + } + + ACCESS_DEVICE(upsfd, BQ2060_ADDRESS); + + /* Get ManufacturerName */ + memset(DeviceName_buffer, 0, 10); + i2c_status = i2c_smbus_read_block_data(upsfd, 0x20, DeviceName_buffer); + if (i2c_status == -1) { + fatal_with_errno(EXIT_FAILURE, "Could not read DeviceName block data"); + } + i = 0; + while ( (DeviceName = valid_devicename_data[i++]) ) { + if (0 == memcmp(DeviceName, DeviceName_buffer, i2c_status)) + break; + } + if (!DeviceName) { + fatal_with_errno(EXIT_FAILURE, "Device '%s' unknown", (char *) DeviceName_buffer); + } + upsdebugx(1, "Found device '%s' on port '%s'", (char *) DeviceName, device_path); + dstate_setinfo("ups.mfr", "%s", (char *) DeviceName); + + option = getval("lb"); + if (option) { + x = strtoul(option, NULL, 0); + if ((x == 0) && (errno != 0)) { + upslogx(LOG_WARNING, "Invalid value specified for low battery threshold: '%s'", option); + } else { + lb_threshold = x; + } + } + option = getval("hb"); + if (option) { + x = strtoul(option, NULL, 0); + if ((x == 0) && (errno != 0)) { + upslogx(LOG_WARNING, "Invalid value specified for high battery threshold: '%s'", option); + } else if ((x < 1) || (x > 100)) { + upslogx(LOG_WARNING, "Invalid value specified for high battery threshold: '%s' (must be 1 < hb <= 100)", option); + } else { + hb_threshold = x; + } + } + /* Invalid values specified */ + if (lb_threshold > hb_threshold) { + upslogx(LOG_WARNING, "lb > hb specified in options. Returning to defaults."); + lb_threshold = LOW_BATTERY_THRESHOLD; + hb_threshold = HIGH_BATTERY_THRESHOLD; + } + + upslogx(LOG_NOTICE, "High battery threshold is %lu, low battery threshold is %lu", lb_threshold, hb_threshold); +} + +void upsdrv_cleanup(void) +{ + close(upsfd); +} diff --git a/drivers/bcmxcp.c b/drivers/bcmxcp.c index ad3c5eb..98553c1 100644 --- a/drivers/bcmxcp.c +++ b/drivers/bcmxcp.c @@ -9,7 +9,7 @@ Copyright (C) 2004 Kjell Claesson 2004 Tore Ørpetveit - 2011 - 2012 Arnaud Quette + 2011 - 2015 Arnaud Quette Thanks to Tore Ørpetveit that sent me the manuals for bcm/xcp. @@ -22,7 +22,7 @@ ojw0000 2007Apr5 Oliver Wilcock - modified to control individual load segments (outlet.2.shutdown.return) on Powerware PW5125. Modified to support setvar for outlet.n.delay.start by Rich Wrenn (RFW) 9-3-11. - Modified to support setvar for outlet.n.delay.shutdown by Arnaud Quette, 9-12-11 + Modified to support setvar for outlet.n.delay.shutdown by Arnaud Quette, 9-12-11 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 @@ -40,72 +40,72 @@ This program is free software; you can redistribute it and/or modify TODO List: - Extend the parsing of the Standard ID Block, to read: + Extend the parsing of the Standard ID Block, to read: - Config Block Length: (High priority) - Give information if config block is - present, and how long it is, if it exist. - If config block exist, read the config block and parse the - 'Length of the Extended Limits Configuration Block' for - extended configuration commands + Config Block Length: (High priority) + Give information if config block is + present, and how long it is, if it exist. + If config block exist, read the config block and parse the + 'Length of the Extended Limits Configuration Block' for + extended configuration commands - Statistic map Size: (Low priority) - May be used to se if there is a Statistic Map. - It holds data on the utility power quality for - the past month and since last reset. Number of - times on battery and how long. Up time and utility - frequency deviation. (Only larger ups'es) + Statistic map Size: (Low priority) + May be used to se if there is a Statistic Map. + It holds data on the utility power quality for + the past month and since last reset. Number of + times on battery and how long. Up time and utility + frequency deviation. (Only larger ups'es) - Size of Alarm History Log: (Low priority) - See if it have any alarm history block and enable - command to dump it. + Size of Alarm History Log: (Low priority) + See if it have any alarm history block and enable + command to dump it. - Maximum Supported Command Length: ( Med. to High priority) - Give info about the ups receive buffer size. + Maximum Supported Command Length: ( Med. to High priority) + Give info about the ups receive buffer size. - Size of Alarm Block: ( Med. to High priority) - Make a smarter handling of the Active alarm's if we know the length - of the Active Alarm Block. Don't need the long loop to parse the - alarm's. Maybe use another way to set up the alarm struct in the - 'init_alarm_map'. + Size of Alarm Block: ( Med. to High priority) + Make a smarter handling of the Active alarm's if we know the length + of the Active Alarm Block. Don't need the long loop to parse the + alarm's. Maybe use another way to set up the alarm struct in the + 'init_alarm_map'. - Parse 'Communication Capabilities Block' ( Low priority) - Get info of the connected ports ID, number of baud rates, - command and respnse length. + Parse 'Communication Capabilities Block' ( Low priority) + Get info of the connected ports ID, number of baud rates, + command and respnse length. - Parse 'Communication Port List Block': ( Low priority) - This block gives info about the communication ports. Some ups'es - have multiple comport's, and use one port for eatch load segment. - In this block it is possible to get: - Number of ports. (In this List) - This Comport id (Which Comm Port is reporting this block.) - Comport id (Id for eatch port listed. The first comport ID=1) - Baudrate of the listed port. - Serial config. - Port usage: - What this Comm Port is being used for: - 0 = Unknown usage, No communication occurring. - 1 = Undefined / Unknown communication occurring - 2 = Waiting to communicate with a UPS - 3 = Communication established with a UPS - 4 = Waiting to communicate with software or adapter - 5 = Communication established software (e.g., LanSafe) - or adapter (e.g., ConnectUPS) - 6 = Communicating with a Display Device - 7 = Multi-drop Serial channel - 8 = Communicating with an Outlet Controller - Number of outlets. (Number of Outlets "assigned to" (controlled by) this Comm Port) - Outlet number. (Each assigned Outlet is listed (1-64)) + Parse 'Communication Port List Block': ( Low priority) + This block gives info about the communication ports. Some ups'es + have multiple comport's, and use one port for eatch load segment. + In this block it is possible to get: + Number of ports. (In this List) + This Comport id (Which Comm Port is reporting this block.) + Comport id (Id for eatch port listed. The first comport ID=1) + Baudrate of the listed port. + Serial config. + Port usage: + What this Comm Port is being used for: + 0 = Unknown usage, No communication occurring. + 1 = Undefined / Unknown communication occurring + 2 = Waiting to communicate with a UPS + 3 = Communication established with a UPS + 4 = Waiting to communicate with software or adapter + 5 = Communication established software (e.g., LanSafe) + or adapter (e.g., ConnectUPS) + 6 = Communicating with a Display Device + 7 = Multi-drop Serial channel + 8 = Communicating with an Outlet Controller + Number of outlets. (Number of Outlets "assigned to" (controlled by) this Comm Port) + Outlet number. (Each assigned Outlet is listed (1-64)) - 'Set outlet parameter command (0x97)' to alter the delay - settings or turn the outlet on or off with a delay (0 - 32767 seconds) + 'Set outlet parameter command (0x97)' to alter the delay + settings or turn the outlet on or off with a delay (0 - 32767 seconds) - Rewrite some parts of the driver, to minimise code duplication. (Like the instant commands) + Rewrite some parts of the driver, to minimise code duplication. (Like the instant commands) - Implement support for Password Authorization (XCP spec, §4.3.2) + Implement support for Password Authorization (XCP spec, §4.3.2) - Complete support for settable variables (upsh.setvar) + Complete support for settable variables (upsh.setvar) */ @@ -117,24 +117,26 @@ TODO List: #include "bcmxcp.h" #define DRIVER_NAME "BCMXCP UPS driver" -#define DRIVER_VERSION "0.28" +#define DRIVER_VERSION "0.30" #define MAX_NUT_NAME_LENGTH 128 #define NUT_OUTLET_POSITION 7 /* driver description structure */ upsdrv_info_t upsdrv_info = { - DRIVER_NAME, - DRIVER_VERSION, - "Martin Schroeder \n" \ - "Kjell Claesson \n" \ - "Tore Ørpetveit \n" \ - "Wolfgang Ocker \n" \ - "Oliver Wilcock\n" \ - "Prachi Gandhi \n" \ - "Alf Høgemark ", - DRV_STABLE, - { &comm_upsdrv_info, NULL } + DRIVER_NAME, + DRIVER_VERSION, + "Martin Schroeder \n" \ + "Kjell Claesson \n" \ + "Tore Ørpetveit \n" \ + "Arnaud Quette \n" \ + "Wolfgang Ocker \n" \ + "Oliver Wilcock\n" \ + "Prachi Gandhi \n" \ + "Alf Høgemark \n" \ + "Gavrilov Igor", + DRV_STABLE, + { &comm_upsdrv_info, NULL } }; static int get_word(const unsigned char*); @@ -146,6 +148,7 @@ static void init_alarm_map(void); static bool_t init_command(int size); static void init_config(void); static void init_limit(void); +static void init_ext_vars(void); static void init_topology(void); static void init_ups_meter_map(const unsigned char *map, unsigned char len); static void init_ups_alarm_map(const unsigned char *map, unsigned char len); @@ -156,18 +159,20 @@ static void init_system_test_capabilities(void); static int instcmd(const char *cmdname, const char *extra); static int setvar(const char *varname, const char *val); static int decode_instcmd_exec(const int res, const unsigned char exec_status, const char *cmdname, const char *success_msg); +static int decode_setvar_exec(const int res, const unsigned char exec_status, const char *cmdname, const char *success_msg); static float calculate_ups_load(const unsigned char *data); static const char *nut_find_infoval(info_lkp_t *xcp2info, const double value, const bool_t debug_output_nonexisting); const char *FreqTol[3] = {"+/-2%", "+/-5%", "+/-7"}; -const char *ABMStatus[4] = {"Charging", "Discharging", "Floating", "Resting"}; +const char *ABMStatus[4] = {"charging", "discharging", "floating", "resting"}; +const char *OutletStatus[9] = {"unknown","on/closed","off/open","on with pending","off with pending","unknown","unknown","failed and closed","failed and open"}; /* Standard Authorization Block */ unsigned char AUTHOR[4] = {0xCF, 0x69, 0xE8, 0xD5}; int nphases = 0; int outlet_block_len = 0; const char *cpu_name[5] = {"Cont:", "Inve:", "Rect:", "Netw:", "Disp:"}; - +const char *horn_stat[3] = {"disabled", "enabled", "muted"}; /* Battery test results */ @@ -214,6 +219,8 @@ info_lkp_t command_map_info[] = { { PW_INIT_BAT_TEST, "test.battery.start", NULL }, { PW_LOAD_OFF_RESTART, "shutdown.return", NULL }, { PW_UPS_OFF, "shutdown.stayoff", NULL }, + { PW_UPS_ON, "load.on", NULL}, + { PW_GO_TO_BYPASS, "bypass.start", NULL}, { 0, NULL, NULL } }; @@ -1003,7 +1010,8 @@ int init_outlet(unsigned char len) outlet_state = answer[iIndex++]; upsdebugx(2, "Outlet state: %d", outlet_state); snprintf(outlet_name, sizeof(outlet_name)-1, "outlet.%d.status", num); - dstate_setinfo(outlet_name, "%s", (outlet_state & 0x01 ? "On" : "Off")); + if (outlet_state>0 && outlet_state <9 ) + dstate_setinfo(outlet_name, "%s", OutletStatus[outlet_state] ); auto_dly_off = get_word(answer+iIndex); iIndex += 2; @@ -1025,10 +1033,91 @@ int init_outlet(unsigned char len) return num_outlet; } +void init_ext_vars(void) +{ + unsigned char answer[PW_ANSWER_MAX_SIZE],cbuf[5]; + int length=0,index=0; + + send_write_command(AUTHOR, 4); + + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + cbuf[0] = PW_SET_CONF_COMMAND; + cbuf[1] = PW_CONF_REQ; + cbuf[2] = 0x0; + cbuf[3] = 0x0; + + length=command_write_sequence(cbuf,4,answer); + if (length <= 0) + fatal_with_errno(EXIT_FAILURE, "Could not communicate with the ups"); + if (length < 4) //UPS dont have configurable vars + return; + for( index=3; index < length; index++) { + switch(answer[index]){ + case PW_CONF_LOW_DEV_LIMIT: dstate_setinfo("input.transfer.boost.high","%d",0); + dstate_setflags("input.transfer.boost.high", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("input.transfer.boost.high", 3); + break; + + case PW_CONF_HIGH_DEV_LIMIT: dstate_setinfo("input.transfer.trim.low","%d",0); + dstate_setflags("input.transfer.trim.low", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("input.transfer.trim.low", 3); + break; + + case PW_CONF_LOW_BATT: dstate_setinfo("battery.runtime.low","%d",0); + dstate_setflags("battery.runtime.low", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("battery.runtime.low", 2); + break; + + case PW_CONF_BEEPER: dstate_addcmd("beeper.disable"); + dstate_addcmd("beeper.enable"); + dstate_addcmd("beeper.mute"); + break; + + case PW_CONF_RETURN_DELAY: dstate_setinfo("input.transfer.delay","%d",0); + dstate_setflags("input.transfer.delay", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("input.transfer.delay", 5); + break; + + case PW_CONF_RETURN_CAP: dstate_setinfo("battery.charge.restart","%d",0); + dstate_setflags("battery.charge.restart", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("battery.charge.restart", 3); + break; + + case PW_CONF_MAX_TEMP: dstate_setinfo("ambient.temperature.high","%d",0); + dstate_setflags("ambient.temperature.high", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("ambient.temperature.high", 3); + break; + + case PW_CONF_NOMINAL_OUT_VOLTAGE: dstate_setinfo("output.voltage.nominal","%d",0); + dstate_setflags("output.voltage.nominal", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("output.voltage.nominal", 3); + break; + + case PW_CONF_SLEEP_TH_LOAD: dstate_setinfo("battery.energysave.load","%d",0); + dstate_setflags("battery.energysave.load", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("battery.energysave.load", 3); + break; + + case PW_CONF_SLEEP_DELAY: dstate_setinfo("battery.energysave.delay","%d",0); + dstate_setflags("battery.energysave.delay", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("battery.energysave.delay", 3); + break; + + case PW_CONF_BATT_STRINGS: dstate_setinfo("battery.packs","%d",0); + dstate_setflags("battery.packs", ST_FLAG_RW | ST_FLAG_STRING); + dstate_setaux("battery.packs", 1); + break; + + } + } +} + + void init_config(void) { unsigned char answer[PW_ANSWER_MAX_SIZE]; - int voltage = 0, frequency = 0, res; + int voltage = 0, frequency = 0, res, tmp=0; char sValue[17]; char sPartNumber[17]; @@ -1049,11 +1138,16 @@ void init_config(void) if (frequency != 0) dstate_setinfo("output.frequency.nominal", "%d", frequency); + /*Number of EBM*/ + tmp = (int) *(answer + BCMXCP_CONFIG_BLOCK_BATTERY_DATA_WORD3); + if (tmp != 0) + dstate_setinfo("battery.packs", "%d", tmp); + /* UPS serial number */ snprintf(sValue, sizeof(sValue), "%s", answer + BCMXCP_CONFIG_BLOCK_SERIAL_NUMBER); if(sValue[0] != '\0') dstate_setinfo("ups.serial", "%s", sValue); - + /* UPS Part Number*/ snprintf(sPartNumber, sizeof(sPartNumber), "%s", answer + BCMXCP_CONFIG_BLOCK_PART_NUMBER); if(sPartNumber[0] != '\0') @@ -1064,7 +1158,6 @@ void init_limit(void) { unsigned char answer[PW_ANSWER_MAX_SIZE]; int value, res; - const char *horn_stat[3] = {"disabled", "enabled", "muted"}; res = command_read_sequence(PW_LIMIT_BLOCK_REQ, answer); if (res <= 0) { @@ -1141,6 +1234,37 @@ void init_limit(void) if (value != 0) { dstate_setinfo("ambient.temperature.high", "%d", value); } + + /*Sleep minimum load*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_SLEEP_TH_LOAD]; + if (value != 0) { + dstate_setinfo("battery.energysave.load", "%d", value); + } + + /* Sleep delay*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_SLEEP_DELAY]; + if (value != 0) { + dstate_setinfo("battery.energysave.delay", "%d", value); + } + + /* Low batt minutes warning*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_LOW_BATT_WARNING]; + if (value != 0) { + dstate_setinfo("battery.runtime.low", "%d", value); + } + + /* Return to mains delay */ + value = get_word(answer + BCMXCP_EXT_LIMITS_BLOCK_RETURN_STAB_DELAY); + if (value != 0) { + dstate_setinfo("input.transfer.delay","%d",value); + } + + /* Minimum return capacity*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_BATT_CAPACITY_RETURN]; + if (value != 0) { + dstate_setinfo("battery.charge.restart","%d",value); + } + } void init_topology(void) @@ -1168,7 +1292,7 @@ void init_system_test_capabilities(void) /* Query what system test capabilities are supported */ send_write_command(AUTHOR, 4); - + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ cbuf[0] = PW_INIT_SYS_TEST; @@ -1322,7 +1446,6 @@ void upsdrv_initinfo(void) /* Size of custom event log, always 0 according to spec */ iIndex += 2; - /* Size of topology block */ topology_block_len = get_word(answer+iIndex); upsdebugx(2, "Length of topology block: %d\n", topology_block_len); @@ -1359,6 +1482,10 @@ void upsdrv_initinfo(void) for(res = 1 ; res <= len ; res++) { snprintf(outlet_name, sizeof(outlet_name)-1, "outlet.%d.shutdown.return", res); dstate_addcmd(outlet_name); + snprintf(outlet_name, sizeof(outlet_name)-1, "outlet.%d.load.on", res); + dstate_addcmd(outlet_name); + snprintf(outlet_name, sizeof(outlet_name)-1, "outlet.%d.load.off", res); + dstate_addcmd(outlet_name); } } @@ -1384,6 +1511,8 @@ void upsdrv_initinfo(void) if (bcmxcp_command_map[PW_INIT_SYS_TEST].command_byte > 0) { init_system_test_capabilities(); } + /* Get information about configurable external variables*/ + init_ext_vars(); upsh.instcmd = instcmd; upsh.setvar = setvar; @@ -1394,7 +1523,7 @@ void upsdrv_updateinfo(void) unsigned char answer[PW_ANSWER_MAX_SIZE]; unsigned char status, topology; char sValue[128]; - int iIndex, res; + int iIndex, res,value; bool_t has_ups_load = FALSE; int batt_status = 0; const char *nutvalue; @@ -1565,7 +1694,7 @@ void upsdrv_updateinfo(void) * 03 0a d7 25 42 0a d7 25 42 00 9a 19 6d 43 cd cc 4c 3e 01 00 01 03 */ upsdebug_hex(2, "Battery Status", answer, res); - batt_status = answer[0]; + batt_status = answer[BCMXCP_BATTDATA_BLOCK_BATT_TEST_STATUS]; if ((nutvalue = nut_find_infoval(batt_test_info, batt_status, TRUE)) != NULL) { dstate_setinfo("ups.test.result", "%s", nutvalue); @@ -1574,8 +1703,125 @@ void upsdrv_updateinfo(void) else { upsdebugx(1, "Failed to extract Battery Status from answer"); } + + /*Extracting internal batteries ABM status*/ + /*Placed first in ABM statuses list. For examples above - on position BCMXCP_BATTDATA_BLOCK_NUMBER_OF_STRINGS (18): + PW5115RM - 0 - no external strings, no status bytes, + so next byte (19) - number of ABM statuses, next (20) - first ABM Status for internal batteries. + + PW9130 - 1 - one external string, so one additional status byte (#19 - 00 - no test run), next(20) - number of ABM statuses, + next (21) - ABM Status for internal batteries. + */ + value=*(answer + BCMXCP_BATTDATA_BLOCK_NUMBER_OF_STRINGS + *(answer + BCMXCP_BATTDATA_BLOCK_NUMBER_OF_STRINGS)*1+2 ); + upsdebugx(2, "ABM Status = %d ",value); + if (value > 0 && value < 5) + dstate_setinfo("battery.charger.status","%s",ABMStatus[value-1]); } + + res = command_read_sequence(PW_LIMIT_BLOCK_REQ, answer); + if (res <= 0) { + upsdebugx(1, "Failed to read EXT LIMITs from UPS"); + } else + { + /* Nominal input voltage */ + value = get_word((answer + BCMXCP_EXT_LIMITS_BLOCK_NOMINAL_INPUT_VOLTAGE)); + + if (value != 0) { + dstate_setinfo("input.voltage.nominal", "%d", value); + } + + /* Bypass Voltage Low Deviation Limit / Transfer to Boost Voltage */ + value = get_word((answer + BCMXCP_EXT_LIMITS_BLOCK_VOLTAGE_LOW_DEV_LIMIT)); + + if (value != 0) { + dstate_setinfo("input.transfer.boost.high", "%d", value); + } + + /* Bypass Voltage High Deviation Limit / Transfer to Buck Voltage */ + value = get_word((answer + BCMXCP_EXT_LIMITS_BLOCK_VOLTAGE_HIGE_DEV_LIMIT)); + + if (value != 0) { + dstate_setinfo("input.transfer.trim.low", "%d", value); + } + + /* Minimum Supported Input Voltage */ + value = get_word((answer + BCMXCP_EXT_LIMITS_BLOCK_MIN_INPUT_VOLTAGE)); + + if (value != 0) { + dstate_setinfo("input.transfer.low", "%d", value); + } + + /* Maximum Supported Input Voltage */ + value = get_word((answer + BCMXCP_EXT_LIMITS_BLOCK_MAX_INPUT_VOLTAGE)); + + if (value != 0) { + dstate_setinfo("input.transfer.high", "%d", value); + } + + /* Horn Status: */ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_HORN_STATUS]; + + if (value >= 0 && value <= 2) { + dstate_setinfo("ups.beeper.status", "%s", horn_stat[value]); + } + /* AAmbient Temperature Upper Alarm Limit */ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_AMBIENT_TEMP_HIGE]; + + if (value != 0) { + dstate_setinfo("ambient.temperature.high", "%d", value); + } + + /*Sleep minimum load*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_SLEEP_TH_LOAD]; + if (value != 0) { + dstate_setinfo("battery.energysave.load", "%d", value); + } + + /* Sleep delay*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_SLEEP_DELAY]; + if (value != 0) { + dstate_setinfo("battery.energysave.delay", "%d", value); + } + + /* Low batt minutes warning*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_LOW_BATT_WARNING]; + if (value != 0) { + dstate_setinfo("battery.runtime.low", "%d", value); + } + + /* Return to mains delay */ + value = get_word(answer + BCMXCP_EXT_LIMITS_BLOCK_RETURN_STAB_DELAY); + if (value != 0) { + dstate_setinfo("input.transfer.delay","%d",value); + } + + /* Minimum return capacity*/ + value = answer[BCMXCP_EXT_LIMITS_BLOCK_BATT_CAPACITY_RETURN]; + if (value != 0) { + dstate_setinfo("battery.charge.restart","%d",value); + } + }; + + res = command_read_sequence(PW_CONFIG_BLOCK_REQ, answer); + if (res <= 0) { + upsdebugx(1, "Failed to read CONF BLOCK from UPS"); + } + else + { + /*Nominal output voltage*/ + value = get_word((answer + BCMXCP_CONFIG_BLOCK_NOMINAL_OUTPUT_VOLTAGE)); + + if (value != 0) + dstate_setinfo("output.voltage.nominal", "%d", value); + /*Number of EBM*/ + value = (int) *(answer + BCMXCP_CONFIG_BLOCK_BATTERY_DATA_WORD3); + if (value != 0) + dstate_setinfo("battery.packs", "%d", value); + + } + + dstate_dataok(); } @@ -1634,41 +1880,14 @@ static int instcmd(const char *cmdname, const char *extra) { unsigned char answer[128], cbuf[6]; char success_msg[40]; + char namebuf[MAX_NUT_NAME_LENGTH]; char varname[32]; const char *varvalue = NULL; - int res, sec; + int res, sec, outlet_num; int sddelay = 0x03; /* outlet off in 3 seconds, by default */ upsdebugx(1, "entering instcmd(%s)", cmdname); - /* ojw0000 outlet power cycle for PW5125 and perhaps others */ - if (!strcasecmp(cmdname, "outlet.1.shutdown.return") - || !strcasecmp(cmdname, "outlet.2.shutdown.return") - || !strcasecmp(cmdname, "outlet.3.shutdown.return") - ) { - send_write_command(AUTHOR, 4); - - sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ - - /* Get the shutdown delay, if any */ - snprintf(varname, sizeof(varname)-1, "outlet.%c.delay.shutdown", cmdname[7]); - if ((varvalue = dstate_getinfo(varname)) != NULL) { - sddelay = atoi(varvalue); - } - - cbuf[0] = PW_LOAD_OFF_RESTART; - cbuf[1] = sddelay & 0xff; - cbuf[2] = sddelay >> 8; /* high byte of the 2 byte time argument */ - cbuf[3] = cmdname[7] - '0'; /* which outlet load segment? Assumes outlet number at position 8 of the command string. */ - - res = command_write_sequence(cbuf, 4, answer); - - sec = (256 * (unsigned char)answer[3]) + (unsigned char)answer[2]; - snprintf(success_msg, sizeof(success_msg)-1, "Going down in %d sec", sec); - - return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, success_msg); - } /* ojw0000 end outlet power cycle */ - if (!strcasecmp(cmdname, "shutdown.return")) { send_write_command(AUTHOR, 4); @@ -1696,6 +1915,26 @@ static int instcmd(const char *cmdname, const char *extra) return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, "Going down NOW"); } + if (!strcasecmp(cmdname, "load.on")) { + send_write_command(AUTHOR, 4); + + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + res = command_read_sequence(PW_UPS_ON, answer); + + return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, "Enabling"); + } + + if (!strcasecmp(cmdname, "bypass.start")) { + send_write_command(AUTHOR, 4); + + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + res = command_read_sequence(PW_GO_TO_BYPASS, answer); + + return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, "Bypass enabled"); + } + /* Note: test result will be parsed from Battery status block, * part of the update loop, and published into ups.test.result */ @@ -1716,11 +1955,11 @@ static int instcmd(const char *cmdname, const char *extra) answer from the test. Or return, as we may lose line power and need to do a shutdown.*/ - } - + } + if (!strcasecmp(cmdname, "test.system.start")) { send_write_command(AUTHOR, 4); - + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ cbuf[0] = PW_INIT_SYS_TEST; @@ -1732,7 +1971,7 @@ static int instcmd(const char *cmdname, const char *extra) if (!strcasecmp(cmdname, "test.panel.start")) { send_write_command(AUTHOR, 4); - + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ cbuf[0] = PW_INIT_SYS_TEST; @@ -1741,6 +1980,93 @@ static int instcmd(const char *cmdname, const char *extra) res = command_write_sequence(cbuf, 3, answer); return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, "Testing panel now"); + } + + if (!strcasecmp(cmdname, "beeper.disable") || !strcasecmp(cmdname, "beeper.enable") || !strcasecmp(cmdname, "beeper.mute")) { + send_write_command(AUTHOR, 4); + + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + cbuf[0] = PW_SET_CONF_COMMAND; + cbuf[1] = PW_CONF_BEEPER; + switch (cmdname[7]){ + + case 'd': + case 'D': { + cbuf[2] = 0x0; /*disable beeper*/ + break; + } + case 'e': + case 'E': { + cbuf[2] = 0x1; /*enable beeper*/ + break; + } + case 'm': + case 'M': { + cbuf[2] = 0x2; + break; /*mute beeper*/ + } + } + cbuf[3] = 0x0; /*padding*/ + + res = command_write_sequence(cbuf, 4, answer); + return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, "Beeper status changed"); + } + + strncpy(namebuf, cmdname, sizeof(namebuf)); + namebuf[NUT_OUTLET_POSITION] = 'n'; /* Assumes a maximum of 9 outlets */ + + if (!strcasecmp(namebuf, "outlet.n.shutdown.return")) { + send_write_command(AUTHOR, 4); + + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + /* Get the shutdown delay, if any */ + snprintf(varname, sizeof(varname)-1, "outlet.%c.delay.shutdown", cmdname[NUT_OUTLET_POSITION]); + if ((varvalue = dstate_getinfo(varname)) != NULL) { + sddelay = atoi(varvalue); + } + + /*if -1 then use global shutdown_delay from ups.conf*/ + if (sddelay == -1) sddelay=bcmxcp_status.shutdowndelay; + + outlet_num = cmdname[NUT_OUTLET_POSITION] - '0'; + if (outlet_num < 1 || outlet_num > 9) + return STAT_INSTCMD_FAILED; + + cbuf[0] = PW_LOAD_OFF_RESTART; + cbuf[1] = sddelay & 0xff; + cbuf[2] = sddelay >> 8; /* high byte of the 2 byte time argument */ + cbuf[3] = outlet_num; /* which outlet load segment? Assumes outlet number at position 8 of the command string. */ + + res = command_write_sequence(cbuf, 4, answer); + + sec = (256 * (unsigned char)answer[3]) + (unsigned char)answer[2]; + snprintf(success_msg, sizeof(success_msg)-1, "Going down in %d sec", sec); + + return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, success_msg); + } + + if (!strcasecmp(namebuf,"outlet.n.load.on") || !strcasecmp(namebuf,"outlet.n.load.off")){ + send_write_command(AUTHOR, 4); + + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + outlet_num = cmdname[NUT_OUTLET_POSITION] - '0'; + if (outlet_num < 1 || outlet_num > 9) + return STAT_INSTCMD_FAILED; + + + cbuf[0] = (cmdname[NUT_OUTLET_POSITION+8] == 'n')?PW_UPS_ON:PW_UPS_OFF; /* Cmd oN or not*/ + cbuf[1] = outlet_num; /* Outlet number */ + + res = command_write_sequence(cbuf, 2, answer); + snprintf(success_msg, sizeof(success_msg)-1, "Outlet %d is %s",outlet_num, (cmdname[NUT_OUTLET_POSITION+8] == 'n')?"On":"Off"); + + return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, success_msg); + + + } upslogx(LOG_NOTICE, "instcmd: unknown command [%s]", cmdname); @@ -1813,99 +2139,337 @@ int setvar (const char *varname, const char *val) { unsigned char answer[128], cbuf[5]; char namebuf[MAX_NUT_NAME_LENGTH]; - int res, sec, outlet_num; + char success_msg[50]; + int res, sec, outlet_num,tmp; int onOff_setting = PW_AUTO_OFF_DELAY; upsdebugx(1, "entering setvar(%s, %s)", varname, val); + if (!strcasecmp(varname, "input.transfer.boost.high")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 460) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_LOW_DEV_LIMIT; + cbuf[2]=tmp&0xff; + cbuf[3]=tmp>>8; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " BOOST threshold volage set to %d V", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + + } + + if (!strcasecmp(varname, "input.transfer.trim.low")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 110 || tmp > 540) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_HIGH_DEV_LIMIT; + cbuf[2]=tmp&0xff; + cbuf[3]=tmp>>8; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " TRIM threshold volage set to %d V", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + } + + if (!strcasecmp(varname, "battery.runtime.low")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 30) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_LOW_BATT; + cbuf[2]=tmp; + cbuf[3]=0x0; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " Low battery warning time set to %d min", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + } + + if (!strcasecmp(varname, "input.transfer.delay")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 1 || tmp > 18000 ) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_RETURN_DELAY; + cbuf[2]=tmp&0xff; + cbuf[3]=tmp>>8; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " Mains return delay set to %d sec", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + } + + if (!strcasecmp(varname, "battery.charge.restart")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 100 ) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_RETURN_CAP; + cbuf[2]=tmp&0xff; + cbuf[3]=0x0; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " Mains return minimum battery capacity set to %d %%", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + } + + + if (!strcasecmp(varname, "ambient.temperature.high")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 100 ) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_MAX_TEMP; + cbuf[2]=tmp&0xff; + cbuf[3]=0x0; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " Maximum temperature set to %d C", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + } + + if (!strcasecmp(varname, "output.voltage.nominal")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 460) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_NOMINAL_OUT_VOLTAGE; + cbuf[2]=tmp&0xff; + cbuf[3]=tmp>>8; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " Nominal output voltage set to %d V", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + } + + if (!strcasecmp(varname, "battery.energysave.load")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 100) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_SLEEP_TH_LOAD; + cbuf[2]=tmp&0xff; + cbuf[3]=0x0; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " Minimum load before sleep countdown set to %d %%", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + + } + + + if (!strcasecmp(varname, "battery.energysave.delay")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 255) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_SLEEP_DELAY; + cbuf[2]=tmp&0xff; + cbuf[3]=0x0; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, " Delay before sleep shutdown set to %d min", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + + } + + if (!strcasecmp(varname, "battery.packs")) { + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + tmp=atoi(val); + if (tmp < 0 || tmp > 5) { + return STAT_SET_INVALID; + } + + cbuf[0]=PW_SET_CONF_COMMAND; + cbuf[1]=PW_CONF_BATT_STRINGS; + cbuf[2]=tmp; + cbuf[3]=0x0; + + res = command_write_sequence(cbuf, 4, answer); + snprintf(success_msg, sizeof(success_msg)-1, "EBM Count set to %d ", tmp); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + + + } + strncpy(namebuf, varname, sizeof(namebuf)); namebuf[NUT_OUTLET_POSITION] = 'n'; /* Assumes a maximum of 9 outlets */ - if ( (strcasecmp(namebuf, "outlet.n.delay.start")) && - (strcasecmp(namebuf, "outlet.n.delay.shutdown")) ) { - return STAT_SET_UNKNOWN; + if ( (!strcasecmp(namebuf, "outlet.n.delay.start")) || + (!strcasecmp(namebuf, "outlet.n.delay.shutdown")) ) { + + + if (outlet_block_len <= 8) { + return STAT_SET_INVALID; + } + + if (!strcasecmp(namebuf, "outlet.n.delay.start")) { + onOff_setting = PW_AUTO_ON_DELAY; + } + + send_write_command(AUTHOR, 4); + sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ + + outlet_num = varname[NUT_OUTLET_POSITION] - '0'; + if (outlet_num < 1 || outlet_num > 9) { + return STAT_SET_INVALID; + } + + sec = atoi(val); + /* Check value: + * 0-32767 are valid values + * -1 means no Automatic off or restart + * for Auto Off Delay: + * 0-30 are valid but ill-advised */ + if (sec < -1 || sec > 0x7FFF) { + return STAT_SET_INVALID; + } + + cbuf[0] = PW_SET_OUTLET_COMMAND; /* Cmd */ + cbuf[1] = onOff_setting; /* Set Auto Off (1) or On (2) Delay */ + cbuf[2] = outlet_num; /* Outlet number */ + cbuf[3] = sec&0xff; /* Delay in seconds LSB */ + cbuf[4] = sec>>8; /* Delay in seconds MSB */ + + res = command_write_sequence(cbuf, 5, answer); + snprintf(success_msg, sizeof(success_msg)-1, "Outlet %d %s delay set to %d sec", + outlet_num, (onOff_setting == PW_AUTO_ON_DELAY)?"start":"shutdown", sec); + + return decode_setvar_exec(res, (unsigned char)answer[0], varname, success_msg); + } - if (outlet_block_len <= 8) { - return STAT_SET_INVALID; - } + return STAT_SET_INVALID; +} - if (!strcasecmp(namebuf, "outlet.n.delay.start")) { - onOff_setting = PW_AUTO_ON_DELAY; - } - - send_write_command(AUTHOR, 4); - sleep(PW_SLEEP); /* Need to. Have to wait at least 0,25 sec max 16 sec */ - - outlet_num = varname[NUT_OUTLET_POSITION] - '0'; - if (outlet_num < 1 || outlet_num > 9) { - return STAT_SET_INVALID; - } - - sec = atoi(val); - /* Check value: - * 0-32767 are valid values - * -1 means no Automatic off or restart - * for Auto Off Delay: - * 0-30 are valid but ill-advised */ - if (sec < -1 || sec > 0x7FFF) { - return STAT_SET_INVALID; - } - - cbuf[0] = PW_SET_OUTLET_COMMAND; /* Cmd */ - cbuf[1] = onOff_setting; /* Set Auto Off (1) or On (2) Delay */ - cbuf[2] = outlet_num; /* Outlet number */ - cbuf[3] = sec&0xff; /* Delay in seconds LSB */ - cbuf[4] = sec>>8; /* Delay in seconds MSB */ - - res = command_write_sequence(cbuf, 5, answer); +static int decode_setvar_exec(const int res, const unsigned char exec_status, const char *cmdname, const char *success_msg) +{ if (res <= 0) { - upslogx(LOG_ERR, "Short read from UPS"); + upslogx(LOG_ERR, "[%s] Short read from UPS", cmdname); dstate_datastale(); - return -1; + return STAT_SET_FAILED; } - switch ((unsigned char) answer[0]) { + /* Decode the status code from command execution */ + switch (exec_status) { case BCMXCP_RETURN_ACCEPTED: { - upslogx(LOG_NOTICE,"Outlet %d %s delay set to %d sec", - outlet_num, (onOff_setting == PW_AUTO_ON_DELAY)?"start":"shutdown", sec); - dstate_setinfo(varname, "%d", sec); + upslogx(LOG_NOTICE, "[%s] %s", cmdname, success_msg); upsdrv_comm_good(); return STAT_SET_HANDLED; break; } case BCMXCP_RETURN_ACCEPTED_PARAMETER_ADJUST: { - upslogx(LOG_NOTICE,"Outlet %d %s delay set, but UPS adjusted parameter %d sec", - outlet_num, (onOff_setting == PW_AUTO_ON_DELAY)?"start":"shutdown", sec); - dstate_setinfo(varname, "%d", sec); + upslogx(LOG_NOTICE, "[%s] Parameter adjusted", cmdname); + upslogx(LOG_NOTICE, "[%s] %s", cmdname, success_msg); upsdrv_comm_good(); return STAT_SET_HANDLED; break; } case BCMXCP_RETURN_BUSY: { - upslogx(LOG_NOTICE, "Set [%s] failed due to UPS busy", varname); - /* TODO: we should probably retry... */ - return STAT_SET_UNKNOWN; - break; - } - case BCMXCP_RETURN_PARAMETER_OUT_OF_RANGE: { - upslogx(LOG_NOTICE, "Set [%s %s] failed due to parameter out of range", varname, val); - return STAT_SET_UNKNOWN; - break; - } - case BCMXCP_RETURN_INVALID_PARAMETER: { - upslogx(LOG_NOTICE, "Set [%s %s] failed due to invalid parameter", varname, val); - return STAT_SET_UNKNOWN; - break; - } - default: { - upslogx(LOG_NOTICE, "Set [%s] not supported", varname); + upslogx(LOG_NOTICE, "[%s] Busy or disbled by front panel", cmdname); return STAT_SET_FAILED; break; } + case BCMXCP_RETURN_UNRECOGNISED: { + upslogx(LOG_NOTICE, "[%s] Unrecognised command byte or corrupt checksum", cmdname); + return STAT_SET_FAILED; + break; + } + case BCMXCP_RETURN_INVALID_PARAMETER: { + upslogx(LOG_NOTICE, "[%s] Invalid parameter", cmdname); + return STAT_SET_INVALID; + break; + } + case BCMXCP_RETURN_PARAMETER_OUT_OF_RANGE: { + upslogx(LOG_NOTICE, "[%s] Parameter out of range", cmdname); + return STAT_SET_INVALID; + break; + } + default: { + upslogx(LOG_NOTICE, "[%s] Not supported", cmdname); + return STAT_SET_INVALID; + break; + } } - - return STAT_SET_INVALID; } /******************************* @@ -1934,4 +2498,3 @@ static const char *nut_find_infoval(info_lkp_t *xcp2info, const double value, co } return NULL; } - diff --git a/drivers/bcmxcp.h b/drivers/bcmxcp.h index 7d24f76..90c690c 100644 --- a/drivers/bcmxcp.h +++ b/drivers/bcmxcp.h @@ -77,6 +77,22 @@ #define PW_TURN_OFF_DELAY 3 #define PW_TURN_ON_DELAY 4 +/* Config vars*/ +#define PW_CONF_BYPASS_FREQ_DEV_LIMIT 0x01 +#define PW_CONF_LOW_DEV_LIMIT 0x02 +#define PW_CONF_HIGH_DEV_LIMIT 0x03 +#define PW_CONF_PHASE_DEV_LIMIT 0x04 +#define PW_CONF_LOW_BATT 0x05 +#define PW_CONF_BEEPER 0x06 +#define PW_CONF_RETURN_DELAY 0x07 +#define PW_CONF_RETURN_CAP 0x08 +#define PW_CONF_MAX_TEMP 0x0a +#define PW_CONF_NOMINAL_OUT_VOLTAGE 0x0b +#define PW_CONF_SLEEP_TH_LOAD 0x0d +#define PW_CONF_SLEEP_DELAY 0x0e +#define PW_CONF_BATT_STRINGS 0x0f +#define PW_CONF_REQ 0xff + /* Config block offsets */ #define BCMXCP_CONFIG_BLOCK_MACHINE_TYPE_CODE 0 #define BCMXCP_CONFIG_BLOCK_MODEL_NUMBER 2 @@ -97,6 +113,18 @@ #define BCMXCP_CONFIG_BLOCK_PART_NUMBER 48 #define BCMXCP_CONFIG_BLOCK_SERIAL_NUMBER 64 +/*Battery block offsets*/ + +#define BCMXCP_BATTDATA_BLOCK_BATT_TEST_STATUS 0 +#define BCMXCP_BATTDATA_BLOCK_BATT_VOLTS_T1 1 +#define BCMXCP_BATTDATA_BLOCK_BATT_VOLTS_T2 5 +#define BCMXCP_BATTDATA_BLOCK_TEST_DURATION 9 +#define BCMXCP_BATTDATA_BLOCK_UTIL_VOLT 10 +#define BCMXCP_BATTDATA_BLOCK_INPUT_CURRENT 14 +#define BCMXCP_BATTDATA_BLOCK_NUMBER_OF_STRINGS 18 +/*BATT_TEST_STATUS for external strings (1 byte each) if BCMXCP_BATTDATA_BLOCK_NUMBER_OF_STRINGS == 0 no external test statuses at all*/ +/*next - number of ABM Statuses - at least 1 for internal batteries*/ + /* Index for Extende Limits block offsets */ #define BCMXCP_EXT_LIMITS_BLOCK_NOMINAL_INPUT_VOLTAGE 0 #define BCMXCP_EXT_LIMITS_BLOCK_NOMINAL_INPUT_FREQ 2 @@ -114,6 +142,8 @@ #define BCMXCP_EXT_LIMITS_BLOCK_BATT_CAPACITY_RETURN 24 #define BCMXCP_EXT_LIMITS_BLOCK_AMBIENT_TEMP_LOW 25 #define BCMXCP_EXT_LIMITS_BLOCK_AMBIENT_TEMP_HIGE 26 +#define BCMXCP_EXT_LIMITS_BLOCK_SLEEP_TH_LOAD 29 +#define BCMXCP_EXT_LIMITS_BLOCK_SLEEP_DELAY 30 /* Indexes for meter map */ #define BCMXCP_METER_MAP_OUTPUT_VOLTS_AB 0 /* mapped */ diff --git a/drivers/belkin-hid.c b/drivers/belkin-hid.c index 212d6f3..5396d62 100644 --- a/drivers/belkin-hid.c +++ b/drivers/belkin-hid.c @@ -29,20 +29,20 @@ #include "belkin-hid.h" #include "usb-common.h" -#define BELKIN_HID_VERSION "Belkin HID 0.16" +#define BELKIN_HID_VERSION "Belkin/Liebert HID 0.17" /* Belkin */ #define BELKIN_VENDORID 0x050d /* Liebert */ #define LIEBERT_VENDORID 0x10af -/* Note that there are at least two Liebert firmware types which both report + +/*! USB IDs device table. + * Note that there are at least two Liebert firmware types which both report * a VID:PID of 10af:0001. The newer ones tend not to have the Belkin broken * Usage Pages (and therefore use standard HID PDC paths) but they have * incorrect exponents for some fields. */ - -/* USB IDs device table */ static usb_device_id_t belkin_usb_device_table[] = { /* F6C800-UNV */ { USB_DEVICE(BELKIN_VENDORID, 0x0980), NULL }, @@ -60,6 +60,8 @@ static usb_device_id_t belkin_usb_device_table[] = { { USB_DEVICE(BELKIN_VENDORID, 0x0751), NULL }, /* F6H375-USB */ { USB_DEVICE(BELKIN_VENDORID, 0x0375), NULL }, + /* Regulator PRO-USB */ + { USB_DEVICE(BELKIN_VENDORID, 0x0f51), NULL }, /* F6C1100-UNV, F6C1200-UNV */ { USB_DEVICE(BELKIN_VENDORID, 0x1100), NULL }, @@ -67,6 +69,8 @@ static usb_device_id_t belkin_usb_device_table[] = { { USB_DEVICE(LIEBERT_VENDORID, 0x0001), NULL }, /* Liebert PowerSure PSI 1440 */ { USB_DEVICE(LIEBERT_VENDORID, 0x0004), NULL }, + /* Liebert GXT3 */ + { USB_DEVICE(LIEBERT_VENDORID, 0x0008), NULL }, /* Terminating entry */ { -1, -1, NULL } @@ -521,6 +525,22 @@ static hid_info_t belkin_hid2nut[] = { yet implemented) workaround, see the belkinunv(8) man page. -PS 2005/08/28 */ +#if 0 + /* added for debugging Liebert GXT3 : */ + { "unmapped.ups.powersummary.iserialnumber", 0, 0, "UPS.PowerSummary.iSerialNumber", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.imanufacturer", 0, 0, "UPS.PowerSummary.iManufacturer", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.ioeminformation", 0, 0, "UPS.PowerSummary.iOEMInformation", NULL, "%s", 0, stringid_conversion }, + { "unmapped.ups.powersummary.designcapacity", 0, 0, "UPS.PowerSummary.DesignCapacity", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.remainingtimelimit", 0, 0, "UPS.PowerSummary.RemainingTimeLimit", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.capacitymode", 0, 0, "UPS.PowerSummary.CapacityMode", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.rechargeable", 0, 0, "UPS.PowerSummary.Rechargeable", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.batterypresent", 0, 0, "UPS.PowerSummary.BatteryPresent", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.fullchargecapacity", 0, 0, "UPS.PowerSummary.FullChargeCapacity", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.capacitygranularity1", 0, 0, "UPS.PowerSummary.CapacityGranularity1", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.capacitygranularity2", 0, 0, "UPS.PowerSummary.CapacityGranularity2", NULL, "%.0f", 0, NULL }, + { "unmapped.ups.powersummary.iproduct", 0, 0, "UPS.PowerSummary.iProduct", NULL, "%.0f", 0, NULL }, +#endif + /* end of structure. */ { NULL, 0, 0, NULL, NULL, NULL, 0, NULL } }; diff --git a/drivers/blazer_usb.c b/drivers/blazer_usb.c index 7ba4df2..14d2af9 100644 --- a/drivers/blazer_usb.c +++ b/drivers/blazer_usb.c @@ -498,14 +498,7 @@ void upsdrv_help(void) void upsdrv_makevartable(void) { addvar(VAR_VALUE, "subdriver", "Serial-over-USB subdriver selection"); - addvar(VAR_VALUE, "vendorid", "Regular expression to match UPS Manufacturer numerical ID (4 digits hexadecimal)"); - addvar(VAR_VALUE, "productid", "Regular expression to match UPS Product numerical ID (4 digits hexadecimal)"); - - addvar(VAR_VALUE, "vendor", "Regular expression to match UPS Manufacturer string"); - addvar(VAR_VALUE, "product", "Regular expression to match UPS Product string"); - addvar(VAR_VALUE, "serial", "Regular expression to match UPS Serial number"); - - addvar(VAR_VALUE, "bus", "Regular expression to match USB bus name"); + nut_usb_addvars(); addvar(VAR_VALUE, "langid_fix", "Apply the language ID workaround to the krauler subdriver (0x409 or 0x4095)"); diff --git a/drivers/compaq-mib.c b/drivers/compaq-mib.c index fc9fdd9..a4eacc0 100644 --- a/drivers/compaq-mib.c +++ b/drivers/compaq-mib.c @@ -83,15 +83,19 @@ #define CPQPOWER_OID_ALARM_LB ".1.3.6.1.4.1.232.165.3.7.4.0" /* UPS-MIB::upsLowBattery */ +/* Not used, as no longer supported by MIB ver. 1.76 (Github issue 118) static info_lkp_t cpqpower_alarm_ob[] = { { 1, "OB" }, { 0, "NULL" } -} ; +}; +*/ +/* Not used, as no longer supported by MIB ver. 1.76 (Github issue 118) static info_lkp_t cpqpower_alarm_lb[] = { { 1, "LB" }, { 0, "NULL" } -} ; +}; +*/ /* Defines for CPQPOWER_OID_POWER_STATUS (1) */ static info_lkp_t cpqpower_pwr_info[] = { diff --git a/drivers/cps-hid.c b/drivers/cps-hid.c index a6d64ba..78c952f 100644 --- a/drivers/cps-hid.c +++ b/drivers/cps-hid.c @@ -28,29 +28,36 @@ #include "cps-hid.h" #include "usb-common.h" -#define CPS_HID_VERSION "CyberPower HID 0.3" +#define CPS_HID_VERSION "CyberPower HID 0.4" /* Cyber Power Systems */ #define CPS_VENDORID 0x0764 -/* +/*! Battery voltage scale factor. * For some devices, the reported battery voltage is off by factor * of 1.5 so we need to apply a scale factor to it to get the real * battery voltage. By default, the factor is 1 (no scaling). */ static double battery_scale = 1; +static int might_need_battery_scale = 0; +static int battery_scale_checked = 0; + +/*! If the ratio of the battery voltage to the nominal battery voltage exceeds + * this factor, we assume that the battery voltage needs to be scaled by 2/3. + */ +static const double battery_voltage_sanity_check = 1.4; static void *cps_battery_scale(USBDevice_t *device) { - battery_scale = 0.667; + might_need_battery_scale = 1; return NULL; } /* USB IDs device table */ static usb_device_id_t cps_usb_device_table[] = { - /* 900AVR/BC900D, CP1200AVR/BC1200D */ + /* 900AVR/BC900D */ { USB_DEVICE(CPS_VENDORID, 0x0005), NULL }, - /* Dynex DX-800U? */ + /* Dynex DX-800U?, CP1200AVR/BC1200D, CP825AVR-G, CP1000AVRLCD, CP1000PFCLCD, CP1500C, CP550HG, etc. */ { USB_DEVICE(CPS_VENDORID, 0x0501), &cps_battery_scale }, /* OR2200LCDRM2U, OR700LCDRM1U, PR6000LCDRTXL5U */ { USB_DEVICE(CPS_VENDORID, 0x0601), NULL }, @@ -59,12 +66,48 @@ static usb_device_id_t cps_usb_device_table[] = { { -1, -1, NULL } }; +/*! Adjusts @a battery_scale if voltage is well above nominal. + */ +static void cps_adjust_battery_scale(double batt_volt) +{ + const char *batt_volt_nom_str; + double batt_volt_nom; + + if(battery_scale_checked) { + return; + } + + batt_volt_nom_str = dstate_getinfo("battery.voltage.nominal"); + if(!batt_volt_nom_str) { + upsdebugx(2, "%s: 'battery.voltage.nominal' not available yet; skipping scale determination", __func__); + return; + } + + batt_volt_nom = strtod(batt_volt_nom_str, NULL); + if(batt_volt_nom == 0) { + upsdebugx(3, "%s: 'battery.voltage.nominal' is %s", __func__, batt_volt_nom_str); + return; + } + + if( (batt_volt / batt_volt_nom) > battery_voltage_sanity_check ) { + upslogx(LOG_INFO, "%s: battery readings will be scaled by 2/3", __func__); + battery_scale = 2.0/3; + } + + battery_scale_checked = 1; +} + /* returns statically allocated string - must not use it again before done with result! */ static const char *cps_battvolt_fun(double value) { static char buf[8]; + if(might_need_battery_scale) { + cps_adjust_battery_scale(value); + } + + upsdebugx(5, "%s: battery_scale = %.3f", __func__, battery_scale); snprintf(buf, sizeof(buf), "%.1f", battery_scale * value); return buf; diff --git a/drivers/dstate.c b/drivers/dstate.c index 2e5bd7e..20d239a 100644 --- a/drivers/dstate.c +++ b/drivers/dstate.c @@ -238,23 +238,24 @@ static void sock_connect(int sock) } /* enable nonblocking I/O */ + if (!do_synchronous) { + ret = fcntl(fd, F_GETFL, 0); - ret = fcntl(fd, F_GETFL, 0); + if (ret < 0) { + upslog_with_errno(LOG_ERR, "fcntl get on unix fd failed"); + close(fd); + return; + } - if (ret < 0) { - upslog_with_errno(LOG_ERR, "fcntl get on unix fd failed"); - close(fd); - return; + ret = fcntl(fd, F_SETFL, ret | O_NDELAY); + + if (ret < 0) { + upslog_with_errno(LOG_ERR, "fcntl set O_NDELAY on unix fd failed"); + close(fd); + return; + } } - ret = fcntl(fd, F_SETFL, ret | O_NDELAY); - - if (ret < 0) { - upslog_with_errno(LOG_ERR, "fcntl set O_NDELAY on unix fd failed"); - close(fd); - return; - } - conn = xcalloc(1, sizeof(*conn)); conn->fd = fd; diff --git a/drivers/dstate.h b/drivers/dstate.h index b4a5aa9..35a7714 100644 --- a/drivers/dstate.h +++ b/drivers/dstate.h @@ -41,6 +41,10 @@ typedef struct conn_s { extern struct ups_handler upsh; + /* asynchronous (nonblocking) Vs synchronous (blocking) I/O + * Defaults to nonblocking, for backward compatibility */ + extern int do_synchronous; + void dstate_init(const char *prog, const char *devname); int dstate_poll_fds(struct timeval timeout, int extrafd); int dstate_setinfo(const char *var, const char *fmt, ...) diff --git a/drivers/eaton-mib.c b/drivers/eaton-mib.c index b06006e..77d9e00 100644 --- a/drivers/eaton-mib.c +++ b/drivers/eaton-mib.c @@ -1,6 +1,10 @@ -/* eaton-mib.c - data to monitor Eaton Aphel PDUs (Basic and Complex) +/* eaton-mib.c - data to monitor Eaton ePDUs: + * G1 Aphel based ePDUs (Basic and Complex) + * G1 Pulizzi Monitored and Switched ePDUs + * G2 Marlin SW / MI / MO / MA + * G3 Shark SW / MI / MO / MA * - * Copyright (C) 2008 - 2012 + * Copyright (C) 2008 - 2015 * Arnaud Quette * Arnaud Quette * @@ -30,7 +34,8 @@ /* APHEL-GENESIS-II-MIB (monitored ePDU) * ************************************* - * Note: we should also be able to support this one using netxml-ups! + * Note: There is also a basic XML interface, but not worth + * implementing in netxml-ups! */ #define APHEL1_OID_MIB ".1.3.6.1.4.1.17373" @@ -212,7 +217,7 @@ static snmp_info_t eaton_aphel_revelation_mib[] = { /* Eaton PDU-MIB - Marlin MIB * ************************** */ -#define EATON_MARLIN_MIB_VERSION "0.06" +#define EATON_MARLIN_MIB_VERSION "0.10" #define EATON_MARLIN_SYSOID ".1.3.6.1.4.1.534.6.6.7" #define EATON_MARLIN_OID_MODEL_NAME ".1.3.6.1.4.1.534.6.6.7.1.2.1.2.0" @@ -220,7 +225,7 @@ static info_lkp_t marlin_outlet_status_info[] = { { 0, "off" }, { 1, "on" }, { 2, "pendingOff" }, /* transitional status */ - { 3, "pendingOn" }, /* transitional status */ + { 3, "pendingOn" }, /* transitional status */ { 0, NULL } }; @@ -234,6 +239,7 @@ static info_lkp_t outlet_switchability_info[] = { /* Snmp2NUT lookup table for Eaton Marlin MIB */ static snmp_info_t eaton_marlin_mib[] = { + /* Device page */ { "device.mfr", ST_FLAG_STRING, SU_INFOSIZE, NULL, "EATON", SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL, NULL }, @@ -277,12 +283,61 @@ static snmp_info_t eaton_marlin_mib[] = { */ /* Input page */ + /* Historically, some of these data were previously published as + * outlet.{realpower,...} + * However, it's more suitable and logic to have these on input.{...} + */ { "input.phases", 0, 1, ".1.3.6.1.4.1.534.6.6.7.1.2.1.20.0", NULL, SU_FLAG_STATIC | SU_FLAG_OK, NULL, NULL }, - /* inputType.0.1 singlePhase (1) iso.3.6.1.4.1.534.6.6.7.3.1.1.2.0.1 */ + /* FIXME: to be implemented + * inputType.0.1 iso.3.6.1.4.1.534.6.6.7.3.1.1.2.0.1 + * singlePhase (1), ... split phase, three phase delta, or three phase wye + */ + + /* Frequency is measured globally */ { "input.frequency", 0, 0.1, ".1.3.6.1.4.1.534.6.6.7.3.1.1.3.0.1", NULL, 0, NULL, NULL }, + + /* inputCurrentPercentLoad (measured globally) + * Current percent load, based on the rated current capacity */ + /* FIXME: input.load is mapped on input.L1.load for both single and 3phase !!! */ + { "input.load", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.3.1.11.0.1.1", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L1.load", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.3.1.11.0.1.1", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L2.load", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.3.1.11.0.1.2", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L3.load", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.3.1.11.0.1.3", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + + /* FIXME: + * - Voltage is only mesured per phase, as mV! + * so input.voltage == input.L1.voltage for both single and 3phase + * - As per NUT namespace (http://www.networkupstools.org/docs/developer-guide.chunked/apas01.html#_valid_contexts) + * Voltage has to be expressed either phase-phase or phase-neutral + * This is depending on OID inputVoltageMeasType + * INTEGER {singlePhase (1),phase1toN (2),phase2toN (3),phase3toN (4),phase1to2 (5),phase2to3 (6),phase3to1 (7)*/ { "input.voltage", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.2.1.3.0.1.1", NULL, 0, NULL, NULL }, - /* FIXME: check multiplier */ - { "input.current", 0, 0.01, ".1.3.6.1.4.1.534.6.6.7.3.3.1.4.0.1.1", NULL, 0, NULL, NULL }, + { "input.L1.voltage", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.2.1.3.0.1.1", NULL, 0, NULL, NULL }, + { "input.L2.voltage", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.2.1.3.0.1.2", NULL, 0, NULL, NULL }, + { "input.L3.voltage", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.2.1.3.0.1.3", NULL, 0, NULL, NULL }, + + /* FIXME: + * - input.current is mapped on input.L1.current for both single and 3phase !!! */ + { "input.current", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.3.1.4.0.1.1", NULL, 0, NULL, NULL }, + { "input.L1.current", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.3.1.4.0.1.1", NULL, 0, NULL, NULL }, + { "input.L2.current", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.3.1.4.0.1.2", NULL, 0, NULL, NULL }, + { "input.L3.current", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.3.1.4.0.1.3", NULL, 0, NULL, NULL }, + /* Sum of all phases realpower, valid for Shark 1ph/3ph only */ + { "input.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.5.1.4.0.1", NULL, SU_FLAG_NEGINVALID | SU_FLAG_UNIQUE | SU_FLAG_OK, NULL, NULL }, + /* Fallback 1: Sum of all phases realpower, valid for Marlin 3ph only */ + { "input.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.4.0.1.4", NULL, SU_FLAG_NEGINVALID | SU_FLAG_UNIQUE | SU_FLAG_OK, NULL, NULL }, + /* Fallback 2: Sum of the phase realpower, valid for Marlin 1ph only */ + { "input.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.4.0.1.2", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L1.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.4.0.1.1", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L2.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.4.0.1.2", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L3.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.4.0.1.3", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + /* Sum of all phases apparent power, valid for 3phase only */ + { "input.power", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.4", NULL, SU_FLAG_NEGINVALID | SU_FLAG_UNIQUE | SU_FLAG_OK, NULL, NULL }, + /* Sum of the phase apparent power, valid for 1phase only (fallback for also publishing) */ + { "input.power", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.1", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L1.power", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.1", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L2.power", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.2", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, + { "input.L3.power", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.3", NULL, SU_FLAG_NEGINVALID | SU_FLAG_OK, NULL, NULL }, /* Ambient page */ /* We use critical levels, for both temperature and humidity, @@ -300,13 +355,12 @@ static snmp_info_t eaton_marlin_mib[] = { SU_FLAG_STATIC | SU_FLAG_ABSENT | SU_FLAG_OK, NULL, NULL }, { "outlet.count", 0, 1, ".1.3.6.1.4.1.534.6.6.7.1.2.1.22.0", "0", SU_FLAG_STATIC | SU_FLAG_OK, NULL, NULL }, /* The below ones are the same as the input.* equivalent */ + /* FIXME: transition period, TO BE REMOVED, moved to input.* */ { "outlet.frequency", 0, 0.1, ".1.3.6.1.4.1.534.6.6.7.3.1.1.3.0.1", NULL, 0, NULL, NULL }, { "outlet.voltage", 0, 0.001, ".1.3.6.1.4.1.534.6.6.7.3.2.1.3.0.1.1", NULL, 0, NULL, NULL }, { "outlet.current", 0, 0.01, ".1.3.6.1.4.1.534.6.6.7.3.3.1.4.0.1.1", NULL, 0, NULL, NULL }, - /* There is also a .2 available (ie .1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.2) */ - { "outlet.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.4.0.1.2", NULL, 0, NULL, NULL }, - /* There is also a .2 available (ie .1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.2) */ - { "outlet.power", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.1", NULL, 0, NULL, NULL }, + { "outlet.realpower", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.4.0.1.4", NULL, 0, NULL, NULL }, + { "outlet.power", 0, 1.0, ".1.3.6.1.4.1.534.6.6.7.3.4.1.3.0.1.4", NULL, 0, NULL, NULL }, /* outlet template definition * Indexes start from 1, ie outlet.1 => .1 */ diff --git a/drivers/genericups.c b/drivers/genericups.c index bc8ddc4..9a005fa 100644 --- a/drivers/genericups.c +++ b/drivers/genericups.c @@ -39,19 +39,30 @@ upsdrv_info_t upsdrv_info = { static void parse_output_signals(const char *value, int *line) { + int old_line = *line; /* parse signals the serial port can output */ *line = 0; + upsdebugx(4, "%s: enter", __func__); + + /* Note: for future drivers, please use strtok() or similar tokenizing + * methods, such that it is easier to spot configuration mistakes. With + * this code, a misspelled control line may go unnoticed. I'd fix it + * The Right Way (tm), but these UPSes are ancient. + */ if (strstr(value, "DTR") && !strstr(value, "-DTR")) { + upsdebugx(3, "%s: override DTR", __func__); *line |= TIOCM_DTR; } if (strstr(value, "RTS") && !strstr(value, "-RTS")) { + upsdebugx(3, "%s: override RTS", __func__); *line |= TIOCM_RTS; } if (strstr(value, "ST")) { + upsdebugx(3, "%s: override ST", __func__); *line |= TIOCM_ST; } @@ -70,20 +81,32 @@ static void parse_output_signals(const char *value, int *line) if (strstr(value, "DSR")) { fatalx(EXIT_FAILURE, "Can't override output with DSR (not an output)"); } + + if(*line == old_line) { + upslogx(LOG_NOTICE, "%s: output overrides specified, but no effective difference - check for typos?", __func__); + } + + upsdebugx(4, "%s: exit", __func__); } static void parse_input_signals(const char *value, int *line, int *val) { /* parse signals the serial port can input */ + int old_line = *line, old_val = *val; *line = 0; *val = 0; + upsdebugx(4, "%s: enter", __func__); + if (strstr(value, "CTS")) { *line |= TIOCM_CTS; if (!strstr(value, "-CTS")) { + upsdebugx(3, "%s: override CTS (active low)", __func__); *val |= TIOCM_CTS; + } else { + upsdebugx(3, "%s: override CTS", __func__); } } @@ -91,7 +114,10 @@ static void parse_input_signals(const char *value, int *line, int *val) *line |= TIOCM_CD; if (!strstr(value, "-DCD")) { + upsdebugx(3, "%s: override DCD (active low)", __func__); *val |= TIOCM_CD; + } else { + upsdebugx(3, "%s: override DCD", __func__); } } @@ -99,7 +125,10 @@ static void parse_input_signals(const char *value, int *line, int *val) *line |= TIOCM_RNG; if (!strstr(value, "-RNG")) { + upsdebugx(3, "%s: override RNG (active low)", __func__); *val |= TIOCM_RNG; + } else { + upsdebugx(3, "%s: override RNG", __func__); } } @@ -107,7 +136,10 @@ static void parse_input_signals(const char *value, int *line, int *val) *line |= TIOCM_DSR; if (!strstr(value, "-DSR")) { + upsdebugx(3, "%s: override DSR (active low)", __func__); *val |= TIOCM_DSR; + } else { + upsdebugx(3, "%s: override DSR", __func__); } } @@ -122,6 +154,12 @@ static void parse_input_signals(const char *value, int *line, int *val) if (strstr(value, "ST")) { fatalx(EXIT_FAILURE, "Can't override input with ST (not an input)"); } + + if((*line == old_line) && (*val == old_val)) { + upslogx(LOG_NOTICE, "%s: input overrides specified, but no effective difference - check for typos?", __func__); + } + + upsdebugx(4, "%s: exit", __func__); } void upsdrv_initinfo(void) diff --git a/drivers/libhid.c b/drivers/libhid.c index d0ba7c5..25d4d00 100644 --- a/drivers/libhid.c +++ b/drivers/libhid.c @@ -59,6 +59,10 @@ static double exponent(double a, int8_t b); /* Tweak flag for APC Back-UPS */ int max_report_size = 0; +/* Tweaks for Powercom, at least */ +int interrupt_only = 0; +int unsigned interrupt_size = 0; + /* ---------------------------------------------------------------------- */ /* report buffering system */ @@ -148,7 +152,7 @@ static int refresh_report_buffer(reportbuf_t *rbuf, hid_dev_handle_t udev, HIDDa int id = pData->ReportID; int r; - if (rbuf->ts[id] + age > time(NULL)) { + if (interrupt_only || rbuf->ts[id] + age > time(NULL)) { /* buffered report is still good; nothing to do */ upsdebug_hex(3, "Report[buf]", rbuf->data[id], rbuf->len[id]); return 0; @@ -346,7 +350,7 @@ HIDData_t *HIDGetItemData(const char *hidpath, usage_tables_t *utab) } /* Get info on object (reportID, offset and size) */ - return FindObject_with_Path(pDesc, &Path, ITEM_FEATURE); + return FindObject_with_Path(pDesc, &Path, interrupt_only ? ITEM_INPUT:ITEM_FEATURE); } char *HIDGetDataItem(const HIDData_t *hiddata, usage_tables_t *utab) @@ -479,7 +483,7 @@ int HIDGetEvents(hid_dev_handle_t udev, HIDData_t **event, int eventsize) HIDData_t *pData; /* needs libusb-0.1.8 to work => use ifdef and autoconf */ - buflen = comm_driver->get_interrupt(udev, buf, sizeof(buf), 250); + buflen = comm_driver->get_interrupt(udev, buf, interrupt_size ? interrupt_size:sizeof(buf), 250); if (buflen <= 0) { return buflen; /* propagate "error" or "no event" code */ } diff --git a/drivers/libhid.h b/drivers/libhid.h index 0e513f9..0879c3e 100644 --- a/drivers/libhid.h +++ b/drivers/libhid.h @@ -89,6 +89,9 @@ typedef struct reportbuf_s { extern reportbuf_t *reportbuf; /* buffer for most recent reports */ +extern int interrupt_only; +extern unsigned int interrupt_size; + /* ---------------------------------------------------------------------- */ /* diff --git a/drivers/libusb.c b/drivers/libusb.c index fd8f5b9..8625ed6 100644 --- a/drivers/libusb.c +++ b/drivers/libusb.c @@ -49,6 +49,23 @@ upsdrv_info_t comm_upsdrv_info = { static void libusb_close(usb_dev_handle *udev); +/*! Add USB-related driver variables with addvar(). + * This removes some code duplication across the USB drivers. + */ +void nut_usb_addvars(void) +{ + /* allow -x vendor=X, vendorid=X, product=X, productid=X, serial=X */ + addvar(VAR_VALUE, "vendor", "Regular expression to match UPS Manufacturer string"); + addvar(VAR_VALUE, "product", "Regular expression to match UPS Product string"); + addvar(VAR_VALUE, "serial", "Regular expression to match UPS Serial number"); + + addvar(VAR_VALUE, "vendorid", "Regular expression to match UPS Manufacturer numerical ID (4 digits hexadecimal)"); + addvar(VAR_VALUE, "productid", "Regular expression to match UPS Product numerical ID (4 digits hexadecimal)"); + + addvar(VAR_VALUE, "bus", "Regular expression to match USB bus name"); + addvar(VAR_VALUE, "usb_set_altinterface", "Force redundant call to usb_set_altinterface() (value=bAlternateSetting; default=0)"); +} + /* From usbutils: workaround libusb API goofs: "byte" should never be sign extended; * using "char" is trouble. Likewise, sizes should never be negative. */ @@ -70,6 +87,45 @@ static inline int matches(USBDeviceMatcher_t *matcher, USBDevice_t *device) { return matcher->match_function(device, matcher->privdata); } +/*! If needed, set the USB alternate interface. + * + * In NUT 2.7.2 and earlier, the following call was made unconditionally: + * usb_set_altinterface(udev, 0); + * + * Although harmless on Linux and *BSD, this extra call prevents old Tripp Lite + * devices from working on Mac OS X (presumably the OS is already setting + * altinterface to 0). + */ +static int nut_usb_set_altinterface(usb_dev_handle *udev) +{ + int altinterface = 0, ret = 0; + char *alt_string, *endp = NULL; + + if(testvar("usb_set_altinterface")) { + alt_string = getval("usb_set_altinterface"); + if(alt_string) { + altinterface = (int)strtol(alt_string, &endp, 10); + if(endp && !(endp[0] == 0)) { + upslogx(LOG_WARNING, "%s: '%s' is not a valid number", __func__, alt_string); + } + if(altinterface < 0 || altinterface > 255) { + upslogx(LOG_WARNING, "%s: setting bAlternateInterface to %d will probably not work", __func__, altinterface); + } + } + /* set default interface */ + upsdebugx(2, "%s: calling usb_set_altinterface(udev, %d)", __func__, altinterface); + ret = usb_set_altinterface(udev, altinterface); + if(ret != 0) { + upslogx(LOG_WARNING, "%s: usb_set_altinterface(udev, %d) returned %d (%s)", + __func__, altinterface, ret, usb_strerror() ); + } + upslogx(LOG_NOTICE, "%s: usb_set_altinterface() should not be necessary - please email the nut-upsdev list with information about your UPS.", __func__); + } else { + upsdebugx(3, "%s: skipped usb_set_altinterface(udev, 0)", __func__); + } + return ret; +} + #define usb_control_msg typesafe_control_msg /* On success, fill in the curDevice structure and return the report @@ -220,8 +276,7 @@ static int libusb_open(usb_dev_handle **udevp, USBDevice_t *curDevice, USBDevice } #endif - /* set default interface */ - usb_set_altinterface(udev, 0); + nut_usb_set_altinterface(udev); if (!callback) { return 1; diff --git a/drivers/liebert-hid.c b/drivers/liebert-hid.c index cff6f1d..34f00bd 100644 --- a/drivers/liebert-hid.c +++ b/drivers/liebert-hid.c @@ -26,13 +26,18 @@ #include "liebert-hid.h" #include "usb-common.h" -#define LIEBERT_HID_VERSION "Liebert HID 0.3" +#define LIEBERT_HID_VERSION "Phoenixtec/Liebert HID 0.3" /* FIXME: experimental flag to be put in upsdrv_info */ /* Phoenixtec Power Co., Ltd */ #define LIEBERT_VENDORID 0x06da -/* USB IDs device table */ +/*! USB IDs device table. + * + * Note that this subdriver was named before the USB VendorID was determined to + * actually belong to Phoenixtec. The belkin-hid.c file covers the other + * Liebert units which share some of the same incorrect exponents as the + * Belkin HID firmware. */ static usb_device_id_t liebert_usb_device_table[] = { /* various models */ { USB_DEVICE(LIEBERT_VENDORID, 0xffff), NULL }, diff --git a/drivers/main.c b/drivers/main.c index 7c2fc55..f63d54a 100644 --- a/drivers/main.c +++ b/drivers/main.c @@ -31,6 +31,9 @@ /* for ser_open */ int do_lock_port = 1; + /* for dstate->sock_connect, default to asynchronous */ + int do_synchronous = 0; + /* for detecting -a values that don't match anything */ static int upsname_found = 0; @@ -250,7 +253,7 @@ void addvar(int vartype, const char *name, const char *desc) /* handle -x / ups.conf config details that are for this part of the code */ static int main_arg(char *var, char *val) { - /* flags for main: just 'nolock' for now */ + /* flags for main */ if (!strcmp(var, "nolock")) { do_lock_port = 0; @@ -281,6 +284,16 @@ static int main_arg(char *var, char *val) return 1; /* handled */ } + /* allow per-driver overrides of the global setting */ + if (!strcmp(var, "synchronous")) { + if (!strcmp(val, "yes")) + do_synchronous=1; + else + do_synchronous=0; + + return 1; /* handled */ + } + /* only for upsdrvctl - ignored here */ if (!strcmp(var, "sdorder")) return 1; /* handled */ @@ -309,6 +322,13 @@ static void do_global_args(const char *var, const char *val) user = xstrdup(val); } + if (!strcmp(var, "synchronous")) { + if (!strcmp(val, "yes")) + do_synchronous=1; + else + do_synchronous=0; + } + /* unrecognized */ } @@ -519,6 +539,7 @@ int main(int argc, char **argv) chroot_path = xstrdup(optarg); break; case 'u': + free(user); user = xstrdup(optarg); break; case 'V': @@ -660,6 +681,10 @@ int main(int argc, char **argv) /* The poll_interval may have been changed from the default */ dstate_setinfo("driver.parameter.pollinterval", "%d", poll_interval); + /* The synchronous option may have been changed from the default */ + dstate_setinfo("driver.parameter.synchronous", "%s", + (do_synchronous==1)?"yes":"no"); + /* remap the device.* info from ups.* for the transition period */ if (dstate_getinfo("ups.mfr") != NULL) dstate_setinfo("device.mfr", "%s", dstate_getinfo("ups.mfr")); diff --git a/drivers/mge-hid.c b/drivers/mge-hid.c index 93ccde6..dfc62c9 100644 --- a/drivers/mge-hid.c +++ b/drivers/mge-hid.c @@ -1,7 +1,8 @@ /* mge-hid.c - data to monitor Eaton / MGE HID (USB and serial) devices * - * Copyright (C) 2003 - 2012 - * Arnaud Quette + * Copyright (C) + * 2003 - 2015 Arnaud Quette + * 2015 Arnaud Quette * * Sponsored by MGE UPS SYSTEMS * @@ -36,7 +37,7 @@ #include "usbhid-ups.h" #include "mge-hid.h" -#define MGE_HID_VERSION "MGE HID 1.33" +#define MGE_HID_VERSION "MGE HID 1.38" /* (prev. MGE Office Protection Systems, prev. MGE UPS SYSTEMS) */ /* Eaton */ @@ -121,6 +122,223 @@ static int country_code = COUNTRY_UNKNOWN; static char mge_scratch_buf[20]; +/* ABM - Advanced Battery Monitoring + *********************************** + * Synthesis table + * HID data | Charger in ABM mode | Charger in Constant mode + * UPS.BatterySystem.Charger.ABMEnable | 1 | 0 + * UPS.PowerSummary.PresentStatus.ACPresent | On utility | On battery | On utility | On battery + * Charger ABM mode | Charging | Floating | Resting | Discharging | Disabled | Disabled + * UPS.BatterySystem.Charger.Mode | 1 | 3 | 4 | 2 | 6 | 6 + * UPS.PowerSummary.PresentStatus.Charging | 1 | 1 | 1 | 0 | 1 | 0 + * UPS.PowerSummary.PresentStatus.Discharging | 0 |  0 |  0 | 1 | 0 | 1 + * + * Notes (from David G. Miller) to understand ABM status: + * When supporting ABM, when a UPS powers up or returns from battery, or + * ends the ABM rest mode, it enters charge mode. + * Some UPSs run a different charger reference voltage during charge mode + * but all the newer models should not be doing that, but basically once + * the battery voltage reaches the charger reference level (should be 2.3 + * volts/cell), the charger is considered in float mode. Some UPSs will not + * annunciate float mode until the charger power starts falling from the maximum + * level indicating the battery is truly at the float voltage or in float mode. + * The %charge level is based on battery voltage and the charge mode timer + * (should be 48 hours) and some UPSs add in a value that’s related to charger + * power output. So you can have UPS that enters float mode with anywhere + * from 80% or greater battery capacity. + * float mode is not important from the software’s perspective, it’s there to + * help determine if the charger is advancing correctly. + * So in float mode, the charger is charging the battery, so by definition you + * can assert the CHRG flag in NUT when in “float” mode or “charge” mode. + * When in “rest” mode the charger is not delivering anything to the battery, + * but it will when the ABM cycle(28 days) ends, or a battery discharge occurs + * and utility returns. This is when the ABM status should be “resting”. + * If a battery failure is detected that disables the charger, it should be + * reporting “off” in the ABM charger status. + * Of course when delivering load power from the battery, the ABM status is + * discharging. + */ + +#define ABM_UNKNOWN -1 +#define ABM_DISABLED 0 +#define ABM_ENABLED 1 + +/* Internal flag to process battery status (CHRG/DISCHRG) and ABM */ +static int advanced_battery_monitoring = ABM_UNKNOWN; + +/* Used to store internally if ABM is enabled or not */ +static const char *eaton_abm_enabled_fun(double value) +{ + advanced_battery_monitoring = value; + + upsdebugx(2, "ABM is %s", (advanced_battery_monitoring==1)?"enabled":"disabled"); + + /* Return NULL, not to get the value published! */ + return NULL; +} + +static info_lkp_t eaton_abm_enabled_info[] = { + { 0, "dummy", eaton_abm_enabled_fun }, + { 0, NULL, NULL } +}; + +/* Note 1: This point will need more clarification! */ +# if 0 +/* Used to store internally if ABM is enabled or not (for legacy units) */ +static const char *eaton_abm_enabled_legacy_fun(double value) +{ + advanced_battery_monitoring = value; + + upsdebugx(2, "ABM is %s (legacy data)", (advanced_battery_monitoring==1)?"enabled":"disabled"); + + /* Return NULL, not to get the value published! */ + return NULL; +} + +static info_lkp_t eaton_abm_enabled_legacy_info[] = { + { 0, "dummy", eaton_abm_enabled_legacy_fun }, + { 0, NULL, NULL } +}; +#endif /* if 0 */ + +/* Used to process ABM flags, for battery.charger.status */ +static const char *eaton_abm_status_fun(double value) +{ + /* Don't process if ABM is disabled */ + if (advanced_battery_monitoring == ABM_DISABLED) { + /* Clear any previously published data, in case + * the user has switched off ABM */ + dstate_delinfo("battery.charger.status"); + return NULL; + } + + upsdebugx(2, "ABM numeric status: %i", (int)value); + + switch ((long)value) + { + case 1: + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "charging"); + break; + case 2: + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "discharging"); + break; + case 3: + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "floating"); + break; + case 4: + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "resting"); + break; + case 6: /* ABM Charger Disabled */ + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "off"); + break; + case 5: /* Undefined - ABM is not activated */ + default: + /* Return NULL, not to get the value published! */ + return NULL; + } + + upsdebugx(2, "ABM string status: %s", mge_scratch_buf); + + return mge_scratch_buf; +} + +static info_lkp_t eaton_abm_status_info[] = { + { 1, "dummy", eaton_abm_status_fun }, + { 0, NULL, NULL } +}; + +/* Used to process ABM flags, for ups.status (CHRG/DISCHRG/RB) */ +static const char *eaton_abm_chrg_dischrg_fun(double value) +{ + /* Don't process if ABM is disabled */ + if (advanced_battery_monitoring == ABM_DISABLED) + return NULL; + + switch ((long)value) + { + case 1: /* charging status */ + case 3: /* floating status */ + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "chrg"); + break; + case 2: + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "dischrg"); + break; + case 6: /* ABM Charger Disabled */ + case 4: /* resting, nothing to publish! (?) */ + case 5: /* Undefined - ABM is not activated */ + default: + /* Return NULL, not to get the value published! */ + return NULL; + } + + upsdebugx(2, "ABM CHRG/DISCHRG legacy string status (ups.status): %s", mge_scratch_buf); + + return mge_scratch_buf; +} + +static info_lkp_t eaton_abm_chrg_dischrg_info[] = { + { 1, "dummy", eaton_abm_chrg_dischrg_fun }, + { 0, NULL, NULL } +}; + +/* ABM also implies that standard CHRG/DISCHRG are processed according + * to weither ABM is enabled or not... + * If ABM is disabled, we publish these legacy status + * Otherwise, we don't publish on ups.status, but only battery.charger.status */ +/* FIXME: we may prefer to publish the CHRG/DISCHRG status + * on battery.charger.status?! */ +static const char *eaton_abm_check_dischrg_fun(double value) +{ + if (advanced_battery_monitoring == ABM_DISABLED) + { + if (value == 1) { + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "dischrg"); + } + else { + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "!dischrg"); + } + } + else { + /* Else, ABM is enabled, we should return NULL, + * not to get the value published! + * However, clear flags that would persist in case of prior + * publication in ABM-disabled mode */ + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "!dischrg"); + } + return mge_scratch_buf; +} + +static info_lkp_t eaton_discharging_info[] = { + { 1, "dummy", eaton_abm_check_dischrg_fun }, + { 0, NULL, NULL } +}; + +static const char *eaton_abm_check_chrg_fun(double value) +{ + if (advanced_battery_monitoring == ABM_DISABLED) + { + if (value == 1) { + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "chrg"); + } + else { + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "!chrg"); + } + } + else { + /* Else, ABM is enabled, we should return NULL, + * not to get the value published! + * However, clear flags that would persist in case of prior + * publication in ABM-disabled mode */ + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%s", "!chrg"); + } + return mge_scratch_buf; +} + +static info_lkp_t eaton_charging_info[] = { + { 1, "dummy", eaton_abm_check_chrg_fun }, + { 0, NULL, NULL } +}; + /* The HID path 'UPS.PowerSummary.Time' reports Unix time (ie the number of * seconds since 1970-01-01 00:00:00. This has to be split between ups.date and * ups.time */ @@ -880,6 +1098,21 @@ static hid_info_t mge_hid2nut[] = { "battery.voltage.nominal", 0, 0, "UPS.PowerSummary.ConfigVoltage", NULL, "%s", HU_FLAG_STATIC, mge_battery_voltage_nominal }, { "battery.protection", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.BatterySystem.Battery.DeepDischargeProtection", NULL, "%s", HU_FLAG_SEMI_STATIC, yes_no_info }, { "battery.energysave", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.PowerConverter.Input.[3].EnergySaving", NULL, "%s", HU_FLAG_SEMI_STATIC, yes_no_info }, + { "battery.energysave.load", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.PowerConverter.Input.[3].ConfigPercentLoad", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, + /* Current implementation */ + { "battery.energysave.delay", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.PowerConverter.Input.[3].EnergySaving.ShutdownTimer", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, + /* Newer implementation */ + { "battery.energysave.delay", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.PowerConverter.Input.[3].ShutdownTimer", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, + { "battery.energysave.realpower", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.PowerConverter.Input.[3].ConfigActivePower", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, + /* ABM (Advanced Battery Monitoring) processing + * Must be processed before the BOOL status */ + /* Not published, just to store in internal var. advanced_battery_monitoring */ + { "battery.charger.status", 0, 0, "UPS.BatterySystem.Charger.ABMEnable", NULL, "%.0f", HU_FLAG_QUICK_POLL, eaton_abm_enabled_info }, + /* Same as the one above, but for legacy units */ + /* Refer to Note 1 (This point will need more clarification!) + { "battery.charger.status", 0, 0, "UPS.BatterySystem.Charger.PresentStatus.Used", NULL, "%.0f", HU_FLAG_QUICK_POLL, eaton_abm_enabled_legacy_info }, */ + /* This data is the actual ABM status information */ + { "battery.charger.status", 0, 0, "UPS.BatterySystem.Charger.Mode", NULL, "%.0f", HU_FLAG_QUICK_POLL, eaton_abm_status_info }, /* UPS page */ { "ups.efficiency", 0, 0, "UPS.PowerConverter.Output.Efficiency", NULL, "%.0f", 0, NULL }, @@ -922,8 +1155,11 @@ static hid_info_t mge_hid2nut[] = { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.ACPresent", NULL, NULL, HU_FLAG_QUICK_POLL, online_info }, { "BOOL", 0, 0, "UPS.PowerConverter.Input.[3].PresentStatus.Used", NULL, NULL, 0, mge_onbatt_info }, { "BOOL", 0, 0, "UPS.PowerConverter.Input.[1].PresentStatus.Used", NULL, NULL, 0, online_info }, - { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.Discharging", NULL, NULL, HU_FLAG_QUICK_POLL, discharging_info }, - { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.Charging", NULL, NULL, HU_FLAG_QUICK_POLL, charging_info }, + /* These 2 ones are used when ABM is disabled */ + { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.Discharging", NULL, NULL, HU_FLAG_QUICK_POLL, eaton_discharging_info }, + { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.Charging", NULL, NULL, HU_FLAG_QUICK_POLL, eaton_charging_info }, + /* And this one when ABM is enabled (same as battery.charger.status) */ + { "BOOL", 0, 0, "UPS.BatterySystem.Charger.Mode", NULL, "%.0f", HU_FLAG_QUICK_POLL, eaton_abm_chrg_dischrg_info }, /* FIXME: on Dell, the above requires an "AND" with "UPS.BatterySystem.Charger.Mode = 1" */ { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.BelowRemainingCapacityLimit", NULL, NULL, HU_FLAG_QUICK_POLL, lowbatt_info }, /* Output overload, Level 1 (FIXME: add the level?) */ @@ -940,11 +1176,6 @@ static hid_info_t mge_hid2nut[] = { "BOOL", 0, 0, "UPS.PowerConverter.Input.[1].PresentStatus.VoltageOutOfRange", NULL, NULL, 0, vrange_info }, { "BOOL", 0, 0, "UPS.PowerConverter.Input.[1].PresentStatus.FrequencyOutOfRange", NULL, NULL, 0, frange_info }, { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.Good", NULL, NULL, 0, off_info }, -#if 0 - /* TODO: UPS.BatterySystem.Charger.PresentStatus.Used is related to ABM */ - { "BOOL", 0, 0, "UPS.BatterySystem.Charger.PresentStatus.Used", NULL, NULL, 0, off_info }, - /* FIXME: on Dell, the above requires an "AND" with "UPS.BatterySystem.Charger.Mode = 4 (ABM Resting)" */ -#endif { "BOOL", 0, 0, "UPS.PowerConverter.Input.[2].PresentStatus.Used", NULL, NULL, 0, bypass_auto_info }, /* Automatic bypass */ { "BOOL", 0, 0, "UPS.PowerConverter.Input.[4].PresentStatus.Used", NULL, NULL, 0, bypass_manual_info }, /* Manual bypass */ { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.FanFailure", NULL, NULL, 0, fanfail_info }, diff --git a/drivers/netvision-mib.c b/drivers/netvision-mib.c index 3b31e32..31801f7 100644 --- a/drivers/netvision-mib.c +++ b/drivers/netvision-mib.c @@ -4,6 +4,7 @@ * Copyright (C) * 2004 Thanos Chatziathanassiou * 2012 Manuel Bouyer + * 2015 Arnaud Quette * * 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 @@ -24,7 +25,7 @@ #include "netvision-mib.h" -#define NETVISION_MIB_VERSION "0.3" +#define NETVISION_MIB_VERSION "0.4" #define NETVISION_SYSOID ".1.3.6.1.4.1.4555.1.1.1" @@ -46,6 +47,13 @@ static info_lkp_t netvision_batt_info[] = { { 0, "NULL" } }; +/* Battery status: upsAlarmOnBattery */ +static info_lkp_t netvision_onbatt_info[] = { + { 0, "OL" }, /* Online */ + { 1, "OB" }, /* On battery */ + { 0, "NULL" } +}; + #define NETVISION_OID_SECONDSONBATTERY ".1.3.6.1.4.1.4555.1.1.1.1.2.2.0" #define NETVISION_OID_BATT_RUNTIME_REMAINING ".1.3.6.1.4.1.4555.1.1.1.1.2.3.0" #define NETVISION_OID_BATT_CHARGE ".1.3.6.1.4.1.4555.1.1.1.1.2.4.0" @@ -119,6 +127,9 @@ static snmp_info_t netvision_mib[] = { SU_FLAG_OK | SU_STATUS_BATT, &netvision_batt_info[0] }, { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, NETVISION_OID_OUTPUT_SOURCE, "", SU_FLAG_OK | SU_STATUS_PWR, &netvision_output_info[0] }, + /* upsAlarmOnBattery */ + { "ups.status", ST_FLAG_STRING, SU_INFOSIZE, ".1.3.6.1.4.1.4555.1.1.1.1.6.3.2.0", "", + SU_FLAG_OK | SU_STATUS_PWR, &netvision_onbatt_info[0] }, /* ups load */ { "ups.load", 0, 1, NETVISION_OID_OUT_LOAD_PCT_P1, 0, SU_INPUT_1, NULL }, diff --git a/drivers/nutdrv_qx.c b/drivers/nutdrv_qx.c index f27e89b..8b71a31 100644 --- a/drivers/nutdrv_qx.c +++ b/drivers/nutdrv_qx.c @@ -33,7 +33,7 @@ * */ -#define DRIVER_VERSION "0.06" +#define DRIVER_VERSION "0.17" #include "main.h" @@ -62,6 +62,7 @@ /* == Subdrivers == */ /* Include all known subdrivers */ +#include "nutdrv_qx_bestups.h" #include "nutdrv_qx_mecer.h" #include "nutdrv_qx_megatec.h" #include "nutdrv_qx_megatec-old.h" @@ -69,14 +70,17 @@ #include "nutdrv_qx_q1.h" #include "nutdrv_qx_voltronic.h" #include "nutdrv_qx_voltronic-qs.h" +#include "nutdrv_qx_voltronic-qs-hex.h" #include "nutdrv_qx_zinto.h" -/* Master list of avaiable subdrivers */ +/* Master list of available subdrivers */ static subdriver_t *subdriver_list[] = { &voltronic_subdriver, &voltronic_qs_subdriver, + &voltronic_qs_hex_subdriver, &mustek_subdriver, &megatec_old_subdriver, + &bestups_subdriver, &mecer_subdriver, &megatec_subdriver, &zinto_subdriver, @@ -439,9 +443,10 @@ static int cypress_command(const char *cmd, char *buf, size_t buflen) ret = usb_control_msg(udev, USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x09, 0x200, 0, &tmp[i], 8, 5000); if (ret <= 0) { - upsdebugx(3, "send: %s", ret ? usb_strerror() : "timeout"); + upsdebugx(3, "send: %s (%d)", ret ? usb_strerror() : "timeout", ret); return ret; } + } upsdebugx(3, "send: %.*s", (int)strcspn(tmp, "\r"), tmp); @@ -449,7 +454,7 @@ static int cypress_command(const char *cmd, char *buf, size_t buflen) /* Read reply */ memset(buf, 0, buflen); - for (i = 0; (i <= buflen-8) && (strchr(buf, '\r') == NULL); i += ret) { + for (i = 0; (i <= buflen-8) && (memchr(buf, '\r', buflen) == NULL); i += ret) { /* Read data in 8-byte chunks */ /* ret = usb->get_interrupt(udev, (unsigned char *)&buf[i], 8, 1000); */ @@ -457,9 +462,13 @@ static int cypress_command(const char *cmd, char *buf, size_t buflen) /* Any errors here mean that we are unable to read a reply (which will happen after successfully writing a command to the UPS) */ if (ret <= 0) { - upsdebugx(3, "read: %s", ret ? usb_strerror() : "timeout"); + upsdebugx(3, "read: %s (%d)", ret ? usb_strerror() : "timeout", ret); return ret; } + + snprintf(tmp, sizeof(tmp), "read [% 3d]", (int)i); + upsdebug_hex(5, tmp, &buf[i], ret); + } upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); @@ -490,11 +499,12 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) } if (ret < 0) { - upsdebugx(3, "flush: %s", usb_strerror()); + upsdebugx(3, "flush: %s (%d)", usb_strerror(), ret); break; } upsdebug_hex(4, "dump", tmp, ret); + } /* Send command */ @@ -508,9 +518,10 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) ret = usb_control_msg(udev, USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x09, 0x200, 0, &tmp[i], 8, 1000); if (ret <= 0) { - upsdebugx(3, "send: %s", ret ? usb_strerror() : "timeout"); + upsdebugx(3, "send: %s (%d)", ret ? usb_strerror() : "timeout", ret); return ret; } + } upsdebugx(3, "send: %.*s", (int)strcspn(tmp, "\r"), tmp); @@ -518,7 +529,7 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) /* Read reply */ memset(buf, 0, buflen); - for (i = 0; (i <= buflen-8) && (strchr(buf, '\r') == NULL); i += ret) { + for (i = 0; (i <= buflen-8) && (memchr(buf, '\r', buflen) == NULL); i += ret) { /* Read data in 8-byte chunks */ /* ret = usb->get_interrupt(udev, (unsigned char *)&buf[i], 8, 1000); */ @@ -526,9 +537,13 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) /* Any errors here mean that we are unable to read a reply (which will happen after successfully writing a command to the UPS) */ if (ret <= 0) { - upsdebugx(3, "read: %s", ret ? usb_strerror() : "timeout"); + upsdebugx(3, "read: %s (%d)", ret ? usb_strerror() : "timeout", ret); return ret; } + + snprintf(tmp, sizeof(tmp), "read [% 3d]", (int)i); + upsdebug_hex(5, tmp, &buf[i], ret); + } upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); @@ -539,8 +554,8 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) static int ippon_command(const char *cmd, char *buf, size_t buflen) { char tmp[64]; - int ret, len; - size_t i; + int ret; + size_t i, len; /* Send command */ snprintf(tmp, sizeof(tmp), "%s", cmd); @@ -551,9 +566,10 @@ static int ippon_command(const char *cmd, char *buf, size_t buflen) ret = usb_control_msg(udev, USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x09, 0x2, 0, &tmp[i], 8, 1000); if (ret <= 0) { - upsdebugx(3, "send: %s", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out"); + upsdebugx(3, "send: %s (%d)", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out", ret); return ret; } + } upsdebugx(3, "send: %.*s", (int)strcspn(tmp, "\r"), tmp); @@ -563,23 +579,36 @@ static int ippon_command(const char *cmd, char *buf, size_t buflen) /* Any errors here mean that we are unable to read a reply (which will happen after successfully writing a command to the UPS) */ if (ret <= 0) { - upsdebugx(3, "read: %s", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out"); + upsdebugx(3, "read: %s (%d)", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out", ret); return ret; } - /* - * As Ippon will always return 64 bytes in response, we have to - * calculate and return length of actual response data here. - * Empty response will look like 0x00 0x0D, otherwise it will be - * data string terminated by 0x0D. - */ - len = (int)strcspn(tmp, "\r"); - upsdebugx(3, "read: %.*s", len, tmp); - if (len > 0) { - len ++; + /* As Ippon will always return 64 bytes in response, we have to calculate and return length of actual response data here. + * Empty response will look like 0x00 0x0D, otherwise it will be data string terminated by 0x0D. */ + + for (i = 0, len = 0; i < (size_t)ret; i++) { + + if (tmp[i] != '\r') + continue; + + len = ++i; + break; + } - snprintf(buf, buflen, "%.*s", len, tmp); - return len; + + /* Just in case there wasn't any '\r', fallback to string length, if any */ + if (!len) + len = strlen(tmp); + + upsdebug_hex(5, "read", tmp, (int)len); + upsdebugx(3, "read: %.*s", (int)strcspn(tmp, "\r"), tmp); + + len = len < buflen ? len : buflen - 1; + + memset(buf, 0, buflen); + memcpy(buf, tmp, len); + + return (int)len; } /* Krauler communication subdriver */ @@ -623,13 +652,12 @@ static int krauler_command(const char *cmd, char *buf, size_t buflen) if (langid_fix != -1) { /* Apply langid_fix value */ ret = usb_get_string(udev, command[i].index, langid_fix, buf, buflen); - } - else { + } else { ret = usb_get_string_simple(udev, command[i].index, buf, buflen); } if (ret <= 0) { - upsdebugx(3, "read: %s", ret ? usb_strerror() : "timeout"); + upsdebugx(3, "read: %s (%d)", ret ? usb_strerror() : "timeout", ret); return ret; } @@ -673,7 +701,9 @@ static int krauler_command(const char *cmd, char *buf, size_t buflen) /* Replace the first byte of what we received with the correct one */ buf[0] = command[i].prefix; + upsdebug_hex(5, "read", buf, ret); upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); + return ret; } @@ -687,6 +717,219 @@ static int krauler_command(const char *cmd, char *buf, size_t buflen) return snprintf(buf, buflen, "%s", cmd); } +/* Fabula communication subdriver */ +static int fabula_command(const char *cmd, char *buf, size_t buflen) +{ + const struct { + const char *str; /* Megatec command */ + const int index; /* Fabula string index for this command */ + } commands[] = { + { "Q1\r", 0x03, }, /* Status */ + { "F\r", 0x0d, }, /* Ratings */ + { "I\r", 0x0c, }, /* Vendor infos */ + { "Q\r", 0x07, }, /* Beeper toggle */ + { "C\r", 0x0a, }, /* Cancel shutdown/Load on [0x(0..F)A]*/ + { NULL } + }; + int i, ret, index = 0; + + upsdebugx(3, "send: %.*s", (int)strcspn(cmd, "\r"), cmd); + + for (i = 0; commands[i].str; i++) { + + if (strcmp(cmd, commands[i].str)) + continue; + + index = commands[i].index; + break; + + } + + if (!index) { + + int val2 = -1; + double val1 = -1; + + /* Shutdowns */ + if ( + sscanf(cmd, "S%lfR%d\r", &val1, &val2) == 2 || + sscanf(cmd, "S%lf\r", &val1) == 1 + ) { + + double delay; + + /* 0x(1+)0 -> shutdown.stayoff (SnR0000) + * 0x(1+)8 -> shutdown.return (Sn[Rm], m != 0) [delay before restart is always 10 seconds] + * +0x10 (16dec) = next megatec delay (min .5 = hex 0x1*; max 10 = hex 0xF*) -> n < 1 ? -> n += .1; n >= 1 ? -> n += 1 */ + + /* delay: [.5..10] (-> seconds: [30..600]) */ + delay = val1 < .5 ? .5 : val1 > 10 ? 10 : val1; + + if (delay < 1) + index = 16 + round((delay - .5) * 10) * 16; + else + index = 96 + (delay - 1) * 16; + + /* shutdown.return (Sn[Rm], m != 0) */ + if (val2) + index += 8; + + /* Unknown commands */ + } else { + + /* Echo the unknown command back */ + upsdebugx(3, "read: %.*s", (int)strcspn(cmd, "\r"), cmd); + return snprintf(buf, buflen, "%s", cmd); + + } + + } + + upsdebugx(4, "command index: 0x%02x", index); + + /* Send command/Read reply */ + ret = usb_get_string_simple(udev, index, buf, buflen); + + if (ret <= 0) { + upsdebugx(3, "read: %s (%d)", ret ? usb_strerror() : "timeout", ret); + return ret; + } + + upsdebug_hex(5, "read", buf, ret); + upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); + + /* The UPS always replies "UPS No Ack" when a supported command is issued (either if it fails or if it succeeds).. */ + if (!strcasecmp(buf, "UPS No Ack")) + /* ..because of that, always return 0 (as if it was a timeout): queries will see it as a failure, instant commands ('megatec' protocol) as a success */ + return 0; + + return ret; +} + +/* Fuji communication subdriver */ +static int fuji_command(const char *cmd, char *buf, size_t buflen) +{ + unsigned char tmp[8]; + char command[SMALLBUF] = "", + read[SMALLBUF] = ""; + int ret, answer_len, val2; + double val1; + size_t i; + const struct { + const char *command; /* Megatec command */ + const int answer_len; /* Expected length of the answer to the ongoing query */ + } query[] = { + { "Q1", 47 }, + { "F", 22 }, + { "I", 39 }, + { NULL } + }; + + /* + * Queries (b1..b8) sent (as a 8-bytes interrupt) to the UPS adopt the following scheme: + * + * b1: 0x80 + * b2: 0x06 + * b3: + * b4: 0x03 + * b5..bn: + * bn+1..b7: [] + * b8: + * + * Where: + * Length (in Hex) of the command (without the trailing CR) + 1 + * Command/query (without the trailing CR) + * [] 0x00 padding to the 7th byte + * Expected length (in Hex) of the answer to the ongoing query (0 when no reply is expected, i.e. commands) + * + * Replies to queries (commands are followed by action without any reply) are sent from the UPS (in 8-byte chunks) with 0x00 padding after the trailing CR to full 8 bytes. + * + */ + + /* Send command */ + + /* Remove the CR */ + snprintf(command, sizeof(command), "%.*s", (int)strcspn(cmd, "\r"), cmd); + + /* Length of the command that will be sent to the UPS can be at most: 8 - 5 (0x80, 0x06, , 0x03, ) = 3. + * As a consequence also 'SnRm' commands (shutdown.{return,stayoff} and load.off) are not supported. + * So, map all the 'SnRm' shutdown.returns (m != 0) as the corresponding 'Sn' commands, meanwhile ignoring ups.delay.start and making the UPS turn on the load as soon as power is back. */ + if (sscanf(cmd, "S%lfR%d\r", &val1, &val2) == 2 && val2) { + upsdebugx(4, "%s: trimming '%s' to '%.*s'", __func__, command, 3, command); + command[3] = 0; + } + /* Too long command */ + if (strlen(command) > 3) { + /* Be 'megatec-y': echo the unsupported command back */ + upsdebugx(3, "%s: unsupported command %s", __func__, command); + return snprintf(buf, buflen, "%s", cmd); + } + + /* Expected length of the answer to the ongoing query (0 when no reply is expected, i.e. commands) */ + answer_len = 0; + for (i = 0; query[i].command; i++) { + + if (strcmp(command, query[i].command)) + continue; + + answer_len = query[i].answer_len; + break; + + } + + memset(tmp, 0, sizeof(tmp)); + + /* 0x80 */ + tmp[0] = 0x80; + /* 0x06 */ + tmp[1] = 0x06; + /* */ + tmp[2] = strlen(command) + 1; + /* 0x03 */ + tmp[3] = 0x03; + /* */ + memcpy(&tmp[4], command, strlen(command)); + /* */ + tmp[7] = answer_len; + + upsdebug_hex(4, "command", (char *)tmp, 8); + + /* Write data */ + ret = usb_interrupt_write(udev, USB_ENDPOINT_OUT | 2, (char *)tmp, 8, USB_TIMEOUT); + + if (ret <= 0) { + upsdebugx(3, "send: %s (%d)", ret ? usb_strerror() : "timeout", ret); + return ret; + } + + upsdebugx(3, "send: %s", command); + + /* Read reply */ + + memset(buf, 0, buflen); + + for (i = 0; (i <= buflen - 8) && (memchr(buf, '\r', buflen) == NULL); i += ret) { + + /* Read data in 8-byte chunks */ + ret = usb_interrupt_read(udev, USB_ENDPOINT_IN | 1, &buf[i], 8, 1000); + + /* Any errors here mean that we are unable to read a reply (which will happen after successfully writing a command to the UPS) */ + if (ret <= 0) { + upsdebugx(3, "read: %s (%d)", ret ? usb_strerror() : "timeout", ret); + return ret; + } + + snprintf(read, sizeof(read), "read [%3d]", (int)i); + upsdebug_hex(5, read, &buf[i], ret); + + } + + upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); + + /* As Fuji units return the reply in 8-byte chunks always padded to the 8th byte with 0x00, we need to calculate and return the length of the actual response here. */ + return (int)strlen(buf); +} + static void *cypress_subdriver(USBDevice_t *device) { subdriver_command = &cypress_command; @@ -711,31 +954,87 @@ static void *phoenix_subdriver(USBDevice_t *device) return NULL; } -/* USB VendorID/ProductID match - note: rightmost comment is used for naming rules by tools/nut-usbinfo.pl */ -static usb_device_id_t qx_usb_id[] = { - { USB_DEVICE(0x05b8, 0x0000), &cypress_subdriver }, /* Agiler UPS */ - { USB_DEVICE(0x0001, 0x0000), &krauler_subdriver }, /* Krauler UP-M500VA */ - { USB_DEVICE(0xffff, 0x0000), &krauler_subdriver }, /* Ablerex 625L USB */ - { USB_DEVICE(0x0665, 0x5161), &cypress_subdriver }, /* Belkin F6C1200-UNV/Voltronic Power UPSes */ - { USB_DEVICE(0x06da, 0x0002), &cypress_subdriver }, /* Online Yunto YQ450 */ - { USB_DEVICE(0x06da, 0x0003), &ippon_subdriver }, /* Mustek Powermust */ - { USB_DEVICE(0x06da, 0x0004), &cypress_subdriver }, /* Phoenixtec Innova 3/1 T */ - { USB_DEVICE(0x06da, 0x0005), &cypress_subdriver }, /* Phoenixtec Innova RT */ - { USB_DEVICE(0x06da, 0x0201), &cypress_subdriver }, /* Phoenixtec Innova T */ - { USB_DEVICE(0x06da, 0x0601), &phoenix_subdriver }, /* Online Zinto A */ - { USB_DEVICE(0x0f03, 0x0001), &cypress_subdriver }, /* Unitek Alpha 1200Sx */ - { USB_DEVICE(0x14f0, 0x00c9), &phoenix_subdriver }, /* GE EP series */ +static void *fabula_subdriver(USBDevice_t *device) +{ + subdriver_command = &fabula_command; + return NULL; +} + +static void *fuji_subdriver(USBDevice_t *device) +{ + subdriver_command = &fuji_command; + return NULL; +} + +/* USB device match structure */ +typedef struct { + const int vendorID; /* USB device's VendorID */ + const int productID; /* USB device's ProductID */ + const char *vendor; /* USB device's iManufacturer string */ + const char *product; /* USB device's iProduct string */ + void *(*fun)(USBDevice_t *); /* Handler for specific processing */ +} qx_usb_device_id_t; + +/* USB VendorID/ProductID/iManufacturer/iProduct match - note: rightmost comment is used for naming rules by tools/nut-usbinfo.pl */ +static qx_usb_device_id_t qx_usb_id[] = { + { USB_DEVICE(0x05b8, 0x0000), NULL, NULL, &cypress_subdriver }, /* Agiler UPS */ + { USB_DEVICE(0xffff, 0x0000), NULL, NULL, &krauler_subdriver }, /* Ablerex 625L USB */ + { USB_DEVICE(0x0665, 0x5161), NULL, NULL, &cypress_subdriver }, /* Belkin F6C1200-UNV/Voltronic Power UPSes */ + { USB_DEVICE(0x06da, 0x0002), NULL, NULL, &cypress_subdriver }, /* Online Yunto YQ450 */ + { USB_DEVICE(0x06da, 0x0003), NULL, NULL, &ippon_subdriver }, /* Mustek Powermust */ + { USB_DEVICE(0x06da, 0x0004), NULL, NULL, &cypress_subdriver }, /* Phoenixtec Innova 3/1 T */ + { USB_DEVICE(0x06da, 0x0005), NULL, NULL, &cypress_subdriver }, /* Phoenixtec Innova RT */ + { USB_DEVICE(0x06da, 0x0201), NULL, NULL, &cypress_subdriver }, /* Phoenixtec Innova T */ + { USB_DEVICE(0x06da, 0x0601), NULL, NULL, &phoenix_subdriver }, /* Online Zinto A */ + { USB_DEVICE(0x0f03, 0x0001), NULL, NULL, &cypress_subdriver }, /* Unitek Alpha 1200Sx */ + { USB_DEVICE(0x14f0, 0x00c9), NULL, NULL, &phoenix_subdriver }, /* GE EP series */ + { USB_DEVICE(0x0001, 0x0000), "MEC", "MEC0003", &fabula_subdriver }, /* Fideltronik/MEC LUPUS 500 USB */ + { USB_DEVICE(0x0001, 0x0000), "ATCL FOR UPS", "ATCL FOR UPS", &fuji_subdriver }, /* Fuji UPSes */ + { USB_DEVICE(0x0001, 0x0000), NULL, NULL, &krauler_subdriver }, /* Krauler UP-M500VA */ /* End of list */ - { -1, -1, NULL } + { -1, -1, NULL, NULL, NULL } }; +static int qx_is_usb_device_supported(qx_usb_device_id_t *usb_device_id_list, USBDevice_t *device) +{ + int retval = NOT_SUPPORTED; + qx_usb_device_id_t *usbdev; + + for (usbdev = usb_device_id_list; usbdev->vendorID != -1; usbdev++) { + + if (usbdev->vendorID != device->VendorID) + continue; + + /* Flag as possibly supported if we see a known vendor */ + retval = POSSIBLY_SUPPORTED; + + if (usbdev->productID != device->ProductID) + continue; + + if (usbdev->vendor && (!device->Vendor || strcasecmp(usbdev->vendor, device->Vendor))) + continue; + + if (usbdev->product && (!device->Product || strcasecmp(usbdev->product, device->Product))) + continue; + + /* Call the specific handler, if it exists */ + if (usbdev->fun != NULL) + (*usbdev->fun)(device); + + return SUPPORTED; + + } + + return retval; +} + static int device_match_func(USBDevice_t *hd, void *privdata) { if (subdriver_command) { return 1; } - switch (is_usb_device_supported(qx_usb_id, hd)) + switch (qx_is_usb_device_supported(qx_usb_id, hd)) { case SUPPORTED: return 1; @@ -837,7 +1136,7 @@ int instcmd(const char *cmdname, const char *extradata) return STAT_INSTCMD_INVALID; } - /* If extradata is empty, use the default value from the blazer to NUT table */ + /* If extradata is empty, use the default value from the QX to NUT table */ extradata = extradata ? extradata : item->dfl; snprintf(value, sizeof(value), "%s", extradata ? extradata : ""); @@ -1264,14 +1563,8 @@ void upsdrv_makevartable(void) #ifdef QX_USB addvar(VAR_VALUE, "subdriver", "Serial-over-USB subdriver selection"); - addvar(VAR_VALUE, "vendorid", "Regular expression to match UPS Manufacturer numerical ID (4 digits hexadecimal)"); - addvar(VAR_VALUE, "productid", "Regular expression to match UPS Product numerical ID (4 digits hexadecimal)"); - - addvar(VAR_VALUE, "vendor", "Regular expression to match UPS Manufacturer string"); - addvar(VAR_VALUE, "product", "Regular expression to match UPS Product string"); - addvar(VAR_VALUE, "serial", "Regular expression to match UPS Serial number"); - - addvar(VAR_VALUE, "bus", "Regular expression to match USB bus name"); + /* allow -x vendor=X, vendorid=X, product=X, productid=X, serial=X */ + nut_usb_addvars(); addvar(VAR_VALUE, "langid_fix", "Apply the language ID workaround to the krauler subdriver (0x409 or 0x4095)"); #endif /* QX_USB */ @@ -1545,6 +1838,8 @@ void upsdrv_initups(void) { "phoenix", &phoenix_command }, { "ippon", &ippon_command }, { "krauler", &krauler_command }, + { "fabula", &fabula_command }, + { "fuji", &fuji_command }, { NULL } }; @@ -1794,7 +2089,7 @@ static int qx_command(const char *cmd, char *buf, size_t buflen) ret = ser_send(upsfd, "%s", cmd); if (ret <= 0) { - upsdebugx(3, "send: %s", ret ? strerror(errno) : "timeout"); + upsdebugx(3, "send: %s (%d)", ret ? strerror(errno) : "timeout", ret); return ret; } @@ -1803,10 +2098,11 @@ static int qx_command(const char *cmd, char *buf, size_t buflen) ret = ser_get_buf(upsfd, buf, buflen, SER_WAIT_SEC, 0); if (ret <= 0) { - upsdebugx(3, "read: %s", ret ? strerror(errno) : "timeout"); + upsdebugx(3, "read: %s (%d)", ret ? strerror(errno) : "timeout", ret); return ret; } + upsdebug_hex(5, "read", buf, ret); upsdebugx(3, "read: '%.*s'", (int)strcspn(buf, "\r"), buf); #ifdef QX_USB @@ -1833,6 +2129,22 @@ static int qx_command(const char *cmd, char *buf, size_t buflen) } upsdebugx(3, "read: '%.*s'", (int)strcspn(testing[i].answer, "\r"), testing[i].answer); + + /* If requested to do so and this is the case, try to preserve inner '\0's (treat answer as a sequence of bytes) */ + if (testing[i].answer_len > 0 && strlen(testing[i].answer) < (size_t)testing[i].answer_len) { + + size_t len; + + len = buflen <= (size_t)testing[i].answer_len ? buflen - 1 : (size_t)testing[i].answer_len; + len = len <= sizeof(testing[i].answer) ? len : sizeof(testing[i].answer); + + memcpy(buf, testing[i].answer, len); + upsdebug_hex(4, "read", buf, (int)len); + + return len; + + } + return snprintf(buf, buflen, "%s", testing[i].answer); } @@ -2038,6 +2350,10 @@ static bool_t qx_ups_walk(walkmode_t mode) batt.chrg.act = -1; } + /* Clear data from previous_item */ + memset(previous_item.command, 0, sizeof(previous_item.command)); + memset(previous_item.answer, 0, sizeof(previous_item.answer)); + /* 3 modes: QX_WALKMODE_INIT, QX_WALKMODE_QUICK_UPDATE and QX_WALKMODE_FULL_UPDATE */ /* Device data walk */ @@ -2133,15 +2449,22 @@ static bool_t qx_ups_walk(walkmode_t mode) retcode = qx_process_answer(item, strlen(item->answer)); /* ..otherwise: execute command to get answer from the UPS */ - } else + } else { + retcode = qx_process(item, NULL); + } + /* Record item as previous_item */ snprintf(previous_item.command, sizeof(previous_item.command), "%s", item->command); snprintf(previous_item.answer, sizeof(previous_item.answer), "%s", item->answer); if (retcode) { + /* Clear data from the item */ + memset(item->answer, 0, sizeof(item->answer)); + memset(item->value, 0, sizeof(item->value)); + if (item->qxflags & QX_FLAG_QUICK_POLL) return FALSE; @@ -2149,10 +2472,6 @@ static bool_t qx_ups_walk(walkmode_t mode) /* Skip this item from now on */ item->qxflags |= QX_FLAG_SKIP; - /* Clear data from the item */ - snprintf(item->answer, sizeof(item->answer), "%s", ""); - snprintf(item->value, sizeof(item->value), "%s", ""); - /* Don't know what happened, try again later... */ continue; @@ -2162,13 +2481,19 @@ static bool_t qx_ups_walk(walkmode_t mode) retcode = ups_infoval_set(item); /* Clear data from the item */ - snprintf(item->answer, sizeof(item->answer), "%s", ""); - snprintf(item->value, sizeof(item->value), "%s", ""); + memset(item->answer, 0, sizeof(item->answer)); + memset(item->value, 0, sizeof(item->value)); /* Uh-oh! Some error! */ - if (retcode == -1) + if (retcode == -1) { + + if (item->qxflags & QX_FLAG_QUICK_POLL) + return FALSE; + continue; + } + /* Set var flags/range/enum (not for ups.{alarm.status}, hence the retcode check) */ if (retcode && mode == QX_WALKMODE_INIT) { qx_set_var(item); @@ -2176,10 +2501,6 @@ static bool_t qx_ups_walk(walkmode_t mode) } - /* Clear data from previous_item */ - snprintf(previous_item.command, sizeof(previous_item.command), "%s", ""); - snprintf(previous_item.answer, sizeof(previous_item.answer), "%s", ""); - /* Update battery guesstimation */ if (mode == QX_WALKMODE_FULL_UPDATE && (batt.runt.act == -1 || batt.chrg.act == -1)) { @@ -2345,14 +2666,26 @@ int qx_process(item_t *item, const char *command) /* Send the command */ int len = qx_command(command ? command : item->command, buf, sizeof(buf)); - snprintf(item->answer, sizeof(item->answer), "%s", buf); + memset(item->answer, 0, sizeof(item->answer)); + memcpy(item->answer, buf, sizeof(item->answer) <= sizeof(buf) ? sizeof(item->answer) - 1 : sizeof(buf)); + + /* Preprocess the answer */ + if (item->preprocess_answer != NULL) { + len = item->preprocess_answer(item, len); + if (len == -1) { + upsdebugx(4, "%s: failed to preprocess answer [%s]", __func__, item->info_type); + return -1; + } + } /* Process the answer to get the value */ return qx_process_answer(item, len); } -/* Process the value we got back (set status bits and set the value of other parameters). */ -/* Return -1 on failure, 0 for a status update and 1 in all other cases */ +/* Process the value we got back (set status bits and set the value of other parameters) and execute: + * - item-specific preprocessing, if any, otherwise + * - the standard preprocessing (including trimming if QX_FLAG_TRIM is set). + * Return -1 on failure, 0 for a status update and 1 in all other cases */ int ups_infoval_set(item_t *item) { char value[SMALLBUF] = ""; @@ -2385,35 +2718,8 @@ int ups_infoval_set(item_t *item) snprintf(value, sizeof(value), "%s", item->value); /* Cover most of the cases: either left/right filled with hashes, spaces or a mix of both */ - if (item->qxflags & QX_FLAG_TRIM) { - - char buf[SMALLBUF]; - - snprintf(buf, sizeof(buf), "%s", ltrim(value, ' ')); - snprintf(value, sizeof(value), "%s", buf); - - snprintf(buf, sizeof(buf), "%s", rtrim(value, ' ')); - snprintf(value, sizeof(value), "%s", buf); - - snprintf(buf, sizeof(buf), "%s", ltrim(value, '#')); - snprintf(value, sizeof(value), "%s", buf); - - snprintf(buf, sizeof(buf), "%s", rtrim(value, '#')); - snprintf(value, sizeof(value), "%s", buf); - - snprintf(buf, sizeof(buf), "%s", ltrim(value, ' ')); - snprintf(value, sizeof(value), "%s", buf); - - snprintf(buf, sizeof(buf), "%s", rtrim(value, ' ')); - snprintf(value, sizeof(value), "%s", buf); - - snprintf(buf, sizeof(buf), "%s", ltrim(value, '#')); - snprintf(value, sizeof(value), "%s", buf); - - snprintf(buf, sizeof(buf), "%s", rtrim(value, '#')); - snprintf(value, sizeof(value), "%s", buf); - - } + if (item->qxflags & QX_FLAG_TRIM) + rtrim_m(ltrim_m(value, "# "), "# "); if (strcasecmp(item->dfl, "%s")) { diff --git a/drivers/nutdrv_qx.h b/drivers/nutdrv_qx.h index b904689..7672c76 100644 --- a/drivers/nutdrv_qx.h +++ b/drivers/nutdrv_qx.h @@ -71,7 +71,8 @@ typedef struct item_t { * If QX_FLAG_SETVAR is set the value given by the user will be checked against these infos. */ const char *command; /* Command sent to the UPS to get answer/to execute an instant command/to set a variable */ - char answer[SMALLBUF]; /* Answer from the UPS, filled at runtime */ + char answer[SMALLBUF]; /* Answer from the UPS, filled at runtime. + * If you expect a nonvalid C string (e.g.: inner '\0's) or need to perform actions before the answer is used (and treated as a null-terminated string), you should set a preprocess_answer() function */ const int answer_len; /* Expected min length of the answer. Set it to 0 if there’s no minimum length to look after. */ const char leading; /* Expected leading character of the answer (optional) */ @@ -87,6 +88,10 @@ typedef struct item_t { unsigned long qxflags; /* Driver's own flags */ + int (*preprocess_answer)(struct item_t *item, const int len); /* Function to preprocess the answer we got from the UPS before we do anything else (e.g. for CRC, decoding, ...) + * This function is given the currently processed item (item) with the answer we got from the UPS unmolested and already stored in item->answer and the length of that answer (len). + * Return -1 in case of errors, else the length of the newly allocated item->answer (from now on, treated as a null-terminated string). */ + int (*preprocess)(struct item_t *item, char *value, size_t valuelen); /* Function to preprocess the data from/to the UPS * This function is given the currently processed item (item), a char array (value) and its size_t (valuelen). * Return -1 in case of errors, else 0. @@ -111,11 +116,17 @@ typedef struct item_t { #define MAXTRIES 3 /* Max number of retries */ +#ifdef TESTING /* Testing struct */ typedef struct { - const char *cmd; /* Command to match */ - const char *answer; /* Answer for that command */ + const char *cmd; /* Command to match */ + const char answer[SMALLBUF]; /* Answer for that command. + * Note: if 'answer' contains inner '\0's, in order to preserve them, 'answer_len' as well as an item_t->preprocess_answer() function must be set */ + const int answer_len; /* Answer length: + * - if set to -1 -> auto calculate answer length (treat 'answer' as a null-terminated string) + * - otherwise -> use the provided length (if reasonable) and preserve inner '\0's (treat 'answer' as a sequence of bytes till the item_t->preprocess_answer() function gets called) */ } testing_t; +#endif /* TESTING */ /* Subdriver interface */ typedef struct { @@ -148,7 +159,8 @@ int setvar(const char *varname, const char *val); item_t *find_nut_info(const char *varname, const unsigned long flag, const unsigned long noflag); /* Send 'command' or, if it is NULL, send the command stored in the item to the UPS and process the reply. Return -1 on errors, 0 on success. */ int qx_process(item_t *item, const char *command); - /* Process the value we got back from the UPS (set status bits and set the value of other parameters), calling its preprocess function, if any. Return -1 on failure, 0 for a status update and 1 in all other cases. */ + /* Process the value we got back from the UPS (set status bits and set the value of other parameters), calling its preprocess function, if any, otherwise executing the standard preprocessing (including trimming if QX_FLAG_TRIM is set). + * Return -1 on failure, 0 for a status update and 1 in all other cases. */ int ups_infoval_set(item_t *item); /* Return the currently processed status so that it can be checked with one of the status_bit_t passed to the STATUS() macro. */ int qx_status(void); diff --git a/drivers/nutdrv_qx_bestups.c b/drivers/nutdrv_qx_bestups.c new file mode 100644 index 0000000..1e15b27 --- /dev/null +++ b/drivers/nutdrv_qx_bestups.c @@ -0,0 +1,705 @@ +/* nutdrv_qx_bestups.c - Subdriver for Best Power/Sola Australia UPSes + * + * Copyright (C) + * 2014 Daniele Pezzini + * Based on: + * bestups.c - Copyright (C) + * 1999 Russell Kroll + * Jason White + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "main.h" +#include "nutdrv_qx.h" +#include "nutdrv_qx_blazer-common.h" + +#include "nutdrv_qx_bestups.h" + +#define BESTUPS_VERSION "BestUPS 0.04" + +/* Support functions */ +static int bestups_claim(void); +static void bestups_initups(void); +static void bestups_makevartable(void); + +/* Answer preprocess functions */ +static int bestups_preprocess_id_answer(item_t *item, const int len); + +/* Preprocess functions */ +static int bestups_process_setvar(item_t *item, char *value, size_t valuelen); +static int bestups_process_bbb_status_bit(item_t *item, char *value, size_t valuelen); +static int bestups_manufacturer(item_t *item, char *value, size_t valuelen); +static int bestups_model(item_t *item, char *value, size_t valuelen); +static int bestups_batt_runtime(item_t *item, char *value, size_t valuelen); +static int bestups_batt_packs(item_t *item, char *value, size_t valuelen); +static int bestups_get_pins_shutdown_mode(item_t *item, char *value, size_t valuelen); +static int bestups_voltage_settings(item_t *item, char *value, size_t valuelen); + +/* ups.conf settings */ +static int pins_shutdown_mode; + +/* General settings */ +static int inverted_bbb_bit = 0; + + +/* == Ranges/enums == */ + +/* Range for ups.delay.start */ +info_rw_t bestups_r_ondelay[] = { + { "60", 0 }, + { "599940", 0 }, + { "", 0 } +}; + +/* Range for ups.delay.shutdown */ +static info_rw_t bestups_r_offdelay[] = { + { "12", 0 }, + { "5940", 0 }, + { "", 0 } +}; + +/* Range for number of battery packs */ +static info_rw_t bestups_r_batt_packs[] = { + { "0", 0 }, + { "5", 0 }, + { "", 0 } +}; + +/* Range for pin shutdown mode */ +static info_rw_t bestups_r_pins_shutdown_mode[] = { + { "0", 0 }, + { "6", 0 }, + { "", 0 } +}; + + +/* == qx2nut lookup table == */ +static item_t bestups_qx2nut[] = { + + /* Query UPS for status + * > [Q1\r] + * < [(226.0 195.0 226.0 014 49.0 27.5 30.0 00001000\r] + * 01234567890123456789012345678901234567890123456 + * 0 1 2 3 4 + */ + + { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, + /* Status bits */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ +/* { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, *//* Beeper status: not supported; always 0 */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, bestups_process_bbb_status_bit }, /* Bypass/Boost or Buck Active - keep this one at the end as it needs the processed data from the previous items */ + + /* Query UPS for ratings and model infos + * > [ID\r] + * < [FOR,750,120,120,20.0,27.6\r] case #1: length = 26 + * < [FOR,1500,120,120,20.0,27.6\r] case #2: length = 27 + * < [FOR,3000,120,120,20.0,100.6\r] case #3: length = 28 + * < [FOR, 750,120,120,20.0, 27.6\r] after being preprocessed: length = 28 + * 0123456789012345678901234567 + * 0 1 2 + */ + + { "device.mfr", 0, NULL, "ID\r", "", 28, 0, "", 0, 2, "%s", QX_FLAG_STATIC, bestups_preprocess_id_answer, bestups_manufacturer }, + { "device.model", 0, NULL, "ID\r", "", 28, 0, "", 0, 2, "%s", QX_FLAG_STATIC, bestups_preprocess_id_answer, bestups_model }, + { "ups.power.nominal", 0, NULL, "ID\r", "", 28, 0, "", 4, 7, "%.0f", QX_FLAG_STATIC, bestups_preprocess_id_answer, NULL }, + { "input.voltage.nominal", 0, NULL, "ID\r", "", 28, 0, "", 9, 11, "%.0f", QX_FLAG_STATIC, bestups_preprocess_id_answer, NULL }, + { "output.voltage.nominal", 0, NULL, "ID\r", "", 28, 0, "", 13, 15, "%.0f", QX_FLAG_STATIC, bestups_preprocess_id_answer, NULL }, + { "battery.voltage.low", 0, NULL, "ID\r", "", 28, 0, "", 17, 20, "%.1f", QX_FLAG_SEMI_STATIC, bestups_preprocess_id_answer, NULL }, + { "battery.voltage.high", 0, NULL, "ID\r", "", 28, 0, "", 22, 26, "%.1f", QX_FLAG_SEMI_STATIC, bestups_preprocess_id_answer, NULL }, + + /* Query UPS for battery runtime (not available on the Patriot Pro/Sola 320 model series) + * > [RT\r] + * < [025\r] + * 0123 + * 0 + */ + + { "battery.runtime", 0, NULL, "RT\r", "", 4, 0, "", 0, 2, "%.0f", QX_FLAG_SKIP, NULL, bestups_batt_runtime }, + + /* Query UPS for number of battery packs (available only on the Axxium/Sola 620 model series) + * > [BP?\r] + * < [02\r] + * 012 + * 0 + */ + + { "battery.packs", ST_FLAG_RW, bestups_r_batt_packs, "BP?\r", "", 3, 0, "", 0, 1, "%d", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, bestups_batt_packs }, + + /* Set number of battery packs to n (integer, 0-5) (available only on the Axxium/Sola 620 model series) + * > [BPn\r] + * < [] + */ + + { "battery.packs", 0, bestups_r_batt_packs, "BP%.0f\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, bestups_process_setvar }, + + /* Query UPS for shutdown mode functionality of Pin 1 and Pin 7 on the UPS DB9 communication port (Per Best Power’s EPS-0059) + * > [SS?\r] + * < [0\r] + * 01 + * 0 + */ + + { "pins_shutdown_mode", ST_FLAG_RW, bestups_r_pins_shutdown_mode, "SS?\r", "", 2, 0, "", 0, 0, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT, NULL, bestups_get_pins_shutdown_mode }, + + /* Set shutdown mode functionality of Pin 1 and Pin 7 on the UPS DB9 communication port (Per Best Power’s EPS-0059) to n (integer, 0-6) + * > [SSn\r] + * < [] + */ + + { "pins_shutdown_mode", 0, bestups_r_pins_shutdown_mode, "SS%.0f\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, bestups_process_setvar }, + + /* Query UPS for voltage settings + * > [M\r] + * < [0\r] + * 01 + * 0 + */ + + { "input.transfer.low", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + { "input.transfer.boost.low", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + { "input.transfer.boost.high", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + { "input.voltage.nominal", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + { "output.voltage.nominal", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + { "input.transfer.trim.low", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + { "input.transfer.trim.high", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + { "input.transfer.high", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%d", 0, NULL, bestups_voltage_settings }, + + /* Instant commands */ + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + + /* Server-side settable vars */ + { "ups.delay.start", ST_FLAG_RW, bestups_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, bestups_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + + /* End of structure. */ + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } +}; + + +/* == Testing table == */ +#ifdef TESTING +static testing_t bestups_testing[] = { + { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00100000\r", -1 }, + { "ID\r", "FOR,750,120,120,20.0,27.6\r", -1 }, + { "RT\r", "015\r", -1 }, + { "BP?\r", "02\r", -1 }, + { "BP1\r", "", -1 }, + { "SS?\r", "0\r", -1 }, + { "SS2\r", "", -1 }, + { "M\r", "0\r", -1 }, + { "S03\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0001\r", "", -1 }, + { "T04\r", "", -1 }, + { "TL\r", "", -1 }, + { "T\r", "", -1 }, + { "CT\r", "", -1 }, + { NULL } +}; +#endif /* TESTING */ + + +/* == Support functions == */ + +/* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. */ +static int bestups_claim(void) +{ + /* We need at least Q1 and ID to run this subdriver */ + + item_t *item = find_nut_info("input.voltage", 0, 0); + + /* Don't know what happened */ + if (!item) + return 0; + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) + return 0; + + /* Unable to process value */ + if (ups_infoval_set(item) != 1) + return 0; + + /* UPS Model */ + item = find_nut_info("device.model", 0, 0); + + /* Don't know what happened */ + if (!item) { + dstate_delinfo("input.voltage"); + return 0; + } + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) { + dstate_delinfo("input.voltage"); + return 0; + } + + /* Unable to process value */ + if (ups_infoval_set(item) != 1) { + dstate_delinfo("input.voltage"); + return 0; + } + + return 1; +} + +/* Subdriver-specific initups */ +static void bestups_initups(void) +{ + blazer_initups_light(bestups_qx2nut); +} + +/* Subdriver-specific flags/vars */ +static void bestups_makevartable(void) +{ + addvar(VAR_VALUE, "pins_shutdown_mode", "Set shutdown mode functionality of Pin 1 and Pin 7 on the UPS DB9 communication port (Per Best Power’s EPS-0059) to n (integer, 0-6)"); + + blazer_makevartable_light(); +} + + +/* == Answer preprocess functions == */ + +/* Preprocess the answer we got back from the UPS when queried with 'ID\r': make data begin always at the same indexes */ +static int bestups_preprocess_id_answer(item_t *item, const int len) +{ + int i; + char refined[SMALLBUF] = "", + rawval[SMALLBUF] = "", + *token, + *saveptr = NULL; + + if (len <= 0) + return len; + + if (len < 25 || len > 27) { + upsdebugx(4, "%s: wrong length [%s: %d]", __func__, item->info_type, len); + return -1; + } + + /* e.g.: + * 1. item->answer = "FOR,750,120,120,20.0,27.6\r"; len = 26 + * 2. item->answer = "FOR,1500,120,120,20.0,27.6\r"; len = 27 + * 3. item->answer = "FOR,3000,120,120,20.0,100.6\r"; len = 28 */ + upsdebugx(4, "read: '%.*s'", (int)strcspn(item->answer, "\r"), item->answer); + + snprintf(rawval, sizeof(rawval), "%s", item->answer); + + for (i = 1, token = strtok_r(rawval, ",", &saveptr); token != NULL; i++, token = strtok_r(NULL, ",", &saveptr)) { + + switch (i) + { + case 1: + snprintf(refined, sizeof(refined), "%s", token); + continue; + case 2: /* Output power */ + snprintfcat(refined, sizeof(refined), ",%4s", token); + continue; + case 6: /* Battery voltage at full charge (+ trailing CR) */ + snprintfcat(refined, sizeof(refined), ",%6s", token); + continue; + default: + snprintfcat(refined, sizeof(refined), ",%s", token); + } + + } + + if (i != 7 || strlen(refined) != 28) { + upsdebugx(2, "noncompliant reply: '%.*s'", (int)strcspn(refined, "\r"), refined); + return -1; + } + + upsdebugx(4, "read: '%.*s'", (int)strcspn(refined, "\r"), refined); + + /* e.g.: item->answer = "FOR, 750,120,120,20.0, 27.6\r"; len = 28 */ + return snprintf(item->answer, sizeof(item->answer), "%s", refined); +} + + +/* == Preprocess functions == */ + +/* *SETVAR(/NONUT)* Preprocess setvars */ +static int bestups_process_setvar(item_t *item, char *value, size_t valuelen) +{ + if (!strlen(value)) { + upsdebugx(2, "%s: value not given for %s", __func__, item->info_type); + return -1; + } + + double val = strtod(value, NULL); + + if (!strcasecmp(item->info_type, "pins_shutdown_mode")) { + + if (val == pins_shutdown_mode) { + upslogx(LOG_INFO, "%s is already set to %.0f", item->info_type, val); + return -1; + } + + } + + snprintf(value, valuelen, item->command, val); + + return 0; +} + +/* Bypass/Boost or Buck status */ +static int bestups_process_bbb_status_bit(item_t *item, char *value, size_t valuelen) +{ + /* Bypass/Boost/Buck bit is not reliable when a battery test, shutdown or on battery condition occurs: always ignore it in these cases */ + if (!(qx_status() & STATUS(OL)) || (qx_status() & (STATUS(CAL) | STATUS(FSD)))) { + + if (item->value[0] == '1') + item->value[0] = '0'; + + return blazer_process_status_bits(item, value, valuelen); + + } + + /* UPSes with inverted bypass/boost/buck bit */ + if (inverted_bbb_bit) { + + if (item->value[0] == '1') + item->value[0] = '0'; + + else if (item->value[0] == '0') + item->value[0] = '1'; + + } + + return blazer_process_status_bits(item, value, valuelen); +} + +/* Identify UPS manufacturer */ +static int bestups_manufacturer(item_t *item, char *value, size_t valuelen) +{ + /* Best Power devices */ + if ( + !strcmp(item->value, "AX1") || + !strcmp(item->value, "FOR") || + !strcmp(item->value, "FTC") || + !strcmp(item->value, "PR2") || + !strcmp(item->value, "PRO") + ) { + snprintf(value, valuelen, item->dfl, "Best Power"); + return 0; + } + + /* Sola Australia devices */ + if ( + !strcmp(item->value, "325") || + !strcmp(item->value, "520") || + !strcmp(item->value, "620") + ) { + snprintf(value, valuelen, item->dfl, "Sola Australia"); + return 0; + } + + /* Unknown devices */ + snprintf(value, valuelen, item->dfl, "Unknown"); + return 0; +} + +/* Identify UPS model and unskip qx2nut table's items accordingly */ +static int bestups_model(item_t *item, char *value, size_t valuelen) +{ + item_t *unskip; + + /* Best Power devices */ + + if (!strcmp(item->value, "AX1")) { + + snprintf(value, valuelen, item->dfl, "Axxium Rackmount"); + + } else if (!strcmp(item->value, "FOR")) { + + snprintf(value, valuelen, item->dfl, "Fortress"); + + } else if (!strcmp(item->value, "FTC")) { + + snprintf(value, valuelen, item->dfl, "Fortress Telecom"); + + } else if (!strcmp(item->value, "PR2")) { + + snprintf(value, valuelen, item->dfl, "Patriot Pro II"); + inverted_bbb_bit = 1; + + } else if (!strcmp(item->value, "PRO")) { + + snprintf(value, valuelen, item->dfl, "Patriot Pro"); + inverted_bbb_bit = 1; + + /* Sola Australia devices */ + } else if ( + !strcmp(item->value, "320") || + !strcmp(item->value, "325") || + !strcmp(item->value, "520") || + !strcmp(item->value, "525") || + !strcmp(item->value, "620") + ) { + + snprintf(value, valuelen, "Sola %s", item->value); + + /* Unknown devices */ + } else { + + snprintf(value, valuelen, item->dfl, "Unknown (%s)", item->value); + upslogx(LOG_INFO, "Unknown model detected - please report this ID: '%s'", item->value); + + } + + /* Unskip qx2nut table's items according to the UPS model */ + + /* battery.runtime var is not available on the Patriot Pro/Sola 320 model series: leave it skipped in these cases, otherwise unskip it */ + if (strcmp(item->value, "PRO") && strcmp(item->value, "320")) { + + unskip = find_nut_info("battery.runtime", 0, 0); + + /* Don't know what happened */ + if (!unskip) + return -1; + + unskip->qxflags &= ~QX_FLAG_SKIP; + + } + + /* battery.packs var is available only on the Axxium/Sola 620 model series: unskip it in these cases */ + if (!strcmp(item->value, "AX1") || !strcmp(item->value, "620")) { + + unskip = find_nut_info("battery.packs", 0, QX_FLAG_SETVAR); + + /* Don't know what happened */ + if (!unskip) + return -1; + + unskip->qxflags &= ~QX_FLAG_SKIP; + + } + + return 0; +} + +/* Battery runtime */ +static int bestups_batt_runtime(item_t *item, char *value, size_t valuelen) +{ + double runtime; + + if (strspn(item->value, "0123456789 .") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + /* Battery runtime is reported by the UPS in minutes, NUT expects seconds */ + runtime = strtod(item->value, NULL) * 60; + + snprintf(value, valuelen, item->dfl, runtime); + + return 0; +} + +/* Battery packs */ +static int bestups_batt_packs(item_t *item, char *value, size_t valuelen) +{ + item_t *unskip; + + if (strspn(item->value, "0123456789 ") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + snprintf(value, valuelen, item->dfl, strtol(item->value, NULL, 10)); + + /* Unskip battery.packs setvar */ + unskip = find_nut_info("battery.packs", QX_FLAG_SETVAR, 0); + + /* Don't know what happened */ + if (!unskip) + return -1; + + unskip->qxflags &= ~QX_FLAG_SKIP; + + return 0; +} + +/* *NONUT* Get shutdown mode functionality of Pin 1 and Pin 7 on the UPS DB9 communication port (Per Best Power’s EPS-0059) as set in the UPS */ +static int bestups_get_pins_shutdown_mode(item_t *item, char *value, size_t valuelen) +{ + item_t *unskip; + + if (strspn(item->value, "0123456789") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + pins_shutdown_mode = strtol(item->value, NULL, 10); + + snprintf(value, valuelen, item->dfl, pins_shutdown_mode); + + /* We were not asked by the user to change the value */ + if ((item->qxflags & QX_FLAG_NONUT) && !getval(item->info_type)) + return 0; + + /* Unskip setvar */ + unskip = find_nut_info(item->info_type, QX_FLAG_SETVAR, 0); + + /* Don't know what happened */ + if (!unskip) + return -1; + + unskip->qxflags &= ~QX_FLAG_SKIP; + + return 0; +} + +/* Voltage settings */ +static int bestups_voltage_settings(item_t *item, char *value, size_t valuelen) +{ + int index, val; + const char *nominal_voltage; + const struct { + const int low; /* Low voltage -> input.transfer.low / input.transfer.boost.low */ + const int boost; /* Boost voltage -> input.transfer.boost.high */ + const int nominal; /* Nominal voltage -> input.voltage.nominal / output.voltage.nominal */ + const int buck; /* Buck voltage -> input.transfer.trim.low */ + const int high; /* High voltage -> input.transfer.high / input.transfer.trim.high */ + } voltage_settings[] = { + /* U models voltage limits, for: + * - Fortress (750U, 1050U, 1425U, 1800U and 2250U) + * - Fortress Rackmount (750, 1050, 1425, 1800, and 2250 VA) + * - Patriot Pro II (400U, 750U, and 1000U) */ + /* M low boost nominal buck high */ + /* 0 */ { 96, 109, 120, 130, 146 }, /* LEDs lit: 2,3,4 (Default) */ + /* 1 */ { 96, 109, 120, 138, 156 }, /* LEDs lit: 1,3,4 */ + /* 2 */ { 90, 104, 120, 130, 146 }, /* LEDs lit: 2,3,5 */ + /* 3 */ { 90, 104, 120, 138, 156 }, /* LEDs lit: 1,3,5 */ + /* 4 */ { 90, 104, 110, 120, 130 }, /* LEDs lit: 3,4,5 */ + /* 5 */ { 90, 104, 110, 130, 146 }, /* LEDs lit: 2,4,5 */ + /* 6 */ { 90, 96, 110, 120, 130 }, /* LEDs lit: 3,4,6 */ + /* 7 */ { 90, 96, 110, 130, 146 }, /* LEDs lit: 2,4,6 */ + /* 8 */ { 96, 109, 128, 146, 156 }, /* LEDs lit: 1,2,4 */ + /* 9 */ { 90, 104, 128, 146, 156 }, /* LEDs lit: 1,2,5 */ + + /* E models voltage limits, for: + * - Fortress (750E, 1050E, 1425E, and 2250E) + * - Fortress Rackmount (750, 1050, 1425, and 2250 VA) + * - Patriot Pro II (400E, 750E, and 1000E) */ + /* M low boost nominal buck high */ + /* 0 */ { 200, 222, 240, 250, 284 }, /* LEDs lit: 2,3,4 */ + /* 1 */ { 200, 222, 240, 264, 290 }, /* LEDs lit: 1,3,4 */ + /* 2 */ { 188, 210, 240, 250, 284 }, /* LEDs lit: 2,3,5 */ + /* 3 */ { 188, 210, 240, 264, 290 }, /* LEDs lit: 1,3,5 */ + /* 4 */ { 188, 210, 230, 244, 270 }, /* LEDs lit: 3,4,5 (Default) */ + /* 5 */ { 188, 210, 230, 250, 284 }, /* LEDs lit: 2,4,5 */ + /* 6 */ { 180, 200, 230, 244, 270 }, /* LEDs lit: 3,4,6 */ + /* 7 */ { 180, 200, 230, 250, 284 }, /* LEDs lit: 2,4,6 */ + /* 8 */ { 165, 188, 208, 222, 244 }, /* LEDs lit: 4,5,6 */ + /* 9 */ { 165, 188, 208, 244, 270 } /* LEDs lit: 3,5,6 */ + }; + + if (strspn(item->value, "0123456789") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + index = strtol(item->value, NULL, 10); + + if (index < 0 || index > 9) { + upsdebugx(2, "%s: value '%d' out of range [0..9]", __func__, index); + return -1; + } + + nominal_voltage = dstate_getinfo("input.voltage.nominal"); + + if (!nominal_voltage) + nominal_voltage = dstate_getinfo("output.voltage.nominal"); + + if (!nominal_voltage) { + upsdebugx(2, "%s: unable to get nominal voltage", __func__); + return -1; + } + + /* E models */ + if (strtol(nominal_voltage, NULL, 10) > 160) + index += 10; + + if (!strcasecmp(item->info_type, "input.transfer.low") || !strcasecmp(item->info_type, "input.transfer.boost.low")) { + + val = voltage_settings[index].low; + + } else if (!strcasecmp(item->info_type, "input.transfer.boost.high")) { + + val = voltage_settings[index].boost; + + } else if (!strcasecmp(item->info_type, "input.voltage.nominal") || !strcasecmp(item->info_type, "output.voltage.nominal")) { + + val = voltage_settings[index].nominal; + + } else if (!strcasecmp(item->info_type, "input.transfer.trim.low")) { + + val = voltage_settings[index].buck; + + } else if (!strcasecmp(item->info_type, "input.transfer.trim.high") || !strcasecmp(item->info_type, "input.transfer.high")) { + + val = voltage_settings[index].high; + + } else { + + /* Don't know what happened */ + return -1; + + } + + snprintf(value, valuelen, item->dfl, val); + + return 0; +} + + +/* == Subdriver interface == */ +subdriver_t bestups_subdriver = { + BESTUPS_VERSION, + bestups_claim, + bestups_qx2nut, + bestups_initups, + NULL, + bestups_makevartable, + NULL, + NULL, +#ifdef TESTING + bestups_testing, +#endif /* TESTING */ +}; diff --git a/drivers/nutdrv_qx_bestups.h b/drivers/nutdrv_qx_bestups.h new file mode 100644 index 0000000..4f1e560 --- /dev/null +++ b/drivers/nutdrv_qx_bestups.h @@ -0,0 +1,29 @@ +/* nutdrv_qx_bestups.h - Subdriver for Best Power/Sola Australia UPSes + * + * Copyright (C) + * 2014 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef NUTDRV_QX_BESTUPS_H +#define NUTDRV_QX_BESTUPS_H + +#include "nutdrv_qx.h" + +extern subdriver_t bestups_subdriver; + +#endif /* NUTDRV_QX_BESTUPS_H */ diff --git a/drivers/nutdrv_qx_blazer-common.c b/drivers/nutdrv_qx_blazer-common.c index 1221778..04fb7ae 100644 --- a/drivers/nutdrv_qx_blazer-common.c +++ b/drivers/nutdrv_qx_blazer-common.c @@ -42,8 +42,8 @@ info_rw_t blazer_r_offdelay[] = { /* == Support functions == */ /* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. */ -int blazer_claim(void) { - +int blazer_claim(void) +{ /* To tell whether the UPS is supported or not, we'll check both status (Q1/QS/D) and vendor (I/FW?) - provided that we were not told not to do it with the ups.conf flag 'novendor'. */ item_t *item = find_nut_info("input.voltage", 0, 0); @@ -85,13 +85,12 @@ int blazer_claim(void) { } return 1; - } /* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. * NOTE: this 'light' version only checks for status (Q1/QS/D/..) */ -int blazer_claim_light(void) { - +int blazer_claim_light(void) +{ /* To tell whether the UPS is supported or not, we'll check just status (Q1/QS/D/..). */ item_t *item = find_nut_info("input.voltage", 0, 0); @@ -109,7 +108,6 @@ int blazer_claim_light(void) { return 0; return 1; - } /* Subdriver-specific flags/vars */ @@ -117,18 +115,28 @@ void blazer_makevartable(void) { addvar(VAR_FLAG, "norating", "Skip reading rating information from UPS"); addvar(VAR_FLAG, "novendor", "Skip reading vendor information from UPS"); + + blazer_makevartable_light(); +} + +/* Subdriver-specific flags/vars + * NOTE: this 'light' version only handles vars/flags related to UPS status query (Q1/QS/D/...) */ +void blazer_makevartable_light(void) +{ + addvar(VAR_FLAG, "ignoresab", "Ignore 'Shutdown Active' bit in UPS status"); } /* Subdriver-specific initups */ void blazer_initups(item_t *qx2nut) { - int nr, nv; + int nr, nv, isb; item_t *item; nr = testvar("norating"); nv = testvar("novendor"); + isb = testvar("ignoresab"); - if (!nr && !nv) + if (!nr && !nv && !isb) return; for (item = qx2nut; item->info_type != NULL; item++) { @@ -148,6 +156,33 @@ void blazer_initups(item_t *qx2nut) item->qxflags |= QX_FLAG_SKIP; } + /* ignoresab */ + if (isb && !strcasecmp(item->info_type, "ups.status") && item->from == 44 && item->to == 44) { + upsdebugx(2, "%s: skipping %s ('Shutdown Active' bit)", __func__, item->info_type); + item->qxflags |= QX_FLAG_SKIP; + } + + } +} + +/* Subdriver-specific initups + * NOTE: this 'light' version only checks for status (Q1/QS/D/..) related items */ +void blazer_initups_light(item_t *qx2nut) +{ + item_t *item; + + if (!testvar("ignoresab")) + return; + + for (item = qx2nut; item->info_type != NULL; item++) { + + if (strcasecmp(item->info_type, "ups.status") || item->from != 44 || item->to != 44) + continue; + + upsdebugx(2, "%s: skipping %s ('Shutdown Active' bit)", __func__, item->info_type); + item->qxflags |= QX_FLAG_SKIP; + break; + } } @@ -350,14 +385,10 @@ int blazer_process_status_bits(item_t *item, char *value, size_t valuelen) case 44: /* Shutdown Active */ - if (item->value[0] == '1') { - if (!strcasecmp(item->info_type, "ups.status")) - val = "FSD"; - else /* ups.alarm */ - val = "Shutdown imminent!"; - } else if (!strcasecmp(item->info_type, "ups.status")) { + if (item->value[0] == '1') + val = "FSD"; + else val = "!FSD"; - } break; case 45: /* Beeper status - ups.beeper.status */ diff --git a/drivers/nutdrv_qx_blazer-common.h b/drivers/nutdrv_qx_blazer-common.h index aee3864..1cab5be 100644 --- a/drivers/nutdrv_qx_blazer-common.h +++ b/drivers/nutdrv_qx_blazer-common.h @@ -26,7 +26,9 @@ /* Support functions */ void blazer_makevartable(void); +void blazer_makevartable_light(void); void blazer_initups(item_t *qx2nut); +void blazer_initups_light(item_t *qx2nut); int blazer_claim(void); int blazer_claim_light(void); diff --git a/drivers/nutdrv_qx_mecer.c b/drivers/nutdrv_qx_mecer.c index 5160343..7386754 100644 --- a/drivers/nutdrv_qx_mecer.c +++ b/drivers/nutdrv_qx_mecer.c @@ -25,7 +25,7 @@ #include "nutdrv_qx_mecer.h" -#define MECER_VERSION "Mecer 0.02" +#define MECER_VERSION "Mecer 0.05" /* Support functions */ static int mecer_claim(void); @@ -46,7 +46,7 @@ static item_t mecer_qx2nut[] = { * 0 */ - { "ups.firmware.aux", 0, NULL, "QPI\r", "", 6, '(', "", 1, 4, "%s", QX_FLAG_STATIC, voltronic_p98_protocol }, + { "ups.firmware.aux", 0, NULL, "QPI\r", "", 6, '(', "", 1, 4, "%s", QX_FLAG_STATIC, NULL, voltronic_p98_protocol }, /* * > [Q1\r] @@ -55,23 +55,22 @@ static item_t mecer_qx2nut[] = { * 0 1 2 3 4 */ - { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, - { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, - { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, - { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, /* Status bits */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ - { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, /* Beeper status */ /* * > [F\r] @@ -80,10 +79,10 @@ static item_t mecer_qx2nut[] = { * 0 1 2 */ - { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL }, - { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL }, + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL, NULL }, /* * > [I\r] @@ -92,49 +91,49 @@ static item_t mecer_qx2nut[] = { * 0 1 2 3 */ - { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, + { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, /* Instant commands * The UPS will reply '(ACK\r' in case of success, '(NAK\r' if the command is rejected or invalid */ - { "beeper.toggle", 0, NULL, "Q\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "load.off", 0, NULL, "S00R0000\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "C\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stop", 0, NULL, "C\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start", 0, NULL, "T%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, mecer_process_test_battery }, - { "test.battery.start.deep", 0, NULL, "TL\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.stop", 0, NULL, "CT\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "beeper.toggle", 0, NULL, "Q\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start", 0, NULL, "T%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, mecer_process_test_battery }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* == Testing table == */ #ifdef TESTING static testing_t mecer_testing[] = { - { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, - { "QPI\r", "(PI98\r" }, - { "F\r", "#230.0 000 024.0 50.0\r" }, - { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r" }, - { "Q\r", "(ACK\r" }, - { "S03\r", "(NAK\r" }, - { "C\r", "(NAK\r" }, - { "S02R0005\r", "(ACK\r" }, - { "S.5R0000\r", "(ACK\r" }, - { "T04\r", "(NAK\r" }, - { "TL\r", "(ACK\r" }, - { "T\r", "(NAK\r" }, - { "CT\r", "(ACK\r" }, + { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r", -1 }, + { "QPI\r", "(PI98\r", -1 }, + { "F\r", "#230.0 000 024.0 50.0\r", -1 }, + { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r", -1 }, + { "Q\r", "(ACK\r", -1 }, + { "S03\r", "(NAK\r", -1 }, + { "C\r", "(NAK\r", -1 }, + { "S02R0005\r", "(ACK\r", -1 }, + { "S.5R0000\r", "(ACK\r", -1 }, + { "T04\r", "(NAK\r", -1 }, + { "TL\r", "(ACK\r", -1 }, + { "T\r", "(NAK\r", -1 }, + { "CT\r", "(ACK\r", -1 }, { NULL } }; #endif /* TESTING */ @@ -145,7 +144,6 @@ static testing_t mecer_testing[] = { /* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. */ static int mecer_claim(void) { - /* Apart from status (Q1), try to identify protocol (QPI, for Voltronic Power P98 units) or whether the UPS uses '(ACK\r'/'(NAK\r' replies */ item_t *item = find_nut_info("input.voltage", 0, 0); @@ -198,15 +196,12 @@ static int mecer_claim(void) } return 1; - } /* Subdriver-specific initups */ static void mecer_initups(void) { - blazer_initups(mecer_qx2nut); - } diff --git a/drivers/nutdrv_qx_megatec-old.c b/drivers/nutdrv_qx_megatec-old.c index 73173de..ce39926 100644 --- a/drivers/nutdrv_qx_megatec-old.c +++ b/drivers/nutdrv_qx_megatec-old.c @@ -25,7 +25,7 @@ #include "nutdrv_qx_megatec-old.h" -#define MEGATEC_OLD_VERSION "Megatec/old 0.02" +#define MEGATEC_OLD_VERSION "Megatec/old 0.05" /* qx2nut lookup table */ static item_t megatec_old_qx2nut[] = { @@ -37,23 +37,22 @@ static item_t megatec_old_qx2nut[] = { * 0 1 2 3 4 */ - { "input.voltage", 0, NULL, "D\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.voltage.fault", 0, NULL, "D\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "D\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "D\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, - { "input.frequency", 0, NULL, "D\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, - { "battery.voltage", 0, NULL, "D\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, - { "ups.temperature", 0, NULL, "D\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + { "input.voltage", 0, NULL, "D\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "D\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "D\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "D\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "D\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "D\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "D\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, /* Status bits */ - { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ - { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "D\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ - { "ups.type", 0, NULL, "D\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ - { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ - { "ups.alarm", 0, NULL, "D\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "D\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "D\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "D\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "D\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "D\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, /* Beeper status */ /* * > [F\r] @@ -62,10 +61,10 @@ static item_t megatec_old_qx2nut[] = { * 0 1 2 */ - { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL }, - { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL }, + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL, NULL }, /* * > [I\r] @@ -74,45 +73,45 @@ static item_t megatec_old_qx2nut[] = { * 0 1 2 3 */ - { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, + { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, /* Instant commands */ - { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* Testing table */ #ifdef TESTING static testing_t megatec_old_testing[] = { - { "D\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, - { "F\r", "#230.0 000 024.0 50.0\r" }, - { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r" }, - { "Q\r", "" }, - { "S03\r", "" }, - { "C\r", "" }, - { "S02R0005\r", "" }, - { "S.5R0000\r", "" }, - { "T04\r", "" }, - { "TL\r", "" }, - { "T\r", "" }, - { "CT\r", "" }, + { "D\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r", -1 }, + { "F\r", "#230.0 000 024.0 50.0\r", -1 }, + { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r", -1 }, + { "Q\r", "", -1 }, + { "S03\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0000\r", "", -1 }, + { "T04\r", "", -1 }, + { "TL\r", "", -1 }, + { "T\r", "", -1 }, + { "CT\r", "", -1 }, { NULL } }; #endif /* TESTING */ @@ -120,9 +119,7 @@ static testing_t megatec_old_testing[] = { /* Subdriver-specific initups */ static void megatec_old_initups(void) { - blazer_initups(megatec_old_qx2nut); - } /* Subdriver interface */ diff --git a/drivers/nutdrv_qx_megatec.c b/drivers/nutdrv_qx_megatec.c index c43a24e..f0f02f1 100644 --- a/drivers/nutdrv_qx_megatec.c +++ b/drivers/nutdrv_qx_megatec.c @@ -25,7 +25,7 @@ #include "nutdrv_qx_megatec.h" -#define MEGATEC_VERSION "Megatec 0.01" +#define MEGATEC_VERSION "Megatec 0.04" /* qx2nut lookup table */ static item_t megatec_qx2nut[] = { @@ -37,23 +37,22 @@ static item_t megatec_qx2nut[] = { * 0 1 2 3 4 */ - { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, - { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, - { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, - { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, /* Status bits */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ - { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, /* Beeper status */ /* * > [F\r] @@ -62,10 +61,10 @@ static item_t megatec_qx2nut[] = { * 0 1 2 */ - { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL }, - { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL }, + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL, NULL }, /* * > [I\r] @@ -74,45 +73,45 @@ static item_t megatec_qx2nut[] = { * 0 1 2 3 */ - { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, + { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, /* Instant commands */ - { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* Testing table */ #ifdef TESTING static testing_t megatec_testing[] = { - { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, - { "F\r", "#230.0 000 024.0 50.0\r" }, - { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r" }, - { "Q\r", "" }, - { "S03\r", "" }, - { "C\r", "" }, - { "S02R0005\r", "" }, - { "S.5R0000\r", "" }, - { "T04\r", "" }, - { "TL\r", "" }, - { "T\r", "" }, - { "CT\r", "" }, + { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r", -1 }, + { "F\r", "#230.0 000 024.0 50.0\r", -1 }, + { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r", -1 }, + { "Q\r", "", -1 }, + { "S03\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0000\r", "", -1 }, + { "T04\r", "", -1 }, + { "TL\r", "", -1 }, + { "T\r", "", -1 }, + { "CT\r", "", -1 }, { NULL } }; #endif /* TESTING */ @@ -120,9 +119,7 @@ static testing_t megatec_testing[] = { /* Subdriver-specific initups */ static void megatec_initups(void) { - blazer_initups(megatec_qx2nut); - } /* Subdriver interface */ diff --git a/drivers/nutdrv_qx_mustek.c b/drivers/nutdrv_qx_mustek.c index 3bdee1a..17b8eb6 100644 --- a/drivers/nutdrv_qx_mustek.c +++ b/drivers/nutdrv_qx_mustek.c @@ -25,7 +25,7 @@ #include "nutdrv_qx_mustek.h" -#define MUSTEK_VERSION "Mustek 0.02" +#define MUSTEK_VERSION "Mustek 0.05" /* qx2nut lookup table */ static item_t mustek_qx2nut[] = { @@ -37,23 +37,22 @@ static item_t mustek_qx2nut[] = { * 0 1 2 3 4 */ - { "input.voltage", 0, NULL, "QS\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.voltage.fault", 0, NULL, "QS\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "QS\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "QS\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, - { "input.frequency", 0, NULL, "QS\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, - { "battery.voltage", 0, NULL, "QS\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, - { "ups.temperature", 0, NULL, "QS\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + { "input.voltage", 0, NULL, "QS\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "QS\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "QS\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "QS\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "QS\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "QS\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "QS\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, /* Status bits */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ - { "ups.type", 0, NULL, "QS\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ - { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "QS\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "QS\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "QS\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, /* Beeper status */ /* * > [F\r] @@ -62,10 +61,10 @@ static item_t mustek_qx2nut[] = { * 0 1 2 */ - { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL }, - { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL }, + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL, NULL }, /* * > [I\r] @@ -74,45 +73,45 @@ static item_t mustek_qx2nut[] = { * 0 1 2 3 */ - { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, + { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, /* Instant commands */ - { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* Testing table */ #ifdef TESTING static testing_t mustek_testing[] = { - { "QS\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, - { "F\r", "#230.0 000 024.0 50.0\r" }, - { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r" }, - { "Q\r", "" }, - { "S03\r", "" }, - { "C\r", "" }, - { "S02R0005\r", "" }, - { "S.5R0000\r", "" }, - { "T04\r", "" }, - { "TL\r", "" }, - { "T\r", "" }, - { "CT\r", "" }, + { "QS\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r", -1 }, + { "F\r", "#230.0 000 024.0 50.0\r", -1 }, + { "I\r", "#NOT_A_LIVE_UPS TESTING TESTING \r", -1 }, + { "Q\r", "", -1 }, + { "S03\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0000\r", "", -1 }, + { "T04\r", "", -1 }, + { "TL\r", "", -1 }, + { "T\r", "", -1 }, + { "CT\r", "", -1 }, { NULL } }; #endif /* TESTING */ @@ -120,9 +119,7 @@ static testing_t mustek_testing[] = { /* Subdriver-specific initups */ static void mustek_initups(void) { - blazer_initups(mustek_qx2nut); - } /* Subdriver interface */ diff --git a/drivers/nutdrv_qx_q1.c b/drivers/nutdrv_qx_q1.c index b201497..be37018 100644 --- a/drivers/nutdrv_qx_q1.c +++ b/drivers/nutdrv_qx_q1.c @@ -35,7 +35,7 @@ #include "nutdrv_qx_q1.h" -#define Q1_VERSION "Q1 0.02" +#define Q1_VERSION "Q1 0.05" /* qx2nut lookup table */ static item_t q1_qx2nut[] = { @@ -47,69 +47,74 @@ static item_t q1_qx2nut[] = { * 0 1 2 3 4 */ - { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, - { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, - { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, - { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, /* Status bits */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ - { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, /* Beeper status */ /* Instant commands */ - { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* Testing table */ #ifdef TESTING static testing_t q1_testing[] = { - { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, - { "Q\r", "" }, - { "S03\r", "" }, - { "C\r", "" }, - { "S02R0005\r", "" }, - { "S.5R0000\r", "" }, - { "T04\r", "" }, - { "TL\r", "" }, - { "T\r", "" }, - { "CT\r", "" }, + { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r", -1 }, + { "Q\r", "", -1 }, + { "S03\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0000\r", "", -1 }, + { "T04\r", "", -1 }, + { "TL\r", "", -1 }, + { "T\r", "", -1 }, + { "CT\r", "", -1 }, { NULL } }; #endif /* TESTING */ +/* Subdriver-specific initups */ +static void q1_initups(void) +{ + blazer_initups_light(q1_qx2nut); +} + /* Subdriver interface */ subdriver_t q1_subdriver = { Q1_VERSION, blazer_claim_light, q1_qx2nut, + q1_initups, NULL, - NULL, - NULL, + blazer_makevartable_light, "ACK", NULL, #ifdef TESTING diff --git a/drivers/nutdrv_qx_voltronic-qs-hex.c b/drivers/nutdrv_qx_voltronic-qs-hex.c new file mode 100644 index 0000000..551182b --- /dev/null +++ b/drivers/nutdrv_qx_voltronic-qs-hex.c @@ -0,0 +1,415 @@ +/* nutdrv_qx_voltronic-qs-hex.c - Subdriver for Voltronic Power UPSes with QS-Hex protocol + * + * Copyright (C) + * 2014 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "main.h" +#include "nutdrv_qx.h" +#include "nutdrv_qx_blazer-common.h" + +#include "nutdrv_qx_voltronic-qs-hex.h" + +#define VOLTRONIC_QS_HEX_VERSION "Voltronic-QS-Hex 0.03" + +/* Support functions */ +static int voltronic_qs_hex_claim(void); +static void voltronic_qs_hex_initups(void); + +/* Answer preprocess functions */ +static int voltronic_qs_hex_preprocess_qs_answer(item_t *item, const int len); +static int voltronic_qs_hex_status_char_to_binary(const unsigned char value); + +/* Preprocess functions */ +static int voltronic_qs_hex_protocol(item_t *item, char *value, size_t valuelen); +static int voltronic_qs_hex_input_output_voltage(item_t *item, char *value, size_t valuelen); +static int voltronic_qs_hex_input_output_voltage(item_t *item, char *value, size_t valuelen); +static int voltronic_qs_hex_load(item_t *item, char *value, size_t valuelen); +static int voltronic_qs_hex_frequency(item_t *item, char *value, size_t valuelen); +static int voltronic_qs_hex_battery_voltage(item_t *item, char *value, size_t valuelen); + + +/* == Ranges == */ + +/* Range for ups.delay.start */ +static info_rw_t voltronic_qs_hex_r_ondelay[] = { + { "60", 0 }, + { "599940", 0 }, + { "", 0 } +}; + +/* Range for ups.delay.shutdown */ +static info_rw_t voltronic_qs_hex_r_offdelay[] = { + { "12", 0 }, + { "540", 0 }, + { "", 0 } +}; + + +/* == qx2nut lookup table == */ +static item_t voltronic_qs_hex_qx2nut[] = { + + /* Query UPS for protocol + * > [M\r] + * < [P\r] + * 01 + * 0 + */ + + { "ups.firmware.aux", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "PMV-%s", QX_FLAG_STATIC, NULL, voltronic_qs_hex_protocol }, + + /* Query UPS for status + * > [QS\r] + * < [#6C01 35 6C01 35 03 519A 1312D0 E6 1E 00001001\r] (after being preprocessed) + * 01234567890123456789012345678901234567890123456 + * 0 1 2 3 4 + */ + + { "input.voltage", 0, NULL, "QS\r", "", 47, '#', "", 1, 7, "%.1f", 0, voltronic_qs_hex_preprocess_qs_answer, voltronic_qs_hex_input_output_voltage }, + { "output.voltage", 0, NULL, "QS\r", "", 47, '#', "", 9, 15, "%.1f", 0, voltronic_qs_hex_preprocess_qs_answer, voltronic_qs_hex_input_output_voltage }, + { "ups.load", 0, NULL, "QS\r", "", 47, '#', "", 17, 18, "%d", 0, voltronic_qs_hex_preprocess_qs_answer, voltronic_qs_hex_load }, + { "output.frequency", 0, NULL, "QS\r", "", 47, '#', "", 20, 30, "%.1f", 0, voltronic_qs_hex_preprocess_qs_answer, voltronic_qs_hex_frequency }, + { "battery.voltage", 0, NULL, "QS\r", "", 47, '#', "", 32, 36, "%.2f", 0, voltronic_qs_hex_preprocess_qs_answer, voltronic_qs_hex_battery_voltage }, + /* Status bits */ + { "ups.status", 0, NULL, "QS\r", "", 47, '#', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "QS\r", "", 47, '#', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "QS\r", "", 47, '#', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "QS\r", "", 47, '#', "", 41, 41, NULL, 0, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "QS\r", "", 47, '#', "", 42, 42, "%s", QX_FLAG_STATIC, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "QS\r", "", 47, '#', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "QS\r", "", 47, '#', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "QS\r", "", 47, '#', "", 45, 45, "%s", 0, voltronic_qs_hex_preprocess_qs_answer, blazer_process_status_bits }, /* Beeper status */ + + /* Instant commands */ + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + + /* Server-side settable vars */ + { "ups.delay.start", ST_FLAG_RW, voltronic_qs_hex_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, voltronic_qs_hex_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + + /* End of structure. */ + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } +}; + + +/* == Testing table == */ +#ifdef TESTING +static testing_t voltronic_qs_hex_testing[] = { + { "QS\r", "#\x6C\x01 \x35 \x6C\x01 \x35 \x03 \x51\x9A \x28\x02\x12\xD0 \xE6 \x1E \x09\r", 27 }, + { "M\r", "P\r", -1 }, + { "Q\r", "", -1 }, + { "S03\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0000\r", "N\r", -1 }, + { "T04\r", "", -1 }, + { "TL\r", "", -1 }, + { "T\r", "", -1 }, + { "CT\r", "", -1 }, + { NULL } +}; +#endif /* TESTING */ + + +/* == Support functions == */ + +/* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. */ +static int voltronic_qs_hex_claim(void) +{ + /* We need at least M and QS to run this subdriver */ + + /* UPS Protocol */ + item_t *item = find_nut_info("ups.firmware.aux", 0, 0); + + /* Don't know what happened */ + if (!item) + return 0; + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) + return 0; + + /* Unable to process value/Protocol not supported */ + if (ups_infoval_set(item) != 1) + return 0; + + item = find_nut_info("input.voltage", 0, 0); + + /* Don't know what happened */ + if (!item) { + dstate_delinfo("ups.firmware.aux"); + return 0; + } + + /* No reply/Unable to get value */ + if (qx_process(item, NULL)) { + dstate_delinfo("ups.firmware.aux"); + return 0; + } + + /* Unable to process value */ + if (ups_infoval_set(item) != 1) { + dstate_delinfo("ups.firmware.aux"); + return 0; + } + + return 1; +} + +/* Subdriver-specific initups */ +static void voltronic_qs_hex_initups(void) +{ + blazer_initups_light(voltronic_qs_hex_qx2nut); +} + + +/* == Answer preprocess functions == */ + +/* Preprocess the answer we got back from the UPS when queried with 'QS\r' */ +static int voltronic_qs_hex_preprocess_qs_answer(item_t *item, const int len) +{ + int i, token; + char refined[SMALLBUF] = ""; + + if (len <= 0) + return len; + + if (item->answer[0] != '#') { + upsdebugx(4, "%s: wrong leading character [%s: 0x%0x]", __func__, item->info_type, item->answer[0]); + return -1; + } + + snprintf(refined, sizeof(refined), "%s", "#"); + + /* e.g.: item->answer = "#\x6C\x01 \x35 \x6C\x01 \x35 \x03 \x51\x9A \x28\x02\x12\xD0 \xE6 \x1E \x09\r" */ + upsdebug_hex(4, "read", item->answer, len); + + for (i = 1, token = 1; i < len; i++) { + + /* New token */ + if (item->answer[i] == 0x20) { + snprintfcat(refined, sizeof(refined), "%s", " "); + token++; + continue; + } + + /* 'Unescape' raw data */ + if (item->answer[i] == 0x28 && i < len) { + + switch (item->answer[i + 1]) + { + case 0x00: /* Escaped because: CR */ + snprintfcat(refined, sizeof(refined), "%02x", 0x0D); + break; + case 0x01: /* Escaped because: XON */ + snprintfcat(refined, sizeof(refined), "%02x", 0x11); + break; + case 0x02: /* Escaped because: XOFF */ + snprintfcat(refined, sizeof(refined), "%02x", 0x13); + break; + case 0x03: /* Escaped because: LF */ + snprintfcat(refined, sizeof(refined), "%02x", 0x0A); + break; + case 0x04: /* Escaped because: space */ + snprintfcat(refined, sizeof(refined), "%02x", 0x20); + break; + default: + if (token != 10) + snprintfcat(refined, sizeof(refined), "%02x", ((unsigned char *)item->answer)[i]); + else + snprintfcat(refined, sizeof(refined), "%08d", voltronic_qs_hex_status_char_to_binary(((unsigned char *)item->answer)[i])); + continue; + } + + i++; + continue; + + } + + /* Trailing CR */ + if (item->answer[i] == 0x0D) + break; + + if (token != 10) + snprintfcat(refined, sizeof(refined), "%02x", ((unsigned char *)item->answer)[i]); + else + snprintfcat(refined, sizeof(refined), "%08d", voltronic_qs_hex_status_char_to_binary(((unsigned char *)item->answer)[i])); + + } + + if (token != 10 || strlen(refined) != 46) { + upsdebugx(2, "noncompliant reply: %s", refined); + return -1; + } + + upsdebugx(4, "read: %s", refined); + + /* e.g.: item->answer = "#6C01 35 6C01 35 03 519A 1312D0 E6 1E 00001001" */ + return snprintf(item->answer, sizeof(item->answer), "%s\r", refined); +} + +/* Transform the QS 'status' char into its binary form (as an int) */ +static int voltronic_qs_hex_status_char_to_binary(const unsigned char value) +{ + unsigned char remainder = value; + int ret = 0, + power = 1; + + while (remainder) { + + if (remainder & 1) + ret += power; + + power *= 10; + remainder >>= 1; + + } + + return ret; +} + + +/* == Preprocess functions == */ + +/* Protocol used by the UPS */ +static int voltronic_qs_hex_protocol(item_t *item, char *value, size_t valuelen) +{ + item_t *unskip; + + if (strcasecmp(item->value, "P") && strcasecmp(item->value, "T") && strcasecmp(item->value, "V")) { + upsdebugx(2, "%s: invalid protocol [%s]", __func__, item->value); + return -1; + } + + snprintf(value, valuelen, item->dfl, item->value); + + /* 'P' UPSes don't support 'T\r' command (battery test) -> leave test.battery.start.quick skipped */ + if (!strcasecmp(item->value, "P")) + return 0; + + /* Unskip test.battery.start.quick */ + unskip = find_nut_info("test.battery.start.quick", QX_FLAG_CMD, 0); + + /* Don't know what happened */ + if (!unskip) + return -1; + + unskip->qxflags &= ~QX_FLAG_SKIP; + + return 0; +} + +/* Input/Output voltage */ +int voltronic_qs_hex_input_output_voltage(item_t *item, char *value, size_t valuelen) +{ + int val; + double ret; + char *str_end, buf[SMALLBUF] = ""; + + if (strspn(item->value, "0123456789ABCDEFabcdef ") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + val = strtol(item->value, &str_end, 16) * strtol(str_end, NULL, 16) / 51; + snprintf(buf, sizeof(buf), "%06x", val); + + ret = strtol(buf + 4, NULL, 16) / 256.0; + buf[4] = '\0'; + ret += strtol(buf, NULL, 16); + + snprintf(value, valuelen, item->dfl, ret); + + return 0; +} + +/* Device load */ +int voltronic_qs_hex_load(item_t *item, char *value, size_t valuelen) +{ + if (strspn(item->value, "0123456789ABCDEFabcdef") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + snprintf(value, valuelen, item->dfl, strtol(item->value, NULL, 16)); + + return 0; +} + +/* Output frequency */ +int voltronic_qs_hex_frequency(item_t *item, char *value, size_t valuelen) +{ + double val1, val2, ret; + char *str_end; + + if (strspn(item->value, "0123456789ABCDEFabcdef ") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + val1 = strtol(item->value, &str_end, 16); + val2 = strtol(str_end, NULL, 16); + + ret = val2 / val1; + ret = ret > 99.9 ? 99.9 : ret; + + snprintf(value, valuelen, item->dfl, ret); + + return 0; +} + +/* Battery voltage */ +int voltronic_qs_hex_battery_voltage(item_t *item, char *value, size_t valuelen) +{ + int val1, val2; + char *str_end; + + if (strspn(item->value, "0123456789ABCDEFabcdef ") != strlen(item->value)) { + upsdebugx(2, "%s: non numerical value [%s: %s]", __func__, item->info_type, item->value); + return -1; + } + + val1 = strtol(item->value, &str_end, 16); + val2 = strtol(str_end, NULL, 16); + + snprintf(value, valuelen, item->dfl, (val1 * val2) / 510.0); + + return 0; +} + + +/* == Subdriver interface == */ +subdriver_t voltronic_qs_hex_subdriver = { + VOLTRONIC_QS_HEX_VERSION, + voltronic_qs_hex_claim, + voltronic_qs_hex_qx2nut, + voltronic_qs_hex_initups, + NULL, + blazer_makevartable_light, + NULL, + "N\r", +#ifdef TESTING + voltronic_qs_hex_testing, +#endif /* TESTING */ +}; diff --git a/drivers/nutdrv_qx_voltronic-qs-hex.h b/drivers/nutdrv_qx_voltronic-qs-hex.h new file mode 100644 index 0000000..e4735df --- /dev/null +++ b/drivers/nutdrv_qx_voltronic-qs-hex.h @@ -0,0 +1,29 @@ +/* nutdrv_qx_voltronic-qs-hex.h - Subdriver for Voltronic Power UPSes with QS-Hex protocol + * + * Copyright (C) + * 2014 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef NUTDRV_QX_VOLTRONIC_QS_HEX_H +#define NUTDRV_QX_VOLTRONIC_QS_HEX_H + +#include "nutdrv_qx.h" + +extern subdriver_t voltronic_qs_hex_subdriver; + +#endif /* NUTDRV_QX_VOLTRONIC_QS_HEX_H */ diff --git a/drivers/nutdrv_qx_voltronic-qs.c b/drivers/nutdrv_qx_voltronic-qs.c index 9b86999..fca3ed8 100644 --- a/drivers/nutdrv_qx_voltronic-qs.c +++ b/drivers/nutdrv_qx_voltronic-qs.c @@ -25,10 +25,11 @@ #include "nutdrv_qx_voltronic-qs.h" -#define VOLTRONIC_QS_VERSION "Voltronic-QS 0.01" +#define VOLTRONIC_QS_VERSION "Voltronic-QS 0.04" /* Support functions */ static int voltronic_qs_claim(void); +static void voltronic_qs_initups(void); /* Preprocess functions */ static int voltronic_qs_protocol(item_t *item, char *value, size_t valuelen); @@ -61,7 +62,7 @@ static item_t voltronic_qs_qx2nut[] = { * 0 */ - { "ups.firmware.aux", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%s", QX_FLAG_STATIC, voltronic_qs_protocol }, + { "ups.firmware.aux", 0, NULL, "M\r", "", 2, 0, "", 0, 0, "%s", QX_FLAG_STATIC, NULL, voltronic_qs_protocol }, /* Query UPS for status * > [QS\r] @@ -70,23 +71,22 @@ static item_t voltronic_qs_qx2nut[] = { * 0 1 2 3 4 */ - { "input.voltage", 0, NULL, "QS\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.voltage.fault", 0, NULL, "QS\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "QS\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "QS\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, - { "input.frequency", 0, NULL, "QS\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, - { "battery.voltage", 0, NULL, "QS\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, - { "ups.temperature", 0, NULL, "QS\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + { "input.voltage", 0, NULL, "QS\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "QS\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "QS\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "QS\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "QS\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "QS\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "QS\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, /* Status bits */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ - { "ups.type", 0, NULL, "QS\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ - { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "QS\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "QS\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "QS\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "QS\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "QS\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, /* Beeper status */ /* Query UPS for ratings * > [F\r] @@ -95,40 +95,40 @@ static item_t voltronic_qs_qx2nut[] = { * 0 1 2 */ - { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL }, - { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL }, + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL, NULL }, /* Instant commands */ - { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "C\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, voltronic_qs_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, voltronic_qs_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, voltronic_qs_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, voltronic_qs_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* == Testing table == */ #ifdef TESTING static testing_t voltronic_qs_testing[] = { - { "QS\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, - { "F\r", "#230.0 000 024.0 50.0\r" }, - { "M\r", "V\r" }, - { "Q\r", "" }, - { "C\r", "" }, - { "S02R0005\r", "" }, - { "S.5R0000\r", "" }, - { "T\r", "" }, + { "QS\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r", -1 }, + { "F\r", "#230.0 000 024.0 50.0\r", -1 }, + { "M\r", "V\r", -1 }, + { "Q\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0000\r", "", -1 }, + { "T\r", "", -1 }, { NULL } }; #endif /* TESTING */ @@ -139,7 +139,6 @@ static testing_t voltronic_qs_testing[] = { /* This function allows the subdriver to "claim" a device: return 1 if the device is supported by this subdriver, else 0. */ static int voltronic_qs_claim(void) { - /* We need at least M and QS to run this subdriver */ /* UPS Protocol */ @@ -178,7 +177,12 @@ static int voltronic_qs_claim(void) } return 1; +} +/* Subdriver-specific initups */ +static void voltronic_qs_initups(void) +{ + blazer_initups_light(voltronic_qs_qx2nut); } @@ -203,9 +207,9 @@ subdriver_t voltronic_qs_subdriver = { VOLTRONIC_QS_VERSION, voltronic_qs_claim, voltronic_qs_qx2nut, + voltronic_qs_initups, NULL, - NULL, - NULL, + blazer_makevartable_light, "ACK", "(NAK\r", #ifdef TESTING diff --git a/drivers/nutdrv_qx_voltronic.c b/drivers/nutdrv_qx_voltronic.c index c6e44cf..adfb6b1 100644 --- a/drivers/nutdrv_qx_voltronic.c +++ b/drivers/nutdrv_qx_voltronic.c @@ -24,7 +24,7 @@ #include "nutdrv_qx_voltronic.h" -#define VOLTRONIC_VERSION "Voltronic 0.01" +#define VOLTRONIC_VERSION "Voltronic 0.03" /* Support functions */ static int voltronic_claim(void); @@ -195,16 +195,16 @@ static info_rw_t voltronic_r_batt_numb[] = { /* Range for Bypass Mode maximum voltage */ static info_rw_t voltronic_r_bypass_volt_max[] = { { "60", voltronic_bypass_volt_max }, /* P09 */ - { "115", voltronic_bypass_volt_max }, /* P02/P03/P10/P14/P99 ivn<200 */ + { "115", voltronic_bypass_volt_max }, /* P02/P03/P10/P13/P14/P99 ivn<200 */ { "120", voltronic_bypass_volt_max }, /* P01 ivn<200 */ { "132", voltronic_bypass_volt_max }, /* P99 ivn<200 */ - { "138", voltronic_bypass_volt_max }, /* P02/P03/P10/P14 ivn<200 */ + { "138", voltronic_bypass_volt_max }, /* P02/P03/P10/P13/P14 ivn<200 */ { "140", voltronic_bypass_volt_max }, /* P01 ivn<200, P09 */ { "230", voltronic_bypass_volt_max }, /* P01 ivn>=200 */ - { "231", voltronic_bypass_volt_max }, /* P02/P03/P10/P14/P99 ivn>=200 */ + { "231", voltronic_bypass_volt_max }, /* P02/P03/P10/P13/P14/P99 ivn>=200 */ { "261", voltronic_bypass_volt_max }, /* P99 ivn>=200 */ { "264", voltronic_bypass_volt_max }, /* P01 ivn>=200 */ - { "276", voltronic_bypass_volt_max }, /* P02/P03/P10/P14 ivn>=200 */ + { "276", voltronic_bypass_volt_max }, /* P02/P03/P10/P13/P14 ivn>=200 */ { "", 0 } }; @@ -232,12 +232,12 @@ static int voltronic_bypass_volt_max(char *value, size_t len) break; - case 115: /* P02/P03/P10/P14/P99 ivn<200 */ + case 115: /* P02/P03/P10/P13/P14/P99 ivn<200 */ if (ivn >= 200) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -262,12 +262,12 @@ static int voltronic_bypass_volt_max(char *value, size_t len) break; - case 138: /* P02/P03/P10/P14 ivn<200 */ + case 138: /* P02/P03/P10/P13/P14 ivn<200 */ if (ivn >= 200) return -1; - if (protocol == 2 || protocol == 2 || protocol == 10 || protocol == 14) + if (protocol == 2 || protocol == 2 || protocol == 10 || protocol == 13 || protocol == 14) return 0; break; @@ -295,12 +295,12 @@ static int voltronic_bypass_volt_max(char *value, size_t len) break; - case 231: /* P02/P03/P10/P14/P99 ivn>=200 */ + case 231: /* P02/P03/P10/P13/P14/P99 ivn>=200 */ if (ivn < 200) return -1; - if (protocol == 2 || protocol == 2 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 2 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -325,12 +325,12 @@ static int voltronic_bypass_volt_max(char *value, size_t len) break; - case 276: /* P02/P03/P10/P14 ivn>=200 */ + case 276: /* P02/P03/P10/P13/P14 ivn>=200 */ if (ivn < 200) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14) return 0; break; @@ -348,16 +348,16 @@ static int voltronic_bypass_volt_max(char *value, size_t len) /* Range for Bypass Mode minimum voltage */ static info_rw_t voltronic_r_bypass_volt_min[] = { { "50", voltronic_bypass_volt_min }, /* P99 ivn<200 */ - { "55", voltronic_bypass_volt_min }, /* P02/P03/P10/P14 ivn<200 */ + { "55", voltronic_bypass_volt_min }, /* P02/P03/P10/P13/P14 ivn<200 */ { "60", voltronic_bypass_volt_min }, /* P09 */ { "85", voltronic_bypass_volt_min }, /* P01/P99 ivn<200 */ - { "104", voltronic_bypass_volt_min }, /* P02/P03/P10/P14 ivn<200 */ - { "110", voltronic_bypass_volt_min }, /* P02/P03/P10/P14 ivn>=200 */ + { "104", voltronic_bypass_volt_min }, /* P02/P03/P10/P13/P14 ivn<200 */ + { "110", voltronic_bypass_volt_min }, /* P02/P03/P10/P13/P14 ivn>=200 */ { "115", voltronic_bypass_volt_min }, /* P01 ivn<200 */ { "140", voltronic_bypass_volt_min }, /* P09 */ { "149", voltronic_bypass_volt_min }, /* P99 ivn>=200 */ { "170", voltronic_bypass_volt_min }, /* P01 ivn>=200 */ - { "209", voltronic_bypass_volt_min }, /* P02/P03/P10/P14/P99 ivn>=200 */ + { "209", voltronic_bypass_volt_min }, /* P02/P03/P10/P13/P14/P99 ivn>=200 */ { "220", voltronic_bypass_volt_min }, /* P01 ivn>=200 */ { "", 0 } }; @@ -389,12 +389,12 @@ static int voltronic_bypass_volt_min(char *value, size_t len) break; - case 55: /* P02/P03/P10/P14 ivn<200 */ + case 55: /* P02/P03/P10/P13/P14 ivn<200 */ if (ivn >= 200) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 10 || protocol == 14) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 10 || protocol == 13 || protocol == 14) return 0; break; @@ -417,22 +417,22 @@ static int voltronic_bypass_volt_min(char *value, size_t len) break; - case 104: /* P02/P03/P10/P14 ivn<200 */ + case 104: /* P02/P03/P10/P13/P14 ivn<200 */ if (ivn >= 200) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14) return 0; break; - case 110: /* P02/P03/P10/P14 ivn>=200 */ + case 110: /* P02/P03/P10/P13/P14 ivn>=200 */ if (ivn < 200) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14) return 0; break; @@ -467,12 +467,12 @@ static int voltronic_bypass_volt_min(char *value, size_t len) break; - case 209: /* P02/P03/P10/P14/P99 ivn>=200 */ + case 209: /* P02/P03/P10/P13/P14/P99 ivn>=200 */ if (ivn < 200) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -499,11 +499,11 @@ static int voltronic_bypass_volt_min(char *value, size_t len) /* Range for Bypass Mode maximum frequency */ static info_rw_t voltronic_r_bypass_freq_max[] = { - { "51.0", voltronic_bypass_freq_max }, /* P01/P09/P02/P03/P10/P14/P99 ofn==50.0 */ - { "54.0", voltronic_bypass_freq_max }, /* P02/P03/P10/P14/P99 ofn==50.0 */ + { "51.0", voltronic_bypass_freq_max }, /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==50.0 */ + { "54.0", voltronic_bypass_freq_max }, /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ { "60.0", voltronic_bypass_freq_max }, /* P01/P09 ofn==50.0 */ - { "61.0", voltronic_bypass_freq_max }, /* P01/P09/P02/P03/P10/P14/P99 ofn==60.0 */ - { "64.0", voltronic_bypass_freq_max }, /* P02/P03/P10/P14/P99 ofn==60.0 */ + { "61.0", voltronic_bypass_freq_max }, /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==60.0 */ + { "64.0", voltronic_bypass_freq_max }, /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ { "70.0", voltronic_bypass_freq_max }, /* P01/P09 ofn==60.0 */ { "", 0 } }; @@ -525,22 +525,22 @@ static int voltronic_bypass_freq_max(char *value, size_t len) switch (val) { - case 51: /* P01/P09/P02/P03/P10/P14/P99 ofn==50.0 */ + case 51: /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; - case 54: /* P02/P03/P10/P14/P99 ofn==50.0 */ + case 54: /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -555,22 +555,22 @@ static int voltronic_bypass_freq_max(char *value, size_t len) break; - case 61: /* P01/P09/P02/P03/P10/P14/P99 ofn==60.0 */ + case 61: /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; - case 64: /* P02/P03/P10/P14/P99 ofn==60.0 */ + case 64: /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -598,11 +598,11 @@ static int voltronic_bypass_freq_max(char *value, size_t len) /* Range for Bypass Mode minimum frequency */ static info_rw_t voltronic_r_bypass_freq_min[] = { { "40.0", voltronic_bypass_freq_min }, /* P01/P09 ofn==50.0 */ - { "46.0", voltronic_bypass_freq_min }, /* P02/P03/P10/P14/P99 ofn==50.0 */ - { "49.0", voltronic_bypass_freq_min }, /* P01/P09/P02/P03/P10/P14/P99 ofn==50.0 */ + { "46.0", voltronic_bypass_freq_min }, /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ + { "49.0", voltronic_bypass_freq_min }, /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==50.0 */ { "50.0", voltronic_bypass_freq_min }, /* P01/P09 ofn==60.0 */ - { "56.0", voltronic_bypass_freq_min }, /* P02/P03/P10/P14/P99 ofn==60.0 */ - { "59.0", voltronic_bypass_freq_min }, /* P01/P09/P02/P03/P10/P14/P99 ofn==60.0 */ + { "56.0", voltronic_bypass_freq_min }, /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ + { "59.0", voltronic_bypass_freq_min }, /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==60.0 */ { "", 0 } }; @@ -633,22 +633,22 @@ static int voltronic_bypass_freq_min(char *value, size_t len) break; - case 46: /* P02/P03/P10/P14/P99 ofn==50.0 */ + case 46: /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; - case 49: /* P01/P09/P02/P03/P10/P14/P99 ofn==50.0 */ + case 49: /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -663,22 +663,22 @@ static int voltronic_bypass_freq_min(char *value, size_t len) break; - case 56: /* P02/P03/P10/P14/P99 ofn==60.0 */ + case 56: /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; - case 59: /* P01/P09/P02/P03/P10/P14/P99 ofn==60.0 */ + case 59: /* P01/P09/P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 1 || protocol == 2 || protocol == 3 || protocol == 9 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -710,13 +710,13 @@ static info_rw_t voltronic_r_eco_volt_min[] = { /* Range for ECO Mode minimum frequency */ static info_rw_t voltronic_r_eco_freq_min[] = { { "40.0", voltronic_eco_freq_min }, /* P01/P09 ofn==50.0 */ - { "46.0", voltronic_eco_freq_min }, /* P02/P03/P10/P14/P99 ofn==50.0 */ + { "46.0", voltronic_eco_freq_min }, /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ { "47.0", voltronic_eco_freq_min }, /* P01/P09 ofn==50.0 */ - { "48.0", voltronic_eco_freq_min }, /* P02/P03/P10/P14/P99 ofn==50.0 */ + { "48.0", voltronic_eco_freq_min }, /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ { "50.0", voltronic_eco_freq_min }, /* P01/P09 ofn==60.0 */ - { "56.0", voltronic_eco_freq_min }, /* P02/P03/P10/P14/P99 ofn==60.0 */ + { "56.0", voltronic_eco_freq_min }, /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ { "57.0", voltronic_eco_freq_min }, /* P01/P09 ofn==60.0 */ - { "58.0", voltronic_eco_freq_min }, /* P02/P03/P10/P14/P99 ofn==60.0 */ + { "58.0", voltronic_eco_freq_min }, /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ { "", 0 } }; @@ -747,12 +747,12 @@ static int voltronic_eco_freq_min(char *value, size_t len) break; - case 46: /* P02/P03/P10/P14/P99 ofn==50.0 */ + case 46: /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -767,12 +767,12 @@ static int voltronic_eco_freq_min(char *value, size_t len) break; - case 48: /* P02/P03/P10/P14/P99 ofn==50.0 */ + case 48: /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -787,12 +787,12 @@ static int voltronic_eco_freq_min(char *value, size_t len) break; - case 56: /* P02/P03/P10/P14/P99 ofn==60.0 */ + case 56: /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -807,12 +807,12 @@ static int voltronic_eco_freq_min(char *value, size_t len) break; - case 58: /* P02/P03/P10/P14/P99 ofn==60.0 */ + case 58: /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -829,13 +829,13 @@ static int voltronic_eco_freq_min(char *value, size_t len) /* Range for ECO Mode maximum frequency */ static info_rw_t voltronic_r_eco_freq_max[] = { - { "52.0", voltronic_eco_freq_max }, /* P02/P03/P10/P14/P99 ofn==50.0 */ + { "52.0", voltronic_eco_freq_max }, /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ { "53.0", voltronic_eco_freq_max }, /* P01/P09 ofn==50.0 */ - { "54.0", voltronic_eco_freq_max }, /* P02/P03/P10/P14/P99 ofn==50.0 */ + { "54.0", voltronic_eco_freq_max }, /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ { "60.0", voltronic_eco_freq_max }, /* P01/P09 ofn==50.0 */ - { "62.0", voltronic_eco_freq_max }, /* P02/P03/P10/P14/P99 ofn==60.0 */ + { "62.0", voltronic_eco_freq_max }, /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ { "63.0", voltronic_eco_freq_max }, /* P01/P09 ofn==60.0 */ - { "64.0", voltronic_eco_freq_max }, /* P02/P03/P10/P14/P99 ofn==60.0 */ + { "64.0", voltronic_eco_freq_max }, /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ { "70.0", voltronic_eco_freq_max }, /* P01/P09 ofn==60.0 */ { "", 0 } }; @@ -857,12 +857,12 @@ static int voltronic_eco_freq_max(char *value, size_t len) switch (val) { - case 52: /* P02/P03/P10/P14/P99 ofn==50.0 */ + case 52: /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -877,12 +877,12 @@ static int voltronic_eco_freq_max(char *value, size_t len) break; - case 54: /* P02/P03/P10/P14/P99 ofn==50.0 */ + case 54: /* P02/P03/P10/P13/P14/P99 ofn==50.0 */ if (ofn != 50.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -897,12 +897,12 @@ static int voltronic_eco_freq_max(char *value, size_t len) break; - case 62: /* P02/P03/P10/P14/P99 ofn==60.0 */ + case 62: /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -917,12 +917,12 @@ static int voltronic_eco_freq_max(char *value, size_t len) break; - case 64: /* P02/P03/P10/P14/P99 ofn==60.0 */ + case 64: /* P02/P03/P10/P13/P14/P99 ofn==60.0 */ if (ofn != 60.0) return -1; - if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) + if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) return 0; break; @@ -972,7 +972,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "ups.firmware.aux", 0, NULL, "QPI\r", "", 6, '(', "", 1, 4, "%s", QX_FLAG_STATIC, voltronic_protocol }, + { "ups.firmware.aux", 0, NULL, "QPI\r", "", 6, '(', "", 1, 4, "%s", QX_FLAG_STATIC, NULL, voltronic_protocol }, /* Query UPS for ratings * > [QRI\r] @@ -981,10 +981,10 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 */ - { "output.voltage.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 1, 5, "%.1f", QX_FLAG_STATIC, NULL }, - { "output.current.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 7, 9, "%.0f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 11, 15, "%.1f", QX_FLAG_SEMI_STATIC, NULL }, /* as *per battery pack*: the value will change when the number of batteries is changed (battery_number through BATNn) */ - { "output.frequency.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 17, 20, "%.1f", QX_FLAG_STATIC, NULL }, + { "output.voltage.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 1, 5, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "output.current.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 7, 9, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 11, 15, "%.1f", QX_FLAG_SEMI_STATIC, NULL, NULL }, /* as *per battery pack*: the value will change when the number of batteries is changed (battery_number through BATNn) */ + { "output.frequency.nominal", 0, NULL, "QRI\r", "", 22, '(', "", 17, 20, "%.1f", QX_FLAG_STATIC, NULL, NULL }, /* Query UPS for ratings * > [QMD\r] @@ -993,15 +993,15 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 3 4 */ - { "device.model", 0, NULL, "QMD\r", "", 48, '(', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "ups.power.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 17, 23, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "output.powerfactor", 0, NULL, "QMD\r", "", 48, '(', "", 25, 26, "%.1f", QX_FLAG_STATIC, voltronic_output_powerfactor }, - { "input.phases", 0, NULL, "QMD\r", "", 48, '(', "", 28, 28, "%.0f", QX_FLAG_STATIC, NULL }, - { "output.phases", 0, NULL, "QMD\r", "", 48, '(', "", 30, 30, "%.0f", QX_FLAG_STATIC, NULL }, - { "input.voltage.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 32, 34, "%.1f", QX_FLAG_STATIC, NULL }, - { "output.voltage.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 36, 38, "%.1f", QX_FLAG_STATIC, NULL }, /* redundant with value from QRI */ -/* { "battery_number", ST_FLAG_RW, voltronic_r_batt_numb, "QMD\r", "", 48, '(', "", 40, 41, "%d", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT, voltronic_batt_numb }, *//* redundant with value from QBV */ -/* { "battery.voltage.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 43, 46, "%.1f", QX_FLAG_STATIC, NULL }, *//* as *per battery* vs *per pack* reported by QRI */ + { "device.model", 0, NULL, "QMD\r", "", 48, '(', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "ups.power.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 17, 23, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "output.powerfactor", 0, NULL, "QMD\r", "", 48, '(', "", 25, 26, "%.1f", QX_FLAG_STATIC, NULL, voltronic_output_powerfactor }, + { "input.phases", 0, NULL, "QMD\r", "", 48, '(', "", 28, 28, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "output.phases", 0, NULL, "QMD\r", "", 48, '(', "", 30, 30, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "input.voltage.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 32, 34, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "output.voltage.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 36, 38, "%.1f", QX_FLAG_STATIC, NULL, NULL }, /* redundant with value from QRI */ +/* { "battery_number", ST_FLAG_RW, voltronic_r_batt_numb, "QMD\r", "", 48, '(', "", 40, 41, "%d", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT, NULL, voltronic_batt_numb }, *//* redundant with value from QBV */ +/* { "battery.voltage.nominal", 0, NULL, "QMD\r", "", 48, '(', "", 43, 46, "%.1f", QX_FLAG_STATIC, NULL, NULL }, *//* as *per battery* vs *per pack* reported by QRI */ /* Query UPS for ratings * > [F\r] @@ -1010,10 +1010,10 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 */ - { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.1f", QX_FLAG_STATIC, NULL }, + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.1f", QX_FLAG_STATIC, NULL, NULL }, /* Query UPS for manufacturer * > [QMF\r] @@ -1022,7 +1022,7 @@ static item_t voltronic_qx2nut[] = { * 0 1 */ - { "device.mfr", 0, NULL, "QMF\r", "", 2, '(', "", 1, 0, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, + { "device.mfr", 0, NULL, "QMF\r", "", 2, '(', "", 1, 0, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, /* Query UPS for firmware version * > [QVFW\r] @@ -1031,7 +1031,7 @@ static item_t voltronic_qx2nut[] = { * 0 1 */ - { "ups.firmware", 0, NULL, "QVFW\r", "", 16, '(', "", 7, 14, "%s", QX_FLAG_STATIC, NULL }, + { "ups.firmware", 0, NULL, "QVFW\r", "", 16, '(', "", 7, 14, "%s", QX_FLAG_STATIC, NULL, NULL }, /* Query UPS for serial number * > [QID\r] @@ -1040,7 +1040,7 @@ static item_t voltronic_qx2nut[] = { * 0 1 */ - { "device.serial", 0, NULL, "QID\r", "", 2, '(', "", 1, 0, "%s", QX_FLAG_STATIC, voltronic_serial_numb }, + { "device.serial", 0, NULL, "QID\r", "", 2, '(', "", 1, 0, "%s", QX_FLAG_STATIC, NULL, voltronic_serial_numb }, /* Query UPS for vendor infos * > [I\r] @@ -1049,9 +1049,9 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 3 */ - { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, + { "device.mfr", 0, NULL, "I\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "device.model", 0, NULL, "I\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "ups.firmware", 0, NULL, "I\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, /* Query UPS for status * > [QGS\r] @@ -1060,29 +1060,29 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 3 4 5 6 7 */ - { "input.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.frequency", 0, NULL, "QGS\r", "", 76, '(', "", 7, 10, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 12, 16, "%.1f", 0, NULL }, - { "output.frequency", 0, NULL, "QGS\r", "", 76, '(', "", 18, 21, "%.1f", 0, NULL }, - { "output.current", 0, NULL, "QGS\r", "", 76, '(', "", 23, 27, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "QGS\r", "", 76, '(', "", 29, 31, "%.0f", 0, NULL }, -/* { "unknown.1", 0, NULL, "QGS\r", "", 76, '(', "", 33, 37, "%.1f", 0, NULL }, *//* Unknown */ -/* { "unknown.2", 0, NULL, "QGS\r", "", 76, '(', "", 39, 43, "%.1f", 0, NULL }, *//* Unknown */ - { "battery.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 45, 49, "%.2f", 0, NULL }, -/* { "unknown.3", 0, NULL, "QGS\r", "", 76, '(', "", 51, 55, "%.1f", 0, NULL }, *//* Unknown */ - { "ups.temperature", 0, NULL, "QGS\r", "", 76, '(', "", 57, 61, "%.1f", 0, NULL }, - { "ups.type", 0, NULL, "QGS\r", "", 76, '(', "", 63, 64, "%s", QX_FLAG_SEMI_STATIC, voltronic_status }, - { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 65, 65, "%s", QX_FLAG_QUICK_POLL, voltronic_status }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 66, 66, "%s", QX_FLAG_QUICK_POLL, voltronic_status }, /* Battery Low */ - { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 67, 67, "%s", QX_FLAG_QUICK_POLL, voltronic_status }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "QGS\r", "", 76, '(', "", 67, 67, "%s", 0, voltronic_status }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "QGS\r", "", 76, '(', "", 68, 68, "%s", 0, voltronic_status }, /* UPS Fault */ -/* { "unknown.4", 0, NULL, "QGS\r", "", 76, '(', "", 69, 69, "%s", 0, voltronic_status }, *//* Unknown */ - { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 70, 70, "%s", QX_FLAG_QUICK_POLL, voltronic_status }, /* Test in Progress */ - { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 71, 71, "%s", QX_FLAG_QUICK_POLL, voltronic_status }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "QGS\r", "", 76, '(', "", 72, 72, "%s", 0, voltronic_status }, /* Beeper status - ups.beeper.status */ -/* { "unknown.5", 0, NULL, "QGS\r", "", 76, '(', "", 73, 73, "%s", 0, voltronic_status }, *//* Unknown */ -/* { "unknown.6", 0, NULL, "QGS\r", "", 76, '(', "", 74, 74, "%s", 0, voltronic_status }, *//* Unknown */ + { "input.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "QGS\r", "", 76, '(', "", 7, 10, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 12, 16, "%.1f", 0, NULL, NULL }, + { "output.frequency", 0, NULL, "QGS\r", "", 76, '(', "", 18, 21, "%.1f", 0, NULL, NULL }, + { "output.current", 0, NULL, "QGS\r", "", 76, '(', "", 23, 27, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "QGS\r", "", 76, '(', "", 29, 31, "%.0f", 0, NULL, NULL }, +/* { "unknown.1", 0, NULL, "QGS\r", "", 76, '(', "", 33, 37, "%.1f", 0, NULL, NULL }, *//* Unknown */ +/* { "unknown.2", 0, NULL, "QGS\r", "", 76, '(', "", 39, 43, "%.1f", 0, NULL, NULL }, *//* Unknown */ + { "battery.voltage", 0, NULL, "QGS\r", "", 76, '(', "", 45, 49, "%.2f", 0, NULL, NULL }, +/* { "unknown.3", 0, NULL, "QGS\r", "", 76, '(', "", 51, 55, "%.1f", 0, NULL, NULL }, *//* Unknown */ + { "ups.temperature", 0, NULL, "QGS\r", "", 76, '(', "", 57, 61, "%.1f", 0, NULL, NULL }, + { "ups.type", 0, NULL, "QGS\r", "", 76, '(', "", 63, 64, "%s", QX_FLAG_SEMI_STATIC, NULL, voltronic_status }, + { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 65, 65, "%s", QX_FLAG_QUICK_POLL, NULL, voltronic_status }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 66, 66, "%s", QX_FLAG_QUICK_POLL, NULL, voltronic_status }, /* Battery Low */ + { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 67, 67, "%s", QX_FLAG_QUICK_POLL, NULL, voltronic_status }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "QGS\r", "", 76, '(', "", 67, 67, "%s", 0, NULL, voltronic_status }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "QGS\r", "", 76, '(', "", 68, 68, "%s", 0, NULL, voltronic_status }, /* UPS Fault */ +/* { "unknown.4", 0, NULL, "QGS\r", "", 76, '(', "", 69, 69, "%s", 0, NULL, voltronic_status }, *//* Unknown */ + { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 70, 70, "%s", QX_FLAG_QUICK_POLL, NULL, voltronic_status }, /* Test in Progress */ + { "ups.status", 0, NULL, "QGS\r", "", 76, '(', "", 71, 71, "%s", QX_FLAG_QUICK_POLL, NULL, voltronic_status }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "QGS\r", "", 76, '(', "", 72, 72, "%s", 0, NULL, voltronic_status }, /* Beeper status - ups.beeper.status */ +/* { "unknown.5", 0, NULL, "QGS\r", "", 76, '(', "", 73, 73, "%s", 0, NULL, voltronic_status }, *//* Unknown */ +/* { "unknown.6", 0, NULL, "QGS\r", "", 76, '(', "", 74, 74, "%s", 0, NULL, voltronic_status }, *//* Unknown */ /* Query UPS for actual working mode * > [QMOD\r] @@ -1091,8 +1091,8 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "ups.alarm", 0, NULL, "QMOD\r", "", 3, '(', "", 1, 1, "%s", 0, voltronic_mode }, - { "ups.status", 0, NULL, "QMOD\r", "", 3, '(', "", 1, 1, "%s", 0, voltronic_mode }, + { "ups.alarm", 0, NULL, "QMOD\r", "", 3, '(', "", 1, 1, "%s", 0, NULL, voltronic_mode }, + { "ups.status", 0, NULL, "QMOD\r", "", 3, '(', "", 1, 1, "%s", 0, NULL, voltronic_mode }, /* Query UPS for faults and their type. Unskipped when a fault is found in 12bit flag of QGS, otherwise you'll get a fake reply. * > [QFS\r] @@ -1104,7 +1104,7 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 3 4 5 6 */ - { "ups.alarm", 0, NULL, "QFS\r", "", 4, '(', "", 1, 2, "%s", QX_FLAG_SKIP, voltronic_fault }, + { "ups.alarm", 0, NULL, "QFS\r", "", 4, '(', "", 1, 2, "%s", QX_FLAG_SKIP, NULL, voltronic_fault }, /* Query UPS for warnings and their type * > [QWS\r] @@ -1113,7 +1113,7 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 3 4 5 6 */ - { "ups.alarm", 0, NULL, "QWS\r", "", 66, '(', "", 1, 64, "%s", 0, voltronic_warning }, + { "ups.alarm", 0, NULL, "QWS\r", "", 66, '(', "", 1, 64, "%s", 0, NULL, voltronic_warning }, /* Query UPS for actual infos about battery * > [QBV\r] @@ -1122,11 +1122,11 @@ static item_t voltronic_qx2nut[] = { * 0 1 2 */ - { "battery.voltage", 0, NULL, "QBV\r", "", 21, '(', "", 1, 5, "%.2f", 0, NULL }, - { "battery_number", ST_FLAG_RW, voltronic_r_batt_numb, "QBV\r", "", 21, '(', "", 7, 9, "%d", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT, voltronic_batt_numb }, /* Number of batteries that make a pack */ - { "battery.packs", ST_FLAG_RW, voltronic_r_batt_packs, "QBV\r", "", 21, '(', "", 10, 11, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE, NULL }, /* Number of battery packs in parallel */ - { "battery.charge", 0, NULL, "QBV\r", "", 21, '(', "", 13, 15, "%.0f", 0, NULL }, - { "battery.runtime", 0, NULL, "QBV\r", "", 21, '(', "", 17, 19, "%.0f", 0, voltronic_batt_runtime }, + { "battery.voltage", 0, NULL, "QBV\r", "", 21, '(', "", 1, 5, "%.2f", 0, NULL, NULL }, + { "battery_number", ST_FLAG_RW, voltronic_r_batt_numb, "QBV\r", "", 21, '(', "", 7, 9, "%d", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT, NULL, voltronic_batt_numb }, /* Number of batteries that make a pack */ + { "battery.packs", ST_FLAG_RW, voltronic_r_batt_packs, "QBV\r", "", 21, '(', "", 10, 11, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE, NULL, NULL }, /* Number of battery packs in parallel */ + { "battery.charge", 0, NULL, "QBV\r", "", 21, '(', "", 13, 15, "%.0f", 0, NULL, NULL }, + { "battery.runtime", 0, NULL, "QBV\r", "", 21, '(', "", 17, 19, "%.0f", 0, NULL, voltronic_batt_runtime }, /* Query UPS for last seen min/max load level * > [QLDL\r] @@ -1135,8 +1135,8 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "output.power.minimum.percent", 0, NULL, "QLDL\r", "", 9, '(', "", 1, 3, "%.0f", 0, NULL }, - { "output.power.maximum.percent", 0, NULL, "QLDL\r", "", 9, '(', "", 5, 7, "%.0f", 0, NULL }, + { "output.power.minimum.percent", 0, NULL, "QLDL\r", "", 9, '(', "", 1, 3, "%.0f", 0, NULL, NULL }, + { "output.power.maximum.percent", 0, NULL, "QLDL\r", "", 9, '(', "", 5, 7, "%.0f", 0, NULL, NULL }, /* Query UPS for multi-phase voltages/frequencies * > [Q3**\r] @@ -1169,50 +1169,50 @@ static item_t voltronic_qx2nut[] = { */ /* From Q3PV */ - { "input.L1-N.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL }, - { "input.L2-N.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL }, - { "input.L3-N.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL }, - { "input.L1-L2.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 19, 23, "%.1f", QX_FLAG_SKIP, NULL }, - { "input.L2-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL }, - { "input.L1-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL }, -/* { "input.L1-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ -/* { "input.L2-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ + { "input.L1-N.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "input.L2-N.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "input.L3-N.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "input.L1-L2.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 19, 23, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "input.L2-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "input.L1-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL, NULL }, +/* { "input.L1-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ +/* { "input.L2-L3.voltage", 0, NULL, "Q3PV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ /* From Q3PC */ - { "input.L1.current", 0, NULL, "Q3PC\r", "", 13, '(', "", 1, 3, "%.0f", QX_FLAG_SKIP, NULL }, - { "input.L2.current", 0, NULL, "Q3PC\r", "", 13, '(', "", 5, 7, "%.0f", QX_FLAG_SKIP, NULL }, - { "input.L3.current", 0, NULL, "Q3PC\r", "", 13, '(', "", 9, 11, "%.0f", QX_FLAG_SKIP, NULL }, + { "input.L1.current", 0, NULL, "Q3PC\r", "", 13, '(', "", 1, 3, "%.0f", QX_FLAG_SKIP, NULL, NULL }, + { "input.L2.current", 0, NULL, "Q3PC\r", "", 13, '(', "", 5, 7, "%.0f", QX_FLAG_SKIP, NULL, NULL }, + { "input.L3.current", 0, NULL, "Q3PC\r", "", 13, '(', "", 9, 11, "%.0f", QX_FLAG_SKIP, NULL, NULL }, /* From Q3OV */ - { "output.L1-N.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.L2-N.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.L3-N.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.L1-L2.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 19, 23, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.L2-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.L1-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL }, -/* { "output.L1-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ -/* { "output.L2-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ + { "output.L1-N.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L2-N.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L3-N.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L1-L2.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 19, 23, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L2-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L1-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL, NULL }, +/* { "output.L1-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ +/* { "output.L2-L3.voltage", 0, NULL, "Q3OV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ /* From Q3OC */ - { "output.L1.current", 0, NULL, "Q3OC\r", "", 13, '(', "", 1, 3, "%.0f", QX_FLAG_SKIP, NULL }, - { "output.L2.current", 0, NULL, "Q3OC\r", "", 13, '(', "", 5, 7, "%.0f", QX_FLAG_SKIP, NULL }, - { "output.L3.current", 0, NULL, "Q3OC\r", "", 13, '(', "", 9, 11, "%.0f", QX_FLAG_SKIP, NULL }, + { "output.L1.current", 0, NULL, "Q3OC\r", "", 13, '(', "", 1, 3, "%.0f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L2.current", 0, NULL, "Q3OC\r", "", 13, '(', "", 5, 7, "%.0f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L3.current", 0, NULL, "Q3OC\r", "", 13, '(', "", 9, 11, "%.0f", QX_FLAG_SKIP, NULL, NULL }, /* From Q3LD */ - { "output.L1.power.percent", 0, NULL, "Q3LD\r", "", 13, '(', "", 1, 3, "%.0f", QX_FLAG_SKIP, NULL }, - { "output.L2.power.percent", 0, NULL, "Q3LD\r", "", 13, '(', "", 5, 7, "%.0f", QX_FLAG_SKIP, NULL }, - { "output.L3.power.percent", 0, NULL, "Q3LD\r", "", 13, '(', "", 9, 11, "%.0f", QX_FLAG_SKIP, NULL }, + { "output.L1.power.percent", 0, NULL, "Q3LD\r", "", 13, '(', "", 1, 3, "%.0f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L2.power.percent", 0, NULL, "Q3LD\r", "", 13, '(', "", 5, 7, "%.0f", QX_FLAG_SKIP, NULL, NULL }, + { "output.L3.power.percent", 0, NULL, "Q3LD\r", "", 13, '(', "", 9, 11, "%.0f", QX_FLAG_SKIP, NULL, NULL }, /* From Q3YV */ - { "output.bypass.L1-N.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.bypass.L2-N.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.bypass.L3-N.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.bypass.L1-N.voltage", 0, NULL, "Q3YV\r", "", 19, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL }, /* P09 */ - { "output.bypass.L2-N.voltage", 0, NULL, "Q3YV\r", "", 19, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL }, /* P09 */ -/* { "output.bypass.L3-N.voltage", 0, NULL, "Q3YV\r", "", 19, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ - { "output.bypass.L1-L2.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 19, 23, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.bypass.L2-L3.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL }, - { "output.bypass.L1-L3.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL }, + { "output.bypass.L1-N.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.bypass.L2-N.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.bypass.L3-N.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.bypass.L1-N.voltage", 0, NULL, "Q3YV\r", "", 19, '(', "", 1, 5, "%.1f", QX_FLAG_SKIP, NULL, NULL }, /* P09 */ + { "output.bypass.L2-N.voltage", 0, NULL, "Q3YV\r", "", 19, '(', "", 7, 11, "%.1f", QX_FLAG_SKIP, NULL, NULL }, /* P09 */ +/* { "output.bypass.L3-N.voltage", 0, NULL, "Q3YV\r", "", 19, '(', "", 13, 17, "%.1f", QX_FLAG_SKIP, NULL, NULL }, *//* P09 *//* Commented out because P09 should be two-phase input/output UPSes */ + { "output.bypass.L1-L2.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 19, 23, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.bypass.L2-L3.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 25, 29, "%.1f", QX_FLAG_SKIP, NULL, NULL }, + { "output.bypass.L1-L3.voltage", 0, NULL, "Q3YV\r", "", 37, '(', "", 31, 35, "%.1f", QX_FLAG_SKIP, NULL, NULL }, /* Query UPS for capability - total options available: 23; only those whom the UPS is capable of are reported as Enabled or Disabled * > [QFLAG\r] @@ -1221,24 +1221,24 @@ static item_t voltronic_qx2nut[] = { * 0 1 * min length = ( + E + D + \r = 4 */ - { "ups.start.auto", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, voltronic_capability }, - { "battery.protection", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, voltronic_capability }, - { "battery.energysave", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, voltronic_capability }, - { "ups.start.battery", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, voltronic_capability }, - { "outlet.0.switchable", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, voltronic_capability }, + { "ups.start.auto", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, NULL, voltronic_capability }, + { "battery.protection", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, NULL, voltronic_capability }, + { "battery.energysave", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, NULL, voltronic_capability }, + { "ups.start.battery", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, NULL, voltronic_capability }, + { "outlet.0.switchable", ST_FLAG_RW, voltronic_e_cap, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM, NULL, voltronic_capability }, /* Not available in NUT */ - { "bypass_alarm", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "battery_alarm", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "bypass_when_off", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "alarm_control", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "converter_mode", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "eco_mode", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "battery_open_status_check", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "bypass_forbidding", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "site_fault_detection", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "advanced_eco_mode", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "constant_phase_angle", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, - { "limited_runtime_on_battery", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_capability }, + { "bypass_alarm", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "battery_alarm", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "bypass_when_off", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "alarm_control", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "converter_mode", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "eco_mode", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "battery_open_status_check", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "bypass_forbidding", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "site_fault_detection", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "advanced_eco_mode", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "constant_phase_angle", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, + { "limited_runtime_on_battery", 0, NULL, "QFLAG\r", "", 4, '(', "", 1, 0, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_capability }, /* Enable or Disable or Reset to safe default values capability options * > [PEX\r] > [PDX\r] > [PF\r] @@ -1247,25 +1247,25 @@ static item_t voltronic_qx2nut[] = { * 0 0 0 */ - { "ups.start.auto", 0, voltronic_e_cap, "P%sR\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, voltronic_capability_set }, - { "battery.protection", 0, voltronic_e_cap, "P%sS\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, voltronic_capability_set }, - { "battery.energysave", 0, voltronic_e_cap, "P%sG\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, voltronic_capability_set }, - { "ups.start.battery", 0, voltronic_e_cap, "P%sC\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, voltronic_capability_set }, - { "outlet.0.switchable", 0, voltronic_e_cap, "P%sJ\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, voltronic_capability_set }, + { "ups.start.auto", 0, voltronic_e_cap, "P%sR\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, NULL, voltronic_capability_set }, + { "battery.protection", 0, voltronic_e_cap, "P%sS\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, NULL, voltronic_capability_set }, + { "battery.energysave", 0, voltronic_e_cap, "P%sG\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, NULL, voltronic_capability_set }, + { "ups.start.battery", 0, voltronic_e_cap, "P%sC\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, NULL, voltronic_capability_set }, + { "outlet.0.switchable", 0, voltronic_e_cap, "P%sJ\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, NULL, voltronic_capability_set }, /* Not available in NUT */ - { "reset_to_default", 0, NULL, "PF\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_reset }, - { "bypass_alarm", 0, voltronic_e_cap_nonut, "P%sP\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "battery_alarm", 0, voltronic_e_cap_nonut, "P%sB\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "bypass_when_off", 0, voltronic_e_cap_nonut, "P%sO\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "alarm_control", 0, voltronic_e_cap_nonut, "P%sA\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "converter_mode", 0, voltronic_e_cap_nonut, "P%sV\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "eco_mode", 0, voltronic_e_cap_nonut, "P%sE\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "battery_open_status_check", 0, voltronic_e_cap_nonut, "P%sD\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "bypass_forbidding", 0, voltronic_e_cap_nonut, "P%sF\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "site_fault_detection", 0, voltronic_e_cap_nonut, "P%sL\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "advanced_eco_mode", 0, voltronic_e_cap_nonut, "P%sN\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "constant_phase_angle", 0, voltronic_e_cap_nonut, "P%sQ\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, - { "limited_runtime_on_battery", 0, voltronic_e_cap_nonut, "P%sW\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_capability_set_nonut }, + { "reset_to_default", 0, NULL, "PF\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_reset }, + { "bypass_alarm", 0, voltronic_e_cap_nonut, "P%sP\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "battery_alarm", 0, voltronic_e_cap_nonut, "P%sB\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "bypass_when_off", 0, voltronic_e_cap_nonut, "P%sO\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "alarm_control", 0, voltronic_e_cap_nonut, "P%sA\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "converter_mode", 0, voltronic_e_cap_nonut, "P%sV\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "eco_mode", 0, voltronic_e_cap_nonut, "P%sE\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "battery_open_status_check", 0, voltronic_e_cap_nonut, "P%sD\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "bypass_forbidding", 0, voltronic_e_cap_nonut, "P%sF\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "site_fault_detection", 0, voltronic_e_cap_nonut, "P%sL\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "advanced_eco_mode", 0, voltronic_e_cap_nonut, "P%sN\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "constant_phase_angle", 0, voltronic_e_cap_nonut, "P%sQ\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, + { "limited_runtime_on_battery", 0, voltronic_e_cap_nonut, "P%sW\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_capability_set_nonut }, /* Query UPS for programmable outlet (1-4) status * > [QSK1\r] @@ -1274,14 +1274,14 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "outlet.1.switchable", 0, NULL, "QSK1\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, - { "outlet.1.status", 0, NULL, "QSK1\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, - { "outlet.2.switchable", 0, NULL, "QSK2\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, - { "outlet.2.status", 0, NULL, "QSK2\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, - { "outlet.3.switchable", 0, NULL, "QSK3\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, - { "outlet.3.status", 0, NULL, "QSK3\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, - { "outlet.4.switchable", 0, NULL, "QSK4\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, - { "outlet.4.status", 0, NULL, "QSK4\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_outlet }, + { "outlet.1.switchable", 0, NULL, "QSK1\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, + { "outlet.1.status", 0, NULL, "QSK1\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, + { "outlet.2.switchable", 0, NULL, "QSK2\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, + { "outlet.2.status", 0, NULL, "QSK2\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, + { "outlet.3.switchable", 0, NULL, "QSK3\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, + { "outlet.3.status", 0, NULL, "QSK3\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, + { "outlet.4.switchable", 0, NULL, "QSK4\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, + { "outlet.4.status", 0, NULL, "QSK4\r", "", 3, '(', "", 1, 1, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_outlet }, /* Query UPS for programmable outlet n (1-4) delay time before it shuts down the load when on battery mode * > [QSKT1\r] @@ -1290,10 +1290,10 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "outlet.1.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT1\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay }, - { "outlet.2.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT2\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay }, - { "outlet.3.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT3\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay }, - { "outlet.4.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT4\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay }, + { "outlet.1.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT1\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay }, + { "outlet.2.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT2\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay }, + { "outlet.3.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT3\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay }, + { "outlet.4.delay.shutdown", ST_FLAG_RW, voltronic_r_outlet_delay, "QSKT4\r", "", 5, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay }, /* Set delay time for programmable outlets * > [PSK1nnn\r] n = 0..9 @@ -1302,10 +1302,10 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "outlet.1.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK1%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay_set }, - { "outlet.2.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK2%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay_set }, - { "outlet.3.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK3%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay_set }, - { "outlet.4.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK4%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_outlet_delay_set }, + { "outlet.1.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK1%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay_set }, + { "outlet.2.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK2%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay_set }, + { "outlet.3.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK3%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay_set }, + { "outlet.4.delay.shutdown", 0, voltronic_r_outlet_delay, "PSK4%03d\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_outlet_delay_set }, /* Query UPS for ECO Mode voltage limits * > [QHE\r] @@ -1314,12 +1314,12 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "input.transfer.high", ST_FLAG_RW, voltronic_r_eco_volt_max, "QHE\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_eco_volt }, - { "input.transfer.low", ST_FLAG_RW, voltronic_r_eco_volt_min, "QHE\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_eco_volt }, - { "input.transfer.low.min", 0, NULL, "QHE\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_eco_volt_range }, - { "input.transfer.low.max", 0, NULL, "QHE\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_eco_volt_range }, - { "input.transfer.high.min", 0, NULL, "QHE\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_eco_volt_range }, - { "input.transfer.high.max", 0, NULL, "QHE\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, voltronic_eco_volt_range }, + { "input.transfer.high", ST_FLAG_RW, voltronic_r_eco_volt_max, "QHE\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_eco_volt }, + { "input.transfer.low", ST_FLAG_RW, voltronic_r_eco_volt_min, "QHE\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_eco_volt }, + { "input.transfer.low.min", 0, NULL, "QHE\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_eco_volt_range }, + { "input.transfer.low.max", 0, NULL, "QHE\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_eco_volt_range }, + { "input.transfer.high.min", 0, NULL, "QHE\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_eco_volt_range }, + { "input.transfer.high.max", 0, NULL, "QHE\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_SKIP, NULL, voltronic_eco_volt_range }, /* Set ECO Mode voltage limits * > [HEHnnn\r] > [HELnnn\r] n = 0..9 @@ -1328,8 +1328,8 @@ static item_t voltronic_qx2nut[] = { * 0 0 */ - { "input.transfer.high", 0, voltronic_r_eco_volt_max, "HEH%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_process_setvar }, - { "input.transfer.low", 0, voltronic_r_eco_volt_min, "HEL%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_process_setvar }, + { "input.transfer.high", 0, voltronic_r_eco_volt_max, "HEH%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, + { "input.transfer.low", 0, voltronic_r_eco_volt_min, "HEL%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, /* Query UPS for ECO Mode frequency limits * > [QFRE\r] @@ -1338,8 +1338,8 @@ static item_t voltronic_qx2nut[] = { * 0 1 */ - { "input.frequency.high", ST_FLAG_RW, voltronic_r_eco_freq_max, "QFRE\r", "", 11, '(', "", 1, 4, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_eco_freq }, - { "input.frequency.low", ST_FLAG_RW, voltronic_r_eco_freq_min, "QFRE\r", "", 11, '(', "", 6, 9, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_eco_freq }, + { "input.frequency.high", ST_FLAG_RW, voltronic_r_eco_freq_max, "QFRE\r", "", 11, '(', "", 1, 4, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_eco_freq }, + { "input.frequency.low", ST_FLAG_RW, voltronic_r_eco_freq_min, "QFRE\r", "", 11, '(', "", 6, 9, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_eco_freq }, /* Set ECO Mode frequency limits * > [FREHnn.n\r] > [FRELnn.n\r] n = 0..9 @@ -1348,8 +1348,8 @@ static item_t voltronic_qx2nut[] = { * 0 0 */ - { "input.frequency.high", 0, voltronic_r_eco_freq_max, "FREH%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_process_setvar }, - { "input.frequency.low", 0, voltronic_r_eco_freq_min, "FREL%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, voltronic_process_setvar }, + { "input.frequency.high", 0, voltronic_r_eco_freq_max, "FREH%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, + { "input.frequency.low", 0, voltronic_r_eco_freq_min, "FREL%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, /* Query UPS for Bypass Mode voltage limits * > [QBYV\r] @@ -1358,8 +1358,8 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "max_bypass_volt", ST_FLAG_RW, voltronic_r_bypass_volt_max, "QBYV\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_bypass }, - { "min_bypass_volt", ST_FLAG_RW, voltronic_r_bypass_volt_min, "QBYV\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_bypass }, + { "max_bypass_volt", ST_FLAG_RW, voltronic_r_bypass_volt_max, "QBYV\r", "", 9, '(', "", 1, 3, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_bypass }, + { "min_bypass_volt", ST_FLAG_RW, voltronic_r_bypass_volt_min, "QBYV\r", "", 9, '(', "", 5, 7, "%.0f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_bypass }, /* Set Bypass Mode voltage limits * > [PHVnnn\r] > [PLVnnn\r] n = 0..9 @@ -1368,8 +1368,8 @@ static item_t voltronic_qx2nut[] = { * 0 0 */ - { "max_bypass_volt", 0, voltronic_r_bypass_volt_max, "PHV%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_process_setvar }, - { "min_bypass_volt", 0, voltronic_r_bypass_volt_min, "PLV%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_process_setvar }, + { "max_bypass_volt", 0, voltronic_r_bypass_volt_max, "PHV%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, + { "min_bypass_volt", 0, voltronic_r_bypass_volt_min, "PLV%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, /* Query UPS for Bypass Mode frequency limits * > [QBYF\r] @@ -1378,8 +1378,8 @@ static item_t voltronic_qx2nut[] = { * 0 1 */ - { "max_bypass_freq", ST_FLAG_RW, voltronic_r_bypass_freq_max, "QBYF\r", "", 11, '(', "", 1, 4, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_bypass }, - { "min_bypass_freq", ST_FLAG_RW, voltronic_r_bypass_freq_min, "QBYF\r", "", 11, '(', "", 6, 9, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_bypass }, + { "max_bypass_freq", ST_FLAG_RW, voltronic_r_bypass_freq_max, "QBYF\r", "", 11, '(', "", 1, 4, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_bypass }, + { "min_bypass_freq", ST_FLAG_RW, voltronic_r_bypass_freq_min, "QBYF\r", "", 11, '(', "", 6, 9, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_bypass }, /* Set Bypass Mode frequency limits * > [PGFnn.n\r] > [PSFnn.n\r] n = 0..9 @@ -1388,8 +1388,8 @@ static item_t voltronic_qx2nut[] = { * 0 0 */ - { "max_bypass_freq", 0, voltronic_r_bypass_freq_max, "PGF%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_process_setvar }, - { "min_bypass_freq", 0, voltronic_r_bypass_freq_min, "PSF%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_process_setvar }, + { "max_bypass_freq", 0, voltronic_r_bypass_freq_max, "PGF%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, + { "min_bypass_freq", 0, voltronic_r_bypass_freq_min, "PSF%04.1f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_process_setvar }, /* Set number of batteries that make a pack to n (integer, 1-9). NOTE: changing the number of batteries will change the UPS's estimation on battery charge/runtime * > [BATNn\r] @@ -1398,7 +1398,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "battery_number", 0, voltronic_r_batt_numb, "BATN%1.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT, voltronic_process_setvar }, + { "battery_number", 0, voltronic_r_batt_numb, "BATN%1.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE | QX_FLAG_NONUT, NULL, voltronic_process_setvar }, /* Set number of battery packs in parallel to n (integer, 01-99). NOTE: changing the number of battery packs will change the UPS's estimation on battery charge/runtime * > [BATGNn\r] @@ -1407,7 +1407,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "battery.packs", 0, voltronic_r_batt_packs, "BATGN%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE, voltronic_process_setvar }, + { "battery.packs", 0, voltronic_r_batt_packs, "BATGN%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, voltronic_process_setvar }, /* Query UPS for battery type (Only P31) * > [QBT\r] @@ -1416,7 +1416,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "battery.type", ST_FLAG_RW, voltronic_e_batt_type, "QBT\r", "", 4, '(', "", 1, 2, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_SKIP, voltronic_p31b }, + { "battery.type", ST_FLAG_RW, voltronic_e_batt_type, "QBT\r", "", 4, '(', "", 1, 2, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_SKIP, NULL, voltronic_p31b }, /* Set battery type (Only P31) * > [PBTnn\r] nn = 00/01/02 @@ -1425,7 +1425,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "battery.type", 0, voltronic_e_batt_type, "PBT%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, voltronic_p31b_set }, + { "battery.type", 0, voltronic_e_batt_type, "PBT%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_SKIP, NULL, voltronic_p31b_set }, /* Query UPS for device grid working range (Only P31) * > [QGR\r] @@ -1434,7 +1434,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "work_range_type", ST_FLAG_RW, voltronic_e_work_range, "QGR\r", "", 4, '(', "", 1, 2, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_p31g }, + { "work_range_type", ST_FLAG_RW, voltronic_e_work_range, "QGR\r", "", 4, '(', "", 1, 2, "%s", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_p31g }, /* Set device grid working range type (Only P31) * > [PBTnn\r] nn = 00/01 @@ -1443,7 +1443,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "work_range_type", 0, voltronic_e_work_range, "PGR%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_p31g_set }, + { "work_range_type", 0, voltronic_e_work_range, "PGR%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_p31g_set }, /* Query UPS for battery low voltage * > [RE0\r] @@ -1452,7 +1452,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "battery.voltage.low", ST_FLAG_RW, voltronic_r_batt_low, "RE0\r", "", 3, '#', "", 1, 2, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE, NULL }, + { "battery.voltage.low", ST_FLAG_RW, voltronic_r_batt_low, "RE0\r", "", 3, '#', "", 1, 2, "%.1f", QX_FLAG_SEMI_STATIC | QX_FLAG_RANGE, NULL, NULL }, /* Set voltage for battery low to n (integer, 20..24/20..28). NOTE: changing the battery low voltage will change the UPS's estimation on battery charge/runtime * > [W0En\r] @@ -1461,7 +1461,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "battery.voltage.low", 0, voltronic_r_batt_low, "W0E%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE, voltronic_process_setvar }, + { "battery.voltage.low", 0, voltronic_r_batt_low, "W0E%02.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, voltronic_process_setvar }, /* Query UPS for Phase Angle * > [QPD\r] @@ -1470,8 +1470,8 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "input_phase_angle", 0, NULL, "QPD\r", "", 9, '(', "", 1, 3, "%03d", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, voltronic_phase }, - { "output_phase_angle", ST_FLAG_RW, voltronic_e_phase, "QPD\r", "", 9, '(', "", 5, 7, "%03d", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_NONUT, voltronic_phase }, + { "input_phase_angle", 0, NULL, "QPD\r", "", 9, '(', "", 1, 3, "%03d", QX_FLAG_SEMI_STATIC | QX_FLAG_NONUT, NULL, voltronic_phase }, + { "output_phase_angle", ST_FLAG_RW, voltronic_e_phase, "QPD\r", "", 9, '(', "", 5, 7, "%03d", QX_FLAG_SEMI_STATIC | QX_FLAG_ENUM | QX_FLAG_NONUT, NULL, voltronic_phase }, /* Set output phase angle * > [PPDn\r] n = (000, 120, 180 or 240) @@ -1480,7 +1480,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "output_phase_angle", 0, voltronic_e_phase, "PPD%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, voltronic_phase_set }, + { "output_phase_angle", 0, voltronic_e_phase, "PPD%03.0f\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_SETVAR | QX_FLAG_ENUM | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, voltronic_phase_set }, /* Query UPS for master/slave for a system of UPSes in parallel * > [QPAR\r] @@ -1489,7 +1489,7 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "voltronic_parallel", 0, NULL, "QPAR\r", "", 5, '(', "", 1, 3, "%s", QX_FLAG_STATIC | QX_FLAG_NONUT, voltronic_parallel }, + { "voltronic_parallel", 0, NULL, "QPAR\r", "", 5, '(', "", 1, 3, "%s", QX_FLAG_STATIC | QX_FLAG_NONUT, NULL, voltronic_parallel }, /* Query UPS for ?? * > [QBDR\r] @@ -1498,167 +1498,167 @@ static item_t voltronic_qx2nut[] = { * 0 */ - { "unknown.7", 0, NULL, "QBDR\r", "", 5, '(', "", 1, 0, "%s", QX_FLAG_STATIC | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL }, + { "unknown.7", 0, NULL, "QBDR\r", "", 5, '(', "", 1, 0, "%s", QX_FLAG_STATIC | QX_FLAG_NONUT | QX_FLAG_SKIP, NULL, NULL }, /* Instant commands */ - { "load.off", 0, NULL, "SOFF\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "SON\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "load.off", 0, NULL, "SOFF\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "SON\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, voltronic_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, voltronic_process_command }, - { "shutdown.stop", 0, NULL, "CS\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, voltronic_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, voltronic_process_command }, + { "shutdown.stop", 0, NULL, "CS\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, - { "test.battery.start", 0, NULL, "T%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, voltronic_process_command }, - { "test.battery.start.deep", 0, NULL, "TL\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.stop", 0, NULL, "CT\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL }, + { "test.battery.start", 0, NULL, "T%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, voltronic_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, NULL }, - { "beeper.toggle", 0, NULL, "BZ%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, voltronic_process_command }, + { "beeper.toggle", 0, NULL, "BZ%s\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD, NULL, voltronic_process_command }, /* Enable/disable beeper: unskipped if the UPS can control alarm (capability) */ - { "beeper.enable", 0, NULL, "PEA\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "beeper.disable", 0, NULL, "PDA\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, + { "beeper.enable", 0, NULL, "PEA\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "beeper.disable", 0, NULL, "PDA\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, /* Outlet control: unskipped if the outlets are manageable */ - { "outlet.1.load.off", 0, NULL, "SKOFF1\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "outlet.1.load.on", 0, NULL, "SKON1\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "outlet.2.load.off", 0, NULL, "SKOFF2\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "outlet.2.load.on", 0, NULL, "SKON2\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "outlet.3.load.off", 0, NULL, "SKOFF3\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "outlet.3.load.on", 0, NULL, "SKON3\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "outlet.4.load.off", 0, NULL, "SKOFF4\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "outlet.4.load.on", 0, NULL, "SKON4\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, + { "outlet.1.load.off", 0, NULL, "SKOFF1\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "outlet.1.load.on", 0, NULL, "SKON1\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "outlet.2.load.off", 0, NULL, "SKOFF2\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "outlet.2.load.on", 0, NULL, "SKON2\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "outlet.3.load.off", 0, NULL, "SKOFF3\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "outlet.3.load.on", 0, NULL, "SKON3\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "outlet.4.load.off", 0, NULL, "SKOFF4\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "outlet.4.load.on", 0, NULL, "SKON4\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, /* Bypass: unskipped if the UPS is capable of ECO Mode */ - { "bypass.start", 0, NULL, "PEE\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, - { "bypass.stop", 0, NULL, "PDE\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL }, + { "bypass.start", 0, NULL, "PEE\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, + { "bypass.stop", 0, NULL, "PDE\r", "", 5, '(', "", 1, 3, NULL, QX_FLAG_CMD | QX_FLAG_SKIP, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, voltronic_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, voltronic_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, voltronic_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, voltronic_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, voltronic_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, voltronic_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, voltronic_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, voltronic_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* == Testing table == */ #ifdef TESTING static testing_t voltronic_testing[] = { - { "QGS\r", "(234.9 50.0 229.8 50.0 000.0 00A 369.1 ---.- 026.5 ---.- 018.8 100000000001\r" }, - { "QPI\r", "(PI01\r" }, - { "QRI\r", "(230.0 004 024.0 50.0\r" }, - { "QMF\r", "(#####VOLTRONIC\r" }, - { "I\r", "#------------- ------ VT12046Q \r" }, - { "F\r", "#220.0 000 024.0 50.0\r" }, - { "QMD\r", "(#######OLHVT1K0 ###1000 80 2/2 230 230 02 12.0\r" }, - { "QFS\r", "(14 212.1 50.0 005.6 49.9 006 010.6 343.8 ---.- 026.2 021.8 01101100\r" }, - { "QMOD\r", "(S\r" }, - { "QVFW\r", "(VERFW:00322.02\r" }, - { "QID\r", "(685653211455\r" }, - { "QBV\r", "(026.5 02 01 068 255\r" }, - { "QFLAG\r", "(EpashcjDbroegfl\r" }, - { "QWS\r", "(0000000000000000000000000000000000000000000000000000000001000001\r" }, - { "QHE\r", "(242 218\r" }, - { "QBYV\r", "(264 170\r" }, - { "QBYF\r", "(53.0 47.0\r" }, - { "QSK1\r", "(1\r" }, - { "QSK2\r", "(0\r" }, - { "QSK3\r", "(1\r" }, - { "QSK4\r", "(NAK\r" }, - { "QSKT1\r", "(008\r" }, - { "QSKT2\r", "(012\r" }, - { "QSKT3\r", "(NAK\r" }, - { "QSKT4\r", "(007\r" }, - { "RE0\r", "#20\r" }, - { "W0E24\r", "(ACK\r" }, - { "PF\r", "(ACK\r" }, - { "PEA\r", "(ACK\r" }, - { "PDR\r", "(NAK\r" }, - { "HEH250\r", "(ACK\r" }, - { "HEL210\r", "(ACK\r" }, - { "PHV260\r", "(NAK\r" }, - { "PLV190\r", "(ACK\r" }, - { "PGF51.0\r", "(NAK\r" }, - { "PSF47.5\r", "(ACK\r" }, - { "BATN2\r", "(ACK\r" }, - { "BATGN04\r", "(ACK\r" }, - { "QBT\r", "(01\r" }, - { "PBT02\r", "(ACK\r" }, - { "QGR\r", "(00\r" }, - { "PGR01\r", "(ACK\r" }, - { "PSK1008\r", "(ACK\r" }, - { "PSK3987\r", "(ACK\r" }, - { "PSK2009\r", "(ACK\r" }, - { "PSK4012\r", "(ACK\r" }, - { "Q3PV\r", "(123.4 456.4 789.4 012.4 323.4 223.4\r" }, - { "Q3OV\r", "(253.4 163.4 023.4 143.4 103.4 523.4\r" }, - { "Q3OC\r", "(109 069 023\r" }, - { "Q3LD\r", "(005 033 089\r" }, - { "Q3YV\r", "(303.4 245.4 126.4 222.4 293.4 321.4\r" }, - { "Q3PC\r", "(002 023 051\r" }, - { "SOFF\r", "(NAK\r" }, - { "SON\r", "(ACK\r" }, - { "T\r", "(NAK\r" }, - { "TL\r", "(ACK\r" }, - { "CS\r", "(ACK\r" }, - { "CT\r", "(NAK\r" }, - { "BZOFF\r", "(ACK\r" }, - { "BZON\r", "(ACK\r" }, - { "S.3R0002\r", "(ACK\r" }, - { "S02R0024\r", "(NAK\r" }, - { "S.5\r", "(ACK\r" }, - { "T.3\r", "(ACK\r" }, - { "T02\r", "(NAK\r" }, - { "SKON1\r", "(ACK\r" }, - { "SKOFF1\r", "(NAK\r" }, - { "SKON2\r", "(ACK\r" }, - { "SKOFF2\r", "(ACK\r" }, - { "SKON3\r", "(NAK\r" }, - { "SKOFF3\r", "(ACK\r" }, - { "SKON4\r", "(NAK\r" }, - { "SKOFF4\r", "(NAK\r" }, - { "QPAR\r", "(003\r" }, - { "QPD\r", "(000 240\r" }, - { "PPD120\r", "(ACK\r" }, - { "QLDL\r", "(005 080\r" }, - { "QBDR\r", "(1234\r" }, - { "QFRE\r", "(50.0 00.0\r" }, - { "FREH54.0\r", "(ACK\r" }, - { "FREL47.0\r", "(ACK\r" }, - { "PEP\r", "(ACK\r" }, - { "PDP\r", "(ACK\r" }, - { "PEB\r", "(ACK\r" }, - { "PDB\r", "(ACK\r" }, - { "PER\r", "(NAK\r" }, - { "PDR\r", "(NAK\r" }, - { "PEO\r", "(ACK\r" }, - { "PDO\r", "(ACK\r" }, - { "PEA\r", "(ACK\r" }, - { "PDA\r", "(ACK\r" }, - { "PES\r", "(ACK\r" }, - { "PDS\r", "(ACK\r" }, - { "PEV\r", "(ACK\r" }, - { "PDV\r", "(ACK\r" }, - { "PEE\r", "(ACK\r" }, - { "PDE\r", "(ACK\r" }, - { "PEG\r", "(ACK\r" }, - { "PDG\r", "(NAK\r" }, - { "PED\r", "(ACK\r" }, - { "PDD\r", "(ACK\r" }, - { "PEC\r", "(ACK\r" }, - { "PDC\r", "(NAK\r" }, - { "PEF\r", "(NAK\r" }, - { "PDF\r", "(ACK\r" }, - { "PEJ\r", "(NAK\r" }, - { "PDJ\r", "(ACK\r" }, - { "PEL\r", "(ACK\r" }, - { "PDL\r", "(ACK\r" }, - { "PEN\r", "(ACK\r" }, - { "PDN\r", "(ACK\r" }, - { "PEQ\r", "(ACK\r" }, - { "PDQ\r", "(ACK\r" }, - { "PEW\r", "(NAK\r" }, - { "PDW\r", "(ACK\r" }, + { "QGS\r", "(234.9 50.0 229.8 50.0 000.0 00A 369.1 ---.- 026.5 ---.- 018.8 100000000001\r", -1 }, + { "QPI\r", "(PI01\r", -1 }, + { "QRI\r", "(230.0 004 024.0 50.0\r", -1 }, + { "QMF\r", "(#####VOLTRONIC\r", -1 }, + { "I\r", "#------------- ------ VT12046Q \r", -1 }, + { "F\r", "#220.0 000 024.0 50.0\r", -1 }, + { "QMD\r", "(#######OLHVT1K0 ###1000 80 2/2 230 230 02 12.0\r", -1 }, + { "QFS\r", "(14 212.1 50.0 005.6 49.9 006 010.6 343.8 ---.- 026.2 021.8 01101100\r", -1 }, + { "QMOD\r", "(S\r", -1 }, + { "QVFW\r", "(VERFW:00322.02\r", -1 }, + { "QID\r", "(685653211455\r", -1 }, + { "QBV\r", "(026.5 02 01 068 255\r", -1 }, + { "QFLAG\r", "(EpashcjDbroegfl\r", -1 }, + { "QWS\r", "(0000000000000000000000000000000000000000000000000000000001000001\r", -1 }, + { "QHE\r", "(242 218\r", -1 }, + { "QBYV\r", "(264 170\r", -1 }, + { "QBYF\r", "(53.0 47.0\r", -1 }, + { "QSK1\r", "(1\r", -1 }, + { "QSK2\r", "(0\r", -1 }, + { "QSK3\r", "(1\r", -1 }, + { "QSK4\r", "(NAK\r", -1 }, + { "QSKT1\r", "(008\r", -1 }, + { "QSKT2\r", "(012\r", -1 }, + { "QSKT3\r", "(NAK\r", -1 }, + { "QSKT4\r", "(007\r", -1 }, + { "RE0\r", "#20\r", -1 }, + { "W0E24\r", "(ACK\r", -1 }, + { "PF\r", "(ACK\r", -1 }, + { "PEA\r", "(ACK\r", -1 }, + { "PDR\r", "(NAK\r", -1 }, + { "HEH250\r", "(ACK\r", -1 }, + { "HEL210\r", "(ACK\r", -1 }, + { "PHV260\r", "(NAK\r", -1 }, + { "PLV190\r", "(ACK\r", -1 }, + { "PGF51.0\r", "(NAK\r", -1 }, + { "PSF47.5\r", "(ACK\r", -1 }, + { "BATN2\r", "(ACK\r", -1 }, + { "BATGN04\r", "(ACK\r", -1 }, + { "QBT\r", "(01\r", -1 }, + { "PBT02\r", "(ACK\r", -1 }, + { "QGR\r", "(00\r", -1 }, + { "PGR01\r", "(ACK\r", -1 }, + { "PSK1008\r", "(ACK\r", -1 }, + { "PSK3987\r", "(ACK\r", -1 }, + { "PSK2009\r", "(ACK\r", -1 }, + { "PSK4012\r", "(ACK\r", -1 }, + { "Q3PV\r", "(123.4 456.4 789.4 012.4 323.4 223.4\r", -1 }, + { "Q3OV\r", "(253.4 163.4 023.4 143.4 103.4 523.4\r", -1 }, + { "Q3OC\r", "(109 069 023\r", -1 }, + { "Q3LD\r", "(005 033 089\r", -1 }, + { "Q3YV\r", "(303.4 245.4 126.4 222.4 293.4 321.4\r", -1 }, + { "Q3PC\r", "(002 023 051\r", -1 }, + { "SOFF\r", "(NAK\r", -1 }, + { "SON\r", "(ACK\r", -1 }, + { "T\r", "(NAK\r", -1 }, + { "TL\r", "(ACK\r", -1 }, + { "CS\r", "(ACK\r", -1 }, + { "CT\r", "(NAK\r", -1 }, + { "BZOFF\r", "(ACK\r", -1 }, + { "BZON\r", "(ACK\r", -1 }, + { "S.3R0002\r", "(ACK\r", -1 }, + { "S02R0024\r", "(NAK\r", -1 }, + { "S.5\r", "(ACK\r", -1 }, + { "T.3\r", "(ACK\r", -1 }, + { "T02\r", "(NAK\r", -1 }, + { "SKON1\r", "(ACK\r", -1 }, + { "SKOFF1\r", "(NAK\r", -1 }, + { "SKON2\r", "(ACK\r", -1 }, + { "SKOFF2\r", "(ACK\r", -1 }, + { "SKON3\r", "(NAK\r", -1 }, + { "SKOFF3\r", "(ACK\r", -1 }, + { "SKON4\r", "(NAK\r", -1 }, + { "SKOFF4\r", "(NAK\r", -1 }, + { "QPAR\r", "(003\r", -1 }, + { "QPD\r", "(000 240\r", -1 }, + { "PPD120\r", "(ACK\r", -1 }, + { "QLDL\r", "(005 080\r", -1 }, + { "QBDR\r", "(1234\r", -1 }, + { "QFRE\r", "(50.0 00.0\r", -1 }, + { "FREH54.0\r", "(ACK\r", -1 }, + { "FREL47.0\r", "(ACK\r", -1 }, + { "PEP\r", "(ACK\r", -1 }, + { "PDP\r", "(ACK\r", -1 }, + { "PEB\r", "(ACK\r", -1 }, + { "PDB\r", "(ACK\r", -1 }, + { "PER\r", "(NAK\r", -1 }, + { "PDR\r", "(NAK\r", -1 }, + { "PEO\r", "(ACK\r", -1 }, + { "PDO\r", "(ACK\r", -1 }, + { "PEA\r", "(ACK\r", -1 }, + { "PDA\r", "(ACK\r", -1 }, + { "PES\r", "(ACK\r", -1 }, + { "PDS\r", "(ACK\r", -1 }, + { "PEV\r", "(ACK\r", -1 }, + { "PDV\r", "(ACK\r", -1 }, + { "PEE\r", "(ACK\r", -1 }, + { "PDE\r", "(ACK\r", -1 }, + { "PEG\r", "(ACK\r", -1 }, + { "PDG\r", "(NAK\r", -1 }, + { "PED\r", "(ACK\r", -1 }, + { "PDD\r", "(ACK\r", -1 }, + { "PEC\r", "(ACK\r", -1 }, + { "PDC\r", "(NAK\r", -1 }, + { "PEF\r", "(NAK\r", -1 }, + { "PDF\r", "(ACK\r", -1 }, + { "PEJ\r", "(NAK\r", -1 }, + { "PDJ\r", "(ACK\r", -1 }, + { "PEL\r", "(ACK\r", -1 }, + { "PDL\r", "(ACK\r", -1 }, + { "PEN\r", "(ACK\r", -1 }, + { "PDN\r", "(ACK\r", -1 }, + { "PEQ\r", "(ACK\r", -1 }, + { "PDQ\r", "(ACK\r", -1 }, + { "PEW\r", "(NAK\r", -1 }, + { "PDW\r", "(ACK\r", -1 }, { NULL } }; #endif /* TESTING */ @@ -2524,8 +2524,8 @@ static int voltronic_eco_volt(item_t *item, char *value, size_t valuelen) } - /* For P02/P03/P10/P14/P99 */ - } else if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 14 || protocol == 99) { + /* For P02/P03/P10/P13/P14/P99 */ + } else if (protocol == 2 || protocol == 3 || protocol == 10 || protocol == 13 || protocol == 14 || protocol == 99) { if (ovn >= 200) { min.lower = ovn - 24; @@ -2794,6 +2794,7 @@ static int voltronic_protocol(item_t *item, char *value, size_t valuelen) case 8: case 9: case 10: + case 13: case 14: case 31: case 99: diff --git a/drivers/nutdrv_qx_zinto.c b/drivers/nutdrv_qx_zinto.c index afc50fc..62f3209 100644 --- a/drivers/nutdrv_qx_zinto.c +++ b/drivers/nutdrv_qx_zinto.c @@ -25,7 +25,7 @@ #include "nutdrv_qx_zinto.h" -#define ZINTO_VERSION "Zinto 0.01" +#define ZINTO_VERSION "Zinto 0.04" /* qx2nut lookup table */ static item_t zinto_qx2nut[] = { @@ -37,23 +37,22 @@ static item_t zinto_qx2nut[] = { * 0 1 2 3 4 */ - { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL }, - { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL }, - { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL }, - { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL }, - { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL }, - { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL }, - { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL }, + { "input.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 1, 5, "%.1f", 0, NULL, NULL }, + { "input.voltage.fault", 0, NULL, "Q1\r", "", 47, '(', "", 7, 11, "%.1f", 0, NULL, NULL }, + { "output.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 13, 17, "%.1f", 0, NULL, NULL }, + { "ups.load", 0, NULL, "Q1\r", "", 47, '(', "", 19, 21, "%.0f", 0, NULL, NULL }, + { "input.frequency", 0, NULL, "Q1\r", "", 47, '(', "", 23, 26, "%.1f", 0, NULL, NULL }, + { "battery.voltage", 0, NULL, "Q1\r", "", 47, '(', "", 28, 31, "%.2f", 0, NULL, NULL }, + { "ups.temperature", 0, NULL, "Q1\r", "", 47, '(', "", 33, 36, "%.1f", 0, NULL, NULL }, /* Status bits */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Battery Low */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, blazer_process_status_bits }, /* UPS Failed */ - { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, blazer_process_status_bits }, /* UPS Type */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Test in Progress */ - { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, 0, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, blazer_process_status_bits }, /* Shutdown Active */ - { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, blazer_process_status_bits }, /* Beeper status */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 38, 38, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Utility Fail (Immediate) */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 39, 39, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Battery Low */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 40, 40, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Bypass/Boost or Buck Active */ + { "ups.alarm", 0, NULL, "Q1\r", "", 47, '(', "", 41, 41, NULL, 0, NULL, blazer_process_status_bits }, /* UPS Failed */ + { "ups.type", 0, NULL, "Q1\r", "", 47, '(', "", 42, 42, "%s", QX_FLAG_STATIC, NULL, blazer_process_status_bits }, /* UPS Type */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 43, 43, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Test in Progress */ + { "ups.status", 0, NULL, "Q1\r", "", 47, '(', "", 44, 44, NULL, QX_FLAG_QUICK_POLL, NULL, blazer_process_status_bits }, /* Shutdown Active */ + { "ups.beeper.status", 0, NULL, "Q1\r", "", 47, '(', "", 45, 45, "%s", 0, NULL, blazer_process_status_bits }, /* Beeper status */ /* * > [F\r] @@ -62,10 +61,10 @@ static item_t zinto_qx2nut[] = { * 0 1 2 */ - { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL }, - { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL }, - { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL }, - { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL }, + { "input.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 1, 5, "%.0f", QX_FLAG_STATIC, NULL, NULL }, + { "input.current.nominal", 0, NULL, "F\r", "", 22, '#', "", 7, 9, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "battery.voltage.nominal", 0, NULL, "F\r", "", 22, '#', "", 11, 15, "%.1f", QX_FLAG_STATIC, NULL, NULL }, + { "input.frequency.nominal", 0, NULL, "F\r", "", 22, '#', "", 17, 20, "%.0f", QX_FLAG_STATIC, NULL, NULL }, /* * > [FW?\r] @@ -74,45 +73,45 @@ static item_t zinto_qx2nut[] = { * 0 1 2 3 */ - { "device.mfr", 0, NULL, "FW?\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "device.model", 0, NULL, "FW?\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, - { "ups.firmware", 0, NULL, "FW?\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL }, + { "device.mfr", 0, NULL, "FW?\r", "", 39, '#', "", 1, 15, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "device.model", 0, NULL, "FW?\r", "", 39, '#', "", 17, 26, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, + { "ups.firmware", 0, NULL, "FW?\r", "", 39, '#', "", 28, 37, "%s", QX_FLAG_STATIC | QX_FLAG_TRIM, NULL, NULL }, /* Instant commands */ - { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, blazer_process_command }, - { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, - { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL }, + { "beeper.toggle", 0, NULL, "Q\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.off", 0, NULL, "S00R0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "load.on", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "shutdown.return", 0, NULL, "S%s\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stayoff", 0, NULL, "S%sR0000\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "shutdown.stop", 0, NULL, "C\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start", 0, NULL, "T%02d\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, blazer_process_command }, + { "test.battery.start.deep", 0, NULL, "TL\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.start.quick", 0, NULL, "T\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, + { "test.battery.stop", 0, NULL, "CT\r", "", 0, 0, "", 0, 0, NULL, QX_FLAG_CMD, NULL, NULL }, /* Server-side settable vars */ - { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, - { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, blazer_process_setvar }, + { "ups.delay.start", ST_FLAG_RW, blazer_r_ondelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_ONDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, + { "ups.delay.shutdown", ST_FLAG_RW, blazer_r_offdelay, NULL, "", 0, 0, "", 0, 0, DEFAULT_OFFDELAY, QX_FLAG_ABSENT | QX_FLAG_SETVAR | QX_FLAG_RANGE, NULL, blazer_process_setvar }, /* End of structure. */ - { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL } + { NULL, 0, NULL, NULL, "", 0, 0, "", 0, 0, NULL, 0, NULL, NULL } }; /* Testing table */ #ifdef TESTING static testing_t zinto_testing[] = { - { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r" }, - { "F\r", "#230.0 000 024.0 50.0\r" }, - { "FW?\r", "#NOT_A_LIVE_UPS TESTING TESTING \r" }, - { "Q\r", "" }, - { "S03\r", "" }, - { "C\r", "" }, - { "S02R0005\r", "" }, - { "S.5R0000\r", "" }, - { "T04\r", "" }, - { "TL\r", "" }, - { "T\r", "" }, - { "CT\r", "" }, + { "Q1\r", "(215.0 195.0 230.0 014 49.0 22.7 30.0 00000000\r", -1 }, + { "F\r", "#230.0 000 024.0 50.0\r", -1 }, + { "FW?\r", "#NOT_A_LIVE_UPS TESTING TESTING \r", -1 }, + { "Q\r", "", -1 }, + { "S03\r", "", -1 }, + { "C\r", "", -1 }, + { "S02R0005\r", "", -1 }, + { "S.5R0000\r", "", -1 }, + { "T04\r", "", -1 }, + { "TL\r", "", -1 }, + { "T\r", "", -1 }, + { "CT\r", "", -1 }, { NULL } }; #endif /* TESTING */ @@ -120,9 +119,7 @@ static testing_t zinto_testing[] = { /* Subdriver-specific initups */ static void zinto_initups(void) { - blazer_initups(zinto_qx2nut); - } /* Subdriver interface */ diff --git a/drivers/openups-hid.c b/drivers/openups-hid.c index 69a4a61..bfe386f 100644 --- a/drivers/openups-hid.c +++ b/drivers/openups-hid.c @@ -26,17 +26,53 @@ #include "main.h" /* for getval() */ #include "usb-common.h" -#define OPENUPS_HID_VERSION "openUPS HID 0.1" +#define OPENUPS_HID_VERSION "openUPS HID 0.4" /* Minibox */ #define OPENUPS_VENDORID 0x04d8 +/* constants for converting HID read values to real values */ +static const double vin_scale_d004 = 0.03545 * 100; +static const double vout_scale_d004 = 0.02571 * 100; +/* static const double vbat_scale = 0.00857 * 100; */ +static const double ccharge_scale_d004 = 0.8274 / 10; +static const double cdischarge_scale_d004 = 16.113 / 10; + +static double vin_scale = 1; +static double vout_scale= 1; +static double ccharge_scale = 1; +static double cdischarge_scale = 1; + static char openups_scratch_buf[20]; +static void *get_voltage_multiplier(USBDevice_t *device) +{ + + switch(device->ProductID) { + case 0xd004: + vin_scale = vin_scale_d004; + vout_scale= vout_scale_d004; + ccharge_scale= ccharge_scale_d004; + cdischarge_scale= cdischarge_scale_d004; + break; + case 0xd005: + vin_scale = 0.1; + vout_scale = 0.1; + ccharge_scale = 0.1; /* unverified */ + cdischarge_scale = 0.1; /* unverified */ + break; + } + + upsdebugx(1, "vin_scale = %g; vout_scale = %g\n", vin_scale, vout_scale); + return NULL; +} + + /* USB IDs device table */ -static usb_device_id_t openups_usb_device_table[] = { +static /* const */ usb_device_id_t openups_usb_device_table[] = { /* openUPS Intelligent UPS (minimum required firmware 1.4) */ - {USB_DEVICE(OPENUPS_VENDORID, 0xd004), NULL}, + {USB_DEVICE(OPENUPS_VENDORID, 0xd004), get_voltage_multiplier}, + {USB_DEVICE(OPENUPS_VENDORID, 0xd005), get_voltage_multiplier}, /* Terminating entry */ {-1, -1, NULL} @@ -45,7 +81,7 @@ static usb_device_id_t openups_usb_device_table[] = { /* Thermistor table used for temperature lookups * taken from the windows monitoring application */ -static unsigned int therm_tbl[] = +static const unsigned int therm_tbl[] = { (unsigned int)0x31, (unsigned int)0x40, @@ -83,7 +119,7 @@ static unsigned int therm_tbl[] = (unsigned int)0x3CC }; -static unsigned int therm_tbl_size = sizeof(therm_tbl)/sizeof(therm_tbl[0]); +static const unsigned int therm_tbl_size = sizeof(therm_tbl)/sizeof(therm_tbl[0]); static const char *openups_charging_fun(double value); static const char *openups_discharging_fun(double value); @@ -225,7 +261,7 @@ static const char *openups_temperature_fun(double value) unsigned int d1 = therm_tbl[pos]; unsigned int d2 = therm_tbl[pos + 1]; - float temp = (float) (thermistor - d1) * (t2 - t1) / (d2 - d1) + t1; + double temp = (double) (thermistor - d1) * (t2 - t1) / (d2 - d1) + t1; snprintf(openups_scratch_buf, sizeof(openups_scratch_buf), "%.2f", temp); } } diff --git a/drivers/openups-hid.h b/drivers/openups-hid.h index c87b3d1..ee8e06e 100644 --- a/drivers/openups-hid.h +++ b/drivers/openups-hid.h @@ -26,12 +26,7 @@ #include "usbhid-ups.h" -/* constants for converting HID read values to real values */ -static const float vin_scale = 0.03545 * 100; -static const float vout_scale = 0.02571 * 100; -static const float vbat_scale = 0.00857 * 100; -static const float ccharge_scale = 0.8274 / 10; -static const float cdischarge_scale = 16.113 / 10; +/* Don't put non-extern definitions here - this file gets included by usbhid-ups.c */ extern subdriver_t openups_subdriver; diff --git a/drivers/powercom-hid.c b/drivers/powercom-hid.c index 3f76057..fbe6332 100644 --- a/drivers/powercom-hid.c +++ b/drivers/powercom-hid.c @@ -25,7 +25,7 @@ #include "powercom-hid.h" #include "usb-common.h" -#define POWERCOM_HID_VERSION "PowerCOM HID 0.4" +#define POWERCOM_HID_VERSION "PowerCOM HID 0.5" /* FIXME: experimental flag to be put in upsdrv_info */ /* PowerCOM */ @@ -45,6 +45,7 @@ static usb_device_id_t powercom_usb_device_table[] = { { USB_DEVICE(POWERCOM_VENDORID, 0x00a6), NULL }, /* PowerCOM Vanguard and BNT-xxxAP */ { USB_DEVICE(POWERCOM_VENDORID, 0x0004), NULL }, + { USB_DEVICE(POWERCOM_VENDORID, 0x0001), NULL }, /* Terminating entry */ { -1, -1, NULL } @@ -130,12 +131,160 @@ static info_lkp_t powercom_beeper_info[] = { { 0, NULL, NULL } }; +static const char *powercom_voltage_conversion_fun(double value) +{ + static char buf[20]; + snprintf(buf, sizeof(buf), "%0.0f", value * 4); + return buf; +} + +static info_lkp_t powercom_voltage_conversion[] = { + { 0, NULL, powercom_voltage_conversion_fun } +}; + +static const char *powercom_upsfail_conversion_fun(double value) +{ + if ((long)value & 0x0001) { + return "fanfail"; + } else { + return "!fanfail"; + } +} + +static info_lkp_t powercom_upsfail_conversion[] = { + { 0, NULL, powercom_upsfail_conversion_fun } +}; + +static const char *powercom_replacebatt_conversion_fun(double value) +{ + if ((long)value & 0x0002) { + return "replacebatt"; + } else { + return "!replacebatt"; + } +} + +static info_lkp_t powercom_replacebatt_conversion[] = { + { 0, NULL, powercom_replacebatt_conversion_fun } +}; + +static const char *powercom_test_conversion_fun(double value) +{ + if ((long)value & 0x0004) { + return "cal"; + } else { + return "!cal"; + } +} + +static info_lkp_t powercom_test_conversion[] = { + { 0, NULL, powercom_test_conversion_fun } +}; + +static const char *powercom_shutdownimm_conversion_fun(double value) +{ + if ((long)value & 0x0010) { + return "shutdownimm"; + } else { + return "!shutdownimm"; + } +} + +static info_lkp_t powercom_shutdownimm_conversion[] = { + { 0, NULL, powercom_shutdownimm_conversion_fun } +}; + +static const char *powercom_online_conversion_fun(double value) +{ + if ((long)value & 0x0001) { + return "!online"; + } else { + return "online"; + } +} + +static info_lkp_t powercom_online_conversion[] = { + { 0, NULL, powercom_online_conversion_fun } +}; + +static const char *powercom_lowbatt_conversion_fun(double value) +{ + if ((long)value & 0x0002) { + return "lowbatt"; + } else { + return "!lowbatt"; + } +} + +static info_lkp_t powercom_lowbatt_conversion[] = { + { 0, NULL, powercom_lowbatt_conversion_fun } +}; + +static const char *powercom_trim_conversion_fun(double value) +{ + if (((long)value & 0x0018) == 0x0008) { + return "trim"; + } else { + return "!trim"; + } +} + +static info_lkp_t powercom_trim_conversion[] = { + { 0, NULL, powercom_trim_conversion_fun } +}; + +static const char *powercom_boost_conversion_fun(double value) +{ + if (((long)value & 0x0018) == 0x0018) { + return "boost"; + } else { + return "!boost"; + } +} + +static info_lkp_t powercom_boost_conversion[] = { + { 0, NULL, powercom_boost_conversion_fun } +}; + +static const char *powercom_overload_conversion_fun(double value) +{ + if ((long)value & 0x0020) { + return "overload"; + } else { + return "!overload"; + } +} + +static info_lkp_t powercom_overload_conversion[] = { + { 0, NULL, powercom_overload_conversion_fun } +}; + /* --------------------------------------------------------------- */ /* Vendor-specific usage table */ /* --------------------------------------------------------------- */ /* POWERCOM usage table */ static usage_lkp_t powercom_usage_lkp[] = { + { "PowercomUPS", 0x00020004 }, + { "PowercomBatterySystem", 0x00020010 }, + { "PowercomPowerConverter", 0x00020016 }, + { "PowercomInput", 0x0002001a }, + { "PowercomOutput", 0x0002001c }, + { "PowercomVoltage", 0x00020030 }, + { "PowercomFrequency", 0x00020032 }, + { "PowercomPercentLoad", 0x00020035 }, + { "PowercomTemperature", 0x00020036 }, + { "PowercomDelayBeforeStartup", 0x00020056 }, + { "PowercomDelayBeforeShutdown", 0x00020057 }, + { "PowercomTest", 0x00020058 }, + { "PowercomShutdownRequested", 0x00020068 }, + { "PowercomInternalChargeController", 0x00020081 }, + { "PowercomPrimaryBatterySupport", 0x00020082 }, + { "PowercomDesignCapacity", 0x00020083 }, + { "PowercomSpecificationInfo", 0x00020084 }, + { "PowercomManufacturerDate", 0x00020085 }, + { "PowercomSerialNumber", 0x00020086 }, + { "PowercomManufacturerName", 0x00020087 }, { "POWERCOM1", 0x0084002f }, { "POWERCOM2", 0xff860060 }, { "POWERCOM3", 0xff860080 }, @@ -268,6 +417,56 @@ static hid_info_t powercom_hid2nut[] = { { "shutdown.return", 0, 0, "UPS.PowerSummary.PCMDelayBeforeShutdown", NULL, NULL, HU_TYPE_CMD, powercom_shutdown_info }, { "shutdown.stayoff", 0, 0, "UPS.PowerSummary.PCMDelayBeforeShutdown", NULL, NULL, HU_TYPE_CMD, powercom_stayoff_info }, + { "ups.serial", 0, 0, "PowercomUPS.PowercomSerialNumber", NULL, "%s", 0, stringid_conversion }, + { "ups.mfr", 0, 0, "PowercomUPS.PowercomManufacturerName", NULL, "%s", 0, stringid_conversion }, +/* { "UPS.DesignCapacity", 0, 0, "PowercomUPS.PowercomDesignCapacity", NULL, "%.0f", 0, NULL }, is always 255 */ + { "ups.mfr.date", 0, 0, "PowercomUPS.PowercomManufacturerDate", NULL, "%s", 0, date_conversion }, + { "battery.temperature", 0, 0, "PowercomUPS.PowercomBatterySystem.PowercomTemperature", NULL, "%.0f", 0, NULL }, + { "battery.charge", 0, 0, "PowercomUPS.PowercomBatterySystem.PowercomVoltage", NULL, "%.0f", 0, NULL }, +/* { "UPS.BatterySystem.SpecificationInfo", 0, 0, "PowercomUPS.PowercomBatterySystem.PowercomSpecificationInfo", NULL, "%.0f", 0, NULL }, */ + { "input.frequency", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomInput.PowercomFrequency", NULL, "%.0f", 0, NULL }, + { "input.voltage", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomInput.PowercomVoltage", NULL, "%.0f", 0, powercom_voltage_conversion }, + { "output.voltage", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomVoltage", NULL, "%.0f", 0, powercom_voltage_conversion }, + { "ups.load", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomPercentLoad", NULL, "%.0f", 0, NULL }, + /* flags: 4 - Testing, 8 - Probably mute (it's set on battery with muted beeper and sometimes during ups test) + * bit 0 UPS fault (1 = FAILT) + * bit 1 Battery status (1 = BAD, 0 = NORMAL) + * bit 2 Test mode (1 = TEST, 0 = NORMAL) + * bit 3 X + * bit 4 Pre-SD count mode (1 = ACTIVE) + * bit 5 Schedule count mode (1 = ACTIVE) + * bit 6 Disable NO LOAD SHUTDOWN (1 = ACTIVE) + * bit 7 0 + */ +/* { "UPS.PowerConverter.Output.InternalChargeController", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomInternalChargeController", NULL, "%.0f", 0, NULL }, */ + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomInternalChargeController", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_upsfail_conversion }, + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomInternalChargeController", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_replacebatt_conversion }, + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomInternalChargeController", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_test_conversion }, + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomInternalChargeController", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_shutdownimm_conversion }, + /* flags: 1 - On battery, 2 - Low Battery, 8 - Trim, 8+16 - Boost + * bit 0 is line fail (1 = INV, 0 = LINE) + * bit 1 is low battery (1 = BAT_ LOW, 0 = NORMAL) + * bit 2 X + * bit 3 AVR status (1 = AVR, 0 = NO_AVR) + * bit 4 AVR mode (1 = BOOST, 0 = BUCK) + * bit 5 Load status (1 = OVER LOAD, 0 = NORMAL) + * bit 6 X + * bit 7 SD mode display + */ +/* { "UPS.PowerConverter.Output.PrimaryBatterySupport", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomPrimaryBatterySupport", NULL, "%.0f", 0, NULL }, */ + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomPrimaryBatterySupport", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_online_conversion }, + /* Low battery status may not work */ + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomPrimaryBatterySupport", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_lowbatt_conversion }, + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomPrimaryBatterySupport", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_trim_conversion }, + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomPrimaryBatterySupport", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_boost_conversion }, + { "BOOL", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomPrimaryBatterySupport", NULL, NULL, HU_FLAG_QUICK_POLL, powercom_overload_conversion }, + { "output.frequency", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomOutput.PowercomFrequency", NULL, "%.0f", 0, NULL }, + { "ups.test.result", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomTest", NULL, "%s", 0, test_read_info }, +/* { "UPS.PowerConverter.ShutdownRequested", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomShutdownRequested", NULL, "%.0f", 0, NULL }, */ + { "ups.delay.shutdown", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomDelayBeforeShutdown", NULL, "%.0f", 0, NULL }, + { "ups.delay.start", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomDelayBeforeStartup", NULL, "%.0f", 0, NULL }, + { "load.off", 0, 0, "PowercomUPS.PowercomPowerConverter.PowercomDelayBeforeShutdown", NULL, "0", HU_TYPE_CMD, NULL }, + /* end of structure. */ { NULL, 0, 0, NULL, NULL, NULL, 0, NULL } }; @@ -307,6 +506,10 @@ static int powercom_claim(HIDDevice_t *hd) return 0; case SUPPORTED: + if (hd->ProductID == 0x0001) { + interrupt_only = 1; + interrupt_size = 8; + } return 1; case NOT_SUPPORTED: diff --git a/drivers/powercom.c b/drivers/powercom.c index 62d8683..573a234 100644 --- a/drivers/powercom.c +++ b/drivers/powercom.c @@ -64,6 +64,11 @@ * - Added support for OptiUPS VS 575C * This probably also works with others, but I don't have their model numbers. * + * rev 0.15: VSE NN + * - Fixed UPS type assignment for Powercom Imperial USB series manufactured since 2009. + * + * Tested on: IMP-625AP + * */ #include "main.h" @@ -908,17 +913,24 @@ void upsdrv_initups(void) if (!ups_getinfo()) return; /* Give "BNT-other" a chance! */ if (raw_data[MODELNAME]==0x42 || raw_data[MODELNAME]==0x4B || raw_data[MODELNAME]==0x4F){ - model=BNTmodels[raw_data[MODELNUMBER]/16]; - if (!strcmp(types[type].name, "BNT-other")) - types[type].name="BNT-other"; - else if (raw_data[MODELNAME]==0x42) - types[type].name="BNT"; - else if (raw_data[MODELNAME]==0x4B){ - types[type].name="KIN"; - model=KINmodels[raw_data[MODELNUMBER]/16]; - } else if (raw_data[MODELNAME]==0x4F){ - types[type].name="OPTI"; - model=OPTImodels[raw_data[MODELNUMBER]/16]; + /* Give "IMP" a chance also! */ + if (raw_data[UPSVERSION]==0xFF){ + types[type].name="IMP"; + model=IMPmodels[raw_data[MODELNUMBER]/16]; + } + else { + model=BNTmodels[raw_data[MODELNUMBER]/16]; + if (!strcmp(types[type].name, "BNT-other")) + types[type].name="BNT-other"; + else if (raw_data[MODELNAME]==0x42) + types[type].name="BNT"; + else if (raw_data[MODELNAME]==0x4B){ + types[type].name="KIN"; + model=KINmodels[raw_data[MODELNUMBER]/16]; + } else if (raw_data[MODELNAME]==0x4F){ + types[type].name="OPTI"; + model=OPTImodels[raw_data[MODELNUMBER]/16]; + } } } else if (raw_data[UPSVERSION]==0xFF){ diff --git a/drivers/powerware-mib.c b/drivers/powerware-mib.c index 33a5eb2..54b3628 100644 --- a/drivers/powerware-mib.c +++ b/drivers/powerware-mib.c @@ -1,9 +1,10 @@ /* powerware-mib.c - data to monitor Powerware UPS with NUT * (using MIBs described in stdupsv1.mib and Xups.mib) * - * Copyright (C) 2005-2006 - * Olli Savia - * Niels Baggesen + * Copyright (C) + * 2005-2006 Olli Savia + * 2005-2006 Niels Baggesen + * 2015 Arnaud Quette * * 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 @@ -24,7 +25,7 @@ #include "powerware-mib.h" -#define PW_MIB_VERSION "0.6.2" +#define PW_MIB_VERSION "0.7" /* TODO: more sysOID and MIBs support: * @@ -134,6 +135,7 @@ static info_lkp_t pw_mode_info[] = { { 0, "NULL" } }; +/* Legacy implementation */ static info_lkp_t pw_battery_abm_status[] = { { 1, "CHRG" }, { 2, "DISCHRG" }, @@ -143,13 +145,13 @@ static info_lkp_t pw_battery_abm_status[] = { { 0, "NULL" } } ; -static info_lkp_t pw_batt_info[] = { - { 1, "" }, - { 2, "" }, - { 3, "Battery Floating" }, /* battery floating - can we put that stuff somewhere so one actually access that information? */ - { 4, "Battery Resting" }, /* battery resting - could come handy if support asks what - state the batteries are in... pw_batt_info doesn't get used */ - { 5, "unknown" }, /* unknown */ +static info_lkp_t eaton_abm_status_info[] = { + { 1, "charging" }, + { 2, "discharging" }, + { 3, "floating" }, + { 4, "resting" }, + { 5, "unknown" }, /* Undefined - ABM is not activated */ + { 6, "disabled" }, /* ABM Charger Disabled */ { 0, "NULL" } }; @@ -200,8 +202,8 @@ static snmp_info_t pw_mib[] = { 0, NULL }, { "ups.test.result", ST_FLAG_STRING, SU_INFOSIZE, PW_OID_BATTEST_RES, "", 0, &pw_batt_test_info[0] }, - { "vendor.specific.abmstatus", ST_FLAG_STRING, SU_INFOSIZE, PW_OID_BATT_STATUS, "", - SU_STATUS_BATT, &pw_batt_info[0] }, + { "battery.charger.status", ST_FLAG_STRING, SU_INFOSIZE, PW_OID_BATT_STATUS, "", + SU_STATUS_BATT, &eaton_abm_status_info[0] }, /* Battery page */ { "battery.charge", 0, 1.0, PW_OID_BATT_CHARGE, "", diff --git a/drivers/riello_ser.c b/drivers/riello_ser.c index b76be96..9ee779d 100644 --- a/drivers/riello_ser.c +++ b/drivers/riello_ser.c @@ -37,7 +37,7 @@ #include "riello.h" #define DRIVER_NAME "Riello serial driver" -#define DRIVER_VERSION "0.02" +#define DRIVER_VERSION "0.03" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -188,12 +188,13 @@ int get_ups_nominal() if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get nominal Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* mandatory */ if (!wait_packet && foundnak) { upsdebugx (3, "Get nominal Ko: command not supported"); - return 1; + return -1; } upsdebugx (3, "Get nominal Ok: received byte %u", buf_ptr_length); @@ -227,12 +228,13 @@ int get_ups_status() if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get status Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* mandatory */ if (!wait_packet && foundnak) { upsdebugx (3, "Get status Ko: command not supported"); - return 1; + return -1; } upsdebugx (3, "Get status Ok: received byte %u", buf_ptr_length); @@ -259,12 +261,13 @@ int get_ups_extended() if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get extended Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* optonal */ if (!wait_packet && foundnak) { upsdebugx (3, "Get extended Ko: command not supported"); - return 1; + return 0; } upsdebugx (3, "Get extended Ok: received byte %u", buf_ptr_length); @@ -291,12 +294,13 @@ int get_ups_statuscode() if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get statuscode Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* optional */ if (!wait_packet && foundnak) { upsdebugx (3, "Get statuscode Ko: command not supported"); - return 1; + return 0; } upsdebugx (3, "Get statuscode Ok: received byte %u", buf_ptr_length); @@ -333,12 +337,13 @@ int get_ups_sentr() if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get sentry Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* mandatory */ if (!wait_packet && foundnak) { upsdebugx (3, "Get sentry Ko: command not supported"); - return 1; + return -1; } upsdebugx (3, "Get sentry Ok: received byte %u", buf_ptr_length); @@ -359,68 +364,74 @@ int riello_instcmd(const char *cmdname, const char *extra) delay = 0; riello_init_serial(); - if (typeRielloProtocol == DEV_RIELLOGPSER) + if (typeRielloProtocol == DEV_RIELLOGPSER) length = riello_prepare_cs(bufOut, gpser_error_control, delay); else length = riello_prepare_shutsentr(bufOut, delay); - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command load.off communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], typeRielloProtocol); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.off Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.off Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], typeRielloProtocol); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.off Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.off Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.off Ok"); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "load.off.delay")) { - delay_char = dstate_getinfo("ups.delay.shutdown"); + delay_char = dstate_getinfo("ups.delay.shutdown"); delay = atoi(delay_char); riello_init_serial(); - if (typeRielloProtocol == DEV_RIELLOGPSER) + if (typeRielloProtocol == DEV_RIELLOGPSER) length = riello_prepare_cs(bufOut, gpser_error_control, delay); else length = riello_prepare_shutsentr(bufOut, delay); - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command load.off delay communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], typeRielloProtocol); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.off.delay Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.off.delay Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], typeRielloProtocol); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.off.delay Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.off.delay Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.off delay Ok"); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "load.on")) { delay = 0; riello_init_serial(); - if (typeRielloProtocol == DEV_RIELLOGPSER) + if (typeRielloProtocol == DEV_RIELLOGPSER) length = riello_prepare_cr(bufOut, gpser_error_control, delay); else { length = riello_prepare_setrebsentr(bufOut, delay); - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command load.on communication error"); return STAT_INSTCMD_FAILED; + } riello_serialcomm(&bufIn[0], typeRielloProtocol); if (!wait_packet && foundbadcrc) { @@ -436,169 +447,184 @@ int riello_instcmd(const char *cmdname, const char *extra) length = riello_prepare_rebsentr(bufOut, delay); } - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command load.on communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], typeRielloProtocol); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.on Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.on Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], typeRielloProtocol); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.on Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.on Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.on Ok"); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "load.on.delay")) { - delay_char = dstate_getinfo("ups.delay.reboot"); + delay_char = dstate_getinfo("ups.delay.reboot"); delay = atoi(delay_char); riello_init_serial(); - if (typeRielloProtocol == DEV_RIELLOGPSER) + if (typeRielloProtocol == DEV_RIELLOGPSER) length = riello_prepare_cr(bufOut, gpser_error_control, delay); else { - length = riello_prepare_setrebsentr(bufOut, delay); - if (ser_send_buf(upsfd, bufOut, length) == 0) + length = riello_prepare_setrebsentr(bufOut, delay); + + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command load.on delay communication error"); return STAT_INSTCMD_FAILED; + } riello_serialcomm(&bufIn[0], typeRielloProtocol); if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.on Ko: bad CRC or Checksum"); + upsdebugx (3, "Command load.on delay Ko: bad CRC or Checksum"); return STAT_INSTCMD_FAILED; } if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.on Ko: command not supported"); + upsdebugx (3, "Command load.on delay Ko: command not supported"); return STAT_INSTCMD_FAILED; } length = riello_prepare_rebsentr(bufOut, delay); } - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command load.on delay communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], typeRielloProtocol); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.on.delay Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.on.delay Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], typeRielloProtocol); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.on.delay Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.on.delay Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.on delay Ok"); + return STAT_INSTCMD_HANDLED; } } else { if (!strcasecmp(cmdname, "shutdown.return")) { - delay_char = dstate_getinfo("ups.delay.shutdown"); + delay_char = dstate_getinfo("ups.delay.shutdown"); delay = atoi(delay_char); riello_init_serial(); - if (typeRielloProtocol == DEV_RIELLOGPSER) + if (typeRielloProtocol == DEV_RIELLOGPSER) length = riello_prepare_cs(bufOut, gpser_error_control, delay); else length = riello_prepare_shutsentr(bufOut, delay); - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command shutdown.return communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], typeRielloProtocol); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command shutdown.return Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command shutdown.return Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], typeRielloProtocol); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command shutdown.return Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command shutdown.return Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command shutdown.return Ok"); + return STAT_INSTCMD_HANDLED; } } if (!strcasecmp(cmdname, "shutdown.stop")) { riello_init_serial(); - if (typeRielloProtocol == DEV_RIELLOGPSER) + if (typeRielloProtocol == DEV_RIELLOGPSER) length = riello_prepare_cd(bufOut, gpser_error_control); else length = riello_prepare_cancelsentr(bufOut); - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command shutdown.stop communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], typeRielloProtocol); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command shutdown.stop Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command shutdown.stop Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], typeRielloProtocol); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command shutdown.stop Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command shutdown.stop Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command shutdown.stop Ok"); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "test.panel.start")) { riello_init_serial(); length = riello_prepare_tp(bufOut, gpser_error_control); - if (ser_send_buf(upsfd, bufOut, length) == 0) + + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command test.panel.start communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], DEV_RIELLOGPSER); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command panel.start Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command panel.start Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], DEV_RIELLOGPSER); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command test.panel.start Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command test.panel.start Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command test.panel.start Ok"); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "test.battery.start")) { riello_init_serial(); - - if (typeRielloProtocol == DEV_RIELLOGPSER) + if (typeRielloProtocol == DEV_RIELLOGPSER) length = riello_prepare_tb(bufOut, gpser_error_control); else length = riello_prepare_tbsentr(bufOut); - if (ser_send_buf(upsfd, bufOut, length) == 0) + if (ser_send_buf(upsfd, bufOut, length) == 0) { + upsdebugx (3, "Command test.battery.start communication error"); return STAT_INSTCMD_FAILED; - else { - riello_serialcomm(&bufIn[0], typeRielloProtocol); - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command battery.start Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - - if (!wait_packet && foundnak) { - upsdebugx (3, "Command battery.start Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; } + + riello_serialcomm(&bufIn[0], typeRielloProtocol); + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command battery.start Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command battery.start Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command test.battery.start Ok"); + return STAT_INSTCMD_HANDLED; } upslogx(LOG_NOTICE, "instcmd: unknown command [%s]", cmdname); @@ -737,37 +763,40 @@ void upsdrv_updateinfo(void) { uint8_t getextendedOK; static int countlost = 0; + int stat; - if (countlost < COUNTLOST) + upsdebugx(1, "countlost %d",countlost); + + if (countlost > 0){ upsdebugx(1, "Communication with UPS is lost: status read failed!"); - else if (countlost == COUNTLOST) - upslogx(LOG_WARNING, "Communication with UPS is lost: status read failed!"); - else - dstate_datastale(); - - if (typeRielloProtocol == DEV_RIELLOGPSER) { - if (get_ups_status() != 0) { - if (countlost <= COUNTLOST) - countlost++; - return; - } + if (countlost == COUNTLOST) { + dstate_datastale(); + upslogx(LOG_WARNING, "Communication with UPS is lost: status read failed!"); + } + } + + if (typeRielloProtocol == DEV_RIELLOGPSER) + stat = get_ups_status(); + else + stat = get_ups_sentr(); + + if (stat < 0) { + if (countlost < COUNTLOST) + countlost++; + return; + } + + if (typeRielloProtocol == DEV_RIELLOGPSER) { if (get_ups_extended() == 0) getextendedOK = 1; else getextendedOK = 0; } - else { - if (get_ups_sentr() != 0) { - if (countlost <= COUNTLOST) - countlost++; - return; - } - else - getextendedOK = 1; - } + else + getextendedOK = 1; - if (countlost > COUNTLOST) + if (countlost == COUNTLOST) upslogx(LOG_NOTICE, "Communication with UPS is re-established!"); dstate_setinfo("input.frequency", "%.2f", DevData.Finp/10.0); diff --git a/drivers/riello_usb.c b/drivers/riello_usb.c index 89909da..34b319a 100644 --- a/drivers/riello_usb.c +++ b/drivers/riello_usb.c @@ -33,7 +33,7 @@ #include "riello.h" #define DRIVER_NAME "Riello USB driver" -#define DRIVER_VERSION "0.02" +#define DRIVER_VERSION "0.03" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -105,14 +105,14 @@ static int cypress_setfeatures() return ret; } -uint8_t Send_USB_Packet(uint8_t *send_str, uint16_t numbytes) +int Send_USB_Packet(uint8_t *send_str, uint16_t numbytes) { uint8_t USB_buff_pom[10]; int i, err, size, errno; /* is input correct ? */ if ((!send_str) || (!numbytes)) - return 1; + return -1; size = 7; @@ -130,11 +130,8 @@ uint8_t Send_USB_Packet(uint8_t *send_str, uint16_t numbytes) err = usb_bulk_write(udev, 0x2, (char*) USB_buff_pom, 8, 1000); if (err < 0) { - if (err==-13 || errno==19) - upsdebugx(3, "USB device disconnected !"); - else - upsdebugx(3, "USB: Send_USB_Packet: send_usb_packet, err = %08x %s ", err, strerror(errno)); - return 2; + upsdebugx(3, "USB: Send_USB_Packet: send_usb_packet, err = %d %s ", err, strerror(errno)); + return err; } ussleep(USB_WRITE_DELAY); } @@ -163,18 +160,15 @@ uint8_t Send_USB_Packet(uint8_t *send_str, uint16_t numbytes) err = usb_bulk_write(udev, 0x2, (char*) USB_buff_pom, 8, 1000); if (err < 0) { - if (err==-13 || errno==19) - upsdebugx(3, "USB device disconnected !"); - else - upsdebugx(3, "USB: Send_USB_Packet: send_usb_packet, err = %08x %s ", err, strerror(errno)); - return 2; + upsdebugx(3, "USB: Send_USB_Packet: send_usb_packet, err = %d %s ", err, strerror(errno)); + return err; } ussleep(USB_WRITE_DELAY); } return (0); } -uint8_t Get_USB_Packet(uint8_t *buffer) +int Get_USB_Packet(uint8_t *buffer) { char inBuf[10]; int err, size, errno, ep; @@ -185,23 +179,12 @@ uint8_t Get_USB_Packet(uint8_t *buffer) ep = 0x81 | USB_ENDPOINT_IN; err = usb_bulk_read(udev, ep, (char*) inBuf, size, 1000); - upsdebugx(3, "read: %02X %02X %02X %02X %02X %02X %02X %02X", inBuf[0], inBuf[1], inBuf[2], inBuf[3], inBuf[4], inBuf[5], inBuf[6], inBuf[7]); - - if (err == 0) { - if (err==-13 || err==-19 || errno==19) - upsdebugx(3, "USB device disconnected !"); - else { - switch (errno) { - case 11: /* resource temp. not available */ - case 16: /* device busy */ - /* ignore it */ - break; - default: - upsdebugx(3, "USB: Get_USB_Packet: send_usb_packet, err = %08x %s ", err, strerror(errno)); - break; - } - } - return (0); + if (err > 0) + upsdebugx(3, "read: %02X %02X %02X %02X %02X %02X %02X %02X", inBuf[0], inBuf[1], inBuf[2], inBuf[3], inBuf[4], inBuf[5], inBuf[6], inBuf[7]); + + if (err < 0){ + upsdebugx(3, "USB: Get_USB_Packet: send_usb_packet, err = %d %s ", err, strerror(errno)); + return err; } /* copy to buffer */ @@ -214,18 +197,18 @@ uint8_t Get_USB_Packet(uint8_t *buffer) static int cypress_command(uint8_t *buffer, uint8_t *buf, uint16_t length, uint16_t buflen) { + int loop = 0; int ret, i = 0; uint8_t USB_buff[BUFFER_SIZE]; /* read to flush buffer */ -/* ret = Get_USB_Packet(buf+i);*/ riello_init_serial(); /* send packet */ ret = Send_USB_Packet(buffer, length); - if (ret > 0) { - upsdebugx(3, "send: %s", ret ? usb_strerror() : "timeout"); + if (ret < 0) { + upsdebugx(3, "Cypress_command send: err %d", ret ); return ret; } @@ -243,7 +226,7 @@ static int cypress_command(uint8_t *buffer, uint8_t *buf, uint16_t length, uint1 * will happen after successfully writing a command to the UPS) */ if (ret < 0) { - upsdebugx(3, "read: %s", ret ? usb_strerror() : "timeout"); + upsdebugx(3, "Cypress_command read: err %d", ret ); return ret; } @@ -251,6 +234,14 @@ static int cypress_command(uint8_t *buffer, uint8_t *buf, uint16_t length, uint1 commbyte = USB_buff[i]; riello_parse_serialport(DEV_RIELLOGPSER, buf, gpser_error_control); } + + loop++; + if (loop>300){ + wait_packet=0; + upsdebugx(1, "wait_packet reset"); + } + + ussleep(10); } upsdebugx(3, "in read: %u", buf_ptr_length); @@ -302,6 +293,30 @@ static USBDeviceMatcher_t device_matcher = { }; +/* + * Callback that is called by usb_device_open() that handles USB device + * settings prior to accepting the devide. At the very least claim the + * device here. Detaching the kernel driver will be handled by the + * caller, don't do this here. Return < 0 on error, 0 or higher on + * success. + */ +static int driver_callback(usb_dev_handle *handle, USBDevice_t *device, unsigned char *rdbuf, int rdlen) +{ + /*if (usb_set_configuration(handle, 1) < 0) { + upslogx(LOG_WARNING, "Can't set USB configuration: %s", usb_strerror()); + return -1; + } */ + + if (usb_claim_interface(handle, 0) < 0) { + upslogx(LOG_WARNING, "Can't claim USB interface: %s", usb_strerror()); + return -1; + } + + /* TODO: HID SET_IDLE to 0 (not necessary?) */ + + return 1; +} + /* * Generic command processing function. Send a command and read a reply. * Returns < 0 on error, 0 on timeout and the number of bytes read on @@ -312,18 +327,23 @@ int riello_command(uint8_t *cmd, uint8_t *buf, uint16_t length, uint16_t buflen) int ret; if (udev == NULL) { - ret = usb->open(&udev, &usbdevice, reopen_matcher, NULL); + ret = usb->open(&udev, &usbdevice, reopen_matcher, &driver_callback); - if (ret < 1) { + upsdebugx (3, "riello_command err udev NULL : %d ", ret); + if (ret < 0) return ret; - } + + upsdrv_initinfo(); //reconekt usb cable } ret = (*subdriver_command)(cmd, buf, length, buflen); if (ret >= 0) { + upsdebugx (3, "riello_command ok: %u", ret); return ret; } + upsdebugx (3, "riello_command err: %d", ret); + switch (ret) { case -EBUSY: /* Device or resource busy */ @@ -354,37 +374,49 @@ int riello_command(uint8_t *cmd, uint8_t *buf, uint16_t length, uint16_t buflen) break; case -ETIMEDOUT: /* Connection timed out */ + upsdebugx (3, "riello_command err: Resource temporarily unavailable"); + + case -EOVERFLOW: /* Value too large for defined data type */ #ifdef EPROTO case -EPROTO: /* Protocol error */ #endif + break; default: break; } + return ret; } int get_ups_nominal() { - uint8_t recv, length; + uint8_t length; + int recv; length = riello_prepare_gn(&bufOut[0], gpser_error_control); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_GN); + if (recv < 0){ + upsdebugx (3, "Get nominal err: read byte: %d", recv); + return recv; + } + if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get nominal Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* mandatory */ if (!wait_packet && foundnak) { upsdebugx (3, "Get nominal Ko: command not supported"); - return 1; + return -1; } - upsdebugx (3, "Get nominal Ok: read byte: %u", recv); + upsdebugx (3, "Get nominal Ok: read byte: %d", recv); riello_parse_gn(&bufIn[0], &DevData); @@ -393,7 +425,8 @@ int get_ups_nominal() int get_ups_status() { - uint8_t recv, numread, length; + uint8_t numread, length; + int recv; length = riello_prepare_rs(&bufOut[0], gpser_error_control); @@ -406,17 +439,23 @@ int get_ups_status() recv = riello_command(&bufOut[0], &bufIn[0], length, numread); + if (recv < 0){ + upsdebugx (3, "Get status err: read byte: %d", recv); + return recv; + } + if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get status Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* mandatory */ if (!wait_packet && foundnak) { upsdebugx (3, "Get status Ko: command not supported"); - return 1; + return -1; } - upsdebugx (3, "Get status Ok: read byte: %u", recv); + upsdebugx (3, "Get status Ok: read byte: %d", recv); riello_parse_rs(&bufIn[0], &DevData, numread); @@ -425,23 +464,30 @@ int get_ups_status() int get_ups_extended() { - uint8_t recv, length; + uint8_t length; + int recv; length = riello_prepare_re(&bufOut[0], gpser_error_control); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_RE); + if (recv < 0){ + upsdebugx (3, "Get extended err: read byte: %d", recv); + return recv; + } + if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get extended Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* optional */ if (!wait_packet && foundnak) { upsdebugx (3, "Get extended Ko: command not supported"); - return 1; + return 0; } - upsdebugx (3, "Get extended Ok: read byte: %u", recv); + upsdebugx (3, "Get extended Ok: read byte: %d", recv); riello_parse_re(&bufIn[0], &DevData); @@ -450,23 +496,30 @@ int get_ups_extended() int get_ups_statuscode() { - uint8_t recv, length; + uint8_t length; + int recv; length = riello_prepare_rc(&bufOut[0], gpser_error_control); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_RC); + if (recv < 0){ + upsdebugx (3, "Get statuscode err: read byte: %d", recv); + return recv; + } + if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get statuscode Ko: bad CRC or Checksum"); - return 1; + return -1; } + /* optional */ if (!wait_packet && foundnak) { upsdebugx (3, "Get statuscode Ko: command not supported"); - return 1; + return 0; } - upsdebugx (3, "Get statuscode Ok: read byte: %u", recv); + upsdebugx (3, "Get statuscode Ok: read byte: %d", recv); riello_parse_rc(&bufIn[0], &DevData); @@ -475,7 +528,8 @@ int get_ups_statuscode() int riello_instcmd(const char *cmdname, const char *extra) { - uint8_t length, recv; + uint8_t length; + int recv; uint16_t delay; const char *delay_char; @@ -483,175 +537,201 @@ int riello_instcmd(const char *cmdname, const char *extra) if (!strcasecmp(cmdname, "load.off")) { delay = 0; + length = riello_prepare_cs(bufOut, gpser_error_control, delay); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.off Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.off Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command load.off err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.off Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.off Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.off Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "load.off.delay")) { - delay_char = dstate_getinfo("ups.delay.shutdown"); + delay_char = dstate_getinfo("ups.delay.shutdown"); delay = atoi(delay_char); length = riello_prepare_cs(bufOut, gpser_error_control, delay); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.off.delay Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.off.delay Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command load.off.delay err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.off.delay Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.off.delay Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.off.delay Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "load.on")) { delay = 0; + length = riello_prepare_cr(bufOut, gpser_error_control, delay); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.on Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.on Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command load.on err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.on Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.on Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.on Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "load.on.delay")) { - delay_char = dstate_getinfo("ups.delay.reboot"); + delay_char = dstate_getinfo("ups.delay.reboot"); delay = atoi(delay_char); length = riello_prepare_cr(bufOut, gpser_error_control, delay); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command load.on.delay Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command load.on.delay Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command load.on.delay err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command load.on.delay Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command load.on.delay Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command load.on.delay Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } } else { if (!strcasecmp(cmdname, "shutdown.return")) { - delay_char = dstate_getinfo("ups.delay.shutdown"); + delay_char = dstate_getinfo("ups.delay.shutdown"); delay = atoi(delay_char); length = riello_prepare_cs(bufOut, gpser_error_control, delay); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command shutdown.return Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command shutdown.return Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command shutdown.return err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command shutdown.return Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command shutdown.return Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command shutdown.return Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } } if (!strcasecmp(cmdname, "shutdown.stop")) { length = riello_prepare_cd(bufOut, gpser_error_control); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command shutdown.stop Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command shutdown.stop Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command shutdown.stop err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command shutdown.stop Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command shutdown.stop Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command shutdown.stop Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "test.panel.start")) { length = riello_prepare_tp(bufOut, gpser_error_control); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command test.panel.start Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command test.panel.start Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command test.panel.start err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command test.panel.start Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command test.panel.start Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command test.panel.start Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "test.battery.start")) { length = riello_prepare_tb(bufOut, gpser_error_control); recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_DEF); - if (recv > 0) { - if (!wait_packet && foundbadcrc) { - upsdebugx (3, "Command test.battery.start Ko: bad CRC or Checksum"); - return STAT_INSTCMD_FAILED; - } - if (!wait_packet && foundnak) { - upsdebugx (3, "Command test.battery.start Ko: command not supported"); - return STAT_INSTCMD_FAILED; - } - - return STAT_INSTCMD_HANDLED; - } - else + if (recv < 0) { + upsdebugx (3, "Command test.battery.start err: read byte: %d", recv); return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundbadcrc) { + upsdebugx (3, "Command test.battery.start Ko: bad CRC or Checksum"); + return STAT_INSTCMD_FAILED; + } + + if (!wait_packet && foundnak) { + upsdebugx (3, "Command test.battery.start Ko: command not supported"); + return STAT_INSTCMD_FAILED; + } + + upsdebugx (3, "Command test.battery.start Ok: read byte: %d", recv); + return STAT_INSTCMD_HANDLED; } upslogx(LOG_NOTICE, "instcmd: unknown command [%s]", cmdname); @@ -671,6 +751,11 @@ int start_ups_comm() recv = riello_command(&bufOut[0], &bufIn[0], length, LENGTH_GI); + if (recv < 0) { + upsdebugx (3, "Get identif err: read byte: %d", recv); + return recv; + } + if (!wait_packet && foundbadcrc) { upsdebugx (3, "Get identif Ko: bad CRC or Checksum"); return 1; @@ -681,10 +766,9 @@ int start_ups_comm() return 1; } - upsdebugx (3, "Get identif Ok: read byte: %u", recv); - return 0; + return 0; } void upsdrv_help(void) @@ -755,11 +839,10 @@ void upsdrv_initups(void) fatalx(EXIT_FAILURE, "invalid regular expression: %s", regex_array[ret]); } - /* link the matchers */ regex_matcher->next = &device_matcher; - ret = usb->open(&udev, &usbdevice, regex_matcher, NULL); + ret = usb->open(&udev, &usbdevice, regex_matcher, &driver_callback); if (ret < 0) { fatalx(EXIT_FAILURE, "No supported devices found. Please check your device availability with 'lsusb'\n" @@ -894,16 +977,25 @@ void upsdrv_updateinfo(void) { uint8_t getextendedOK; static int countlost = 0; + int stat; - if (countlost < COUNTLOST) + upsdebugx(1, "countlost %d",countlost); + + if (countlost > 0){ upsdebugx(1, "Communication with UPS is lost: status read failed!"); - else if (countlost == COUNTLOST) - upslogx(LOG_WARNING, "Communication with UPS is lost: status read failed!"); - else - dstate_datastale(); - if (get_ups_status() != 0) { - if (countlost <= COUNTLOST) + if (countlost == COUNTLOST) { + dstate_datastale(); + upslogx(LOG_WARNING, "Communication with UPS is lost: status read failed!"); + } + } + + stat = get_ups_status(); + + upsdebugx(1, "get_ups_status() %d",stat ); + + if (stat < 0) { + if (countlost < COUNTLOST) countlost++; return; } @@ -913,7 +1005,7 @@ void upsdrv_updateinfo(void) else getextendedOK = 0; - if (countlost > COUNTLOST) + if (countlost == COUNTLOST) upslogx(LOG_NOTICE, "Communication with UPS is re-established!"); dstate_setinfo("input.frequency", "%.2f", DevData.Finp/10.0); @@ -963,23 +1055,23 @@ void upsdrv_updateinfo(void) /* LowBatt */ if ((riello_test_bit(&DevData.StatusCode[0], 1)) && (riello_test_bit(&DevData.StatusCode[0], 0))) - status_set("LB"); + status_set("LB"); /* Standby */ if (!riello_test_bit(&DevData.StatusCode[0], 3)) - status_set("OFF"); + status_set("OFF"); /* On Bypass */ if (riello_test_bit(&DevData.StatusCode[1], 3)) - status_set("BYPASS"); + status_set("BYPASS"); /* Overload */ if (riello_test_bit(&DevData.StatusCode[4], 2)) - status_set("OVER"); + status_set("OVER"); /* Buck */ if (riello_test_bit(&DevData.StatusCode[1], 0)) - status_set("TRIM"); + status_set("TRIM"); /* Boost */ if (riello_test_bit(&DevData.StatusCode[1], 1)) @@ -991,7 +1083,7 @@ void upsdrv_updateinfo(void) /* Charging battery */ if (riello_test_bit(&DevData.StatusCode[2], 2)) - status_set("CHRG"); + status_set("CHRG"); status_commit(); @@ -1011,7 +1103,8 @@ void upsdrv_updateinfo(void) poll_interval = 2; - countlost = 0; + countlost = 0; + /* if (get_ups_statuscode() != 0) upsdebugx(2, "Communication is lost"); else { diff --git a/drivers/solis.c b/drivers/solis.c index 78e83e0..380ecc3 100644 --- a/drivers/solis.c +++ b/drivers/solis.c @@ -40,7 +40,7 @@ #include "timehead.h" #define DRIVER_NAME "Microsol Solis UPS driver" -#define DRIVER_VERSION "0.61" +#define DRIVER_VERSION "0.62" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -610,7 +610,7 @@ static void ScanReceivePack( void ) /* Autonomy */ - if( ( Autonomy < 5 ) ) + if( Autonomy < 5 ) LowBatt = true; else LowBatt = false; @@ -618,7 +618,7 @@ static void ScanReceivePack( void ) UpsPowerFactor = 700; /* input 110V or 220v */ - if( ( InputValue == 0 ) ) { + if( InputValue == 0 ) { InDownLim = 75; InUpLim = 150; NomInVolt = 110; @@ -702,7 +702,7 @@ CommReceive(const char *bufptr, int size) int i, CheckSum, i_end; - if( ( size==25 ) ) + if( size==25 ) Waiting = 0; switch( Waiting ) @@ -727,7 +727,8 @@ CommReceive(const char *bufptr, int size) ser_flush_in(upsfd,"",0); /* clean port */ /* correct package */ - if( ( (RecPack[0] & 0xF0) == 0xA0 ) + /* 0xA0 is original solis.c; 0xB0 is for APC-branded Microsol units */ + if( ( ( (RecPack[0] & 0xF0) == 0xA0 ) || (RecPack[0] & 0xF0) == 0xB0) && ( RecPack[ 24 ] == 254 ) && ( RecPack[ 23 ] == CheckSum ) ) { @@ -742,7 +743,11 @@ CommReceive(const char *bufptr, int size) switch( SolisModel ) { - case 10: + case 10: /* Added for APC-Branded Microsol units */ + { + ScanReceivePack(); + break; + } case 11: case 12: case 13: @@ -755,6 +760,7 @@ CommReceive(const char *bufptr, int size) default: { printf( M_UNKN ); + ScanReceivePack(); // Scan anyway. break; } } @@ -884,26 +890,30 @@ static void getbaseinfo(void) switch( SolisModel ) { - case 10: + case 10: /* Added for APC-Microsol units */ + { + Model = "Back-UPS 1200 BR"; + break; + } case 11: case 12: { - strcpy(Model, "Solis 1.0"); + Model = "Solis 1.0"; break; } case 13: { - strcpy(Model, "Solis 1.5"); + Model = "Solis 1.5"; break; } case 14: { - strcpy(Model, "Solis 2.0"); + Model = "Solis 2.0"; break; } case 15: { - strcpy(Model, "Solis 3.0"); + Model = "Solis 3.0"; break; } } diff --git a/drivers/solis.h b/drivers/solis.h index 521d080..980f8d5 100644 --- a/drivers/solis.h +++ b/drivers/solis.h @@ -309,7 +309,7 @@ unsigned char DumpPack[242]; */ /* Identification */ -char Model[12]; +const char *Model; int SolisModel, imodel; int InputValue, Out220; diff --git a/drivers/tripplite_usb.c b/drivers/tripplite_usb.c index e907c12..9b06407 100644 --- a/drivers/tripplite_usb.c +++ b/drivers/tripplite_usb.c @@ -8,7 +8,7 @@ Copyright (C) 1999 Russell Kroll Copyright (C) 2001 Rickard E. (Rik) Faith Copyright (C) 2004 Nicholas J. Kain - Copyright (C) 2005-2008 Charles Lepple + Copyright (C) 2005-2008, 2014 Charles Lepple 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 @@ -125,6 +125,9 @@ * :S -- enables remote reboot/remote power on */ +/* Watchdog for 3005 is 15 - 255 seconds. + */ + #include "main.h" #include "libusb.h" #include @@ -133,7 +136,7 @@ #include "usb-common.h" #define DRIVER_NAME "Tripp Lite OMNIVS / SMARTPRO driver" -#define DRIVER_VERSION "0.20" +#define DRIVER_VERSION "0.29" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -188,9 +191,38 @@ static enum tl_model_t { TRIPP_LITE_OMNIVS, TRIPP_LITE_OMNIVS_2001, TRIPP_LITE_SMARTPRO, - TRIPP_LITE_SMART_0004 + TRIPP_LITE_SMART_0004, + TRIPP_LITE_SMART_3005 } tl_model = TRIPP_LITE_UNKNOWN; +/*! Are the values encoded in ASCII or binary? + * TODO: Add 3004? + */ +static int is_binary_protocol() +{ + switch(tl_model) { + case TRIPP_LITE_SMART_3005: + return 1; + default: + return 0; + } +} + +/*! Is this the "SMART" family of protocols? + * TODO: Add 3004? + */ +static int is_smart_protocol() +{ + switch(tl_model) { + case TRIPP_LITE_SMARTPRO: + case TRIPP_LITE_SMART_0004: + case TRIPP_LITE_SMART_3005: + return 1; + default: + return 0; + } +} + /*!@brief If a character is not printable, return a dot. */ #define toprint(x) (isalnum((unsigned)x) ? (x) : '.') @@ -201,7 +233,7 @@ static enum tl_model_t { #define SEND_WAIT_NSEC (1000*1000*100) #define MAX_RECV_TRIES 10 -#define RECV_WAIT_MSEC 1000 /*! was 100 for OMNIVS; SMARTPRO units need longer */ +#define RECV_WAIT_MSEC 1000 /*!< was 100 for OMNIVS; SMARTPRO units need longer */ #define MAX_RECONNECT_TRIES 10 @@ -307,6 +339,36 @@ static int hex2d(const unsigned char *start, unsigned int len) return strtol((char *)buf, NULL, 16); } +/*!@brief Convert N characters from big-endian binary to decimal + * + * @param start Beginning of string to convert + * @param len Maximum number of characters to consider (max 32) + * + * @a len characters of @a start are shifted into an accumulator. + * + * We assume len < sizeof(int), and that value > 0. + * + * @return the value + */ +static unsigned int bin2d(const unsigned char *start, unsigned int len) +{ + unsigned int value = 0, index = 0; + for(index = 0; index < len; index++) { + value <<= 8; + value |= start[index]; + } + + return value; +} + +static int hex_or_bin2d(const unsigned char *start, unsigned int len) +{ + if(is_binary_protocol()) { + return bin2d(start, len); + } + return hex2d(start, len); +} + /*!@brief Dump message in both hex and ASCII * * @param[in] msg Buffer to dump @@ -349,7 +411,7 @@ enum tl_model_t decode_protocol(unsigned int proto) { switch(proto) { case 0x0004: - upslogx(3, "Using older SMART protocol (%x)", proto); + upslogx(3, "Using older SMART protocol (%04x)", proto); return TRIPP_LITE_SMART_0004; case 0x1001: upslogx(3, "Using OMNIVS protocol (%x)", proto); @@ -360,8 +422,11 @@ enum tl_model_t decode_protocol(unsigned int proto) case 0x3003: upslogx(3, "Using SMARTPRO protocol (%x)", proto); return TRIPP_LITE_SMARTPRO; + case 0x3005: + upslogx(3, "Using binary SMART protocol (%x)", proto); + return TRIPP_LITE_SMART_3005; default: - printf("Unknown protocol (%x)", proto); + printf("Unknown protocol (%04x)", proto); break; } @@ -371,7 +436,15 @@ enum tl_model_t decode_protocol(unsigned int proto) void decode_v(const unsigned char *value) { unsigned char ivn, lb; - int bv = hex2d(value+2, 2); + int bv; + + if(is_binary_protocol()) { + /* 0x00 0x0c -> 12V ? */ + battery_voltage_nominal = (value[2] << 8) | value[3]; + } else { + bv = hex2d(value+2, 2); + battery_voltage_nominal = bv * 6; + } ivn = value[1]; lb = value[4]; @@ -381,6 +454,7 @@ void decode_v(const unsigned char *value) input_voltage_scaled = 100; break; + case 2: /* protocol 3005 */ case '1': input_voltage_nominal = input_voltage_scaled = 120; break; @@ -398,16 +472,19 @@ void decode_v(const unsigned char *value) break; } - battery_voltage_nominal = bv * 6; - if( (lb >= '0') && (lb <= '9') ) { switchable_load_banks = lb - '0'; } else { - if( lb != 'X' ) { - upslogx(2, "Unknown number of switchable load banks: 0x%02x", + if(is_binary_protocol()) { + switchable_load_banks = lb; + } else { + if( lb != 'X' ) { + upslogx(2, "Unknown number of switchable load banks: 0x%02x", (unsigned int)lb); + } } } + upsdebugx(2, "Switchable load banks: %d", switchable_load_banks); } void upsdrv_initinfo(void); @@ -581,6 +658,7 @@ static int soft_shutdown(void) int ret; unsigned char buf[256], cmd_N[]="N\0x", cmd_G[] = "G"; + /* Already binary: */ cmd_N[2] = offdelay; cmd_N[1] = offdelay >> 8; upsdebugx(3, "soft_shutdown(offdelay=%d): N", offdelay); @@ -652,8 +730,22 @@ static int control_outlet(int outlet_id, int state) } else { return 1; } + break; + case TRIPP_LITE_SMART_3005: + snprintf(k_cmd, sizeof(k_cmd)-1, "N%c", 5); + ret = send_cmd((unsigned char *)k_cmd, strlen(k_cmd) + 1, (unsigned char *)buf, sizeof buf); + snprintf(k_cmd, sizeof(k_cmd)-1, "K%c%c", outlet_id, state & 1); + ret = send_cmd((unsigned char *)k_cmd, strlen(k_cmd) + 1, (unsigned char *)buf, sizeof buf); + + if(ret != 8) { + upslogx(LOG_ERR, "Could not set outlet %d to state %d, ret = %d", outlet_id, state, ret); + return 0; + } else { + return 1; + } + break; default: - upslogx(LOG_ERR, "control_outlet unimplemented for this UPS model"); + upslogx(LOG_ERR, "control_outlet unimplemented for protocol %04x", tl_model); } return 0; } @@ -664,7 +756,7 @@ static int instcmd(const char *cmdname, const char *extra) { unsigned char buf[10]; - if(tl_model == TRIPP_LITE_SMARTPRO || tl_model == TRIPP_LITE_SMART_0004) { + if(is_smart_protocol()) { if (!strcasecmp(cmdname, "test.battery.start")) { send_cmd((const unsigned char *)"A", 2, buf, sizeof buf); return STAT_INSTCMD_HANDLED; @@ -964,7 +1056,7 @@ void upsdrv_initinfo(void) dstate_setaux("ups.delay.reboot", 3); #endif - if(tl_model == TRIPP_LITE_SMARTPRO || tl_model == TRIPP_LITE_SMART_0004) { + if(is_smart_protocol()) { dstate_addcmd("test.battery.start"); dstate_addcmd("reset.input.minmax"); } @@ -1002,10 +1094,12 @@ void upsdrv_updateinfo(void) unsigned char b_value[9], d_value[9], l_value[9], s_value[9], m_value[9], t_value[9]; int bp, freq; - double bv; + double bv_12V = 0.0; /*!< battery voltage, relative to a 12V battery */ + double battery_voltage; /*!< the total battery voltage */ + + unsigned int s_value_1; int ret; - unsigned battery_charge; status_init(); @@ -1055,8 +1149,14 @@ void upsdrv_updateinfo(void) /* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ - if(tl_model == TRIPP_LITE_SMARTPRO || tl_model == TRIPP_LITE_OMNIVS_2001 || tl_model == TRIPP_LITE_SMART_0004) { - switch(s_value[2]) { + if(is_smart_protocol() || tl_model == TRIPP_LITE_OMNIVS_2001) { + + unsigned int s_value_2 = s_value[2]; + + if(is_binary_protocol()) { + s_value_2 += '0'; + } + switch(s_value_2) { case '0': dstate_setinfo("battery.test.status", "Battery OK"); break; @@ -1096,16 +1196,27 @@ void upsdrv_updateinfo(void) } } - /* This may not be right... */ +#if 0 + /* Apparently, this value changes more frequently when the + * battery is discharged, but it does not track the actual + * state-of-charge. See battery.charge calculation below. + */ if(tl_model == TRIPP_LITE_SMARTPRO) { + unsigned battery_charge; battery_charge = (unsigned)(s_value[5]); dstate_setinfo("battery.charge", "%u", battery_charge); } +#endif } /* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ - switch(s_value[1]) { + s_value_1 = s_value[1]; + if(is_binary_protocol()) { + s_value_1 += '0'; + } + + switch(s_value_1) { case '0': status_set("LB"); break; @@ -1134,28 +1245,18 @@ void upsdrv_updateinfo(void) return; } - dstate_setinfo("input.voltage", "%.2f", hex2d(b_value+1, 4)/30.0); + dstate_setinfo("input.voltage", "%.2f", hex2d(b_value+1, 4)/3600.0*input_voltage_scaled); - bv = hex2d(b_value+5, 2)/16.0; + bv_12V = hex2d(b_value+5, 2)/16.0; - /* dq ~= sqrt(dV) is a reasonable approximation - * Results fit well against the discrete function used in the Tripp Lite - * source, but give a continuous result. */ - if (bv >= V_interval[1]) - bp = 100; - else if (bv <= V_interval[0]) - bp = 10; - else - bp = (int)(100*sqrt((bv - V_interval[0]) - / (V_interval[1] - V_interval[0]))); - - dstate_setinfo("battery.voltage", "%.2f", bv); - dstate_setinfo("battery.charge", "%3d", bp); + /* TODO: use battery_voltage_nominal, even though it is most likely 12V */ + dstate_setinfo("battery.voltage", "%.2f", bv_12V); } /* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ - if( tl_model == TRIPP_LITE_SMARTPRO || tl_model == TRIPP_LITE_SMART_0004 ) { + if( is_smart_protocol() ) { + ret = send_cmd(d_msg, sizeof(d_msg), d_value, sizeof(d_value)); if(ret <= 0) { dstate_datastale(); @@ -1164,17 +1265,19 @@ void upsdrv_updateinfo(void) } dstate_setinfo("input.voltage", "%d", - hex2d(d_value+1, 2) * input_voltage_scaled / 120); + hex_or_bin2d(d_value+1, 2) * input_voltage_scaled / 120); - bv = hex2d(d_value+3, 2) * battery_voltage_nominal / 120.0 ; + /* TODO: factor out the two constants */ + bv_12V = hex_or_bin2d(d_value+3, 2) / 10.0 ; + battery_voltage = bv_12V * battery_voltage_nominal / 12.0; - dstate_setinfo("battery.voltage", "%.2f", bv); + dstate_setinfo("battery.voltage", "%.2f", battery_voltage); /* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ ret = send_cmd(m_msg, sizeof(m_msg), m_value, sizeof(m_value)); - if(m_value[5] != 0x0d) { /* we only expect 4 hex digits */ + if(m_value[5] != 0x0d) { /* we only expect 4 hex/binary digits */ dstate_setinfo("ups.debug.M", "%s", hexascdump(m_value+1, 7)); } @@ -1184,8 +1287,8 @@ void upsdrv_updateinfo(void) return; } - dstate_setinfo("input.voltage.minimum", "%3d", hex2d(m_value+1, 2)); - dstate_setinfo("input.voltage.maximum", "%3d", hex2d(m_value+3, 2)); + dstate_setinfo("input.voltage.minimum", "%3d", hex_or_bin2d(m_value+1, 2) * input_voltage_scaled / 120); + dstate_setinfo("input.voltage.maximum", "%3d", hex_or_bin2d(m_value+3, 2) * input_voltage_scaled / 120); /* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ @@ -1216,8 +1319,30 @@ void upsdrv_updateinfo(void) dstate_setinfo("input.frequency", "%.1f", freq / 10.0); } - /* I'm guessing this is a calibration constant of some sort. */ - dstate_setinfo("ups.temperature", "%.1f", (unsigned)(hex2d(t_value+1, 2)) * 0.3636 - 21); + if( tl_model == TRIPP_LITE_SMART_3005 ) { + dstate_setinfo("ups.temperature", "%d", (unsigned)(hex2d(t_value+1, 1))); + } else { + /* I'm guessing this is a calibration constant of some sort. */ + dstate_setinfo("ups.temperature", "%.1f", (unsigned)(hex2d(t_value+1, 2)) * 0.3636 - 21); + } + } + + /* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ + + if( tl_model == TRIPP_LITE_OMNIVS || tl_model == TRIPP_LITE_OMNIVS_2001 || + tl_model == TRIPP_LITE_SMARTPRO || tl_model == TRIPP_LITE_SMART_0004 ) { + /* dq ~= sqrt(dV) is a reasonable approximation + * Results fit well against the discrete function used in the Tripp Lite + * source, but give a continuous result. */ + if (bv_12V >= V_interval[1]) + bp = 100; + else if (bv_12V <= V_interval[0]) + bp = 10; + else + bp = (int)(100*sqrt((bv_12V - V_interval[0]) + / (V_interval[1] - V_interval[0]))); + + dstate_setinfo("battery.charge", "%3d", bp); } /* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ @@ -1232,7 +1357,7 @@ void upsdrv_updateinfo(void) switch(tl_model) { case TRIPP_LITE_OMNIVS: case TRIPP_LITE_OMNIVS_2001: - dstate_setinfo("output.voltage", "%.1f", hex2d(l_value+1, 4)/2.0); + dstate_setinfo("output.voltage", "%.1f", hex2d(l_value+1, 4)/240.0*input_voltage_scaled); break; case TRIPP_LITE_SMARTPRO: dstate_setinfo("ups.load", "%d", hex2d(l_value+1, 2)); @@ -1272,16 +1397,20 @@ void upsdrv_makevartable(void) { char msg[256]; - snprintf(msg, sizeof msg, "Set shutdown delay, in seconds (default=%d).", + snprintf(msg, sizeof msg, "Set shutdown delay, in seconds (default=%d)", DEFAULT_OFFDELAY); addvar(VAR_VALUE, "offdelay", msg); - /* allow -x vendor=X, vendorid=X, product=X, productid=X, serial=X */ - addvar(VAR_VALUE, "vendor", "Regular expression to match UPS Manufacturer string"); - addvar(VAR_VALUE, "product", "Regular expression to match UPS Product string"); - addvar(VAR_VALUE, "serial", "Regular expression to match UPS Serial number"); - addvar(VAR_VALUE, "productid", "Regular expression to match UPS Product numerical ID (4 digits hexadecimal)"); - addvar(VAR_VALUE, "bus", "Regular expression to match USB bus name"); + /* allow -x vendor=X, vendorid=X, product=X, productid=X, serial=X */ + nut_usb_addvars(); + + snprintf(msg, sizeof msg, "Minimum battery voltage, corresponding to 10%% charge (default=%.1f)", + MIN_VOLT); + addvar(VAR_VALUE, "battery_min", msg); + + snprintf(msg, sizeof msg, "Maximum battery voltage, corresponding to 100%% charge (default=%.1f)", + MAX_VOLT); + addvar(VAR_VALUE, "battery_max", msg); #if 0 snprintf(msg, sizeof msg, "Set start delay, in seconds (default=%d).", @@ -1301,6 +1430,7 @@ void upsdrv_makevartable(void) void upsdrv_initups(void) { char *regex_array[6]; + char *value; int r; /* process the UPS selection options */ @@ -1343,8 +1473,24 @@ void upsdrv_initups(void) /* link the two matchers */ reopen_matcher->next = regex_matcher; - if (getval("offdelay")) - offdelay = atoi(getval("offdelay")); + value = getval("offdelay"); + if (value) { + offdelay = atoi(value); + upsdebugx(2, "Setting 'offdelay' to %d", offdelay); + } + + value = getval("battery_min"); + if (value) { + V_interval[0] = atof(value); + upsdebugx(2, "Setting 'battery_min' to %.g", V_interval[0]); + } + + value = getval("battery_max"); + if (value) { + V_interval[1] = atof(value); + upsdebugx(2, "Setting 'battery_max' to %.g", V_interval[1]); + } + #if 0 if (getval("startdelay")) startdelay = atoi(getval("startdelay")); diff --git a/drivers/usb-common.h b/drivers/usb-common.h index ad08172..d7a3ff4 100644 --- a/drivers/usb-common.h +++ b/drivers/usb-common.h @@ -93,4 +93,6 @@ typedef struct { int is_usb_device_supported(usb_device_id_t *usb_device_id_list, USBDevice_t *device); +void nut_usb_addvars(void); + #endif /* NUT_USB_COMMON_H */ diff --git a/drivers/usbhid-ups.c b/drivers/usbhid-ups.c index cdfbad7..c3e480c 100644 --- a/drivers/usbhid-ups.c +++ b/drivers/usbhid-ups.c @@ -27,7 +27,7 @@ */ #define DRIVER_NAME "Generic HID driver" -#define DRIVER_VERSION "0.38" +#define DRIVER_VERSION "0.39" #include "main.h" #include "libhid.h" @@ -737,14 +737,12 @@ void upsdrv_makevartable(void) #ifndef SHUT_MODE /* allow -x vendor=X, vendorid=X, product=X, productid=X, serial=X */ - addvar(VAR_VALUE, "vendor", "Regular expression to match UPS Manufacturer string"); - addvar(VAR_VALUE, "product", "Regular expression to match UPS Product string"); - addvar(VAR_VALUE, "serial", "Regular expression to match UPS Serial number"); - addvar(VAR_VALUE, "vendorid", "Regular expression to match UPS Manufacturer numerical ID (4 digits hexadecimal)"); - addvar(VAR_VALUE, "productid", "Regular expression to match UPS Product numerical ID (4 digits hexadecimal)"); - addvar(VAR_VALUE, "bus", "Regular expression to match USB bus name"); + nut_usb_addvars(); + addvar(VAR_FLAG, "explore", "Diagnostic matching of unsupported UPS"); addvar(VAR_FLAG, "maxreport", "Activate tweak for buggy APC Back-UPS firmware"); + addvar(VAR_FLAG, "interruptonly", "Don't use polling, only use interrupt pipe"); + addvar(VAR_VALUE, "interruptsize", "Number of bytes to read from interrupt pipe"); #else addvar(VAR_VALUE, "notification", "Set notification type, (ignored, only for backward compatibility)"); #endif @@ -792,7 +790,23 @@ void upsdrv_updateinfo(void) /* Get HID notifications on Interrupt pipe first */ if (use_interrupt_pipe == TRUE) { evtCount = HIDGetEvents(udev, event, MAX_EVENT_NUM); - upsdebugx(1, "Got %i HID objects...", (evtCount >= 0) ? evtCount : 0); + switch (evtCount) + { + case -EBUSY: /* Device or resource busy */ + upslog_with_errno(LOG_CRIT, "Got disconnected by another driver"); + case -EPERM: /* Operation not permitted */ + case -ENODEV: /* No such device */ + case -EACCES: /* Permission denied */ + case -EIO: /* I/O error */ + case -ENXIO: /* No such device or address */ + case -ENOENT: /* No such file or directory */ + /* Uh oh, got to reconnect! */ + hd = NULL; + return; + default: + upsdebugx(1, "Got %i HID objects...", (evtCount >= 0) ? evtCount : 0); + break; + } } else { evtCount = 0; upsdebugx(1, "Not using interrupt pipe..."); @@ -812,7 +826,7 @@ void upsdrv_updateinfo(void) } /* Skip Input reports, if we don't use the Feature report */ - item = find_hid_info(FindObject_with_Path(pDesc, &(event[i]->Path), ITEM_FEATURE)); + item = find_hid_info(FindObject_with_Path(pDesc, &(event[i]->Path), interrupt_only ? ITEM_INPUT:ITEM_FEATURE)); if (!item) { upsdebugx(3, "NUT doesn't use this HID object"); continue; @@ -948,6 +962,15 @@ void upsdrv_initups(void) upsdebugx(1, "Detected a UPS: %s/%s", hd->Vendor ? hd->Vendor : "unknown", hd->Product ? hd->Product : "unknown"); + /* Activate Powercom tweaks */ + if (testvar("interruptonly")) { + interrupt_only = 1; + } + val = getval("interruptsize"); + if (val) { + interrupt_size = atoi(val); + } + if (hid_ups_walk(HU_WALKMODE_INIT) == FALSE) { fatalx(EXIT_FAILURE, "Can't initialize data from HID UPS"); } diff --git a/include/Makefile.in b/include/Makefile.in index bd75cae..d1e2f36 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -16,23 +15,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -53,8 +80,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = include -DIST_COMMON = $(dist_noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/config.h.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/config.h.in $(dist_noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -83,6 +110,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -91,12 +130,31 @@ am__can_run_installinfo = \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(dist_noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -203,12 +261,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -253,6 +314,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -317,8 +379,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): config.h: stamp-h1 - @if test ! -f $@; then rm -f stamp-h1; else :; fi - @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 @@ -337,26 +399,15 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -368,15 +419,11 @@ TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -385,6 +432,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -528,18 +590,18 @@ uninstall-am: .MAKE: all check install install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool ctags dist-hook distclean distclean-generic \ - distclean-hdr distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am # magic to include Git version information in NUT version string diff --git a/include/common.h b/include/common.h index fb5df62..477774e 100644 --- a/include/common.h +++ b/include/common.h @@ -120,6 +120,8 @@ char *xstrdup(const char *string); char *rtrim(char *in, const char sep); char* ltrim(char *in, const char sep); +char *rtrim_m(char *in, const char *seps); +char* ltrim_m(char *in, const char *seps); int select_read(const int fd, void *buf, const size_t buflen, const long d_sec, const long d_usec); int select_write(const int fd, const void *buf, const size_t buflen, const long d_sec, const long d_usec); diff --git a/include/config.h.in b/include/config.h.in index f255496..dd42362 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -15,6 +15,9 @@ /* Default path for configuration files */ #undef CONFPATH +/* Define processor type */ +#undef CPU_TYPE + /* Default path for data files */ #undef DATADIR @@ -51,6 +54,18 @@ /* Define to 1 if C supports variable-length arrays. */ #undef HAVE_C_VARARRAYS +/* Define to 1 if you have the declaration of `i2c_smbus_read_block_data', and + to 0 if you don't. */ +#undef HAVE_DECL_I2C_SMBUS_READ_BLOCK_DATA + +/* Define to 1 if you have the declaration of `i2c_smbus_read_word_data', and + to 0 if you don't. */ +#undef HAVE_DECL_I2C_SMBUS_READ_WORD_DATA + +/* Define to 1 if you have the declaration of `i2c_smbus_write_word_data', and + to 0 if you don't. */ +#undef HAVE_DECL_I2C_SMBUS_WRITE_WORD_DATA + /* Define to 1 if you have the declaration of `LOG_UPTO', and to 0 if you don't. */ #undef HAVE_DECL_LOG_UPTO @@ -134,7 +149,7 @@ /* Define to 1 if the system has the type `long double'. */ #undef HAVE_LONG_DOUBLE -/* Define to 1 if the system has the type `long long int'. */ +/* Define to 1 if the system has the type 'long long int'. */ #undef HAVE_LONG_LONG_INT /* Define to 1 if you have the header file. */ @@ -239,6 +254,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* Define to 1 if the system has the type 'unsigned long long int'. */ +#undef HAVE_UNSIGNED_LONG_LONG_INT + /* Define to 1 if you have the `usb_detach_kernel_driver_np' function. */ #undef HAVE_USB_DETACH_KERNEL_DRIVER_NP @@ -276,9 +294,6 @@ /* Define if getopt.h is needed */ #undef NEED_GETOPT_H -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - /* NUT network protocol version */ #undef NUT_NETVERSION @@ -382,6 +397,9 @@ /* Define to enable Powerman PDU support */ #undef WITH_LIBPOWERMAN +/* Define to enable I2C support */ +#undef WITH_LINUX_I2C + /* Define to enable Mac OS X meta-driver */ #undef WITH_MACOSX diff --git a/install-sh b/install-sh index a9244eb..377bb86 100755 --- a/install-sh +++ b/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-01-19.21; # UTC +scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -35,7 +35,7 @@ scriptversion=2011-01-19.21; # UTC # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it +# 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written @@ -156,7 +156,7 @@ while test $# -ne 0; do -s) stripcmd=$stripprog;; -t) dst_arg=$2 - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac @@ -190,7 +190,7 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then fi shift # arg dst_arg=$arg - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac @@ -202,7 +202,7 @@ if test $# -eq 0; then echo "$0: no input file specified." >&2 exit 1 fi - # It's OK to call `install-sh -d' without argument. + # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi @@ -240,7 +240,7 @@ fi for src do - # Protect names problematic for `test' and other utilities. + # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac @@ -354,7 +354,7 @@ do if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. + # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in diff --git a/lib/Makefile.in b/lib/Makefile.in index 0480c02..a0d827c 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -19,23 +18,51 @@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -56,9 +83,9 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = lib -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/libnutclient.pc.in $(srcdir)/libnutscan.pc.in \ - $(srcdir)/libupsclient-config.in $(srcdir)/libupsclient.pc.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/libupsclient-config.in $(srcdir)/libupsclient.pc.in \ + $(srcdir)/libnutclient.pc.in $(srcdir)/libnutscan.pc.in README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -117,6 +144,18 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)" SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -125,10 +164,12 @@ am__can_run_installinfo = \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -235,12 +276,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -285,6 +329,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -411,11 +456,11 @@ uninstall-pkgconfigDATA: @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -554,17 +599,17 @@ uninstall-am: uninstall-binSCRIPTS uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-binSCRIPTS install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-pkgconfigDATA install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am uninstall-binSCRIPTS \ - uninstall-pkgconfigDATA + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-binSCRIPTS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-binSCRIPTS uninstall-pkgconfigDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/ltmain.sh b/ltmain.sh index b9205ee..bffda54 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -70,7 +70,7 @@ # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.2ubuntu1 +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.11 # automake: $automake_version # autoconf: $autoconf_version # @@ -80,7 +80,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.2 Debian-2.4.2-1.2ubuntu1" +VERSION="2.4.2 Debian-2.4.2-1.11" TIMESTAMP="" package_revision=1.3337 diff --git a/m4/libtool.m4 b/m4/libtool.m4 index 02b4bbe..d7c043f 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -1312,7 +1312,7 @@ ia64-*-hpux*) rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext @@ -1333,7 +1333,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -1352,7 +1355,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) diff --git a/m4/nut_check_asciidoc.m4 b/m4/nut_check_asciidoc.m4 index 944870e..c629eab 100644 --- a/m4/nut_check_asciidoc.m4 +++ b/m4/nut_check_asciidoc.m4 @@ -35,6 +35,25 @@ if test -z "${nut_have_asciidoc_seen}"; then AC_MSG_RESULT(${DBLATEX_VERSION} found) fi - dnl FIXME check for xsltproc, xmlllint, etc for chunked HTML and man pages + AC_PATH_PROGS([XSLTPROC], [xsltproc]) + if test -n "${XSLTPROC}"; then + AC_MSG_CHECKING([for xsltproc version]) + XSLTPROC_VERSION="`${XSLTPROC} --version 2>/dev/null`" + dnl strip 'xsltproc version ' from version string + XSLTPROC_VERSION="${XSLTPROC_VERSION##* }" + AC_MSG_RESULT(${XSLTPROC_VERSION} found) + fi + + AC_PATH_PROGS([XMLLINT], [xmllint]) + if test -n "${XMLLINT}"; then + AC_MSG_CHECKING([for xmllint version]) + XMLLINT_VERSION="`${XMLLINT} --version 2>/dev/null`" + dnl strip 'xmllint version ' from version string + XMLLINT_VERSION="${XMLLINT_VERSION##* }" + AC_MSG_RESULT(${XMLLINT_VERSION} found) + fi + + AC_PATH_PROGS([SOURCE_HIGHLIGHT], [source-highlight]) + fi ]) diff --git a/missing b/missing index 86a8fc3..db98974 100755 --- a/missing +++ b/missing @@ -1,11 +1,10 @@ #! /bin/sh -# Common stub for a few missing GNU programs while installing. +# Common wrapper for a few potentially missing GNU programs. -scriptversion=2012-01-06.13; # UTC +scriptversion=2013-10-28.13; # UTC -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. # 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 @@ -26,68 +25,40 @@ scriptversion=2012-01-06.13; # UTC # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" + echo 1>&2 "Try '$0 --help' for more information" exit 1 fi -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - yacc create \`y.tab.[ch]', if possible, from existing .[ch] + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man -Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and -\`g' are ignored when checking the name. +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. Send bug reports to ." exit $? @@ -99,228 +70,141 @@ Send bug reports to ." ;; -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` +# Run the given program, remember its exit status. +"$@"; st=$? -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) diff --git a/scripts/Aix/nut-aix.spec.in b/scripts/Aix/nut-aix.spec.in new file mode 100644 index 0000000..37e4934 --- /dev/null +++ b/scripts/Aix/nut-aix.spec.in @@ -0,0 +1,330 @@ +%define nut_id @RUN_AS_USER@ +%define nut_group @RUN_AS_GROUP@ + +%define _prefix /usr/local/ups +%define _docdir %{_datadir}/doc + +%define confdir %{_prefix}/etc +%define rcdir /etc/rc.d +%define initdir %{rcdir}/init.d +%define cgidir /var/www/nut-cgi-bin +%define piddir /var/run/nut + +Summary: Network UPS Tools +Name: nut +Version: @PACKAGE_VERSION@ +Release: 1 +Group: Applications/System +License: GPLv2+ +Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +Url: http://www.networkupstools.org/ +Source: http://www.networkupstools.org/source/@TREE_VERSION@/%{name}-%{version}.tar.gz +Source1: nut.init +#Source2: ups.sysconfig +#Source3: nut-client.tmpfiles + + +# FIXME: adjust according to what is available through RPM on Aix +BuildRequires: libtool +BuildRequires: net-snmp-devel +BuildRequires: openssl-devel +BuildRequires: pkgconfig + +# AIX BUILDERS, PLEASE NOTE: +# If building with xlc version 3.6.X rather than gcc, you must ensure +# you have the following PTF's installed on your system, or +# you will see a runtime error that says: +# "Expected but saw " +# PTFS needed: U462006 U462007 U462023 U462024 U462025 U462026 U462027 +# Refer to http://service.software.ibm.com/support/rs6000, or +# set CC=gcc to force use of the GCC compiler. +# +# %define stdlib lib +# %define liblink ../.. +# %define DEFCC xlc + +%description +Network UPS Tools (NUT) is a client/server monitoring system that allows +computers to share uninterruptible power supply (UPS) and power distribution +unit (PDU) hardware. Clients access the hardware through the server, and are +notified whenever the power status changes. + +%package client +Group: Applications/System +Summary: Network UPS Tools client monitoring utilities +#Requires(post): chkconfig +#Requires(preun): chkconfig +#Requires(pre): shadow-utils + +%description client +This package includes the client utilities that are required to monitor a +ups that the client host has access to, but where the UPS is physically +attached to a different computer on the network. + +%package devel +Group: Development/Libraries +Summary: Development files for NUT Client +Requires: %{name}-client = %{version}-%{release} webserver openssl-devel + +%description devel +This package contains the development header files and libraries +necessary to develop NUT client applications. + +%prep +%setup -q + +%build +/usr/bin/rm configure.in + +%configure \ + --with-all \ + --without-powerman \ + --without-avahi \ + --without-usb \ + --without-ipmi \ + --without-cgi \ + --datadir=%{_datadir}/%{name} \ + --with-user=%{nut_id} \ + --with-group=%{nut_group} \ + --with-statepath=%{piddir} \ + --with-pidpath=%{piddir} \ + --with-altpidpath=%{piddir} \ + --sysconfdir=%{confdir} \ + --with-cgipath=%{cgidir} \ + --with-drvpath=%{_sbindir} \ + --with-pkgconfig-dir=%{_libdir}/pkgconfig \ + --disable-static \ + --libdir=%{_libdir} \ + --program-transform-name=s,^%{_target_platform}-,, \ + LDFLAGS="$LDFLAGS -Wl,-brtl" \ +# --with-libltdl-includes=/opt/freeware/share/libtool/libltdl/libltdl/ \ +# --with-libltdl-libs=/opt/freeware/lib \ +# --with-doc \ asciidoc >= 8.6.3 is required + +# FIXME: remove rpath? +#sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool +#sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool + +make %{?_smp_mflags} + +%install +/usr/bin/rm -rf %{buildroot} + +/usr/bin/mkdir -p %{buildroot}%{_sbindir} \ + %{buildroot}%{piddir} \ + %{buildroot}%{_libdir}/ups \ + %{buildroot}%{initdir} \ + %{buildroot}%{_libexecdir} + +make install DESTDIR=%{buildroot} + +install -m 755 %{SOURCE1} %{buildroot}%{initdir}/ups + +/usr/bin/rm -f %{buildroot}%{_libdir}/*.la + +# Remove ".sample" suffix from the config filenames +#pushd conf; +#make install DESTDIR=%{buildroot} +#for file in %{buildroot}%{confdir}/*.sample +#do +# mv $file %{buildroot}%{confdir}/`basename $file .sample` +#done +#popd + +%pre +/usr/bin/test -L %{_libdir}/ups || \ +/usr/bin/mkdir -p %{_libdir}/ups +/usr/bin/grep -qc %{nut_group} /etc/group || \ +/usr/bin/mkgroup %{nut_group} +/usr/bin/grep -qc %{nut_id} /etc/passwd || \ +/usr/sbin/useradd -c "Network UPS Tools" \ + -g %{nut_group} -d %{_libdir}/ups %{nut_id} +/usr/bin/test -L %{piddir} || \ +/usr/bin/mkdir -p %{piddir} +/usr/bin/chmod 750 %{piddir} +/usr/bin/chown %{nut_id}:%{nut_group} %{piddir} + +%post +/usr/bin/test -L %{rcdir}/rc2.d/Sups || \ +/usr/bin/ln -s %{initdir}/ups %{rcdir}/rc2.d/Sups +/usr/bin/test -L %{rcdir}/rc2.d/Kups || \ +/usr/bin/ln -s %{initdir}/ups %{rcdir}/rc2.d/Kups +exit 0 + +%preun +%{initdir}/ups stop +if [ "$1" = "0" ]; then + /usr/bin/rm -f %{rcdir}/rc2.d/[SK]ups +fi +exit 0 + +%postun +if [ "$1" = "0" ]; then + /usr/bin/grep -qc %{nut_id} /etc/passwd && \ + /usr/sbin/userdel %{nut_id} + /usr/bin/grep -qc %{nut_group}: /etc/group && \ + /usr/sbin/rmgroup %{nut_group} + /usr/bin/test -L %{piddir} && \ + /usr/bin/rm -rf %{piddir} + /usr/bin/test -L %{_libdir}/ups && \ + /usr/bin/rm -rf %{_libdir}/ups +fi +exit 0 + +%pre client +/usr/bin/grep -qc %{nut_group}: /etc/group || \ +/usr/bin/mkgroup %{nut_group} +/usr/bin/grep -qc %{nut_id} /etc/passwd || \ +/usr/sbin/useradd -c "Network UPS Tools" \ + -g %{nut_group} -d %{_libdir}/ups %{nut_id} +/usr/bin/test -L %{piddir} || \ +/usr/bin/mkdir -p %{piddir} +/usr/bin/chmod 750 %{piddir} +/usr/bin/chown %{nut_id}:%{nut_group} %{piddir} + +%post client +/usr/bin/test -L %{rcdir}/rc2.d/Sups || \ +/usr/bin/ln -s %{initdir}/ups %{rcdir}/rc2.d/Sups +/usr/bin/test -L %{rcdir}/rc2.d/Kups || \ +/usr/bin/ln -s %{initdir}/ups %{rcdir}/rc2.d/Kups +#%{initdir}/ups start +exit 0 + +%preun client +%{initdir}/ups stop +remove="no" +if /usr/bin/rpm -q nut >/dev/null 2>&1; then + remove="no" +elif [ "$1" = "0" ]; then + remove="yes" +fi +if [ "$remove" = "yes" ]; then + /usr/bin/rm -f %{rcdir}/rc2.d/[SK]ups + /usr/bin/test -L %{piddir} && \ + /usr/bin/rm -rf %{piddir} +fi +exit 0 + +%postun client +remove="no" +if /usr/bin/rpm -q nut >/dev/null 2>&1; then + remove="no" +elif [ "$1" = "0" ]; then + remove="yes" +fi +if [ "$remove" = "yes" ]; then + /usr/bin/grep -qc %{nut_id} /etc/passwd && \ + /usr/sbin/userdel %{nut_id} + /usr/bin/grep -qc %{nut_group}: /etc/group && \ + /usr/sbin/rmgroup %{nut_group} +#else +# %{initdir}/ups start +fi +exit 0 + +%clean +/usr/bin/rm -rf %{buildroot} + +%files +%defattr(-,root,root,-) +%attr(755,root,root) %{initdir}/ups +%doc COPYING ChangeLog AUTHORS MAINTAINERS README docs UPGRADING INSTALL NEWS +%config(noreplace) %attr(640,root,%nut_group) %{confdir}/nut.conf.sample +%config(noreplace) %attr(640,root,%nut_group) %{confdir}/ups.conf.sample +%config(noreplace) %attr(640,root,%nut_group) %{confdir}/upsd.conf.sample +%config(noreplace) %attr(640,root,%nut_group) %{confdir}/upsd.users.sample +%dir %attr(750,%nut_id,%nut_group) %{_libdir}/ups +#%ghost %{piddir} +%{_sbindir}/* +%{_bindir}/upslog +%{_bindir}/nutconf +%{_libdir}/libnutscan.so* +%{_libdir}/libupsclient.so* +%{_datadir}/%{name}/cmdvartab +%{_datadir}/%{name}/driver.list +%{_mandir}/man5/nut.conf.5 +%{_mandir}/man5/ups.conf.5 +%{_mandir}/man5/upsd.conf.5 +%{_mandir}/man5/upsd.users.5 +%{_mandir}/man8/apcsmart.8 +%{_mandir}/man8/bcmxcp.8 +#%{_mandir}/man8/bcmxcp_usb.8 +%{_mandir}/man8/belkin.8 +%{_mandir}/man8/bestfcom.8 +%{_mandir}/man8/belkinunv.8 +%{_mandir}/man8/bestfortress.8 +%{_mandir}/man8/bestups.8 +%{_mandir}/man8/bestuferrups.8 +%{_mandir}/man8/blazer.8 +%{_mandir}/man8/clone.8 +%{_mandir}/man8/dummy-ups.8 +%{_mandir}/man8/everups.8 +%{_mandir}/man8/etapro.8 +%{_mandir}/man8/gamatronic.8 +%{_mandir}/man8/genericups.8 +%{_mandir}/man8/isbmex.8 +%{_mandir}/man8/ivtscd.8 +%{_mandir}/man8/liebert.8 +%{_mandir}/man8/liebert-esp2.8 +%{_mandir}/man8/masterguard.8 +%{_mandir}/man8/metasys.8 +%{_mandir}/man8/microdowell.8 +%{_mandir}/man8/mge-utalk.8 +%{_mandir}/man8/mge-shut.8 +%{_mandir}/man8/nutupsdrv.8 +%{_mandir}/man8/oneac.8 +%{_mandir}/man8/optiups.8 +%{_mandir}/man8/powercom.8 +#%{_mandir}/man8/powerman-pdu.8 +%{_mandir}/man8/powerpanel.8 +%{_mandir}/man8/rhino.8 +#%{_mandir}/man8/richcomm_usb.8 +%{_mandir}/man8/safenet.8 +%{_mandir}/man8/snmp-ups.8 +%{_mandir}/man8/solis.8 +%{_mandir}/man8/tripplite.8 +#%{_mandir}/man8/tripplite_usb.8 +%{_mandir}/man8/tripplitesu.8 +%{_mandir}/man8/victronups.8 +%{_mandir}/man8/upscode2.8 +%{_mandir}/man8/upsd.8 +%{_mandir}/man8/upsdrvctl.8 + +%files client +%doc COPYING +%defattr(-,root,root) +%attr(755,root,root) %{initdir}/ups +%dir %{confdir} +%config(noreplace) %attr(640,root,%nut_group) %{confdir}/upsmon.conf.sample +%config(noreplace) %attr(640,root,%nut_group) %{confdir}/upssched.conf.sample +%dir %attr(750,%nut_id,%nut_group) %{_libdir}/ups +#%ghost %{piddir} +%{_bindir}/upsc +%{_bindir}/upscmd +%{_bindir}/upsrw +%{_sbindir}/upsmon +%{_sbindir}/upssched +%{_bindir}/upssched-cmd +%{_libdir}/libupsclient.so* +%{_mandir}/man5/upsmon.conf.5 +%{_mandir}/man5/upssched.conf.5 +%{_mandir}/man8/upsc.8 +%{_mandir}/man8/upscmd.8 +%{_mandir}/man8/upsrw.8 +%{_mandir}/man8/upslog.8 +%{_mandir}/man8/upsmon.8 +%{_mandir}/man8/upssched.8 + +%files devel +%defattr(-,root,root,-) +%{_includedir}/* +%{_mandir}/man3/upscli* +%{_libdir}/libupsclient.so* +%{_libdir}/pkgconfig/libupsclient.pc + +%changelog +* Tue Jul 12 2014 Arnaud Quette - 2.7.2-1.master +- Minor adjustments + +* Tue Jul 12 2011 Arnaud Quette - 2.6.5-1.trunk +- derive from RHEL 2.6.1-2, and adapt for Aix 6.1 diff --git a/scripts/Makefile.in b/scripts/Makefile.in index c260153..fc45fe7 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,23 +14,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -52,7 +79,7 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = scripts -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -81,15 +108,28 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -97,9 +137,29 @@ am__can_run_installinfo = \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) @@ -132,6 +192,7 @@ am__relativize = \ A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -238,12 +299,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -288,6 +352,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -378,22 +443,25 @@ clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -408,57 +476,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -474,12 +497,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -491,15 +509,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -508,6 +522,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -668,22 +697,20 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/scripts/Solaris/Makefile.in b/scripts/Solaris/Makefile.in index e968d1f..c49592e 100644 --- a/scripts/Solaris/Makefile.in +++ b/scripts/Solaris/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,23 +14,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -52,9 +79,9 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = scripts/Solaris -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/nut.in $(srcdir)/pkginfo.in $(srcdir)/postinstall.in \ - $(srcdir)/preremove.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/pkginfo.in $(srcdir)/postinstall.in \ + $(srcdir)/preremove.in $(srcdir)/nut.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -83,6 +110,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = pkginfo postinstall preremove nut CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -90,10 +129,12 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -200,12 +241,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -250,6 +294,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -319,11 +364,11 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -459,15 +504,16 @@ uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am package: makelocal.sh pkginfo diff --git a/scripts/augeas/Makefile.in b/scripts/augeas/Makefile.in index 2c1d35c..e3271d4 100644 --- a/scripts/augeas/Makefile.in +++ b/scripts/augeas/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,23 +14,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -52,12 +79,12 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = scripts/augeas -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/nuthostsconf.aug.in $(srcdir)/nutnutconf.aug.in \ - $(srcdir)/nutupsconf.aug.in $(srcdir)/nutupsdconf.aug.in \ - $(srcdir)/nutupsdusers.aug.in $(srcdir)/nutupsmonconf.aug.in \ - $(srcdir)/nutupsschedconf.aug.in \ - $(srcdir)/nutupssetconf.aug.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/nutnutconf.aug.in $(srcdir)/nutupsconf.aug.in \ + $(srcdir)/nutupsdconf.aug.in $(srcdir)/nutupsdusers.aug.in \ + $(srcdir)/nutupsmonconf.aug.in \ + $(srcdir)/nutupsschedconf.aug.in $(srcdir)/nuthostsconf.aug.in \ + $(srcdir)/nutupssetconf.aug.in README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -88,6 +115,18 @@ CONFIG_CLEAN_FILES = nutnutconf.aug nutupsconf.aug nutupsdconf.aug \ nutupsdusers.aug nutupsmonconf.aug nutupsschedconf.aug \ nuthostsconf.aug nutupssetconf.aug CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -95,10 +134,12 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -205,12 +246,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -255,6 +299,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -334,11 +379,11 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -477,16 +522,16 @@ uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - dist-hook distclean distclean-generic distclean-libtool \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ + cscopelist-am ctags-am dist-hook distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am + tags-am uninstall uninstall-am # only call the script to generate Augeas ups.conf lens upon "make dist", diff --git a/scripts/augeas/nutupsconf.aug.in b/scripts/augeas/nutupsconf.aug.in index 1182150..70d5f67 100644 --- a/scripts/augeas/nutupsconf.aug.in +++ b/scripts/augeas/nutupsconf.aug.in @@ -60,6 +60,8 @@ let ups_fields = "driver" | "awd" | "batteryPercentage" | "battery_alarm" + | "battery_max" + | "battery_min" | "battery_number" | "battery_open_status_check" | "battext" @@ -86,11 +88,16 @@ let ups_fields = "driver" | "frequency" | "fruid" | "full_update" + | "hb" | "houroff" | "houron" | "idleload" + | "ignoresab" | "input_timeout" + | "interruptonly" + | "interruptsize" | "langid_fix" + | "lb" | "limited_runtime_on_battery" | "linevoltage" | "load.off" @@ -127,6 +134,7 @@ let ups_fields = "driver" | "output_pace" | "output_phase_angle" | "password" + | "pins_shutdown_mode" | "pollfreq" | "pollonly" | "powerup" @@ -166,6 +174,7 @@ let ups_fields = "driver" | "ups.delay.shutdown" | "ups.delay.start" | "upstype" + | "usb_set_altinterface" | "usd" | "use_crlf" | "use_pre_lf" diff --git a/scripts/devd/Makefile.in b/scripts/devd/Makefile.in index 2b564ce..cad7c1f 100644 --- a/scripts/devd/Makefile.in +++ b/scripts/devd/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -16,23 +15,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -54,8 +81,8 @@ host_triplet = @host@ target_triplet = @target@ @WITH_DEVD_TRUE@@WITH_USB_TRUE@am__append_1 = nut-usb.conf subdir = scripts/devd -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/nut-usb.conf.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/nut-usb.conf.in README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -84,6 +111,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = nut-usb.conf CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -120,10 +159,12 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(devdconfdir)" DATA = $(devdconf_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -230,12 +271,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -280,6 +324,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -367,11 +412,11 @@ uninstall-devdconfDATA: @list='$(devdconf_DATA)'; test -n "$(devdconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(devdconfdir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -511,16 +556,17 @@ uninstall-am: uninstall-devdconfDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-devdconfDATA install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-devdconfDATA + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-devdconfDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-devdconfDATA # we should never remove this one, apart from a distclean-check #MAINTAINERCLEANFILES = nut-usbups.rules.in diff --git a/scripts/devd/nut-usb.conf.in b/scripts/devd/nut-usb.conf.in index 05b6ffa..09418de 100644 --- a/scripts/devd/nut-usb.conf.in +++ b/scripts/devd/nut-usb.conf.in @@ -8,7 +8,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0001"; match "product" "0x0000"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Hewlett Packard @@ -19,7 +19,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x0001"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # T500 - bcmxcp_usb notify 100 { @@ -28,7 +28,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1f01"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # T750 - bcmxcp_usb notify 100 { @@ -37,7 +37,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1f02"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # HP T750 INTL - usbhid-ups notify 100 { @@ -46,7 +46,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1f06"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # HP T1000 INTL - usbhid-ups notify 100 { @@ -55,7 +55,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1f08"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # HP T1500 INTL - usbhid-ups notify 100 { @@ -64,7 +64,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1f09"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # HP R/T 2200 INTL (like SMART2200RMXL2U) - usbhid-ups notify 100 { @@ -73,7 +73,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1f0a"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # HP R1500 G2 and G3 INTL - usbhid-ups notify 100 { @@ -82,7 +82,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe0"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # HP T750 G2 - usbhid-ups notify 100 { @@ -91,7 +91,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe1"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -100,7 +100,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe2"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # HP T1500 G3 - usbhid-ups notify 100 { @@ -109,7 +109,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe3"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # R/T3000 - usbhid-ups notify 100 { @@ -118,7 +118,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe5"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # R/T3000 - usbhid-ups notify 100 { @@ -127,7 +127,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe6"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # various models - usbhid-ups notify 100 { @@ -136,7 +136,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe7"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # various models - usbhid-ups notify 100 { @@ -145,7 +145,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x03f0"; match "product" "0x1fe8"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Eaton @@ -156,7 +156,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0463"; match "product" "0x0001"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # various models - usbhid-ups notify 100 { @@ -165,7 +165,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0463"; match "product" "0xffff"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Dell @@ -176,7 +176,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x047c"; match "product" "0xffff"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Riello (Cypress Semiconductor Corp.) @@ -187,7 +187,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x04b4"; match "product" "0x5500"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Minibox @@ -198,7 +198,16 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x04d8"; match "product" "0xd004"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; +}; +# openUPS Intelligent UPS (minimum required firmware 1.4) - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x04d8"; + match "product" "0xd005"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Belkin @@ -209,7 +218,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0375"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C550-AVR - usbhid-ups notify 100 { @@ -218,7 +227,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0551"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C1250-TW-RK - usbhid-ups notify 100 { @@ -227,7 +236,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0750"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C1500-TW-RK - usbhid-ups notify 100 { @@ -236,7 +245,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0751"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C900-UNV - usbhid-ups notify 100 { @@ -245,7 +254,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0900"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C100-UNV - usbhid-ups notify 100 { @@ -254,7 +263,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0910"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C120-UNV - usbhid-ups notify 100 { @@ -263,7 +272,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0912"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C800-UNV - usbhid-ups notify 100 { @@ -272,7 +281,16 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x0980"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; +}; +# Regulator PRO-USB - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x050d"; + match "product" "0x0f51"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # F6C1100-UNV, F6C1200-UNV - usbhid-ups notify 100 { @@ -281,10 +299,19 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x050d"; match "product" "0x1100"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # APC +# APC AP9584 Serial->USB kit - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x051d"; + match "product" "0x0000"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; +}; # various models - usbhid-ups notify 100 { match "system" "USB"; @@ -292,7 +319,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x051d"; match "product" "0x0002"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # various 5G models - usbhid-ups notify 100 { @@ -301,7 +328,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x051d"; match "product" "0x0003"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Powerware @@ -312,7 +339,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0592"; match "product" "0x0002"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # PW 9140 - usbhid-ups notify 100 { @@ -321,7 +348,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0592"; match "product" "0x0004"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Agiler UPS - blazer_usb notify 100 { @@ -330,7 +357,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x05b8"; match "product" "0x0000"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Belkin F6C1200-UNV - blazer_usb notify 100 { @@ -339,18 +366,18 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0665"; match "product" "0x5161"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Phoenixtec Power Co., Ltd -# Online Yunto YQ450 - blazer_usb +# various models - bcmxcp_usb notify 100 { match "system" "USB"; match "subsystem" "DEVICE"; match "type" "ATTACH"; match "vendor" "0x06da"; match "product" "0x0002"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Mustek Powermust - blazer_usb notify 100 { @@ -359,7 +386,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x06da"; match "product" "0x0003"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Phoenixtec Innova 3/1 T - blazer_usb notify 100 { @@ -368,7 +395,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x06da"; match "product" "0x0004"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Phoenixtec Innova RT - blazer_usb notify 100 { @@ -377,7 +404,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x06da"; match "product" "0x0005"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Phoenixtec Innova T - blazer_usb notify 100 { @@ -386,7 +413,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x06da"; match "product" "0x0201"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Online Zinto A - blazer_usb notify 100 { @@ -395,7 +422,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x06da"; match "product" "0x0601"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # various models - usbhid-ups notify 100 { @@ -404,7 +431,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x06da"; match "product" "0xffff"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # iDowell @@ -415,27 +442,27 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x075d"; match "product" "0x0300"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Cyber Power Systems -# 900AVR/BC900D, CP1200AVR/BC1200D - usbhid-ups +# 900AVR/BC900D - usbhid-ups notify 100 { match "system" "USB"; match "subsystem" "DEVICE"; match "type" "ATTACH"; match "vendor" "0x0764"; match "product" "0x0005"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; -# Dynex DX-800U? - usbhid-ups +# Dynex DX-800U?, CP1200AVR/BC1200D, CP825AVR-G, CP1000AVRLCD, CP1000PFCLCD, CP1500C, CP550HG, etc. - usbhid-ups notify 100 { match "system" "USB"; match "subsystem" "DEVICE"; match "type" "ATTACH"; match "vendor" "0x0764"; match "product" "0x0501"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # OR2200LCDRM2U, OR700LCDRM1U, PR6000LCDRTXL5U - usbhid-ups notify 100 { @@ -444,7 +471,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0764"; match "product" "0x0601"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Sweex 1000VA - richcomm_usb notify 100 { @@ -453,7 +480,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0925"; match "product" "0x1234"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # TrippLite @@ -464,7 +491,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x0001"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite AVR550U - usbhid-ups notify 100 { @@ -473,7 +500,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x1003"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite AVR750U - usbhid-ups notify 100 { @@ -482,7 +509,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x1007"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite ECO550UPS - usbhid-ups notify 100 { @@ -491,7 +518,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x1008"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite ECO550UPS - usbhid-ups notify 100 { @@ -500,7 +527,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x1009"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite ECO550UPS - usbhid-ups notify 100 { @@ -509,7 +536,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x1010"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite OMNI1000LCD - usbhid-ups notify 100 { @@ -518,7 +545,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2005"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite OMNI900LCD - usbhid-ups notify 100 { @@ -527,7 +554,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2007"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -536,7 +563,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2008"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite Smart1000LCD - usbhid-ups notify 100 { @@ -545,7 +572,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2009"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -554,7 +581,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2010"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -563,7 +590,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2011"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -572,7 +599,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2012"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -581,7 +608,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2013"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -590,7 +617,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x2014"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -599,7 +626,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3008"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -608,7 +635,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3009"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -617,7 +644,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3010"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -626,7 +653,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3011"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite smart2200RMXL2U - usbhid-ups notify 100 { @@ -635,7 +662,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3012"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -644,7 +671,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3013"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -653,7 +680,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3014"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -662,7 +689,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3015"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite Smart1500LCD (newer unit) - usbhid-ups notify 100 { @@ -671,7 +698,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x3016"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite SmartOnline SU1500RTXL2UA (older unit?) - usbhid-ups notify 100 { @@ -680,7 +707,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4001"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite SmartOnline SU6000RT4U? - usbhid-ups notify 100 { @@ -689,7 +716,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4002"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite SmartOnline SU1500RTXL2ua - usbhid-ups notify 100 { @@ -698,7 +725,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4003"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. TrippLite SmartOnline SU1000XLA - usbhid-ups notify 100 { @@ -707,7 +734,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4004"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -716,7 +743,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4005"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -725,7 +752,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4006"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -734,7 +761,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4007"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # e.g. ? - usbhid-ups notify 100 { @@ -743,18 +770,27 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x09ae"; match "product" "0x4008"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # PowerCOM # PowerCOM Vanguard and BNT-xxxAP - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x0d9f"; + match "product" "0x0001"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; +}; +# PowerCOM Vanguard and BNT-xxxAP - usbhid-ups notify 100 { match "system" "USB"; match "subsystem" "DEVICE"; match "type" "ATTACH"; match "vendor" "0x0d9f"; match "product" "0x0004"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # PowerCOM IMP - IMPERIAL Series - usbhid-ups notify 100 { @@ -763,7 +799,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0d9f"; match "product" "0x00a2"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # PowerCOM SKP - Smart KING Pro (all Smart series) - usbhid-ups notify 100 { @@ -772,7 +808,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0d9f"; match "product" "0x00a3"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # PowerCOM WOW - usbhid-ups notify 100 { @@ -781,7 +817,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0d9f"; match "product" "0x00a4"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # PowerCOM VGD - Vanguard - usbhid-ups notify 100 { @@ -790,7 +826,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0d9f"; match "product" "0x00a5"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # PowerCOM BNT - Black Knight Pro - usbhid-ups notify 100 { @@ -799,7 +835,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0d9f"; match "product" "0x00a6"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Unitek Alpha 1200Sx - blazer_usb notify 100 { @@ -808,7 +844,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x0f03"; match "product" "0x0001"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Liebert @@ -819,7 +855,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x10af"; match "product" "0x0001"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Liebert PowerSure PSI 1440 - usbhid-ups notify 100 { @@ -828,7 +864,16 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x10af"; match "product" "0x0004"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; +}; +# Liebert GXT3 - usbhid-ups +notify 100 { + match "system" "USB"; + match "subsystem" "DEVICE"; + match "type" "ATTACH"; + match "vendor" "0x10af"; + match "product" "0x0008"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # GE EP series - blazer_usb notify 100 { @@ -837,7 +882,7 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0x14f0"; match "product" "0x00c9"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; # Ablerex 625L USB - blazer_usb notify 100 { @@ -846,5 +891,5 @@ notify 100 { match "type" "ATTACH"; match "vendor" "0xffff"; match "product" "0x0000"; - action "chgrp @RUN_AS_GROUP@ /dev/$device-name*; chmod g+rw /dev/$device-name*"; + action "chgrp @RUN_AS_GROUP@ /dev/$cdev; chmod g+rw /dev/$cdev"; }; diff --git a/scripts/hotplug/Makefile.in b/scripts/hotplug/Makefile.in index 4d6b47e..4e9b5e5 100644 --- a/scripts/hotplug/Makefile.in +++ b/scripts/hotplug/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,23 +16,51 @@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -54,9 +81,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = scripts/hotplug -DIST_COMMON = README $(am__dist_hotplugusb_DATA_DIST) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/libhidups.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/libhidups.in $(am__dist_hotplugusb_DATA_DIST) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -115,6 +141,18 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(hotplugusbdir)" \ "$(DESTDIR)$(hotplugusbdir)" SCRIPTS = $(hotplugusb_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -124,10 +162,12 @@ am__can_run_installinfo = \ esac am__dist_hotplugusb_DATA_DIST = libhid.usermap DATA = $(dist_hotplugusb_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -234,12 +274,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -284,6 +327,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -407,11 +451,11 @@ uninstall-dist_hotplugusbDATA: @list='$(dist_hotplugusb_DATA)'; test -n "$(hotplugusbdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(hotplugusbdir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -552,16 +596,17 @@ uninstall-am: uninstall-dist_hotplugusbDATA \ .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dist_hotplugusbDATA \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-hotplugusbSCRIPTS install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_hotplugusbDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-hotplugusbSCRIPTS \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am \ uninstall-dist_hotplugusbDATA uninstall-hotplugusbSCRIPTS # we should never remove this one, apart from a distclean-check diff --git a/scripts/hotplug/libhid.usermap b/scripts/hotplug/libhid.usermap index 08f25c5..d1be810 100644 --- a/scripts/hotplug/libhid.usermap +++ b/scripts/hotplug/libhid.usermap @@ -56,6 +56,8 @@ libhidups 0x0003 0x04b4 0x5500 0x0000 0x0000 0x00 # Minibox # openUPS Intelligent UPS (minimum required firmware 1.4) libhidups 0x0003 0x04d8 0xd004 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 +# openUPS Intelligent UPS (minimum required firmware 1.4) +libhidups 0x0003 0x04d8 0xd005 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Belkin # F6H375-USB @@ -74,10 +76,14 @@ libhidups 0x0003 0x050d 0x0910 0x0000 0x0000 0x00 libhidups 0x0003 0x050d 0x0912 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # F6C800-UNV libhidups 0x0003 0x050d 0x0980 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 +# Regulator PRO-USB +libhidups 0x0003 0x050d 0x0f51 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # F6C1100-UNV, F6C1200-UNV libhidups 0x0003 0x050d 0x1100 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # APC +# APC AP9584 Serial->USB kit +libhidups 0x0003 0x051d 0x0000 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # various models libhidups 0x0003 0x051d 0x0002 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # various 5G models @@ -94,7 +100,7 @@ libhidups 0x0003 0x05b8 0x0000 0x0000 0x0000 0x00 libhidups 0x0003 0x0665 0x5161 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Phoenixtec Power Co., Ltd -# Online Yunto YQ450 +# various models libhidups 0x0003 0x06da 0x0002 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Mustek Powermust libhidups 0x0003 0x06da 0x0003 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 @@ -114,9 +120,9 @@ libhidups 0x0003 0x06da 0xffff 0x0000 0x0000 0x00 libhidups 0x0003 0x075d 0x0300 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Cyber Power Systems -# 900AVR/BC900D, CP1200AVR/BC1200D +# 900AVR/BC900D libhidups 0x0003 0x0764 0x0005 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 -# Dynex DX-800U? +# Dynex DX-800U?, CP1200AVR/BC1200D, CP825AVR-G, CP1000AVRLCD, CP1000PFCLCD, CP1500C, CP550HG, etc. libhidups 0x0003 0x0764 0x0501 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # OR2200LCDRM2U, OR700LCDRM1U, PR6000LCDRTXL5U libhidups 0x0003 0x0764 0x0601 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 @@ -191,6 +197,8 @@ libhidups 0x0003 0x09ae 0x4008 0x0000 0x0000 0x00 # PowerCOM # PowerCOM Vanguard and BNT-xxxAP +libhidups 0x0003 0x0d9f 0x0001 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 +# PowerCOM Vanguard and BNT-xxxAP libhidups 0x0003 0x0d9f 0x0004 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # PowerCOM IMP - IMPERIAL Series libhidups 0x0003 0x0d9f 0x00a2 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 @@ -210,6 +218,8 @@ libhidups 0x0003 0x0f03 0x0001 0x0000 0x0000 0x00 libhidups 0x0003 0x10af 0x0001 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Liebert PowerSure PSI 1440 libhidups 0x0003 0x10af 0x0004 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 +# Liebert GXT3 +libhidups 0x0003 0x10af 0x0008 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # GE EP series libhidups 0x0003 0x14f0 0x00c9 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Ablerex 625L USB diff --git a/scripts/python/Makefile.am b/scripts/python/Makefile.am index 2d670e5..0326725 100644 --- a/scripts/python/Makefile.am +++ b/scripts/python/Makefile.am @@ -3,6 +3,7 @@ EXTRA_DIST = README \ app/gui-1.3.glade \ app/NUT-Monitor \ + app/nut-monitor.appdata.xml \ app/nut-monitor.desktop \ app/nut-monitor.png \ app/README \ diff --git a/scripts/python/Makefile.in b/scripts/python/Makefile.in index d04e8aa..79c48e5 100644 --- a/scripts/python/Makefile.in +++ b/scripts/python/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,23 +16,51 @@ # Network UPS Tools: data/html VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -54,7 +81,7 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = scripts/python -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -83,6 +110,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -90,10 +129,12 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -200,12 +241,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -250,6 +294,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -274,6 +319,7 @@ udevdir = @udevdir@ EXTRA_DIST = README \ app/gui-1.3.glade \ app/NUT-Monitor \ + app/nut-monitor.appdata.xml \ app/nut-monitor.desktop \ app/nut-monitor.png \ app/README \ @@ -326,11 +372,11 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -466,15 +512,16 @@ uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/scripts/python/app/NUT-Monitor b/scripts/python/app/NUT-Monitor index 91e9001..08dfaa4 100755 --- a/scripts/python/app/NUT-Monitor +++ b/scripts/python/app/NUT-Monitor @@ -23,12 +23,16 @@ # # 2010-10-06 David Goncalves - Version 1.3 # Added localisation support +# +# 2015-02-14 Michal Fincham - Version 1.3.1 +# Corrected unsafe permissions on ~/.nut-monitor (Debian #777706) import gtk, gtk.glade, gobject import sys import base64 import os, os.path +import stat import platform import time import threading @@ -44,21 +48,23 @@ gobject.threads_init() class interface : - __widgets = {} - __callbacks = {} - __favorites = {} - __favorites_file = None - __favorites_path = "" - __fav_menu_items = list() - __window_visible = True - __glade_file = None - __connected = False - __ups_handler = None - __ups_commands = None - __ups_vars = None - __ups_rw_vars = None - __gui_thread = None - __current_ups = None + DESIRED_FAVORITES_DIRECTORY_MODE = 0700 + + __widgets = {} + __callbacks = {} + __favorites = {} + __favorites_file = None + __favorites_path = "" + __fav_menu_items = list() + __window_visible = True + __glade_file = None + __connected = False + __ups_handler = None + __ups_commands = None + __ups_vars = None + __ups_rw_vars = None + __gui_thread = None + __current_ups = None def __init__( self ) : @@ -528,6 +534,9 @@ class interface : return try : + if ( not stat.S_IMODE( os.stat( self.__favorites_path ).st_mode ) == self.DESIRED_FAVORITES_DIRECTORY_MODE ) : # unsafe pre-1.2 directory found + os.chmod( self.__favorites_path, self.DESIRED_FAVORITES_DIRECTORY_MODE ) + conf = ConfigParser.ConfigParser() conf.read( self.__favorites_file ) for current in conf.sections() : @@ -573,7 +582,7 @@ class interface : # If path does not exists, try to create it if ( not os.path.exists( self.__favorites_file ) ) : try : - os.makedirs( self.__favorites_path, mode=0700 ) + os.makedirs( self.__favorites_path, mode=self.DESIRED_FAVORITES_DIRECTORY_MODE ) except : self.gui_status_message( _("Error while creating configuration folder (%s)") % sys.exc_info()[1] ) diff --git a/scripts/python/app/gui-1.3.glade b/scripts/python/app/gui-1.3.glade index 1d54fe6..eb42aba 100644 --- a/scripts/python/app/gui-1.3.glade +++ b/scripts/python/app/gui-1.3.glade @@ -1021,7 +1021,7 @@ want to delete from list... center-always normal NUT-Monitor - 1.3 + 1.3.1 Copyright (c) 2010 David Goncalves GUI to manage devices connected a NUT server. diff --git a/scripts/python/app/nut-monitor.appdata.xml b/scripts/python/app/nut-monitor.appdata.xml new file mode 100644 index 0000000..ba1d0b9 --- /dev/null +++ b/scripts/python/app/nut-monitor.appdata.xml @@ -0,0 +1,42 @@ + + + + nut-monitor.desktop + CC0-1.0 + GPL-3.0+ + NUT Monitor + GUI application to monitor UPS status + +

    + NUT Monitor is a GUI application to monitor UPS status, through NUT - + Network UPS Tools. + NUT is a client/server monitoring system that allows computers to + share uninterruptible power supply (UPS) and power distribution unit + (PDU) hardware. Clients access the hardware through the server, and + are notified whenever the power status changes. +

    +

    NUT Monitor provides the following features:

    +
      +
    • Automatically connects to local UPS if there is only one managed
    • +
    • Command line options to start hidden, load a favorite, ...
    • +
    • System tray (notification area) integration, including notifications
    • +
    • Favorites, to store different devices
    • +
    • Display all device variables
    • +
    • Modify writable variables on UPS and devices
    • +
    • Support English and French
    • +
    +

    + NUT Monitor requires that you have a running NUT system, that you can + connect to, either locally or remotely. + For more information on NUT: http://www.networkupstools.org/ +

    +
    + + http://www.lestat.st/_media/informatique/projets/nut-monitor/nut-monitor-1.png + http://www.lestat.st/_media/informatique/projets/nut-monitor/nut-monitor-2.png + http://www.lestat.st/_media/informatique/projets/nut-monitor/nut-monitor-3.png + + http://www.lestat.st/en/informatique/projets/nut-monitor + david@lestat.st + +
    diff --git a/scripts/python/module/PyNUT.py b/scripts/python/module/PyNUT.py index 98c9114..9a9399c 100644 --- a/scripts/python/module/PyNUT.py +++ b/scripts/python/module/PyNUT.py @@ -35,9 +35,16 @@ # 2012-02-07 René Martín Rodríguez - Version 1.2.2 # Added support for LIST CLIENTS command # +# 2014-06-03 george2 - Version 1.3.0 +# Added custom exception class, fixed minor bug, added Python 3 support. +# import telnetlib +class PyNUTError( Exception ) : + """ Base class for custom exceptions """ + + class PyNUTClient : """ Abstraction class to access NUT (Network UPS Tools) server """ @@ -49,8 +56,8 @@ class PyNUTClient : __timeout = None __srv_handler = None - __version = "1.2.2" - __release = "2012-02-07" + __version = "1.3.0" + __release = "2014-06-03" def __init__( self, host="127.0.0.1", port=3493, login=None, password=None, debug=False, timeout=5 ) : @@ -101,13 +108,13 @@ if something goes wrong. self.__srv_handler.write( "USERNAME %s\n" % self.__login ) result = self.__srv_handler.read_until( "\n", self.__timeout ) if result[:2] != "OK" : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) if self.__password != None : self.__srv_handler.write( "PASSWORD %s\n" % self.__password ) result = self.__srv_handler.read_until( "\n", self.__timeout ) if result[:2] != "OK" : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) def GetUPSList( self ) : """ Returns the list of available UPS from the NUT server @@ -120,7 +127,7 @@ The result is a dictionary containing 'key->val' pairs of 'UPSName' and 'UPS Des self.__srv_handler.write( "LIST UPS\n" ) result = self.__srv_handler.read_until( "\n" ) if result != "BEGIN LIST UPS\n" : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) result = self.__srv_handler.read_until( "END LIST UPS\n" ) ups_list = {} @@ -144,7 +151,7 @@ available vars. self.__srv_handler.write( "LIST VAR %s\n" % ups ) result = self.__srv_handler.read_until( "\n" ) if result != "BEGIN LIST VAR %s\n" % ups : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) ups_vars = {} result = self.__srv_handler.read_until( "END LIST VAR %s\n" % ups ) @@ -170,7 +177,7 @@ of the command as value self.__srv_handler.write( "LIST CMD %s\n" % ups ) result = self.__srv_handler.read_until( "\n" ) if result != "BEGIN LIST CMD %s\n" % ups : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) ups_cmds = {} result = self.__srv_handler.read_until( "END LIST CMD %s\n" % ups ) @@ -185,7 +192,7 @@ of the command as value self.__srv_handler.write( "GET CMDDESC %s %s\n" % ( ups, var ) ) temp = self.__srv_handler.read_until( "\n" ) if temp[:7] != "CMDDESC" : - raise + raise PyNUTError else : off = len( "CMDDESC %s %s " % ( ups, var ) ) desc = temp[off:-1].split('"')[1] @@ -207,7 +214,7 @@ The result is presented as a dictionary containing 'key->val' pairs self.__srv_handler.write( "LIST RW %s\n" % ups ) result = self.__srv_handler.read_until( "\n" ) if ( result != "BEGIN LIST RW %s\n" % ups ) : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) result = self.__srv_handler.read_until( "END LIST RW %s\n" % ups ) offset = len( "VAR %s" % ups ) @@ -237,7 +244,7 @@ rights to set it (maybe login/password). if ( result == "OK\n" ) : return( "OK" ) else : - raise Exception, result + raise PyNUTError( result ) def RunUPSCommand( self, ups="", command="" ) : """ Send a command to the specified UPS @@ -253,7 +260,7 @@ Returns OK on success or raises an error if ( result == "OK\n" ) : return( "OK" ) else : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) def FSD( self, ups="") : """ Send FSD command @@ -267,7 +274,7 @@ Returns OK on success or raises an error self.__srv_handler.write( "MASTER %s\n" % ups ) result = self.__srv_handler.read_until( "\n" ) if ( result != "OK MASTER-GRANTED\n" ) : - raise Exception, ( "Master level function are not available", "" ) + raise PyNUTError( ( "Master level function are not available", "" ) ) if self.__debug : print( "[DEBUG] FSD called..." ) @@ -276,7 +283,7 @@ Returns OK on success or raises an error if ( result == "OK FSD-SET\n" ) : return( "OK" ) else : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) def help(self) : """ Send HELP command @@ -307,7 +314,7 @@ The result is a dictionary containing 'key->val' pairs of 'UPSName' and a list o print( "[DEBUG] ListClients from server" ) if ups and (ups not in self.GetUPSList()): - raise Exception, "%s is not a valid UPS" % ups + raise PyNUTError( "%s is not a valid UPS" % ups ) if ups: self.__srv_handler.write( "LIST CLIENTS %s\n" % ups) @@ -315,7 +322,7 @@ The result is a dictionary containing 'key->val' pairs of 'UPSName' and a list o self.__srv_handler.write( "LIST CLIENTS\n" ) result = self.__srv_handler.read_until( "\n" ) if result != "BEGIN LIST CLIENTS\n" : - raise Exception, result.replace( "\n", "" ) + raise PyNUTError( result.replace( "\n", "" ) ) result = self.__srv_handler.read_until( "END LIST CLIENTS\n" ) ups_list = {} diff --git a/scripts/subdriver/gen-snmp-subdriver.sh b/scripts/subdriver/gen-snmp-subdriver.sh index b9aa44f..92d18d5 100755 --- a/scripts/subdriver/gen-snmp-subdriver.sh +++ b/scripts/subdriver/gen-snmp-subdriver.sh @@ -67,11 +67,14 @@ TMP_STRWALKFILE=`mktemp "$TMPDIR/$NAME-TMP-STRWALK.XXXXXX"` get_snmp_data() { # 1) get the sysOID (points the mfr specif MIB) - SYSOID=`snmpget -v1 -c $COMMUNITY $HOSTNAME .1.3.6.1.2.1.1.2.0 41` + SYSOID=`snmpget -v1 -c $COMMUNITY -Ov $HOSTNAME .1.3.6.1.2.1.1.2.0 | cut -d' ' -f2` + + echo "sysOID retrieved: ${SYSOID}" # 2) get the content of the mfr specif MIB + echo "Retrieving SNMP information. This may take some time" snmpwalk -On -v1 -c $COMMUNITY $HOSTNAME $SYSOID 2>/dev/null 1> $DFL_NUMWALKFILE - snmpwalk -Os -v1 -M $MIBS_DIRLIST -c $COMMUNITY $HOSTNAME $SYSOID 2>/dev/null 1> $DFL_STRWALKFILE + snmpwalk -Os -v1 -m ALL -M $MIBS_DIRLIST -c $COMMUNITY $HOSTNAME $SYSOID 2>/dev/null 1> $DFL_STRWALKFILE } # process command line options @@ -80,7 +83,7 @@ while [ $# -gt 0 ]; do DRIVER="$2" shift 2 elif [ $# -gt 1 -a "$1" = "-M" ]; then - MIBS_DIRLIST="$MIBS_DIRLIST:$2" + MIBS_DIRLIST="+$2" shift 2 elif [ "$1" = "-k" ]; then KEEP=yes @@ -340,8 +343,8 @@ Done. Do not forget to: * bump DRIVER_VERSION in snmp-ups.c (add "0.01") * copy "${HFILE}" and "${CFILE}" to "../../drivers" -* add #include "${HFILE}" to snmp-ups.c -* add &${LDRIVER} to snmp-ups.c:mib2nut[] list, +* add #include "${HFILE}" to drivers/snmp-ups.c +* add &${LDRIVER} to drivers/snmp-ups.c:mib2nut[] list, * add ${LDRIVER}-mib.c to snmp_ups_SOURCES in drivers/Makefile.am * add ${LDRIVER}-mib.h to dist_noinst_HEADERS in drivers/Makefile.am * "./autogen.sh && ./configure && make" from the top level directory diff --git a/scripts/systemd/Makefile.in b/scripts/systemd/Makefile.in index d90e262..252ff39 100644 --- a/scripts/systemd/Makefile.in +++ b/scripts/systemd/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,23 +16,51 @@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -57,10 +84,11 @@ target_triplet = @target@ @HAVE_SYSTEMD_FALSE@ nut-server.service.in nutshutdown.in subdir = scripts/systemd -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/nut-driver.service.in \ $(srcdir)/nut-monitor.service.in \ - $(srcdir)/nut-server.service.in $(srcdir)/nutshutdown.in + $(srcdir)/nut-server.service.in $(srcdir)/nutshutdown.in \ + README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -120,6 +148,18 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(systemdsystemshutdowndir)" \ "$(DESTDIR)$(systemdsystemunitdir)" SCRIPTS = $(systemdsystemshutdown_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -128,10 +168,12 @@ am__can_run_installinfo = \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(systemdsystemunit_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -238,12 +280,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -288,6 +333,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -419,11 +465,11 @@ uninstall-systemdsystemunitDATA: @list='$(systemdsystemunit_DATA)'; test -n "$(systemdsystemunitdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(systemdsystemunitdir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -564,17 +610,17 @@ uninstall-am: uninstall-systemdsystemshutdownSCRIPTS \ .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - install-systemdsystemshutdownSCRIPTS \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip install-systemdsystemshutdownSCRIPTS \ install-systemdsystemunitDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am \ + ps ps-am tags-am uninstall uninstall-am \ uninstall-systemdsystemshutdownSCRIPTS \ uninstall-systemdsystemunitDATA diff --git a/scripts/systemd/nut-server.service.in b/scripts/systemd/nut-server.service.in index edcaf10..dada977 100644 --- a/scripts/systemd/nut-server.service.in +++ b/scripts/systemd/nut-server.service.in @@ -1,7 +1,10 @@ [Unit] Description=Network UPS Tools - power devices information server After=local-fs.target network.target nut-driver.service -Requires=nut-driver.service +# We don't Require drivers to be successfully started! This would be +# a change of behavior compared to init SysV, and could prevent from +# accessing successfully started, at least to audit a system. +#Requires=nut-driver.service Before=nut-monitor.service [Service] diff --git a/scripts/udev/Makefile.am b/scripts/udev/Makefile.am index fcd6eeb..1973ccf 100644 --- a/scripts/udev/Makefile.am +++ b/scripts/udev/Makefile.am @@ -3,7 +3,7 @@ if WITH_UDEV udevrulesdir = $(udevdir)/rules.d udevrules_DATA = if WITH_USB - udevrules_DATA += 52-nut-usbups.rules + udevrules_DATA += 62-nut-usbups.rules endif if WITH_IPMI udevrules_DATA += 52-nut-ipmipsu.rules @@ -12,13 +12,13 @@ endif EXTRA_DIST = README -52-nut-usbups.rules: nut-usbups.rules - cp nut-usbups.rules 52-nut-usbups.rules +62-nut-usbups.rules: nut-usbups.rules + cp nut-usbups.rules $@ 52-nut-ipmipsu.rules: nut-ipmipsu.rules - cp nut-ipmipsu.rules 52-nut-ipmipsu.rules + cp nut-ipmipsu.rules $@ DISTCLEANFILES = nut-usbups.rules nut-ipmipsu.rules -CLEANFILES = 52-nut-usbups.rules 52-nut-ipmipsu.rules +CLEANFILES = 62-nut-usbups.rules 52-nut-ipmipsu.rules # we should never remove this one, apart from a distclean-check #MAINTAINERCLEANFILES = nut-usbups.rules.in diff --git a/scripts/udev/Makefile.in b/scripts/udev/Makefile.in index c222218..33dd60d 100644 --- a/scripts/udev/Makefile.in +++ b/scripts/udev/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -16,23 +15,51 @@ @SET_MAKE@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -52,11 +79,12 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -@WITH_UDEV_TRUE@@WITH_USB_TRUE@am__append_1 = 52-nut-usbups.rules +@WITH_UDEV_TRUE@@WITH_USB_TRUE@am__append_1 = 62-nut-usbups.rules @WITH_IPMI_TRUE@@WITH_UDEV_TRUE@am__append_2 = 52-nut-ipmipsu.rules subdir = scripts/udev -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/nut-ipmipsu.rules.in $(srcdir)/nut-usbups.rules.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/nut-ipmipsu.rules.in $(srcdir)/nut-usbups.rules.in \ + README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -85,6 +113,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = nut-ipmipsu.rules nut-usbups.rules CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -121,10 +161,12 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(udevrulesdir)" DATA = $(udevrules_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -231,12 +273,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -281,6 +326,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -306,7 +352,7 @@ udevdir = @udevdir@ @WITH_UDEV_TRUE@udevrules_DATA = $(am__append_1) $(am__append_2) EXTRA_DIST = README DISTCLEANFILES = nut-usbups.rules nut-ipmipsu.rules -CLEANFILES = 52-nut-usbups.rules 52-nut-ipmipsu.rules +CLEANFILES = 62-nut-usbups.rules 52-nut-ipmipsu.rules all: all-am .SUFFIXES: @@ -371,11 +417,11 @@ uninstall-udevrulesDATA: @list='$(udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(udevrulesdir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -516,23 +562,24 @@ uninstall-am: uninstall-udevrulesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - install-udevrulesDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-udevrulesDATA + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip install-udevrulesDATA installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-udevrulesDATA -52-nut-usbups.rules: nut-usbups.rules - cp nut-usbups.rules 52-nut-usbups.rules +62-nut-usbups.rules: nut-usbups.rules + cp nut-usbups.rules $@ 52-nut-ipmipsu.rules: nut-ipmipsu.rules - cp nut-ipmipsu.rules 52-nut-ipmipsu.rules + cp nut-ipmipsu.rules $@ # we should never remove this one, apart from a distclean-check #MAINTAINERCLEANFILES = nut-usbups.rules.in diff --git a/scripts/udev/README b/scripts/udev/README index a3b5567..ff6a1a0 100644 --- a/scripts/udev/README +++ b/scripts/udev/README @@ -1,6 +1,6 @@ Desc: Udev script for NUT USB and IPMI drivers File: scripts/udev/README -Date: 25 July 2011 +Date: 31 July 2014 Auth: Arnaud Quette This document introduces the Linux udev script for NUT USB @@ -32,7 +32,7 @@ Manual installation To install them manually, copy the rules file(s) to /etc/udev/rules.d (or /lib/udev/rules.d on newer systems) using the command(s): -$ cp -f nut-usbups.rules /etc/udev/rules.d/52-nut-usbups.rules +$ cp -f nut-usbups.rules /etc/udev/rules.d/62-nut-usbups.rules $ cp -f nut-ipmipsu.rules /etc/udev/rules.d/52-nut-ipmipsu.rules You will need to refresh the bus to avoid a reboot for these rules to be diff --git a/scripts/udev/nut-usbups.rules.in b/scripts/udev/nut-usbups.rules.in index d8961dd..1ac601d 100644 --- a/scripts/udev/nut-usbups.rules.in +++ b/scripts/udev/nut-usbups.rules.in @@ -58,6 +58,8 @@ ATTR{idVendor}=="04b4", ATTR{idProduct}=="5500", MODE="664", GROUP="@RUN_AS_GROU # Minibox # openUPS Intelligent UPS (minimum required firmware 1.4) - usbhid-ups ATTR{idVendor}=="04d8", ATTR{idProduct}=="d004", MODE="664", GROUP="@RUN_AS_GROUP@" +# openUPS Intelligent UPS (minimum required firmware 1.4) - usbhid-ups +ATTR{idVendor}=="04d8", ATTR{idProduct}=="d005", MODE="664", GROUP="@RUN_AS_GROUP@" # Belkin # F6H375-USB - usbhid-ups @@ -76,10 +78,14 @@ ATTR{idVendor}=="050d", ATTR{idProduct}=="0910", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="050d", ATTR{idProduct}=="0912", MODE="664", GROUP="@RUN_AS_GROUP@" # F6C800-UNV - usbhid-ups ATTR{idVendor}=="050d", ATTR{idProduct}=="0980", MODE="664", GROUP="@RUN_AS_GROUP@" +# Regulator PRO-USB - usbhid-ups +ATTR{idVendor}=="050d", ATTR{idProduct}=="0f51", MODE="664", GROUP="@RUN_AS_GROUP@" # F6C1100-UNV, F6C1200-UNV - usbhid-ups ATTR{idVendor}=="050d", ATTR{idProduct}=="1100", MODE="664", GROUP="@RUN_AS_GROUP@" # APC +# APC AP9584 Serial->USB kit - usbhid-ups +ATTR{idVendor}=="051d", ATTR{idProduct}=="0000", MODE="664", GROUP="@RUN_AS_GROUP@" # various models - usbhid-ups ATTR{idVendor}=="051d", ATTR{idProduct}=="0002", MODE="664", GROUP="@RUN_AS_GROUP@" # various 5G models - usbhid-ups @@ -96,7 +102,7 @@ ATTR{idVendor}=="05b8", ATTR{idProduct}=="0000", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", MODE="664", GROUP="@RUN_AS_GROUP@" # Phoenixtec Power Co., Ltd -# Online Yunto YQ450 - blazer_usb +# various models - bcmxcp_usb ATTR{idVendor}=="06da", ATTR{idProduct}=="0002", MODE="664", GROUP="@RUN_AS_GROUP@" # Mustek Powermust - blazer_usb ATTR{idVendor}=="06da", ATTR{idProduct}=="0003", MODE="664", GROUP="@RUN_AS_GROUP@" @@ -116,9 +122,9 @@ ATTR{idVendor}=="06da", ATTR{idProduct}=="ffff", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="075d", ATTR{idProduct}=="0300", MODE="664", GROUP="@RUN_AS_GROUP@" # Cyber Power Systems -# 900AVR/BC900D, CP1200AVR/BC1200D - usbhid-ups +# 900AVR/BC900D - usbhid-ups ATTR{idVendor}=="0764", ATTR{idProduct}=="0005", MODE="664", GROUP="@RUN_AS_GROUP@" -# Dynex DX-800U? - usbhid-ups +# Dynex DX-800U?, CP1200AVR/BC1200D, CP825AVR-G, CP1000AVRLCD, CP1000PFCLCD, CP1500C, CP550HG, etc. - usbhid-ups ATTR{idVendor}=="0764", ATTR{idProduct}=="0501", MODE="664", GROUP="@RUN_AS_GROUP@" # OR2200LCDRM2U, OR700LCDRM1U, PR6000LCDRTXL5U - usbhid-ups ATTR{idVendor}=="0764", ATTR{idProduct}=="0601", MODE="664", GROUP="@RUN_AS_GROUP@" @@ -193,6 +199,8 @@ ATTR{idVendor}=="09ae", ATTR{idProduct}=="4008", MODE="664", GROUP="@RUN_AS_GROU # PowerCOM # PowerCOM Vanguard and BNT-xxxAP - usbhid-ups +ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0001", MODE="664", GROUP="@RUN_AS_GROUP@" +# PowerCOM Vanguard and BNT-xxxAP - usbhid-ups ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0004", MODE="664", GROUP="@RUN_AS_GROUP@" # PowerCOM IMP - IMPERIAL Series - usbhid-ups ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a2", MODE="664", GROUP="@RUN_AS_GROUP@" @@ -212,6 +220,8 @@ ATTR{idVendor}=="0f03", ATTR{idProduct}=="0001", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="10af", ATTR{idProduct}=="0001", MODE="664", GROUP="@RUN_AS_GROUP@" # Liebert PowerSure PSI 1440 - usbhid-ups ATTR{idVendor}=="10af", ATTR{idProduct}=="0004", MODE="664", GROUP="@RUN_AS_GROUP@" +# Liebert GXT3 - usbhid-ups +ATTR{idVendor}=="10af", ATTR{idProduct}=="0008", MODE="664", GROUP="@RUN_AS_GROUP@" # GE EP series - blazer_usb ATTR{idVendor}=="14f0", ATTR{idProduct}=="00c9", MODE="664", GROUP="@RUN_AS_GROUP@" # Ablerex 625L USB - blazer_usb diff --git a/scripts/upower/95-upower-hid.rules b/scripts/upower/95-upower-hid.rules index 31ffec2..a407b53 100644 --- a/scripts/upower/95-upower-hid.rules +++ b/scripts/upower/95-upower-hid.rules @@ -1,7 +1,7 @@ ############################################################################################################## # Uninterruptible Power Supplies with USB HID interfaces # -# to keep up to date, monitor: http://svn.debian.org/wsvn/nut/trunk/scripts/upower/95-upower-hid.rules +# to keep up to date, monitor https://github.com/networkupstools/nut/commits/master/scripts/upower/95-upower-hid.rules # only support USB, else ignore SUBSYSTEM!="usb", GOTO="up_hid_end" @@ -50,6 +50,7 @@ ATTRS{idVendor}=="047c", ATTRS{idProduct}=="ffff", ENV{UPOWER_BATTERY_TYPE}="ups # Minibox ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="d004", ENV{UPOWER_BATTERY_TYPE}="ups" +ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="d005", ENV{UPOWER_BATTERY_TYPE}="ups" # Belkin ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0375", ENV{UPOWER_BATTERY_TYPE}="ups" @@ -60,9 +61,11 @@ ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0900", ENV{UPOWER_BATTERY_TYPE}="ups ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0910", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0912", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0980", ENV{UPOWER_BATTERY_TYPE}="ups" +ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0f51", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="050d", ATTRS{idProduct}=="1100", ENV{UPOWER_BATTERY_TYPE}="ups" # APC +ATTRS{idVendor}=="051d", ATTRS{idProduct}=="0000", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="051d", ATTRS{idProduct}=="0002", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="051d", ATTRS{idProduct}=="0003", ENV{UPOWER_BATTERY_TYPE}="ups" @@ -114,6 +117,7 @@ ATTRS{idVendor}=="09ae", ATTRS{idProduct}=="4007", ENV{UPOWER_BATTERY_TYPE}="ups ATTRS{idVendor}=="09ae", ATTRS{idProduct}=="4008", ENV{UPOWER_BATTERY_TYPE}="ups" # PowerCOM +ATTRS{idVendor}=="0d9f", ATTRS{idProduct}=="0001", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="0d9f", ATTRS{idProduct}=="0004", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="0d9f", ATTRS{idProduct}=="00a2", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="0d9f", ATTRS{idProduct}=="00a3", ENV{UPOWER_BATTERY_TYPE}="ups" @@ -124,5 +128,6 @@ ATTRS{idVendor}=="0d9f", ATTRS{idProduct}=="00a6", ENV{UPOWER_BATTERY_TYPE}="ups # Liebert ATTRS{idVendor}=="10af", ATTRS{idProduct}=="0001", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="10af", ATTRS{idProduct}=="0004", ENV{UPOWER_BATTERY_TYPE}="ups" +ATTRS{idVendor}=="10af", ATTRS{idProduct}=="0008", ENV{UPOWER_BATTERY_TYPE}="ups" LABEL="up_hid_end" diff --git a/server/Makefile.in b/server/Makefile.in index b6c8d7d..398db3f 100644 --- a/server/Makefile.in +++ b/server/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,23 +17,51 @@ # Network UPS Tools: server VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -61,7 +88,8 @@ target_triplet = @target@ sbin_PROGRAMS = upsd$(EXEEXT) EXTRA_PROGRAMS = sockdebug$(EXEEXT) subdir = server -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -101,6 +129,10 @@ am__DEPENDENCIES_1 = sockdebug_DEPENDENCIES = ../common/libcommon.la \ ../common/libparseconf.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = am_upsd_OBJECTS = upsd.$(OBJEXT) user.$(OBJEXT) conf.$(OBJEXT) \ netssl.$(OBJEXT) sstate.$(OBJEXT) desc.$(OBJEXT) \ netget.$(OBJEXT) netmisc.$(OBJEXT) netlist.$(OBJEXT) \ @@ -110,19 +142,40 @@ upsd_LDADD = $(LDADD) upsd_DEPENDENCIES = ../common/libcommon.la ../common/libparseconf.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_3) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(sockdebug_SOURCES) $(upsd_SOURCES) DIST_SOURCES = $(sockdebug_SOURCES) $(upsd_SOURCES) am__can_run_installinfo = \ @@ -130,12 +183,30 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -242,12 +313,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -292,6 +366,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -370,10 +445,12 @@ install-sbinPROGRAMS: $(sbin_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -394,7 +471,8 @@ uninstall-sbinPROGRAMS: @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files @@ -407,12 +485,14 @@ clean-sbinPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list + sockdebug$(EXEEXT): $(sockdebug_OBJECTS) $(sockdebug_DEPENDENCIES) $(EXTRA_sockdebug_DEPENDENCIES) @rm -f sockdebug$(EXEEXT) - $(LINK) $(sockdebug_OBJECTS) $(sockdebug_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(sockdebug_OBJECTS) $(sockdebug_LDADD) $(LIBS) + upsd$(EXEEXT): $(upsd_OBJECTS) $(upsd_DEPENDENCIES) $(EXTRA_upsd_DEPENDENCIES) @rm -f upsd$(EXEEXT) - $(LINK) $(upsd_OBJECTS) $(upsd_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(upsd_OBJECTS) $(upsd_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -435,25 +515,28 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -461,26 +544,15 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -492,15 +564,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -509,6 +577,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -653,19 +736,19 @@ uninstall-am: uninstall-sbinPROGRAMS .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-sbinPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-sbinPROGRAMS install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-sbinPROGRAMS cscopelist-am ctags ctags-am \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-sbinPROGRAMS install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-sbinPROGRAMS + tags tags-am uninstall uninstall-am uninstall-sbinPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/server/upsd.c b/server/upsd.c index 2c0d1a1..7dcda1d 100644 --- a/server/upsd.c +++ b/server/upsd.c @@ -1004,9 +1004,6 @@ int main(int argc, char **argv) /* start server */ server_load(); - /* initialize SSL before we drop privileges (we may not be able to read the keyfile as non-root) */ - ssl_init(); - become_user(new_uid); if (chdir(statepath)) { @@ -1038,6 +1035,9 @@ int main(int argc, char **argv) memset(pidfn, 0, sizeof(pidfn)); } + /* initialize SSL (keyfile must be readable by nut user) */ + ssl_init(); + while (!exit_flag) { mainloop(); } diff --git a/test-driver b/test-driver new file mode 100755 index 0000000..d306056 --- /dev/null +++ b/test-driver @@ -0,0 +1,139 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2013-07-13.22; # UTC + +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# 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, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? +if test $enable_hard_errors = no && test $estatus -eq 99; then + estatus=1 +fi + +case $estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/tests/Makefile.in b/tests/Makefile.in index 1e9772c..ac73f55 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,23 +16,51 @@ # Network UPS Tools: tests VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -56,7 +83,8 @@ target_triplet = @target@ @HAVE_CPPUNIT_TRUE@TESTS = cppunittest$(EXEEXT) @HAVE_CPPUNIT_TRUE@check_PROGRAMS = $(am__EXEEXT_1) subdir = tests -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -92,22 +120,47 @@ am__cppunittest_SOURCES_DIST = example.cpp cpputest.cpp @HAVE_CPPUNIT_TRUE@ cppunittest-cpputest.$(OBJEXT) cppunittest_OBJECTS = $(am_cppunittest_OBJECTS) cppunittest_LDADD = $(LDADD) -cppunittest_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +cppunittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(cppunittest_CXXFLAGS) \ $(CXXFLAGS) $(cppunittest_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = SOURCES = $(cppunittest_SOURCES) DIST_SOURCES = $(am__cppunittest_SOURCES_DIST) am__can_run_installinfo = \ @@ -115,14 +168,234 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -229,12 +502,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -279,6 +555,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -310,7 +587,7 @@ udevdir = @udevdir@ all: all-am .SUFFIXES: -.SUFFIXES: .cpp .lo .o .obj +.SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -350,9 +627,10 @@ clean-checkPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list + cppunittest$(EXEEXT): $(cppunittest_OBJECTS) $(cppunittest_DEPENDENCIES) $(EXTRA_cppunittest_DEPENDENCIES) @rm -f cppunittest$(EXEEXT) - $(cppunittest_LINK) $(cppunittest_OBJECTS) $(cppunittest_LDADD) $(LIBS) + $(AM_V_CXXLD)$(cppunittest_LINK) $(cppunittest_OBJECTS) $(cppunittest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -364,53 +642,56 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cppunittest-example.Po@am__quote@ .cpp.o: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< cppunittest-example.o: example.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-example.o -MD -MP -MF $(DEPDIR)/cppunittest-example.Tpo -c -o cppunittest-example.o `test -f 'example.cpp' || echo '$(srcdir)/'`example.cpp -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-example.Tpo $(DEPDIR)/cppunittest-example.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='example.cpp' object='cppunittest-example.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-example.o -MD -MP -MF $(DEPDIR)/cppunittest-example.Tpo -c -o cppunittest-example.o `test -f 'example.cpp' || echo '$(srcdir)/'`example.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cppunittest-example.Tpo $(DEPDIR)/cppunittest-example.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='example.cpp' object='cppunittest-example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-example.o `test -f 'example.cpp' || echo '$(srcdir)/'`example.cpp +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-example.o `test -f 'example.cpp' || echo '$(srcdir)/'`example.cpp cppunittest-example.obj: example.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-example.obj -MD -MP -MF $(DEPDIR)/cppunittest-example.Tpo -c -o cppunittest-example.obj `if test -f 'example.cpp'; then $(CYGPATH_W) 'example.cpp'; else $(CYGPATH_W) '$(srcdir)/example.cpp'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-example.Tpo $(DEPDIR)/cppunittest-example.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='example.cpp' object='cppunittest-example.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-example.obj -MD -MP -MF $(DEPDIR)/cppunittest-example.Tpo -c -o cppunittest-example.obj `if test -f 'example.cpp'; then $(CYGPATH_W) 'example.cpp'; else $(CYGPATH_W) '$(srcdir)/example.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cppunittest-example.Tpo $(DEPDIR)/cppunittest-example.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='example.cpp' object='cppunittest-example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-example.obj `if test -f 'example.cpp'; then $(CYGPATH_W) 'example.cpp'; else $(CYGPATH_W) '$(srcdir)/example.cpp'; fi` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-example.obj `if test -f 'example.cpp'; then $(CYGPATH_W) 'example.cpp'; else $(CYGPATH_W) '$(srcdir)/example.cpp'; fi` cppunittest-cpputest.o: cpputest.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-cpputest.o -MD -MP -MF $(DEPDIR)/cppunittest-cpputest.Tpo -c -o cppunittest-cpputest.o `test -f 'cpputest.cpp' || echo '$(srcdir)/'`cpputest.cpp -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-cpputest.Tpo $(DEPDIR)/cppunittest-cpputest.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='cpputest.cpp' object='cppunittest-cpputest.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-cpputest.o -MD -MP -MF $(DEPDIR)/cppunittest-cpputest.Tpo -c -o cppunittest-cpputest.o `test -f 'cpputest.cpp' || echo '$(srcdir)/'`cpputest.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cppunittest-cpputest.Tpo $(DEPDIR)/cppunittest-cpputest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpputest.cpp' object='cppunittest-cpputest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-cpputest.o `test -f 'cpputest.cpp' || echo '$(srcdir)/'`cpputest.cpp +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-cpputest.o `test -f 'cpputest.cpp' || echo '$(srcdir)/'`cpputest.cpp cppunittest-cpputest.obj: cpputest.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-cpputest.obj -MD -MP -MF $(DEPDIR)/cppunittest-cpputest.Tpo -c -o cppunittest-cpputest.obj `if test -f 'cpputest.cpp'; then $(CYGPATH_W) 'cpputest.cpp'; else $(CYGPATH_W) '$(srcdir)/cpputest.cpp'; fi` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/cppunittest-cpputest.Tpo $(DEPDIR)/cppunittest-cpputest.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='cpputest.cpp' object='cppunittest-cpputest.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -MT cppunittest-cpputest.obj -MD -MP -MF $(DEPDIR)/cppunittest-cpputest.Tpo -c -o cppunittest-cpputest.obj `if test -f 'cpputest.cpp'; then $(CYGPATH_W) 'cpputest.cpp'; else $(CYGPATH_W) '$(srcdir)/cpputest.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cppunittest-cpputest.Tpo $(DEPDIR)/cppunittest-cpputest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cpputest.cpp' object='cppunittest-cpputest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-cpputest.obj `if test -f 'cpputest.cpp'; then $(CYGPATH_W) 'cpputest.cpp'; else $(CYGPATH_W) '$(srcdir)/cpputest.cpp'; fi` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cppunittest_CXXFLAGS) $(CXXFLAGS) -c -o cppunittest-cpputest.obj `if test -f 'cpputest.cpp'; then $(CYGPATH_W) 'cpputest.cpp'; else $(CYGPATH_W) '$(srcdir)/cpputest.cpp'; fi` mostlyclean-libtool: -rm -f *.lo @@ -418,26 +699,15 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -449,15 +719,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -466,102 +732,187 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ - fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + color_start= color_end=; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - col="$$grn"; \ - else \ - col="$$red"; \ - fi; \ - echo "$${col}$$dashes$${std}"; \ - echo "$${col}$$banner$${std}"; \ - test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ - test -z "$$report" || echo "$${col}$$report$${std}"; \ - echo "$${col}$$dashes$${std}"; \ - test "$$failed" -eq 0; \ - else :; fi + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +cppunittest.log: cppunittest$(EXEEXT) + @p='cppunittest$(EXEEXT)'; \ + b='cppunittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -619,6 +970,9 @@ install-strip: "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: @@ -702,9 +1056,9 @@ uninstall-am: .MAKE: check-am install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool ctags \ - distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ @@ -714,7 +1068,7 @@ uninstall-am: installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am + recheck tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/tools/Makefile.am b/tools/Makefile.am index 0e6501e..f8add46 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -16,7 +16,8 @@ # sub-directory SUBDIRS = . nut-scanner -EXTRA_DIST = nut-usbinfo.pl nut-recorder.sh gitlog2changelog.py nut-snmpinfo.py +EXTRA_DIST = nut-usbinfo.pl nut-recorder.sh nut-ddl-dump.sh \ + gitlog2changelog.py nut-snmpinfo.py all: nut-scanner-deps diff --git a/tools/Makefile.in b/tools/Makefile.in index dcbf07d..d132e0d 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,23 +16,51 @@ # TODO: remove redundancies! VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -54,7 +81,7 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = tools -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -83,15 +110,28 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -99,9 +139,29 @@ am__can_run_installinfo = \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) @@ -134,6 +194,7 @@ am__relativize = \ A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -240,12 +301,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -290,6 +354,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -327,7 +392,9 @@ udevdir = @udevdir@ # to have nutscan-{usb,snmp}.h built before going into the nut-scanner # sub-directory SUBDIRS = . nut-scanner -EXTRA_DIST = nut-usbinfo.pl nut-recorder.sh gitlog2changelog.py nut-snmpinfo.py +EXTRA_DIST = nut-usbinfo.pl nut-recorder.sh nut-ddl-dump.sh \ + gitlog2changelog.py nut-snmpinfo.py + all: all-recursive .SUFFIXES: @@ -369,22 +436,25 @@ clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -399,57 +469,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -465,12 +490,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -482,15 +502,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -499,6 +515,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -662,12 +693,11 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive dist-hook distclean distclean-generic \ +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am dist-hook distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ @@ -676,8 +706,8 @@ uninstall-am: install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am all: nut-scanner-deps diff --git a/tools/nut-ddl-dump.sh b/tools/nut-ddl-dump.sh new file mode 100755 index 0000000..dce1e8a --- /dev/null +++ b/tools/nut-ddl-dump.sh @@ -0,0 +1,53 @@ +#!/bin/sh +################################################################################ +# A script to ease the generation of NUT device dumps for NUT Devices Dumps Library +################################################################################ +# Author: (C) Arnaud Quette +# License: GPL v2+ +################################################################################ +# FIXME: +# - check if a previous report exists, and increase report number +#  - we currently use the .dev format ; but also consider the NDS format +# http://www.networkupstools.org/ddl/ +################################################################################ + +strUsage="Usage: $0 " + +# Check command line parameter () +if [ -z "$1" ]; then + echo "$strUsage" + exit +else + DDL_DEVICE_NAME=$1 +fi + +# Test communication with the device +testResult="`upsc ${DDL_DEVICE_NAME} 2> /dev/null`" +if [ $? -gt 0 ]; then + echo "Can't communicate with ${DDL_DEVICE_NAME}" + exit +fi + +# Build the filename +# ________. +# Process the Manufacturer name +RAW_DDL_MFR="`upsc ${DDL_DEVICE_NAME} device.mfr 2>/dev/null`" +if [ "${RAW_DDL_MFR}" = "EATON" ]; then + RAW_DDL_MFR="Eaton" +fi +# Replace spaces with underscores +DDL_MFR="`echo ${RAW_DDL_MFR} | sed s/\ /_/g`" +# Process the Model name +# Replace spaces with underscores +RAW_DDL_MODEL="`upsc ${DDL_DEVICE_NAME} device.model 2>/dev/null`" +DDL_MODEL="`echo ${RAW_DDL_MODEL} | sed s/\ /_/g`" +# Process the driver name and NUT version +DDL_DRIVER_NAME="`upsc ${DDL_DEVICE_NAME} driver.name 2>/dev/null`" +DDL_NUT_VERSION="`upsc ${DDL_DEVICE_NAME} driver.version 2>/dev/null`" +# TODO: check if a similar file exists, to update Report nb +DDL_REPORT_NUMBER="01" +DDL_FILENAME="${DDL_MFR}__${DDL_MODEL}__${DDL_DRIVER_NAME}__${DDL_NUT_VERSION}__${DDL_REPORT_NUMBER}.dev" + +# Dump device data into the file +echo "${testResult}" > ${DDL_FILENAME} +echo "${DDL_FILENAME} generated using ${DDL_DEVICE_NAME} " diff --git a/tools/nut-scanner/Makefile.am b/tools/nut-scanner/Makefile.am index 56278ee..558cb23 100644 --- a/tools/nut-scanner/Makefile.am +++ b/tools/nut-scanner/Makefile.am @@ -12,9 +12,9 @@ libnutscan_la_SOURCES = scan_nut.c scan_ipmi.c \ nutscan-device.c nutscan-ip.c nutscan-display.c \ nutscan-init.c scan_usb.c scan_snmp.c scan_xml_http.c \ scan_avahi.c scan_eaton_serial.c nutscan-serial.c \ - $(top_srcdir)/drivers/serial.c \ - $(top_srcdir)/drivers/bcmxcp_ser.c \ - $(top_srcdir)/common/common.c + ../../drivers/serial.c \ + ../../drivers/bcmxcp_ser.c \ + ../../common/common.c libnutscan_la_LIBADD = $(NETLIBS) $(LIBLTDL_LIBS) libnutscan_la_LDFLAGS = $(SERLIBS) -version-info 1:0:0 libnutscan_la_CFLAGS = -I$(top_srcdir)/clients -I$(top_srcdir)/include $(LIBLTDL_CFLAGS) -I$(top_srcdir)/drivers diff --git a/tools/nut-scanner/Makefile.in b/tools/nut-scanner/Makefile.in index dedf63c..3ff07cd 100644 --- a/tools/nut-scanner/Makefile.in +++ b/tools/nut-scanner/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.6 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,23 +17,51 @@ VPATH = @srcdir@ -am__make_dryrun = \ - { \ - am__dry=no; \ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ - test $$am__dry = yes; \ - } + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -64,9 +91,9 @@ target_triplet = @target@ @WITH_IPMI_TRUE@am__append_7 = $(LIBIPMI_CFLAGS) @WITH_DEV_FALSE@am__append_8 = nut-scan.h nutscan-device.h nutscan-ip.h nutscan-init.h nutscan-serial.h subdir = tools/nut-scanner -DIST_COMMON = README $(am__dist_noinst_HEADERS_DIST) \ - $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp $(am__dist_noinst_HEADERS_DIST) \ + $(am__include_HEADERS_DIST) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -129,16 +156,23 @@ am__DEPENDENCIES_1 = @WITH_SSL_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) libnutscan_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +am__dirstamp = $(am__leading_dot)dirstamp am_libnutscan_la_OBJECTS = libnutscan_la-scan_nut.lo \ libnutscan_la-scan_ipmi.lo libnutscan_la-nutscan-device.lo \ libnutscan_la-nutscan-ip.lo libnutscan_la-nutscan-display.lo \ libnutscan_la-nutscan-init.lo libnutscan_la-scan_usb.lo \ libnutscan_la-scan_snmp.lo libnutscan_la-scan_xml_http.lo \ libnutscan_la-scan_avahi.lo libnutscan_la-scan_eaton_serial.lo \ - libnutscan_la-nutscan-serial.lo libnutscan_la-serial.lo \ - libnutscan_la-bcmxcp_ser.lo libnutscan_la-common.lo + libnutscan_la-nutscan-serial.lo \ + ../../drivers/libnutscan_la-serial.lo \ + ../../drivers/libnutscan_la-bcmxcp_ser.lo \ + ../../common/libnutscan_la-common.lo libnutscan_la_OBJECTS = $(am_libnutscan_la_OBJECTS) -libnutscan_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libnutscan_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libnutscan_la_CFLAGS) \ $(CFLAGS) $(libnutscan_la_LDFLAGS) $(LDFLAGS) -o $@ @WITH_LIBLTDL_TRUE@am_libnutscan_la_rpath = -rpath $(libdir) @@ -146,22 +180,43 @@ PROGRAMS = $(bin_PROGRAMS) am_nut_scanner_OBJECTS = nut_scanner-nut-scanner.$(OBJEXT) nut_scanner_OBJECTS = $(am_nut_scanner_OBJECTS) nut_scanner_DEPENDENCIES = libnutscan.la ../../common/libcommon.la -nut_scanner_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +nut_scanner_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(nut_scanner_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(libnutscan_la_SOURCES) $(nut_scanner_SOURCES) DIST_SOURCES = $(libnutscan_la_SOURCES) $(nut_scanner_SOURCES) am__can_run_installinfo = \ @@ -174,12 +229,30 @@ am__dist_noinst_HEADERS_DIST = nutscan-usb.h nutscan-snmp.h nut-scan.h \ am__include_HEADERS_DIST = nut-scan.h nutscan-device.h nutscan-ip.h \ nutscan-init.h HEADERS = $(dist_noinst_HEADERS) $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ ASPELL = @ASPELL@ @@ -286,12 +359,15 @@ SED = @SED@ SERLIBS = @SERLIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@ STATEPATH = @STATEPATH@ STRIP = @STRIP@ SUN_LIBUSB = @SUN_LIBUSB@ TREE_VERSION = @TREE_VERSION@ VERSION = @VERSION@ WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ +XMLLINT = @XMLLINT@ +XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -336,6 +412,7 @@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ +now = @now@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ @@ -363,9 +440,9 @@ libnutscan_la_SOURCES = scan_nut.c scan_ipmi.c \ nutscan-device.c nutscan-ip.c nutscan-display.c \ nutscan-init.c scan_usb.c scan_snmp.c scan_xml_http.c \ scan_avahi.c scan_eaton_serial.c nutscan-serial.c \ - $(top_srcdir)/drivers/serial.c \ - $(top_srcdir)/drivers/bcmxcp_ser.c \ - $(top_srcdir)/common/common.c + ../../drivers/serial.c \ + ../../drivers/bcmxcp_ser.c \ + ../../common/common.c libnutscan_la_LIBADD = $(NETLIBS) $(LIBLTDL_LIBS) $(am__append_2) libnutscan_la_LDFLAGS = $(SERLIBS) -version-info 1:0:0 @@ -414,6 +491,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ @@ -440,14 +518,36 @@ uninstall-libLTLIBRARIES: clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +../../drivers/$(am__dirstamp): + @$(MKDIR_P) ../../drivers + @: > ../../drivers/$(am__dirstamp) +../../drivers/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ../../drivers/$(DEPDIR) + @: > ../../drivers/$(DEPDIR)/$(am__dirstamp) +../../drivers/libnutscan_la-serial.lo: ../../drivers/$(am__dirstamp) \ + ../../drivers/$(DEPDIR)/$(am__dirstamp) +../../drivers/libnutscan_la-bcmxcp_ser.lo: \ + ../../drivers/$(am__dirstamp) \ + ../../drivers/$(DEPDIR)/$(am__dirstamp) +../../common/$(am__dirstamp): + @$(MKDIR_P) ../../common + @: > ../../common/$(am__dirstamp) +../../common/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ../../common/$(DEPDIR) + @: > ../../common/$(DEPDIR)/$(am__dirstamp) +../../common/libnutscan_la-common.lo: ../../common/$(am__dirstamp) \ + ../../common/$(DEPDIR)/$(am__dirstamp) + libnutscan.la: $(libnutscan_la_OBJECTS) $(libnutscan_la_DEPENDENCIES) $(EXTRA_libnutscan_la_DEPENDENCIES) - $(libnutscan_la_LINK) $(am_libnutscan_la_rpath) $(libnutscan_la_OBJECTS) $(libnutscan_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(libnutscan_la_LINK) $(am_libnutscan_la_rpath) $(libnutscan_la_OBJECTS) $(libnutscan_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ @@ -457,10 +557,12 @@ install-binPROGRAMS: $(bin_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -481,7 +583,8 @@ uninstall-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -494,18 +597,24 @@ clean-binPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list + nut-scanner$(EXEEXT): $(nut_scanner_OBJECTS) $(nut_scanner_DEPENDENCIES) $(EXTRA_nut_scanner_DEPENDENCIES) @rm -f nut-scanner$(EXEEXT) - $(nut_scanner_LINK) $(nut_scanner_OBJECTS) $(nut_scanner_LDADD) $(LIBS) + $(AM_V_CCLD)$(nut_scanner_LINK) $(nut_scanner_OBJECTS) $(nut_scanner_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f ../../common/*.$(OBJEXT) + -rm -f ../../common/*.lo + -rm -f ../../drivers/*.$(OBJEXT) + -rm -f ../../drivers/*.lo distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-bcmxcp_ser.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../common/$(DEPDIR)/libnutscan_la-common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../drivers/$(DEPDIR)/libnutscan_la-bcmxcp_ser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@../../drivers/$(DEPDIR)/libnutscan_la-serial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-nutscan-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-nutscan-display.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-nutscan-init.Plo@am__quote@ @@ -518,154 +627,158 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-scan_snmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-scan_usb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-scan_xml_http.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-serial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nut_scanner-nut-scanner.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libnutscan_la-scan_nut.lo: scan_nut.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_nut.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_nut.Tpo -c -o libnutscan_la-scan_nut.lo `test -f 'scan_nut.c' || echo '$(srcdir)/'`scan_nut.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-scan_nut.Tpo $(DEPDIR)/libnutscan_la-scan_nut.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan_nut.c' object='libnutscan_la-scan_nut.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_nut.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_nut.Tpo -c -o libnutscan_la-scan_nut.lo `test -f 'scan_nut.c' || echo '$(srcdir)/'`scan_nut.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-scan_nut.Tpo $(DEPDIR)/libnutscan_la-scan_nut.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scan_nut.c' object='libnutscan_la-scan_nut.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_nut.lo `test -f 'scan_nut.c' || echo '$(srcdir)/'`scan_nut.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_nut.lo `test -f 'scan_nut.c' || echo '$(srcdir)/'`scan_nut.c libnutscan_la-scan_ipmi.lo: scan_ipmi.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_ipmi.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_ipmi.Tpo -c -o libnutscan_la-scan_ipmi.lo `test -f 'scan_ipmi.c' || echo '$(srcdir)/'`scan_ipmi.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-scan_ipmi.Tpo $(DEPDIR)/libnutscan_la-scan_ipmi.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan_ipmi.c' object='libnutscan_la-scan_ipmi.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_ipmi.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_ipmi.Tpo -c -o libnutscan_la-scan_ipmi.lo `test -f 'scan_ipmi.c' || echo '$(srcdir)/'`scan_ipmi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-scan_ipmi.Tpo $(DEPDIR)/libnutscan_la-scan_ipmi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scan_ipmi.c' object='libnutscan_la-scan_ipmi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_ipmi.lo `test -f 'scan_ipmi.c' || echo '$(srcdir)/'`scan_ipmi.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_ipmi.lo `test -f 'scan_ipmi.c' || echo '$(srcdir)/'`scan_ipmi.c libnutscan_la-nutscan-device.lo: nutscan-device.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-device.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-device.Tpo -c -o libnutscan_la-nutscan-device.lo `test -f 'nutscan-device.c' || echo '$(srcdir)/'`nutscan-device.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-nutscan-device.Tpo $(DEPDIR)/libnutscan_la-nutscan-device.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutscan-device.c' object='libnutscan_la-nutscan-device.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-device.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-device.Tpo -c -o libnutscan_la-nutscan-device.lo `test -f 'nutscan-device.c' || echo '$(srcdir)/'`nutscan-device.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-nutscan-device.Tpo $(DEPDIR)/libnutscan_la-nutscan-device.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutscan-device.c' object='libnutscan_la-nutscan-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-device.lo `test -f 'nutscan-device.c' || echo '$(srcdir)/'`nutscan-device.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-device.lo `test -f 'nutscan-device.c' || echo '$(srcdir)/'`nutscan-device.c libnutscan_la-nutscan-ip.lo: nutscan-ip.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-ip.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-ip.Tpo -c -o libnutscan_la-nutscan-ip.lo `test -f 'nutscan-ip.c' || echo '$(srcdir)/'`nutscan-ip.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-nutscan-ip.Tpo $(DEPDIR)/libnutscan_la-nutscan-ip.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutscan-ip.c' object='libnutscan_la-nutscan-ip.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-ip.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-ip.Tpo -c -o libnutscan_la-nutscan-ip.lo `test -f 'nutscan-ip.c' || echo '$(srcdir)/'`nutscan-ip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-nutscan-ip.Tpo $(DEPDIR)/libnutscan_la-nutscan-ip.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutscan-ip.c' object='libnutscan_la-nutscan-ip.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-ip.lo `test -f 'nutscan-ip.c' || echo '$(srcdir)/'`nutscan-ip.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-ip.lo `test -f 'nutscan-ip.c' || echo '$(srcdir)/'`nutscan-ip.c libnutscan_la-nutscan-display.lo: nutscan-display.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-display.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-display.Tpo -c -o libnutscan_la-nutscan-display.lo `test -f 'nutscan-display.c' || echo '$(srcdir)/'`nutscan-display.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-nutscan-display.Tpo $(DEPDIR)/libnutscan_la-nutscan-display.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutscan-display.c' object='libnutscan_la-nutscan-display.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-display.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-display.Tpo -c -o libnutscan_la-nutscan-display.lo `test -f 'nutscan-display.c' || echo '$(srcdir)/'`nutscan-display.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-nutscan-display.Tpo $(DEPDIR)/libnutscan_la-nutscan-display.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutscan-display.c' object='libnutscan_la-nutscan-display.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-display.lo `test -f 'nutscan-display.c' || echo '$(srcdir)/'`nutscan-display.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-display.lo `test -f 'nutscan-display.c' || echo '$(srcdir)/'`nutscan-display.c libnutscan_la-nutscan-init.lo: nutscan-init.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-init.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-init.Tpo -c -o libnutscan_la-nutscan-init.lo `test -f 'nutscan-init.c' || echo '$(srcdir)/'`nutscan-init.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-nutscan-init.Tpo $(DEPDIR)/libnutscan_la-nutscan-init.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutscan-init.c' object='libnutscan_la-nutscan-init.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-init.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-init.Tpo -c -o libnutscan_la-nutscan-init.lo `test -f 'nutscan-init.c' || echo '$(srcdir)/'`nutscan-init.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-nutscan-init.Tpo $(DEPDIR)/libnutscan_la-nutscan-init.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutscan-init.c' object='libnutscan_la-nutscan-init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-init.lo `test -f 'nutscan-init.c' || echo '$(srcdir)/'`nutscan-init.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-init.lo `test -f 'nutscan-init.c' || echo '$(srcdir)/'`nutscan-init.c libnutscan_la-scan_usb.lo: scan_usb.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_usb.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_usb.Tpo -c -o libnutscan_la-scan_usb.lo `test -f 'scan_usb.c' || echo '$(srcdir)/'`scan_usb.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-scan_usb.Tpo $(DEPDIR)/libnutscan_la-scan_usb.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan_usb.c' object='libnutscan_la-scan_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_usb.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_usb.Tpo -c -o libnutscan_la-scan_usb.lo `test -f 'scan_usb.c' || echo '$(srcdir)/'`scan_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-scan_usb.Tpo $(DEPDIR)/libnutscan_la-scan_usb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scan_usb.c' object='libnutscan_la-scan_usb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_usb.lo `test -f 'scan_usb.c' || echo '$(srcdir)/'`scan_usb.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_usb.lo `test -f 'scan_usb.c' || echo '$(srcdir)/'`scan_usb.c libnutscan_la-scan_snmp.lo: scan_snmp.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_snmp.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_snmp.Tpo -c -o libnutscan_la-scan_snmp.lo `test -f 'scan_snmp.c' || echo '$(srcdir)/'`scan_snmp.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-scan_snmp.Tpo $(DEPDIR)/libnutscan_la-scan_snmp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan_snmp.c' object='libnutscan_la-scan_snmp.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_snmp.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_snmp.Tpo -c -o libnutscan_la-scan_snmp.lo `test -f 'scan_snmp.c' || echo '$(srcdir)/'`scan_snmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-scan_snmp.Tpo $(DEPDIR)/libnutscan_la-scan_snmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scan_snmp.c' object='libnutscan_la-scan_snmp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_snmp.lo `test -f 'scan_snmp.c' || echo '$(srcdir)/'`scan_snmp.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_snmp.lo `test -f 'scan_snmp.c' || echo '$(srcdir)/'`scan_snmp.c libnutscan_la-scan_xml_http.lo: scan_xml_http.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_xml_http.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_xml_http.Tpo -c -o libnutscan_la-scan_xml_http.lo `test -f 'scan_xml_http.c' || echo '$(srcdir)/'`scan_xml_http.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-scan_xml_http.Tpo $(DEPDIR)/libnutscan_la-scan_xml_http.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan_xml_http.c' object='libnutscan_la-scan_xml_http.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_xml_http.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_xml_http.Tpo -c -o libnutscan_la-scan_xml_http.lo `test -f 'scan_xml_http.c' || echo '$(srcdir)/'`scan_xml_http.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-scan_xml_http.Tpo $(DEPDIR)/libnutscan_la-scan_xml_http.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scan_xml_http.c' object='libnutscan_la-scan_xml_http.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_xml_http.lo `test -f 'scan_xml_http.c' || echo '$(srcdir)/'`scan_xml_http.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_xml_http.lo `test -f 'scan_xml_http.c' || echo '$(srcdir)/'`scan_xml_http.c libnutscan_la-scan_avahi.lo: scan_avahi.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_avahi.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_avahi.Tpo -c -o libnutscan_la-scan_avahi.lo `test -f 'scan_avahi.c' || echo '$(srcdir)/'`scan_avahi.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-scan_avahi.Tpo $(DEPDIR)/libnutscan_la-scan_avahi.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan_avahi.c' object='libnutscan_la-scan_avahi.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_avahi.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_avahi.Tpo -c -o libnutscan_la-scan_avahi.lo `test -f 'scan_avahi.c' || echo '$(srcdir)/'`scan_avahi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-scan_avahi.Tpo $(DEPDIR)/libnutscan_la-scan_avahi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scan_avahi.c' object='libnutscan_la-scan_avahi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_avahi.lo `test -f 'scan_avahi.c' || echo '$(srcdir)/'`scan_avahi.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_avahi.lo `test -f 'scan_avahi.c' || echo '$(srcdir)/'`scan_avahi.c libnutscan_la-scan_eaton_serial.lo: scan_eaton_serial.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_eaton_serial.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_eaton_serial.Tpo -c -o libnutscan_la-scan_eaton_serial.lo `test -f 'scan_eaton_serial.c' || echo '$(srcdir)/'`scan_eaton_serial.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-scan_eaton_serial.Tpo $(DEPDIR)/libnutscan_la-scan_eaton_serial.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scan_eaton_serial.c' object='libnutscan_la-scan_eaton_serial.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_eaton_serial.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_eaton_serial.Tpo -c -o libnutscan_la-scan_eaton_serial.lo `test -f 'scan_eaton_serial.c' || echo '$(srcdir)/'`scan_eaton_serial.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-scan_eaton_serial.Tpo $(DEPDIR)/libnutscan_la-scan_eaton_serial.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scan_eaton_serial.c' object='libnutscan_la-scan_eaton_serial.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_eaton_serial.lo `test -f 'scan_eaton_serial.c' || echo '$(srcdir)/'`scan_eaton_serial.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-scan_eaton_serial.lo `test -f 'scan_eaton_serial.c' || echo '$(srcdir)/'`scan_eaton_serial.c libnutscan_la-nutscan-serial.lo: nutscan-serial.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-serial.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-serial.Tpo -c -o libnutscan_la-nutscan-serial.lo `test -f 'nutscan-serial.c' || echo '$(srcdir)/'`nutscan-serial.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-nutscan-serial.Tpo $(DEPDIR)/libnutscan_la-nutscan-serial.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nutscan-serial.c' object='libnutscan_la-nutscan-serial.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-serial.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-serial.Tpo -c -o libnutscan_la-nutscan-serial.lo `test -f 'nutscan-serial.c' || echo '$(srcdir)/'`nutscan-serial.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnutscan_la-nutscan-serial.Tpo $(DEPDIR)/libnutscan_la-nutscan-serial.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nutscan-serial.c' object='libnutscan_la-nutscan-serial.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-serial.lo `test -f 'nutscan-serial.c' || echo '$(srcdir)/'`nutscan-serial.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-serial.lo `test -f 'nutscan-serial.c' || echo '$(srcdir)/'`nutscan-serial.c -libnutscan_la-serial.lo: $(top_srcdir)/drivers/serial.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-serial.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-serial.Tpo -c -o libnutscan_la-serial.lo `test -f '$(top_srcdir)/drivers/serial.c' || echo '$(srcdir)/'`$(top_srcdir)/drivers/serial.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-serial.Tpo $(DEPDIR)/libnutscan_la-serial.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/drivers/serial.c' object='libnutscan_la-serial.lo' libtool=yes @AMDEPBACKSLASH@ +../../drivers/libnutscan_la-serial.lo: ../../drivers/serial.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT ../../drivers/libnutscan_la-serial.lo -MD -MP -MF ../../drivers/$(DEPDIR)/libnutscan_la-serial.Tpo -c -o ../../drivers/libnutscan_la-serial.lo `test -f '../../drivers/serial.c' || echo '$(srcdir)/'`../../drivers/serial.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../drivers/$(DEPDIR)/libnutscan_la-serial.Tpo ../../drivers/$(DEPDIR)/libnutscan_la-serial.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../drivers/serial.c' object='../../drivers/libnutscan_la-serial.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-serial.lo `test -f '$(top_srcdir)/drivers/serial.c' || echo '$(srcdir)/'`$(top_srcdir)/drivers/serial.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o ../../drivers/libnutscan_la-serial.lo `test -f '../../drivers/serial.c' || echo '$(srcdir)/'`../../drivers/serial.c -libnutscan_la-bcmxcp_ser.lo: $(top_srcdir)/drivers/bcmxcp_ser.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-bcmxcp_ser.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-bcmxcp_ser.Tpo -c -o libnutscan_la-bcmxcp_ser.lo `test -f '$(top_srcdir)/drivers/bcmxcp_ser.c' || echo '$(srcdir)/'`$(top_srcdir)/drivers/bcmxcp_ser.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-bcmxcp_ser.Tpo $(DEPDIR)/libnutscan_la-bcmxcp_ser.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/drivers/bcmxcp_ser.c' object='libnutscan_la-bcmxcp_ser.lo' libtool=yes @AMDEPBACKSLASH@ +../../drivers/libnutscan_la-bcmxcp_ser.lo: ../../drivers/bcmxcp_ser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT ../../drivers/libnutscan_la-bcmxcp_ser.lo -MD -MP -MF ../../drivers/$(DEPDIR)/libnutscan_la-bcmxcp_ser.Tpo -c -o ../../drivers/libnutscan_la-bcmxcp_ser.lo `test -f '../../drivers/bcmxcp_ser.c' || echo '$(srcdir)/'`../../drivers/bcmxcp_ser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../drivers/$(DEPDIR)/libnutscan_la-bcmxcp_ser.Tpo ../../drivers/$(DEPDIR)/libnutscan_la-bcmxcp_ser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../drivers/bcmxcp_ser.c' object='../../drivers/libnutscan_la-bcmxcp_ser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-bcmxcp_ser.lo `test -f '$(top_srcdir)/drivers/bcmxcp_ser.c' || echo '$(srcdir)/'`$(top_srcdir)/drivers/bcmxcp_ser.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o ../../drivers/libnutscan_la-bcmxcp_ser.lo `test -f '../../drivers/bcmxcp_ser.c' || echo '$(srcdir)/'`../../drivers/bcmxcp_ser.c -libnutscan_la-common.lo: $(top_srcdir)/common/common.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-common.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-common.Tpo -c -o libnutscan_la-common.lo `test -f '$(top_srcdir)/common/common.c' || echo '$(srcdir)/'`$(top_srcdir)/common/common.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libnutscan_la-common.Tpo $(DEPDIR)/libnutscan_la-common.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/common/common.c' object='libnutscan_la-common.lo' libtool=yes @AMDEPBACKSLASH@ +../../common/libnutscan_la-common.lo: ../../common/common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT ../../common/libnutscan_la-common.lo -MD -MP -MF ../../common/$(DEPDIR)/libnutscan_la-common.Tpo -c -o ../../common/libnutscan_la-common.lo `test -f '../../common/common.c' || echo '$(srcdir)/'`../../common/common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../common/$(DEPDIR)/libnutscan_la-common.Tpo ../../common/$(DEPDIR)/libnutscan_la-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../common/common.c' object='../../common/libnutscan_la-common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-common.lo `test -f '$(top_srcdir)/common/common.c' || echo '$(srcdir)/'`$(top_srcdir)/common/common.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o ../../common/libnutscan_la-common.lo `test -f '../../common/common.c' || echo '$(srcdir)/'`../../common/common.c nut_scanner-nut-scanner.o: nut-scanner.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -MT nut_scanner-nut-scanner.o -MD -MP -MF $(DEPDIR)/nut_scanner-nut-scanner.Tpo -c -o nut_scanner-nut-scanner.o `test -f 'nut-scanner.c' || echo '$(srcdir)/'`nut-scanner.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nut_scanner-nut-scanner.Tpo $(DEPDIR)/nut_scanner-nut-scanner.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nut-scanner.c' object='nut_scanner-nut-scanner.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -MT nut_scanner-nut-scanner.o -MD -MP -MF $(DEPDIR)/nut_scanner-nut-scanner.Tpo -c -o nut_scanner-nut-scanner.o `test -f 'nut-scanner.c' || echo '$(srcdir)/'`nut-scanner.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nut_scanner-nut-scanner.Tpo $(DEPDIR)/nut_scanner-nut-scanner.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nut-scanner.c' object='nut_scanner-nut-scanner.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -c -o nut_scanner-nut-scanner.o `test -f 'nut-scanner.c' || echo '$(srcdir)/'`nut-scanner.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -c -o nut_scanner-nut-scanner.o `test -f 'nut-scanner.c' || echo '$(srcdir)/'`nut-scanner.c nut_scanner-nut-scanner.obj: nut-scanner.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -MT nut_scanner-nut-scanner.obj -MD -MP -MF $(DEPDIR)/nut_scanner-nut-scanner.Tpo -c -o nut_scanner-nut-scanner.obj `if test -f 'nut-scanner.c'; then $(CYGPATH_W) 'nut-scanner.c'; else $(CYGPATH_W) '$(srcdir)/nut-scanner.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nut_scanner-nut-scanner.Tpo $(DEPDIR)/nut_scanner-nut-scanner.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nut-scanner.c' object='nut_scanner-nut-scanner.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -MT nut_scanner-nut-scanner.obj -MD -MP -MF $(DEPDIR)/nut_scanner-nut-scanner.Tpo -c -o nut_scanner-nut-scanner.obj `if test -f 'nut-scanner.c'; then $(CYGPATH_W) 'nut-scanner.c'; else $(CYGPATH_W) '$(srcdir)/nut-scanner.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nut_scanner-nut-scanner.Tpo $(DEPDIR)/nut_scanner-nut-scanner.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nut-scanner.c' object='nut_scanner-nut-scanner.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -c -o nut_scanner-nut-scanner.obj `if test -f 'nut-scanner.c'; then $(CYGPATH_W) 'nut-scanner.c'; else $(CYGPATH_W) '$(srcdir)/nut-scanner.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nut_scanner_CFLAGS) $(CFLAGS) -c -o nut_scanner-nut-scanner.obj `if test -f 'nut-scanner.c'; then $(CYGPATH_W) 'nut-scanner.c'; else $(CYGPATH_W) '$(srcdir)/nut-scanner.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs + -rm -rf ../../common/.libs ../../common/_libs + -rm -rf ../../drivers/.libs ../../drivers/_libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ @@ -688,26 +801,15 @@ uninstall-includeHEADERS: files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -719,15 +821,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -736,6 +834,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -808,6 +921,10 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f ../../common/$(DEPDIR)/$(am__dirstamp) + -rm -f ../../common/$(am__dirstamp) + -rm -f ../../drivers/$(DEPDIR)/$(am__dirstamp) + -rm -f ../../drivers/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -819,7 +936,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../../common/$(DEPDIR) ../../drivers/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -865,7 +982,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ../../common/$(DEPDIR) ../../drivers/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -887,20 +1004,21 @@ uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ .MAKE: all check install install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool ctags \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-binPROGRAMS \ + tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-includeHEADERS uninstall-libLTLIBRARIES diff --git a/tools/nut-scanner/nutscan-snmp.h b/tools/nut-scanner/nutscan-snmp.h index c66aa96..38202a0 100644 --- a/tools/nut-scanner/nutscan-snmp.h +++ b/tools/nut-scanner/nutscan-snmp.h @@ -27,24 +27,24 @@ typedef struct { /* SNMP IDs device table */ static snmp_device_id_t snmp_device_table[] = { - { ".1.3.6.1.4.1.4555.1.1.1.1.1.1.0" , "netvision", ".1.3.6.1.4.1.4555.1.1.1"}, - { ".1.3.6.1.4.1.4779.1.3.5.2.1.24.1" , "baytech", NULL}, - { ".1.3.6.1.4.1.318.1.1.1.1.1.1.0" , "apcc", NULL}, + { ".1.3.6.1.4.1.13742.1.1.12.0" , "raritan", ".1.3.6.1.4.1.13742"}, + { "" , "xppc", ".1.3.6.1.4.1.935"}, { "1.3.6.1.4.1.534.1.1.2.0" , "pw", ".1.3.6.1.4.1.534.1"}, + { "1.3.6.1.2.1.33.1.1.1.0" , "ietf", ".1.3.6.1.2.1.33"}, + { ".1.3.6.1.4.1.232.165.3.1.1.0" , "cpqpower", ".1.3.6.1.4.1.232.165.3"}, { ".1.3.6.1.4.1.17373.3.1.1.0" , "aphel_genesisII", ".1.3.6.1.4.1.17373"}, { ".1.3.6.1.4.1.534.6.6.6.1.1.12.0" , "aphel_revelation", ".1.3.6.1.4.1.534.6.6.6"}, { ".1.3.6.1.4.1.534.6.6.7.1.2.1.2.0" , "eaton_epdu", ".1.3.6.1.4.1.534.6.6.7"}, { "" , "pulizzi_monitored", NULL}, { ".1.3.6.1.4.1.20677.1" , "pulizzi_switched1", ".1.3.6.1.4.1.20677.1"}, { ".1.3.6.1.4.1.20677.1" , "pulizzi_switched2", ".1.3.6.1.4.1.20677.2"}, - { ".1.3.6.1.4.1.2947.1.1.2.0" , "bestpower", NULL}, { ".1.3.6.1.4.1.3808.1.1.1.1.1.1.0" , "cyberpower", ".1.3.6.1.4.1.3808"}, - { "" , "xppc", ".1.3.6.1.4.1.935"}, - { "" , "delta_ups", ".1.3.6.1.4.1.2254.2.4"}, { ".1.3.6.1.4.1.705.1.1.1.0" , "mge", ".1.3.6.1.4.1.705.1"}, - { ".1.3.6.1.4.1.232.165.3.1.1.0" , "cpqpower", ".1.3.6.1.4.1.232.165.3"}, - { ".1.3.6.1.4.1.13742.1.1.12.0" , "raritan", ".1.3.6.1.4.1.13742"}, - { "1.3.6.1.2.1.33.1.1.1.0" , "ietf", ".1.3.6.1.2.1.33"}, + { "" , "delta_ups", ".1.3.6.1.4.1.2254.2.4"}, + { ".1.3.6.1.4.1.4555.1.1.1.1.1.1.0" , "netvision", ".1.3.6.1.4.1.4555.1.1.1"}, + { ".1.3.6.1.4.1.318.1.1.1.1.1.1.0" , "apcc", NULL}, + { ".1.3.6.1.4.1.4779.1.3.5.2.1.24.1" , "baytech", NULL}, + { ".1.3.6.1.4.1.2947.1.1.2.0" , "bestpower", NULL}, /* Terminating entry */ { NULL, NULL, NULL} }; diff --git a/tools/nut-scanner/nutscan-usb.h b/tools/nut-scanner/nutscan-usb.h index c31466f..a35513a 100644 --- a/tools/nut-scanner/nutscan-usb.h +++ b/tools/nut-scanner/nutscan-usb.h @@ -52,6 +52,7 @@ static usb_device_id_t usb_device_table[] = { { 0x047c, 0xffff, "usbhid-ups" }, { 0x04b4, 0x5500, "riello_usb" }, { 0x04d8, 0xd004, "usbhid-ups" }, + { 0x04d8, 0xd005, "usbhid-ups" }, { 0x050d, 0x0375, "usbhid-ups" }, { 0x050d, 0x0551, "usbhid-ups" }, { 0x050d, 0x0750, "usbhid-ups" }, @@ -60,14 +61,16 @@ static usb_device_id_t usb_device_table[] = { { 0x050d, 0x0910, "usbhid-ups" }, { 0x050d, 0x0912, "usbhid-ups" }, { 0x050d, 0x0980, "usbhid-ups" }, + { 0x050d, 0x0f51, "usbhid-ups" }, { 0x050d, 0x1100, "usbhid-ups" }, + { 0x051d, 0x0000, "usbhid-ups" }, { 0x051d, 0x0002, "usbhid-ups" }, { 0x051d, 0x0003, "usbhid-ups" }, { 0x0592, 0x0002, "bcmxcp_usb" }, { 0x0592, 0x0004, "usbhid-ups" }, { 0x05b8, 0x0000, "blazer_usb" }, { 0x0665, 0x5161, "blazer_usb" }, - { 0x06da, 0x0002, "blazer_usb" }, + { 0x06da, 0x0002, "bcmxcp_usb" }, { 0x06da, 0x0003, "blazer_usb" }, { 0x06da, 0x0004, "blazer_usb" }, { 0x06da, 0x0005, "blazer_usb" }, @@ -111,6 +114,7 @@ static usb_device_id_t usb_device_table[] = { { 0x09ae, 0x4006, "usbhid-ups" }, { 0x09ae, 0x4007, "usbhid-ups" }, { 0x09ae, 0x4008, "usbhid-ups" }, + { 0x0d9f, 0x0001, "usbhid-ups" }, { 0x0d9f, 0x0004, "usbhid-ups" }, { 0x0d9f, 0x00a2, "usbhid-ups" }, { 0x0d9f, 0x00a3, "usbhid-ups" }, @@ -120,6 +124,7 @@ static usb_device_id_t usb_device_table[] = { { 0x0f03, 0x0001, "blazer_usb" }, { 0x10af, 0x0001, "usbhid-ups" }, { 0x10af, 0x0004, "usbhid-ups" }, + { 0x10af, 0x0008, "usbhid-ups" }, { 0x14f0, 0x00c9, "blazer_usb" }, { 0xffff, 0x0000, "blazer_usb" }, /* Terminating entry */ diff --git a/tools/nut-usbinfo.pl b/tools/nut-usbinfo.pl index 989cef2..51a60e1 100755 --- a/tools/nut-usbinfo.pl +++ b/tools/nut-usbinfo.pl @@ -111,7 +111,7 @@ sub gen_usb_files open my $outputUPower, ">$outputUPower" || die "error $outputUPower : $!"; print $outputUPower '##############################################################################################################'."\n"; print $outputUPower '# Uninterruptible Power Supplies with USB HID interfaces'."\n#\n"; - print $outputUPower '# to keep up to date, monitor: http://svn.debian.org/wsvn/nut/trunk/scripts/upower/95-upower-hid.rules'."\n\n"; + print $outputUPower '# to keep up to date, monitor https://github.com/networkupstools/nut/commits/master/scripts/upower/95-upower-hid.rules'."\n\n"; print $outputUPower '# only support USB, else ignore'."\n".'SUBSYSTEM!="usb", GOTO="up_hid_end"'."\n\n"; print $outputUPower '# if usbraw device, ignore'."\n".'KERNEL!="hiddev*", GOTO="up_hid_end"'."\n\n"; print $outputUPower '# if an interface, ignore'."\n".'ENV{DEVTYPE}=="usb_interface", GOTO="up_hid_end"'."\n\n"; @@ -169,7 +169,7 @@ sub gen_usb_files print $out_devd "\tmatch \"vendor\"\t\t\"$vendorId\";\n"; # print $out_devd "\tmatch \"product\"\t\t\"$productId\";\n"; - print $out_devd "\taction \"chgrp \@RUN_AS_GROUP\@ /dev/\$device-name*; chmod g+rw /dev/\$device-name*\";\n"; + print $out_devd "\taction \"chgrp \@RUN_AS_GROUP\@ /dev/\$cdev; chmod g+rw /dev/\$cdev\";\n"; print $out_devd "};\n"; # UPower device entry (only for USB/HID devices!) @@ -209,7 +209,7 @@ sub gen_usb_files sub find_usbdevs { # maybe there's an option to turn off all .* files, but anyway this is stupid - return $File::Find::prune = 1 if ($_ eq '.svn') || ($_ =~ /^\.#/); + return $File::Find::prune = 1 if ($_ eq '.svn') || ($_ =~ /^\.#/) || ($_ =~ /\.orig$/); my $nameFile=$_; my $lastComment=""; @@ -265,8 +265,8 @@ sub find_usbdevs } } - # store date (to be optimized) - # and don't overwritte actual vendor names with empty values + # store data (to be optimized) + # and don't overwrite actual vendor names with empty values if( (!$vendorName{$VendorID}) or (($vendorName{$VendorID} eq "") and ($VendorName ne "")) ) { $vendorName{$VendorID}=trim($VendorName); From 7ca12c8e253a0c3175ba4865a51213e80316b273 Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Thu, 30 Apr 2015 15:58:47 +0200 Subject: [PATCH 118/240] New upstream release --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 687fd78..09d3cfc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +nut (2.7.3-1) UNRELEASED; urgency=low + + * New upstream release + + -- Arnaud Quette Thu, 30 Apr 2015 15:56:50 +0200 + nut (2.7.2-2) UNRELEASED; urgency=low * debian/control: add new packages libnutclient0 and libnutclient-dev From c2a1ac8f1fbdcb98e7c9267ec5bf0ca0759b2acc Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Thu, 30 Apr 2015 16:01:34 +0200 Subject: [PATCH 119/240] Remove 0007-killpower-path.patch --- debian/changelog | 1 + debian/patches/0007-killpower-path.patch | 11 ----------- debian/patches/series | 1 - 3 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 debian/patches/0007-killpower-path.patch diff --git a/debian/changelog b/debian/changelog index 09d3cfc..8868573 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ nut (2.7.3-1) UNRELEASED; urgency=low * New upstream release + * debian/patches/series: remove 0007-killpower-path.patch -- Arnaud Quette Thu, 30 Apr 2015 15:56:50 +0200 diff --git a/debian/patches/0007-killpower-path.patch b/debian/patches/0007-killpower-path.patch deleted file mode 100644 index 537b585..0000000 --- a/debian/patches/0007-killpower-path.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/conf/upsmon.conf.sample.in -+++ b/conf/upsmon.conf.sample.in -@@ -196,7 +196,7 @@ DEADTIME 15 - # - # See the shutdown.txt file in the docs subdirectory for more information. - --POWERDOWNFLAG @CONFPATH@/killpower -+POWERDOWNFLAG /etc/killpower - - # -------------------------------------------------------------------------- - # NOTIFYMSG - change messages sent by upsmon when certain events occur diff --git a/debian/patches/series b/debian/patches/series index 5046408..14e0996 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -2,5 +2,4 @@ 0002-nut-monitor-paths.patch 0004-fix-systemd-service.patch 0006-ups-conf-maxretry.patch -0007-killpower-path.patch 0008-drop-w3c-icons.patch From f5439265c8b3a6c1dd4669edbdab802448c9231f Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 16 Jul 2016 10:47:56 +0200 Subject: [PATCH 120/240] debian/gbp.conf: Switch back the branch to the "debian" one --- debian/changelog | 6 +++++- debian/gbp.conf | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 0088030..8db4090 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,6 @@ nut (2.7.3-1) UNRELEASED; urgency=low + [ Arnaud Quette ] * New upstream release * debian/patches/series: remove 0007-killpower-path.patch * debian/control: add new packages libnutclient0 and libnutclient-dev @@ -8,7 +9,10 @@ nut (2.7.3-1) UNRELEASED; urgency=low debian/libnutclient-dev.install, debian/libnutclient-dev.manpages: created for the new packages - -- Arnaud Quette Mon, 20 Oct 2014 20:41:47 +0200 + [ Laurent Bigonville ] + * debian/gbp.conf: Switch back the branch to the "debian" one + + -- Laurent Bigonville Sat, 16 Jul 2016 10:52:14 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/gbp.conf b/debian/gbp.conf index 2e63610..6837223 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -1,5 +1,5 @@ [DEFAULT] -debian-branch = debian-jessie +debian-branch = debian upstream-branch = upstream pristine-tar = True From f07d79cd65317bc7ab50c0637fe3b753feda35b5 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 16 Jul 2016 10:57:26 +0200 Subject: [PATCH 121/240] Drop d/p/0009-fix-favorites-permissions.patch, merged upstream --- debian/changelog | 3 +- .../0009-fix-favorites-permissions.patch | 69 ------------------- debian/patches/series | 1 - 3 files changed, 2 insertions(+), 71 deletions(-) delete mode 100644 debian/patches/0009-fix-favorites-permissions.patch diff --git a/debian/changelog b/debian/changelog index 8db4090..1bdd65c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -11,8 +11,9 @@ nut (2.7.3-1) UNRELEASED; urgency=low [ Laurent Bigonville ] * debian/gbp.conf: Switch back the branch to the "debian" one + * Drop d/p/0009-fix-favorites-permissions.patch, merged upstream - -- Laurent Bigonville Sat, 16 Jul 2016 10:52:14 +0200 + -- Laurent Bigonville Sat, 16 Jul 2016 10:56:38 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/patches/0009-fix-favorites-permissions.patch b/debian/patches/0009-fix-favorites-permissions.patch deleted file mode 100644 index 7128250..0000000 --- a/debian/patches/0009-fix-favorites-permissions.patch +++ /dev/null @@ -1,69 +0,0 @@ -If a ~/.nut-monitor directory is found with insecure permissions, change them to 0700. ---- a/scripts/python/app/NUT-Monitor -+++ b/scripts/python/app/NUT-Monitor -@@ -29,6 +29,7 @@ - import sys - import base64 - import os, os.path -+import stat - import platform - import time - import threading -@@ -44,21 +45,23 @@ - - class interface : - -- __widgets = {} -- __callbacks = {} -- __favorites = {} -- __favorites_file = None -- __favorites_path = "" -- __fav_menu_items = list() -- __window_visible = True -- __glade_file = None -- __connected = False -- __ups_handler = None -- __ups_commands = None -- __ups_vars = None -- __ups_rw_vars = None -- __gui_thread = None -- __current_ups = None -+ DESIRED_FAVORITES_DIRECTORY_MODE = 0700 -+ -+ __widgets = {} -+ __callbacks = {} -+ __favorites = {} -+ __favorites_file = None -+ __favorites_path = "" -+ __fav_menu_items = list() -+ __window_visible = True -+ __glade_file = None -+ __connected = False -+ __ups_handler = None -+ __ups_commands = None -+ __ups_vars = None -+ __ups_rw_vars = None -+ __gui_thread = None -+ __current_ups = None - - def __init__( self ) : - -@@ -528,6 +531,9 @@ - return - - try : -+ if ( not stat.S_IMODE( os.stat( self.__favorites_path ).st_mode ) == self.DESIRED_FAVORITES_DIRECTORY_MODE ) : # unsafe pre-1.2 directory found -+ os.chmod( self.__favorites_path, self.DESIRED_FAVORITES_DIRECTORY_MODE ) -+ - conf = ConfigParser.ConfigParser() - conf.read( self.__favorites_file ) - for current in conf.sections() : -@@ -573,7 +579,7 @@ - # If path does not exists, try to create it - if ( not os.path.exists( self.__favorites_file ) ) : - try : -- os.makedirs( self.__favorites_path, mode=0700 ) -+ os.makedirs( self.__favorites_path, mode=self.DESIRED_FAVORITES_DIRECTORY_MODE ) - except : - self.gui_status_message( _("Error while creating configuration folder (%s)") % sys.exc_info()[1] ) - diff --git a/debian/patches/series b/debian/patches/series index 984c24b..14e0996 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -3,4 +3,3 @@ 0004-fix-systemd-service.patch 0006-ups-conf-maxretry.patch 0008-drop-w3c-icons.patch -0009-fix-favorites-permissions.patch From 85836f6836b89033697c1a283c6f7bdc98568880 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 16 Jul 2016 11:00:39 +0200 Subject: [PATCH 122/240] d/p/0002-nut-monitor-paths.patch, d/p/0006-ups-conf-maxretry.patch: Refreshed --- debian/changelog | 4 +++- debian/patches/0002-nut-monitor-paths.patch | 8 ++++---- debian/patches/0006-ups-conf-maxretry.patch | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1bdd65c..16bb9f1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,8 +12,10 @@ nut (2.7.3-1) UNRELEASED; urgency=low [ Laurent Bigonville ] * debian/gbp.conf: Switch back the branch to the "debian" one * Drop d/p/0009-fix-favorites-permissions.patch, merged upstream + * d/p/0002-nut-monitor-paths.patch, d/p/0006-ups-conf-maxretry.patch: + Refreshed - -- Laurent Bigonville Sat, 16 Jul 2016 10:56:38 +0200 + -- Laurent Bigonville Sat, 16 Jul 2016 11:00:06 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/patches/0002-nut-monitor-paths.patch b/debian/patches/0002-nut-monitor-paths.patch index 00fd0de..88294d6 100644 --- a/debian/patches/0002-nut-monitor-paths.patch +++ b/debian/patches/0002-nut-monitor-paths.patch @@ -1,6 +1,6 @@ --- a/scripts/python/app/NUT-Monitor +++ b/scripts/python/app/NUT-Monitor -@@ -70,7 +70,7 @@ +@@ -76,7 +76,7 @@ class interface : ( cmd_opts, args ) = opt_parser.parse_args() @@ -9,7 +9,7 @@ self.__widgets["interface"] = gtk.glade.XML( self.__glade_file, "window1", APP ) self.__widgets["main_window"] = self.__widgets["interface"].get_widget("window1") -@@ -103,11 +103,11 @@ +@@ -109,11 +109,11 @@ class interface : # Create the tray icon and connect it to the show/hide method... self.__widgets["status_icon"] = gtk.StatusIcon() @@ -23,7 +23,7 @@ # Define interface callbacks actions self.__callbacks = { "on_window1_destroy" : self.quit, -@@ -265,8 +265,8 @@ +@@ -271,8 +271,8 @@ class interface : #------------------------------------------------------------------- # Change the status icon and tray icon def change_status_icon( self, icon="on_line", blink=False ) : @@ -34,7 +34,7 @@ self.__widgets["status_icon"].set_blinking( blink ) #------------------------------------------------------------------- -@@ -719,9 +719,9 @@ +@@ -728,9 +728,9 @@ class interface : for k,v in vars.iteritems() : if ( rwvars.has_key( k ) ) : diff --git a/debian/patches/0006-ups-conf-maxretry.patch b/debian/patches/0006-ups-conf-maxretry.patch index dd8ef93..fae5806 100644 --- a/debian/patches/0006-ups-conf-maxretry.patch +++ b/debian/patches/0006-ups-conf-maxretry.patch @@ -25,7 +25,7 @@ # # These directives are common to all drivers that support ups.conf: # -@@ -102,3 +120,6 @@ +@@ -117,3 +135,6 @@ # # To find out if your driver supports any extra settings, start it with # the -h option and/or read the driver's documentation. From e9487070937b148098e21e3cc5be732bf0c994d5 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 16 Jul 2016 11:07:56 +0200 Subject: [PATCH 123/240] debian/control: Bump Standards-Version to 3.9.8 (no further changes) --- debian/changelog | 3 ++- debian/control | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 16bb9f1..a427732 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,8 +14,9 @@ nut (2.7.3-1) UNRELEASED; urgency=low * Drop d/p/0009-fix-favorites-permissions.patch, merged upstream * d/p/0002-nut-monitor-paths.patch, d/p/0006-ups-conf-maxretry.patch: Refreshed + * debian/control: Bump Standards-Version to 3.9.8 (no further changes) - -- Laurent Bigonville Sat, 16 Jul 2016 11:00:06 +0200 + -- Laurent Bigonville Sat, 16 Jul 2016 11:07:41 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/control b/debian/control index e6a2fbe..15d8f9b 100644 --- a/debian/control +++ b/debian/control @@ -22,7 +22,7 @@ Build-Depends-Indep: asciidoc (>= 8.6.3), docbook-xsl, dblatex (>= 0.2.5), libxml2-utils -Standards-Version: 3.9.5 +Standards-Version: 3.9.8 Homepage: http://www.networkupstools.org/ Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/nut.git;a=summary Vcs-Git: git://anonscm.debian.org/collab-maint/nut.git From b762a3580ed2169f9e494579d3c99e777db075c6 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sat, 16 Jul 2016 11:12:54 +0200 Subject: [PATCH 124/240] debian/control: Add dh-python to the build-dependencies --- debian/changelog | 3 ++- debian/control | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index a427732..03f691c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,8 +15,9 @@ nut (2.7.3-1) UNRELEASED; urgency=low * d/p/0002-nut-monitor-paths.patch, d/p/0006-ups-conf-maxretry.patch: Refreshed * debian/control: Bump Standards-Version to 3.9.8 (no further changes) + * debian/control: Add dh-python to the build-dependencies - -- Laurent Bigonville Sat, 16 Jul 2016 11:07:41 +0200 + -- Laurent Bigonville Sat, 16 Jul 2016 11:12:46 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/control b/debian/control index 15d8f9b..698cdee 100644 --- a/debian/control +++ b/debian/control @@ -7,6 +7,7 @@ Build-Depends: debhelper (>= 8.1.3), cdbs (>= 0.4.122~), autotools-dev, dh-autoreconf, + dh-python, dh-systemd (>= 1.14), libgd-dev | libgd2-xpm-dev | libgd2-noxpm-dev, libsnmp-dev | libsnmp9-dev, From 79b4afb095620785ef8325194a14ae772970d857 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 17 Jul 2016 18:07:49 +0200 Subject: [PATCH 125/240] Revert "Systemd units are now installed in multi-arch path" The unit files are again installed in the systemdsystemunitdir path This reverts commit 4730afcab2ecc95e00fd4ac6f3e094bd0bbf3340. --- debian/rules | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/debian/rules b/debian/rules index 0c837fc..f7dfd8a 100755 --- a/debian/rules +++ b/debian/rules @@ -90,13 +90,13 @@ common-install-arch:: # Install systemd files only on systems where it's supported ifeq (linux,$(DEB_HOST_ARCH_OS)) - install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-monitor.service \ + install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-monitor.service \ $(CURDIR)/debian/nut-client/lib/systemd/system/nut-monitor.service - install -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system-shutdown/nutshutdown \ + install -D $(CURDIR)/debian/tmp/lib/systemd/system-shutdown/nutshutdown \ $(CURDIR)/debian/nut-server/lib/systemd/system-shutdown/nutshutdown - install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-driver.service \ + install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-driver.service \ $(CURDIR)/debian/nut-server/lib/systemd/system/nut-driver.service - install -m 644 -D $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/systemd/system/nut-server.service \ + install -m 644 -D $(CURDIR)/debian/tmp/lib/systemd/system/nut-server.service \ $(CURDIR)/debian/nut-server/lib/systemd/system/nut-server.service # Add a symlink to mask the LSB initscript From 38537675bae2f358c547f14f303e7bca53e9b3f1 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 17 Jul 2016 18:10:22 +0200 Subject: [PATCH 126/240] Bump debhelper compatibility to 9 --- debian/changelog | 3 ++- debian/compat | 2 +- debian/control | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 03f691c..3f2b378 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,8 +16,9 @@ nut (2.7.3-1) UNRELEASED; urgency=low Refreshed * debian/control: Bump Standards-Version to 3.9.8 (no further changes) * debian/control: Add dh-python to the build-dependencies + * Bump debhelper compatibility to 9 - -- Laurent Bigonville Sat, 16 Jul 2016 11:12:46 +0200 + -- Laurent Bigonville Sun, 17 Jul 2016 18:10:02 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/compat b/debian/compat index 45a4fb7..ec63514 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -8 +9 diff --git a/debian/control b/debian/control index 698cdee..b864c02 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: admin Priority: optional Maintainer: Arnaud Quette Uploaders: Laurent Bigonville -Build-Depends: debhelper (>= 8.1.3), +Build-Depends: debhelper (>= 9), cdbs (>= 0.4.122~), autotools-dev, dh-autoreconf, From 1a30e36c57bd509f9ff7b4d544946d939228d5c1 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 17 Jul 2016 19:06:03 +0200 Subject: [PATCH 127/240] d/p/0009-fix-nutshutdown-install.patch: Install the nutshutdown script in the correct path --- debian/changelog | 4 +++- debian/patches/0009-fix-nutshutdown-install.patch | 11 +++++++++++ debian/patches/series | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 debian/patches/0009-fix-nutshutdown-install.patch diff --git a/debian/changelog b/debian/changelog index 3f2b378..d773150 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,8 +17,10 @@ nut (2.7.3-1) UNRELEASED; urgency=low * debian/control: Bump Standards-Version to 3.9.8 (no further changes) * debian/control: Add dh-python to the build-dependencies * Bump debhelper compatibility to 9 + * d/p/0009-fix-nutshutdown-install.patch: Install the nutshutdown script in + the correct path - -- Laurent Bigonville Sun, 17 Jul 2016 18:10:02 +0200 + -- Laurent Bigonville Sun, 17 Jul 2016 19:05:43 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/patches/0009-fix-nutshutdown-install.patch b/debian/patches/0009-fix-nutshutdown-install.patch new file mode 100644 index 0000000..732cc22 --- /dev/null +++ b/debian/patches/0009-fix-nutshutdown-install.patch @@ -0,0 +1,11 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -1065,7 +1065,7 @@ dnl Override installation directory, wit + dnl prefix. This is needed for 'distcheck*' targets, otherwise + dnl files will try to get intalled to the actual system directories + if test -n "${systemdsystemunitdir}"; then +- systemdsystemshutdowndir="${libdir}/systemd/system-shutdown" ++ systemdsystemshutdowndir=`$PKG_CONFIG --variable=systemdshutdowndir systemd` + AC_MSG_RESULT(using ${systemdsystemunitdir}) + else + AC_MSG_RESULT(no) diff --git a/debian/patches/series b/debian/patches/series index 14e0996..0b7915d 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -3,3 +3,4 @@ 0004-fix-systemd-service.patch 0006-ups-conf-maxretry.patch 0008-drop-w3c-icons.patch +0009-fix-nutshutdown-install.patch From b0b61548a47b153b1ce6205bb9ce47edbb32910f Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Sun, 17 Jul 2016 19:20:31 +0200 Subject: [PATCH 128/240] debian/nut-server.install: 52-nut-usbups.rules file has been renamed to 62-nut-usbups.rules --- debian/changelog | 4 +++- debian/nut-server.install | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index d773150..f3f57c3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,8 +19,10 @@ nut (2.7.3-1) UNRELEASED; urgency=low * Bump debhelper compatibility to 9 * d/p/0009-fix-nutshutdown-install.patch: Install the nutshutdown script in the correct path + * debian/nut-server.install: 52-nut-usbups.rules file has been renamed to + 62-nut-usbups.rules - -- Laurent Bigonville Sun, 17 Jul 2016 19:05:43 +0200 + -- Laurent Bigonville Sun, 17 Jul 2016 19:20:10 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/nut-server.install b/debian/nut-server.install index bbc50da..8ea1b3c 100644 --- a/debian/nut-server.install +++ b/debian/nut-server.install @@ -3,7 +3,7 @@ debian/tmp/lib/nut/upsd debian/tmp/sbin/upsdrvctl debian/tmp/usr/share/nut/cmdvartab debian/tmp/usr/share/nut/driver.list -debian/tmp/*/udev/rules.d/52-nut-usbups.rules +debian/tmp/*/udev/rules.d/62-nut-usbups.rules debian/tmp/etc/avahi/services/nut.service debian/tmp/etc/nut/ups.conf debian/tmp/etc/nut/upsd.conf From 237be91ad92a727fd1502f0f2eb70bc9163afbe6 Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 18 Jul 2016 01:37:33 +0200 Subject: [PATCH 129/240] debian/libnutclient0.symbols, debian/libupsclient4.symbols: Adjust the .symbols files --- debian/changelog | 4 +- debian/libnutclient0.symbols | 428 +++++++++++++++++++---------------- debian/libupsclient4.symbols | 2 + 3 files changed, 235 insertions(+), 199 deletions(-) diff --git a/debian/changelog b/debian/changelog index f3f57c3..2e7094e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -21,8 +21,10 @@ nut (2.7.3-1) UNRELEASED; urgency=low the correct path * debian/nut-server.install: 52-nut-usbups.rules file has been renamed to 62-nut-usbups.rules + * debian/libnutclient0.symbols, debian/libupsclient4.symbols: Adjust the + .symbols files - -- Laurent Bigonville Sun, 17 Jul 2016 19:20:10 +0200 + -- Laurent Bigonville Mon, 18 Jul 2016 01:37:16 +0200 nut (2.7.2-4) unstable; urgency=medium diff --git a/debian/libnutclient0.symbols b/debian/libnutclient0.symbols index ccc230c..66c845d 100644 --- a/debian/libnutclient0.symbols +++ b/debian/libnutclient0.symbols @@ -1,199 +1,231 @@ libnutclient.so.0 libnutclient0 #MINVER# - (c++)"nut::IOException::~IOException()@Base" 2.7.2 - (c++)"nut::NutException::NutException(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::NutException::~NutException()@Base" 2.7.2 - (c++)"nut::SystemException::err()@Base" 2.7.2 - (c++)"nut::SystemException::SystemException()@Base" 2.7.2 - (c++)"nut::SystemException::~SystemException()@Base" 2.7.2 - (c++)"nut::TimeoutException::TimeoutException()@Base" 2.7.2 - (c++)"nut::TimeoutException::~TimeoutException()@Base" 2.7.2 - (c++)"nut::UnknownHostException::UnknownHostException()@Base" 2.7.2 - (c++)"nut::UnknownHostException::~UnknownHostException()@Base" 2.7.2 - (c++)"nut::NotConnectedException::NotConnectedException()@Base" 2.7.2 - (c++)"nut::NotConnectedException::~NotConnectedException()@Base" 2.7.2 - (c++)"nut::Client::getDevices()@Base" 2.7.2 - (c++)"nut::Client::hasDeviceCommand(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Client::hasDeviceVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Client::getDeviceVariableValues(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Client::getDevice(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Client::hasDevice(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Client::Client()@Base" 2.7.2 - (c++)"nut::Client::~Client()@Base" 2.7.2 - (c++)"nut::Device::getCommand(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Device::getCommands()@Base" 2.7.2 - (c++)"nut::Device::getVariable(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Device::setVariable(std::basic_string, std::allocator > const&, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 - (c++)"nut::Device::setVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Device::getNumLogins()@Base" 2.7.2 - (c++)"nut::Device::getVariables()@Base" 2.7.2 - (c++)"nut::Device::executeCommand(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Device::forcedShutdown()@Base" 2.7.2 - (c++)"nut::Device::getDescription()@Base" 2.7.2 - (c++)"nut::Device::getRWVariables()@Base" 2.7.2 - (c++)"nut::Device::getCommandNames()@Base" 2.7.2 - (c++)"nut::Device::getVariableNames()@Base" 2.7.2 - (c++)"nut::Device::getVariableValue(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Device::getVariableValues()@Base" 2.7.2 - (c++)"nut::Device::getRWVariableNames()@Base" 2.7.2 - (c++)"nut::Device::login()@Base" 2.7.2 - (c++)"nut::Device::master()@Base" 2.7.2 - (c++)"nut::Device::getClient()@Base" 2.7.2 - (c++)"nut::Device::Device(nut::Client*, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Device::Device(nut::Device const&)@Base" 2.7.2 - (c++)"nut::Device::~Device()@Base" 2.7.2 - (c++)"nut::Command::getDescription()@Base" 2.7.2 - (c++)"nut::Command::execute()@Base" 2.7.2 - (c++)"nut::Command::getDevice()@Base" 2.7.2 - (c++)"nut::Command::Command(nut::Device*, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Command::Command(nut::Command const&)@Base" 2.7.2 - (c++)"nut::Command::~Command()@Base" 2.7.2 - (c++)"nut::Variable::getDescription()@Base" 2.7.2 - (c++)"nut::Variable::getValue()@Base" 2.7.2 - (c++)"nut::Variable::setValue(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Variable::getDevice()@Base" 2.7.2 - (c++)"nut::Variable::setValues(std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 - (c++)"nut::Variable::Variable(nut::Device*, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::Variable::Variable(nut::Variable const&)@Base" 2.7.2 - (c++)"nut::Variable::~Variable()@Base" 2.7.2 - (c++)"nut::internal::Socket::disconnect()@Base" 2.7.2 - (c++)"nut::internal::Socket::setTimeout(long)@Base" 2.7.2 - (c++)"nut::internal::Socket::read(void*, unsigned long)@Base" 2.7.2 - (c++)"nut::internal::Socket::read()@Base" 2.7.2 - (c++)"nut::internal::Socket::write(void const*, unsigned long)@Base" 2.7.2 - (c++)"nut::internal::Socket::write(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::internal::Socket::connect(std::basic_string, std::allocator > const&, int)@Base" 2.7.2 - (c++)"nut::internal::Socket::Socket()@Base" 2.7.2 - (c++)"nut::TcpClient::disconnect()@Base" 2.7.2 - (c++)"nut::TcpClient::setTimeout(long)@Base" 2.7.2 - (c++)"nut::TcpClient::detectError(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::deviceLogin(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::authenticate(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::deviceMaster(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceNames()@Base" 2.7.2 - (c++)"nut::TcpClient::setDeviceVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::setDeviceVariable(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::deviceGetNumLogins(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::deviceForcedShutdown(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::executeDeviceCommand(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceDescription(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceCommandNames(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceVariableNames(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceVariableValue(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceVariableValues(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceRWVariableNames(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceCommandDescription(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::getDeviceVariableDescription(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::get(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::list(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::escape(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::logout()@Base" 2.7.2 - (c++)"nut::TcpClient::connect(std::basic_string, std::allocator > const&, int)@Base" 2.7.2 - (c++)"nut::TcpClient::connect()@Base" 2.7.2 - (c++)"nut::TcpClient::explode(std::basic_string, std::allocator > const&, unsigned long)@Base" 2.7.2 - (c++)"nut::TcpClient::getDevice(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::sendQuery(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"nut::TcpClient::TcpClient(std::basic_string, std::allocator > const&, int)@Base" 2.7.2 - (c++)"nut::TcpClient::TcpClient()@Base" 2.7.2 - (c++)"nut::TcpClient::~TcpClient()@Base" 2.7.2 - (c++)"nut::NutException::str() const@Base" 2.7.2 - (c++)"nut::NutException::what() const@Base" 2.7.2 - (c++)"nut::Device::isOk() const@Base" 2.7.2 - (c++)"nut::Device::getName() const@Base" 2.7.2 - (c++)"nut::Device::getClient() const@Base" 2.7.2 - (c++)"nut::Device::operator bool() const@Base" 2.7.2 - (c++)"nut::Device::operator==(nut::Device const&) const@Base" 2.7.2 - (c++)"nut::Device::operator<(nut::Device const&) const@Base" 2.7.2 - (c++)"nut::Device::operator!() const@Base" 2.7.2 - (c++)"nut::Command::isOk() const@Base" 2.7.2 - (c++)"nut::Command::getName() const@Base" 2.7.2 - (c++)"nut::Command::getDevice() const@Base" 2.7.2 - (c++)"nut::Command::operator bool() const@Base" 2.7.2 - (c++)"nut::Command::operator==(nut::Command const&) const@Base" 2.7.2 - (c++)"nut::Command::operator<(nut::Command const&) const@Base" 2.7.2 - (c++)"nut::Command::operator!() const@Base" 2.7.2 - (c++)"nut::Variable::isOk() const@Base" 2.7.2 - (c++)"nut::Variable::getName() const@Base" 2.7.2 - (c++)"nut::Variable::getDevice() const@Base" 2.7.2 - (c++)"nut::Variable::operator bool() const@Base" 2.7.2 - (c++)"nut::Variable::operator==(nut::Variable const&) const@Base" 2.7.2 - (c++)"nut::Variable::operator<(nut::Variable const&) const@Base" 2.7.2 - (c++)"nut::Variable::operator!() const@Base" 2.7.2 - (c++)"nut::internal::Socket::isConnected() const@Base" 2.7.2 - (c++)"nut::TcpClient::getTimeout() const@Base" 2.7.2 - (c++)"nut::TcpClient::isConnected() const@Base" 2.7.2 - (c++)"nut::TcpClient::getHost() const@Base" 2.7.2 - (c++)"nut::TcpClient::getPort() const@Base" 2.7.2 - (c++)"char* std::basic_string, std::allocator >::_S_construct(char*, char*, std::allocator const&, std::forward_iterator_tag)@Base" 2.7.2 - (c++)"void std::_Destroy_aux::__destroy, std::allocator >*>(std::basic_string, std::allocator >*, std::basic_string, std::allocator >*)@Base" 2.7.2 - (c++)"std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >::~pair()@Base" 2.7.2 - (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > >::_M_insert_aux(__gnu_cxx::__normal_iterator, std::allocator >, std::allocator, std::allocator > > >*, std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > > >, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 - (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > >::~vector()@Base" 2.7.2 - (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::_M_insert_aux(__gnu_cxx::__normal_iterator, std::allocator >*, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::~vector()@Base" 2.7.2 - (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::operator=(std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::less, std::allocator >::_M_insert_unique(nut::Variable const&)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::allocator >, std::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::_M_insert_unique(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::allocator >, std::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::find(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::allocator >, std::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::_M_erase(std::_Rb_tree_node, std::allocator > >*)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_insert_(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > const&)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_get_insert_unique_pos(std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_erase(std::_Rb_tree_node, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >*)@Base" 2.7.2 - (c++)"std::basic_string, std::allocator > std::operator+, std::allocator >(char const*, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)@Base" 2.7.2 - (c++)"typeinfo for nut::IOException@Base" 2.7.2 - (c++)"typeinfo for nut::NutException@Base" 2.7.2 - (c++)"typeinfo for nut::SystemException@Base" 2.7.2 - (c++)"typeinfo for nut::TimeoutException@Base" 2.7.2 - (c++)"typeinfo for nut::UnknownHostException@Base" 2.7.2 - (c++)"typeinfo for nut::NotConnectedException@Base" 2.7.2 - (c++)"typeinfo for nut::Client@Base" 2.7.2 - (c++)"typeinfo for nut::TcpClient@Base" 2.7.2 - (c++)"typeinfo name for nut::IOException@Base" 2.7.2 - (c++)"typeinfo name for nut::NutException@Base" 2.7.2 - (c++)"typeinfo name for nut::SystemException@Base" 2.7.2 - (c++)"typeinfo name for nut::TimeoutException@Base" 2.7.2 - (c++)"typeinfo name for nut::UnknownHostException@Base" 2.7.2 - (c++)"typeinfo name for nut::NotConnectedException@Base" 2.7.2 - (c++)"typeinfo name for nut::Client@Base" 2.7.2 - (c++)"typeinfo name for nut::TcpClient@Base" 2.7.2 - (c++)"vtable for nut::IOException@Base" 2.7.2 - (c++)"vtable for nut::NutException@Base" 2.7.2 - (c++)"vtable for nut::SystemException@Base" 2.7.2 - (c++)"vtable for nut::TimeoutException@Base" 2.7.2 - (c++)"vtable for nut::UnknownHostException@Base" 2.7.2 - (c++)"vtable for nut::NotConnectedException@Base" 2.7.2 - (c++)"vtable for nut::Client@Base" 2.7.2 - (c++)"vtable for nut::TcpClient@Base" 2.7.2 - nutclient_authenticate@Base 2.7.2 - nutclient_destroy@Base 2.7.2 - nutclient_device_forced_shutdown@Base 2.7.2 - nutclient_device_login@Base 2.7.2 - nutclient_device_master@Base 2.7.2 - nutclient_execute_device_command@Base 2.7.2 - nutclient_get_device_command_description@Base 2.7.2 - nutclient_get_device_commands@Base 2.7.2 - nutclient_get_device_description@Base 2.7.2 - nutclient_get_device_num_logins@Base 2.7.2 - nutclient_get_device_rw_variables@Base 2.7.2 - nutclient_get_device_variable_description@Base 2.7.2 - nutclient_get_device_variable_values@Base 2.7.2 - nutclient_get_device_variables@Base 2.7.2 - nutclient_get_devices@Base 2.7.2 - nutclient_has_device@Base 2.7.2 - nutclient_has_device_command@Base 2.7.2 - nutclient_has_device_variable@Base 2.7.2 - nutclient_logout@Base 2.7.2 - nutclient_set_device_variable_value@Base 2.7.2 - nutclient_set_device_variable_values@Base 2.7.2 - nutclient_tcp_create_client@Base 2.7.2 - nutclient_tcp_disconnect@Base 2.7.2 - nutclient_tcp_get_timeout@Base 2.7.2 - nutclient_tcp_is_connected@Base 2.7.2 - nutclient_tcp_reconnect@Base 2.7.2 - nutclient_tcp_set_timeout@Base 2.7.2 - strarr_alloc@Base 2.7.2 - strarr_free@Base 2.7.2 + (c++)"nut::IOException::~IOException()@Base" 2.7.3 + (c++)"nut::IOException::~IOException()@Base" 2.7.3 + (c++)"nut::IOException::~IOException()@Base" 2.7.3 + (c++)"nut::NutException::NutException(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::NutException::NutException(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::NutException::~NutException()@Base" 2.7.3 + (c++)"nut::NutException::~NutException()@Base" 2.7.3 + (c++)"nut::NutException::~NutException()@Base" 2.7.3 + (c++)"nut::SystemException::err[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::SystemException::SystemException()@Base" 2.7.3 + (c++)"nut::SystemException::SystemException()@Base" 2.7.3 + (c++)"nut::SystemException::~SystemException()@Base" 2.7.3 + (c++)"nut::SystemException::~SystemException()@Base" 2.7.3 + (c++)"nut::SystemException::~SystemException()@Base" 2.7.3 + (c++)"nut::TimeoutException::TimeoutException()@Base" 2.7.3 + (c++)"nut::TimeoutException::TimeoutException()@Base" 2.7.3 + (c++)"nut::TimeoutException::~TimeoutException()@Base" 2.7.3 + (c++)"nut::TimeoutException::~TimeoutException()@Base" 2.7.3 + (c++)"nut::TimeoutException::~TimeoutException()@Base" 2.7.3 + (c++)"nut::UnknownHostException::UnknownHostException()@Base" 2.7.3 + (c++)"nut::UnknownHostException::UnknownHostException()@Base" 2.7.3 + (c++)"nut::UnknownHostException::~UnknownHostException()@Base" 2.7.3 + (c++)"nut::UnknownHostException::~UnknownHostException()@Base" 2.7.3 + (c++)"nut::UnknownHostException::~UnknownHostException()@Base" 2.7.3 + (c++)"nut::NotConnectedException::NotConnectedException()@Base" 2.7.3 + (c++)"nut::NotConnectedException::NotConnectedException()@Base" 2.7.3 + (c++)"nut::NotConnectedException::~NotConnectedException()@Base" 2.7.3 + (c++)"nut::NotConnectedException::~NotConnectedException()@Base" 2.7.3 + (c++)"nut::NotConnectedException::~NotConnectedException()@Base" 2.7.3 + (c++)"nut::Client::getDevices()@Base" 2.7.3 + (c++)"nut::Client::hasDeviceCommand(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Client::hasDeviceVariable(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Client::getDeviceVariableValues(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Client::getDevice(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Client::hasDevice(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Client::Client()@Base" 2.7.3 + (c++)"nut::Client::Client()@Base" 2.7.3 + (c++)"nut::Client::~Client()@Base" 2.7.3 + (c++)"nut::Client::~Client()@Base" 2.7.3 + (c++)"nut::Device::getCommand(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Device::getCommands()@Base" 2.7.3 + (c++)"nut::Device::getVariable(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Device::setVariable(std::__cxx11::basic_string, std::allocator > const&, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.3 + (c++)"nut::Device::setVariable(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Device::getNumLogins()@Base" 2.7.3 + (c++)"nut::Device::getVariables()@Base" 2.7.3 + (c++)"nut::Device::executeCommand(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Device::forcedShutdown()@Base" 2.7.3 + (c++)"nut::Device::getDescription[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Device::getRWVariables()@Base" 2.7.3 + (c++)"nut::Device::getCommandNames[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Device::getVariableNames[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Device::getVariableValue(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Device::getVariableValues[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Device::getRWVariableNames[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Device::login()@Base" 2.7.3 + (c++)"nut::Device::master()@Base" 2.7.3 + (c++)"nut::Device::getClient()@Base" 2.7.3 + (c++)"nut::Device::Device(nut::Client*, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Device::Device(nut::Device const&)@Base" 2.7.3 + (c++)"nut::Device::Device(nut::Client*, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Device::Device(nut::Device const&)@Base" 2.7.3 + (c++)"nut::Device::~Device()@Base" 2.7.3 + (c++)"nut::Device::~Device()@Base" 2.7.3 + (c++)"nut::Command::getDescription[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Command::execute()@Base" 2.7.3 + (c++)"nut::Command::getDevice()@Base" 2.7.3 + (c++)"nut::Command::Command(nut::Device*, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Command::Command(nut::Command const&)@Base" 2.7.3 + (c++)"nut::Command::Command(nut::Device*, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Command::Command(nut::Command const&)@Base" 2.7.3 + (c++)"nut::Command::~Command()@Base" 2.7.3 + (c++)"nut::Command::~Command()@Base" 2.7.3 + (c++)"nut::Variable::getDescription[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Variable::getValue[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::Variable::setValue(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Variable::getDevice()@Base" 2.7.3 + (c++)"nut::Variable::setValues(std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.3 + (c++)"nut::Variable::Variable(nut::Device*, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Variable::Variable(nut::Variable const&)@Base" 2.7.3 + (c++)"nut::Variable::Variable(nut::Device*, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::Variable::Variable(nut::Variable const&)@Base" 2.7.3 + (c++)"nut::Variable::~Variable()@Base" 2.7.3 + (c++)"nut::Variable::~Variable()@Base" 2.7.3 + (c++)"nut::internal::Socket::disconnect()@Base" 2.7.3 + (c++)"nut::internal::Socket::setTimeout(long)@Base" 2.7.3 + (c++)"nut::internal::Socket::read[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::internal::Socket::read(void*, unsigned long)@Base" 2.7.3 + (c++)"nut::internal::Socket::write(void const*, unsigned long)@Base" 2.7.3 + (c++)"nut::internal::Socket::write(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::internal::Socket::connect(std::__cxx11::basic_string, std::allocator > const&, int)@Base" 2.7.3 + (c++)"nut::internal::Socket::Socket()@Base" 2.7.3 + (c++)"nut::internal::Socket::Socket()@Base" 2.7.3 + (c++)"nut::TcpClient::disconnect()@Base" 2.7.3 + (c++)"nut::TcpClient::setTimeout(long)@Base" 2.7.3 + (c++)"nut::TcpClient::detectError(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::deviceLogin(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::authenticate(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::deviceMaster(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceNames[abi:cxx11]()@Base" 2.7.3 + (c++)"nut::TcpClient::setDeviceVariable(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::setDeviceVariable(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::deviceGetNumLogins(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::deviceForcedShutdown(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::executeDeviceCommand(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceDescription(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceCommandNames(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceVariableNames(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceVariableValue(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceVariableValues(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceRWVariableNames(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceCommandDescription(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::getDeviceVariableDescription(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::get(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::list(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::escape(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::logout()@Base" 2.7.3 + (c++)"nut::TcpClient::connect(std::__cxx11::basic_string, std::allocator > const&, int)@Base" 2.7.3 + (c++)"nut::TcpClient::connect()@Base" 2.7.3 + (c++)"nut::TcpClient::explode(std::__cxx11::basic_string, std::allocator > const&, unsigned long)@Base" 2.7.3 + (c++)"nut::TcpClient::getDevice(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::sendQuery(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"nut::TcpClient::TcpClient(std::__cxx11::basic_string, std::allocator > const&, int)@Base" 2.7.3 + (c++)"nut::TcpClient::TcpClient()@Base" 2.7.3 + (c++)"nut::TcpClient::TcpClient(std::__cxx11::basic_string, std::allocator > const&, int)@Base" 2.7.3 + (c++)"nut::TcpClient::TcpClient()@Base" 2.7.3 + (c++)"nut::TcpClient::~TcpClient()@Base" 2.7.3 + (c++)"nut::TcpClient::~TcpClient()@Base" 2.7.3 + (c++)"nut::NutException::str[abi:cxx11]() const@Base" 2.7.3 + (c++)"nut::NutException::what() const@Base" 2.7.3 + (c++)"nut::Device::isOk() const@Base" 2.7.3 + (c++)"nut::Device::getName[abi:cxx11]() const@Base" 2.7.3 + (c++)"nut::Device::getClient() const@Base" 2.7.3 + (c++)"nut::Device::operator bool() const@Base" 2.7.3 + (c++)"nut::Device::operator==(nut::Device const&) const@Base" 2.7.3 + (c++)"nut::Device::operator<(nut::Device const&) const@Base" 2.7.3 + (c++)"nut::Device::operator!() const@Base" 2.7.3 + (c++)"nut::Command::isOk() const@Base" 2.7.3 + (c++)"nut::Command::getName[abi:cxx11]() const@Base" 2.7.3 + (c++)"nut::Command::getDevice() const@Base" 2.7.3 + (c++)"nut::Command::operator bool() const@Base" 2.7.3 + (c++)"nut::Command::operator==(nut::Command const&) const@Base" 2.7.3 + (c++)"nut::Command::operator<(nut::Command const&) const@Base" 2.7.3 + (c++)"nut::Command::operator!() const@Base" 2.7.3 + (c++)"nut::Variable::isOk() const@Base" 2.7.3 + (c++)"nut::Variable::getName[abi:cxx11]() const@Base" 2.7.3 + (c++)"nut::Variable::getDevice() const@Base" 2.7.3 + (c++)"nut::Variable::operator bool() const@Base" 2.7.3 + (c++)"nut::Variable::operator==(nut::Variable const&) const@Base" 2.7.3 + (c++)"nut::Variable::operator<(nut::Variable const&) const@Base" 2.7.3 + (c++)"nut::Variable::operator!() const@Base" 2.7.3 + (c++)"nut::internal::Socket::isConnected() const@Base" 2.7.3 + (c++)"nut::TcpClient::getTimeout() const@Base" 2.7.3 + (c++)"nut::TcpClient::isConnected() const@Base" 2.7.3 + (c++)"nut::TcpClient::getHost[abi:cxx11]() const@Base" 2.7.3 + (c++)"nut::TcpClient::getPort() const@Base" 2.7.3 + (c++)"std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >::~pair()@Base" 2.7.3 + (c++)"std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >::~pair()@Base" 2.7.3 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::_M_insert_aux(__gnu_cxx::__normal_iterator, std::allocator >*, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::~vector()@Base" 2.7.3 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::~vector()@Base" 2.7.3 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >::operator=(std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.3 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > >::_M_insert_aux(__gnu_cxx::__normal_iterator, std::allocator >, std::allocator, std::allocator > > >*, std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > > >, std::vector, std::allocator >, std::allocator, std::allocator > > > const&)@Base" 2.7.3 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > >::~vector()@Base" 2.7.3 + (c++)"std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator, std::allocator >, std::allocator, std::allocator > > > > >::~vector()@Base" 2.7.3 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_insert_unique(nut::Variable const&)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::less, std::allocator >::_M_erase(std::_Rb_tree_node*)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::_M_insert_unique(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::find(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::_Identity, std::allocator > >, std::less, std::allocator > >, std::allocator, std::allocator > > >::_M_erase(std::_Rb_tree_node, std::allocator > >*)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_get_insert_unique_pos(std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > >, std::_Select1st, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > > >::_M_erase(std::_Rb_tree_node, std::allocator > const, std::vector, std::allocator >, std::allocator, std::allocator > > > > >*)@Base" 2.7.3 + (c++)"std::__cxx11::basic_string, std::allocator > std::operator+, std::allocator >(char const*, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"std::__cxx11::basic_string, std::allocator > std::operator+, std::allocator >(std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&)@Base" 2.7.3 + (c++)"typeinfo for nut::IOException@Base" 2.7.3 + (c++)"typeinfo for nut::NutException@Base" 2.7.3 + (c++)"typeinfo for nut::SystemException@Base" 2.7.3 + (c++)"typeinfo for nut::TimeoutException@Base" 2.7.3 + (c++)"typeinfo for nut::UnknownHostException@Base" 2.7.3 + (c++)"typeinfo for nut::NotConnectedException@Base" 2.7.3 + (c++)"typeinfo for nut::Client@Base" 2.7.3 + (c++)"typeinfo for nut::TcpClient@Base" 2.7.3 + (c++)"typeinfo name for nut::IOException@Base" 2.7.3 + (c++)"typeinfo name for nut::NutException@Base" 2.7.3 + (c++)"typeinfo name for nut::SystemException@Base" 2.7.3 + (c++)"typeinfo name for nut::TimeoutException@Base" 2.7.3 + (c++)"typeinfo name for nut::UnknownHostException@Base" 2.7.3 + (c++)"typeinfo name for nut::NotConnectedException@Base" 2.7.3 + (c++)"typeinfo name for nut::Client@Base" 2.7.3 + (c++)"typeinfo name for nut::TcpClient@Base" 2.7.3 + (c++)"vtable for nut::IOException@Base" 2.7.3 + (c++)"vtable for nut::NutException@Base" 2.7.3 + (c++)"vtable for nut::SystemException@Base" 2.7.3 + (c++)"vtable for nut::TimeoutException@Base" 2.7.3 + (c++)"vtable for nut::UnknownHostException@Base" 2.7.3 + (c++)"vtable for nut::NotConnectedException@Base" 2.7.3 + (c++)"vtable for nut::Client@Base" 2.7.3 + (c++)"vtable for nut::TcpClient@Base" 2.7.3 + nutclient_authenticate@Base 2.7.3 + nutclient_destroy@Base 2.7.3 + nutclient_device_forced_shutdown@Base 2.7.3 + nutclient_device_login@Base 2.7.3 + nutclient_device_master@Base 2.7.3 + nutclient_execute_device_command@Base 2.7.3 + nutclient_get_device_command_description@Base 2.7.3 + nutclient_get_device_commands@Base 2.7.3 + nutclient_get_device_description@Base 2.7.3 + nutclient_get_device_num_logins@Base 2.7.3 + nutclient_get_device_rw_variables@Base 2.7.3 + nutclient_get_device_variable_description@Base 2.7.3 + nutclient_get_device_variable_values@Base 2.7.3 + nutclient_get_device_variables@Base 2.7.3 + nutclient_get_devices@Base 2.7.3 + nutclient_has_device@Base 2.7.3 + nutclient_has_device_command@Base 2.7.3 + nutclient_has_device_variable@Base 2.7.3 + nutclient_logout@Base 2.7.3 + nutclient_set_device_variable_value@Base 2.7.3 + nutclient_set_device_variable_values@Base 2.7.3 + nutclient_tcp_create_client@Base 2.7.3 + nutclient_tcp_disconnect@Base 2.7.3 + nutclient_tcp_get_timeout@Base 2.7.3 + nutclient_tcp_is_connected@Base 2.7.3 + nutclient_tcp_reconnect@Base 2.7.3 + nutclient_tcp_set_timeout@Base 2.7.3 + strarr_alloc@Base 2.7.3 + strarr_free@Base 2.7.3 diff --git a/debian/libupsclient4.symbols b/debian/libupsclient4.symbols index c72efc4..2838c57 100644 --- a/debian/libupsclient4.symbols +++ b/debian/libupsclient4.symbols @@ -10,6 +10,7 @@ libupsclient.so.4 libupsclient4 #MINVER# fatalx@Base 2.7.2 get_user_pwent@Base 2.7.2 ltrim@Base 2.7.2 + ltrim_m@Base 2.7.3 nut_debug_level@Base 2.7.2 nut_log_level@Base 2.7.2 open_syslog@Base 2.7.2 @@ -22,6 +23,7 @@ libupsclient.so.4 libupsclient4 #MINVER# pconf_line@Base 2.7.2 pconf_parse_error@Base 2.7.2 rtrim@Base 2.7.2 + rtrim_m@Base 2.7.3 select_read@Base 2.7.2 select_write@Base 2.7.2 sendsignal@Base 2.7.2 From c9cb2187eed2bd478c9c4b73fba7c36c748680bb Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 18 Jul 2016 02:11:41 +0200 Subject: [PATCH 130/240] Imported Upstream version 2.7.4 --- ChangeLog | 1100 ++++++++++++++++++++++ INSTALL.nut | 24 +- Makefile.am | 3 +- Makefile.in | 4 +- NEWS | 120 ++- UPGRADING | 18 +- clients/Makefile.in | 1 + clients/nutclient.cpp | 5 + clients/upsrw.c | 5 + common/Makefile.am | 4 +- common/Makefile.in | 14 +- common/common.c | 41 - common/str.c | 607 ++++++++++++ conf/Makefile.in | 1 + configure | 98 +- configure.ac | 11 +- data/Makefile.in | 1 + data/cmdvartab | 40 +- data/driver.list.in | 38 +- data/html/Makefile.in | 1 + docs/FAQ.txt | 4 +- docs/Makefile.am | 9 +- docs/Makefile.in | 17 +- docs/config-notes.txt | 60 +- docs/configure.txt | 8 +- docs/documentation.txt | 4 +- docs/download.txt | 12 +- docs/features.txt | 8 +- docs/images/nut_layering.png | Bin 83521 -> 231026 bytes docs/man/Makefile.in | 1 + docs/man/al175.8 | 6 +- docs/man/apcsmart-old.8 | 6 +- docs/man/apcsmart.8 | 6 +- docs/man/apcupsd-ups.8 | 6 +- docs/man/asem.8 | 6 +- docs/man/bcmxcp.8 | 6 +- docs/man/bcmxcp_usb.8 | 6 +- docs/man/belkin.8 | 6 +- docs/man/belkinunv.8 | 6 +- docs/man/bestfcom.8 | 6 +- docs/man/bestfortress.8 | 6 +- docs/man/bestuferrups.8 | 6 +- docs/man/bestups.8 | 6 +- docs/man/blazer_ser.8 | 6 +- docs/man/blazer_usb.8 | 6 +- docs/man/clone.8 | 6 +- docs/man/dummy-ups.8 | 6 +- docs/man/etapro.8 | 6 +- docs/man/everups.8 | 6 +- docs/man/gamatronic.8 | 6 +- docs/man/genericups.8 | 6 +- docs/man/hosts.conf.5 | 6 +- docs/man/isbmex.8 | 6 +- docs/man/ivtscd.8 | 6 +- docs/man/libnutclient.3 | 6 +- docs/man/libnutclient_commands.3 | 6 +- docs/man/libnutclient_devices.3 | 6 +- docs/man/libnutclient_general.3 | 6 +- docs/man/libnutclient_misc.3 | 6 +- docs/man/libnutclient_tcp.3 | 6 +- docs/man/libnutclient_variables.3 | 6 +- docs/man/libupsclient-config.1 | 6 +- docs/man/liebert-esp2.8 | 6 +- docs/man/liebert.8 | 6 +- docs/man/macosx-ups.8 | 16 +- docs/man/macosx-ups.txt | 32 +- docs/man/masterguard.8 | 6 +- docs/man/metasys.8 | 6 +- docs/man/mge-shut.8 | 6 +- docs/man/mge-utalk.8 | 6 +- docs/man/microdowell.8 | 6 +- docs/man/netxml-ups.8 | 6 +- docs/man/nut-ipmipsu.8 | 6 +- docs/man/nut-recorder.8 | 6 +- docs/man/nut-scanner.8 | 6 +- docs/man/nut.conf.5 | 6 +- docs/man/nutdrv_atcl_usb.8 | 10 +- docs/man/nutdrv_atcl_usb.txt | 12 +- docs/man/nutdrv_qx.8 | 11 +- docs/man/nutdrv_qx.txt | 2 +- docs/man/nutscan.3 | 6 +- docs/man/nutscan_add_device_to_device.3 | 6 +- docs/man/nutscan_add_option_to_device.3 | 6 +- docs/man/nutscan_cidr_to_ip.3 | 6 +- docs/man/nutscan_display_parsable.3 | 6 +- docs/man/nutscan_display_ups_conf.3 | 6 +- docs/man/nutscan_free_device.3 | 6 +- docs/man/nutscan_get_serial_ports_list.3 | 6 +- docs/man/nutscan_init.3 | 6 +- docs/man/nutscan_new_device.3 | 6 +- docs/man/nutscan_scan_avahi.3 | 6 +- docs/man/nutscan_scan_eaton_serial.3 | 6 +- docs/man/nutscan_scan_ipmi.3 | 6 +- docs/man/nutscan_scan_nut.3 | 6 +- docs/man/nutscan_scan_snmp.3 | 6 +- docs/man/nutscan_scan_usb.3 | 6 +- docs/man/nutscan_scan_xml_http.3 | 6 +- docs/man/nutupsdrv.8 | 6 +- docs/man/oneac.8 | 6 +- docs/man/optiups.8 | 6 +- docs/man/powercom.8 | 6 +- docs/man/powerman-pdu.8 | 6 +- docs/man/powerpanel.8 | 6 +- docs/man/rhino.8 | 6 +- docs/man/richcomm_usb.8 | 6 +- docs/man/riello_ser.8 | 6 +- docs/man/riello_usb.8 | 6 +- docs/man/safenet.8 | 6 +- docs/man/snmp-ups.8 | 26 +- docs/man/snmp-ups.txt | 13 + docs/man/solis.8 | 6 +- docs/man/tripplite.8 | 6 +- docs/man/tripplite_usb.8 | 6 +- docs/man/tripplitesu.8 | 6 +- docs/man/ups.conf.5 | 20 +- docs/man/ups.conf.txt | 12 +- docs/man/upsc.8 | 6 +- docs/man/upscli_add_host_cert.3 | 6 +- docs/man/upscli_cleanup.3 | 6 +- docs/man/upscli_connect.3 | 6 +- docs/man/upscli_disconnect.3 | 6 +- docs/man/upscli_fd.3 | 6 +- docs/man/upscli_get.3 | 6 +- docs/man/upscli_init.3 | 6 +- docs/man/upscli_list_next.3 | 6 +- docs/man/upscli_list_start.3 | 6 +- docs/man/upscli_readline.3 | 6 +- docs/man/upscli_sendline.3 | 6 +- docs/man/upscli_splitaddr.3 | 6 +- docs/man/upscli_splitname.3 | 6 +- docs/man/upscli_ssl.3 | 6 +- docs/man/upscli_strerror.3 | 6 +- docs/man/upscli_upserror.3 | 6 +- docs/man/upsclient.3 | 6 +- docs/man/upscmd.8 | 6 +- docs/man/upscode2.8 | 6 +- docs/man/upsd.8 | 6 +- docs/man/upsd.conf.5 | 6 +- docs/man/upsd.users.5 | 6 +- docs/man/upsdrvctl.8 | 6 +- docs/man/upsimage.cgi.8 | 6 +- docs/man/upslog.8 | 6 +- docs/man/upsmon.8 | 6 +- docs/man/upsmon.conf.5 | 6 +- docs/man/upsrw.8 | 9 +- docs/man/upsrw.txt | 9 + docs/man/upssched.8 | 6 +- docs/man/upssched.conf.5 | 6 +- docs/man/upsset.cgi.8 | 6 +- docs/man/upsset.conf.5 | 6 +- docs/man/upsstats.cgi.8 | 6 +- docs/man/upsstats.html.5 | 6 +- docs/man/usbhid-ups.8 | 6 +- docs/man/victronups.8 | 6 +- docs/net-protocol.txt | 12 +- docs/new-clients.txt | 4 +- docs/new-drivers.txt | 8 +- docs/nut-names.txt | 318 +++++-- docs/nut-qa.txt | 3 + docs/nutdrv_qx-subdrivers.txt | 77 +- docs/packager-guide.txt | 4 +- docs/scheduling.txt | 2 +- docs/snmp-subdrivers.txt | 3 +- docs/user-manual.txt | 4 + drivers/Makefile.am | 7 +- drivers/Makefile.in | 18 +- drivers/apc-ats-mib.c | 447 +++++++++ drivers/apc-ats-mib.h | 29 + drivers/apc-hid.c | 7 +- drivers/apc-mib.c | 12 +- drivers/baytech-mib.c | 8 +- drivers/bcmxcp.c | 4 +- drivers/bcmxcp.h | 1 + drivers/bcmxcp_usb.c | 76 +- drivers/bestpower-mib.c | 4 +- drivers/blazer.c | 2 +- drivers/blazer_ser.c | 2 +- drivers/blazer_usb.c | 2 +- drivers/compaq-mib.c | 14 +- drivers/cyberpower-mib.c | 4 +- drivers/delta_ups-mib.c | 8 +- drivers/dstate.c | 6 +- drivers/dummy-ups.c | 10 +- drivers/dummy-ups.h | 3 +- drivers/eaton-ats-mib.c | 245 +++++ drivers/eaton-ats-mib.h | 30 + drivers/eaton-mib.c | 334 ++++++- drivers/hidparser.c | 28 +- drivers/hidtypes.h | 11 +- drivers/huawei-mib.c | 234 +++++ drivers/huawei-mib.h | 9 + drivers/ietf-mib.c | 20 +- drivers/ietf-mib.h | 1 + drivers/libhid.c | 10 +- drivers/libshut.c | 17 +- drivers/libshut.h | 13 +- drivers/libusb.c | 30 +- drivers/macosx-ups.c | 144 +-- drivers/mge-hid.c | 8 +- drivers/mge-mib.c | 28 +- drivers/mge-xml.c | 20 +- drivers/netvision-mib.c | 8 +- drivers/nut-libfreeipmi.c | 15 +- drivers/nutdrv_qx.c | 146 ++- drivers/nutdrv_qx.h | 28 +- drivers/nutdrv_qx_bestups.c | 128 +-- drivers/nutdrv_qx_blazer-common.c | 6 +- drivers/nutdrv_qx_blazer-common.h | 6 +- drivers/nutdrv_qx_mecer.c | 82 +- drivers/nutdrv_qx_megatec-old.c | 72 +- drivers/nutdrv_qx_megatec.c | 72 +- drivers/nutdrv_qx_mustek.c | 72 +- drivers/nutdrv_qx_q1.c | 58 +- drivers/nutdrv_qx_voltronic-qs-hex.c | 219 +++-- drivers/nutdrv_qx_voltronic-qs.c | 76 +- drivers/nutdrv_qx_voltronic.c | 552 +++++------ drivers/nutdrv_qx_zinto.c | 72 +- drivers/powercom.c | 137 ++- drivers/powerp-bin.c | 2 +- drivers/powerp-txt.c | 4 +- drivers/powerpanel.c | 2 +- drivers/powerware-mib.c | 242 ++++- drivers/powerware-mib.h | 1 + drivers/raritan-pdu-mib.c | 8 +- drivers/snmp-ups.c | 872 ++++++++++++----- drivers/snmp-ups.h | 22 +- drivers/solis.c | 346 ++++--- drivers/solis.h | 108 ++- drivers/tripplite-hid.c | 71 +- drivers/tripplitesu.c | 9 +- drivers/upscode2.c | 4 +- drivers/usb-common.h | 13 +- drivers/usbhid-ups.c | 19 +- drivers/xppc-mib.c | 4 +- include/Makefile.am | 2 +- include/Makefile.in | 3 +- include/common.h | 6 +- include/config.h.in | 6 + include/str.h | 129 +++ lib/Makefile.in | 1 + lib/README | 2 +- m4/nut_check_libnss.m4 | 7 +- scripts/Makefile.in | 1 + scripts/Solaris/Makefile.in | 1 + scripts/augeas/Makefile.in | 1 + scripts/augeas/README | 2 +- scripts/augeas/nutupsconf.aug.in | 7 + scripts/augeas/nutupsconf.aug.tpl | 5 + scripts/devd/Makefile.in | 1 + scripts/devd/nut-usb.conf.in | 20 + scripts/hotplug/Makefile.in | 1 + scripts/hotplug/libhid.usermap | 6 + scripts/python/Makefile.in | 1 + scripts/subdriver/gen-snmp-subdriver.sh | 42 +- scripts/systemd/Makefile.in | 1 + scripts/systemd/nut-server.service.in | 2 +- scripts/udev/Makefile.in | 1 + scripts/udev/nut-usbups.rules.in | 6 + scripts/upower/95-upower-hid.rules | 14 +- server/Makefile.in | 1 + server/netget.c | 5 +- server/upsd.c | 2 +- tests/Makefile.in | 1 + tools/Makefile.am | 5 +- tools/Makefile.in | 6 +- tools/driver-list-format.sh | 32 + tools/nut-scanner/Makefile.in | 1 + tools/nut-scanner/README | 2 +- tools/nut-scanner/nut-scan.h | 11 +- tools/nut-scanner/nut-scanner.c | 39 +- tools/nut-scanner/nutscan-device.c | 11 +- tools/nut-scanner/nutscan-device.h | 11 +- tools/nut-scanner/nutscan-display.c | 10 +- tools/nut-scanner/nutscan-init.c | 79 +- tools/nut-scanner/nutscan-init.h | 11 +- tools/nut-scanner/nutscan-ip.c | 10 +- tools/nut-scanner/nutscan-ip.h | 11 +- tools/nut-scanner/nutscan-serial.c | 11 +- tools/nut-scanner/nutscan-serial.h | 11 +- tools/nut-scanner/nutscan-snmp.h | 43 +- tools/nut-scanner/nutscan-usb.h | 2 + tools/nut-scanner/scan_avahi.c | 208 ++-- tools/nut-scanner/scan_eaton_serial.c | 10 +- tools/nut-scanner/scan_ipmi.c | 21 +- tools/nut-scanner/scan_nut.c | 111 ++- tools/nut-scanner/scan_snmp.c | 39 +- tools/nut-scanner/scan_usb.c | 126 +-- tools/nut-scanner/scan_xml_http.c | 94 +- tools/nut-snmpinfo.py | 19 +- tools/nut-usbinfo.pl | 9 +- 290 files changed, 7473 insertions(+), 2607 deletions(-) create mode 100644 common/str.c create mode 100755 drivers/apc-ats-mib.c create mode 100755 drivers/apc-ats-mib.h create mode 100644 drivers/eaton-ats-mib.c create mode 100644 drivers/eaton-ats-mib.h create mode 100644 drivers/huawei-mib.c create mode 100644 drivers/huawei-mib.h create mode 100644 include/str.h create mode 100755 tools/driver-list-format.sh diff --git a/ChangeLog b/ChangeLog index 96dc998..2a1df65 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,1090 @@ +2016-03-09 Arnaud Quette + + * configure.ac: Fix autoreconf on Debian For some reason, Automake + doesn't search the current directory correctly when searching for + helper scripts, when 'nut' is running as a git-submodule, as it is + the case with the website repository + * configure.ac: update version to 2.7.4 + * drivers/apc-ats-mib.c: snmp-ups: add APC ATS input.source + * drivers/snmp-ups.c: snmp-ups: fix the matching OID tests For both + sysOID and classic methods, we used to test one of the two OIDs + provided in the mib2nut structures. However, these two OIDs + (oid_pwr_status and oid_auto_check) tend to be redundant and + confusing. Replace these matching by an extraction of + {ups,device}.model + * drivers/nut-libfreeipmi.c: nut-ipmipsu: fix compilation warnings + * NEWS, UPGRADING, docs/FAQ.txt, docs/net-protocol.txt, docs/new- + drivers.txt, docs/nut-names.txt, docs/nutdrv_qx-subdrivers.txt, + docs/packager-guide.txt, docs/snmp-subdrivers.txt, lib/README, + scripts/augeas/README: Fix spelling and typo errors Following the + spell-checking scope expansion, do a spell-checking pass + * docs/documentation.txt: Update documentation as per the new devices + scope + * docs/features.txt, docs/user-manual.txt: Update documentation as + per the new devices scope + * docs/Makefile.am: Expand spell-checking scope Add more documents, + outside of the docs/ directory Closes: + https://github.com/networkupstools/nut/issues/222 + +2016-03-08 Arnaud Quette + + * configure.ac, tools/Makefile.am, tools/driver-list-format.sh: Check + driver.list[.in] format at make dist time Instead of checking + driver.list.in at configure time, move the checking and + modification into a script that is called at make dist time. The + script can also be called manually, and will try to fix both + driver.list.in and driver.list + +2016-03-07 Arnaud Quette + + * drivers/powerware-mib.c: Remove an erroneous test This was made + test the enumerated values registration in snmp-ups, and should not + have been committed + * data/driver.list.in: HCL: APC ATS AP7724 supported by snmp-ups + These Automatic Transfer Switch should be supported by snmp-ups, + however this was not tested at all Reference: + https://github.com/networkupstools/nut/issues/260 + * NEWS, UPGRADING: Update for release 2.7.4 + * drivers/Makefile.am, drivers/apc-ats-mib.c, drivers/apc-ats-mib.h, + drivers/snmp-ups.c: snmp-ups: support APC Automatic Transfer Switch + Following the recent extension of NUT scope and variable namespace, + to support Automatic Transfer Switch (ATS), implement SNMP support + for APC ATS (with help from "maaboo" through github) Reference: + https://github.com/networkupstools/nut/issues/260 + +2016-03-04 Arnaud Quette + + * drivers/baytech-mib.c, drivers/bestpower-mib.c, drivers/compaq- + mib.c, drivers/cyberpower-mib.c, drivers/eaton-mib.c, drivers/mge- + mib.c, drivers/netvision-mib.c, drivers/powerware-mib.c, drivers + /raritan-pdu-mib.c: snmp-ups: fix mib2nut structures Non existent + OIDs, for testing MIB selection, must be expressed as NULL and not + as empty string ("") for the algorithm to work + +2016-03-03 Daniele Pezzini + + * docs/download.txt: docs: update several download links + +2016-03-03 Arnaud Quette + + * docs/man/upsrw.txt, docs/net-protocol.txt: Clarification on NUMBER + type float values Clarify a bit more documentation on how to + express float values, when using upsrw. That is to say, using + decimal (base 10) english-based representation, so using a dot, in + non-scientific notation. So hexadecimal, exponents, and comma for + thousands separator are forbiden + * clients/upsrw.c, docs/net-protocol.txt, server/netget.c: Prefer + NUMBER to NUMERIC for variable type As per discussion on the + Github pull request, NUMBER would be more suitable than NUMERIC + +2015-11-22 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: increase timeouts in 'sgs' USB + subdriver Apparently the previously used timeouts in the 'sgs' USB + subdriver were not always enough, so increase them. + +2015-11-11 Daniele Pezzini + + * data/driver.list.in: HCL: various TS Shara UPSes supported by + nutdrv_qx Protocol: 'megatec' USB subdriver: 'sgs' + * drivers/nutdrv_qx.c: nutdrv_qx: make sure 'sgs' USB subdriver uses + only what it reads Since, in 'sgs' USB subdriver, we read only 8 + bytes at a time and we expect the first byte to tell us the length + of the data that follows, make sure we don't use more than what we + read from the device in case the first byte is not what we expect + it to be. + +2015-03-04 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: increase verbosity of 'sgs' USB + subdriver In 'sgs' USB subdriver: - be more verbose when + debugging, - always print the return code when dealing with an + error. + +2014-01-31 Daniele Pezzini + + * docs/man/nutdrv_qx.txt: nutdrv_qx: update man page for new 'sgs' + USB subdriver + +2014-01-31 Ronaldo Yamada + + * drivers/nutdrv_qx.c: nutdrv_qx: add new 'sgs' USB subdriver to + support TS Shara units + +2016-03-02 Arnaud Quette + + * data/driver.list.in: HCL: added Eaton Powerware 9125-5000g + Supported with the additional USB card, with the bcmxcp_usb driver + * docs/man/upsrw.txt, docs/net-protocol.txt: Clarification on NUMERIC + type float values Clarify documentation on how to express float + values, when using upsrw. That is to say, using decimal english- + based representation, so using a dot + * drivers/mge-xml.c: netxml-ups: fix Eaton XML published data Some + raw protocol data were wrongly published, and are now commented. + Also add some R/W flags to ambient thresholds Closes: + https://github.com/networkupstools/nut/issues/201 + * tools/nut-scanner/nut-scanner.c: nut-scanner: fix thread attachment + Add a test to have the right thread waiting for the scan to be + complete (patch from Michal Hlavinka, Red Hat) + * configure.ac, tools/nut-scanner/nutscan-init.c, tools/nut- + scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, tools/nut- + scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools/nut- + scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: nut-scanner: + don't depend on development libraries nut-scanner was previously + trying to use directly libXXX.so (libusb-0.1, libfreeipmi, + libnetsnmp, libavahi-client, libneon, libupsclient}. However, these + files are generally provided by the development packages. nut- + scanner now tries to look at some known paths, including the one + provided through --libdir, to find the correct libraries Closes: + https://github.com/networkupstools/nut/issues/233 + +2016-03-01 Arnaud Quette + + * clients/upsrw.c, docs/net-protocol.txt, server/netget.c: Default to + type NUMERIC for variables Any variable that is not STRING, RANGE + or ENUM is just a simple numeric value. The protocol documentation + (net-protocol.txt) was previously stating that "The default , + when omitted, is integer." which was not fully true, since a + variable could also be a float. Hence, the wording was changed to + advertise this, and that each driver is then responsible for + handling values as either integer or float. Moreover, instead of + returning a TYPE "UNKNOWN", return "NUMERIC", which is more + suitable, and aligned with the NUT protocol specification + * tools/nut-snmpinfo.py: SNMP subdriver generator: fix output + formatting + * tools/nut-snmpinfo.py: SNMP subdriver generator: discard commented + lines Discard any commented mib2nut_info_t declaration, which + should thus not be taken into account + +2016-02-26 Arnaud Quette + + * data/driver.list.in, drivers/Makefile.am, drivers/eaton-ats-mib.c, + drivers/eaton-ats-mib.h, drivers/snmp-ups.c: snmp-ups: support + Eaton Automatic Transfer Switch Following the recent extension of + NUT scope and variable namespace, to support Automatic Transfer + Switch (ATS), implement SNMP support for Eaton ATS. Note that this + device can also be supported through Eaton XML/PDC (XML over HTTP) + protocol, supported by the NUT netxml-ups driver + * data/cmdvartab, docs/nut-names.txt: Extend namespace for Automatic + Transfer Switch (ATS) Extend NUT namespace to support a new type + of power device: ATS - Automatic Transfer Switch. These devices + are used to setup 2 power systems, such as UPS, to power a single + power supply system, and be able to automatically transfer between + the input sources in case of failure of the primary one. The added + variable are for now limited to 'input.source' and + 'input.source.preferred', but may be extended if needed + +2016-02-25 C Fraire + + * docs/scheduling.txt: Fix docs location of upssched to sbin + +2016-02-25 Arnaud Quette + + * scripts/subdriver/gen-snmp-subdriver.sh: snmp-ups: add the last + missing element in the structure + * drivers/apc-mib.c, drivers/bestpower-mib.c, drivers/compaq-mib.c, + drivers/cyberpower-mib.c, drivers/delta_ups-mib.c, drivers/huawei- + mib.c, drivers/ietf-mib.c, drivers/mge-mib.c, drivers/netvision- + mib.c, drivers/powerware-mib.c, drivers/xppc-mib.c, + scripts/subdriver/gen-snmp-subdriver.sh: snmp-ups: fix values + lookup terminating element The terminating element should really + be NULL, and not the string "NULL", as it was originally done, back + in 2002 + * drivers/snmp-ups.c: snmp-ups: revert order of the NULL/"NULL" test + Fix a segfault when doing first the string comparison test + * drivers/snmp-ups.c: snmp-ups: register values enumerations + Whenever there is a values lookup structure for read/write data, + push the values as enumerations for upsrw + * drivers/snmp-ups.c: snmp-ups: try to lookup values for numeric + elements Numeric elements can also use the value resolution + mechanism + * drivers/snmp-ups.c: snmp-ups: counter test sysOID with a test OID + Some devices have buggy sysOID exposed. Allow to counter test + another OID, to be able to select between different mapping + structures + +2016-02-24 Arnaud Quette + + * scripts/subdriver/gen-snmp-subdriver.sh: SNMP subdriver creation + script: allow sysOID override Allow to use -s to override buggy + sysOID in some device FW. In this case, the sysOID entry in the + mib2nut structure should be set to NULL + +2016-02-11 Arnaud Quette + + * drivers/raritan-pdu-mib.c: snmp-ups: fix macaddr support for + Raritan PDU Raritan MIB was fixed to expose macaddr on + device.macaddr instead of ups.macaddr + * drivers/baytech-mib.c: snmp-ups: fix macaddr support for Baytech + PDU Baytech MIB was fixed to expose macaddr on device.macaddr + instead of ups.macaddr + * drivers/eaton-mib.c: snmp-ups: fix and complete macaddr support for + Eaton Eaton G2 and G3 can now expose the MAC address of the + device, using device.macaddr. Eaton G1 Aphel was fixed to expose + this data on device.macaddr instead of ups.macaddr + * drivers/snmp-ups.c: snmp-ups: add support for hexadecimal octet + strings + * drivers/snmp-ups.c: snmp-ups: fallback for classic MIB detection + If the sysOID matching has failed, then snmp-ups uses ups.model to + get an OID to test. In case ups.model is not available, fallback to + trying to use device.model instead + * docs/images/nut_layering.png, docs/images/nut_layering.svg: Refresh + and complete NUT architecture diagram + +2016-02-08 Arnaud Quette + + * drivers/powerware-mib.c: snmp-ups: extend Eaton 3ph outputSource + values map Add the new status values for xupsOutputSource + (.1.3.6.1.4.1.534.1.4.5.0), that maps to both ups.status and + ups.type + +2016-02-03 Arnaud Quette + + * drivers/powerware-mib.c: snmp-ups: improve support for Eaton 3ph + Improve support for temperature and humidity data, including: - + ups.temperature now available - fixing ambient.temperature + (previously pointing at a wrong OID) - ambient.humidity now + available - the following settings now available: * + ups.temperature.low * ups.temperature.high * ambient.humidity.high + * ambient.humidity.low * ambient.temperature.high * + ambient.temperature.low + +2016-02-01 Daniele Pezzini + + * data/driver.list.in: HCL: various APCUPSD-controlled APC devices + via apcupsd-ups Originally reported by GitHub user @Thermionix. + Reference: https://github.com/networkupstools/nut/pull/215 + +2016-01-31 Charles Lepple + + * docs/man/nutdrv_atcl_usb.txt: man/nutdrv_atcl_usb: point to + nutdrv_qx (fuji) for 0001:0000 Also update best guess for the USB- + to-serial converter situation. + * docs/FAQ.txt: FAQ: udevadm for fixing permissions + +2016-01-30 Charles Lepple + + * drivers/nut-libfreeipmi.c: FreeIPMI: do not split function + arguments with a conditional Alternate approach to suggestion by + Romero B. de S. Malaquias Closes: + https://github.com/networkupstools/nut/pull/250 + +2016-01-24 Charles Lepple + + * docs/config-notes.txt: Documentation: fix formatting Put syntax + examples in verbatim mode, and remove spaces from ends of lines. + * drivers/apc-hid.c: usbhid-ups: handle missing USB strings in APC + code Closes: https://github.com/networkupstools/nut/issues/258 + Might fix: + https://bugs.launchpad.net/ubuntu/+source/nut/+bug/1483615 + +2016-01-23 Charles Lepple + + * data/driver.list.in: HCL: added NHS Laser Senoidal 5000VA Source: + http://article.gmane.org/gmane.comp.monitoring.nut.devel/7123 + Closes: https://github.com/networkupstools/nut/issues/254 + +2016-01-14 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: fix staleness detection With some + ePDUs or devices using template for outlet and outlet.group, + communication loss with the device were not detected, due to the + handling mechanism. Simply skipping commands for templates, after + the init time, is sufficient to avoid this issue + +2016-01-05 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: improve stale communication recovery + Disable the 10 iterations to retry communicating with stale device. + This was leading up to 10 x 30 seconds, so 5mn, before being able + to get data again + * docs/new-drivers.txt, docs/nut-names.txt: Document + battery.charger.status This will in time replace the historic CHRG + and DISCHRG flags published in ups.status. Closes + https://github.com/networkupstools/nut/issues/196 + +2016-01-03 Charles Lepple + + * data/driver.list.in: HCL: Sweex model P220 via blazer_usb + Reference: https://github.com/networkupstools/nut/issues/251 + +2016-01-04 Arnaud Quette + + * drivers/ietf-mib.c, drivers/ietf-mib.h, drivers/snmp-ups.c: snmp- + ups: add support for Tripplite units on IETF mib These devices + expose ".1.3.6.1.4.1.850.1", which could be supported through this + specific MIB. For now, just link that to the IETF MIB, to provide + a first level of support Reference: + https://github.com/networkupstools/nut/issues/171 + +2015-12-30 Arnaud Quette + + * configure.ac: First stab at checking driver.list.in format + +2015-12-29 Charles Lepple + + * scripts/upower/95-upower-hid.rules: upower: update for AEG + +2015-12-29 Arnaud Quette + + * drivers/powercom.c: Fix the processing of output voltage for KIN + units The processing of output voltage requires to also take into + account the line voltage, as reported by Patrik Dufresne. This may + still need some further adjustments Reference: + https://github.com/networkupstools/nut/issues/187 + * drivers/powercom.c: Fix the processing of input voltage for KIN + units The processing of input voltage requires to also take into + account the line voltage, as reported by Patrik Dufresne. Also bump + the driver version to 0.16, since 0.15 was already used, but not + set Reference: https://github.com/networkupstools/nut/issues/187 + * drivers/mge-hid.c: Fix letter case for AEG USB VendorID The letter + case of this VendorID may be important for generated files, such as + the udev ones (reported by Charles Lepple) + +2015-12-28 Arnaud Quette + + * data/driver.list.in, drivers/mge-hid.c: HCL: AEG PROTECT B / NAS + supported by usbhid-ups Reference: + https://github.com/networkupstools/nut/issues/249 + +2015-12-17 Daniele Pezzini + + * data/driver.list.in: HCL: Legrand Keor Multiplug supported by + nutdrv_qx Reference: + https://github.com/networkupstools/nut/issues/248 + +2015-12-09 Andrey Jr. Melnikov + + * drivers/bcmxcp_usb.c: Don't call usb_close() after reset + +2015-12-08 Andrey Jr. Melnikov + + * drivers/bcmxcp_usb.c: Call usb_reset() when driver unable to claim + device + * drivers/bcmxcp.h, drivers/bcmxcp_usb.c: Refactor get_answer() + routine, make it properly deal with multi-packets responses. Lower + stack usage. + +2015-07-27 Daniele Pezzini + + * common/common.c, common/str.c, drivers/bcmxcp.c, drivers/blazer.c, + drivers/blazer_ser.c, drivers/blazer_usb.c, drivers/libhid.c, + drivers/mge-xml.c, drivers/nutdrv_qx.c, drivers/powerp-bin.c, + drivers/powerp-txt.c, drivers/powerpanel.c, drivers/tripplitesu.c, + drivers/upscode2.c, include/common.h, include/str.h, server/upsd.c, + tools/nut-scanner/scan_usb.c: common: consolidate some string- + related functions Move *trim*() functions from common to str. + Prepend the 'str_' common prefix. Bailout early if string is NULL + or empty. In *trim_m() functions, make sure the string containing + characters to be removed is not NULL and bailout early if empty. + Add new str_trim[_m]() functions to remove both leading and + trailing characters at the same time. Update all the tree + accordingly; versioning where appropriate. + * common/Makefile.am, common/str.c, include/Makefile.am, + include/common.h, include/str.h: common: add some string-related + functions + +2015-11-10 Charles Lepple + + * data/driver.list.in: HCL: Electrys UPS 2500 (nutdrv_qx and + blazer_ser) Closes + https://github.com/networkupstools/nut/issues/241 + * data/driver.list.in: HCL: Eaton E Series DX UPS 1-20 kVA uses + blazer_ser Closes + https://github.com/networkupstools/nut/issues/238 + +2015-11-09 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: add number of outlets in Eaton ePDU + groups + * docs/nut-names.txt: Add a variable for the number of outlets in a + group Added 'outlet.group.n.count' which provides the number of + outlets in the outlet group 'n' + +2015-11-06 Daniele Pezzini + + * drivers/nutdrv_qx_voltronic-qs.c: nutdrv_qx: update 'voltronic-qs' + subdriver Since, for devices supported by 'voltronic-qs' + subdriver, in reality: - invalid commands or queries are echoed + back, - accepted commands are followed by action without any + further reply, update the subdriver interface accordingly. Also: - + change slightly the way we publish protocol as ups.firmware.aux, - + update F's reply examples and some info_type (ratings; + output.frequency) in QX to NUT table to reflect reality, - increase + version number. + +2015-10-19 Daniele Pezzini + + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: improve 'T' + protocol support in 'voltronic-qs-hex' subdriver Since the last + byte of the reply to the QS query (before the trailing CR) of + devices that implement the 'T' protocol holds in reality ratings + informations (nominal output frequency/voltage and nominal battery + voltage) in its bits, change the 'voltronic-qs-hex' subdriver + accordingly. Also: - change slightly the way we publish protocol as + ups.firmware.aux, - increase version number. + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: simplify + {in,out}put voltage conversion in 'voltronic-qs-hex' In + 'voltronic-qs-hex' subdriver, instead of calculating separately the + fractional and integer part of input and output voltage, do it at + once. Also, increase version number. + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: improve protocol + identification in 'voltronic-qs-hex' Since 'V' protocol, in + reality, never happens to use the encoded version of the reply to + the QS query, but it always uses the plain version already + implemented in 'voltronic-qs' subdriver, remove it from the + identification process of 'voltronic-qs-hex' subdriver. Also, + remove some non-significant entries from the testing table and + increase version number. + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: harmonize + declarations/definitions in 'voltronic-qs-hex' In 'voltronic-qs- + hex' subdriver, the scope of support functions is limited to the + subdriver as rightly stated in forward declarations, so correct + their definitions to reflect that. Also, increase version number. + +2015-10-09 Arnaud Quette + + * docs/nut-qa.txt: Reference Black Duck OpenHUB in QA documentation + Closes networkupstools/nut#192 + +2015-10-08 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: also use __func__ for additional + traces + * drivers/powerware-mib.c: powerware-mib: more comments for RFC + device.event Add more comments on the need to RFC device.event for + some data that are currently published under ups.alarm + * drivers/powerware-mib.c: snmp-ups: improve Eaton 3-phase UPS alarms + reporting Eaton 3phase UPS, using the Powerware MIB, can expose + many new alarms. Also use the standard driver "X.YY" versioning, + and bump subdriver release to "0.85" + * drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups: fix and improve + the ups.alarms mechanism This mechanism allows to walk a subtree + (array) of alarms, composed of OID references. The object + referenced should not be accessible, but rather when present, this + means that the alarm condition is TRUE. Both ups.status and/or + ups.alarm values can be provided + * drivers/snmp-ups.c: snmp-ups: fix on some snprintf calls Some + snprintf calls are using dynamically allocated variables, which + doesn't work with sizeof + * drivers/snmp-ups.c: snmp-ups: use __func__ in debug messages + * drivers/snmp-ups.c: snmp-ups: nut_snmp_get_oid() returns TRUE on + success + * drivers/snmp-ups.c: snmp-ups: only use snprintf calls instead of + sprintf + * drivers/eaton-mib.c, drivers/snmp-ups.c: snmp-ups: simplify + handling of other alarms outlet, outlet groups and phase alarms + are now using a simplified approach that does not require specific + lookup structure to adapt alarm messages. This applies to Eaton + ePDU G2/G3 + +2015-09-22 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: fix a typo error in debug message + Unknown is spelled with an ending N (reported by Evgeny "Jim" + Klimov, from Eaton) + * drivers/snmp-ups.c: snmp-ups: optimize phase number extraction + efficiency Since we know that we are processing an alarm for a + phase "Lx", don't use strchr, but simply index (reported by Evgeny + "Jim" Klimov, from Eaton) + * docs/nut-names.txt, drivers/eaton-mib.c: snmp-ups: use dash- + separator for out-of-range For the sake of coherence with other + status relative to thresholds, "out of range" frequency status now + also use dash as separator, instead of space + * drivers/eaton-mib.c: Fix a spelling error in comments + * drivers/eaton-mib.c: snmp-ups: fix a typo error on Eaton ePDU G2/G3 + MIB Critical is really spelled critical, and not cricital, as used + in the various status thresholds value-lookup structures (reported + by Evgeny "Jim" Klimov, from Eaton) + * data/cmdvartab: Mention the unit for ambient humidity information + Add an explicit mention that ambient information related to + humidity use the "(percent)" unit + * data/cmdvartab, docs/nut-names.txt: Mention the unit for input + voltage information Add an explicit mention that input information + related to voltage use the "Volts (V)" unit + * data/cmdvartab: Mention the unit for ambient temperature + information Add an explicit mention that ambient information + related to temperature use the "degrees C" unit + +2015-09-18 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: add outlet group identifier for + Eaton ePDU Eaton ePDU can now publish the parent group of each + outlet + * docs/nut-names.txt: Extend outlet collection namespace with group + ID An outlet can now publish the group to which it belongs to + * drivers/snmp-ups.c: snmp-ups: complete nut_snmp_get_{str,int} + These methods now allow to get the value of an OID returned by the + source OID (as for the sysOID). In case of failure (non existent + OID), the functions return the last part of the returned OID (ex: + 1.2.3 => 3) + * drivers/snmp-ups.c: snmp-ups: create a nut_snmp_get_oid() function + This method allows to get the value of an OID which is also an OID + (as for the sysOID), without trying to get the value of the pointed + OID. This will allow to use nut_snmp_get_{int,str}() the get the + value of the pointed OID + +2015-09-17 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: outlet groups type handling for + Eaton ePDU Eaton ePDU can now publish the type of outlet group + * docs/nut-names.txt: Extend outlet group collection namespace with + type The type of outlet group can now be published, part of the + new outlet.group data collection + * drivers/eaton-mib.c: snmp-ups: outlet groups commands for Eaton + ePDU Eaton ePDU can now handle commands outlet groups, including + on, off and reboot (cycle) + * drivers/snmp-ups.c: snmp-ups: fix commands handling for outlet + groups The su_instcmd() function of snmp-ups is now adapted to + support outlet groups + * drivers/eaton-mib.c: Advanced outlets groups alarm handling for + Eaton ePDU Eaton ePDU can now handle alarms on outlets groups, for + voltage and current, relative to the configured thresholds + * drivers/snmp-ups.c: snmp-ups: improvements for outlet groups and + alarms Improve the code for general template management, including + outlets and outlets groups for now, and add alarm management for + outlet groups, the same way as for outlets + +2015-09-16 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: fix set variable for outlet groups + The setvar() function of snmp-ups is now adapted to support outlet + groups + * drivers/eaton-mib.c: snmp-ups: outlet groups handling for Eaton + ePDU Eaton ePDU can now handle outlet groups, including voltage + and current (with thresholds and status relative to the configured + thresholds), along with power and realpower. A subsequent commit + will address the alarms, settings and commands. Bump subdriver + version to 0.30 + * drivers/snmp-ups.c: snmp-ups: update debug message The template + guestimation function name was changed, but the debug message was + left with the old function name + +2015-09-15 Arnaud Quette + + * docs/nut-names.txt: Extend NUT namespace with outlet.group + collection A new data collection, called "outlet.group", is now + available. It provides grouped management for a set of outlets. The + same principles and data than the outlet collection apply to + outlet.group + * drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups: adapt template + mechanisms for outlet groups The template handling mechanisms, + originally created for outlets, is now adapted to also manage + outlet groups + +2015-09-14 root + + * docs/nut-names.txt: Add a note on the outlet.count variable + +2015-09-14 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: add nominal input current for Eaton + ePDU snmp-ups now provides input.[Lx.]current.nominal for Eaton + ePDU G2/G3, both for 1phase and 3phase + * drivers/eaton-mib.c: snmp-ups: better input.power handling for + Eaton ePDUs Improve the way we declare and process input.power, as + previously done for input.realpower, in order to address the + variations between Eaton ePDUs G2 and G3 + +2015-09-11 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: publish part number for Eaton ePDU + device.part was standardized in NUT namespace, so enable the + declaration for Eaton ePDU + * drivers/eaton-mib.c: snmp-ups: 3-phase alarm handling for Eaton + ePDU Eaton ePDU can now handle alarms on 3-phase, currently + limited to voltage and current, relative to the configured + thresholds + * drivers/snmp-ups.c: snmp-ups: implement 3-phase alarm handling + snmp-ups now allows to publish 3-phase alarms in ups.alarm, the + same way as with outlet. Declaration of such alarms are done using + "Lx.alarm". info_lkp_t structures messages are shared templates + with outlets, and use the string formats to include the context + (outlet or phase) and the number (of the outlet or phase) in alarm + messages. These alarms are then published in "ups.alarm", with the + standard mechanism for alarm publication + * docs/nut-names.txt: Extend 3-phase collection namespace with alarms + 3-phase data collection now allows to specify alarms, the same way + than with the outlet collection ("outlet.n.alarm"), but using + "Lx.alarm" (for example "L1.alarm"). These alarms are then + published in "ups.alarm", with the standard mechanism for alarm + publication + * drivers/eaton-mib.c: Advanced threshold handling for Eaton 3-phase + ePDU Eaton ePDU can now handle warning and critical thresholds + settings and status for input voltage and current on 3-phase units. + Alarms are however still to be implement + * docs/nut-names.txt: Extend 3-phase collection namespace with + threshold 3-phase data collection now allows to specify low / high + warning and critical thresholds for voltage and current. Status + relative to the thresholds also exist for these data + +2015-09-07 Arnaud Quette + + * drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups: fix loss of + precision when setting values su_setvar() was losing precision + when converting and casting the provided values to send to the SNMP + agent. As an example, with an OID in millivolt (multiplier set to + 0.001), when providing 238 (V) using upsrw, the value sent to the + SNMP agent was 237999, so leaking 0.1 volt + +2015-09-04 Arnaud Quette + + * drivers/dstate.c: Extend ups.alarm internal buffer to 1024 chars + Currently, ups.alarm can hold up to 256 chars to expose alarms. + With the recent outlet alarms handling addition, the buffer may + quickly be to small. Thus, increase to 1024, which may still not + be sufficient but already provides a bit more room + * drivers/eaton-mib.c: snmp-ups: outlet alarm handling for Eaton ePDU + Eaton ePDU can now handle alarms on outlets, currently limited to + outlet voltage and current, relative to the configured thresholds + * drivers/snmp-ups.c: snmp-ups: implement outlets / PDU alarm + handling snmp-ups now allows to publish outlets and PDU alarms in + ups.alarm, the same way as with ups.status. Declaration of such + alarms are done using the outlet template mechanism + ("outlet.%i.alarm"). info_lkp_t structures messages can also use + the string formats to include the outlet number in alarm messages. + These alarms are then published in "ups.alarm", with the standard + mechanism for alarm publication + * docs/nut-names.txt: Extend outlet collection namespace with alarms + Outlet data collection now allows to specify alarms, using the + template definitions ("outlet.n.alarm"). These alarms are then + published in "ups.alarm", with the standard mechanism for alarm + publication + +2015-09-02 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: outlet threshold handling for Eaton + ePDU Eaton ePDU can now handle warning and critical thresholds + settings and status for outlet voltage and current + * docs/nut-names.txt: Extend outlet collection namespace with + threshold Outlet data collection now allows to specify low / high + warning and critical thresholds for voltage and current. Status + relative to the thresholds also exist for these data + +2015-09-01 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: alarms handling for Eaton ePDU + Eaton ePDU can now publish alarms, related to input status + (voltage, frequency and current) and ambient status (temperature + and humidity). Note that alarms are still published under + ups.alarms, though these should belong to either pdu.alarms or + better device.alarms + * drivers/eaton-mib.c: Advanced input threshold handling for Eaton + ePDU Eaton ePDU can now handle warning and critical thresholds + settings and status for input voltage and current, along with the + frequency status + * data/cmdvartab, docs/nut-names.txt: Extend input collection + namespace with threshold Input data collection now allows to + specify low / high warning and critical thresholds for voltage and + current. Status relative to the thresholds also exist for these + data, and for the frequency + +2015-08-31 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: ambient dry contacts support for + Eaton ePDU Eaton ambient modules, connected on ePDU, now publish + the status of the connected dry contacts sensors + * data/cmdvartab, docs/nut-names.txt: Extend ambient collection + namespace with dry contacts Ambient data collection now allow to + specify dry contacts sensor status + * drivers/eaton-mib.c: snmp-ups: fix Eaton Pulizzi Switched PDU + multiplier As per the previous commit, to well handle integer RW + variables + * drivers/eaton-mib.c: snmp-ups: ambient threshold handling for Eaton + ePDU Eaton ePDU can now handle warning and critical thresholds and + status for both humidity and temperature + * data/cmdvartab, docs/nut-names.txt: Extend ambient collection + namespace with threshold Ambient data collection now allow to + specify warning and critical thresholds + * drivers/eaton-mib.c: snmp-ups: publish presence of Eaton ambient + sensor Publish the actual presence of ambient sensor for Eaton + ePDU G2 and G3 + * data/cmdvartab, docs/nut-names.txt: Publish the actual presence of + an ambient sensor A new data was created (ambient.present) to + publish the actual presence of an ambient sensor + +2015-10-06 Charles Lepple + + * data/driver.list.in: HCL: Asium P700, Micropower LCD 1000 and Eaton + 5E1100iUSB + +2015-10-06 Daniele Pezzini + + * data/driver.list.in: HCL: LYONN CTB-800V supported by nutdrv_qx + Protocol: 'voltronic-qs-hex' Reference: + https://github.com/networkupstools/nut/pull/230 + +2015-08-22 Mariano + + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: add support for + LYONN CTB-800V Small protocol validation change in 'voltronic-qs- + hex' subdriver to add support for the protocol used by the LYONN + CTB-800V UPS. + +2015-09-28 Arnaud Quette + + * docs/new-drivers.txt: Fix spacing error + +2015-09-22 Charles Lepple + + * drivers/solis.c, drivers/solis.h: solis: remove additional warnings + The "Waiting" flag is always zero, and several other variables were + not used. + * drivers/solis.c, drivers/solis.h: solis: clean up warnings Comment + out unused constants, and add 'static' and 'const' wherever + possible. + +2015-09-20 Charles Lepple + + * drivers/Makefile.am, drivers/solis.c: solis: math fixes As + mentioned here: https://github.com/networkupstools/nut/pull/235 + +2015-09-19 bsalvador + + * drivers/solis.c, drivers/solis.h: solis: patch for Microsol Back- + Ups BZ1200-BR patch for correct reading for Microsol Back-Ups + BZ1200-BR (rebased onto solis_debug branch, and cleaned up + whitespace. -- CFL) Closes + https://github.com/networkupstools/nut/pull/235 and Closes + https://github.com/networkupstools/nut/pull/236 + +2015-09-16 Arnaud Quette + + * data/driver.list.in, docs/man/snmp-ups.txt, drivers/powerware- + mib.c, drivers/powerware-mib.h, drivers/snmp-ups.c: snmp-ups: add + Eaton Power Xpert Gateway UPS Card This newer generation of SNMP + card is used for BladeUPS or other UPS, and is serving the same + XUPS MIB, as in the "pw" subdriver + * scripts/subdriver/gen-snmp-subdriver.sh: Update SNMP subdriver + generation script Complete the documentation, by adding some notes + and examples ; Fix the MIBs directories list and the "keep + temporary files" option + +2015-09-11 Arnaud Quette + + * drivers/snmp-ups.c: Improve log/debug output trace + +2015-09-08 Charles Lepple + + * drivers/solis.c: solis: resync with end-of-packet character (0.64) + Suggested by @rpvelloso in https://github.com/networkupstools/nut/i + ssues/231#issuecomment-134795747 Note that the driver could + possibly get out-of-sync after initial detection. + +2015-09-07 Charles Lepple + + * docs/man/macosx-ups.txt, drivers/macosx-ups.c: macosx-ups: + gracefully handle disconnection of UPS Tested on 10.9.5 and + 10.10.5. Returns "data stale" when UPS disappears. + +2015-09-07 Arnaud Quette + + * drivers/powerware-mib.c: Bump Powerware SNMP subdriver version + +2015-09-04 Charles Lepple + + * Makefile.am, docs/configure.txt, docs/new-clients.txt, tools/nut- + scanner/README: doc: correct remaining `--with-lib` references + Credit: Paul Vermeer + +2015-09-01 Arnaud Quette + + * drivers/snmp-ups.h: Minor updates to TODO comments + * drivers/snmp-ups.c: Implement ups.alarm for SNMP snmp-ups now + allows to publish alarms in ups.alarm, the same way as with + ups.status + +2015-08-31 Arnaud Quette + + * drivers/snmp-ups.c: Proper handling of integer RW variables RW + variables were previously supposed to always be strings. Thus, the + multiplier (using the info_len field) was not applied. Also allow + setting float values, not only integer + * drivers/snmp-ups.c, drivers/snmp-ups.h: Fix default SNMP retries + and timeout The previous patch was using the default values from + Net-SNMP, which are set to -1. When the user was not providing + overriden values, this was causing the driver to not be able to + establish the communication with the device. The default values are + now fixed, as per documented (i.e. 5 retries and timeout of 1 + second). Also bump the driver version to 0.74 + * docs/man/ups.conf.txt, drivers/dstate.c: Make more obvious the + socket write failure Document the error that require the use of + the 'synchronous' flag. Also use debug level 1 instead of 2 for the + debug message + +2015-08-23 Charles Lepple + + * drivers/solis.c: solis: Add upsdebug*() and upslogx() calls for + diagnostics + +2015-08-18 Kenny Root + + * drivers/powerware-mib.c: Add ups.start.auto for Powerware SNMP Use + the IETF UPS MIB to indicate to Powerware devices that it should + restart when mains power is applied. + * drivers/powerware-mib.c: Fix some indentation problems in PowerWare + SNMP + * drivers/powerware-mib.c: Add shutdown.return for Powerware SNMP + The Powerware MIB supports the concept of shutting down with a + delay and then returning when line power is restored. The delay is + set to 0 seconds currently. + * drivers/powerware-mib.c: Add load.{off,on}.delay for Powerware SNMP + The commands to shut down with delay have existed since the first + version of the Powerware MIB so add the newer commands + "load.off.delay" and "load.on.delay" to aid in shutdown scripts. + +2015-08-07 Arnaud Quette + + * drivers/dummy-ups.c, drivers/dummy-ups.h: Fix dummy-ups for + external value changes dummy-ups allow to change the values of the + publicated variables through the standard upsrw tool. This method + is handy to script value changes, in a controlled way, compared to + the dynamic version (using the TIMER keyword in .dev files), which + changes the values in a non controlled way. Bump driver version to + 0.14 + * m4/nut_check_libnss.m4: Fully check for a working Mozilla NSS + Rework the NSS tests so that just having runtime libraries + installed is not enough. Moreover, since GNU libc6 also provides a + nss.h header, the test now checks for both nss.h and ssl.h Closes + networkupstools/nut#184 + * docs/download.txt: Fix Red Hat / Fedora packages repository URL + +2015-08-03 Tomas Halman + + * clients/nutclient.cpp: Problem: nutclient library sometimes reads + socket closed by server. Solution: proper read return value + evaluation + +2015-08-04 Arnaud Quette + + * tools/nut-scanner/scan_snmp.c: Fix a crash on a 2nd call to + libnutscan on behalf of Tomas Halman, from Eaton Opensource Team + +2015-07-24 Nash Kaminski + + * drivers/tripplitesu.c: tripplitesu: Fix initialization when + tripplite firmware is buggy With some Tripplite SU1000RT2U (and + possibly more) UPS's, a firmware bug causes a malformed response to + the very first command that is sent after the serial port is opened + following a warm or cold boot of the system. My theory is that this + related to either the RS232 data lines or handshaking lines being + pulled high once the server's UART is powered however I have not + determined precisely if this is related to the data line being + pulled high or the handshaking lines being asserted. However, I + have been able to consistently reproduce the issue where the driver + fails to start on the first attempt after a cold/warm boot across 3 + different machines and 2 SU1000RT2U UPS's. To workaround this, the + initial enumeration is repeated a 2nd time after 300ms(to allow all + garbage data to arrive) if the first attempt fails, which allows + the driver to consistently startup successfully on the 1st attempt. + Closes networkupstools/nut#220 + +2015-07-24 Tim Smith + + * INSTALL.nut: Spelling fixes Spelling fixes and capitalization of + SUSE + +2015-07-23 Arnaud Quette + + * scripts/augeas/nutupsconf.aug.tpl: Update Augeas lens for ups.conf + Add the various missing global directives and ups fields + +2015-07-20 Daniele Pezzini + + * data/driver.list.in: HCL: fix case and spacing + +2015-07-18 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: when targeting 'UPS No Ack' + consider also the trailing CR In 'fabula' and 'krauler' USB + subdrivers, take into account also the trailing CR in the reply + while looking for a 'UPS No Ack'. + * drivers/nutdrv_qx.c: nutdrv_qx: stay true to return code in + 'fabula' USB subdriver In 'fabula' USB subdriver, when reading + 'UPS No Ack' from device, since we already mimic a timeout, also + empty the reply. + +2015-07-11 Charles Lepple + + * data/driver.list.in: HCL: Fideltronic INIGO Viper 1200 supported by + nutdrv_qx + +2015-07-02 Charles Lepple + + * drivers/usbhid-ups.c: usbhid-ups: bump version to 0.41 Both the + eaton_dual_reportdesc and usbhid_ups_input_vs_feature branches + claimed version 0.40, so let's disambiguate the merged version. + +2015-07-02 Arnaud Quette + + * drivers/libhid.c: Add a debug trace for the number of HID objects + found + * drivers/hidtypes.h: Fix testing typo MAX_REPORT is really 500 (HID + objects), not 50! + * drivers/hidparser.c: Report when there are further unprocessed HID + objects Following the last commits, and especially the MAX_REPORT + one, warn whenever there are remaining HID objects that were not + processed. This may serve + * drivers/hidtypes.h: Increase the maximum number of HID objects The + previous value (300) was causing a trim of the remaining objects. + Increase the value to 500, which should give a bit of time + * drivers/libshut.c, drivers/libshut.h, drivers/libusb.c, drivers + /usb-common.h, drivers/usbhid-ups.c: Add support for Eaton dual HID + report descriptor All devices use HID descriptor at index 0. + However, some newer Eaton units have a light HID descriptor at + index 0, and the full version is at index 1 (in which case, + bcdDevice == 0x0202). This dual report descriptor approach is due + to the fact that the main report descriptor is now too heavy, and + cause some BIOS to hang. A light version is thus provided at the + default index, solving this BIOS issues + +2015-06-27 Charles Lepple + + * drivers/macosx-ups.c: macosx-ups: fix for 10.10 (Yosemite); v1.1 + In OS X 10.9 and earlier, IOPSGetPowerSourcesInfo() returned a + CFDictionary. In 10.10 it returns a CFArray. Programmers are + supposed to use IOPSGetPowerSourceDescription() to gloss over this + distinction. However, this does not make it easy to distinguish + between a laptop battery and an UPS. So the "port" driver option no + longer has any effect. https://developer.apple.com/library/mac/doc + umentation/IOKit/Reference/IOPowerSources_header_reference/#//apple + _ref/c/func/IOPSGetPowerSourceDescription + +2015-06-22 Arnaud Quette + + * scripts/upower/95-upower-hid.rules, tools/nut-usbinfo.pl: Update + UPower HID rules and generator + +2015-06-11 Charles Lepple + + * drivers/usbhid-ups.c: usbhid-ups.c: fall back to HID Input type if + not a Feature + +2015-06-07 Charles Lepple + + * drivers/tripplite-hid.c: tripplite-hid.c: device.part is static + (version 0.82) + +2015-06-04 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: make sure processed item's + boundaries are not wrong + +2015-04-26 Nick Mayerhofer + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h: nutdrv_qx: improve documentation for some + methods + +2015-06-04 Daniele Pezzini + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h: nutdrv_qx: remove redundant comments and + update docs + +2015-04-28 Nick Mayerhofer + + * drivers/nutdrv_qx_voltronic.c: nutdrv_qx: move var declaration in + 'voltronic' subdriver Move variable declaration to fulfill + condition '3.3. Portability' of the developer guide. Bump version. + * drivers/libhid.c: libhid: replace "flush loop" with memset Move to + the C way of setting memory (memset), replacing a for loop with a + few anti-patterns in it: - for (...; ; i++) - for (...; i < + MAGIC_NUMBER; ...) - for (...) array[i] = 0 + +2015-05-18 Daniele Pezzini + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h, drivers/nutdrv_qx_bestups.c, + drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_megatec-old.c, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_mustek.c, + drivers/nutdrv_qx_q1.c, drivers/nutdrv_qx_voltronic-qs-hex.c, + drivers/nutdrv_qx_voltronic-qs.c, drivers/nutdrv_qx_voltronic.c, + drivers/nutdrv_qx_zinto.c: nutdrv_qx: give subdrivers a last chance + to process the command Add (and document) a new function + ('preprocess_command()') to preprocess the command to be sent to + the device, just before the actual sending and, in case of instant + commands/setvars, after the 'preprocess()' function has been + triggered (if appropriate). As an example, this function can be + useful to add to all commands (both queries and instant + commands/setvars) a CRC or to fill the command of a query with some + data. Also, in qx_process(), address buf size vs item->answer size + earlier. Update all subdrivers accordingly, bump versions. + +2015-06-01 Arnaud Quette + + * docs/man/snmp-ups.txt, drivers/snmp-ups.c, drivers/snmp-ups.h: + Provide access to Net-SNMP timeout and retries Two new extra + arguments are now available to allow overriding Net-SNMP number of + retries (snmp_retries) and timeout per retry (snmp_timeout). These + respectively maps to snmpcmd "-r retries" and "-t timeout" + +2015-05-29 Arnaud Quette + + * scripts/upower/95-upower-hid.rules: Update UPower HID rules + * tools/nut-usbinfo.pl: Fix UPower device matching for recent kernels + As per the UPower patch below referenced, hiddev* devices now have + class "usbmisc", rather than "usb". See + http://cgit.freedesktop.org/upower/commit/rules/95-upower- + hid.rules?id=9f31068707fc79744961cea7258b0eb262effbf1 + +2015-05-28 Arnaud Quette + + * tools/nut-scanner/nut-scan.h, tools/nut-scanner/nut-scanner.c, + tools/nut-scanner/nutscan-device.c, tools/nut-scanner/nutscan- + device.h, tools/nut-scanner/nutscan-display.c, tools/nut-scanner + /nutscan-init.c, tools/nut-scanner/nutscan-init.h, tools/nut- + scanner/nutscan-ip.c, tools/nut-scanner/nutscan-ip.h, tools/nut- + scanner/nutscan-serial.c, tools/nut-scanner/nutscan-serial.h, tools + /nut-scanner/scan_avahi.c, tools/nut-scanner/scan_eaton_serial.c, + tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools + /nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut- + scanner/scan_xml_http.c: Fix legal information on source-code + headers Copyright and author were not mentioned as it should be. + Most of the nut-scanner copyright belongs to EATON, apart from few + parts. Files descriptions are now also in Doxygen format + +2015-05-18 Daniele Pezzini + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h, drivers/nutdrv_qx_bestups.c, drivers + /nutdrv_qx_blazer-common.c, drivers/nutdrv_qx_blazer-common.h, + drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_megatec-old.c, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_mustek.c, + drivers/nutdrv_qx_q1.c, drivers/nutdrv_qx_voltronic-qs-hex.c, + drivers/nutdrv_qx_voltronic-qs.c, drivers/nutdrv_qx_voltronic.c, + drivers/nutdrv_qx_zinto.c: nutdrv_qx: make preprocessed value's + size_t a const There's no need to intervene on the passed-to-the- + function value of a preprocessed value's size_t, so clarify it is a + const. Update all subdrivers accordingly, bump versions. + * drivers/nutdrv_qx.c: nutdrv_qx: make sure an answer is not reused + if preprocess_answer() fails If an item's preprocess_answer() + function fails, the answer should not be considered valid and + inherited by the following items with the same command. Therefore, + on failure, clear the answer so that the following items are forced + to query the device and preprocess the answer anew, if appropriate. + +2015-05-13 Arnaud Quette + + * docs/download.txt: Update NUT packages for Windows to 2.6.5-6 + +2015-05-07 Arnaud Quette + + * scripts/systemd/nut-server.service.in: Restore systemd relationship + with nut-driver service The Requires directive from nut-server to + nut-driver was previously removed, since it was preventing upsd + from starting whenever one or more drivers, among several, was + failing to start. Use the Wants directive, a weaker version of + Requires, which will start upsd even if the nut-driver unit fails + to start. closes https://github.com/networkupstools/nut/issues/200 + +2015-04-23 Arnaud Quette + + * Makefile.am: Cleanup GPG signature before generation + 2015-04-22 Arnaud Quette + * configure.ac: bump version back to 2.7.3.1 * configure.ac: Restore version 2.7.3 for release * docs/security.txt: Missing link reference update The filename of the previous GPG release key was not updated, leading to pointing @@ -146,6 +1231,17 @@ historic CHRG and DISCHRG flags are not published anymore in ups.status +2015-03-26 Stuart Henderson + + * data/driver.list.in, docs/man/snmp-ups.txt, docs/snmp- + subdrivers.txt, drivers/Makefile.am, drivers/huawei-mib.c, drivers + /huawei-mib.h, drivers/snmp-ups.c: snmp-ups: new subdriver for + Huawei "Hi, the [commit] below adds a new subdriver for snmp-ups + to support Huawei UPS, based on an observed walk from a UPS5000-E + with a few bits filled in from the MIBs (copy at + http://junkpile.org/HUAWEI_UPS_MIB/)." http://news.gmane.org/find- + root.php?message_id=slrnmh6npf.tg7.stu%40naiad.spacehopper.org + 2015-03-25 Daniele Pezzini * drivers/nutdrv_qx_voltronic.c: nutdrv_qx: add support in @@ -1051,6 +2147,10 @@ * NEWS, UPGRADING, configure.ac: Update for release 2.7.2 Complete the release information for NUT 2.7.2 +2014-04-17 Stephen J. Butler + + * drivers/tripplite-hid.c: Scale for SMART1500LCDT + 2014-04-07 Arnaud Quette * drivers/compaq-mib.c: Fix erroneous status in HP/Compaq SNMP MIB diff --git a/INSTALL.nut b/INSTALL.nut index 160b558..202d1af 100644 --- a/INSTALL.nut +++ b/INSTALL.nut @@ -207,8 +207,8 @@ Debian, Ubuntu and other derivatives NOTE: NUT is packaged and well maintained in these systems. The official Debian packager is part of the NUT Team. -Using your prefered method (apt-get, aptitude, Synaptic, ...), install -the 'nut' package, and optionaly the following: +Using your preferred method (apt-get, aptitude, Synaptic, ...), install +the 'nut' package, and optionally the following: - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-snmp', if you need the snmp-ups driver, @@ -233,32 +233,32 @@ Mandriva NOTE: NUT is packaged and well maintained in these systems. The official Mandriva packager is part of the NUT Team. -Using your prefered method (urpmi, RPMdrake, ...), install one of the two below +Using your preferred method (urpmi, RPMdrake, ...), install one of the two below packages: - 'nut-server' if you have a 'standalone' or 'netserver' installation, - 'nut' if you have a 'netclient' installation. -Optionaly, you can also install the following: +Optionally, you can also install the following: - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-devel', if you need the development files. -[[Suse]] -Suse / Opensuse +[[SUSE]] +SUSE / openSUSE ~~~~~~~~~~~~~~~ NOTE: NUT is packaged and well maintained in these systems. -The official Suse packager is part of the NUT Team. +The official SUSE packager is part of the NUT Team. -Install the 'nut-classic' package, and optionaly the following: +Install the 'nut-classic' package, and optionally the following: - 'nut-drivers-net', if you need the snmp-ups or the netxml-ups drivers, - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-devel', if you need the development files, -NOTE: Suse and Opensuse users can use the +NOTE: SUSE and openSUSE users can use the link:http://software.opensuse.org/search?baseproject=ALL&p=1&q=nut[one-click install method] to install NUT. @@ -270,13 +270,13 @@ Red Hat, Fedora and CentOS NOTE: NUT is packaged and well maintained in these systems. The official Red Hat packager is part of the NUT Team. -Using your prefered method (yum, Add/Remove Software, ...), install one of the +Using your preferred method (yum, Add/Remove Software, ...), install one of the two below packages: - 'nut' if you have a 'standalone' or 'netserver' installation, - 'nut-client' if you have a 'netclient' installation. -Optionaly, you can also install the following: +Optionally, you can also install the following: - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-xml', if you need the netxml-ups driver, @@ -306,7 +306,7 @@ To install it, use the following command: You have to define WITH_NUT_CGI to build the optional CGI scripts. -Optionaly, you can also install the following ports: +Optionally, you can also install the following ports: - sysutils/nut-snmp, for the SNMP driver, - sysutils/nut-usb, for the USB drivers, diff --git a/Makefile.am b/Makefile.am index aebe618..dd9ec33 100644 --- a/Makefile.am +++ b/Makefile.am @@ -56,6 +56,7 @@ ChangeLog: tools/gitlog2changelog.py dummy-stamp # ---------------------------------------------------------------------- # Maintainers targets: distribution signature and hashes dist-sig: + rm -f nut-@PACKAGE_VERSION@.tar.gz.sig gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz dist-hash: @@ -107,7 +108,7 @@ install-cgi-man install-cgi-conf install-cgi-html: @echo "Use './configure --with-cgi' instead." install-lib: @echo "Error: 'make $@' no longer exists." - @echo "Use './configure --with-lib' instead." + @echo "Use './configure --with-dev' instead." usb build-usb install-usb: @echo "Error: 'make $@' no longer exists." @echo "Use './configure --with-usb' instead." diff --git a/Makefile.in b/Makefile.in index 44ffd6b..6b39990 100644 --- a/Makefile.in +++ b/Makefile.in @@ -273,6 +273,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ @@ -931,6 +932,7 @@ ChangeLog: tools/gitlog2changelog.py dummy-stamp # ---------------------------------------------------------------------- # Maintainers targets: distribution signature and hashes dist-sig: + rm -f nut-@PACKAGE_VERSION@.tar.gz.sig gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz dist-hash: @@ -976,7 +978,7 @@ install-cgi-man install-cgi-conf install-cgi-html: @echo "Use './configure --with-cgi' instead." install-lib: @echo "Error: 'make $@' no longer exists." - @echo "Use './configure --with-lib' instead." + @echo "Use './configure --with-dev' instead." usb build-usb install-usb: @echo "Error: 'make $@' no longer exists." @echo "Use './configure --with-usb' instead." diff --git a/NEWS b/NEWS index 1e6fbde..216c835 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,124 @@ If you're upgrading from an earlier version, see the UPGRADING file. For a complete and more detailed list of changes, please refer to the ChangeLog file. +--------------------------------------------------------------------------- +Release notes for NUT 2.7.4 - what's new since 2.7.3: + + - New class of device supported: ATS - Automatic Transfer Switch are now + supported in NUT. Eaton ATS are supported, and APC ones should be too. Users + are welcomed to test and provide feedback + + - NUT command and variable naming scheme: + * Document battery.charger.status, which will in time replace the historic + CHRG and DISCHRG flags published in ups.status + * Many extensions to support outlets groups, thresholds / alarms (ambient, + input, output, outlet and outlet.group) + + - support for new devices: + AEG PROTECT B / NAS + APC ATS AP7724 (should be supported) + Asium P700 + Eaton ATS + Eaton 5E 1100iUSB + Eaton E Series DX UPS 1-20 kVA + Eaton Powerware 9125-5000g + Electrys UPS 2500 + Fideltronic INIGO Viper 1200 + Legrand Keor Multiplug + LYONN CTB-800V + Micropower LCD 1000 + NHS Laser Senoidal 5000VA + Sweex model P220 + TS Shara + Various APCUPSD-controlled APC devices + + - snmp-ups: + * Improve automatic detection algorithm + * Provide access to Net-SNMP timeout and retries + * Proper handling of integer RW variables + * Implement support for alarms, through ups.alarm and outlet.n.alarm + * Improve log/debug output trace + * Fix loss of precision when setting values, using upsrw + * Support for outlets group management + * Many improvements and simplification + * Add support for Tripplite units using IETF mib + * Improve communication staleness detection and recovery + * Add devices MAC address publication + * Register values enumerations, when available + * Many improvements and fixes to the SNMP subdriver creation script + + - Eaton: + * 3ph SNMP: + Many improvements to Powerware / XUPS MIB, for data and commands + Add support for Eaton Power Xpert Gateway UPS Card + Improve support for temperature and humidity, including low / high values + Alarms handling + * ePDU (G2 and G3): + Improve support for ambient sensor, including thresholds and dry contacts + Outlet groups handling, including data, thresholds, settings and commands + Alarms handling + * XML/PDC (netxml-ups): + Fix Eaton XML published data + Add some settings (R/W flags) on ambient thresholds + + - bcmxcp_usb: improvements for device claiming and multi-packets responses + + - dummy-ups: allow any variable to be modified + + - libnutclient: Fix for reads when the socket was closed by NUT server + + - macosx-ups: + * fix for 10.10 (Yosemite), v1.1 + * gracefully handle disconnection of UPS (return "data stale") + + - nutdrv_atcl_usb: point to nutdrv_qx (fuji) for 0001:0000 + + - nutdrv_qx: + * Add new 'sgs' USB subdriver to support TS Shara units + * various improvements and simplification, to the code and documentation + + - nut-ipmipsu: improve FreeIPMI support + + - nut-scanner: + * Don't depend on development libraries, by looking at some known paths, + including the one provided through --libdir, to find the correct libraries + * Fix a crash on a 2nd call to libnutscan with SNMP method + + - powercom: fix the processing of input and output voltage for KIN units + + - solis: + * many improvements and cleanup + * resync with end-of-packet character + * fixes for Microsol Back-Ups BZ1200-BR + + - tripplitesu: Fix initialization when tripplite firmware is buggy (for + Tripplite SU1000RT2U and possibly more) + + - usbhid-ups: + * various minor improvements + * support for Eaton UPS with dual HID report descriptor in HID Parser + * handle missing USB strings in APC code + + - SSL support through Mozilla NSS: Rework the NSS tests to ensure that NSS is + actually installed and usable for enabling SSL support in NUT + + - Augeas support: Augeas lens for ups.conf was updated to add various missing + global directives and ups fields + + - scripts/systemd/nut-server.service.in: Restore systemd relationship since it + was preventing upsd from starting whenever one or more drivers, among several, + was failing to start + + - Fix UPower device matching for recent kernels, since hiddev* devices now have + class "usbmisc", rather than "usb" + + - Network protocol information: default to type NUMBER for variables that are + not flagged as STRING . This point is subject to improvements or change in + the next release 2.7.5. Refer to docs/net-protocol.txt for more information + + - As usual, more bugfixes, cleanup and improvements, on both source code + and documentation. + --------------------------------------------------------------------------- Release notes for NUT 2.7.3 - what's new since 2.7.2: @@ -323,7 +441,7 @@ Release notes for NUT 2.6.4 - what's new since 2.6.3: - bestups has also received some care, though users are encouraged to switch to blazer_ser, since bestups will soon be deprecated. - - newmge-shut has been heavilly improved. However, replacement of the + - newmge-shut has been heavily improved. However, replacement of the current mge-shut has been postponed to the next release, due to the CVE issue. diff --git a/UPGRADING b/UPGRADING index 3b14a40..03cf410 100644 --- a/UPGRADING +++ b/UPGRADING @@ -7,6 +7,22 @@ This file lists changes that affect users who installed older versions of this software. When upgrading from an older version, be sure to check this file to see if you need to make changes to your system. +Changes from 2.7.3 to 2.7.4 +--------------------------- + +- scripts/systemd/nut-server.service.in: Restore systemd relationship since it + was preventing upsd from starting whenever one or more drivers, among several, + was failing to start + +- Fix UPower device matching for recent kernels, since hiddev* devices now have + class "usbmisc", rather than "usb" + +- macosx-ups: the "port" driver option no longer has any effect + +- Network protocol information: default to type NUMBER for variables that are + not flagged as STRING . This point is subject to improvements or change in + the next release 2.7.5. Refer to docs/net-protocol.txt for more information + Changes from 2.7.2 to 2.7.3 --------------------------- @@ -191,7 +207,7 @@ automake). Refer to packaging/debian/ for an example of migration. ie not using upsdrvctl. - Developers of external client application using libupsclient are encouraged to rename the "UPSCONN" client structure to "UPSCONN_t" -since the former will disapear by the release of NUT 2.4. +since the former will disappear by the release of NUT 2.4. Changes from 2.0.4 to 2.0.5 --------------------------- diff --git a/clients/Makefile.in b/clients/Makefile.in index 7e58b62..0a7949e 100644 --- a/clients/Makefile.in +++ b/clients/Makefile.in @@ -366,6 +366,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/clients/nutclient.cpp b/clients/nutclient.cpp index dcf0c2d..8304473 100644 --- a/clients/nutclient.cpp +++ b/clients/nutclient.cpp @@ -374,6 +374,11 @@ std::string Socket::read()throw(nut::IOException) // Read new buffer size_t sz = read(&buff, 256); + if(sz==0) + { + disconnect(); + throw nut::IOException("Server closed connection unexpectedly"); + } _buffer.assign(buff, sz); } } diff --git a/clients/upsrw.c b/clients/upsrw.c index 8113690..3a0efb4 100644 --- a/clients/upsrw.c +++ b/clients/upsrw.c @@ -366,6 +366,11 @@ static void do_type(const char *varname) } + if (!strcasecmp(answer[i], "NUMBER")) { + printf("Type: NUMBER\n"); + return; + } + /* ignore this one */ if (!strcasecmp(answer[i], "RW")) { continue; diff --git a/common/Makefile.am b/common/Makefile.am index f85244c..2bfc6e0 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -9,8 +9,8 @@ libparseconf_la_SOURCES = parseconf.c # 'dist', and is only required for actual build, in which case # BUILT_SOURCES (in ../include) will ensure nut_version.h will # be built before anything else -libcommon_la_SOURCES = common.c state.c upsconf.c -libcommonclient_la_SOURCES = common.c state.c +libcommon_la_SOURCES = common.c state.c str.c upsconf.c +libcommonclient_la_SOURCES = common.c state.c str.c # ensure inclusion of local implementation of missing systems functions # using LTLIBOBJS. Refer to configure.in -> AC_REPLACE_FUNCS libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@ diff --git a/common/Makefile.in b/common/Makefile.in index 6a5149e..8710560 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -82,8 +82,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = common -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am strerror.c \ - atexit.c setenv.c snprintf.c $(top_srcdir)/depcomp +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am atexit.c \ + snprintf.c setenv.c strerror.c $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -114,14 +114,14 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcommon_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@ -am_libcommon_la_OBJECTS = common.lo state.lo upsconf.lo +am_libcommon_la_OBJECTS = common.lo state.lo str.lo upsconf.lo libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libcommonclient_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@ -am_libcommonclient_la_OBJECTS = common.lo state.lo +am_libcommonclient_la_OBJECTS = common.lo state.lo str.lo libcommonclient_la_OBJECTS = $(am_libcommonclient_la_OBJECTS) libparseconf_la_LIBADD = am_libparseconf_la_OBJECTS = parseconf.lo @@ -241,6 +241,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ @@ -382,8 +383,8 @@ libparseconf_la_SOURCES = parseconf.c # 'dist', and is only required for actual build, in which case # BUILT_SOURCES (in ../include) will ensure nut_version.h will # be built before anything else -libcommon_la_SOURCES = common.c state.c upsconf.c -libcommonclient_la_SOURCES = common.c state.c +libcommon_la_SOURCES = common.c state.c str.c upsconf.c +libcommonclient_la_SOURCES = common.c state.c str.c # ensure inclusion of local implementation of missing systems functions # using LTLIBOBJS. Refer to configure.in -> AC_REPLACE_FUNCS libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@ @@ -456,6 +457,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseconf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsconf.Plo@am__quote@ .c.o: diff --git a/common/common.c b/common/common.c index d7c74d3..6637113 100644 --- a/common/common.c +++ b/common/common.c @@ -584,47 +584,6 @@ char *xstrdup(const char *string) return p; } -/* modify in - strip all trailing instances of */ -char *rtrim(char *in, const char sep) -{ - char seps[2] = { sep, '\0' }; - - return rtrim_m(in, seps); -} - -/* modify in - strip all trailing instances of each char in */ -char *rtrim_m(char *in, const char *seps) -{ - char *p; - - if (in && strlen(in)) { - p = &in[strlen(in) - 1]; - - while ((p >= in) && (strchr(seps, *p) != NULL)) - *p-- = '\0'; - } - return in; -} - -/* modify in - strip all leading instances of */ -char* ltrim(char *in, const char sep) -{ - char seps[2] = { sep, '\0' }; - - return ltrim_m(in, seps); -} - -/* modify in - strip all leading instances of each char in */ -char* ltrim_m(char *in, const char *seps) -{ - if (in && strlen(in)) { - while ((*in != '\0') && (strchr(seps, *in) != NULL)) - memmove(in, in + 1, strlen(in)); - } - - return in; -} - /* Read up to buflen bytes from fd and return the number of bytes read. If no data is available within d_sec + d_usec, return 0. On error, a value < 0 is returned (errno indicates error). */ diff --git a/common/str.c b/common/str.c new file mode 100644 index 0000000..092efcf --- /dev/null +++ b/common/str.c @@ -0,0 +1,607 @@ +/* str.c - Common string-related functions + * + * Copyright (C) + * 2000 Russell Kroll + * 2015 Daniele Pezzini + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include "str.h" + +char *str_trim(char *string, const char character) +{ + return str_rtrim(str_ltrim(string, character), character); +} + +char *str_trim_m(char *string, const char *characters) +{ + return str_rtrim_m(str_ltrim_m(string, characters), characters); +} + +char *str_ltrim(char *string, const char character) +{ + char characters[2] = { character, '\0' }; + + return str_ltrim_m(string, characters); +} + +char *str_ltrim_m(char *string, const char *characters) +{ + if ( + string == NULL || + *string == '\0' || + characters == NULL || + *characters == '\0' + ) + return string; + + while ( + *string != '\0' && + strchr(characters, *string) != NULL + ) + memmove(string, string + 1, strlen(string)); + + return string; +} + +char *str_rtrim(char *string, const char character) +{ + char characters[2] = { character, '\0' }; + + return str_rtrim_m(string, characters); +} + +char *str_rtrim_m(char *string, const char *characters) +{ + char *ptr; + + if ( + string == NULL || + *string == '\0' || + characters == NULL || + *characters == '\0' + ) + return string; + + ptr = &string[strlen(string) - 1]; + + while ( + ptr >= string && + strchr(characters, *ptr) != NULL + ) + *ptr-- = '\0'; + + return string; +} + +char *str_trim_space(char *string) +{ + return str_rtrim_space(str_ltrim_space(string)); +} + +char *str_ltrim_space(char *string) +{ + if ( + string == NULL || + *string == '\0' + ) + return string; + + while ( + *string != '\0' && + isspace(*string) + ) + memmove(string, string + 1, strlen(string)); + + return string; +} + +char *str_rtrim_space(char *string) +{ + char *ptr; + + if ( + string == NULL || + *string == '\0' + ) + return string; + + ptr = &string[strlen(string) - 1]; + + while ( + ptr >= string && + isspace(*ptr) + ) + *ptr-- = '\0'; + + return string; +} + +int str_is_short(const char *string, const int base) +{ + short number; + + return str_to_short(string, &number, base); +} + +int str_is_short_strict(const char *string, const int base) +{ + short number; + + return str_to_short_strict(string, &number, base); +} + +int str_is_ushort(const char *string, const int base) +{ + unsigned short number; + + return str_to_ushort(string, &number, base); +} + +int str_is_ushort_strict(const char *string, const int base) +{ + unsigned short number; + + return str_to_ushort_strict(string, &number, base); +} + +int str_is_int(const char *string, const int base) +{ + int number; + + return str_to_int(string, &number, base); +} + +int str_is_int_strict(const char *string, const int base) +{ + int number; + + return str_to_int_strict(string, &number, base); +} + +int str_is_uint(const char *string, const int base) +{ + unsigned int number; + + return str_to_uint(string, &number, base); +} + +int str_is_uint_strict(const char *string, const int base) +{ + unsigned int number; + + return str_to_uint_strict(string, &number, base); +} + +int str_is_long(const char *string, const int base) +{ + long number; + + return str_to_long(string, &number, base); +} + +int str_is_long_strict(const char *string, const int base) +{ + long number; + + return str_to_long_strict(string, &number, base); +} + +int str_is_ulong(const char *string, const int base) +{ + unsigned long number; + + return str_to_ulong(string, &number, base); +} + +int str_is_ulong_strict(const char *string, const int base) +{ + unsigned long number; + + return str_to_ulong_strict(string, &number, base); +} + +int str_is_double(const char *string, const int base) +{ + double number; + + return str_to_double(string, &number, base); +} + +int str_is_double_strict(const char *string, const int base) +{ + double number; + + return str_to_double_strict(string, &number, base); +} + +int str_to_short(const char *string, short *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long(string, &num, base)) + return 0; + + if ( + num < SHRT_MIN || + num > SHRT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_short_strict(const char *string, short *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long_strict(string, &num, base)) + return 0; + + if ( + num < SHRT_MIN || + num > SHRT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_ushort(const char *string, unsigned short *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong(string, &num, base)) + return 0; + + if (num > USHRT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_ushort_strict(const char *string, unsigned short *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong_strict(string, &num, base)) + return 0; + + if (num > USHRT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_int(const char *string, int *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long(string, &num, base)) + return 0; + + if ( + num < INT_MIN || + num > INT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_int_strict(const char *string, int *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long_strict(string, &num, base)) + return 0; + + if ( + num < INT_MIN || + num > INT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_uint(const char *string, unsigned int *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong(string, &num, base)) + return 0; + + if (num > UINT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_uint_strict(const char *string, unsigned int *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong_strict(string, &num, base)) + return 0; + + if (num > UINT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_long(const char *string, long *number, const int base) +{ + char *str; + + *number = 0; + + if ( + string == NULL || + *string == '\0' + ) { + errno = EINVAL; + return 0; + } + + str = strdup(string); + if (str == NULL) + return 0; + + str_trim_space(str); + + if (!str_to_long_strict(str, number, base)) { + free(str); + return 0; + } + + free(str); + return 1; +} + +int str_to_long_strict(const char *string, long *number, const int base) +{ + char *ptr = NULL; + + *number = 0; + + if ( + string == NULL || + *string == '\0' || + isspace(*string) + ) { + errno = EINVAL; + return 0; + } + + errno = 0; + *number = strtol(string, &ptr, base); + + if ( + errno == EINVAL || + *ptr != '\0' + ) { + *number = 0; + errno = EINVAL; + return 0; + } + + if (errno == ERANGE) { + *number = 0; + return 0; + } + + return 1; +} + +int str_to_ulong(const char *string, unsigned long *number, const int base) +{ + char *str; + + *number = 0; + + if ( + string == NULL || + *string == '\0' + ) { + errno = EINVAL; + return 0; + } + + str = strdup(string); + if (str == NULL) + return 0; + + str_trim_space(str); + + if (!str_to_ulong_strict(str, number, base)) { + free(str); + return 0; + } + + free(str); + return 1; +} + +int str_to_ulong_strict(const char *string, unsigned long *number, const int base) +{ + char *ptr = NULL; + + *number = 0; + + if ( + string == NULL || + *string == '\0' || + *string == '+' || + *string == '-' || + isspace(*string) + ) { + errno = EINVAL; + return 0; + } + + errno = 0; + *number = strtoul(string, &ptr, base); + + if ( + errno == EINVAL || + *ptr != '\0' + ) { + *number = 0; + errno = EINVAL; + return 0; + } + + if (errno == ERANGE) { + *number = 0; + return 0; + } + + return 1; +} + +int str_to_double(const char *string, double *number, const int base) +{ + char *str; + + *number = 0; + + if ( + string == NULL || + *string == '\0' + ) { + errno = EINVAL; + return 0; + } + + str = strdup(string); + if (str == NULL) + return 0; + + str_trim_space(str); + + if (!str_to_double_strict(str, number, base)) { + free(str); + return 0; + } + + free(str); + return 1; +} + +int str_to_double_strict(const char *string, double *number, const int base) +{ + char *ptr = NULL; + + *number = 0; + + if ( + string == NULL || + *string == '\0' || + isspace(*string) + ) { + errno = EINVAL; + return 0; + } + + switch (base) + { + case 0: + break; + case 10: + if (strlen(string) != strspn(string, "-+.0123456789Ee")) { + errno = EINVAL; + return 0; + } + break; + case 16: + if (strlen(string) != strspn(string, "-+.0123456789ABCDEFabcdefXxPp")) { + errno = EINVAL; + return 0; + } + break; + default: + errno = EINVAL; + return 0; + } + + errno = 0; + *number = strtod(string, &ptr); + + if ( + errno == EINVAL || + *ptr != '\0' + ) { + *number = 0; + errno = EINVAL; + return 0; + } + + if (errno == ERANGE) { + *number = 0; + return 0; + } + + return 1; +} diff --git a/conf/Makefile.in b/conf/Makefile.in index 4afc1f8..cc5884c 100644 --- a/conf/Makefile.in +++ b/conf/Makefile.in @@ -220,6 +220,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/configure b/configure index 3210ecd..f70451d 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for nut 2.7.3. +# Generated by GNU Autoconf 2.69 for nut 2.7.4. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='nut' PACKAGE_TARNAME='nut' -PACKAGE_VERSION='2.7.3' -PACKAGE_STRING='nut 2.7.3' +PACKAGE_VERSION='2.7.4' +PACKAGE_STRING='nut 2.7.4' PACKAGE_BUGREPORT='https://github.com/networkupstools/nut/issues' PACKAGE_URL='' @@ -652,6 +652,7 @@ RUN_AS_USER PORT SBINDIR DRVPATH +LIBDIR BINDIR CONFPATH STATEPATH @@ -1511,7 +1512,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures nut 2.7.3 to adapt to many kinds of systems. +\`configure' configures nut 2.7.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1582,7 +1583,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of nut 2.7.3:";; + short | recursive ) echo "Configuration of nut 2.7.4:";; esac cat <<\_ACEOF @@ -1784,7 +1785,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -nut configure 2.7.3 +nut configure 2.7.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2374,7 +2375,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by nut $as_me 2.7.3, which was +It was created by nut $as_me 2.7.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3493,7 +3494,7 @@ fi # Define the identity of the package. PACKAGE='nut' - VERSION='2.7.3' + VERSION='2.7.4' cat >>confdefs.h <<_ACEOF @@ -10271,32 +10272,33 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${LIBS}" >&5 $as_echo "${LIBS}" >&6; } - for ac_header in nss.h -do : - ac_fn_c_check_header_compile "$LINENO" "nss.h" "ac_cv_header_nss_h" "$ac_includes_default -" -if test "x$ac_cv_header_nss_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NSS_H 1 -_ACEOF - nut_have_libnss=yes -else - nut_have_libnss=no -fi - -done - - for ac_func in NSS_Init + for ac_func in NSS_Init do : ac_fn_c_check_func "$LINENO" "NSS_Init" "ac_cv_func_NSS_Init" if test "x$ac_cv_func_NSS_Init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NSS_INIT 1 +_ACEOF + nut_have_libnss=yes +else + nut_have_libnss=no +fi +done + + for ac_header in nss.h ssl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else nut_have_libnss=no fi + done @@ -10601,32 +10603,33 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${LIBS}" >&5 $as_echo "${LIBS}" >&6; } - for ac_header in nss.h -do : - ac_fn_c_check_header_compile "$LINENO" "nss.h" "ac_cv_header_nss_h" "$ac_includes_default -" -if test "x$ac_cv_header_nss_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NSS_H 1 -_ACEOF - nut_have_libnss=yes -else - nut_have_libnss=no -fi - -done - - for ac_func in NSS_Init + for ac_func in NSS_Init do : ac_fn_c_check_func "$LINENO" "NSS_Init" "ac_cv_func_NSS_Init" if test "x$ac_cv_func_NSS_Init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NSS_INIT 1 +_ACEOF + nut_have_libnss=yes +else + nut_have_libnss=no +fi +done + + for ac_header in nss.h ssl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else nut_have_libnss=no fi + done @@ -23333,6 +23336,16 @@ cat >>confdefs.h <<_ACEOF _ACEOF +conftemp="${libdir}" +eval conftemp=\"${conftemp}\" +eval conftemp=\"${conftemp}\" +LIBDIR=${conftemp} + +cat >>confdefs.h <<_ACEOF +#define LIBDIR "${conftemp}" +_ACEOF + + now=`TZ=UTC date +%Y-%m-%d` @@ -23384,6 +23397,7 @@ now=`TZ=UTC date +%Y-%m-%d` + ac_config_files="$ac_config_files clients/Makefile common/Makefile conf/Makefile conf/upsmon.conf.sample conf/upssched.conf.sample data/html/header.html data/html/Makefile data/Makefile data/driver.list docs/Makefile docs/docinfo.xml docs/man/Makefile drivers/Makefile include/Makefile lib/libupsclient-config lib/libupsclient.pc lib/libnutclient.pc lib/libnutscan.pc lib/Makefile scripts/Aix/nut-aix.spec scripts/augeas/Makefile scripts/augeas/nutnutconf.aug scripts/augeas/nutupsconf.aug scripts/augeas/nutupsdconf.aug scripts/augeas/nutupsdusers.aug scripts/augeas/nutupsmonconf.aug scripts/augeas/nutupsschedconf.aug scripts/augeas/nuthostsconf.aug scripts/augeas/nutupssetconf.aug scripts/avahi/nut.service scripts/devd/Makefile scripts/devd/nut-usb.conf scripts/hotplug/Makefile scripts/hotplug/libhidups scripts/HP-UX/nut.psf scripts/HP-UX/postinstall scripts/python/Makefile scripts/systemd/Makefile scripts/systemd/nut-driver.service scripts/systemd/nut-monitor.service scripts/systemd/nut-server.service scripts/systemd/nutshutdown scripts/Solaris/Makefile scripts/Solaris/pkginfo scripts/Solaris/postinstall scripts/Solaris/preremove scripts/Solaris/nut scripts/udev/Makefile scripts/udev/nut-ipmipsu.rules scripts/udev/nut-usbups.rules scripts/ufw/nut.ufw.profile scripts/Makefile server/Makefile tools/Makefile tools/nut-scanner/Makefile tests/Makefile Makefile" @@ -24051,7 +24065,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by nut $as_me 2.7.3, which was +This file was extended by nut $as_me 2.7.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -24117,7 +24131,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -nut config.status 2.7.3 +nut config.status 2.7.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index f87be6d..41db8d3 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,8 @@ dnl | Network UPS Tools: configure.ac | dnl +------------------------------------------------------------------+ dnl NUT version number is defined here, with a Git suffix in include/nut_version.h -AC_INIT(nut, 2.7.3, [https://github.com/networkupstools/nut/issues]) +AC_INIT(nut, 2.7.4, [https://github.com/networkupstools/nut/issues]) +AC_CONFIG_AUX_DIR([.]) AC_CONFIG_SRCDIR(server/upsd.c) AC_CONFIG_MACRO_DIR([m4]) echo "Network UPS Tools version ${PACKAGE_VERSION}" @@ -1202,6 +1203,13 @@ eval conftemp=\"${conftemp}\" SBINDIR=${conftemp} AC_DEFINE_UNQUOTED(SBINDIR, "${conftemp}", [Default path for system executables]) +dnl same for libdir +conftemp="${libdir}" +eval conftemp=\"${conftemp}\" +eval conftemp=\"${conftemp}\" +LIBDIR=${conftemp} +AC_DEFINE_UNQUOTED(LIBDIR, "${conftemp}", [Default path for system libraries]) + dnl Current date now=`TZ=UTC date +%Y-%m-%d` @@ -1239,6 +1247,7 @@ AC_SUBST(PIDPATH) AC_SUBST(STATEPATH) AC_SUBST(CONFPATH) AC_SUBST(BINDIR) +AC_SUBST(LIBDIR) AC_SUBST(DRVPATH) AC_SUBST(SBINDIR) AC_SUBST(PORT) diff --git a/data/Makefile.in b/data/Makefile.in index 5a010e3..0bd8feb 100644 --- a/data/Makefile.in +++ b/data/Makefile.in @@ -274,6 +274,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/data/cmdvartab b/data/cmdvartab index ef68d70..3d091f2 100644 --- a/data/cmdvartab +++ b/data/cmdvartab @@ -47,6 +47,11 @@ VARDESC input.voltage "Input voltage (V)" VARDESC input.voltage.extended "Extended input voltage range" VARDESC input.voltage.maximum "Maximum incoming voltage seen (V)" VARDESC input.voltage.minimum "Minimum incoming voltage seen (V)" +VARDESC input.voltage.status "Voltage status relative to the thresholds" +VARDESC input.voltage.low.warning "Input voltage low warning threshold (V)" +VARDESC input.voltage.low.critical "Input voltage low critical threshold (V)" +VARDESC input.voltage.high.warning "Input voltage high warning threshold (V)" +VARDESC input.voltage.high.critical "Input voltage high critical threshold (V)" VARDESC input.voltage.nominal "Nominal input voltage (V)" VARDESC input.transfer.reason "Reason for last transfer to battery" VARDESC input.transfer.low "Low voltage transfer point (V)" @@ -59,8 +64,14 @@ VARDESC input.sensitivity "Input power sensitivity" VARDESC input.quality "Input power quality" VARDESC input.current "Input current (A)" VARDESC input.current.nominal "Nominal input current (A)" +VARDESC input.current.status "Current status relative to the thresholds" +VARDESC input.current.low.warning "Input current low warning threshold (A)" +VARDESC input.current.low.critical "Input current low critical threshold (A)" +VARDESC input.current.high.warning "Input current high warning threshold (A)" +VARDESC input.current.high.critical "Input current high critical threshold (A)" VARDESC input.frequency "Input line frequency (Hz)" VARDESC input.frequency.extended "Extended input frequency range" +VARDESC input.frequency.status "Frequency status" VARDESC input.frequency.nominal "Nominal input line frequency (Hz)" VARDESC input.frequency.low "Minimum input line frequency (Hz)" VARDESC input.frequency.high "Maximum input line frequency (Hz)" @@ -72,6 +83,8 @@ VARDESC input.transfer.delay "Delay before transfer to mains" VARDESC input.load "Load on (ePDU) input (percent of full)" VARDESC input.realpower "Current sum value of all (ePDU) phases real power (W)" VARDESC input.power "Current sum value of all (ePDU) phases apparent power (VA)" +VARDESC input.source "The current input power source" +VARDESC input.source.preferred "The prefered input power source" VARDESC output.voltage "Output voltage (V)" VARDESC output.voltage.nominal "Nominal output voltage (V)" @@ -106,14 +119,31 @@ VARDESC battery.charger.status "Battery charger status" VARDESC ambient.temperature "Ambient temperature (degrees C)" VARDESC ambient.temperature.alarm "Ambient temperature alarm is active" -VARDESC ambient.temperature.alarm.maximum "Maximum allowed ambient temperature" -VARDESC ambient.temperature.alarm.minimum "Minimum allowed ambient temperature" +VARDESC ambient.temperature.status "Ambient temperature status relative to the configured thresholds" +VARDESC ambient.temperature.alarm.maximum "Maximum allowed ambient temperature (degrees C)" +VARDESC ambient.temperature.alarm.minimum "Minimum allowed ambient temperature (degrees C)" VARDESC ambient.temperature.alarm.enable "Enable ambient temperature alarm" -VARDESC ambient.humidity "Ambient humidity" +VARDESC ambient.temperature.low "Temperature threshold low (degrees C)" +VARDESC ambient.temperature.low.warning "Temperature threshold low warning (degrees C)" +VARDESC ambient.temperature.low.critical "Temperature threshold low critical (degrees C)" +VARDESC ambient.temperature.high "Temperature threshold high (degrees C)" +VARDESC ambient.temperature.high.warning "Temperature threshold high warning (degrees C)" +VARDESC ambient.temperature.high.critical "Temperature threshold high critical (degrees C)" +VARDESC ambient.humidity "Ambient humidity (percent)" VARDESC ambient.humidity.alarm "Ambient humidity alarm is active" -VARDESC ambient.humidity.alarm.maximum "Maximum allowed ambient humidity" -VARDESC ambient.humidity.alarm.minimum "Minimum allowed ambient humidity" +VARDESC ambient.humidity.status "Ambient humidity status relative to the configured thresholds" +VARDESC ambient.humidity.alarm.maximum "Maximum allowed ambient humidity (percent)" +VARDESC ambient.humidity.alarm.minimum "Minimum allowed ambient humidity (percent)" VARDESC ambient.humidity.alarm.enable "Enable ambient humidity alarm" +VARDESC ambient.humidity.low "Ambient humidity threshold low (percent)" +VARDESC ambient.humidity.low.warning "Ambient humidity threshold low warning (percent)" +VARDESC ambient.humidity.low.critical "Ambient humidity threshold low critical (percent)" +VARDESC ambient.humidity.high "Ambient humidity threshold high (percent)" +VARDESC ambient.humidity.high.warning "Ambient humidity threshold high warning (percent)" +VARDESC ambient.humidity.high.critical "Ambient humidity threshold high critical (percent)" +VARDESC ambient.present "Ambient sensor presence" +VARDESC ambient.contacts.1.status "State of the dry contact sensor 1" +VARDESC ambient.contacts.2.status "State of the dry contact sensor 2" # FIXME: the outlet collection is indexed - solve with regexs? # diff --git a/data/driver.list.in b/data/driver.list.in index a0e82fb..50f23b8 100644 --- a/data/driver.list.in +++ b/data/driver.list.in @@ -18,6 +18,7 @@ # "ups" for Uninterruptible Power Supply # "pdu" for Power Distributions Unit # "scd" for Solar Controlers Device +# "ats" for Automatic Transfer Switch # # - support level: a number from "1" to "5" (stars) meaning: # * protocol based on reverse engineering @@ -47,6 +48,8 @@ "AEC" "ups" "1" "MiniGuard UPS 700" "Megatec M2501 cable" "genericups upstype=21" "AEG Power Solutions" "ups" "2" "PROTECT HOME" "" "blazer_ser or blazer_usb" +"AEG Power Solutions" "ups" "3" "PROTECT NAS" "" "usbhid-ups" +"AEG Power Solutions" "ups" "3" "PROTECT B" "" "usbhid-ups" "APC" "ups" "2" "Back-UPS 1200BR (Microsol)" "" "solis" "APC" "ups" "2" "Back-UPS BZ2200BI-BR (Microsol)" "" "solis" @@ -70,10 +73,12 @@ "APC" "ups" "3" "Smart-UPS RT XL" "AP9618 SNMP monitoring card" "snmp-ups" "APC" "ups" "3" "(various)" "AP9618 SNMP monitoring card" "snmp-ups" "APC" "ups" "3" "(various)" "AP9630 SNMP monitoring card" "snmp-ups privProtocol=AES" +"APC" "ups" "3" "(various)" "APCUPSD-controlled devices" "apcupsd-ups" "APC" "pdu" "1" "Masterswitch" "940-0020 cable" "genericups upstype=12" "APC" "pdu" "1" "AP9210" "8 outlets" "powerman-pdu (experimental)" "APC" "pdu" "1" "AP79xx" "8 to 24 outlets" "powerman-pdu (experimental)" "APC" "pdu" "3" "(various)" "SNMP monitoring card" "snmp-ups (experimental)" +"APC" "ats" "3" "ATS AP7724" "" "snmp-ups (experimental)" "Aphel" "pdu" "3" "various PDU" "" "snmp-ups (experimental)" @@ -93,7 +98,9 @@ "ARTronic" "ups" "2" "ARTon Platinium Combo 3.1 10/15/20 kVA" "USB" "blazer_usb" "ARTronic" "ups" "2" "ARTon Platinium RT 1/2/3/6/10 kVA" "USB" "blazer_usb" -"ASEM SPA" "UPS" "5" "PB1300 UPS" "i2c" "asem" +"ASEM SPA" "ups" "5" "PB1300 UPS" "i2c" "asem" + +"Asium" "ups" "3" "P700" "USB" "blazer_usb" # http://www.asiumpower.com/Asium-ASIUM-P700-650VA-360W/dp/B009SMEQ10 "ATEK" "ups" "2" "Defensor 1K Tower / Rack" "USB" "blazer_usb" "ATEK" "ups" "2" "Defensor 2K Tower / Rack" "USB" "blazer_usb" @@ -242,8 +249,8 @@ "Dell" "ups" "5" "Rack 3750W High Efficiency Online HV" "USB port" "usbhid-ups" "Dell" "ups" "5" "Rack 4200W High Efficiency Online HV" "USB port" "usbhid-ups" "Dell" "ups" "5" "Rack 5600W HV" "USB port" "usbhid-ups" -"Dell" "ups" "5" "Various (SNMP mode)" "UPS Network Management Card " "snmp-ups" -"Dell" "ups" "5" "Various (XML/HTTP mode)" "UPS Network Management Card " "netxml-ups (experimental)" +"Dell" "ups" "5" "Various (SNMP mode)" "UPS Network Management Card" "snmp-ups" +"Dell" "ups" "5" "Various (XML/HTTP mode)" "UPS Network Management Card" "netxml-ups (experimental)" "Delta" "ups" "1" "GES602N" "" "belkin" @@ -275,6 +282,8 @@ "Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "USB port" "usbhid-ups" "Eaton" "ups" "5" "5 PX" "USB port" "usbhid-ups" "Eaton" "ups" "5" "Nova AVR 625/1250" "USB" "usbhid-ups" +"Eaton" "ups" "5" "5E650iUSB" "USB port" "usbhid-ups" +"Eaton" "ups" "5" "5E1100iUSB" "USB port" "usbhid-ups" # http://powerquality.eaton.com/5E1100iUSB.aspx?CX&GUID=8D85FE66-3102-427C-8F33-B8D56BBDD4D3 "Eaton" "ups" "5" "5S" "USB port" "usbhid-ups" "Eaton" "ups" "5" "5SC" "USB port" "usbhid-ups" "Eaton" "ups" "5" "5P" "USB port" "usbhid-ups" @@ -296,9 +305,10 @@ "Eaton" "ups" "5" "EX RT (XML/HTTP)" "NMC Transverse card (ref 66074)" "netxml-ups (experimental)" "Eaton" "ups" "5" "EX RT (SNMP)" "NMC Transverse card (ref 66074)" "snmp-ups (experimental)" "Eaton" "ups" "5" "E Series NV UPS 400-2000 VA" "" "blazer_usb" -"Eaton" "ups" "5" "E Series DX UPS 1-20 kVA" "" "mge-utalk" +"Eaton" "ups" "5" "E Series DX UPS 1-20 kVA" "" "blazer_ser" # http://www.eaton.com/Eaton/ESeriesUPS/DXUPS/ "Eaton" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2" "Eaton" "ups" "5" "BladeUPS (SNMP)" "ConnectUPS Web/SNMP Card" "snmp-ups (experimental)" +"Eaton" "ups" "5" "various models (SNMP mode)" "Power Xpert Gateway UPS Card" "snmp-ups (experimental)" "Eaton" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (ref 66102)" "netxml-ups (experimental)" "Eaton" "ups" "5" "various models (SNMP mode)" "NMC Minislot (ref 66102)" "snmp-ups (experimental)" "Eaton" "ups" "5" "various models (XML/HTTP mode)" "SNMP/Web Minislot card (ref 66244)" "netxml-ups (experimental)" @@ -308,6 +318,7 @@ "Eaton" "pdu" "5" "ePDU Switched" "" "snmp-ups" "Eaton" "pdu" "5" "ePDU Monitored" "" "snmp-ups or netxml-ups" "Eaton" "ups" "5" "Powerware 3105" "USB" "bcmxcp_usb" # http://powerquality.eaton.com/Products-services/Backup-Power-UPS/3105-eol.aspx +"Eaton" "ups" "5" "Powerware 9125" "USB card" "bcmxcp_usb" "Eaton" "ups" "5" "Powerware 9130" "" "bcmxcp or usbhid-ups" "Eaton" "ups" "5" "Powerware 9140" "" "bcmxcp or usbhid-ups" "Eaton" "ups" "5" "Powerware 5130" "" "usbhid-ups" @@ -316,10 +327,13 @@ "Eaton" "ups" "5" "ConnectUPS X / BD / E Slot" "Serial Pass-through mode" "bcmxcp" "Eaton" "ups" "5" "ConnectUPS X / BD / E Slot" "Network port" "snmp-ups" "Eaton" "ups" "5" "Management Card Contact" "Config 3 - Cable 66033" "genericups upstype=7" +"Eaton" "ats" "5" "Eaton ATS16" "" "snmp-ups" "Effekta" "ups" "2" "MI/MT/MH" "2502 cable" "blazer_ser" "Effekta" "ups" "2" "RM2000MH" "" "blazer_ser" +"Electrys" "ups" "2" "UPS 2500" "" "nutdrv_qx or blazer_ser" + "Energy Sistem" "ups" "2" "(various)" "" "blazer_ser" "ETA" "ups" "1" "mini+UPS" "WinNT/Upsoft cable" "genericups upstype=7" @@ -351,6 +365,7 @@ "Fideltronik" "ups" "1" "Ares 700 and larger" "" "genericups upstype=6" "Fideltronik" "ups" "2" "LUPUS 500" "USB" "nutdrv_qx" "Fideltronik" "ups" "1" "Other Ares models" "" "genericups upstype=19" +"Fideltronik INIGO" "ups" "2" "Viper 1200" "USB" "nutdrv_qx" # http://fideltronikinigo.com/viper/viper-1200/ "Fiskars" "ups" "4" "PowerRite MAX" "" "upscode2" "Fiskars" "ups" "4" "PowerServer 10" "" "upscode2" @@ -414,9 +429,11 @@ "HP" "ups" "3" "R/T 2200 G2" "" "usbhid-ups" "HP" "ups" "3" "R/T3000" "USB port" "usbhid-ups" "HP" "ups" "3" "R5000 / R7000" "USB port" "usbhid-ups" -"HP" "ups" "4" "Various (SNMP mode)" "HP UPS Management Module " "snmp-ups" +"HP" "ups" "4" "Various (SNMP mode)" "HP UPS Management Module" "snmp-ups" "HP" "pdu" "1" "HP3488 Switch/Control Unit" "" "powerman-pdu (experimental)" +"Huawei" "ups" "4" "UPS5000-E" "" "snmp-ups" + "IBM" "pdu" "1" "Blade Center Management Module" "15 outlets" "powerman-pdu (experimental)" "ICS" "pdu" "1" "8064 Ethernet Relay Interface" "16 outlets" "powerman-pdu (experimental)" @@ -478,6 +495,8 @@ "LDLC" "ups" "2" "UPS-1200D" "" "blazer_usb langid_fix=0x4095" +"Legrand" "ups" "2" "Keor Multiplug" "" "nutdrv_qx" + "Lestar" "ups" "2" "MD-800E" "" "blazer_ser" "Lexis" "ups" "2" "X-Power Tigra 1kVA" "" "blazer_ser or bestups" @@ -491,6 +510,7 @@ "LNXI" "pdu" "1" "Icebox" "10 outlets" "powerman-pdu (experimental)" +"Lyonn" "ups" "2" "CTB-800V" "" "nutdrv_qx" "Lyonn" "ups" "2" "CTB-1200" "" "blazer_usb" "Masterguard" "ups" "1" "(various)" "" "masterguard" @@ -691,6 +711,8 @@ "Microline" "ups" "2" "C-Lion Innova Tower 6K/10K" "" "blazer_usb" "Microline" "ups" "2" "C-Lion Innova Combo 10K/20K (3/1)" "" "blazer_usb" +"Micropower" "ups" "2" "LCD 1000" "USB" "blazer_usb" + "Microsol" "ups" "4" "Solis 1.0" "1000VA" "solis" "Microsol" "ups" "4" "Solis 1.5" "1500VA" "solis" "Microsol" "ups" "4" "Solis 2.0" "2000VA" "solis" @@ -711,7 +733,7 @@ "Mustek" "ups" "2" "Powermust" "2000VA USB" "blazer_ser" "Mustek" "ups" "2" "Powermust Office 650" "USB" "blazer_usb" "Mustek" "ups" "2" "PowerMust 424 / 636 / 848" "USB" "blazer_usb" -"Mustek" "ups" "2" "Yukai PowerMust" "1000 USB (PID: 5161)" "blazer_usb" +"Mustek" "ups" "2" "Yukai PowerMust" "1000 USB (PID: 5161)" "blazer_usb" "Mustek" "ups" "2" "Various" "" "blazer_ser" "Neus" "ups" "2" "400va / 600va" "" "blazer_ser" @@ -723,6 +745,7 @@ "NHS Sistemas de Energia" "ups" "5" "Expert S Online 8000" "" "gamatronic" "NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic" "NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic" +"NHS Sistemas de Energia" "ups" "5" "Laser Senoidal 5000VA" "USB" "gamatronic" # http://www.nhs.com.br/produtos_interna/id/T0RrPQ== "Nitram" "ups" "1" "Elite 500" "" "genericups upstype=8" "Nitram" "ups" "1" "Elite 2002" "" "genericups upstype=16" @@ -936,6 +959,7 @@ "Sweex" "ups" "1" "500/1000" "" "genericups upstype=7" "Sweex" "ups" "1" "1000" "USB" "richcomm_usb" "Sweex" "ups" "2" "(various)" "" "blazer_ser" +"Sweex" "ups" "2" "INTELLIGENT UPS 1500VA P220" "USB" "blazer_usb (USB ID 0665:5161)" # http://www.sweex.com/en/notebook-pc-accessoires/ups/PP220/ "Syndome" "ups" "2" "Era 500VA" "USB" "blazer_usb" @@ -1077,6 +1101,8 @@ "Trust" "ups" "2" "UPS 1200VA Management PW-4120M" "" "blazer_ser" "Trust" "ups" "2" "UPS 1300VA Management PW-4130M" "" "blazer_ser" +"TS Shara" "ups" "4" "(various)" "" "nutdrv_qx" + "UNITEK" "ups" "2" "ALPHA 500 IC" "" "blazer_ser" "UNITEK" "ups" "2" "Alpha 1000is" "" "blazer_ser" "UNITEK" "ups" "2" "Alpha 500" "" "blazer_ser" diff --git a/data/html/Makefile.in b/data/html/Makefile.in index 8ec093f..f455c4a 100644 --- a/data/html/Makefile.in +++ b/data/html/Makefile.in @@ -213,6 +213,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/docs/FAQ.txt b/docs/FAQ.txt index 8ce0b14..81c93df 100644 --- a/docs/FAQ.txt +++ b/docs/FAQ.txt @@ -561,6 +561,8 @@ The most frequent issue is that udev has not actually applied the rule: - and if the device USB cord was already plugged when installing NUT. In this case, just unplug and plug back the USB cord, then restart NUT. +Instead of unplugging, you might also be able to run `udevadm trigger +--subsystem-match=usb --action=change` to fix permissions. There was a mistake in the naming of the NUT udev rules file which resulted in the rules being overridden by another udev configuration file. While this has @@ -590,7 +592,7 @@ will appear in dmesg: usbfs: process 29641 (usbhid-ups) did not claim interface 0 before use This can be a symptom of a source install conflicting with a package install. -There is a rudimetary locking mechanism in NUT, but there is a chance that the +There is a rudimentary locking mechanism in NUT, but there is a chance that the packages might not use the same directory as the NUT default, and the conflict will be reported by the kernel. diff --git a/docs/Makefile.am b/docs/Makefile.am index 8ca7afd..c587aa5 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -111,18 +111,21 @@ A2X_COMMON_OPTS = $(ASCIIDOC_VERBOSE) --attribute icons \ $(A2X) $(A2X_COMMON_OPTS) --attribute=pdf_format --format=pdf -a docinfo1 $< if HAVE_ASPELL -# FIXME: also check ../{NEWS,README,UPGRADING}+other dirs # Non-interactively spell check all documentation source files. # This is useful for Buildbot and automated QA processing # FIXME: how to present output (std{out,err}, single file or per target)? +SPELLCHECK_SRC = $(ALL_TXT_SRC) ../README ../INSTALL.nut ../UPGRADING ../NEWS \ + ../TODO ../scripts/ufw/README ../scripts/augeas/README ../lib/README \ + ../tools/nut-scanner/README + spellcheck: - @for docsrc in $(ALL_TXT_SRC); do \ + @for docsrc in $(SPELLCHECK_SRC); do \ echo "Spell checking on $$docsrc"; \ LANG=C $(ASPELL) -a -t -p $(NUT_SPELL_DICT) < $$docsrc | grep [^*]; \ done # Interactively spell check all documentation source files spellcheck-interactive: - @for docsrc in $(ALL_TXT_SRC); do\ + @for docsrc in $(SPELLCHECK_SRC); do\ echo "Spell checking on $$docsrc"; \ LANG=C $(ASPELL) check -p $(NUT_SPELL_DICT) $$docsrc; \ done diff --git a/docs/Makefile.in b/docs/Makefile.in index 037296f..1a28021 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -242,6 +242,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ @@ -464,6 +465,14 @@ A2X_COMMON_OPTS = $(ASCIIDOC_VERBOSE) --attribute icons \ --attribute tree_version=@TREE_VERSION@ \ -a toc -a numbered --destination-dir=. + +# Non-interactively spell check all documentation source files. +# This is useful for Buildbot and automated QA processing +# FIXME: how to present output (std{out,err}, single file or per target)? +@HAVE_ASPELL_TRUE@SPELLCHECK_SRC = $(ALL_TXT_SRC) ../README ../INSTALL.nut ../UPGRADING ../NEWS \ +@HAVE_ASPELL_TRUE@ ../TODO ../scripts/ufw/README ../scripts/augeas/README ../lib/README \ +@HAVE_ASPELL_TRUE@ ../tools/nut-scanner/README + all: all-recursive .SUFFIXES: @@ -802,18 +811,14 @@ packager-guide.html packager-guide.chunked packager-guide.pdf: packager-guide.tx .txt.pdf: docinfo.xml $(A2X) $(A2X_COMMON_OPTS) --attribute=pdf_format --format=pdf -a docinfo1 $< -# FIXME: also check ../{NEWS,README,UPGRADING}+other dirs -# Non-interactively spell check all documentation source files. -# This is useful for Buildbot and automated QA processing -# FIXME: how to present output (std{out,err}, single file or per target)? @HAVE_ASPELL_TRUE@spellcheck: -@HAVE_ASPELL_TRUE@ @for docsrc in $(ALL_TXT_SRC); do \ +@HAVE_ASPELL_TRUE@ @for docsrc in $(SPELLCHECK_SRC); do \ @HAVE_ASPELL_TRUE@ echo "Spell checking on $$docsrc"; \ @HAVE_ASPELL_TRUE@ LANG=C $(ASPELL) -a -t -p $(NUT_SPELL_DICT) < $$docsrc | grep [^*]; \ @HAVE_ASPELL_TRUE@ done # Interactively spell check all documentation source files @HAVE_ASPELL_TRUE@spellcheck-interactive: -@HAVE_ASPELL_TRUE@ @for docsrc in $(ALL_TXT_SRC); do\ +@HAVE_ASPELL_TRUE@ @for docsrc in $(SPELLCHECK_SRC); do\ @HAVE_ASPELL_TRUE@ echo "Spell checking on $$docsrc"; \ @HAVE_ASPELL_TRUE@ LANG=C $(ASPELL) check -p $(NUT_SPELL_DICT) $$docsrc; \ @HAVE_ASPELL_TRUE@ done diff --git a/docs/config-notes.txt b/docs/config-notes.txt index 021033b..62983b5 100644 --- a/docs/config-notes.txt +++ b/docs/config-notes.txt @@ -30,7 +30,7 @@ configuration directive. This may be something like MONITOR, NOTIFYCMD, or ACCESS. The case does matter here. "monitor" won't be recognized. Next, the parser does not care about whitespace between words. If you -like to indent things with tabs or spaces, feel free to do it here. +like to indent things with tabs or spaces, feel free to do it here. If you need to set a value to something containing spaces, it has to be contained within "quotes" to keep the parser from splitting up the line. @@ -45,46 +45,46 @@ configuration directive for some reason. You can do that too. NOTIFYCMD "/bin/notifyme -foo -bar \"hi there\" -baz" -In other words, *\* can be used to escape the *"*. +In other words, `\` can be used to escape the `"`. -Finally, for the situation where you need to put the *\* character into your +Finally, for the situation where you need to put the `\` character into your string, you just escape it. NOTIFYCMD "/bin/notifyme c:\\dos\\style\\path" -The *\* can actually be used to escape any character, but you only really -need it for *\*, *"*, and *#* as they have special meanings to the parser. +The `\` can actually be used to escape any character, but you only really +need it for `\`, `"`, and `#` as they have special meanings to the parser. When using file names with space characters, you may end up having tricky -things since you need to write them inside *""* which must be escaped: +things since you need to write them inside `""` which must be escaped: NOTIFYCMD "\"c:\\path with space\\notifyme\" \"c:\\path with space\\name\"" -*#* is the comment character. Anything after an unescaped *#* is ignored. +`#` is the comment character. Anything after an unescaped `#` is ignored. Something like this... identity = my#1ups -... will actually turn into "identity = my", since the *#* stops the -parsing. If you really need to have a *#* in your configuration, then +will actually turn into `identity = my`, since the `#` stops the +parsing. If you really need to have a `#` in your configuration, then escape it. identity = my\#1ups Much better. -The *=* character should be used with care too. There should be only one -"simple" *=* character in a line: between the parameter name and its value. -All other *=* characters should be either escaped or within "quotes". +The `=` character should be used with care too. There should be only one +"simple" `=` character in a line: between the parameter name and its value. +All other `=` characters should be either escaped or within "quotes". password = 123=123 - ... is incorrect. You should use: +is incorrect. You should use: password = 123\=123 - ... or : +or: password = "123=123" @@ -95,7 +95,7 @@ You can put a backslash at the end of the line to join it to the next one. This creates one virtual line that is composed of more than one physical line. -Also, if you leave the *""* quote container open before a newline, it will +Also, if you leave the `""` quote container open before a newline, it will keep scanning until it reaches another one. If you see bizarre behavior in your configuration files, check for an unintentional instance of quotes spanning multiple lines. @@ -176,9 +176,9 @@ right one for your hardware. You might need to try other drivers by changing the "driver=" value in ups.conf. Be sure to check the driver's man page to see if it needs any extra -settings in ups.conf to detect your hardware. +settings in `ups.conf` to detect your hardware. -If it says "can't bind /var/state/ups/..." or similar, then your +If it says `can't bind /var/state/ups/...` or similar, then your state path probably isn't writable by the driver. Check the <>. @@ -204,7 +204,7 @@ NOTE: Refer to the NUT user manual <> for information on how to access and secure upsd clients connections. Next, create upsd.users. For now, this can be an empty file. -You can come back and add more to it later when it's time to +You can come back and add more to it later when it's time to configure upsmon or run one of the management tools. Do not make either file world-readable, since they both hold @@ -266,7 +266,7 @@ You should see just one line in response: OL means your system is running on line power. If it says something else (like OB - on battery, or LB - low battery), your driver was probably misconfigured during the <> -step. If you reconfigure the driver, use 'upsdrvctl stop' to stop it, then +step. If you reconfigure the driver, use `upsdrvctl stop` to stop it, then start it again as shown in the <> step. Reference: man page: linkman:upsc[8] @@ -335,7 +335,7 @@ Reference: man page: linkman:upsc[8], Startup scripts ~~~~~~~~~~~~~~~ -NOTE: This step is not need if you installed from packages. +NOTE: This step is not necessary if you installed from packages. Edit your startup scripts, and make sure upsdrvctl and upsd are run every time your system starts. @@ -347,7 +347,7 @@ Configuring automatic shutdowns for low battery events The whole point of UPS software is to bring down the OS cleanly when you run out of battery power. Everything else is roughly eye candy. -To make sure your system shuts down properly, you will need to perform some +To make sure your system shuts down properly, you will need to perform some additional configuration and run upsmon. Here are the basics. [[Shutdown_design]] @@ -384,9 +384,9 @@ The exact behavior depends on the specific device, and is related to: - call their SHUTDOWNCMD - disconnect from upsd -5. The upsmon master system waits up to HOSTSYNC seconds (typically 15) - for the slaves to disconnect from upsd. If any are connected after - this time, upsmon stops waiting and proceeds with the shutdown +5. The upsmon master system waits up to HOSTSYNC seconds (typically 15) + for the slaves to disconnect from upsd. If any are connected after + this time, upsmon stops waiting and proceeds with the shutdown process. 6. The upsmon master: @@ -433,7 +433,7 @@ References: linkman:upsd[8], linkman:upsd.users[5] Reloading the data server ^^^^^^^^^^^^^^^^^^^^^^^^^ -Reload upsd. Depending on your configuration, you may be able to +Reload upsd. Depending on your configuration, you may be able to do this without stopping upsd: /usr/local/ups/sbin/upsd -c reload @@ -441,7 +441,7 @@ do this without stopping upsd: If that doesn't work (check the syslog), just restart it: /usr/local/ups/sbin/upsd -c stop - /usr/local/ups/sbin/upsd + /usr/local/ups/sbin/upsd NOTE: if you want to make reloading work later, see the entry in the link:FAQ.html[FAQ] about starting upsd as a different user. @@ -479,7 +479,7 @@ adding sensitive data in the next step. Create a MONITOR directive for upsmon ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Edit upsmon.conf and create a MONITOR line with the UPS definition +Edit upsmon.conf and create a MONITOR line with the UPS definition (@), username and password from the <> step, and the master or slave setting. @@ -655,7 +655,7 @@ to keep this running either. After stopping driver, server and client you'll have to send the UPS the command to shutdown only if the POWERDOWNFLAG is present. Note -that most likely you'll have to allow for a grace period after sending +that most likely you'll have to allow for a grace period after sending 'upsdrvctl shutdown' since the system will still have to take a snapshot of itself after that. Not all drivers support this, so before going down this road, make sure that the one you're using does. @@ -706,7 +706,7 @@ for individual hosts: A small to medium sized data room usually has one C and a bunch of Bs. This means that there's a system (type C) hooked to the UPS which depends -on it for power. There are also some other systems in there (type B) +on it for power. There are also some other systems in there (type B) which depend on that same UPS for power, but aren't directly connected to it. @@ -715,7 +715,7 @@ of the "single C, many Bs" depending on how it's all wired. Finally, there's a special case. Type A systems are connected to a UPS's serial port, but don't depend on it for power. This usually happens when -a UPS is physically close to a box and can reach the serial port, but +a UPS is physically close to a box and can reach the serial port, but the wiring is such that it doesn't actually feed it. Once you identify a system's type, use this list to decide which of the diff --git a/docs/configure.txt b/docs/configure.txt index 9b12481..aff82c1 100644 --- a/docs/configure.txt +++ b/docs/configure.txt @@ -90,9 +90,9 @@ Verbose output can be enabled using: ASCIIDOC_VERBOSE=-v make This feature requires AsciiDoc 8.6.3 (http://www.methods.co.nz/asciidoc). - --with-lib (default: no) + --with-dev (default: no) -Build and install the upsclient library and header files. +Build and install the upsclient and nutclient library and header files. --with-all (no default) @@ -227,7 +227,7 @@ Sets the base directories for the man pages. The default is --includedir=PATH -Sets the path for include files to be installed when --with-lib is +Sets the path for include files to be installed when `--with-dev` is selected. For example, upsclient.h is installed here. The default is /include. @@ -266,7 +266,7 @@ HTML files will be installed to this path. By default, this is --with-pkgconfig-dir=PATH Where to install pkg-config *.pc files. This option only has an -effect if --with-lib is selected, and causes a pkg-config file to +effect if `--with-dev` is selected, and causes a pkg-config file to be installed in the named location. The default is /pkgconfig. diff --git a/docs/documentation.txt b/docs/documentation.txt index 4483117..ab3bd2c 100644 --- a/docs/documentation.txt +++ b/docs/documentation.txt @@ -46,11 +46,13 @@ Offsite Links ------------- [[general_powerdev_info]] -These are general information about UPS and PDU. +These are general information about UPS, PDU, ATS, PSU and SCD: - link:http://tldp.org/HOWTO/UPS-HOWTO/[UPS HOWTO] (The Linux Documentation Project) - link:http://en.wikipedia.org/wiki/Uninterruptible_power_supply[UPS on Wikipedia] - link:http://en.wikipedia.org/wiki/Power_distribution_unit[PDU on Wikipedia] +- link:https://en.wikipedia.org/wiki/Transfer_switch[Automatic Transfer Switch] +- link:https://en.wikipedia.org/wiki/Power_supply_unit_%28computer%29[Power Supply Units] - link:http://en.wikipedia.org/wiki/Solar_controller[Solar controller on Wikipedia] - link:http://www.pcguide.com/ref/power/ext/ups/over.htm[UPS on The PC Guide] diff --git a/docs/download.txt b/docs/download.txt index 3991b1c..e43ce48 100644 --- a/docs/download.txt +++ b/docs/download.txt @@ -103,11 +103,11 @@ NOTE: The only official releases from this project are source code. NUT is already available in the following systems: - Linux: -link:http://aur.archlinux.org/packages.php?ID=5379[Arch Linux], +link:https://aur.archlinux.org/packages/network-ups-tools[Arch Linux], link:http://packages.debian.org/nut[Debian], link:http://packages.gentoo.org/package/sys-power/nut[Gentoo Linux], Mandriva, -link:https://admin.fedoraproject.org/pkgdb/acls/name/nut[Red Hat / Fedora], +link:https://apps.fedoraproject.org/packages/nut[Red Hat / Fedora], link:http://software.opensuse.org/package/nut[Novell Suse / openSUSE], link:https://forum.openwrt.org/viewtopic.php?id=26269[OpenWrt], link:http://packages.ubuntu.com/nut[Ubuntu], @@ -115,16 +115,16 @@ link:https://github.com/voidlinux/xbps-packages/blob/master/srcpkgs/network-ups- - BSD systems: link:http://www.FreeBSD.org/cgi/ports.cgi?query=^nut-&stype=name[FreeBSD], -link:ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/sysutils/ups-nut/README.html[NetBSD], -link:http://www.openbsd.org/cgi-bin/cvsweb/ports/sysutils/nut/[OpenBSD], -link:http://doc.freenas.org/index.php/UPS[FreeNAS]. +link:http://pkgsrc.se/sysutils/ups-nut[NetBSD], +link:http://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/sysutils/nut/[OpenBSD], +link:http://doc.freenas.org/9.3/freenas_services.html#ups[FreeNAS]. - Mac OS X: link:http://pdb.finkproject.org/pdb/package.php/nut[Fink], link:http://trac.macports.org/browser/trunk/dports/sysutils/nut/Portfile[MacPorts] - Windows (complete port, Beta): -link:http://www.networkupstools.org/package/windows/NUT-Installer-2.6.5-3.msi[Windows MSI installer 2.6.5-3] +link:http://www.networkupstools.org/package/windows/NUT-Installer-2.6.5-6.msi[Windows MSI installer 2.6.5-6] Java packages diff --git a/docs/features.txt b/docs/features.txt index 8e25259..eef38b6 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -18,10 +18,12 @@ More and more appliances manufacturers are bundling NUT... Multiple manufacturer and device support ---------------------------------------- -- Monitors many UPS, PDU and SCD models from more than 100 manufacturers with a -unified interface (link:stable-hcl.html[Hardware Compatibility List]). +- Monitors many UPS, PDU, ATS, PSU and SCD models from more than 140 +manufacturers with a unified interface +(link:stable-hcl.html[Hardware Compatibility List]). -- Various communication types are supported with the same common interface: +- Various communication types and many protocols are supported with the same +common interface: * serial, * USB, * network (SNMP, Eaton / MGE XML/HTTP). diff --git a/docs/images/nut_layering.png b/docs/images/nut_layering.png index ff451b4bc4db1e403ab32e20d4f2213fa1655862..41f650c593dc25baaa3d945432a1edaf00725704 100644 GIT binary patch literal 231026 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 PO+v}>q@;jv?~MTX{jOs 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%0DoOwV^;Pl?r25LBQ>1vX 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