Home | History | Annotate | Download | only in scheduler
      1 """Scheduler email manager."""
      2 
      3 
      4 import logging
      5 import os
      6 import re
      7 import socket
      8 import time
      9 import traceback
     10 
     11 import common
     12 from autotest_lib.client.common_lib import global_config
     13 from autotest_lib.site_utils  import gmail_lib
     14 
     15 
     16 CONFIG_SECTION = 'SCHEDULER'
     17 
     18 
     19 class EmailNotificationManager(object):
     20     """Scheduler email notification manager."""
     21 
     22     def __init__(self):
     23         """Initialize the manager."""
     24         self._emails = []
     25         self._notify_address = global_config.global_config.get_config_value(
     26             CONFIG_SECTION, "notify_email", default='')
     27 
     28 
     29     def send_email(self, to_string, subject, body):
     30         """Mails out emails to the addresses listed in to_string.
     31 
     32         @param to_string: is split into a list which can be delimited by any of:
     33                           ';', ',', ':' or any whitespace.
     34         @param subject: String, email subject.
     35         @param body: String, message body
     36         """
     37         # Create list from string removing empty strings from the list.
     38         to_list = [x for x in re.split('\s|,|;|:', to_string) if x]
     39         if not to_list:
     40             return
     41         to_string = ','.join(to_list)
     42         try:
     43             gmail_lib.send_email(to_string, subject, body)
     44         except Exception:
     45             logging.exception('Sending email failed:')
     46 
     47 
     48     def enqueue_notify_email(self, subject, message):
     49         """Enqueue a message that will be sent later.
     50 
     51         @param subject: String, subject of the message.
     52         @param message: String, message to enqueue.
     53         """
     54         logging.error(subject + '\n' + message)
     55         if not self._notify_address:
     56             return
     57 
     58         body = 'Subject: ' + subject + '\n'
     59         body += "%s / %s / %s\n%s" % (socket.gethostname(),
     60                                       os.getpid(),
     61                                       time.strftime("%X %x"), message)
     62         self._emails.append(body)
     63 
     64 
     65     def send_queued_emails(self):
     66         """Send queued emails."""
     67         if not self._emails:
     68             return
     69         subject = 'Scheduler notifications from ' + socket.gethostname()
     70         separator = '\n' + '-' * 40 + '\n'
     71         body = separator.join(self._emails)
     72 
     73         self.send_email(self._notify_address, subject, body)
     74         self._emails = []
     75 
     76 
     77     def log_stacktrace(self, reason):
     78         """Log an exception and enqueue it.
     79 
     80         @param reason: An exception to log and send.
     81         """
     82         logging.exception(reason)
     83         message = "EXCEPTION: %s\n%s" % (reason, traceback.format_exc())
     84         self.enqueue_notify_email("monitor_db exception", message)
     85 
     86 
     87 manager = EmailNotificationManager()
     88