#!/usr/bin/env php = $prev) ? ($cur - $prev) : ($cur + (float) $modulus - $prev); if ($running === 'U' || !is_numeric($running)) { return (string) $delta; } return (string) ((float) $running + $delta); } $cur = gmp_init($current); $prev = gmp_init($previous); if (gmp_cmp($cur, $prev) >= 0) { $delta = gmp_sub($cur, $prev); } else { $delta = gmp_sub(gmp_add($cur, gmp_init($modulus)), $prev); } if ($running === 'U' || !is_numeric((string) $running)) { return gmp_strval($delta); } return gmp_strval(gmp_add(gmp_init((string) $running), $delta)); } } function ss_net_snmp_disk_bytes(mixed $host_id_or_hostname = '') : string { global $environ, $poller_id, $config; if (empty($host_id_or_hostname) || $host_id_or_hostname === null) { return 'reads:0 writes:0'; } if (!is_numeric($host_id_or_hostname)) { $host_id = db_fetch_cell_prepared('SELECT id FROM host WHERE hostname = ?', [$host_id_or_hostname]); } else { $host_id = $host_id_or_hostname; } $tmpdir = sys_get_temp_dir(); if (!db_table_exists('host_value_cache')) { if ($environ != 'realtime') { $tmpdir .= '/cacti/net-snmp-devio'; $tmpfile = $host_id . '_bytes'; } else { $tmpdir .= '/cacti-rt/net-snmp-devio'; $tmpfile = $host_id . '_' . $poller_id . '_bytes_rt'; } if (!is_dir($tmpdir)) { mkdir($tmpdir, 0755, true); } } else { if ($environ != 'realtime') { $dimension = $host_id . '_bytes'; $ttl = -1; } else { $dimension = $host_id . '_' . $poller_id . '_bytes_rt'; $ttl = 300; } } $found = false; $previous = []; if (!db_table_exists('host_value_cache')) { if (is_file("$tmpdir/$tmpfile")) { $previous = json_decode((string) file_get_contents("$tmpdir/$tmpfile"), true); $found = true; } } else { $previous = json_decode( db_fetch_cell_prepared('SELECT value FROM host_value_cache WHERE host_id = ? AND dimension = ? LIMIT 1', [$host_id, $dimension]), true ); // remove the old entry or entries db_execute_prepared('DELETE FROM host_value_cache WHERE host_id = ? AND dimension = ? AND time_to_live = ?', [$host_id, $dimension, $ttl]); if (!empty($previous)) { $found = true; } else { $found = false; } } $indexes = []; $host = db_fetch_row_prepared('SELECT * FROM host WHERE id = ?', [$host_id]); if (!cacti_sizeof($host)) { return 'reads:0 writes:0'; } $uptime = cacti_snmp_get($host['hostname'], $host['snmp_community'], '.1.3.6.1.2.1.1.3.0', $host['snmp_version'], $host['snmp_username'], $host['snmp_password'], $host['snmp_auth_protocol'], $host['snmp_priv_passphrase'], $host['snmp_priv_protocol'], $host['snmp_context'], $host['snmp_port'], $host['snmp_timeout'], $host['snmp_retries'], SNMP_POLLER, $host['snmp_engine_id']); $current['uptime'] = $uptime; $names = cacti_snmp_walk($host['hostname'], $host['snmp_community'], '.1.3.6.1.4.1.2021.13.15.1.1.2', $host['snmp_version'], $host['snmp_username'], $host['snmp_password'], $host['snmp_auth_protocol'], $host['snmp_priv_passphrase'], $host['snmp_priv_protocol'], $host['snmp_context'], $host['snmp_port'], $host['snmp_timeout'], $host['snmp_retries'], SNMP_POLLER, $host['snmp_engine_id']); foreach ($names as $measure) { if (preg_match('/^(?:sd|nvme|xvd|vd|vm|hd|md|dm-)/', $measure['value'])) { if (preg_match('/(?:p\d+|\d+)$/', $measure['value']) && !preg_match('/^nvme\d+n\d+$/', $measure['value'])) { continue; } $parts = explode('.', $measure['oid']); $indexes[$parts[cacti_sizeof($parts) - 1]] = $parts[cacti_sizeof($parts) - 1]; } } $bytesread = $byteswritten = 0; if (cacti_sizeof($indexes)) { $bytes = cacti_snmp_walk($host['hostname'], $host['snmp_community'], '.1.3.6.1.4.1.2021.13.15.1.1.12', $host['snmp_version'], $host['snmp_username'], $host['snmp_password'], $host['snmp_auth_protocol'], $host['snmp_priv_passphrase'], $host['snmp_priv_protocol'], $host['snmp_context'], $host['snmp_port'], $host['snmp_timeout'], $host['max_oids'], SNMP_POLLER, $host['snmp_engine_id']); foreach ($bytes as $measure) { $parts = explode('.', $measure['oid']); $index = $parts[cacti_sizeof($parts) - 1]; if (array_key_exists($index, $indexes)) { if (!isset($previous['uptime'])) { $bytesread = 'U'; } elseif ($current['uptime'] < $previous['uptime']) { $bytesread = 'U'; } elseif (!isset($previous["br$index"])) { $bytesread = 'U'; } else { $bytesread = ss_counter_step($bytesread, (string) $measure['value'], (string) $previous["br$index"], '18446744073709551616'); } $current["br$index"] = $measure['value']; } } $bytes = cacti_snmp_walk($host['hostname'], $host['snmp_community'], '.1.3.6.1.4.1.2021.13.15.1.1.13', $host['snmp_version'], $host['snmp_username'], $host['snmp_password'], $host['snmp_auth_protocol'], $host['snmp_priv_passphrase'], $host['snmp_priv_protocol'], $host['snmp_context'], $host['snmp_port'], $host['snmp_timeout'], $host['snmp_retries'], $host['max_oids'], SNMP_POLLER, $host['snmp_engine_id']); foreach ($bytes as $measure) { $parts = explode('.', $measure['oid']); $index = $parts[cacti_sizeof($parts) - 1]; if (array_key_exists($index, $indexes)) { if (!isset($previous['uptime'])) { $byteswritten = 'U'; } elseif ($current['uptime'] < $previous['uptime']) { $byteswritten = 'U'; } elseif (!isset($previous["bw$index"])) { $byteswritten = 'U'; } else { $byteswritten = ss_counter_step($byteswritten, (string) $measure['value'], (string) $previous["bw$index"], '18446744073709551616'); } $current["bw$index"] = $measure['value']; } } if (!db_table_exists('host_value_cache')) { $data = json_encode($current); file_put_contents("$tmpdir/$tmpfile", $data); } else { $data = json_encode($current); db_execute_prepared('REPLACE INTO host_value_cache (host_id, dimension, value, time_to_live) VALUES (?, ?, ?, ?)', [$host_id, $dimension, $data, $ttl]); } } if ($found) { return "bytesread:$bytesread byteswritten:$byteswritten"; } else { return 'bytesread:0 byteswritten:0'; } }