0) { $value = trim($one_item[1]); if ($value != "127.0.0.1") { $iplist[] = $value; } } } $i++; } fclose($file); } return $iplist; } function getIp($arr) { if (strpos($arr, "_ip")) { return $arr; } } /** * 总扫描; */ function scanDev($ip, $community) { $cpu = ''; $ram = ''; $cpusort = ''; $uptime = ''; $hostname = ''; $ram_percent = ''; $diskinfo = ""; $rootpercent = ""; $cpuinfo = ""; $tcpcount = ""; $inout = ""; if (!empty($ip) && !empty($community)) { //获取负载,运行时间,主机名,内存信息; $baseinfo = get_server_info($ip, $community); if (count($baseinfo) > 0) { $cpu = $baseinfo[0]; $ram = $baseinfo[1]; $cpusort = $baseinfo[2]; $uptime = $baseinfo[3]; $hostname = $baseinfo[4]; $ram_percent = $baseinfo[5]; // $used_ram = $snmpReturn[6]; // $fumv = $snmpReturn[7]; } //如果uptiem为空说明扫描不到,则退出;不进行后续扫描; if($uptime==''){ $data['cpu'] = $cpu; $data['ram'] = $ram; $data['cpusort'] = $cpusort; $data['uptime'] = $uptime; $data['hostname'] = $hostname; $data['ram_percent'] = $ram_percent; $data['diskinfo'] = $diskinfo; $data['inout'] = $inout; $data['rootpercent'] = $rootpercent; $data['cpuinfo'] = $cpuinfo; $data['tcpcount'] = $tcpcount; return $data; } //硬盘信息 $diskinfo = diskInfo($ip, $community); if (!empty($diskinfo)) { foreach ($diskinfo as $value) { if ($value["path"] == "/") { $rootpercent = $value["diskpercent"]; } } } //记录当前流量; $currinout = ifinoutInfo($ip, "cacti_public"); //当前累计流量数据 //获取cpu,tcp信息; $cpuinfo = getCpuInfo($ip, $community); $tcpcount = getTcpInfo($ip, $community); } $data['cpu'] = $cpu; $data['ram'] = $ram; $data['cpusort'] = $cpusort; $data['uptime'] = $uptime; $data['hostname'] = $hostname; $data['ram_percent'] = $ram_percent; $data['diskinfo'] = $diskinfo; $data['inout'] = $currinout; $data['rootpercent'] = $rootpercent; $data['cpuinfo'] = $cpuinfo; $data['tcpcount'] = $tcpcount; return $data; } /** * 获取负载值; */ function get_server_info($ip, $community) { $ip = trim($ip); $result = []; // $oid_cpu_1 = "1.3.6.1.4.1.2021.10.1.3.1"; //cpu1分钟时负载; $oid_cpu_2 = "1.3.6.1.4.1.2021.10.1.3.2"; //cpu5分钟时负载; // $oid_cpu_3 = "1.3.6.1.4.1.2021.10.1.3.3"; //cpu15分钟时负载; $oid_all_ram = "1.3.6.1.4.1.2021.4.5.0"; //Total RAM in machine: 总的内存 // $oid_used_ram = "1.3.6.1.4.1.2021.4.6.0"; //Total RAM in machine: 可用实际总的内存 $oid_mem_free = "1.3.6.1.4.1.2021.4.11.0"; //可用内存;memTotalFree $oid_mem_share = "1.3.6.1.4.1.2021.4.13.0"; //可用内存;memTotalFree $oid_mem_Buffer = "1.3.6.1.4.1.2021.4.14.0"; //可用内存;memTotalFree $oid_mem_cached = "1.3.6.1.4.1.2021.4.15.0"; //可用内存;memTotalFree $oid_mem_aswap = "1.3.6.1.4.1.2021.4.4.0";//可用memAvailSwap;free应该-这个值才是真是free; $oid_sysname = "SNMPv2-MIB::sysName.0"; //主机名; // $oid_uptime = "1.3.6.1.2.1.1.3.0";//snmp运行时间 $oid_uptime = "HOST-RESOURCES-MIB::hrSystemUptime.0"; //系统开机时间; try { $session = new SNMP(SNMP::VERSION_2C, $ip, $community, 1000000, 2); @$rep = $session->get(array($oid_cpu_2, $oid_mem_aswap,$oid_all_ram,$oid_mem_share, $oid_mem_cached,$oid_mem_Buffer,$oid_mem_free, $oid_uptime, $oid_sysname), true); //连不上会有超时报警 if ($rep === false) { $session->close(); return $result; } else { $cpu_v = 0; $cpu_sort = 0; if (isset($rep[$oid_cpu_2])) { $cpu_2 = $rep[$oid_cpu_2]; $cpu_2_v = explode(":", $cpu_2)[1]; $cpu_2_v = floatval($cpu_2_v); $cpu_v = $cpu_2_v; $cpu_sort = $cpu_v; } $memv = "0"; $memv_percent = ""; $umbv = "0"; $fumv = "0"; if (isset($rep[$oid_all_ram])) { $mem = $rep[$oid_all_ram]; $memlist = explode(":", $mem); $memvalue = $memlist[1]; $memnumb = explode(" ", $memvalue); $memv_i = intval($memnumb[1] / 1024 / 1024); $memv = $memv_i; $used_mem = $rep[$oid_mem_free];//可用 $um = explode(":", $used_mem)[1]; $umb = explode(" ", $um); $umbv = round($umb[1] / 1024 / 1024,2); $aswap_mem = $rep[$oid_mem_aswap];//可用 $aswap = explode(":", $aswap_mem)[1]; $aswap = explode(" ", $aswap); $swapv = round($aswap[1] / 1024 / 1024,2); $umbv = $umbv-$swapv;//真是free值 $cached_mem = $rep[$oid_mem_cached];//cached $fum = explode(":", $cached_mem)[1]; $fum = explode(" ", $fum); $fumv = round($fum[1] / 1024 / 1024,2); $buffer_mem = $rep[$oid_mem_Buffer];//cached $buffer = explode(":", $buffer_mem)[1]; $buffer = explode(" ", $buffer); $bumv = round($buffer[1] / 1024 / 1024,2); $share_mem = $rep[$oid_mem_share];//cached $share = explode(":", $share_mem)[1]; $share = explode(" ", $share); $shmv = round($share[1] / 1024 / 1024,2); if(($shmv+$fumv+$bumv)>$memv){ $memv_percent = round(abs($memv-$umbv-$fumv-$bumv+$shmv) / $memv * 100, 0) . "%"; }else{ $memv_percent = round(abs($memv-$umbv-$fumv-$bumv) / $memv * 100, 0) . "%"; } } $uptime = ""; if (isset($rep[$oid_uptime])) { $uptime = $rep[$oid_uptime]; $uptime = explode(") ", $uptime); $uptime = $uptime[1]; } $hostname = ""; if (isset($rep[$oid_sysname])) { $hostname = $rep[$oid_sysname]; $hostname = explode(": ", $hostname)[1]; } $session->close(); $result[] = $cpu_v; $result[] = $memv; //总内存大小 $result[] = $cpu_sort; // $result[] = $uptime; //开机时间 $result[] = $hostname; //主机名 $result[] = $memv_percent; //内存使用率 $result[] = $memv-$umbv;//内存使用 $result[] = $fumv; } } catch (\Throwable $th) { //未知异常; } return $result; } //硬盘信息获取; function diskInfo($ip, $community) { $disklist = []; try { @$Index = snmp2_walk($ip, $community, "HOST-RESOURCES-MIB::hrStorageIndex", 1000000, 2); @$Type = snmp2_walk($ip, $community, "HOST-RESOURCES-MIB::hrStorageType", 1000000, 2); @$Descr = snmp2_walk($ip, $community, "HOST-RESOURCES-MIB::hrStorageDescr", 1000000, 2); @$AS = snmp2_walk($ip, $community, "HOST-RESOURCES-MIB::hrStorageSize", 1000000, 2); //簇的的数目 @$US = snmp2_walk($ip, $community, "HOST-RESOURCES-MIB::hrStorageUsed", 1000000, 2); //使用多少,跟总容量相除就是占用率 @$Units = snmp2_walk($ip, $community, "HOST-RESOURCES-MIB::hrStorageAllocationUnits", 1000000, 2); //簇大小 if(!empty($Index)){ for ($i = 0; $i < count($Index); $i++) { $temp = array(); $index_one = $Index[$i]; $type_one = $Type[$i]; $descr_one = $Descr[$i]; $as_one = $AS[$i]; $us_one = $US[$i]; $unit_one = $Units[$i]; $i_v = explode(": ", $index_one)[1]; $t_v = explode("::", $type_one)[1]; $d_v = explode(": ", $descr_one)[1]; $a_v = explode(": ", $as_one)[1]; $u_v = explode(": ", $us_one)[1]; $unit_v = explode(" ", $unit_one)[1]; if ($t_v == "hrStorageFixedDisk") { $temp["index"] = $i_v; $temp["path"] = $d_v; $temp["allspace"] = round(($a_v / 1024 / 1024 / 1024) * $unit_v, 2) . 'GB'; $temp["usedspace"] = round(($u_v / 1024 / 1024 / 1024) * $unit_v, 2) . 'GB'; if ($a_v != 0) { $temp["diskpercent"] = round($u_v / $a_v * 100, 2) . '%'; } else { $temp["diskpercent"] = ""; } $disklist[] = $temp; } } } } catch (\Throwable $th) { return array(); } return $disklist; } /** * 获取tcp连接数; */ function getTcpInfo($ip, $community) { $result = 0; @$tcpCurrEstab = snmp2_walk($ip, $community, "TCP-MIB::tcpCurrEstab.0", 1000000, 2); if($tcpCurrEstab){ $info = $tcpCurrEstab[0]; $result = intval(explode(": ", $info)[1]); } return $result; } /** * 获取cpu核心数和使用率 * (cpu负载值之和/处理器的个数)% * hrProcessorLoad 负载值,多个; * */ function getCpuInfo($ip, $community) { $result = array(); @$cpu_proc = snmp2_walk($ip, $community, "HOST-RESOURCES-MIB::hrProcessorLoad", 1000000, 2); if($cpu_proc){ $cpu_count = count($cpu_proc); $cpu_v = 0; for ($i = 0; $i < $cpu_count; $i++) { $cpu_p = $cpu_proc[$i]; $v = explode(": ", $cpu_p)[1]; $cpu_v += $v; } $result["count"] = $cpu_count; $result["usage"] = round($cpu_v / $cpu_count, 2) . '%'; } // $result["count"] = 1; // $result["usage"] = '1%'; return $result; } /** * 获取当前流量 * */ function ifinoutInfo($ip, $community) { @$curr_in = snmp2_walk($ip, $community, "IF-MIB::ifHCInOctets", 1000000, 2); @$curr_out = snmp2_walk($ip, $community, "IF-MIB::ifHCOutOctets", 1000000, 2); $list = array(); if($curr_in){ for ($i = 0; $i < count($curr_in); $i++) { $temp = []; $in_one = $curr_in[$i]; $out_one = $curr_out[$i]; $i_v = explode(": ", $in_one)[1]; $o_v = explode(": ", $out_one)[1]; $temp["in"] = $i_v; $temp["out"] = $o_v; $list[] = $temp; } } return $list; } /** * 发起http post请求(REST API), 并获取REST请求的结果 * @param string $url * @param string $param * @return - http response body if succeeds, else false. */ function request_post($postUrl = '', $curlPost = array()) { if (empty($postUrl) || empty($curlPost)) { return false; } // 初始化curl $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $postUrl); curl_setopt($curl, CURLOPT_HEADER, 0); // 要求结果为字符串且输出到屏幕上 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_NOSIGNAL, true); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 4000); curl_setopt($curl, CURLOPT_TIMEOUT_MS, 5000); // curl_setopt($curl, CURLOPT_TIMEOUT,10); // post提交方式 curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($curlPost)); // 运行curl $data = curl_exec($curl); $curl_errno = curl_errno($curl); curl_close($curl); if ($curl_errno > 0) { return ""; //错误返回空; } return $data; }