此脚本是从mysql 中,取出host,并且ping,不通的记录写入到文件中,并发送mail。
#!/usr/bin/env python
#from threading import Thread
from processing import Process, Queue, Pool
import time
import subprocess
#from Queue import Queue
import re
import MySQLdb
import smtplib #mail module
import sys # os module
from snmp import Snmp
#Import the email modules we'll need
from email.mime.text import MIMEText
#num_arp_threads=10
num_workers=10
#in_queue=Queue()
q=Queue() #in queue
#out_queue=Queue()
oq=Queue() #out queue
sum=0
result=[]
#ips=["iquadcore-01","amd64","aaaaa","xue"]
# function truncate file
def truncate_file():
try:
fp=open('status_online.txt','w')
fp.close()
except:
print "Could not open status_online.txt file"
try:
fp=open('status_offline.txt','w')
fp.close()
except:
print "Could not open status_offline.txt file"
def Sql(result,count):
try:
connection=MySQLdb.connect(host="172.20.33.19",user="root",passwd="reqiq iu",db="hostlist")
except:
print "Could not connect to MySQL server."
try:
cursor= connection.cursor()
cursor.execute("select hostname from servers where area='beijing'")
print "Rows selected: ", cursor.rowcount
for row in cursor.fetchall():
result.append(row[0])
cursor.close()
except:
print "Could not selete to MySQL server."
#mail function
class HostRecord(object):
def __init__(self,ip=None,mac=None, snmp_response=None):
self.ip=ip
self.mac=man
self.snmp_response=snmp_response
def __repr__(self):
return "[Host Record('%s','%s','%s')]" %(self.ip,self.mac,self.snmp_response)
def f(i,q,oq):
while True:
time.sleep(.1)
if q.empty():
sys.exit()
print "Process Number %s Exit" %i
ip=q.get()
print "Process Number: %s" %i
ret=subprocess.call("ping -c 1 %s" %ip,
shell=True,
stdout=open('/dev/null','w'),
stderr=subprocess.STDOUT)
if ret==0:
print "%s: is alive " %ip
try:
f=open('status_online.txt','a')
f.write("%s OnLine\n" %(ip))
f.close()
except:
print "Could not open file."
oq.put(ip)
else:
try:
f=open('status_offline.txt','a')
f.write("%s OffLine\n" %(ip))
f.close()
except:
print "Could not open file."
print "Process Number:%s didn't find a response for %s" %(i,ip)
pass
def snmp_query(i,out):
while True:
time.sleep(.1)
if out.empty():
sys.exit()
print "Process Number:%s" %i
ipaddr=out.get()
s=Snmp()
h=HostRedord()
h.ip=ipaddr
h.snmp_response=s.query()
print h
return h
def Mail():
mail_server= 'mail server address'
mail_server_port=25
from_addr='XXX@XXX'
to_addr='XXX@XXX'
fp=open('status_offline.txt','r')
msg=MIMEText(fp.read())
fp.close()
msg['Subject']='hosts status'
msg['From']=from_addr
msg['To']=to_addr
s=smtplib.SMTP(mail_server,mail_server_port)
s.sendmail(from_addr,to_addr,msg.as_string())
s.quit()
#truncate file
truncate_file=truncate_file()
#defin result
sql_queue=Sql(result,sum)
#threading
try:
q.putmany(result)
finally:
for i in range(num_workers):
p=Process(target=f,args=[i,q,oq])
p.start()
for i in range(num_workers):
pp=Process(target=snmp_query,args=[i,oq])
pp.start()
print "main process joins on queue"
p.join()
Mail_queue=Mail()
print "Main Program finished"
阅读(542) | 评论(0) | 转发(0) |