Packages: nut-upsmon broken - tmpfs configuration files not created

Created on 1 Aug 2018  路  21Comments  路  Source: openwrt/packages

Maintainer: @cshoredaniel
Environment: AMD GX-412TC SOC, PC Engines APU2, OpenWrt 18.06.0, x86_64)

Description:
Today I performed a sysupgrade via LUCI webGUI from 17.01.4 to 18.06.0.

Installed NUT packages:

nut - 2.7.4-4
nut-common - 2.7.4-4
nut-upsc - 2.7.4-4
nut-upslog - 2.7.4-4
nut-upsmon - 2.7.4-4

I have configured NUT as slave to monitor a master in my LAN, e.g. MODE=netclient in /etc/nut.conf.

/etc/init.d//etc/init.d/nut-monitor cannot be started as it complains about missing /var/etc/nut directory and files in it.
I can manually configure and start nut-upsmon:

mkdir /var/etc/nut && echo "MODE=netclient" > /var/etc/nut/nut.conf
/etc/init.d//etc/init.d/nut-monitor enable
/etc/init.d//etc/init.d/nut-monitor start

As a partial workaround I added to start_service() of /etc/init.d//etc/init.d/nut-monitor the following code:

mkdir -p /var/etc/nut
chmod -R 750 /var/etc/nut

This partial workaround preserves the subdirectory "nut" under /var/etc during a reboot. However, nut-upsmon does not start automatically during boot.

Most helpful comment

Script runs like a charm, thanks a lot.

All 21 comments

Will look into it; it was working for me, but I don't remember if I did upsmon standalone...will review. I may have had a PR for that that I closed.

@petvoigt For your work around you also need chown nut:nut /var/etc/nut

It looks like I missed submitting the fix for upsmon on it's own. Will create a PR and and backport PR and we'll see if the backport gets accepted for 18.06.

@petvoigt Also, after the chmod of '$UPSMON_C' and '/var/etc/nut.conf' you need

    chown ${runas:-root}:$(id -gn ${runas:-root}) $UPSMON_C                                    
    chown ${runas:-root}:$(id -gn ${runas:-root}) /var/etc/nut/nut.conf

I know how I missed it now...didn't test upsmon alone and the way I was using nut-server it took care of this business.
Also can you verify nut user and group were created? (opkg should have taken care of that).

Will test the above PR and submit.

@cshoredaniel, ah, sounds good. Thank your for your quick reply and many thanks for the quickly updated NUT documentation under https://openwrt.org/docs/guide-user/services/ups/software.nut.

UID nut and GID nut are present on my system:

id nut
uid=113(nut) gid=113(nut) groups=113(nut),113(nut)

However, I dont' know what to do with $UPSMON_C - in fact it is empty. I tried:

echo $UPSMON_C

Accidently closed issue (wrong button), reopened immetiately.

@petvoigt Sorry for not being clear: that needs to be in the initscript

@cshoredaniel, thanks for clarifying.

After the above mentioned changes to /etc/init.d/nut-monitor I further have to do after every reboot:

chown nut:nut /var/etc/nut
chown nut:nut /var/etc/nut/nut.conf
/etc/init.d/nut-monitor start

Could you please tell me, which NUT packages are affected by your patch and could you please report here, when I can update the affected packages to test your changes?

Only package nut-upsmon will be affected and it's just updating the initscript appropriately

Ah, I caught /var/etc/nut in my PR, will check nut.conf.

And I wouldn't count on updates to the packages a downloads.openwrt.com until the .1 release (but that probably won't be that long as there are already errata being corrected in core too).

I'll post the final initscript revision here (after testing) so you can at least have that on-router until the updated package is available.

Thanks a lot. I will keep this issue open until I have tested at least the updated initscript.

If you could leave it until PR is merged that would be best! That way others can find it.

OK, if I understand correctly, this will be after testing the .1 release.

Oh, no worries, it'll autoclose when the PR is merged due to commit message.

OK, did not know this;-)

Ok, put the script below in /etc/init.d/nut-monitor on the device and you ought to be good on reboot.

#!/bin/sh /etc/rc.common

START=60
USE_PROCD=1
UPSMON_C=/var/etc/nut/upsmon.conf

nut_upsmon_conf() {
    local cfg="$1"

    echo "# Config file automatically generated from UCI config" > $UPSMON_C

    config_get runas "$cfg" runas "nut"
    [ -n "$runas" ] && echo "RUN_AS_USER $runas" >> $UPSMON_C

    config_get val "$cfg" minsupplies 1
    echo "MINSUPPLIES $val" >> $UPSMON_C

    config_get val "$cfg" shutdowncmd "/sbin/halt"
    echo "SHUTDOWNCMD \"$val\"" >> $UPSMON_C

    config_get val "$cfg" notifycmd
    [ -n "$val" ] && echo "NOTIFYCMD \"$val\"" >> $UPSMON_C

    config_get val "$cfg" pollfreq 5
    echo "POLLFREQ $val" >> $UPSMON_C

    config_get val "$cfg" pollfreqalert 5
    echo "POLLFREQALERT $val" >> $UPSMON_C

    config_get val "$cfg" hostsync 15
    echo "HOSTSYNC $val" >> $UPSMON_C

    config_get val "$cfg" deadtime 15
    echo "DEADTIME $val" >> $UPSMON_C

    config_get val "$cfg" powerdownflag /var/run/killpower
    echo "POWERDOWNFLAG $val" >> $UPSMON_C

    config_get val "$cfg" onlinemsg
    [ -n "$val" ] && echo "NOTIFYMSG ONLINE \"$val\"" >> $UPSMON_C
    config_get val "$cfg" onbattmsg
    [ -n "$val" ] && echo "NOTIFYMSG ONBATT \"$val\"" >> $UPSMON_C
    config_get val "$cfg" lowbattmsg
    [ -n "$val" ] && echo "NOTIFYMSG LOWBATT \"$val\"" >> $UPSMON_C
    config_get val "$cfg" fsdmsg
    [ -n "$val" ] && echo "NOTIFYMSG FSD \"$val\"" >> $UPSMON_C
    config_get val "$cfg" commokmsg
    [ -n "$val" ] && echo "NOTIFYMSG COMMOK \"$val\"" >> $UPSMON_C
    config_get val "$cfg" commbadmsg
    [ -n "$val" ] && echo "NOTIFYMSG COMMBAD \"$val\"" >> $UPSMON_C
    config_get val "$cfg" shutdownmsg
    [ -n "$val" ] && echo "NOTIFYMSG SHUTDOWN \"$val\"" >> $UPSMON_C
    config_get val "$cfg" replbattmsg
    [ -n "$val" ] && echo "NOTIFYMSG REPLBATT \"$val\"" >> $UPSMON_C
    config_get val "$cfg" nocommmsg
    [ -n "$val" ] && echo "NOTIFYMSG NOCOMM \"$val\"" >> $UPSMON_C
    config_get val "$cfg" noparentmsg
    [ -n "$val" ] && echo "NOTIFYMSG NOPARENT \"$val\"" >> $UPSMON_C

    notifylist() {
        local value="$1"
        append optval "$value" "+"
    }

    setnotify() {
        local cfg="$1"
        local optname="$2"
        local optval
        config_list_foreach "$cfg" "$optname" notifylist
        if [ -z "$optval" ]; then
            # If no list fallback to trying option, fallback to default
            config_get optval "$cfg" "$optname" "$default"
            if [ -n "$optval" ]; then
                echo "$optval"
            else
                # No default, so do the NUT default
                echo "SYSLOG"
            fi
        else
            echo "$optval"
        fi
        }

    local default optval
    val=""
    config_list_foreach "$cfg" defaultnotify notifylist
    default="$optval"
    echo "NOTIFYFLAG ONLINE $(setnotify "$cfg" onlinenotify)" >> $UPSMON_C
    echo "NOTIFYFLAG ONBATT $(setnotify "$cfg" onbattnotify)" >> $UPSMON_C
    echo "NOTIFYFLAG LOWBATT $(setnotify "$cfg" lowbatnotify)" >> $UPSMON_C
    echo "NOTIFYFLAG FSD $(setnotify "$cfg" fsdnotify)" >> $UPSMON_C
    echo "NOTIFYFLAG COMMOK $(setnotify "$cfg" commoknotify)" >> $UPSMON_C
    echo "NOTIFYFLAG COMMBAD $(setnotify "$cfg" commbadnotify)" >> $UPSMON_C
    echo "NOTIFYFLAG SHUTDOWN $(setnotify "$cfg" shutdownnotify)" >> $UPSMON_C
    echo "NOTIFYFLAG REPLBATT $(setnotify "$cfg" repolbattnotify)" >> $UPSMON_C
    echo "NOTIFYFLAG NOCOMM $(setnotify "$cfg" nocommnotify)" >> $UPSMON_C
    echo "NOTIFYFLAG NOPARENT $(setnotify "$cfg" noparentnotify)" >> $UPSMON_C

    config_get val "$cfg" rbwarntime 43200
    echo "RBWARNTIME $val" >> $UPSMON_C

    config_get val "$cfg" nocommwarntime 300
    echo "NOCOMMWARNTIME $val" >> $UPSMON_C

    config_get val "$cfg" finaldelay 5
    echo "FINALDELAY $val" >> $UPSMON_C

    config_get val "$cfg" certpath
    if [ -n "$val" ]; then echo "CERTPATH $val" >> $UPSMON_C; fi

    config_get_bool val "$cfg" certverify 0
    if [ -n "$val" ]; then echo "CERTVERIFY $val" >> $UPSMON_C; fi

    config_get_bool val "$cfg" forcessl 0
    if [ -n "$val" ]; then echo "FORCESSL $val" >> $UPSMON_C; fi
}

nut_upsmon_add() {
    local cfg="$1"
    local type="$2"
    local upsname
    local hostname
    local port
    local powervalue
    local username
    local password
    local system

    # if UPSMON_C is a symlink we're only doing generated config
    [ -L $UPSMON_C ] && {
        rm -f $UPSMON_C
        nut_upsmon_conf ""
    }

    config_get upsname "$cfg" upsname
    config_get hostname "$cfg" hostname localhost
    config_get port "$cfg" port
    config_get powervalue "$cfg" powervalue 1
    config_get username "$cfg" username
    config_get password "$cfg" password
    system="$upsname@$hostname"
    if [ -n "$port" ]; then
        system="$system:$port";
    fi
    echo "MONITOR $system $powervalue $username $password $type" >> $UPSMON_C
}

start_service() {
    mkdir -p "$(dirname "$UPSMON_C")"
    chmod 750 "$(dirname "$UPSMON_C")"

    config_load nut_monitor

    config_foreach nut_upsmon_conf upsmon
    config_foreach nut_upsmon_add master master
    config_foreach nut_upsmon_add slave slave

    [ -z "$(cat /var/etc/nut/nut.conf)" ] && echo "MODE=netclient" >>/var/etc/nut/nut.conf

    chmod 640 $UPSMON_C
    chmod 640 /var/etc/nut/nut.conf

    chown ${runas:-root}:$(id -gn ${runas:-root}) /var/etc/nut
    chown ${runas:-root}:$(id -gn ${runas:-root}) /var/etc/nut/nut.conf
    chown ${runas:-root}:$(id -gn ${runas:-root}) $UPSMON_C

    [ -d /var/run/nut ] || {
        mkdir -m 0750 -p /var/run/nut
        chown ${runas:-root}:$(id -gn ${runas:-root}) /var/run/nut
    }

    exec $DEBUG /usr/sbin/upsmon $UPSMON_OPTIONS
}

stop_service() {
    exec /usr/sbin/upsmon -c stop
}

reload_service() {
    exec /usr/sbin/upsmon -c reload
}

Script runs like a charm, thanks a lot.

Excellent! And thank you for your helping get this fixed!

On 2018-08-02 02:22 PM, Dr. Peter Voigt wrote:

Script runs like a charm, thanks a lot.

Just FYI, because of a CVE it looks like 18.06.1 is going to be built
and may be available this weekend. If it includes packages you may get
the nice present of the updated NUT a lot sooner than expected!

Also, I've updated the Wiki page for NUT with proper UCI documentation.

Regards,

Daniel

On Wed, 08 Aug 2018 10:31:27 -0700
Daniel Dickinson notifications@github.com wrote:

On 2018-08-02 02:22 PM, Dr. Peter Voigt wrote:

Script runs like a charm, thanks a lot.

Just FYI, because of a CVE it looks like 18.06.1 is going to be built
and may be available this weekend. If it includes packages you may
get the nice present of the updated NUT a lot sooner than expected!

Also, I've updated the Wiki page for NUT with proper UCI
documentation.

Regards,

Daniel

Thanks for this hint. I have scheduled upgrade time this weekend for
18.06.1. The NUT documentation has become valuable and comprehensive -
nice.

Regards,
Peter

@petvoigt FYI I've posted PR: https://github.com/openwrt/packages/pull/7638 which ought to do must of what's now in master except the USB hotplug bits (as that's a new feature IMO). If you can, please test and comment!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

valentt picture valentt  路  8Comments

peterwillcn picture peterwillcn  路  9Comments

muddyfeet picture muddyfeet  路  9Comments

zivkovic picture zivkovic  路  12Comments

TeHashX picture TeHashX  路  8Comments