Closed jackouille-ch closed 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.
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.
<?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;
}
?>
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?
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...
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
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; }
This suggests that it isn't caching the data from the device. Check your host output cache for hrStorageAllocationUnits of that device.
Did you check the output or can we close this issue now?
Not yet, still on my todo list, sorry for the delay...
Also, are you using the hmib plugin?
Here is my Plugin list:
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?
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.
I was using HMIB 1.4, now have upgraded to 3.1, will see if it resolve this issue
Glad it's closed now ;)
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