def post(self, *args, **kwargs):
        ### 发送邮件
        data = json.loads(self.request.body.decode('utf-8'))
        phone = data.get('phone', None)
        msg = data.get('msg', None)  # json格式 对应短信模板里设置的参数
        template_code = data.get('template_code', None)
        sign_name = data.get('sign_name', 'OPS')
        redis_conn = cache_conn()
        if not phone and not msg and not template_code:
            return self.write(dict(code=-1, msg='收件人、邮件标题、邮件内容不能为空'))

        configs_init('all')
        config_info = redis_conn.hgetall(const.APP_SETTINGS)
        config_info = convert(config_info)
        try:
            obj = SendSms(config_info.get(const.SMS_REGION),
                          config_info.get(const.SMS_DOMAIN),
                          config_info.get(const.SMS_PRODUCT_NAME),
                          config_info.get(const.SMS_ACCESS_KEY_ID),
                          config_info.get(const.SMS_ACCESS_KEY_SECRET))

            params = json.dumps(msg)
            sms_response = obj.send_sms(phone,
                                        template_param=params,
                                        sign_name=sign_name,
                                        template_code=template_code)
            sms_response = json.loads(sms_response.decode('utf-8'))
            if sms_response.get("Message") == "OK":
                return self.write(dict(code=0, msg='短信发送成功'))
            else:
                return self.write(
                    dict(code=-2, msg='短信发送失败{}'.format(str(sms_response))))

        except Exception as e:
            return self.write(dict(code=-1, msg='短信发送失败 {}'.format(str(e))))
Exemple #2
0
    def post(self, *args, **kwargs):
        data = json.loads(self.request.body.decode("utf-8"))
        alerts = data.get('alerts')  # 获取AlertManager POST报警数据
        #alerts = [{'status': 'firing', 'labels': {'alertname': 'Node主机CPU利用率过高', 'instance': '172.16.1.53:9100', 'prometheus': 'monitoring/k8s', 'severity': '严重'}, 'annotations': {'detail': '172.16.1.53:9100: CPU利用率过高于75% (当前值: 92.11666666667345)', 'summary': '172.16.1.53:9100: CPU利用率过高'}, 'startsAt': '2019-03-18T05:34:54.025953211Z', 'endsAt': '0001-01-01T00:00:00Z', 'generatorURL': 'http://prometheus-k8s-1:9090/graph?g0.expr=100+-+%28avg+by%28instance%29+%28irate%28node_cpu_seconds_total%7Bjob%3D%22node-exporter%22%2Cmode%3D%22idle%22%7D%5B5m%5D%29%29+%2A+100%29+%3E+75&g0.tab=1'}]
        for alerts_data in alerts:
            labels = alerts_data.get('labels')
            alert_name = labels.get('alertname')
            print('alert_name---->', alert_name)
            cache_config_info = redis_conn.hgetall(const.APP_SETTINGS)
            if cache_config_info:
                config_info = convert(cache_config_info)
            else:
                config_info = configs['email_info']

            emails_list = redis_conn.hvals(alert_name)
            print('Email_list----->', emails_list)
            sm = SendMail(
                mail_host=config_info.get(const.EMAIL_HOST),
                mail_port=config_info.get(const.EMAIL_PORT),
                mail_user=config_info.get(const.EMAIL_HOST_USER),
                mail_password=config_info.get(const.EMAIL_HOST_PASSWORD),
                mail_ssl=True
                if config_info.get(const.EMAIL_USE_SSL) == '1' else False)
            ### 如果没有redis没有配置
            if not emails_list:
                # print(configs.get('default_email'))[0]  #元祖类型
                sm.send_mail(
                    configs.get('default_email')[0], alert_name,
                    alerts_data['annotations']['detail'])
                # print('msg=',alerts_data['annotations']['detail'])
                return self.write(dict(code=-1, msg="没有匹配到规则"))

            ### 默认发送邮件
            sm.send_mail(",".join(emails_list), alert_name,
                         alerts_data['annotations']['detail'])

            # 严重警告发短信
            if labels.get('severity') == "严重":
                if not configs.get('sign_name') or not configs.get(
                        'template_code'):
                    sm.send_mail(configs.get('default_email'), alert_name,
                                 '请配置短信的sign_name和template_code')
                else:
                    phone_numbers = redis_conn.hkeys(alert_name)
                    # 发送内容
                    params = {"msg": alerts_data['annotations']['detail']}
                    sms = SendSms(config_info.get(const.SMS_REGION),
                                  config_info.get(const.SMS_DOMAIN),
                                  config_info.get(const.SMS_PRODUCT_NAME),
                                  config_info.get(const.SMS_ACCESS_KEY_ID),
                                  config_info.get(const.SMS_ACCESS_KEY_SECRET))

                    sms.send_sms(phone_numbers=",".join(phone_numbers),
                                 template_param=params,
                                 sign_name=configs.get('sign_name')[0],
                                 template_code=configs.get('template_code')[0])

        return self.write(dict(code=0, msg="发送成功", data=alerts))
Exemple #3
0
    def post(self, *args, **kwargs):
        data = json.loads(self.request.body.decode('utf-8'))
        check_key = data.get('check_key')
        user_id = self.get_current_id()

        redis_conn = cache_conn()
        config_info = redis_conn.hgetall(const.APP_SETTINGS)
        config_info = convert(config_info)

        if check_key == 'EMAIL':
            with DBContext('r') as session:
                mail_to = session.query(
                    Users.email).filter(Users.user_id == user_id).first()

            send_list = [mail_to[0], 'OPS测试邮件', '测试发送邮件成功', 'plain', None]
            res = yield self.send_mail_pool(send_list, config_info)
            return self.write(res)

        elif check_key == 'SMS':
            obj = SendSms(config_info.get(const.SMS_REGION),
                          config_info.get(const.SMS_DOMAIN),
                          config_info.get(const.SMS_PRODUCT_NAME),
                          config_info.get(const.SMS_ACCESS_KEY_ID),
                          config_info.get(const.SMS_ACCESS_KEY_SECRET))

            query_response = obj.query_send_detail(
                '', '11111111111', 1, 1,
                time.strftime("%Y%m%d", time.localtime()))
            query_response = json.loads(query_response.decode('utf-8'))
            if query_response.get("Message") == "OK":
                return self.write(dict(code=0, msg='测试短信成功'))
            else:
                return self.write(
                    dict(code=-2, msg='测试短信失败{}'.format(str(query_response))))
        elif check_key == 'LDAP':
            ldap_ssl = True if config_info.get(
                const.LDAP_USE_SSL) == '1' else False

            obj = LdapApi(config_info.get(const.LDAP_SERVER_HOST),
                          config_info.get(const.LDAP_ADMIN_DN),
                          config_info.get(const.LDAP_ADMIN_PASSWORD),
                          int(config_info.get(const.LDAP_SERVER_PORT, 389)),
                          ldap_ssl)

            if obj.ldap_server_test():
                return self.write(dict(code=0, msg='LDAP连接测试成功'))
            else:
                return self.write(dict(code=-1, msg='LDAP连接测试不成功,请仔细检查配置'))

        else:
            return self.write(dict(code=-1, msg='未知测试项目'))
    def post(self, *args, **kwargs):
        data = json.loads(self.request.body.decode('utf-8'))
        check_key = data.get('check_key')
        user_id = self.get_current_id()

        redis_conn = cache_conn()
        config_info = redis_conn.hgetall(const.APP_SETTINGS)
        config_info = convert(config_info)

        if check_key == 'EMAIL':
            with DBContext('r') as session:
                mail_to = session.query(Users.email).filter(Users.user_id == user_id).first()

            obj = SendMail(mail_host=config_info.get(const.EMAIL_HOST), mail_port=config_info.get(const.EMAIL_PORT),
                           mail_user=config_info.get(const.EMAIL_HOST_USER),
                           mail_password=config_info.get(const.EMAIL_HOST_PASSWORD),
                           mail_ssl=True if config_info.get(const.EMAIL_USE_SSL) == '1' else False)

            obj.send_mail(mail_to[0], 'OPS测试邮件', '测试发送邮件成功', subtype='plain')
            return self.write(dict(code=0, msg='测试邮件已经发送'))

        elif check_key == 'SMS':
            obj = SendSms(config_info.get(const.SMS_REGION), config_info.get(const.SMS_DOMAIN),
                          config_info.get(const.SMS_PRODUCT_NAME), config_info.get(const.SMS_ACCESS_KEY_ID),
                          config_info.get(const.SMS_ACCESS_KEY_SECRET))

            query_response = obj.query_send_detail('', '11111111111', 1, 1, time.strftime("%Y%m%d", time.localtime()))
            query_response = json.loads(query_response.decode('utf-8'))
            if query_response.get("Message") == "OK":
                return self.write(dict(code=0, msg='测试短信成功'))
            else:
                return self.write(dict(code=-2, msg='测试短信失败{}'.format(str(query_response))))
        else:
            return self.write(dict(code=-1, msg='未知测试项目'))
    def send_sms_pool(self, *args_list):
        send_list = args_list[0]
        config_info = args_list[1]
        try:
            obj = SendSms(config_info.get(const.SMS_REGION), config_info.get(const.SMS_DOMAIN),
                          config_info.get(const.SMS_PRODUCT_NAME), config_info.get(const.SMS_ACCESS_KEY_ID),
                          config_info.get(const.SMS_ACCESS_KEY_SECRET))

            params = json.dumps(send_list[1])
            sms_response = obj.send_sms(send_list[0], template_param=params, sign_name=send_list[2],
                                        template_code=send_list[3])
            sms_response = json.loads(sms_response.decode('utf-8'))
            if sms_response.get("Message") == "OK":
                return dict(code=0, msg='短信发送成功')
            else:
                return dict(code=-2, msg='短信发送失败{}'.format(str(sms_response)))

        except Exception as e:
            return dict(code=-1, msg='短信发送失败 {}'.format(str(e)))
Exemple #6
0
def send_alarm():
    with DBContext('r', None, False, **configs) as session:
        error_info = session.query(TaskList).filter(
            TaskList.schedule == 'start', TaskList.status == '4',
            TaskList.start_time < datetime.datetime.now()).all()
        ### 查找出已经发出告警的订单
        old_warm = session.query(TaskMonitor).filter(
            TaskMonitor.call_status == 1).all()

    ### 没有错误订单则返回
    if not error_info:
        return

    old_warm_list = []
    error_list = []

    for o in old_warm:
        old_warm_list.append(o.list_id)

    old_warm_list = list(set(old_warm_list))

    with DBContext('w', None, True, **configs) as session:
        for i in error_info:
            error_list.append(int(i.list_id))
            if int(i.list_id) not in old_warm_list:
                print('The task-{0} is error'.format(i.list_id))
                call_info = 'ID-{} 任务-{} 类型-{}'.format(i.list_id,
                                                       i.task_name[0:25],
                                                       i.task_type[0:25])
                session.add(
                    TaskMonitor(
                        list_id=int(i.list_id),
                        call_info=call_info,
                        call_level=2,
                        call_users=','.join(
                            list(literal_eval(i.associated_user).values())[0]),
                        call_status=0))

        ### 错误记录里面里面的订单已经修复
        for o in old_warm_list:
            if int(o) not in error_list:
                session.query(TaskMonitor).filter(
                    TaskMonitor.list_id == int(o)).delete(
                        synchronize_session=False)

        ### 删除报警记录
        session.query(TaskMonitor).filter(
            TaskMonitor.ctime < time.localtime(time.time() - 6000)).delete(
                synchronize_session=False)
        session.commit()

    time.sleep(1)
    ### 告警
    with DBContext('r', None, False, **configs) as session:
        my_call = session.query(TaskMonitor).filter(
            TaskMonitor.call_status == 0).all()
        ### 如果没有告警信息,则返回
        if not len(my_call):
            return

    redis_conn = cache_conn()
    cache_config_info = redis_conn.hgetall(const.APP_SETTINGS)
    if cache_config_info:
        config_info = convert(cache_config_info)
    else:
        config_info = configs['email_info']

    ### 禁用邮箱
    # sm = SendMail(mail_host=config_info.get(const.EMAIL_HOST), mail_port=config_info.get(const.EMAIL_PORT),
    #               mail_user=config_info.get(const.EMAIL_HOST_USER),
    #               mail_password=config_info.get(const.EMAIL_HOST_PASSWORD),
    #               mail_ssl=True if config_info.get(const.EMAIL_USE_SSL) == '1' else False)

    ### 发送短信实例化
    sms = SendSms(config_info.get(const.SMS_REGION),
                  config_info.get(const.SMS_DOMAIN),
                  config_info.get(const.SMS_PRODUCT_NAME),
                  config_info.get(const.SMS_ACCESS_KEY_ID),
                  config_info.get(const.SMS_ACCESS_KEY_SECRET))
    for i in my_call:
        sms_to_list = []
        email_to_list = []
        for user in i.call_users.split(','):
            info__contact = convert(
                redis_conn.hgetall(bytes(user + '__contact',
                                         encoding='utf-8')))
            if info__contact:
                sms_to_list.append(info__contact['tel'])
                email_to_list.append(info__contact['email'])
        print(sms_to_list, email_to_list, i.call_info)
        ### 发送邮件
        # sm.send_mail(",".join(email_to_list), '自动化订单', i.call_info)

        ### 以下为注释为单独报警的示例,具体根据自己的需求修改
        # import sys
        # sys.path.append(sys.path[0])
        # print(exec_shell('python3 alert.py {} {}'.format(",".join(sms_to_list), i.call_info)))

        ### 发送短信
        if sms_to_list:
            params = {"msg": i.call_info}  # 对应短信模板里设置的参数
            sms.send_sms(phone_numbers=",".join(sms_to_list),
                         template_param=params,
                         sign_name=configs.get('sign_name')[0],
                         template_code=configs.get('template_code')[0])

    ### 发送完禁用
    with DBContext('w', None, True, **configs) as session:
        session.query(TaskMonitor).filter(TaskMonitor.call_status == 0).update(
            {TaskMonitor.call_status: 1})
        session.commit()

    return