#!/usr/local/bin/python import os import re import sys import yaml import pushover import email.header import email.parser try: # Use argv[1] as path to config file if specified cfg = sys.argv[1] except IndexError: # Fall back to push.cfg in the same direcetory cfg = os.path.dirname(os.path.realpath(__file__)) + '/push.cfg' with open(cfg, 'r') as fh: maps = yaml.load(fh) sender_map = maps.get('senders', []) recipient_map = maps.get('recipients', []) try: recipient = os.environ['RECIPIENT'] except KeyError: print >>sys.stderr, "Recipient missing." sys.exit(1) try: sender = os.environ['SENDER'] except KeyError: print >>sys.stderr, "Sender missing." sys.exit(1) api_token = None user_tokens = None # Select api key from map based on sender for s in sender_map: try: if re.match(s['re'], sender): try: api_token = s['key'] except KeyError: print >>sys.stderr, "Found no key for sender." sys.exit(1) else: break except KeyError: next else: print >>sys.stderr, "Found no matching sender." sys.exit(1) # Select user key(s) from map based on sender for r in recipient_map: try: if re.match(r['re'], recipient): try: user_tokens = r['keys'] except KeyError: print >>sys.stderr, "Found no key(s) for recipient." sys.exit(1) else: break except KeyError: next else: print >>sys.stderr, "Found no matching receiver." sys.exit(1) # Read an email from stdin parser = email.parser.Parser() mail = parser.parse(sys.stdin) # Try to get the subject from the email and recode to utf-8 if possible title, encoding = email.header.decode_header(mail.get('subject'))[0] try: title = title.decode(encoding).encode('utf-8') except NameError, TypeError: pass # Lets at least try to handle mime multipart if mail.is_multipart(): # Try to find something plain text for current in mail.walk(): if current.get_content_type() == 'text/plain': payload = get_payload(decode=True) break else: # A realy stupid fallback payload = mail.get_payload(0) else: # Hurray no multipart payload = mail.get_payload(decode=True) # Recode payload to utf-8 if possible encoding = payload.get_charsets()[0] try: payload = payload.decode(encoding).encode('utf-8') except NameError, TypeError: pass msg = payload.strip() # Check for multiple user keys if type(user_tokens) is list: # Send notification to each user key for user_token in user_tokens: p = pushover.Client(user_token, api_token=api_token) p.send_message(msg, title=title) else: # Send notification to the only user key p = pushover.Client(user_tokens, api_token=api_token) p.send_message(msg, title=title)