#!/usr/bin/env python
# -*- coding=utf-8 -*-
#coding=utf-8
import requests
import urllib
import time,datetime
import json
import sys
import codecs
import random
import os
import commands
import base64
import smtplib
#import logging
def _wrap_with(code):
def inner(text, bold=False):
c = code
if bold:
c = "1;%s" % c
return "\033[%sm%s\033[0m" % (c, text)
return inner
red = _wrap_with('31')
green = _wrap_with('32')
yellow = _wrap_with('33')
def print_log_record_on_error(func):
def wrap(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except:
import sys
print >>sys.stderr, "Unable to create log message msg=%r, args=%r " % (
getattr(self, 'msg', '?'), getattr(self, 'args', '?'))
raise
return wrap
import logging
#logging.LogRecord.getMessage = print_log_record_on_error(logging.LogRecord.getMessage)
filetime = time.strftime("%Y-%m-%d", time.localtime())
filename = "data-%s.log" %filetime
#print filename
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
datefmt='%Y-%b-%d %H:%M:%S',
filename='./data-%s.log' %filetime,
filemode='a')
#def exitprint(msg):
# print red(msg)
# sys.exit(9)
def get_all_game_mes(game_id):
if game_id == 136:
api_url="http://api.uoc.uuzu.com/ucc/%s/KO-SN" % game_id
elif game_id == 148:
api_url="http://api.uoc.uuzu.com/ucc/%s/JP-SN" % game_id
else:
api_url="http://api.uoc.uuzu.com/ucc/%s/G-SN" % game_id
r = requests.get(api_url).json()
result = json.dumps(r , indent =2 ,ensure_ascii=False).encode('utf-8')
sapi_data = json.loads(result)
msg = sapi_data['data']
return msg
def random_serid(mse):
num = len(mse) -1
random_num = random.randint(0 , num)
server_data = mse[random_num]['name']
# print server_data
m = server_data.encode("utf-8")
serverid = m.split(']')[0].split('[')[1]
ip = m.split('_')[1].split(',')
# print serverid,ip
return ip,serverid
def get_serid(num,mse):
random_num = num
server_data = mse[random_num]['name']
m = server_data.encode("utf-8")
serverid = m.split(']')[0].split('[')[1]
ip = m.split('_')[1].split(',')
return ip,serverid
def cmd(ip,command):
ret = commands.getstatusoutput(command)
if ret[0] == 0:
return ret[1]
else:
logging.info('error:%s IP:%s %s' %(ret[1],ip,cmd))
def num_days_ago(num):
few_day_ago = datetime.datetime.now() - datetime.timedelta(days=num)
return few_day_ago
def ready_to_recovery(ip,serverid):
cmd(ip,"rm -rf /tmp/*3306.tar.gz;rm -rf /tmp/*_3306-increase.tar.gz;rm -rf /data/mysql/var.*")
if os.path.isfile('/tmp/uuzuback_restore.py'):
pass
else:
cmd(ip,"wget http://10.0.2.253/scripts/uuzuback_restore.py -O /tmp/uuzuback_restore.py;chmod 777 /tmp/uuzuback_restore.py")
three_days_ago = num_days_ago(3)
recovery_time= three_days_ago.strftime("%Y-%m-%d %H:%M:00")
loginfomsg = ("recovery_time = %s" %(recovery_time))
# logging.info(loginfomsg)
# print green(recovery_time)
script = "/tmp/uuzuback_restore.py"
recovery_cmd="python %s -t '%s' -s %s -b mysql -I 3306"%(script,recovery_time,serverid)
logging.info(recovery_cmd)
res = cmd(ip,recovery_cmd)
if "error" in res:
logging.error("%s,IP:%s"%(res,ip))
else:
logging.info("IP:%s Backup restore successful" %(ip))
def get_backup_recovery_time (ip):
connect_mysql = "mysql -udbmanager -peyDqNafZ6pq39Rah"
log_name_cmd = "%s -e 'show databases' |grep log " %(connect_mysql)
log_name = cmd(ip,log_name_cmd)
three_days_ago = num_days_ago(3)
three_days_ago_d = three_days_ago.strftime("%Y_%m_%d")
newestime_log_cmd = "%s %s -e 'show tables' |grep player_count | grep %s |grep -v ad" %(connect_mysql,log_name,three_days_ago_d)
# data_log_name = cmd(ip,newestime_log_cmd)
r_data_name = commands.getstatusoutput(newestime_log_cmd)
data_log_name = r_data_name[1]
logging.info ("data_log_name3= %s" %(data_log_name))
if data_log_name:
pass
else:
four_days_ago = num_days_ago(4)
four_days_ago_d = four_days_ago.strftime("%Y_%m_%d")
newestime_log_cmd = "%s %s -e 'show tables' |grep player_count | grep %s |grep -v ad" %(connect_mysql,log_name,four_days_ago_d)
data_log_name = cmd(ip,newestime_log_cmd)
logging.info ("data_log_name4= %s" %(data_log_name))
try:
if data_log_name:
databaktime_cmd = "%s %s -e 'select create_time from %s order by create_time desc limit 1'" %(connect_mysql,log_name,data_log_name)
backup_newestime_m = cmd(ip,databaktime_cmd)
backup_newestime = "%s %s" %(backup_newestime_m.split()[1],backup_newestime_m.split()[2])
if backup_newestime !=None:
loginfomsg = ("%s Database log time is %s" %(ip,backup_newestime))
logging.info(loginfomsg)
return backup_newestime
except Exception,e:
logging.info ("%s;%s"%(e,ip))
else:
backup_newestime = "1990-09-01 00:00:01"
return (backup_newestime)
def get_backfile_time(ip):
if len(ip) == 1:
inet_ip = ip[0]
else:
inet_ip = ip[0]
outnet_ip = ip[1]
get_backfile_name = "ls -lrt /tmp |grep %s |tail -1 |awk '{print $9}'" %(inet_ip)
if get_backfile_name.strip() =='':
logging.error("don't hava backfile or server ip had change %s" %(ip))
backfile_name = cmd(ip,get_backfile_name)
backfile_info = os.stat("/tmp/%s" %(backfile_name))
backfile_t = time.localtime(backfile_info.st_mtime)
backfile_time = time.strftime("%Y-%m-%d %H:%M:00" , backfile_t)
loginfomsg = ("Backup file timestamp is %s"%backfile_time)
logging.info(loginfomsg)
return backfile_time
def compare_time(db_log_t,bak_file_t):
d1_t = datetime.datetime.strptime(bak_file_t, '%Y-%m-%d %H:%M:%S')
d2_t = datetime.datetime.strptime(db_log_t, '%Y-%m-%d %H:%M:%S')
difftime = d1_t -d2_t
d1_s = time.strptime(db_log_t, "%Y-%m-%d %H:%M:%S")
d2_s = time.strptime(bak_file_t, "%Y-%m-%d %H:%M:%S")
d1_s_Stamp = int(time.mktime(d1_s))
d2_s_Stamp = int(time.mktime(d2_s))
if d1_s_Stamp > d2_s_Stamp + int(60*60*15):
logging.error('Greater than 15 minutes')
return difftime,1
else:
logging.info('Less than 15 minutes')
return difftime,0
def compare_opentime(serverid):
try:
opgame_url="http://opgame.uuzu.com/api/group/key/myzEHP14/server_id/%s/debug/1" % serverid
r = requests.get(opgame_url).json()
op_result = json.dumps(r , indent =2 ,ensure_ascii=False).encode('utf-8')
msg = json.loads(op_result)
op_data = msg['data']
opentim = op_data['first_opentime']
opentime = int (opentim)
except Exception,e:
logging.info (e)
four_time = int(time.time()) - 86400 * int(4)
if four_time > opentime:
pass
return 1
else:
logging.info ("%s didn't go to service time" % serverid)
return 0
def Sendmail(to_addr_list = [],subject_header = 'Test',body = 'This is just for test'):
#邮件主题
subject_header = 'Subject: ' + subject_header + '\r'
#发送服务器smtp地址
mail_server = 'smtp.163.com'
#发送服务器smtp端口
mail_server_port = 25
#发件人邮件地址
from_addr = 'sendmail151@163.com'
#邮件的头信息
from_header = 'From: %s\r' % from_addr
#引用smtplib模块
smtp = smtplib.SMTP()
#连接发送邮件服务器
smtp.connect(mail_server,mail_server_port)
#登陆smtp服务器
mail_passwd = base64.decodestring('U2VuZG1haWwxNjM=')
smtp.login('sendmail151@163.com',mail_passwd)
#多个邮件地址的批量发送
for to_addr in to_addr_list:
to_header = 'To: %s\r' % to_addr
#邮件文本信息
email_message = '%s\n%s\n%s\n\r\n%s' %(from_header,to_header,subject_header,body)
#发送邮件
smtp.sendmail(from_addr, to_addr, email_message)
#退出smtp服务器
smtp.quit()
#mse = get_all_game_mes(180)
#ip,serverid = random_serid(mse)
#print ip,serverid
#ip= ['10.10.110.242', '110.10.40.242']
#ip = ['10.6.56.11']
#serverid = 2184310034
#print green(ip,serverid)
#ready_to_recovery(ip,serverid)
#db_log_t = get_backup_recovery_time(ip)
#bak_file_t = get_backfile_time(ip)
#compare_time(db_log_t,bak_file_t)
if __name__=='__main__':
game_id = [97,119,121,136,148,159,169,180]
game_name =['大皇帝','大皇帝手游','大皇帝(台湾)','大皇帝(韩国)','日本大皇帝','东南亚大皇帝','韩国大皇帝手游','东南亚手游']
game_id = [97,119,159,180]
game_name =['大皇帝','大皇帝手游','东南亚大皇帝','东南亚手游']
for i in range(0, len(game_id)):
logging.info(game_name[i])
mse = get_all_game_mes(game_id[i])
num = len(mse)
for i in range(num):
ip,serverid = get_serid(i,mse)
logging.info ("start to recovery %s" %serverid)
res = compare_opentime (serverid)
try:
if res == 1:
ready_to_recovery(ip,serverid)
db_log_t = get_backup_recovery_time(ip)
bak_file_t = get_backfile_time(ip)
compare_time(db_log_t,bak_file_t)
time.sleep(120)
else:
continue
except Exception,e:
logging.info (e)
cmd_error = "cat %s|grep -B 1 -i error" %filename
Mes = commands.getoutput(cmd_error)
if len(Mes) > 0:
to_addr_list = ['xxxb@youzu.com','xxxa@youzu.com','xxxb@youzu.com']
Sendmail(to_addr_list = to_addr_list,subject_header='DHD_CHEK', body=Mes)
备份检查脚本
最新推荐文章于 2022-11-07 19:37:53 发布