Adding subdirectories for remote commands to control ILO and DRAC cards over
[monitor.git] / mailer.py
index c000c0a..c6a1f4e 100755 (executable)
--- a/mailer.py
+++ b/mailer.py
@@ -4,7 +4,7 @@
 #
 # 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
@@ -26,7 +26,150 @@ def reformat_for_rt(text):
        return spaced_text
                
 
        return spaced_text
                
 
-def emailViaRT(subject, text, to):
+def _setupRTenvironment():
+       os.environ['PATH'] = os.environ['PATH'] + ":/home/soltesz/local/bin/"
+       os.environ['RTSERVER'] = "https://rt.planet-lab.org/"
+       os.environ['RTUSER']   = "monitor"
+       os.environ['RTPASSWD'] = "ssorcmor"
+       os.environ['RTDEBUG'] = "0"
+       return
+
+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 == "":
+               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 +178,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 +191,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 +206,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 +228,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 
@@ -153,6 +294,13 @@ def email(subject, text, to):
                        server.quit()
                except Exception, err:
                        print "Mailer error: %s" % err
                        server.quit()
                except Exception, err:
                        print "Mailer error: %s" % err
+       elif not config.debug and not config.mail and config.bcc:
+               try:
+                       server = smtplib.SMTP(MTA)
+                       server.sendmail(FROM, to,  msg)
+                       server.quit()
+               except Exception, err:
+                       print "Mailer error: %s" % 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 +315,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: