Subject: [bug#44258] Add Network UPS Tools

From: Nicolò Balzarotti <[email-masked]>
Date: Sat, 14 Nov 2020 17:45:11 +0100

Hi, thanks for the reply.

Marius Bakke <[email-masked]> writes:

>
> Avoid hard-coding versions in URLs.  You can use the version-major+minor
> procedure to create that "2.7" URL component.

Done!

> This got merged in 2017, and still not released!
>
> Looking at the pull request[0], this URL is a squashed version of 7
> commits.  While convenient, this trick has failed before due to subtle
> changes in GitHub machinery, eventually leading to a hash mismatch[1].
>
> Taking 7 patches directly is no fun either, so I wonder if we can just
> stick with OpenSSL 1.0 for now?
>
Fine! Using openssl-1.0 now.

>> +                           ;; powerman is required (where is it hosted?)
>> +                           "--without-powerman"
>
> Can you elaborate on powerman being required?  Is the package not usable
> without it?
>
Expanded a bit, following nut readme.

>> +                           ;; cgi requires libgd
>> +                           "--without-cgi")
>
> We do have libgd (in the 'gd' package).
>
Oh, I don't know how I missed it.  Added!  Now cgi is working (output is
in folder /cgi-bin, is this correct for guix?)

Since nut release is really old, it used to use gdlib-config.  It has 
been removed and replaced by pkg-config.  However, the patch [1] does
not apply.  So I had to do the "terrible" fix of calling pkg-config
myself (in the new "fix-ligdb-check" phase).  Terrible because I wanted
to call it in guile and save the output to the file, but the only way I
know of is with popen (and I could not find another package doing this
(while some package like python-libmpsse are just inserting the call
like I did here).

>> +       #:phases
>> +       (modify-phases %standard-phases
>> +         (add-before 'configure 'update-configure
>> +           ;; required to apply the patch to the ./configure script
>> +           (lambda _
>> +             (invoke "autoconf"))))))
>
> This may not be necessary due to the 'bootstrap' phase (but I haven't
> verified).
>
Well, now that I switched to openssl-1.0 it sure is not needed anymore.
But previously I remember without the autoreconf call, it was not working.

>> +    (native-inputs `(("autoconf" ,autoconf)n
>> +                     ("cppunit" ,cppunit)
>> +                     ("pkg-config" ,pkg-config)))
>> +    (inputs `(("avahi" ,avahi)
>> +              ("libusb" ,libusb-compat)
>> +              ("libltdl" ,libltdl)
>> +              ("freeipmi" ,freeipmi)
>> +              ("neon" ,neon)
>> +              ("openssl" ,openssl)
>> +              ("net-snmp" ,net-snmp)))
>
> The indentation of these are a bit weird.  :-)
>
ops :)

>> +    (home-page "https://networkupstools.org")
>> +    (license
>> +     (list
>> +      ;; - most files under gpl2+
>> +      license:gpl2+
>> +      ;; - scripts/python/ under gpl3+
>> +      license:gpl3+
>> +      ;; - scripts/perl/Nut.pm same as perl (either gpl1+ or artistic)
>> +      license:gpl1+ license:artistic2.0))
>
> Great job at listing licenses!
>
>> +    (synopsis "Collection of programs for monitoring and administering UPS")
>> +    (description "Network UPS Tools is a collection of programs which provide
>> +a common interface for monitoring and administering UPS, PDU and SCD hardware.
>> +It uses a layered approach to connect all of the parts.  Drivers are provided
>> +for a wide assortment of equipment.")))
>
> Maybe add @acronym{UPS, Uninterruptible Power Supply},
> @acronym{PDU, ...} etc, but no strong opinion.
>
Sure!

> Can you send an updated patch?

I also added the phase "fix-search-paths" which fixes nut-scanner.
nut scanner now finds my ups device (but I still could not get it to
work, not sure if the problem is in my config or in this package.  I'd
wait to merge this until someone can try.

Thanks again,
Nicolò

>From baf9ef419fb36a2198597894c72b23d8553b012a Mon Sep 17 00:00:00 2001
From: nixo <[email-masked]>
Date: Tue, 27 Oct 2020 10:56:35 +0100
Subject: [PATCH v2] gnu: Add nut.

* gnu/packages/admin.scm (nut): New variable.
---
 gnu/packages/admin.scm | 87 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 87 insertions(+)

diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 8dcf8afd84..5f14c4b68a 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -35,6 +35,7 @@
 ;;; Copyright © 2020 Michael Rohleder <[email-masked]>
 ;;; Copyright © 2020 Vincent Legoll <[email-masked]>
 ;;; Copyright © 2020 Morgan Smith <[email-masked]>
+;;; Copyright © 2020 Nicolò Balzarotti <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -70,6 +71,7 @@
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages autogen)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages avahi)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages bison)
@@ -85,8 +87,10 @@
   #:use-module (gnu packages elf)
   #:use-module (gnu packages file)
   #:use-module (gnu packages flex)
+  #:use-module (gnu packages freeipmi)
   #:use-module (gnu packages gawk)
   #:use-module (gnu packages gettext)
+  #:use-module (gnu packages gd)
   #:use-module (gnu packages gl)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
@@ -110,6 +114,7 @@
   #:use-module (gnu packages mcrypt)
   #:use-module (gnu packages mpi)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages networking)
   #:use-module (gnu packages openldap)
   #:use-module (gnu packages patchutils)
   #:use-module (gnu packages pciutils)
@@ -880,6 +885,88 @@ IPv6, proxies, and Unix sockets.")
     (license (list license:bsd-3
                    license:bsd-2))))  ; atomicio.*, socks.c
 
+(define-public nut
+  (package
+    (name "nut")
+    (version "2.7.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://networkupstools.org/source/" (version-major+minor version)
+             "/nut-" version ".tar.gz"))
+       (sha256
+        (base32
+         "19r5dm07sfz495ckcgbfy0pasx0zy3faa0q7bih69lsjij8q43lq"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       `("--with-all"
+         "--with-openssl"
+         ;; nut supports a bridge to the powerman-daemon to handle
+         ;; powerman-supported devices.  For this bridge, powerman is
+         ;; required.
+         "--without-powerman"
+         ,(string-append "--with-udev-dir="
+                         (assoc-ref %outputs "out")
+                         "/lib/udev"))
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'fix-libgd-check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (substitute* "configure"
+               (("-L/usr/X11R6/lib")
+                ;; without --static, it won't find zlib and libjpeg
+                "$(pkg-config --static --libs gdlib)"))
+             #t))
+         (add-before 'build 'fix-search-paths
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             ;; nutscan will search libraries only under output/lib, and in
+             ;; some standard path (e.g., /usr/lib).  Add correct paths here
+             (substitute* "tools/nut-scanner/nutscan-init.c"
+               (("LIBDIR,")
+                (string-append
+                 "LIBDIR,\n"
+                 (string-join
+                  (map (lambda (label)
+                         (string-append "\"" (assoc-ref inputs label) "/lib/\""))
+                       '("avahi" "freeipmi" "libusb" "neon" "net-snmp"))
+                  ",\n")
+                 ",\n")))
+             #t)))))
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("cppunit" ,cppunit)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("avahi" ,avahi)
+       ("libusb" ,libusb-compat)
+       ("libltdl" ,libltdl)
+       ;; libxpm and libx11 required when cgi is enabled
+       ("libxpm" ,libxpm)
+       ("libx11" ,libx11)
+       ("freeipmi" ,freeipmi)
+       ("gd" ,gd)
+       ("neon" ,neon)
+       ("openssl" ,openssl-1.0)
+       ("net-snmp" ,net-snmp)))
+    (home-page "https://networkupstools.org")
+    (license
+     (list
+      ;; - most files under gpl2+
+      license:gpl2+
+      ;; - scripts/python/ under gpl3+
+      license:gpl3+
+      ;; - scripts/perl/Nut.pm same as perl (either gpl1+ or artistic)
+      license:gpl1+ license:artistic2.0))
+    (synopsis "Collection of programs for monitoring and administering UPS")
+    (description "Network @acronym{UPS, Uninterruptible Power Supply} Tools is
+a collection of programs which provide a common interface for monitoring and
+administering @acronym{UPS} @acronym{PDU,Power Distribution Unit} and
+@acronym{SCD, Solar Controller Device} hardware.  It uses a layered approach
+to connect all of the parts.  Drivers are provided for a wide assortment of
+equipment.")))
+
 (define-public sipcalc
   (package
     (name "sipcalc")
-- 
2.29.2

[1] https://github.com/networkupstools/nut/pull/809/commits/cb507c44d26d8ae04a0cc3d1c24e79e3bf33ba23