From: Stephen Soltesz Date: Wed, 8 Aug 2007 13:28:06 +0000 (+0000) Subject: + add additional support for RT tickets, closing, changing Subject, and CCs. X-Git-Tag: Monitor-1.0-0~70 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=2b4a306befb89555f65054e1b4dc8c87404c7194;p=monitor.git + add additional support for RT tickets, closing, changing Subject, and CCs. emailViaRT() is the only needed call. If ticket_id is given, it uses this, otherwise, a new ticket is created. --- diff --git a/mailer.py b/mailer.py index c000c0a..f8c27c0 100755 --- a/mailer.py +++ b/mailer.py @@ -4,7 +4,7 @@ # # Faiyaz Ahmed # -# $Id: mailer.py,v 1.8 2007/06/29 12:42:22 soltesz Exp $ +# $Id: mailer.py,v 1.9 2007/07/03 19:57:16 soltesz Exp $ from emailTxt import * import smtplib from config import config @@ -26,7 +26,147 @@ def reformat_for_rt(text): return spaced_text -def emailViaRT(subject, text, to): +def _setupRTenvironment(): + 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" + 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 "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 "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: + # Failed!! + print "FAILED to resolve Ticket %d" % ticket_id + print "FAILED to resolve Ticket %d" % 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. """ @@ -35,11 +175,9 @@ def emailViaRT(subject, text, to): 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" @@ -50,9 +188,8 @@ def emailViaRT(subject, text, to): 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) - #if config.debug: - # print input_text % (subject, "") if config.mail and not config.debug: cmd = "rt create -i -t ticket" @@ -66,6 +203,7 @@ def emailViaRT(subject, text, to): 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 @@ -87,7 +225,7 @@ def email(subject, text, to): 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 @@ -153,6 +291,13 @@ def email(subject, text, to): 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) @@ -167,10 +312,10 @@ if __name__=="__main__": #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..."}, - ["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: