return None
def user(self, l):
+ if not self.users.has_key(l):
+ log.panic("no such user: %s" % l)
return self.users[l]
def set_current_user(self, u):
import os
import atexit
-from acl import acl
import notify
import path
import util
import report
import log
import buildlogs
+import status
def build_all(r, build_fnc):
- acl.set_current_user(acl.user(r.requester))
+ status.email = r.requester_email
notify.begin(r)
tmp = path.spool_dir + util.uuid() + "/"
r.tmp_dir = tmp
from config import config
import util
-from acl import acl
class Buildlogs_Queue:
def __init__(self):
self.queue = []
self.some_failed = 0
+ def init(self, g):
+ self.requester_email = g.requester_email
+
def add(self, logfile, failed):
# if /dev/null, don't even bother to store it
if config.buildlogs_url == "/dev/null":
Time: %d
Requester: %s
END
-""" % (config.buildlogs_url, l['name'], config.builder, time.time(), acl.current_user_login())
+""" % (config.buildlogs_url, l['name'], config.builder, time.time(), self.requester_email)
for l in self.queue:
f = open(path.buildlogs_queue_dir + l['id'] + ".desc", "w")
queue = Buildlogs_Queue()
+def init(r):
+ queue.init(r)
+
def add(logfile, failed):
"Add new buildlog with specified status."
queue.add(logfile, failed)
import time
import shutil
-from acl import acl
from config import config, init_conf
import mailer
import path
remaining = q[1:]
if error != None:
- users = {}
+ emails = {}
+ emails[config.admin_email] = 1
for d in remaining:
if d.has_key('Requester'):
- r = d['Requester']
- if r != "" and not users.has_key(r):
- users[r] = acl.user(r)
- e = [config.admin_email]
- for u in users.values(): e.append(u.mail_to())
+ emails[d['Requester']] = 1
+ e = emails.keys()
m = mailer.Message()
m.set_headers(to = string.join(e, ", "),
subject = "builder queue problem")
from config import config
import util
-from acl import acl
class FTP_Queue:
def __init__(self):
def init(self, g):
self.queue = []
+ self.requester_email = g.requester_email
if "test-build" in g.flags:
self.url = config.test_ftp_url
else:
def desc(l):
return "Target: %s/%s\nBuilder: %s\nTime: %d\nRequester: %s\nEND\n" % \
(self.url, l['name'], config.builder, time.time(),
- acl.current_user_login())
+ self.requester_email)
for l in self.queue:
f = open(path.ftp_queue_dir + l['id'] + ".desc", "w")
def panic(s):
log(syslog.LOG_ALERT, "PANIC: %s" % s)
- raise "PANIC: %s" % s
+ raise "PANIC: %s" % str(s)
def alert(s):
log(syslog.LOG_ALERT, "alert: %s" % s)
def set_std_headers(self):
self.headers["Date"] = time.asctime()
- self.headers["Message-ID"] = "<pld-builder.%d.%d@%s>" \
+ self.headers["Message-ID"] = "<pld-builder.%f.%d@%s>" \
% (time.time(), os.getpid(), os.uname()[1])
self.headers["From"] = "PLD %s builder <%s>" \
% (config.builder, config.email)
import ftp
import stopwatch
-from acl import acl
+import mailer
def unpackaged_files(b):
msg = "warning: Installed (but unpackaged) file(s) found:\n"
if s_ok != []:
subject += " OK: " + string.join(names(s_ok))
- m = acl.user(r.requester).message_to()
- m.set_headers(subject = subject[0:100])
+ m = mailer.Message()
+ m.set_headers(to = r.requester_email,
+ subject = subject[0:100])
for b in r.batches:
if b.build_failed and b.logfile == None:
import util
import log
+from acl import acl
__all__ = ['parse_request', 'parse_requests']
def text(e):
- if len(e.childNodes) == 0:
- return ""
- elif len(e.childNodes) == 1:
- n = e.childNodes[0]
+ res = ""
+ for n in e.childNodes:
if n.nodeType != Element.TEXT_NODE:
- raise "xml: text expected: <%s>" % e.nodeName
- return n.nodeValue
- else:
- raise "xml: text expected: <%s>" % e.nodeName
+ log.panic("xml: text expected in <%s>, got %d" % (e.nodeName, n.nodeType))
+ res += n.nodeValue
+ return res
def attr(e, a, default = None):
try:
self.priority = 2
self.time = time.time()
self.requester = ""
+ self.requester_email = ""
self.flags = string.split(attr(e, "flags", ""))
for c in e.childNodes:
if is_blank(c): continue
if c.nodeType != Element.ELEMENT_NODE:
- raise "xml: evil group child %d" % c.nodeType
+ log.panic("xml: evil group child %d" % c.nodeType)
if c.nodeName == "batch":
self.batches.append(Batch(c))
elif c.nodeName == "requester":
self.requester = text(c)
+ self.requester_email = attr(c, "email", "")
elif c.nodeName == "priority":
self.priority = int(text(c))
elif c.nodeName == "time":
self.time = int(text(c))
else:
- raise "xml: evil group child (%s)" % c.nodeName
+ log.panic("xml: evil group child (%s)" % c.nodeName)
# note that we also check that group is sorted WRT deps
m = {}
for b in self.batches:
if id(m[dep]) != id(b):
deps.append(m[dep])
else:
- raise "xml: dependency not found in group"
+ log.panic("xml: dependency not found in group")
b.depends_on = deps
+ if self.requester_email == "" and self.requester != "":
+ self.requester_email = acl.user(self.requester).mail_to()
def dump(self, f):
f.write("group: %d (id=%s pri=%d)\n" % (self.no, self.id, self.priority))
def write_to(self, f):
f.write("""
<group id="%s" no="%d" flags="%s">
- <requester>%s</requester>
+ <requester email='%s'>%s</requester>
<time>%d</time>
<priority>%d</priority>\n""" % (self.id, self.no, string.join(self.flags),
- escape(self.requester), self.time, self.priority))
+ escape(self.requester_email), escape(self.requester),
+ self.time, self.priority))
for b in self.batches:
b.write_to(f)
f.write(" </group>\n\n")
for c in e.childNodes:
if is_blank(c): continue
if c.nodeType != Element.ELEMENT_NODE:
- raise "xml: evil batch child %d" % c.nodeType
+ log.panic("xml: evil batch child %d" % c.nodeType)
if c.nodeName == "src-rpm":
self.src_rpm = text(c)
elif c.nodeName == "spec":
elif c.nodeName == "without":
self.bconds_without.append(text(c))
else:
- raise "xml: evil batch child (%s)" % c.nodeName
+ log.panic("xml: evil batch child (%s)" % c.nodeName)
def is_done(self):
ok = 1
for c in e.childNodes:
if is_blank(c): continue
if c.nodeType != Element.ELEMENT_NODE:
- raise "xml: evil notification child %d" % c.nodeType
+ log.panic("xml: evil notification child %d" % c.nodeType)
if c.nodeName == "batch":
id = attr(c, "id")
status = attr(c, "status")
if status != "OK" and status != "FAIL" and status != "SKIP":
- raise "xml notification: bad status: %s" % self.status
+ log.panic("xml notification: bad status: %s" % self.status)
self.batches[id] = status
else:
- raise "xml: evil notification child (%s)" % c.nodeName
+ log.panic("xml: evil notification child (%s)" % c.nodeName)
def apply_to(self, q):
for r in q.requests:
def build_request(e):
if e.nodeType != Element.ELEMENT_NODE:
- raise "xml: evil request element"
+ log.panic("xml: evil request element")
if e.nodeName == "group":
return Group(e)
elif e.nodeName == "notification":
# FIXME
return Command(e)
else:
- raise "xml: evil request <%s>" % e.nodeName
+ log.panic("xml: evil request <%s>" % e.nodeName)
def parse_request(f):
d = parse(f)
return
r.requester = user.get_login()
+ r.requester_email = user.mail_to()
r.time = time.time()
log.notice("queued %s from %s" % (r.id, user.get_login()))
q = B_Queue(path.queue_file)
from config import config, init_conf
from bqueue import B_Queue
-from acl import acl
import lock
import util
import loop
import log
import chroot
import ftp
+import buildlogs
import notify
import build
import report
def handle_request(r):
ftp.init(r)
+ buildlogs.init(r)
build.build_all(r, build_rpm)
report.send_report(r)
ftp.flush()
import loop
import chroot
import ftp
+import buildlogs
import status
import build
import report
-from acl import acl
from lock import lock
from bqueue import B_Queue
from config import config, init_conf
os.mkdir(path.srpms_dir + r.id)
os.chmod(path.srpms_dir + r.id, 0755)
ftp.init(r)
+ buildlogs.init(r)
build.build_all(r, build_srpm)
report.send_report(r)
store_binary_request(r)
[all]
# builder email (in From:)
email = builder@nowhere
-admin_email = malekith@roke.freak
+admin_email = bldadm@roke.freak
# list of binary builders
binary_builders = roke-athlon roke-i686
# the only src builder
This should be class in requester.py, with kind='command', also look for
kind checking elsewhere in the code (grep for 'kind.*group')
-- store requester email in request, after checking priviliges, so rpm_builder
- need not have all users in his acl.conf, only srpm_builder user, with priv
- to sign queue.
-
- make default configs reasonable
- fix make-request.sh to be more user-friendly and configurable