Package: ftpmaster.debian.org
Severity: wishlist
Tags: patch

Hi,

Attached is a patch submit .buildinfo files to buildinfo.debian.net,
our experimental system for centrally storing .buildinfo files for
analysis, retrieval, etc.  We almost have 2,000,000 files there.

This patch supplements the existing filesystem archiving and simply
performs a POST on the .buildinfo file itself.

As a deployment note, this will actually mean that — right now — most
.buildinfo files will be rejected by buildinfo.debian.net as it only
accepts signed .buildinfo files. However, we intend to fix that
separately via #862059 ("sbuild: please sign buildinfo files").

Also note that this patch enables this for the main archive only.
Please clarify whether I should enable this for the security archive
too; I would not want it to leak the fact we have rebuilt a package
there if itwere embargoed, etc.


  commit a85df018d210c054e7ae0b5a6fe037a537b62e7a
  Author: Chris Lamb <la...@debian.org>
  Date:   Mon May 8 01:06:03 2017 +0200
  
      Upload buildinfo files to buildinfo.debian.net.
      
      Signed-off-by: Chris Lamb <la...@debian.org>
  
   config/debian/dak.conf |  5 +++++
   dak/process_upload.py  | 52 
++++++++++++++++++++++++++++++++++++++++++++++++--
   2 files changed, 55 insertions(+), 2 deletions(-)


Alternatively you can merge from the:

  upload-buildinfo-files-to-buildinfo-debian-net

branch on <https://github.com/lamby/dak.git>.


Regards,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      la...@debian.org / chris-lamb.co.uk
       `-
>From a85df018d210c054e7ae0b5a6fe037a537b62e7a Mon Sep 17 00:00:00 2001
From: Chris Lamb <la...@debian.org>
Date: Mon, 8 May 2017 01:06:03 +0200
Subject: [PATCH] Upload buildinfo files to buildinfo.debian.net.

Signed-off-by: Chris Lamb <la...@debian.org>
---
 config/debian/dak.conf |  5 +++++
 dak/process_upload.py  | 52 ++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/config/debian/dak.conf b/config/debian/dak.conf
index 4fa828e56..ad71e4ded 100644
--- a/config/debian/dak.conf
+++ b/config/debian/dak.conf
@@ -119,6 +119,11 @@ Process-New
   LockDir "/srv/ftp-master.debian.org/lock/new/";
 };
 
+BuildinfoService
+{
+  "https://buildinfo.debian.net/api/submit";;
+}
+
 SuiteMappings
 {
  "silent-map squeeze-security oldoldstable-security";
diff --git a/dak/process_upload.py b/dak/process_upload.py
index 51104523f..98fdde4d9 100755
--- a/dak/process_upload.py
+++ b/dak/process_upload.py
@@ -168,6 +168,7 @@ import sys
 import traceback
 import apt_pkg
 import time
+import urllib2
 from sqlalchemy.orm.exc import NoResultFound
 
 from daklib import daklog
@@ -263,7 +264,8 @@ def accept(directory, upload):
     print "ACCEPT"
 
     upload.install()
-    process_buildinfos(upload)
+    archive_buildinfos(upload)
+    upload_buildinfos(upload)
 
     accepted_to_real_suite = False
     for suite in upload.final_suites:
@@ -494,7 +496,12 @@ def process_changes(changes_filenames):
     for directory, c in changes:
         process_it(directory, c, keyring_files)
 
-def process_buildinfos(upload):
+def archive_buildinfos(upload):
+    """
+    Archive .buildinfo files locally on the filesystem at
+    ``Dir::BuildinfoArchive``.
+    """
+
     cnf = Config()
 
     if not cnf.has_key('Dir::BuildinfoArchive'):
@@ -515,6 +522,47 @@ def process_buildinfos(upload):
         Logger.log(["Archiving", x.filename])
         upload.transaction.fs.copy(src, dst, mode=0o644)
 
+def upload_buildinfos(upload):
+    """
+    Upload .buildinfo files to the service(s) specified in
+    ``BuildinfoService``. The data is sent as raw HTTP POST data.
+    """
+
+    cnf = Config()
+
+    try:
+        urls = cnf.value_list('BuildinfoService')
+    except KeyError:
+        return
+
+    for x in upload.changes.files.itervalues():
+        if not re_file_buildinfo.match(x.filename):
+            continue
+
+        with open(os.path.join(upload.directory, x.filename)) as f:
+            data = f.read()
+
+        opener = urllib2.build_opener(urllib2.HTTPHandler)
+
+        for url in urls:
+            Logger.log(["Uploading", x.filename, "to", url])
+
+            request = urllib2.Request(url, data, {
+                'Content-Type': 'application/octet-stream',
+            })
+            request.get_method = lambda: 'PUT'
+
+            try:
+                res = urllib2.urlopen(request, timeout=10)
+            except urllib2.HTTPError as e:
+                Logger.log(['HTTP {}: {}'.format(e.code, e.read().strip())])
+                continue
+            except Exception:
+                Logger.log(['Exception:', traceback.format_exc()])
+                continue
+
+            Logger.log(['HTTP {}: {}'.format(res.code, res.read().strip())])
+
 ###############################################################################
 
 def main():
-- 
2.11.0

Reply via email to