419 lines
13 KiB
PHP
419 lines
13 KiB
PHP
<?php
|
||
|
||
$ini_path = "/usr/local/etc/frpc.ini";
|
||
run($ini_path);
|
||
|
||
|
||
/**
|
||
* 将服务的所有设备信息扫描后发送到服务中心;
|
||
*/
|
||
function run($ini_path)
|
||
{
|
||
$url = "https://devms.t.educg.com/api/pushDevInfo.do";
|
||
$community = "cacti_public";
|
||
// $ini_path = "/etc/dev.ini";
|
||
//获取要扫描的设备ip。
|
||
$list = getDevIp($ini_path);
|
||
if (!empty($list)) {
|
||
//循环扫描所有设备信息,并发送到服务中心;
|
||
foreach ($list as $ip) {
|
||
$data = scanDev($ip, $community);
|
||
$data["ip"] = $ip;
|
||
$res = request_post($url, $data);
|
||
}
|
||
echo "ok,发送成功!";
|
||
} else {
|
||
echo "error,无数据!";
|
||
}
|
||
}
|
||
|
||
|
||
function getDevIp($file_name)
|
||
{
|
||
$iplist = [];
|
||
@$file = fopen($file_name, "r");
|
||
if($file){
|
||
$i = 0;
|
||
//输出文本中所有的行,直到文件结束为止。
|
||
while (!feof($file)) {
|
||
$item = trim(fgets($file)); //fgets()函数从文件指针中读取一行
|
||
//将ip行中的ip提取出来;
|
||
if (strpos($item, "_ip")) {
|
||
$one_item = explode("=", $item);
|
||
if (count($one_item) > 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;
|
||
}
|