SteScho / manubulon-snmp

Set of Icinga/Nagios plugins to check hosts and hardware with the SNMP protocol.
GNU General Public License v2.0
73 stars 71 forks source link

Check_snmp_storage.pl gives me a use of 123% #51

Open einMarco opened 6 years ago

einMarco commented 6 years ago

Hey, I try to monitor a Mac Mini in my Network, it has a mounted drive via AFP, that gives me a usage of 123%, whats seems a little impossible. ;)

My call for the hole Mac is this:

/usr/lib/nagios/plugins/check_snmp_storage.pl -H x.x.x.x -C public -m / -w 80 -c 90

And the output is:

/: 25%used(58994MB/239172MB) /Network/Servers: 0%used(0MB/0MB) /Volumes/ARQ: 123%used(2143914MB/1739805MB) /Volumes/Promise Pegasus: 24%used(2777550MB/11443754MB) /dev: 100%used(0MB/0MB) /home: 0%used(0MB/0MB) /net: 0%used(0MB/0MB) /private/var/vm: 1%used(3072MB/239172MB) (>90%) : CRITICAL

The ARQ drive has a volume of 19,42 TB and has free 17,17 TB.

Would be cool, if that could be fixed.

dnsmichi commented 6 years ago

You might want to look into the code regions where this is calculated. I would believe that there's an overflow somewhere.

einMarco commented 6 years ago

I think the issue is with this part:

if (version->parse(Net::SNMP->VERSION) >= 4) {
    foreach my $key (sort keys %$result) {

        # Fix for filesystems larger 2 TB. More than 2 TB will cause an error because
        # as defined in the RFC hrStorageSize is a 32 bit integer. So filesystems
        # larger 2 TB report a negative value because the first bit will be interpreted
        # as an algebraic sign. (0 = +, all others will be -). You simply have to add
        # 2 to the power of 32 (4294967296) and it is fixed.
        # Martin Fuerstenau, Oce Printing Systems, 25th Sept 2012
        if ($$result{$key} < 0) {
            $$result{$key} = $$result{$key} + 4294967296;
        }
        verb("$key  x $$result{$key}");
    }
}

It looks like there is an overflow. If I'm correct the max volume size with int32 is 4TB. But when I change it to the max value of int64 "9223372036854775807" it still gets an overflow. Maybe perl needs to have the ability for int64? Maybe that helps you?