#!/usr/bin/env python
import time,MySQLdb
from subprocess import Popen
from subprocess import PIPE
import dns.query
import dns.message
import dns.tsig
import dns.tsigkeyring
import dns.update
def set_dns(ip_list):
key=dns.tsigkeyring.from_text({"cui.com":"SIvcwHj3goqYl0vKS6yOtdugxIaqtwPE43LpB6p9QFpbRmY+ekPrscHz je1hla5RBrB1R1DBnzu9AzT9fVEtfw=="})
up=dns.update.Update("cui.com",keyring=key)
rl=[dns.rdata.from_text(dns.rdataclass.IN,dns.rdatatype.A,i) for i in ip_list]
rs=dns.rdataset.from_rdata_list(60,rl)
up.replace("s.db",rs)
dns.query.tcp(up,‘127.0.0.1‘)
def getSlaveMsg(host,port,user,passwd,cmd):
command="mysql -h %s -P %s -u %s -p%s -e ‘%s‘ "%(host,port,user,passwd,cmd)
p=Popen(command,shell=True,stdout=PIPE)
return p.stdout.readlines()
def getstatus(iostr,sqlstr,secstr,result):
resultdict={}
for i in result:
if iostr in i:
resultdict[iostr]=i.split(":")[1].split("\n")[0].strip()
elif sqlstr in i:
resultdict[sqlstr]=i.split(":")[1].split("\n")[0].strip()
elif secstr in i:
if not i.split(":")[1].split("\n")[0].strip()=="NULL":
resultdict[secstr]=int(i.split(":")[1].split("\n")[0].strip())
else:
resultdict[secstr]=None
else:
pass
return resultdict
def main(iostr,sqlstr,secstr,cmd,**slave_msg):
repl_msg={}
slave_status={}
ip_list=[]
for i in slave_msg.keys():
host=slave_msg[i][0]
port=slave_msg[i][1]
user=slave_msg[i][2]
passwd=slave_msg[i][3]
result=getSlaveMsg(host,port,user,passwd,cmd)
dic_result=getstatus(iostr,sqlstr,secstr,result)
repl_msg[i]=[host,dic_result]
for i in repl_msg.keys():
if repl_msg[i][1][iostr] == "Yes" and repl_msg[i][1][sqlstr] == "Yes":
slave_status[i]=True
elif repl_msg[i][1][secstr] and repl_msg[i][1][secstr] < 2:
slave_status[i]=True
else:
slave_status[i]=False
for i in slave_status.keys():
if slave_status[i]:
ip_list.append(repl_msg[i][0])
status_proportion=float(slave_status.values().count(True))/float(len(slave_status.values()))
if status_proportion > 0.6:
set_dns(ip_list)
else:
pass
return slave_status,ip_list
if __name__ =="__main__":
iostr,sqlstr,secstr,cmd=["Slave_IO_Running","Slave_SQL_Running","Seconds_Behind_Master","show slave status\\G"]
slave_msg={"hostname":["ipaddress",port,"user","passwd"],
"hostname":["ipaddress",port,"user","passwd"],
"hostname":["ipaddress",port,"user","passwd"],
}
repl_msg=main(iostr,sqlstr,secstr,cmd,**slave_msg)
print repl_msg
监控mysql同步,修改DNS解析