From 2ed2ce5272e6523e530a381f2ccb4d9f0b98dbe4 Mon Sep 17 00:00:00 2001 From: vapao Date: Thu, 16 Jan 2020 14:37:03 +0800 Subject: [PATCH] =?UTF-8?q?A=20=E6=B7=BB=E5=8A=A0=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E6=8A=A5=E8=AD=A6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spug_api/apps/monitor/scheduler.py | 12 +++++++++-- spug_api/libs/mail.py | 29 ++++++++++++++++++++++++++ spug_api/libs/spug.py | 33 +++++++++++++++++++++++------- spug_web/src/pages/monitor/Form.js | 2 +- 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 spug_api/libs/mail.py diff --git a/spug_api/apps/monitor/scheduler.py b/spug_api/apps/monitor/scheduler.py index 8115fbb..6f0f470 100644 --- a/spug_api/apps/monitor/scheduler.py +++ b/spug_api/apps/monitor/scheduler.py @@ -37,12 +37,20 @@ class Scheduler: notify_grp=obj.notify_grp, notify_mode=obj.notify_mode) + def _do_notify(self, event, obj): + grp = json.loads(obj.notify_grp) + for mode in json.loads(obj.notify_mode): + if mode == '1': + spug.notify_by_wx(event, obj.name, grp) + elif mode == '4': + spug.notify_by_email(event, obj.name, grp) + def _handle_notify(self, obj, old_status): if obj.latest_status == 0: if old_status == 1: self._record_alarm(obj, '2') logger.info(f'{human_datetime()} recover job_id: {obj.id}') - spug.notify_by_wx('2', obj.name, json.loads(obj.notify_grp)) + self._do_notify('2', obj) else: if obj.fault_times >= obj.threshold: if time.time() - obj.latest_notify_time >= obj.quiet * 60: @@ -50,7 +58,7 @@ class Scheduler: obj.save() self._record_alarm(obj, '1') logger.info(f'{human_datetime()} notify job_id: {obj.id}') - spug.notify_by_wx('1', obj.name, json.loads(obj.notify_grp)) + self._do_notify('1', obj) def _handle_event(self, event): obj = SimpleLazyObject(lambda: Detection.objects.filter(pk=event.job_id).first()) diff --git a/spug_api/libs/mail.py b/spug_api/libs/mail.py new file mode 100644 index 0000000..3a71ac2 --- /dev/null +++ b/spug_api/libs/mail.py @@ -0,0 +1,29 @@ +from email.message import EmailMessage +from email.utils import formataddr +import smtplib + + +class Mail: + def __init__(self, server, port, username, password, nickname=None): + self.host = server + self.port = port + self.user = username + self.password = password + self.nickname = nickname + + def _get_server(self): + server = smtplib.SMTP_SSL(self.host, self.port) + server.login(self.user, self.password) + return server + + def send_text_mail(self, to_addrs, subject, body): + if isinstance(to_addrs, (list, tuple)): + to_addrs = ', '.join(to_addrs) + server = self._get_server() + msg = EmailMessage() + msg.set_content(body) + msg['Subject'] = subject + msg['From'] = formataddr((self.nickname, self.user)) if self.nickname else self.user + msg['To'] = to_addrs + server.send_message(msg) + server.quit() diff --git a/spug_api/libs/spug.py b/spug_api/libs/spug.py index 2ac189c..db985eb 100644 --- a/spug_api/libs/spug.py +++ b/spug_api/libs/spug.py @@ -4,6 +4,7 @@ from apps.alarm.models import Group, Contact from apps.setting.utils import AppSetting from apps.notify.models import Notify +from libs.mail import Mail import requests import json @@ -16,27 +17,45 @@ def _parse_args(n_grp): if not spug_key: Notify.make_notify(notify_source, '1', '发送报警信息失败', '未配置报警服务调用凭据,请在系统管理/系统设置/报警服务设置中配置。') return None, None - return spug_key, [json.loads(x.contacts) for x in Group.objects.filter(id__in=n_grp)] + return spug_key, sum([json.loads(x.contacts) for x in Group.objects.filter(id__in=n_grp)], []) def notify_by_wx(event, subject, n_grp): spug_key, u_ids = _parse_args(n_grp) if u_ids is None: return - users = [x.wx_token for x in Contact.objects.filter(id__in=sum(u_ids, []), wx_token__isnull=False)] + users = set(x.wx_token for x in Contact.objects.filter(id__in=u_ids, wx_token__isnull=False)) if users: data = { 'token': spug_key, 'event': event, 'subject': subject, - 'users': users + 'users': list(users) } requests.post(f'{spug_server}/apis/notify/wx/', json=data) +def notify_by_email(event, subject, n_grp): + spug_key, u_ids = _parse_args(n_grp) + if u_ids is None: + return + users = set(x.email for x in Contact.objects.filter(id__in=u_ids, email__isnull=False)) + if users: + mail_service = json.loads(AppSetting.get_default('mail_service', '{}')) + if mail_service.get('server'): + event_map = {'1': '告警', '2': '恢复'} + subject = f'{event_map[event]}-{subject}' + mail = Mail(**mail_service) + mail.send_text_mail(users, subject, f'{subject}\r\n\r\n自动发送,请勿回复。') + else: + data = { + 'token': spug_key, + 'event': event, + 'subject': subject, + 'users': list(users) + } + requests.post(f'{spug_server}/apis/notify/mail/', json=data) + + def notify_by_sms(): pass - - -def notify_by_email(): - pass diff --git a/spug_web/src/pages/monitor/Form.js b/spug_web/src/pages/monitor/Form.js index 771cc25..2c3895a 100644 --- a/spug_web/src/pages/monitor/Form.js +++ b/spug_web/src/pages/monitor/Form.js @@ -29,7 +29,7 @@ class ComForm extends React.Component { {label: '微信', 'value': '1'}, {label: '短信', 'value': '2', disabled: true}, {label: '钉钉', 'value': '3', disabled: true}, - {label: '邮件', 'value': '4', disabled: true}] + {label: '邮件', 'value': '4'}] } }