+ allow None arguments to constructor, and generate good defaults
[monitor.git] / mailer.py
index a1cd735..c000c0a 100755 (executable)
--- a/mailer.py
+++ b/mailer.py
@@ -4,21 +4,92 @@
 #
 # Faiyaz Ahmed <faiyaza@cs.princeton.edu>
 #
-# $Id: mailer.py,v 1.6 2007/01/24 19:29:44 mef Exp $
+# $Id: mailer.py,v 1.8 2007/06/29 12:42:22 soltesz Exp $
 from emailTxt import *
 import smtplib
-import config
+from config import config
+import logging
+import os
+import time
+
+config = config()
+logger = logging.getLogger("monitor")
 
 MTA="localhost"
-FROM="support@planet-lab.org"
+FROM="monitor@planet-lab.org"
+
+def reformat_for_rt(text):
+       lines = text.split("\n")
+       spaced_text = ""
+       for line in lines:
+               spaced_text += " %s\n" %line
+       return spaced_text
+               
+
+def emailViaRT(subject, text, to):
+       """Use RT command line tools to send email.
+               return the generated RT ticket ID number.
+       """
+       i_ticket = 0
+
+       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"
+       # NOTE: AdminCc: (in PLC's RT configuration) gets an email sent.
+       # This is not the case (surprisingly) for Cc:
+       input_text  = "Subject: %s\n"
+       input_text += "Requestor: monitor@planet-lab.org\n"
+       input_text += "id: ticket/new\n"
+       input_text += "Queue: Monitor\n"
+       for recipient in to:
+               input_text += "AdminCc: %s\n" % recipient
+       input_text += "Text: %s"
+
+       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"
+               (f_in, f_out, f_err) = os.popen3(cmd)
+               f_in.write(input_text % (subject, spaced_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()
 
-def email (subject, text, to):
+               i_ticket = int(value.split()[2])
+               # clean up the child process.
+               f_in.close();  del f_in
+               f_out.close(); del f_out
+               f_err.close(); del f_err
+               os.wait()
+       elif config.mail and config.debug:
+               email(subject, spaced_text, to)
+               i_ticket = 0
+       else:
+               i_ticket = 0
+
+       return i_ticket
+
+def email(subject, text, to):
        """Create a mime-message that will render HTML in popular
        MUAs, text in better ones"""
        import MimeWriter
        import mimetools
        import cStringIO
 
+       if config.mail and config.debug:
+               to = [config.email]
+
        out = cStringIO.StringIO() # output buffer for our message 
        txtin = cStringIO.StringIO(text)
 
@@ -35,9 +106,14 @@ def email (subject, text, to):
                for dest in to[1:len(to)]:
                        cc +="%s, " % dest
                cc = cc.rstrip(", ") 
-               writer.addheader("CC", cc)
+               writer.addheader("Cc", cc)
        else:
                writer.addheader("To", to)
+
+       if config.bcc and not config.debug:
+               writer.addheader("Bcc", config.email)
+
+       writer.addheader("Reply-To", 'monitor@planet-lab.org')
                
        writer.addheader("MIME-Version", "1.0")
        #
@@ -62,23 +138,44 @@ def email (subject, text, to):
        writer.lastpart()
        msg = out.getvalue()
        out.close()
-       if not config.debug:
+
+       # three cases:
+       #       mail but no-debug
+       #       mail and debug, 'to' changed at the beginning'
+       #   nomail, but report who I'd send to.
+       if config.mail:
                try:
-                       print "Mailing %s" %to
-                       server = smtplib.SMTP(MTA)
-                       server.sendmail(FROM, to,  msg)
+                       # 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
+       else:
+               #print "Would mail %s" %to
+               logger.debug("Would send mail to %s" % to)
 
 if __name__=="__main__":
        import smtplib
        import emailTxt
        import plc 
-       id = plc.siteId(["alice.cs.princeton.edu"])
-       print id
+       #email("[spam] bcc test from golf.cs.princeton.edu", 
+       #         "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", 
+                          mailtxt.newbootcd_one[1] % {'hostname_list':"hostname list..."},
+                          ["soltesz@cs.utk.edu", "soltesz@romcross.org", "soltesz@cs.princeton.edu"])
+       print "ticketid: %d" % id
+       #id = plc.siteId(["alice.cs.princeton.edu"])
+       #print id
        #if id:
                #email('TEST', emailTxt.mailtxt.ssh % {'hostname': "ALICE.cs.princeton.edu"}, "tech-" + id + "@sites.planet-lab.org")
        #else:
        #       print "No dice."
-       #email("TEST109", "THIS IS A TEST", ["faiyaza@cs.princeton.edu", "faiyaz@winlab.rutgers.edu", "faiyaza@gmail.com"])
+       #email("TEST111", "I'd like to see if this works anywhere", ["soltesz@cs.princeton.edu", "soltesz@cs.utk.edu"])
+       #print "mailer does nothing in main()"