#-*- coding: UTF-8 -*-
importurllib2,json,cookielib,urllib,datetime,os,threadingfrom urllib2 importRequest, urlopen, URLError, HTTPErrorglobalauth_code,zabbix_url,zabbix_header,login_url,graph_url,login_data,pic_save_path_dir,yesterday9,opener#zabbix接口地址、登录地址、图片地址
zabbix_url="http://10.16.2.4/zabbix/api_jsonrpc.php"login_url= 'http://10.16.2.4/zabbix/index.php'graph_url= 'http://10.16.2.4/zabbix/chart2.php'zabbix_header= {"Content-Type":"application/json"}
zabbix_user= "admin"zabbix_pass= "password"auth_code= ""auth_data=json.dumps({"jsonrpc":"2.0","method":"user.login","params":
{"user":zabbix_user,"password":zabbix_pass
},"id":0
})#定义登录所需要用的信息,如用户名、密码等,使用urllib进行编码
login_data =urllib.urlencode({"name": zabbix_user,"password": zabbix_pass,"autologin": 1,"enter": "Sign in"})#新建以当天日期为名的文件夹保存图片
today = datetime.datetime.now().date().strftime('%Y%m%d')
pic_save_path_dir= os.path.join('d:\\pic',today ) #修改图片保存位置
if notos.path.exists(pic_save_path_dir):
os.makedirs(pic_save_path_dir)#定义graph的starttime参数,从前一天的9:00开始
yesterday = (datetime.datetime.now()-datetime.timedelta(days=1))
yesterday9= datetime.datetime(yesterday.year,yesterday.month,yesterday.day,9).strftime('%Y%m%d%H%M%S')#登录zabbix,设置一个cookie处理器,负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
cj =cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
opener.open(login_url,login_data)#.read()
request=urllib2.Request(zabbix_url,auth_data)for key inzabbix_header:
request.add_header(key,zabbix_header[key])try:
result=urllib2.urlopen(request)exceptHTTPError, e:print 'The server couldn\'t fulfill the request, Error code:', e.codeexceptURLError, e:print 'We failed to reach a server.Reason:', e.reasonelse:
response=json.loads(result.read())#print response
result.close()#判断SESSIONID是否在返回的数据中
if 'result' inresponse:
auth_code=response['result']else:print response['error']['data']defHttp_access(data):
request=urllib2.Request(zabbix_url,data)for key inzabbix_header:
request.add_header(key,zabbix_header[key])
result=urllib2.urlopen(request)
response=json.loads(result.read())#print result.read()
#print response
result.close()if len(response['result']) >0:return response['result'][0]defget_hostid(ip):
get_host_data= ''
if len(auth_code) <>0:
get_host_data=json.dumps({"jsonrpc": "2.0","method": "host.get","params": {"output": "extend","filter": {"host": [
ip,
]
}
},"auth": auth_code,"id": 1})returnget_host_datadefget_itemid(hostid,itemtype):
get_item_data= ''
if (len(auth_code) <> 0) and (hostid is notNone):
get_item_data=json.dumps({"jsonrpc": "2.0","method": "item.get","params": {"output": "extend","hostids": hostid,"search":{"name": itemtype
},"sortfield": "name"},"auth": auth_code,"id": 1})returnget_item_datadefget_graphid(itemid):
get_graph_data= ''
if (len(auth_code) <> 0) and (itemid is notNone):
get_graph_data=json.dumps({"jsonrpc": "2.0","method": "graphitem.get","params": {"output": "extend","expandData": 1,"itemids": itemid
},"auth": auth_code,"id": 1})returnget_graph_datadefpic_save(ip,name,graphid):
graph_args=urllib.urlencode({"graphid":graphid,"width":'400', #定义图片宽度
"height":'156', #定义图片高度
"stime":yesterday9, #图形开始时间
"period":'86400'}) #定义时长,取1天的数据
data=opener.open(graph_url,graph_args).read()#pic_save_path = pic_save_path_dir + ip + '-' + name +'.png'
picname = ip + '-' + name +'.png'pic_save_path=os.path.join(pic_save_path_dir,picname)
file=open(pic_save_path,'wb')
file.write(data)#file.flush()
file.close()#多线程并发调用该函数
defpic_save_th(ip):#根据ip获取hostid
host_data =get_hostid(ip)
host_result=Http_access(host_data)if host_result is notNone: #判断该IP是否在zabbix中存在
hostid= host_result['hostid']#根据监视器名称获取相应的itemid
cpuname = 'CPU Usage'memoryname= 'Memory - Memory available'diskname= 'Disk - Current Disk Queue Length'netcard= 'Traffic for Public Receive'item_cpu=get_itemid(hostid,cpuname)
item_memory=get_itemid(hostid,memoryname)
item_disk=get_itemid(hostid,diskname)
item_netcard=get_itemid(hostid,netcard)
itemid_cpu= Http_access(item_cpu)['itemid']
itemid_memory= Http_access(item_memory)['itemid']
itemid_disk= Http_access(item_disk)['itemid']
itemid_netcard= Http_access(item_netcard)['itemid']#根据itemid获取相应的graphid
graphdata_cpu =get_graphid(itemid_cpu)
graphdata_memory=get_graphid(itemid_memory)
graphdata_disk=get_graphid(itemid_disk)
graphdata_netcard=get_graphid(itemid_netcard)
graphid_cpu= Http_access(graphdata_cpu)['graphid']
graphid_memory= Http_access(graphdata_memory)['graphid']
graphid_disk= Http_access(graphdata_disk)['graphid']
graphid_netcard= Http_access(graphdata_netcard)['graphid']print ip#,graphid_cpu,graphid_memory,graphid_disk,graphid_netcard
#调用pic_save函数保存图片到本地
pic_save(ip,cpuname,graphid_cpu)
pic_save(ip,memoryname,graphid_memory)
pic_save(ip,diskname,graphid_disk)
pic_save(ip,netcard,graphid_netcard)else:print '%s doesnot exist in zabbix' %ip#定义线程数控制函数,num表示每次并发的线程数
deflstg(num,lst):#定义每段的个数num
l =len(lst)
g= l/num #取分成几组
last = l%num #判断是否有剩余的数
lstn =[]if num >=l:
lstn.append(lst)else:for i inrange(g):
i=i+1n=i*num
m=n-num
lstn.append(lst[m:n])if last <>0:
lstn.append(lst[-last:])returnlstn#serverip=['10.160.26.30','10.160.26.31','10.160.26.32']#for ip in serverip:#pic_save_th(ip)
if __name__ =='__main__':#定义线程数量
tnum = 5serverips=['10.160.26.30','10.160.26.31','10.160.26.32','10.160.31.31','10.160.31.32','10.160.31.36','10.160.34.250','10.160.34.251','192.168.200.250','192.168.200.251']for ips inlstg(tnum,serverips):
threads=[]for ip inips:#创建并启动进程
t = threading.Thread(target=pic_save_th,args=(ip,))#t.setName('th-'+ ip)
t.setDaemon(True)
t.start()
threads.append(t)#等待每个线程结束
for t inthreads:#print t.name,t.is_alive(),ctime()
t.join()