Example #1
0
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))
Example #2
0
def user_email(email, key):
    from mailsand import send_email

    url_scheme = request.environ.get('wsgi.url_scheme')
    HTTP_HOST = request.environ.get('HTTP_HOST')

    http = '%s://%s/register?active=%s' % (url_scheme, HTTP_HOST, key)

    mail = dict()
    mail['to'] = email
    mail['subject'] = '云监工-激活注册账号'
    mail['text'] = """
<td align="center" valign="top" width="592" style="padding:10px; text-align:center; border:1px solid #eee">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="text-align:left; background-color:#fff">
<tbody>
<tr>
<td style="font-size:14px; color:#333; padding:23px 20px 0; line-height:1.46"><span style="margin:0; padding:0">亲爱的用户:</span> 
<p style="margin:0; padding:0">您好,感谢您使用云监工,您正在激活帐户!</p>
<p style="margin:0; padding:0">激活链接:<a target="_blank" href=""" + http + """>立即激活</a></p>
<p style="color:#cb2222; padding:20px 0 0; margin:0">提示:为了保障您账号的安全性,该链接有效期为30分钟。</p>
<p style="margin:0; padding:0; width:70%">如果您误收到此电子邮件,则可能是其他用户在尝试帐号设置时的误操作,可以放心地忽略此电子邮件。</p>
</td>
</tr>
<tr>
<td style="color:#333; line-height:2; padding:30px 20px 10px; font-size:14px">
<p style="margin:0; padding:0">此邮件为自动发送,请勿回复!</p>
</td>
</tr>
</tbody>
</table>
</td>
    """
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    return send_email(mail,config_info)
Example #3
0
def user_email(email, key):
    from mailsand import send_email

    url_scheme = request.environ.get('wsgi.url_scheme')
    HTTP_HOST = request.environ.get('HTTP_HOST')

    http = '%s://%s/register?active=%s' % (url_scheme, HTTP_HOST, key)

    mail = dict()
    mail['to'] = email
    mail['subject'] = '云监工-激活注册账号'
    mail['text'] = """
<td align="center" valign="top" width="592" style="padding:10px; text-align:center; border:1px solid #eee">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="text-align:left; background-color:#fff">
<tbody>
<tr>
<td style="font-size:14px; color:#333; padding:23px 20px 0; line-height:1.46"><span style="margin:0; padding:0">亲爱的用户:</span> 
<p style="margin:0; padding:0">您好,感谢您使用云监工,您正在激活帐户!</p>
<p style="margin:0; padding:0">激活链接:<a target="_blank" href=""" + http + """>立即激活</a></p>
<p style="color:#cb2222; padding:20px 0 0; margin:0">提示:为了保障您账号的安全性,该链接有效期为30分钟。</p>
<p style="margin:0; padding:0; width:70%">如果您误收到此电子邮件,则可能是其他用户在尝试帐号设置时的误操作,可以放心地忽略此电子邮件。</p>
</td>
</tr>
<tr>
<td style="color:#333; line-height:2; padding:30px 20px 10px; font-size:14px">
<p style="margin:0; padding:0">此邮件为自动发送,请勿回复!</p>
</td>
</tr>
</tbody>
</table>
</td>
    """
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    return send_email(mail, config_info)
Example #4
0
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'))
Example #5
0
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'))
Example #6
0
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'))
Example #7
0
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'))
Example #8
0
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))
Example #9
0
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))
Example #10
0
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))
Example #11
0
def detect_exception(user, cookies, user_info):
    from mailsand import send_email
    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'))
    user_key = '%s:%s' % ('user', user_info.get('username'))
    user_info = json.loads(r_session.get(user_key).decode('utf-8'))
    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'))
    if not 'device_info' in account_data.keys(): return
    need_clear = True
    last_exception_key = 'last_exception:%s' % user.get('userid')
    if 'detect_info' not in user_info.keys():
        detect_info = {}
    else:
        detect_info = user_info['detect_info']
    for dev in account_data['device_info']:
        if dev['status'] != 'online':
            status_cn = {'offline': '离线', 'online': '在线', 'exception': '异常'}
            if last_exception_key in detect_info.keys():
                last_time = datetime.strptime(detect_info[last_exception_key], '%Y-%m-%d %H:%M:%S')
                if (datetime.now() - last_time).seconds > 30:
                    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 'warn_reset' not in detect_info.keys() or detect_info['warn_reset']:
                            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['warn_reset'] = False
                                detect_info['last_warn'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            else:
                red_log(user, '矿机异常', '状态', '%s:%s -> %s' % (dev['device_name'], '在线', status_cn[dev['status']]))
                detect_info[last_exception_key] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            need_clear = False
        if 'dcdn_clients' in dev.keys():
            for i, client in enumerate(dev['dcdn_clients']):
                if ('space_%s:%s' % (i, user.get('userid'))) in detect_info.keys():
                    last_space = detect_info['space_%s:%s:%s' % (i, user.get('userid'), dev['device_name'])]
                    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))
                        detect_info['space_%s:%s:%s' % (i, user.get('userid'), dev['device_name'])] = int(
                            client['space_used'])
                    elif last_space < int(client['space_used']):
                        detect_info['space_%s:%s:%s' % (i, user.get('userid'), dev['device_name'])] = int(
                            client['space_used'])
                else:
                    detect_info['space_%s:%s:%s' % (i, user.get('userid'), dev['device_name'])] = int(
                        client['space_used'])
    if need_clear == True:
        detect_info['warn_reset'] = True
        detect_info.pop(last_exception_key, '^.^')
    user_info['detect_info'] = detect_info
    r_session.set(user_key, json.dumps(user_info))