First bunch of simple logging modules.
authorMarius Mauch <genone@gentoo.org>
Sun, 13 Nov 2005 15:01:01 +0000 (15:01 -0000)
committerMarius Mauch <genone@gentoo.org>
Sun, 13 Nov 2005 15:01:01 +0000 (15:01 -0000)
svn path=/main/trunk/; revision=2307

pym/elog_modules/__init__.py [new file with mode: 0644]
pym/elog_modules/mod_custom.py [new file with mode: 0644]
pym/elog_modules/mod_mail.py [new file with mode: 0644]
pym/elog_modules/mod_save.py [new file with mode: 0644]
pym/elog_modules/mod_syslog.py [new file with mode: 0644]

diff --git a/pym/elog_modules/__init__.py b/pym/elog_modules/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/pym/elog_modules/mod_custom.py b/pym/elog_modules/mod_custom.py
new file mode 100644 (file)
index 0000000..eebbdd5
--- /dev/null
@@ -0,0 +1,16 @@
+import elog_modules.mod_save, portage_exec, portage_exception
+
+def process(mysettings, cpv, logentries, fulltext):
+       elog_modules.mod_save.process(mysettings, cpv, logentries, fulltext)
+       
+       if (not "PORTAGE_ELOG_COMMAND" in mysettings.keys()) \
+                       or len(mysettings["PORTAGE_ELOG_COMMAND"]) == 0:
+               raise portage_exception.MissingParameter("!!! Custom logging requested but PORTAGE_ELOG_COMMAND is not defined")
+       else:
+               mylogcmd = mysettings["PORTAGE_ELOG_COMMAND"]
+               mylogcmd.replace("${LOGFILE}", elogfilename)
+               mylogcmd.replace("${PACKAGE}", cpv)
+               retval = portage_exec.spawn_bash(mylogcmd)
+               if retval != 0:
+                       raise portage_exception.PortageException("!!! PORTAGE_ELOG_COMMAND failed with exitcode %d" % retval)
+       return
diff --git a/pym/elog_modules/mod_mail.py b/pym/elog_modules/mod_mail.py
new file mode 100644 (file)
index 0000000..a007833
--- /dev/null
@@ -0,0 +1,54 @@
+import smtplib, email.Message, socket, portage_exception
+
+def process(mysettings, cpv, logentries, fulltext):
+       mymailhost = "localhost"
+       mymailport = 25
+       mymailuser = ""
+       mymailpasswd = ""
+       myrecipient = "root@localhost"
+       
+       # Syntax for PORTAGE_LOG_MAILURI (if defined):
+       # adress [[user:passwd@]mailserver[:port]]
+       # where adress:     recipient adress
+       #       user:       username for smtp auth (defaults to none)
+       #       passwd:     password for smtp auth (defaults to none)
+       #       mailserver: smtp server that should be used to deliver the mail (defaults to localhost)
+       #       port:       port to use on the given smtp server (defaults to 25, values > 100000 indicate that starttls should be used on (port-100000))
+       if "PORTAGE_ELOG_MAILURI" in mysettings.keys():
+               if " " in mysettings["PORTAGE_ELOG_MAILURI"]:
+                       myrecipient, mymailuri = mysettings["PORTAGE_ELOG_MAILURI"].split()
+                       if "@" in mymailuri:
+                               myauthdata, myconndata = mymailuri.split("@")
+                               try:
+                                       mymailuser,mymailpasswd = myauthdata.split(":")
+                               except ValueError:
+                                       print "!!! invalid SMTP AUTH configuration, trying unauthenticated ..."
+                       else:
+                               myconndata = mymailuri
+                       if ":" in myconndata:
+                               mymailhost,mymailport = myconndata.split(":")
+                       else:
+                               mymailhost = myconndata
+               else:
+                       myrecipient = mysettings["PORTAGE_ELOG_MAILURI"]
+       try:
+               mymessage = email.Message.Message()
+               mymessage.set_unixfrom("portage")
+               mymessage.set_payload(fulltext)
+               mymessage["To"] = myrecipient
+               mymessage["Subject"] = "[portage] Ebuild log for %s" % cpv
+                               
+               if int(mymailport) > 100000:
+                       myconn = smtplib.SMTP(mymailhost, int(mymailport) - 100000)
+                       myconn.starttls()
+               else:
+                       myconn = smtplib.SMTP(mymailhost, mymailport)
+               if mymailuser != "" and mymailpasswd != "":
+                       myconn.login(mymailuser, mymailpasswd)
+               myconn.sendmail("portage", myrecipient, mymessage.as_string())
+               myconn.quit()
+       except smtplib.SMTPException, e:
+               raise portage_exception.PortageException("!!! An error occured while trying to send logmail:\n"+str(e))
+       except socket.error, e:
+               raise portage_exception.PortageException("!!! A network error occured while trying to send logmail:\n"+str(e)+"\nSure you configured PORTAGE_LOG_MAILURI correctly?")
+       return
diff --git a/pym/elog_modules/mod_save.py b/pym/elog_modules/mod_save.py
new file mode 100644 (file)
index 0000000..970c526
--- /dev/null
@@ -0,0 +1,18 @@
+import os, time
+from portage_data import portage_uid, portage_gid
+
+def process(mysettings, cpv, logentries, fulltext):
+       cpv_path = cpv.replace("/", ":")
+
+       elogdir = mysettings["PORTAGE_TMPDIR"]+"/elogs"
+       if not os.path.exists(elogdir):
+               os.makedirs(elogdir)
+       os.chown(elogdir, portage_uid, portage_gid)
+       os.chmod(elogdir, 0770)
+
+       elogfilename = elogdir+"/"+cpv_path+":"+time.strftime("%Y%m%d-%H%M%S", time.gmtime(time.time()))+".log"
+       elogfile = open(elogfilename, "w")
+       elogfile.write(fulltext)
+       elogfile.close()
+
+       return
diff --git a/pym/elog_modules/mod_syslog.py b/pym/elog_modules/mod_syslog.py
new file mode 100644 (file)
index 0000000..d58979f
--- /dev/null
@@ -0,0 +1,13 @@
+import syslog
+from portage_const import EBUILD_PHASES
+
+def process(mysettings, cpv, logentries, fulltext):
+       syslog.openlog("portage", syslog.LOG_ERR | syslog.LOG_WARNING | syslog.LOG_INFO | syslog.LOG_NOTICE, syslog.LOG_LOCAL5)
+       for phase in EBUILD_PHASES.split():
+               if not phase in logentries:
+                       continue
+               for msgtype,msgcontent in logentries[phase]:
+                       pri = {"INFO": syslog.LOG_INFO, "WARN": syslog.LOG_WARNING, "ERROR": syslog.LOG_ERR, "LOG": syslog.LOG_NOTICE}
+                       msgtext = "".join(msgcontent)
+                       syslog.syslog(pri[msgtype], "%s: %s: %s" % (cpv, phase, msgtext))
+       syslog.closelog()