summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/elog_modules/__init__.py0
-rw-r--r--pym/elog_modules/mod_custom.py16
-rw-r--r--pym/elog_modules/mod_mail.py54
-rw-r--r--pym/elog_modules/mod_save.py18
-rw-r--r--pym/elog_modules/mod_syslog.py13
5 files changed, 101 insertions, 0 deletions
diff --git a/pym/elog_modules/__init__.py b/pym/elog_modules/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/pym/elog_modules/__init__.py
diff --git a/pym/elog_modules/mod_custom.py b/pym/elog_modules/mod_custom.py
new file mode 100644
index 000000000..eebbdd55b
--- /dev/null
+++ b/pym/elog_modules/mod_custom.py
@@ -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
index 000000000..a007833ee
--- /dev/null
+++ b/pym/elog_modules/mod_mail.py
@@ -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
index 000000000..970c526f4
--- /dev/null
+++ b/pym/elog_modules/mod_save.py
@@ -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
index 000000000..d58979f6a
--- /dev/null
+++ b/pym/elog_modules/mod_syslog.py
@@ -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()