diff --git a/test_scandev.php b/test_scandev.php new file mode 100644 index 0000000..5fa19c0 --- /dev/null +++ b/test_scandev.php @@ -0,0 +1,418 @@ + 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 = $snmpReturn[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; +}