X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fshow_deferred.py;h=57e9c8a3780d443cf49b7ecd235487ffcefc36be;hb=0d69fff35ef45fda573467873ae2f01ca1954650;hp=dd1a748f7b1946c72f4f6322426eeee062820b00;hpb=36fbf4c5be9b0770e1cbb5d4a1aa6ce633d60df2;p=dak.git diff --git a/dak/show_deferred.py b/dak/show_deferred.py index dd1a748f..57e9c8a3 100755 --- a/dak/show_deferred.py +++ b/dak/show_deferred.py @@ -22,15 +22,12 @@ import sys, os, re, time import apt_pkg +import rrdtool -try: - # starting with squeeze - from debian import deb822 -except: - # up to lenny - from debian_bundle import deb822 +from debian import deb822 from daklib.dbconn import * +from daklib.gpg import SignedFile from daklib import utils from daklib.regexes import re_html_escaping, html_escaping @@ -56,32 +53,32 @@ def header(): Deferred uploads to Debian - +
- - - - Debian Project + + + + Debian Project

- Deferred uploads to Debian -
- -
@@ -90,14 +87,8 @@ def header(): def footer(): res = "

Timestamp: %s (UTC)

" % (time.strftime("%d.%m.%Y / %H:%M:%S", time.gmtime())) res += "

There are graphs about the queues available.

" - res += """ - Valid HTML 4.01! - - Valid CSS! - """ res += "" - return res + return res.encode('utf-8') def table_header(): return """

Deferred uploads

@@ -113,17 +104,71 @@ def table_header(): def table_footer(): return '

non-NEW uploads are available, see the UploadQueue-README for more information.


\n' -def table_row(changesname, delay, changed_by, closes): +def table_row(changesname, delay, changed_by, closes, fingerprint): global row_number res = ''%((row_number%2) and 'odd' or 'even') - res += (3*'%s')%tuple(map(html_escape,(changesname,delay,changed_by))) + res += (2*'%s')%tuple(map(html_escape,(changesname,delay))) + res += '%s
Fingerprint: %s' % (html_escape(changed_by), fingerprint) res += ('%s' % - ''.join(map(lambda close: '#%s
' % (close, close),closes))) + ''.join(map(lambda close: '#%s
' % (close, close),closes))) res += '\n' row_number+=1 return res +def update_graph_database(rrd_dir, *counts): + if not rrd_dir: + return + + rrd_file = os.path.join(rrd_dir, 'deferred.rrd') + counts = [str(count) for count in counts] + update = [rrd_file, "N:"+":".join(counts)] + + try: + rrdtool.update(*update) + except rrdtool.error: + create = [rrd_file]+""" +--step +300 +--start +0 +DS:day0:GAUGE:7200:0:1000 +DS:day1:GAUGE:7200:0:1000 +DS:day2:GAUGE:7200:0:1000 +DS:day3:GAUGE:7200:0:1000 +DS:day4:GAUGE:7200:0:1000 +DS:day5:GAUGE:7200:0:1000 +DS:day6:GAUGE:7200:0:1000 +DS:day7:GAUGE:7200:0:1000 +DS:day8:GAUGE:7200:0:1000 +DS:day9:GAUGE:7200:0:1000 +DS:day10:GAUGE:7200:0:1000 +DS:day11:GAUGE:7200:0:1000 +DS:day12:GAUGE:7200:0:1000 +DS:day13:GAUGE:7200:0:1000 +DS:day14:GAUGE:7200:0:1000 +DS:day15:GAUGE:7200:0:1000 +RRA:AVERAGE:0.5:1:599 +RRA:AVERAGE:0.5:6:700 +RRA:AVERAGE:0.5:24:775 +RRA:AVERAGE:0.5:288:795 +RRA:MIN:0.5:1:600 +RRA:MIN:0.5:6:700 +RRA:MIN:0.5:24:775 +RRA:MIN:0.5:288:795 +RRA:MAX:0.5:1:600 +RRA:MAX:0.5:6:700 +RRA:MAX:0.5:24:775 +RRA:MAX:0.5:288:795 +""".strip().split("\n") + try: + rc = rrdtool.create(*create) + ru = rrdtool.update(*update) + except rrdtool.error as e: + print('warning: queue_report: rrdtool error, skipping %s.rrd: %s' % (type, e)) + except NameError: + pass + def get_upload_data(changesfn): achanges = deb822.Changes(file(changesfn)) changesname = os.path.basename(changesfn) @@ -134,10 +179,13 @@ def get_upload_data(changesfn): remainingtime = (delaydays>0)*max(0,24*60*60+os.stat(changesfn).st_mtime-time.time()) delay = "%d days %02d:%02d" %(max(delaydays-1,0), int(remainingtime/3600),int(remainingtime/60)%60) else: + delaydays = 0 remainingtime = 0 uploader = achanges.get('changed-by') uploader = re.sub(r'^\s*(\S.*)\s+<.*>',r'\1',uploader) + with utils.open_file(changesfn) as f: + fingerprint = SignedFile(f.read(), keyrings=get_active_keyring_paths(), require_signature=False).fingerprint if Cnf.has_key("Show-Deferred::LinkPath"): isnew = 0 suites = get_suites_source_in(achanges['source']) @@ -159,17 +207,17 @@ def get_upload_data(changesfn): os.unlink(lfn) if os.path.exists(qfn): os.symlink(qfn,lfn) - os.chmod(qfn, 0644) - return (max(delaydays-1,0)*24*60*60+remainingtime, changesname, delay, uploader, achanges.get('closes','').split(),achanges) + os.chmod(qfn, 0o644) + return (max(delaydays-1,0)*24*60*60+remainingtime, changesname, delay, uploader, achanges.get('closes','').split(), fingerprint, achanges, delaydays) -def list_uploads(filelist): +def list_uploads(filelist, rrd_dir): uploads = map(get_upload_data, filelist) uploads.sort() # print the summary page print header() if uploads: print table_header() - print ''.join(map(lambda x: table_row(*x[1:5]), uploads)) + print ''.join(map(lambda x: table_row(*x[1:6]), uploads)).encode('utf-8') print table_footer() else: print '

Currently no deferred uploads to Debian

' @@ -179,18 +227,23 @@ def list_uploads(filelist): fn = os.path.join(Cnf["Show-Deferred::LinkPath"],'.status.tmp') f = open(fn,"w") try: + counts = [0]*16 for u in uploads: + counts[u[7]] += 1 print >> f, "Changes-file: %s"%u[1] fields = """Location: DEFERRED Delayed-Until: %s -Delay-Remaining: %s"""%(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time()+u[0])),u[2]) +Delay-Remaining: %s +Fingerprint: %s"""%(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time()+u[0])),u[2], u[5]) print >> f, fields - print >> f, str(u[5]).rstrip() - open(os.path.join(Cnf["Show-Deferred::LinkPath"],u[1]),"w").write(str(u[5])+fields+'\n') + encoded = unicode(u[6]).encode('utf-8') + print >> f, encoded.rstrip() + open(os.path.join(Cnf["Show-Deferred::LinkPath"],u[1]),"w").write(encoded+fields+'\n') print >> f f.close() os.rename(os.path.join(Cnf["Show-Deferred::LinkPath"],'.status.tmp'), os.path.join(Cnf["Show-Deferred::LinkPath"],'status')) + update_graph_database(rrd_dir, *counts) except: os.unlink(fn) raise @@ -204,6 +257,7 @@ def usage (exit_code=0): -h, --help show this help and exit. -p, --link-path [path] override output directory. -d, --deferred-queue [path] path to the deferred queue + -r, --rrd=key Directory where rrd files to be updated are stored """ sys.exit(exit_code) @@ -212,8 +266,9 @@ def init(): Cnf = utils.get_conf() Arguments = [('h',"help","Show-Deferred::Options::Help"), ("p","link-path","Show-Deferred::LinkPath","HasArg"), - ("d","deferred-queue","Show-Deferred::DeferredQueue","HasArg")] - args = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv) + ("d","deferred-queue","Show-Deferred::DeferredQueue","HasArg"), + ('r',"rrd","Show-Deferred::Options::Rrd", "HasArg")] + args = apt_pkg.parse_commandline(Cnf,Arguments,sys.argv) for i in ["help"]: if not Cnf.has_key("Show-Deferred::Options::%s" % (i)): Cnf["Show-Deferred::Options::%s" % (i)] = "" @@ -222,7 +277,7 @@ def init(): print >> sys.stderr, """Show-Deferred::%s is mandatory. set via config file or command-line option %s"""%(i,j) - Options = Cnf.SubTree("Show-Deferred::Options") + Options = Cnf.subtree("Show-Deferred::Options") if Options["help"]: usage() @@ -236,11 +291,18 @@ def main(): if len(args)!=0: usage(1) + if Cnf.has_key("Show-Deferred::Options::Rrd"): + rrd_dir = Cnf["Show-Deferred::Options::Rrd"] + elif Cnf.has_key("Dir::Rrd"): + rrd_dir = Cnf["Dir::Rrd"] + else: + rrd_dir = None + filelist = [] for r,d,f in os.walk(Cnf["Show-Deferred::DeferredQueue"]): filelist += map (lambda x: os.path.join(r,x), filter(lambda x: x.endswith('.changes'), f)) - list_uploads(filelist) + list_uploads(filelist, rrd_dir) available_changes = set(map(os.path.basename,filelist)) if Cnf.has_key("Show-Deferred::LinkPath"): @@ -251,3 +313,6 @@ def main(): if (not os.path.exists(afp) or (af.endswith('.changes') and af not in available_changes)): os.unlink(afp) + +if __name__ == '__main__': + main()