Source code for spike.util.mail_error_logger
#!/usr/bin/env python
# encoding: utf-8
'''
Created by Lionel Chiron 18/10/2013
Copyright (c) 2013 __NMRTEC__. All rights reserved.
Utility for reporting error from standard error output via gmail.
When sys.stderr performs a "write", a mail is sent with a report.
Typical syntax is:
import sys
sys.stderr = Logger()
f = open("fff.jpg")
If the picture "fff.jpg" doesn't exist, an arror message is sent by mail.
'''
from __future__ import print_function
import sys, os
import threading
import smtplib
import sys
if sys.version_info[0] < 3:
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders
else:
from email import encoders as Encoders
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from time import sleep, localtime, strftime
from uuid import getnode as get_mac
import os.path as op
###
gmail_user = "gmalert67@gmail.com"
gmail_pwd = "igbmcalert"
[docs]def mail(to, subject, text = "", attach = None):
'''
Mailing part
'''
print("text ",text)
print("attach ", attach)
msg = MIMEMultipart()
#################
msg['From'] = gmail_user
msg['To'] = to
msg['Subject'] = subject
#############
if text != '' :
msg.attach(MIMEText(text))
###############
if attach is not None :
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(attach, 'rb').read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename = "%s"' % os.path.basename(attach))
msg.attach(part)
##############
mailServer = smtplib.SMTP("smtp.gmail.com", 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmail_user, gmail_pwd)
mailServer.sendmail(gmail_user, to, msg.as_string())
# Should be mailServer.quit(), but that crashes...
mailServer.close()
[docs]class Logger(object):
'''
Standard error logger.
'''
def __init__(self):
try:
applic = sys.modules['__main__'].__file__ # retrieve the name of the module.
except Exception:
print("no __file__")
applic = ''
self.terminal = sys.stderr
date = self.datetime() # takes the date
mac = self.mac() + '_' # find mac address
app = op.splitext(op.basename(applic))[0]+'_' # shorten the application name
#print "shorten name is ", app
self.log_name = "log_" + app + mac + date + ".dat"
self.log = open(self.log_name, "w") # open log file
self.trig = False
[docs] def send_mail(self):
#print "sending mail"
a = threading.Thread(None, self.mail_if_error, None, )
a.start()
[docs] def mac(self):
mac_addr = str(get_mac())
#print "mac address is ", mac_addr
mac_dic = {'149885691548389': 'kartikeya'} #149885691548389
if mac_addr in mac_dic :
return mac_dic[mac_addr]
else:
return mac_addr
[docs] def datetime(self):
return strftime('%Y-%m-%d-%H-%M', localtime())
[docs] def write(self, message):
'''
If error, sys.stderr will call this method
'''
#print "writes message"
self.terminal.write(message)
self.log.write(message)
if not self.trig :
self.send_mail()
self.trig = True
[docs] def mail_if_error(self):
#print "in mail if error"
sleep(1)
self.log.close()
mail("lionel.chiron@gmail.com", self.log_name, attach = self.log_name)
os.remove(self.log_name)
if __name__ == '__main__':
sys.stderr = Logger()
f = open("fff.jpg")