python通过snmp协议获取服务器硬件信息,主要是oid
linux下oid固定 windows下硬盘oid会根据电脑磁盘个数改变
from pysnmp.entity.rfc3413.oneliner import cmdgen
class ServerInfo:
# cpu使用率
cpuInfo = 0
# 内存使用率
memoryInfo = 0
# 硬盘使用率
diskInfo = 0
def snmp(ip, oid):
cg = cmdgen.CommandGenerator() ##获得CommandGenerator对象
errorIndication, errorStatus, errorIndex, varBinds = cg.getCmd(
# 0代表v1,1代表v2c
cmdgen.CommunityData('my-agent', 'public', 1), ##社区信息,my-agent ,public 表示社区名,1表示snmp v2c版本,0为v1版本
cmdgen.UdpTransportTarget((ip, 161)), ##这是传输的通道,传输到IP 192.168.70.237, 端口 161上(snmp标准默认161 UDP端口)
oid ##传送的OID,个人认为MIB值
)
# print(varBinds[0][1])
return varBinds[0][1] # varBinds返回是一个stulp,含有MIB值和获得值
# 返回Linux信息
def linuxSnmp(ip):
serverInfo = ServerInfo()
# cpu使用率
serverInfo.cpuInfo = 100 - snmp(ip, '.1.3.6.1.4.1.2021.11.11.0')
# 总内存 memTotal
memTotal = snmp(ip, '.1.3.6.1.4.1.2021.4.5.0')
# 使用内存 memAvailable
memAvailable = snmp(ip, '.1.3.6.1.4.1.2021.4.6.0')
# memShared
memShared = snmp(ip, '.1.3.6.1.4.1.2021.4.13.0')
# memBuffer
memBuffer = snmp(ip, '.1.3.6.1.4.1.2021.4.14.0')
# memCached
memCached = snmp(ip, '.1.3.6.1.4.1.2021.4.15.0')
# 内存使用率 memUsage
if (memShared + memBuffer + memCached) > memTotal:
serverInfo.memoryInfo = round(((memTotal - memAvailable - memBuffer - memCached + memShared) / memTotal * 100),
2)
else:
serverInfo.memoryInfo = round(((memTotal - memAvailable - memBuffer - memCached) / memTotal * 100), 2)
# 硬盘空间百分比
serverInfo.diskInfo = int(snmp(ip, '.1.3.6.1.4.1.2021.9.1.9.1'))
return serverInfo
# 返回Windows信息
# def windowsSnmp(ip):
# serverInfo = ServerInfo()
# # cpu使用率
# num = 0
# sum = 0
# for m in range(30):
# s = snmp(ip, '1.3.6.1.2.1.25.3.3.1.2.' + str(m))
# if str(s) != '':
# num = num + snmp(ip, '1.3.6.1.2.1.25.3.3.1.2.' + str(m))
# sum = sum + 1
#
# serverInfo.cpuInfo = round(num / sum, 2)
#
# i = getOId(ip)
# # 内存使用率
# memTotal = snmp(ip, '1.3.6.1.2.1.25.2.3.1.5.' + str(i))
# memAvailable = snmp(ip, '1.3.6.1.2.1.25.2.3.1.6.' + str(i))
# serverInfo.memoryInfo = round(memAvailable / memTotal * 100, 2)
#
# # 磁盘使用率
# diskAvailable = 0
# diskTotal = 0
# for i in range(i - 2):
# total = snmp(ip, '1.3.6.1.2.1.25.2.3.1.5.' + str(i + 1)) # * snmp(ip, '1.3.6.1.2.1.25.2.3.1.4.' + str(i + 1))
# available = snmp(ip,
# '1.3.6.1.2.1.25.2.3.1.6.' + str(i + 1)) # * snmp(ip, '1.3.6.1.2.1.25.2.3.1.4.' + str(i + 1))
# diskTotal += total
# diskAvailable += available
# serverInfo.diskInfo = round(diskAvailable / diskTotal * 100, 2)
# return serverInfo
#
#
# def getOId(ip):
# i = 1
# while True:
# s = snmp(ip, '1.3.6.1.2.1.25.2.3.1.3.' + str(i))
# if str(s) != 'Physical Memory':
# i = i + 1
# else:
# return i
s = windowsSnmp('127.0.0.1')
print(s.memoryInfo)