take out of repository.
[monitor.git] / mailer.py
index c000c0a..f2af6cf 100755 (executable)
--- a/mailer.py
+++ b/mailer.py
@@ -4,13 +4,15 @@
 #
 # Faiyaz Ahmed <faiyaza@cs.princeton.edu>
 #
 #
 # Faiyaz Ahmed <faiyaza@cs.princeton.edu>
 #
-# $Id: mailer.py,v 1.8 2007/06/29 12:42:22 soltesz Exp $
+# $Id: mailer.py,v 1.10 2007/08/08 13:28:06 soltesz Exp $
 from emailTxt import *
 import smtplib
 from config import config
 from emailTxt import *
 import smtplib
 from config import config
+import calendar
 import logging
 import os
 import time
 import logging
 import os
 import time
+import monitorconfig
 
 config = config()
 logger = logging.getLogger("monitor")
 
 config = config()
 logger = logging.getLogger("monitor")
@@ -26,7 +28,182 @@ def reformat_for_rt(text):
        return spaced_text
                
 
        return spaced_text
                
 
-def emailViaRT(subject, text, to):
+def _setupRTenvironment():
+       os.environ['PATH'] = os.environ['PATH'] + ":" + monitorconfig.RT_WEB_TOOLS_PATH
+       os.environ['RTSERVER'] = monitorconfig.RT_WEB_SERVER
+       os.environ['RTUSER']   = monitorconfig.RT_WEB_USER
+       os.environ['RTPASSWD'] = monitorconfig.RT_WEB_PASSWORD
+       os.environ['RTDEBUG'] = monitorconfig.RT_WEB_DEBUG
+       return
+
+def setTicketStatus(ticket_id, status):
+       _setupRTenvironment()
+       if ticket_id == None or ticket_id == "":
+               return {}
+
+       cmd = "rt edit ticket/%s set status=%s" % (ticket_id, status)
+       (f_in, f_out, f_err) = os.popen3(cmd)
+       value = f_out.read()
+       l_values = value.split('\n')
+       return "".join(l_values).strip()
+
+def getTicketStatus(ticket_id):
+       _setupRTenvironment()
+       if ticket_id == None or ticket_id == "":
+               return {}
+
+       cmd = "rt show -t ticket -f id,subject,status,queue,created %s" % (ticket_id)
+       (f_in, f_out, f_err) = os.popen3(cmd)
+       value = f_out.read()
+       l_values = value.split('\n')
+       r_values = {}
+       for line in l_values:
+               if len(line) == 0: continue
+               vals = line.split(':')
+               key = vals[0]
+               r_values[key] = ":".join(vals[1:])
+               r_values[key] = r_values[key].strip()
+
+       r_values['Created'] = calendar.timegm(time.strptime(r_values['Created']))
+       return r_values
+
+def setAdminCCViaRT(ticket_id, to):
+       # Set ENV Variables/PATH
+       _setupRTenvironment()
+       if ticket_id == None or ticket_id == "":
+               raise Exception("ERROR: ticket_id must be set to some integer value")
+
+       # This will raise an exception if it is not a valid id.
+       i_ticket_id = int(ticket_id)
+
+       # create a comma-separated list
+       s_to = ",".join(to)
+       cmd = "rt edit ticket/%s set admincc='%s'" % (ticket_id, s_to)
+       (f_in, f_out, f_err) = os.popen3(cmd)
+       value = f_out.read()
+       l_values = value.split()
+       f_in.close() ; f_out.close() ; f_err.close()
+       if len(l_values) > 3 and "updated" in l_values[3]:
+               # Success
+               pass
+       else:
+               print "VALUE:", value
+               print "ERROR: RT failed to update AdminCC for ticket %s" % ticket_id
+
+       return
+
+def setSubjectViaRT(ticket_id, subject):
+       # Set ENV Variables/PATH
+       _setupRTenvironment()
+       if ticket_id == None or ticket_id == "":
+               raise Exception("ERROR: ticket_id must be set to some integer value")
+
+       # This will raise an exception if it is not a valid id.
+       i_ticket_id = int(ticket_id)
+
+       cmd = "rt edit ticket/%s set subject='%s'" % (ticket_id, subject)
+       (f_in, f_out, f_err) = os.popen3(cmd)
+       value = f_out.read()
+       l_values = value.split()
+       f_in.close() ; f_out.close() ; f_err.close()
+       if len(l_values) > 3 and "updated" in l_values[3]:
+               # Success
+               pass
+       else:
+               print "VALUE:", value
+               print "ERROR: RT failed to update subject for ticket %s" % ticket_id
+
+       return
+               
+
+def addCommentViaRT(ticket_id, comment):
+       # Set ENV Variables/PATH
+       _setupRTenvironment()
+       if ticket_id == None or ticket_id == "":
+               raise Exception("ERROR: ticket_id must be set to some integer value")
+
+       # This will raise an exception if it is not a valid id.
+       i_ticket_id = int(ticket_id)
+
+       cmd = "rt comment -m '%s' ticket/%s" % (comment, i_ticket_id)
+       (f_in, f_out, f_err) = os.popen3(cmd)
+       value = f_out.read()
+       l_values = value.split()
+       f_in.close() ; f_out.close() ; f_err.close()
+       if len(l_values) > 1 and "recorded" in l_values[1]:
+               # Success
+               pass
+       else:
+               # Error
+               f_in.close() ; f_out.close() ; f_err.close()
+               print "ERROR: RT failed to add comment to id %s" % ticket_id
+
+       return
+
+def closeTicketViaRT(ticket_id, comment):
+       # Set ENV Variables/PATH
+       _setupRTenvironment()
+       if ticket_id == None or ticket_id == "":
+               raise Exception("ERROR: ticket_id must be set to some integer value")
+
+       # This will raise an exception if it is not a valid id.
+       i_ticket_id = int(ticket_id)
+
+       # Append comment to RT ticket
+       addCommentViaRT(ticket_id, comment)
+
+       if not config.debug:
+               cmd = "rt edit ticket/%s set status=resolved" % i_ticket_id
+               (f_in, f_out, f_err) = os.popen3(cmd)
+               f_in.close()
+               value = f_out.read()
+               f_out.close()
+               f_err.close()
+               l_values = value.split()
+               if len(l_values) >= 4 and "updated" in l_values[3]:
+                       # Success!!
+                       pass
+               else:
+                       print "VALUE: ", value
+                       # Failed!!
+                       print "FAILED to resolve Ticket %s" % ticket_id
+                       print "FAILED to resolve Ticket %s" % i_ticket_id
+
+       return
+
+def emailViaRT(subject, text, to, ticket_id=None):
+       if ticket_id == None or ticket_id == "":
+               print "No TICKET"
+               return emailViaRT_NoTicket(subject, text, to)
+
+
+       # Set ENV Variables/PATH
+       _setupRTenvironment()
+
+       if config.mail and not config.debug:
+               setSubjectViaRT(ticket_id, subject)
+               setAdminCCViaRT(ticket_id, to)
+
+               cmd = "rt correspond -m - %s" % ticket_id
+               (f_in, f_out, f_err) = os.popen3(cmd)
+               f_in.write(text)
+               f_in.flush()
+               f_in.close()
+               value = f_out.read()
+
+               # TODO: rt doesn't write to stderr on error!!!
+               if value == "":
+                       raise Exception, f_err.read()
+
+               del f_in
+               f_out.close(); del f_out
+               f_err.close(); del f_err
+               os.wait()
+
+       return ticket_id
+       
+
+def emailViaRT_NoTicket(subject, text, to):
        """Use RT command line tools to send email.
                return the generated RT ticket ID number.
        """
        """Use RT command line tools to send email.
                return the generated RT ticket ID number.
        """
@@ -35,11 +212,9 @@ def emailViaRT(subject, text, to):
        if config.mail and config.debug:
                to = [config.email]
 
        if config.mail and config.debug:
                to = [config.email]
 
-       os.environ['PATH'] = os.environ['PATH'] + ":/home/soltesz/rpm/opt/rt3/bin/"
-       os.environ['RTSERVER'] = "https://rt.planet-lab.org/"
-       os.environ['RTUSER']   = "monitor"
-       os.environ['RTPASSWD'] = "ssorcmor"
-       os.environ['RTDEBUG'] = "0"
+       # Set ENV Variables/PATH
+       _setupRTenvironment()
+
        # NOTE: AdminCc: (in PLC's RT configuration) gets an email sent.
        # This is not the case (surprisingly) for Cc:
        input_text  = "Subject: %s\n"
        # NOTE: AdminCc: (in PLC's RT configuration) gets an email sent.
        # This is not the case (surprisingly) for Cc:
        input_text  = "Subject: %s\n"
@@ -50,9 +225,8 @@ def emailViaRT(subject, text, to):
                input_text += "AdminCc: %s\n" % recipient
        input_text += "Text: %s"
 
                input_text += "AdminCc: %s\n" % recipient
        input_text += "Text: %s"
 
+       # Add a space for each new line to get RT to accept the file.
        spaced_text = reformat_for_rt(text)
        spaced_text = reformat_for_rt(text)
-       #if config.debug:
-       #       print input_text % (subject, "") 
 
        if config.mail and not config.debug:
                cmd = "rt create -i -t ticket"
 
        if config.mail and not config.debug:
                cmd = "rt create -i -t ticket"
@@ -66,6 +240,7 @@ def emailViaRT(subject, text, to):
                if value == "":
                        raise Exception, f_err.read()
 
                if value == "":
                        raise Exception, f_err.read()
 
+               print "MAILER: ticket value == %s" % value.split()[2]
                i_ticket = int(value.split()[2])
                # clean up the child process.
                f_in.close();  del f_in
                i_ticket = int(value.split()[2])
                # clean up the child process.
                f_in.close();  del f_in
@@ -87,7 +262,7 @@ def email(subject, text, to):
        import mimetools
        import cStringIO
 
        import mimetools
        import cStringIO
 
-       if config.mail and config.debug:
+       if (config.mail and config.debug) or (not config.mail and not config.debug and config.bcc):
                to = [config.email]
 
        out = cStringIO.StringIO() # output buffer for our message 
                to = [config.email]
 
        out = cStringIO.StringIO() # output buffer for our message 
@@ -144,15 +319,30 @@ def email(subject, text, to):
        #       mail and debug, 'to' changed at the beginning'
        #   nomail, but report who I'd send to.
        if config.mail:
        #       mail and debug, 'to' changed at the beginning'
        #   nomail, but report who I'd send to.
        if config.mail:
-               try:
-                       # This is normal operation
-                       server = smtplib.SMTP(MTA)
-                       server.sendmail(FROM, to,  msg)
-                       if config.bcc and not config.debug:
-                               server.sendmail(FROM, config.email,  msg)
-                       server.quit()
-               except Exception, err:
-                       print "Mailer error: %s" % err
+               for mta in [MTA, 'golf.cs.princeton.edu']:
+                       try:
+                               # This is normal operation
+                               #print MTA
+                               #print FROM
+                               #print to
+                               #print msg
+                               server = smtplib.SMTP(mta)
+                               #server = smtplib.SMTP('golf.cs.princeton.edu')
+                               server.sendmail(FROM, to,  msg)
+                               if config.bcc and not config.debug:
+                                       server.sendmail(FROM, config.email,  msg)
+                               server.quit()
+                       except Exception, err:
+                               print "Mailer error1: failed using MTA(%s) with: %s" % (mta, err)
+
+       elif not config.debug and not config.mail and config.bcc:
+               for mta in [MTA, 'golf.cs.princeton.edu']:
+                       try:
+                               server = smtplib.SMTP(mta)
+                               server.sendmail(FROM, to,  msg)
+                               server.quit()
+                       except Exception, err:
+                               print "Mailer error2: failed using MTA(%s) with: %s" % (mta, err)
        else:
                #print "Would mail %s" %to
                logger.debug("Would send mail to %s" % to)
        else:
                #print "Would mail %s" %to
                logger.debug("Would send mail to %s" % to)
@@ -167,10 +357,10 @@ if __name__=="__main__":
        #emailViaRT("rt via golf", 
        #         "It gets to both recipients", 
        #         "soltesz@cs.utk.edu")
        #emailViaRT("rt via golf", 
        #         "It gets to both recipients", 
        #         "soltesz@cs.utk.edu")
-       id = emailViaRT("TEST 7", 
+       email("Re: [PL #21323] TEST 7", 
                           mailtxt.newbootcd_one[1] % {'hostname_list':"hostname list..."},
                           mailtxt.newbootcd_one[1] % {'hostname_list':"hostname list..."},
-                          ["soltesz@cs.utk.edu", "soltesz@romcross.org", "soltesz@cs.princeton.edu"])
-       print "ticketid: %d" % id
+                          ['monitor@planet-lab.org'])
+       #print "ticketid: %d" % id
        #id = plc.siteId(["alice.cs.princeton.edu"])
        #print id
        #if id:
        #id = plc.siteId(["alice.cs.princeton.edu"])
        #print id
        #if id: