From 036db5925a46696233787cf045abb8e42be7a91c Mon Sep 17 00:00:00 2001 From: Schuyler Duveen Date: Wed, 28 Jun 2017 14:49:22 -0400 Subject: [PATCH] add two arguments to send only if csv is empty and also not send if its empty -- useful for simple monitoring --- redash_emailer.py | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/redash_emailer.py b/redash_emailer.py index f320871..31eebe9 100644 --- a/redash_emailer.py +++ b/redash_emailer.py @@ -45,6 +45,10 @@ def split_rows_by_column(rows, column): parser.add_argument('--smtp_login', dest='smtp_login', help='SMTP login', default=getattr(settings, 'SMTP_LOGIN', '')) parser.add_argument('--smtp_password', dest='smtp_password', help='SMTP login', default=getattr(settings, 'SMTP_PASSWORD', '')) parser.add_argument('--smtp_port', dest='smtp_port', help='SMTP login', default=getattr(settings, 'SMTP_PORT', 587)) + parser.add_argument('--send_on_empty', dest='send_on_empty', help='Send mailing even if empty results (default:True)', + default=True) + parser.add_argument('--send_only_on_empty', dest='send_only_on_empty', + help=('Send mailing ONLY for empty results. This is useful when using for alarms'), default=False) args = parser.parse_args() args.smtp_port = int(args.smtp_port) @@ -69,6 +73,8 @@ def split_rows_by_column(rows, column): print('Sender email address %s' % required_text) required_inputs = False + send_on_empty = (args.send_on_empty.lower() in ('0', 'false', 'no', 'f', 'n')) + if required_inputs: results = get_redash_results_for_query(args.domain, args.query_id, @@ -79,6 +85,13 @@ def split_rows_by_column(rows, column): else: rows_by_recipient = split_rows_by_column(rows, args.to_address) + empty = not len(rows) + if empty: + if not send_on_empty: + exit() + elif args.send_only_on_empty: + exit() # not empty, so skipping + server = smtplib.SMTP(args.smtp_host, args.smtp_port) server.ehlo() server.starttls() @@ -93,18 +106,20 @@ def split_rows_by_column(rows, column): msg['From'] = args.from_address msg['To'] = recipient msg.attach(MIMEText(args.body, 'plain')) - csv_file = io.StringIO() - csv_writer = csv.writer(csv_file, quoting=csv.QUOTE_NONNUMERIC) - keys = list(rows[0].keys()) - csv_writer.writerow(keys) - for row in rows: - csv_writer.writerow([row[key] for key in keys]) - csv_attachment = MIMEBase('application', 'octet-stream') - csv_attachment.set_payload(csv_file.getvalue()) - encoders.encode_base64(csv_attachment) - csv_attachment.add_header('Content-Disposition', 'attachment', - filename=filename) - msg.attach(csv_attachment) + if not empty: + csv_file = io.StringIO() + csv_writer = csv.writer(csv_file, quoting=csv.QUOTE_NONNUMERIC) + keys = list(rows[0].keys()) + csv_writer.writerow(keys) + for row in rows: + csv_writer.writerow([row[key] for key in keys]) + csv_attachment = MIMEBase('application', 'octet-stream') + csv_attachment.set_payload(csv_file.getvalue()) + encoders.encode_base64(csv_attachment) + csv_attachment.add_header('Content-Disposition', 'attachment', + filename=filename) + msg.attach(csv_attachment) + server.sendmail(args.from_address, msg['To'], msg.as_string()) server.quit()