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))))
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))
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)))
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