mirror of https://github.com/veops/cmdb.git
73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
# -*- coding:utf-8 -*-
|
|
|
|
import json
|
|
|
|
import requests
|
|
import six
|
|
from flask import current_app
|
|
from jinja2 import Template
|
|
from markdownify import markdownify as md
|
|
|
|
from api.lib.common_setting.notice_config import NoticeConfigCRUD
|
|
from api.lib.mail import send_mail
|
|
|
|
|
|
def _request_messenger(subject, body, tos, sender, payload):
|
|
params = dict(sender=sender, title=subject,
|
|
tos=[to[sender] for to in tos if to.get(sender)])
|
|
|
|
if not params['tos']:
|
|
raise Exception("no receivers")
|
|
|
|
flat_tos = []
|
|
for i in params['tos']:
|
|
if i.strip():
|
|
to = Template(i).render(payload)
|
|
if isinstance(to, list):
|
|
flat_tos.extend(to)
|
|
elif isinstance(to, six.string_types):
|
|
flat_tos.append(to)
|
|
params['tos'] = flat_tos
|
|
|
|
if sender == "email":
|
|
params['msgtype'] = 'text/html'
|
|
params['content'] = body
|
|
else:
|
|
params['msgtype'] = 'markdown'
|
|
try:
|
|
content = md("{}\n{}".format(subject or '', body or ''))
|
|
except Exception as e:
|
|
current_app.logger.warning("html2markdown failed: {}".format(e))
|
|
content = "{}\n{}".format(subject or '', body or '')
|
|
|
|
params['content'] = json.dumps(dict(content=content))
|
|
|
|
url = current_app.config.get('MESSENGER_URL') or NoticeConfigCRUD.get_messenger_url()
|
|
if not url:
|
|
raise Exception("no messenger url")
|
|
|
|
if not url.endswith("message"):
|
|
url = "{}/v1/message".format(url)
|
|
|
|
resp = requests.post(url, json=params)
|
|
if resp.status_code != 200:
|
|
raise Exception(resp.text)
|
|
|
|
return resp.text
|
|
|
|
|
|
def notify_send(subject, body, methods, tos, payload=None):
|
|
payload = payload or {}
|
|
payload = {k: v or '' for k, v in payload.items()}
|
|
subject = Template(subject).render(payload)
|
|
body = Template(body).render(payload)
|
|
|
|
res = ''
|
|
for method in methods:
|
|
if method == "email" and not current_app.config.get('USE_MESSENGER', True):
|
|
send_mail(None, [Template(to.get('email')).render(payload) for to in tos], subject, body)
|
|
|
|
res += (_request_messenger(subject, body, tos, method, payload) + "\n")
|
|
|
|
return res
|