# -*- coding: UTF-8 -*-
#!/usr/bin/env python
import time,math,socket,struct
import MySQLdb,psutil
###### 内存信息 #######
def getMemoryState():
phymem = psutil.virtual_memory()
total = long(phymem.total)
used = long(phymem.used)
# percent = phymem.percent
# mem_str = "Total:"+ str(total/1024/1024) + "MB;Used:" + str(used/1024/1024) +"MB;Percent:" + str(percent) +"%"
mem_list =[total/1024/1024,used/1024/1024]
return mem_list
###### CPU信息 #######
def getCpuState(interval=1):
cpu_util = psutil.cpu_percent(interval)
return int(cpu_util)
###### 硬盘信息 #######
def getDiskState():
disk_total = 0
disk_used = 0
disk_free = 0
disk_list = psutil.disk_partitions()
# disk_info_list = [] # 硬盘所有信息包含挂载点
for disk_part in disk_list:
disk_sub_total = long(math.ceil(psutil.disk_usage(disk_part.mountpoint).total)) # 获取分区总容量
disk_sub_used = long(math.ceil(psutil.disk_usage(disk_part.mountpoint).used)) # 获取分区已使用
disk_sub_free = long(math.ceil(psutil.disk_usage(disk_part.mountpoint).free)) # 获取分区剩余
disk_sub_percent = str((math.ceil(psutil.disk_usage(disk_part.mountpoint).percent)))
disk_sub_info = "point:" + disk_part.mountpoint + ";total:"+ str(disk_sub_total/1024/1024/1024) + "GB;used:" + str(disk_sub_used/1024/1024/1024) + "GB;free:" + str(disk_sub_free/1024/1024/1024) + "GB;percent:" + disk_sub_percent + "%"
disk_total = disk_total + disk_sub_total
disk_used = disk_used + disk_sub_used
disk_free = disk_free + disk_sub_free
# disk_info_list.append(disk_sub_info)
# disk_percent = str(round(float(disk_used)/float(disk_total)*100,2))
# disk_info = "Total:" + str(disk_total/1024/1024/1024) + "GB;Used:" + str(disk_used/1024/1024/1024) + "GB;Free:" + str(disk_free/1024/1024/1024) + "GB;Percent:" + disk_percent + "%"
# disk_info_list.append(disk_info)
disk_info = [disk_total/1024/1024/1024,disk_used/1024/1024/1024]
return disk_info
###### 网络信息 #######
def getNetState():
key_info, net_in, net_out = getNetDate(get_key)
net_list = []
received = 0
send = 0
for key in key_info:
i = unicode(key, errors='ignore')
if i !="lo" and ("Loopback" not in i):
# j = i + ";received:" + str(net_in.get(key)) + "MB;send:" + str(net_out.get(key)) + "MB"
# net_str = net_str + " " + j
received = received + net_in.get(key)
send = send + net_out.get(key)
net_list.append(received)
net_list.append(send)
return net_list
def getNetDate(func):
key_info, old_recv, old_sent = func() # 上一秒收集的数据
time.sleep(1)
key_info, now_recv, now_sent = func() # 当前所收集的数据
net_in = {}
net_out = {}
for key in key_info:
net_in.setdefault(key, (now_recv.get(key) - old_recv.get(key)) / 1024 /1024) # 每秒接收速率
net_out.setdefault(key, (now_sent.get(key) - old_sent.get(key)) / 1024 /1024) # 每秒发送速率
return key_info, net_in, net_out
def get_key():
# 获取网卡名称、收发字节
key_info = psutil.net_io_counters(pernic=True).keys() # 获取网卡名称
recv = {}
sent = {}
for key in key_info:
recv.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_recv) # 各网卡接收的字节数
sent.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_sent) # 各网卡发送的字节数
return key_info, recv, sent
###### 获取主机名和IP地址 #######
def get_ip_host():
lis = []
hostname = socket.gethostname()
# ip = socket.gethostbyname(hostname)
lis.append(hostname)
# lis.append(ip)
info = psutil.net_if_addrs()
for k,v in info.items():
for item in v:
if item[0] == 2 and not item[1] == '127.0.0.1':
lis.append(item[1])
return lis
###### 执行数据库操作 #######
def mysql_sh(ip_host,machine_info):
### 数据初始化
ip = socket.ntohl(struct.unpack("I", socket.inet_aton(str(ip_host[1])))[0])
# if ip_host[2]:
# print("second ip is %s"% ip_host[2])
sql_search = "select * from machine where ip='" + str(ip) + "'"
machine_info_search = "select id from machine where ip='" + str(ip) + "'"
# 打开数据库连接
db = MySQLdb.connect("itopdb.southbaytech.co", "itop", "itop", "itop",3304,charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 查询插入machine_info
cursor.execute(sql_search)
results = cursor.fetchall()
if results:
cursor.execute(machine_info_search)
server_search = cursor.fetchall()
for j in server_search:
machine_id = j[0]
# 设定machine_info插入
disk_total = machine_info['disk_state'][0]
disk_used = machine_info['disk_state'][1]
mem_total = machine_info['mem_state'][0]
mem_used = machine_info['mem_state'][1]
net_received = machine_info['net_state'][0]
net_send = machine_info['net_state'][1]
create_time = int(time.time())
machine_info_insert = 'insert into machine_info(machine_id,cpu_state,disk_total,disk_used,mem_total,mem_used,create_time,net_received,net_send) \
values (%d,%f,%d,%d,%d,%d,%d,%d,%d)' % \
(machine_id ,machine_info['cpu_state'],disk_total,disk_used,mem_total,mem_used,create_time,net_received,net_send)
# 执行server_info插入
try:
cursor.execute(machine_info_insert)
db.commit()
except:
db.rollback()
else:
print("machine is not exist!")
# 关闭数据库连接
db.close()
###### 主程序 #######
if __name__=='__main__':
while 1 :
try:
machine_info = {}
machine_info["cpu_state"] = getCpuState()
machine_info["disk_state"] = getDiskState()
machine_info["mem_state"] = getMemoryState()
machine_info["net_state"] = getNetState()
ip_host = get_ip_host() # 获取主机名和IP地址
mysql_sh(ip_host,machine_info) # 数据库插入更新
time.sleep(3)
except KeyboardInterrupt:
exit()