def detect_exception(user, cookies, user_info): from mailsand import send_email from mailsand import validateEmail print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'detect_exception') config_key = '%s:%s' % ('user', 'system') config_info = json.loads(r_session.get(config_key).decode('utf-8')) account_data_key = 'account:%s:%s:data' % (user_info.get('username'), user.get('userid')) exist_account_data = r_session.get(account_data_key) if exist_account_data is None: return account_data = json.loads(exist_account_data.decode('utf-8')) extra_info_key='extra_info:%s' % (user_info.get('username')) b_extra_info=r_session.get(extra_info_key) if b_extra_info is None: extra_info={} else: extra_info=json.loads(b_extra_info.decode('utf-8')) if 'detect_info' not in extra_info.keys(): detect_info={} else: detect_info=extra_info['detect_info'] if not 'device_info' in account_data.keys(): return status_cn={'offline':'离线','online':'在线','exception':'异常'} for dev in account_data['device_info']: if 'status_list' not in detect_info.keys(): detect_info['status_list']={} if dev['device_name'] not in detect_info['status_list'].keys(): detect_info['status_list'][dev['device_name']]=dev['status'] elif dev['status'] != detect_info['status_list'][dev['device_name']]: red_log(user, '矿机状态', '状态', '%s:%s -> %s' % (dev['device_name'],status_cn[detect_info['status_list'][dev['device_name']]],status_cn[dev['status']])) if dev['status'] != 'online': if 'updated_time' in detect_info.keys() and account_data['updated_time'] != detect_info['updated_time']: if 'last_warn' not in detect_info.keys() or (datetime.now() - datetime.strptime(detect_info['last_warn'],'%Y-%m-%d %H:%M:%S')).seconds > 60*60: if validateEmail(user_info['mail_address']) == 1: mail = dict() mail['to'] = user_info['mail_address'] mail['subject'] = '云监工-矿机异常' mail['text'] = ''.join(['您的矿机:',dev['device_name'],'<br />状态:',status_cn[dev['status']] ,'<br />时间:',datetime.now().strftime('%Y-%m-%d %H:%M:%S')]) send_email(mail,config_info) detect_info['last_warn']=datetime.now().strftime('%Y-%m-%d %H:%M:%S') if 'dcdn_clients' in dev.keys(): for i,client in enumerate(dev['dcdn_clients']): space_last_key='space_%s:%s:%s' % (i,user.get('userid'),dev['device_name']) if space_last_key in detect_info.keys(): last_space=detect_info[space_last_key] if last_space - 100*1024*1024 > int(client['space_used']): red_log(user, '缓存变动', '状态', '%s:删除了%.2fGB缓存,当前%.2fGB' % (dev['device_name'],float(last_space)/1024/1024/1024-float(client['space_used'])/1024/1024/1024,float(client['space_used'])/1024/1024/1024)) detect_info[space_last_key] = int(client['space_used']) elif last_space < int(client['space_used']): detect_info[space_last_key] = int(client['space_used']) else: detect_info[space_last_key] = int(client['space_used']) detect_info['updated_time'] = account_data['updated_time'] extra_info['detect_info']=detect_info r_session.set(extra_info_key, json.dumps(extra_info))
def admin_message_send(): send_type = request.values.get('type') to = request.values.get('to') subject = request.values.get('subject') summary = request.values.get('summary') content = request.values.get('content') if subject == '': session['error_message'] = '标题为必填。' return redirect(url_for('admin_message')) if to == '': session['error_message'] = '收件方必填。' return redirect(url_for('admin_message')) if summary == '': session['error_message'] = '简介必填' return redirect(url_for('admin_message')) send_content = '{:<30}'.format(summary) + content if send_type == 'message': user = session.get('user_info') if to == 'all': for b_username in r_session.smembers('users'): send_msg(b_username.decode('utf-8'), subject, send_content, 3600 * 24 * 31, user.get('username')) else: send_msg(to, subject, send_content, 3600 * 24 * 31, user.get('username')) else: from mailsand import send_email from mailsand import validateEmail to_set = set(to.split(';')) to_list = list() for email in to_set: if validateEmail(email) == 1: to_list.append(email) config_key = '%s:%s' % ('user', 'system') config_info = json.loads(r_session.get(config_key).decode('utf-8')) mail = dict() mail['to'] = ",".join(to_list) mail['subject'] = subject mail['text'] = send_content if not send_email(mail, config_info): session['error_message'] = '发送失败,请检查邮件配置' return redirect(url_for(endpoint='admin_message'))
def admin_message_send(): send_type = request.values.get('type') to = request.values.get('to') subject = request.values.get('subject') summary = request.values.get('summary') content = request.values.get('content') if subject == '': session['error_message'] = '标题为必填。' return redirect(url_for('admin_message')) if to == '': session['error_message'] = '收件方必填。' return redirect(url_for('admin_message')) if summary == '': session['error_message'] = '简介必填' return redirect(url_for('admin_message')) send_content = '{:<30}'.format(summary) + content if send_type=='message': user = session.get('user_info') if to == 'all': for b_username in r_session.smembers('users'): send_msg(b_username.decode('utf-8'), subject, send_content, 3600 * 24 * 31, user.get('username')) else: send_msg(to, subject, send_content, 3600 * 24 * 31,user.get('username')) else: from mailsand import send_email from mailsand import validateEmail to_set=set(to.split(';')) to_list=list() for email in to_set: if validateEmail(email) == 1: to_list.append(email) config_key = '%s:%s' % ('user', 'system') config_info = json.loads(r_session.get(config_key).decode('utf-8')) mail = dict() mail['to'] = ",".join(to_list) mail['subject'] = subject mail['text'] = send_content if not send_email(mail,config_info): session['error_message']='发送失败,请检查邮件配置' return redirect(url_for(endpoint='admin_message'))
def test_email(): from mailsand import send_email from mailsand import validateEmail config_key = '%s:%s' % ('user', 'system') config_info = json.loads(r_session.get(config_key).decode('utf-8')) user = session.get('user_info') user_key = '%s:%s' % ('user', user.get('username')) user_info = json.loads(r_session.get(user_key).decode('utf-8')) session['action'] = 'info' if 'email' not in user_info.keys() or not validateEmail(user_info["email"]): session['error_message'] = '该账户的提醒邮件地址设置不正确,无法测试' return redirect(url_for('system_config')) mail = dict() mail['to'] = user_info['email'] mail['subject'] = '云监工-测试邮件' mail['text'] = '这只是一个测试邮件,你更应该关注的不是这里面写了什么。不是么?' send_email(mail, config_info) return redirect(url_for('system_config'))
def test_email(): from mailsand import send_email from mailsand import validateEmail config_key = '%s:%s' % ('user', 'system') config_info = json.loads(r_session.get(config_key).decode('utf-8')) user = session.get('user_info') user_key = '%s:%s' % ('user', user.get('username')) user_info = json.loads(r_session.get(user_key).decode('utf-8')) session['action'] = 'info' if 'email' not in user_info.keys() or not validateEmail(user_info["email"]): session['error_message']='该账户的提醒邮件地址设置不正确,无法测试' return redirect(url_for('system_config')) mail = dict() mail['to'] = user_info['email'] mail['subject'] = '云监工-测试邮件' mail['text'] = '这只是一个测试邮件,你更应该关注的不是这里面写了什么。不是么?' send_email(mail,config_info) return redirect(url_for('system_config'))
def check_report(user, cookies, user_info): from mailsand import send_email from mailsand import validateEmail print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report') extra_info_key='extra_info:%s' % (user_info.get('username')) b_extra_info=r_session.get(extra_info_key) if b_extra_info is None: extra_info={} else: extra_info=json.loads(b_extra_info.decode('utf-8')) if 'last_adjust_date' not in extra_info.keys() or datetime.strptime(extra_info['last_adjust_date'],'%Y-%m-%d %H:%M:%S').day != datetime.now().day: return if 'last_report_date' not in extra_info.keys(): extra_info['last_report_date'] = '1997-1-1 1:1:1' if datetime.strptime(extra_info['last_report_date'],'%Y-%m-%d %H:%M:%S').day == datetime.now().day: return print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report') str_yesterday = (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d') yesterday_key = 'user_data:%s:%s' % (user_info.get('username'), str_yesterday) b_yesterday_data = r_session.get(yesterday_key) if b_yesterday_data is None: return yesterday_data = json.loads(b_yesterday_data.decode('utf-8')) if 'produce_stat' in yesterday_data.keys(): if validateEmail(user_info['mail_address']) != 1: return mail = dict() mail['to'] = user_info['mail_address'] mail['subject'] = '云监工-收益报告' mail['text'] = """ <DIV style="BACKGROUND-COLOR: #e6eae9"> <TABLE style="WIDTH: 100%; COLOR: #4f6b72; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px" cellSpacing=0 summary="The technical specifications of the Apple PowerMac G5 series"> <CAPTION style="WIDTH: 700px; PADDING-BOTTOM: 5px; TEXT-ALIGN: center; PADDING-TOP: 0px; FONT: italic 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 0px; PADDING-RIGHT: 0px"> 收益报告 </CAPTION> <TBODY> <TR> <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col> 矿主ID </TH> <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col> 平均速度(KB/S) </TH> <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col> 今日收益(¥) </TH> </TR> """ td_speed={} td_produce={} s_sum=0 p_sum=0 for stat in yesterday_data['speed_stat']: s=0 for i in range(0,24): s+=stat['dev_speed'][i] td_speed[stat['mid']]=s/24/8 s_sum+=td_speed[stat['mid']] for j,stat in enumerate(yesterday_data['produce_stat']): s=0 for i in range(1,25): s+=stat['hourly_list'][i] td_produce[stat['mid']]=s/10000 p_sum+=td_produce[stat['mid']] if j % 2 == 0: mail['text']=mail['text'] + """ <TR> <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row> """ + ('%d' % (stat['mid'])) + """ </TH> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.1f' % (td_speed[stat['mid']])) + """ </TD> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.2f' % (td_produce[stat['mid']])) + """ </TD> </TR> """ else: mail['text']=mail['text'] + """ <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #797268; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row> """ + ('%d' % (stat['mid'])) + """ </TH> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.1f' % (td_speed[stat['mid']])) + """ </TD> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.2f' % (td_produce[stat['mid']])) + """ </TD> </TR> """ mail['text']=mail['text'] + """ <TR> <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col> 总计 </TH> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.1f' % (s_sum)) + """ </TD> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.2f' % (p_sum)) + """ </TD> </TR> </TBODY> </TABLE> </DIV> """ send_email(mail,config_info) extra_info['last_report_date']=datetime.now().strftime('%Y-%m-%d %H:%M:%S') r_session.set(extra_info_key,json.dumps(extra_info))
def detect_exception(user, cookies, user_info): from mailsand import send_email from mailsand import validateEmail print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'detect_exception') config_key = '%s:%s' % ('user', 'system') config_info = json.loads(r_session.get(config_key).decode('utf-8')) account_data_key = 'account:%s:%s:data' % (user_info.get('username'), user.get('userid')) exist_account_data = r_session.get(account_data_key) if exist_account_data is None: return account_data = json.loads(exist_account_data.decode('utf-8')) extra_info_key='extra_info:%s' % (user_info.get('username')) b_extra_info=r_session.get(extra_info_key) if b_extra_info is None: extra_info={} else: extra_info=json.loads(b_extra_info.decode('utf-8')) if 'detect_info' not in extra_info.keys(): detect_info={} else: detect_info=extra_info['detect_info'] if not 'device_info' in account_data.keys(): return status_cn={'offline':'离线','online':'在线','exception':'异常'} warn_list=[] for dev in account_data['device_info']: if 'status_list' not in detect_info.keys(): detect_info['status_list']={} if dev['device_name'] not in detect_info['status_list'].keys(): detect_info['status_list'][dev['device_name']]=dev['status'] elif dev['status'] != detect_info['status_list'][dev['device_name']]: red_log(user, '矿机状态', '状态', '%s:%s -> %s' % (dev['device_name'],status_cn[detect_info['status_list'][dev['device_name']]],status_cn[dev['status']])) detect_info['status_list'][dev['device_name']]=dev['status'] if 'exception_occured' not in detect_info.keys(): detect_info['exception_occured'] = True if dev['status'] != 'online': warn_list.append(dev); if 'dcdn_clients' in dev.keys(): for i,client in enumerate(dev['dcdn_clients']): space_last_key='space_%s:%s:%s' % (i,user.get('userid'),dev['device_name']) if space_last_key in detect_info.keys(): last_space=detect_info[space_last_key] if last_space - 100*1024*1024 > int(client['space_used']): red_log(user, '缓存变动', '状态', '%s:删除了%.2fGB缓存,当前%.2fGB' % (dev['device_name'],float(last_space)/1024/1024/1024-float(client['space_used'])/1024/1024/1024,float(client['space_used'])/1024/1024/1024)) detect_info[space_last_key] = int(client['space_used']) elif last_space < int(client['space_used']): detect_info[space_last_key] = int(client['space_used']) else: detect_info[space_last_key] = int(client['space_used']) if len(warn_list) != 0: if 'updated_time' in detect_info.keys() and account_data['updated_time'] != detect_info['updated_time']: if 'exception_occured' in detect_info.keys() and detect_info['exception_occured'] == True: if 'last_warn' not in detect_info.keys() or (datetime.now() - datetime.strptime(detect_info['last_warn'],'%Y-%m-%d %H:%M:%S')).seconds > 60*60: if validateEmail(user_info['email']) == 1: mail = dict() mail['to'] = user_info['email'] mail['subject'] = '云监工-矿机异常' mail['text'] = '' for dev in warn_list: mail['text'] = mail['text'].join(['您的矿机:',dev['device_name'],'<br />状态:',status_cn[dev['status']] ,'<br />时间:',datetime.now().strftime('%Y-%m-%d %H:%M:%S'),'<br />==================<br />']) if send_email(mail,config_info) == True: detect_info['last_warn']=datetime.now().strftime('%Y-%m-%d %H:%M:%S') detect_info['exception_occured'] = False else: detect_info.pop('exception_occured','^.^') detect_info['updated_time'] = account_data['updated_time'] extra_info['detect_info']=detect_info r_session.set(extra_info_key, json.dumps(extra_info))
def check_report(user, cookies, user_info): from mailsand import send_email from mailsand import validateEmail print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report') extra_info_key='extra_info:%s' % (user_info.get('username')) b_extra_info=r_session.get(extra_info_key) if b_extra_info is None: extra_info={} else: extra_info=json.loads(b_extra_info.decode('utf-8')) if 'last_adjust_date' not in extra_info.keys() or datetime.strptime(extra_info['last_adjust_date'],'%Y-%m-%d %H:%M:%S').day != datetime.now().day: return if 'last_report_date' not in extra_info.keys(): extra_info['last_report_date'] = '1997-1-1 1:1:1' if datetime.strptime(extra_info['last_report_date'],'%Y-%m-%d %H:%M:%S').day == datetime.now().day: return print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'check_report') str_yesterday = (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d') yesterday_key = 'user_data:%s:%s' % (user_info.get('username'), str_yesterday) b_yesterday_data = r_session.get(yesterday_key) if b_yesterday_data is None: return yesterday_data = json.loads(b_yesterday_data.decode('utf-8')) if 'produce_stat' in yesterday_data.keys(): if validateEmail(user_info['email']) != 1: return mail = dict() mail['to'] = user_info['email'] mail['subject'] = '云监工-收益报告' mail['text'] = """ <DIV style="BACKGROUND-COLOR: #e6eae9"> <TABLE style="WIDTH: 100%; COLOR: #4f6b72; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px" cellSpacing=0 summary="The technical specifications of the Apple PowerMac G5 series"> <CAPTION style="WIDTH: 700px; PADDING-BOTTOM: 5px; TEXT-ALIGN: center; PADDING-TOP: 0px; FONT: italic 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 0px; PADDING-RIGHT: 0px"> 收益报告 </CAPTION> <TBODY> <TR> <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col> 矿主ID </TH> <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col> 平均速度(KB/S) </TH> <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col> 今日收益(¥) </TH> </TR> """ td_speed={} td_produce={} s_sum=0 p_sum=0 for stat in yesterday_data['speed_stat']: s=0 for i in range(0,24): s+=stat['dev_speed'][i] td_speed[stat['mid']]=s/24/8 s_sum+=td_speed[stat['mid']] for j,stat in enumerate(yesterday_data['produce_stat']): s=0 for i in range(1,25): s+=stat['hourly_list'][i] td_produce[stat['mid']]=s/10000 p_sum+=td_produce[stat['mid']] if j % 2 == 0: mail['text']=mail['text'] + """ <TR> <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row> """ + ('%d' % (stat['mid'])) + """ </TH> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.1f' % (td_speed[stat['mid']])) + """ </TD> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.2f' % (td_produce[stat['mid']])) + """ </TD> </TR> """ else: mail['text']=mail['text'] + """ <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #797268; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row> """ + ('%d' % (stat['mid'])) + """ </TH> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.1f' % (td_speed[stat['mid']])) + """ </TD> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.2f' % (td_produce[stat['mid']])) + """ </TD> </TR> """ mail['text']=mail['text'] + """ <TR> <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col> 总计 </TH> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.1f' % (s_sum)) + """ </TD> <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px"> """ + ('%.2f' % (p_sum)) + """ </TD> </TR> </TBODY> <TFOOT style="FONT-SIZE: 11px; BACKGROUND: none transparent scroll repeat 0% 0%"> <TR> <TD colSpan=4 align=right> """ + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + """ </TD> </TR> </TFOOT> </TABLE> </DIV> """ if send_email(mail,config_info) == True: extra_info['last_report_date']=datetime.now().strftime('%Y-%m-%d %H:%M:%S') r_session.set(extra_info_key,json.dumps(extra_info))