-
Notifications
You must be signed in to change notification settings - Fork 57
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Handlers] SES, SNS, Twilio, Stored Procedure, SMTP (#284)
* Adds SES, SNS, Stored Procedure, Twilio, and SMTP handlers, contributed by Roman Dobrik
- Loading branch information
1 parent
bc30168
commit 3e712b5
Showing
8 changed files
with
280 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
import boto3 | ||
|
||
from botocore.exceptions import ClientError | ||
from runners.helpers import log | ||
from runners.helpers.dbconfig import REGION | ||
|
||
|
||
def handle(alert, type='ses', recipient_email=None, sender_email=None, text=None, html=None, subject=None, cc=None, bcc=None, reply_to=None, charset="UTF-8"): | ||
|
||
# check if recipient email is not empty | ||
if recipient_email is None: | ||
log.error(f'Cannot identify recipient email') | ||
return None | ||
|
||
if text is None: | ||
log.error(f'SES Message is empty') | ||
return None | ||
|
||
if cc is None: | ||
ccs = [] | ||
else: | ||
ccs = cc.split(",") | ||
|
||
if bcc is None: | ||
bccs = [] | ||
else: | ||
bccs = bcc.split(",") | ||
|
||
if reply_to is None: | ||
replyTo = [] | ||
else: | ||
replyTo = reply_to.split(",") | ||
|
||
destination = { | ||
'ToAddresses': [ | ||
recipient_email | ||
], | ||
'CcAddresses': ccs, | ||
'BccAddresses': bccs | ||
} | ||
|
||
body = { | ||
'Text': { | ||
'Charset': charset, | ||
'Data': text, | ||
}, | ||
} | ||
|
||
if html is not None: | ||
body.update(Html={ | ||
'Charset': charset, | ||
'Data': html, | ||
}) | ||
|
||
message = { | ||
'Body': body, | ||
'Subject': { | ||
'Charset': charset, | ||
'Data': subject, | ||
}, | ||
} | ||
|
||
log.debug(f'SES message for recipient with email {recipient_email}', message) | ||
|
||
client = boto3.client('ses', region_name=REGION) | ||
|
||
# Try to send the email. | ||
try: | ||
# Provide the contents of the email. | ||
response = client.send_email( | ||
Destination=destination, | ||
Message=message, | ||
Source=sender_email, | ||
ReplyToAddresses=replyTo | ||
) | ||
# Display an error if something goes wrong. | ||
except ClientError as e: | ||
log.error(f'Failed to send email {e}') | ||
return None | ||
else: | ||
log.debug("SES Email sent!") | ||
|
||
return response |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import os | ||
|
||
from twilio.rest import Client | ||
|
||
from runners.helpers import log | ||
from runners.helpers import vault | ||
|
||
|
||
def handle(alert, type='sms', recipient_phone=None, sender_phone=None, message=None): | ||
|
||
if not os.environ.get('TWILIO_API_SID'): | ||
log.info(f"No TWILIO_API_SID in env, skipping handler.") | ||
return None | ||
|
||
twilio_sid = os.environ["TWILIO_API_SID"] | ||
|
||
twilio_token = vault.decrypt_if_encrypted(os.environ['TWILIO_API_TOKEN']) | ||
|
||
# check if phone is not empty if yes notification will be delivered to twilio | ||
if recipient_phone is None: | ||
log.error(f'Cannot identify assignee phone number') | ||
return None | ||
|
||
if message is None: | ||
log.error(f'SMS Message is empty') | ||
return None | ||
|
||
log.debug(f'Twilio message for recipient with phone number {recipient_phone}', message) | ||
|
||
client = Client(twilio_sid, twilio_token) | ||
|
||
response = client.messages.create( | ||
body=message, | ||
from_=sender_phone, | ||
to=recipient_phone | ||
) | ||
|
||
return response |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import json | ||
import boto3 | ||
|
||
from botocore.exceptions import ClientError | ||
from runners.helpers import log | ||
from runners.helpers.dbconfig import REGION | ||
|
||
|
||
def handle(alert, type='sns', topic=None, target=None, recipient_phone=None, subject=None, message_structure=None, message=None): | ||
|
||
# check if phone is nit empty if yes notification will be delivered to twilio | ||
if recipient_phone is None and topic is None and target is None: | ||
log.error(f'Cannot identify recipient') | ||
return None | ||
|
||
if message is None: | ||
log.error(f'SNS Message is empty') | ||
return None | ||
|
||
log.debug(f'SNS message ', message) | ||
|
||
client = boto3.client('sns', region_name=REGION) | ||
|
||
params = {} | ||
|
||
if message_structure is not None: | ||
params['MessageStructure'] = message_structure | ||
if message_structure == 'json': | ||
message = json.dumps(message) | ||
|
||
if topic is not None: | ||
params['TopicArn'] = topic | ||
if target is not None: | ||
params['TargetArn'] = target | ||
if recipient_phone is not None: | ||
params['PhoneNumber'] = recipient_phone | ||
if subject is not None: | ||
params['Subject'] = subject | ||
|
||
log.debug(f"SNS message", message) | ||
|
||
params['Message'] = message | ||
|
||
# Try to send the message. | ||
try: | ||
# Provide the contents of the message. | ||
response = client.publish(**params) | ||
# Display an error if something goes wrong. | ||
except ClientError as e: | ||
log.error(f'Failed to send message {e}') | ||
return None | ||
else: | ||
log.debug("SNS message sent!") | ||
|
||
return response |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
from runners.helpers import log | ||
from runners.helpers import db | ||
|
||
|
||
def call_procedure(procedure, parameters): | ||
payload = None | ||
|
||
try: | ||
# call stored procedure | ||
if parameters is not None and len(parameters) > 0: | ||
params = "(" | ||
for i in range(len(parameters)): | ||
params = params + "%s" | ||
if i < len(parameters) - 1: | ||
params = params + "," | ||
params = params + ")" | ||
else: | ||
params = "()" | ||
|
||
sql = "call " + procedure + params | ||
|
||
log.debug(f"Procedure call sql {sql}") | ||
connection = db.connect() | ||
cur = connection.cursor() | ||
cur.execute(sql, tuple(parameters)) | ||
rows = cur.fetchall() | ||
|
||
if len(rows) > 0: | ||
row = rows[0] | ||
|
||
if len(row) > 0: | ||
log.debug(f"Stored procedure {procedure} response", ''.join(row[0])) | ||
payload = ''.join(row[0]) | ||
|
||
cur.close() | ||
except Exception as e: | ||
log.error(f"Error executing stored procedure", e) | ||
raise | ||
|
||
return payload | ||
|
||
|
||
def handle(alert, procedure=None, parameters=None): | ||
log.debug(f"Procedure name {procedure}") | ||
log.debug(f"Procedure parameters {parameters}") | ||
if procedure is not None: | ||
# call Snowflake stored procedure | ||
try: | ||
result = call_procedure(procedure, parameters) | ||
return result | ||
except Exception: | ||
return None | ||
else: | ||
return None |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters