Cacti / cacti

Cacti ™
http://www.cacti.net
GNU General Public License v2.0
1.63k stars 404 forks source link

ss_host_disk.php is not finding hrStorageAllocationUnits for device #1733

Closed jackouille-ch closed 6 years ago

jackouille-ch commented 6 years ago

I got the following kind of error for data collected on disks from Linux servers:

2018/07/23 11:29:03 - CMDPHP PHP ERROR WARNING Backtrace: (/script_server.php: 225 ss_host_disk)(/scripts/ss_host_disk.php: 93 CactiErrorHandler)(/lib/functions.php: 4727 cacti_debug_backtrace)

2018/07/23 11:29:03 - ERROR PHP WARNING: A non-numeric value encountered in file: /usr/share/cacti/scripts/ss_host_disk.php on line: 93

netniV commented 6 years ago

Could you upload a copy of your ss_host_disk.php? You'll probably need to rename the extension to .txt to upload it here.

netniV commented 6 years ago

I'm asking because line 93 for me is in the middle of parameters to a function, and I would not expect that part to be invalid.

jackouille-ch commented 6 years ago

ss_host_disk.txt

<?php

/* do NOT run this script through a web browser */
if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD'])  || isset($_SERVER['REMOTE_ADDR'])) {
    die("<br><strong>This script is only meant to run at the command line.</strong>");
}

$no_http_headers = true;

/* display No errors */
error_reporting(0);

if (isset($config)) {
    include_once(dirname(__FILE__) . "/../lib/snmp.php");
}

if (!isset($called_by_script_server)) {
    include_once(dirname(__FILE__) . "/../include/global.php");
    include_once(dirname(__FILE__) . "/../lib/snmp.php");

    array_shift($_SERVER["argv"]);

    print call_user_func_array("ss_host_disk", $_SERVER["argv"]);
}

function ss_host_disk($hostname, $host_id, $snmp_auth, $cmd, $arg1 = "", $arg2 = "") {
    $snmp = explode(":", $snmp_auth);
    $snmp_version   = $snmp[0];
    $snmp_port      = $snmp[1];
    $snmp_timeout   = $snmp[2];
    $ping_retries   = $snmp[3];
    $max_oids       = $snmp[4];

    $snmp_auth_username     = "";
    $snmp_auth_password     = "";
    $snmp_auth_protocol     = "";
    $snmp_priv_passphrase   = "";
    $snmp_priv_protocol     = "";
    $snmp_context           = "";
    $snmp_community         = "";

    if ($snmp_version == 3) {
        $snmp_auth_username   = $snmp[6];
        $snmp_auth_password   = $snmp[7];
        $snmp_auth_protocol   = $snmp[8];
        $snmp_priv_passphrase = $snmp[9];
        $snmp_priv_protocol   = $snmp[10];
        $snmp_context         = $snmp[11];
    }else{
        $snmp_community = $snmp[5];
    }

    $oids = array(
        "total"         => ".1.3.6.1.2.1.25.2.3.1.5",
        "used"          => ".1.3.6.1.2.1.25.2.3.1.6",
        "failures"      => ".1.3.6.1.2.1.25.2.3.1.7",
        "index"         => ".1.3.6.1.2.1.25.2.3.1.1",
        "description"   => ".1.3.6.1.2.1.25.2.3.1.3",
        "sau"           => ".1.3.6.1.2.1.25.2.3.1.4"
        );

    if ($cmd == "index") {
        $return_arr = ss_host_disk_reindex(cacti_snmp_walk($hostname, $snmp_community, $oids["index"], $snmp_version, $snmp_auth_username, $snmp_auth_password, $snmp_auth_protocol, $snmp_priv_passphrase, $snmp_priv_protocol, $snmp_context, $snmp_port, $snmp_timeout, $ping_retries, $max_oids, SNMP_POLLER));

        for ($i=0;($i<sizeof($return_arr));$i++) {
            print $return_arr[$i] . "\n";
        }

    }elseif ($cmd == "num_indexes") {
        $return_arr = ss_host_disk_reindex(cacti_snmp_walk($hostname, $snmp_community, $oids["index"], $snmp_version, $snmp_auth_username, $snmp_auth_password, $snmp_auth_protocol, $snmp_priv_passphrase, $snmp_priv_protocol, $snmp_context, $snmp_port, $snmp_timeout, $ping_retries, $max_oids, SNMP_POLLER));

        print sizeof($return_arr);

    }elseif ($cmd == "query") {
        $arg = $arg1;

        $arr_index = ss_host_disk_reindex(cacti_snmp_walk($hostname, $snmp_community, $oids["index"], $snmp_version, $snmp_auth_username, $snmp_auth_password, $snmp_auth_protocol, $snmp_priv_passphrase, $snmp_priv_protocol, $snmp_context, $snmp_port, $snmp_timeout, $ping_retries, $max_oids, SNMP_POLLER));
        $arr = ss_host_disk_reindex(cacti_snmp_walk($hostname, $snmp_community, $oids[$arg], $snmp_version, $snmp_auth_username, $snmp_auth_password, $snmp_auth_protocol, $snmp_priv_passphrase, $snmp_priv_protocol, $snmp_context, $snmp_port, $snmp_timeout, $ping_retries, $max_oids, SNMP_POLLER));

        for ($i=0;($i<sizeof($arr_index));$i++) {
            print $arr_index[$i] . "!" . $arr[$i] . "\n";
        }
    }elseif ($cmd == "get") {
        $arg = $arg1;
        $index = $arg2;

        if (($arg == "total") || ($arg == "used")) {
            $sau = preg_replace("/[^0-9]/i", "", db_fetch_cell("select field_value from host_snmp_cache where host_id=$host_id and field_name='hrStorageAllocationUnits' and snmp_index='$index'"));
            $snmp_data = cacti_snmp_get($hostname, $snmp_community, $oids[$arg] . ".$index", $snmp_version, $snmp_auth_username, $snmp_auth_password, $snmp_auth_protocol,$snmp_priv_passphrase,$snmp_priv_protocol, $snmp_context, $snmp_port, $snmp_timeout, $ping_retries, SNMP_POLLER);
            if ($snmp_data < 0) {
                return ($snmp_data + 4294967296) * $sau;
            } else {
                return $snmp_data * $sau;
            }
        }else{
            return cacti_snmp_get($hostname, $snmp_community, $oids[$arg] . ".$index", $snmp_version, $snmp_auth_username, $snmp_auth_password, $snmp_auth_protocol,$snmp_priv_passphrase,$snmp_priv_protocol, $snmp_context, $snmp_port, $snmp_timeout, $ping_retries, SNMP_POLLER);
        }
    }
}

function ss_host_disk_reindex($arr) {
    $return_arr = array();

    for ($i=0;($i<sizeof($arr));$i++) {
        $return_arr[$i] = $arr[$i]["value"];
    }

    return $return_arr;
}

?>
netniV commented 6 years ago

So, firstly, if you are going to put code or quoted text on github, it's always best to use three backticks `

I've updated your post to demonstrate this :+

Secondly, it would appear that either the snmp_data value or the sau (storage units) were not properly returned to the script. This resulted in an error since you can't multiple by a string... I would be curious to know which devices and if there are any other errors in the cacti logs just before that happened?

jackouille-ch commented 6 years ago

Thanks for the correction and explanaition on how to proceed ;-)

Script concerns only some Linux devices and error is not coming all the time. Trying to reproduce with more logs...

netniV commented 6 years ago

A useful thing to try is something like (written by hand and untested):

file_put_contents('/tmp/my.log',
    'snmp_value: ' . var_export($snmp_value, false) . 
    "\nsau: " . var_export($sau, false) . "\n", FILE_APPEND);

You might also want to add the index value too

jackouille-ch commented 6 years ago

Ok got some answers: it only happens with Linux devices, indexes are right but snmp_data result is empty as well as $sau. The same script works fine on release 0.8.8 I update the script such as follow: if ($snmp_data < 0) { return ($snmp_data + 4294967296) $sau; } else { return 0; // $snmp_data $sau; }

netniV commented 6 years ago

This suggests that it isn't caching the data from the device. Check your host output cache for hrStorageAllocationUnits of that device.

netniV commented 6 years ago

Did you check the output or can we close this issue now?

jackouille-ch commented 6 years ago

Not yet, still on my todo list, sorry for the delay...

cigamit commented 6 years ago

Also, are you using the hmib plugin?

jackouille-ch commented 6 years ago

Here is my Plugin list: image

But I was obliged to copy these files manually into Cacti 1.x Maybe you could include them all directly in 1.2.0, what do you think?

cigamit commented 6 years ago

With hmib enabled, this template gathers the data from hmib. So, look to the setup.php file in hmib for the source of the problem.

jackouille-ch commented 6 years ago

I was using HMIB 1.4, now have upgraded to 3.1, will see if it resolve this issue

cigamit commented 6 years ago

Glad it's closed now ;)