[Secure-testing-commits] r1947 - / bin data data/packages lib/python

Florian Weimer fw at costa.debian.org
Tue Sep 13 09:12:20 UTC 2005


Author: fw
Date: 2005-09-13 09:12:19 +0000 (Tue, 13 Sep 2005)
New Revision: 1947

Added:
   bin/update-packages
   data/packages/
Modified:
   Makefile
   lib/python/security_db.py
Log:
Add support for downloading Packages and Sources files.

After this change, you must run "make clean update-packages all" to
download the package data.

lib/python/security_db.py(DB.initSchema):
  Add table inodeprints.
(DB.filePrint, DB._maybeUpdate, DB.maybeUpdateSources,
DB.maybeUpdatePackages):
  Add.
(test):
  Update to new file locations.

bin/update-packages:
  New file.  Used by the makefile.

data/packages:
  New directory.  Used to store the downloaded files.

Makefile:
  Add "update-packages" and "clean" targets, and the necessary targets
  to support them.


Modified: Makefile
===================================================================
--- Makefile	2005-09-13 09:03:54 UTC (rev 1946)
+++ Makefile	2005-09-13 09:12:19 UTC (rev 1947)
@@ -2,13 +2,38 @@
 PYTHON_MODULES = $(wildcard lib/python/*.py)
 BUG_LISTS = $(wildcard data/*/list)
 
-all: stamps/bug-lists-imported
+# Adjust these if necessary.  The architecture selection is arther
+# arbitrary at the moment.  More architectures can be added later.
 
+MIRROR = http://merkel.debian.org/~aba/debian/
+RELEASES_with_proposed_updates = sarge=i386,ia64 etch=i386,ia64
+RELEASES = sid=i386,ia64 $(RELEASES_with_proposed_updates) \
+	$(subst =,-proposed-updates=, $(RELEASES_with_proposed_updates))
+SECURITY_RELEASES = sarge-security=i386,ia64
+PACKAGE_FILES = $(wildcard data/packages/*_Sources) \
+	$(wildcard data/packages/*_Packages)
+
+all: stamps/bug-lists-imported stamps/packages-imported
+
 stamps/bug-lists-imported: bin/update-bug-list-db \
 	$(BUG_LISTS) $(PYTHON_MODULES)
 	$(PYTHON) bin/update-bug-list-db
 	touch $@
 
+# No dependencies on the Python files.  This part of the code should
+# be quite stable.  We only run the packages import if "make
+# update-packages" has been invoked before.
+stamps/packages-imported: $(PACKAGE_FILES)
+	if test -e stamps/packages-downloaded ; then \
+		$(PYTHON) bin/update-packages import \
+			$(RELEASES) $(SECURITY_RELEASES) ; \
+	fi
+	touch $@
+
+clean:
+	-rm data/security.db
+	-rm stamps/*-*
+
 .PHONY: check check-syntax
 
 test check: check-syntax
@@ -31,3 +56,10 @@
 stamps/DTSA-syntax: data/DTSA/list bin/check-syntax $(PYTHON_MODULES)
 	$(PYTHON) bin/check-syntax DTSA data/DTSA/list
 	touch $@
+
+.PHONY: update-packages
+update-packages:
+	$(PYTHON) bin/update-packages download $(MIRROR) $(RELEASES)
+	$(PYTHON) bin/update-packages download \
+		http://security.debian.org/ $(SECURITY_RELEASES)
+	touch stamps/packages-downloaded

Added: bin/update-packages
===================================================================
--- bin/update-packages	2005-09-13 09:03:54 UTC (rev 1946)
+++ bin/update-packages	2005-09-13 09:12:19 UTC (rev 1947)
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+
+# This script download and imports Debian package files.
+
+import errno
+import os
+import os.path
+import string
+import sys
+
+def setup_paths():
+    check_file = 'lib/python/debian_support.py'
+    path = os.getcwd()
+    while 1:
+        if os.path.exists("%s/%s" % (path, check_file)):
+            sys.path = [path + '/lib/python'] + sys.path
+            return path
+        idx = string.rfind(path, '/')
+        if idx == -1:
+            raise ImportError, "could not setup paths"
+        path = path[0:idx]
+root_path = setup_paths()
+
+import debian_support
+import security_db
+
+def explodeReleases(args):
+    for arg in args:
+        (release, archs) = arg.split('=')
+        # FIXME: What shall we do with these?
+        # if debian_support.internRelease(release) is None:
+        #     sys.stderr.write("error: unknown release: %s\n" % release)
+        #     sys.exit(1)
+        yield release, archs.split(',')
+
+archives = ('main', 'contrib', 'non-free')
+
+def nameSources(release, archive):
+    return '%s/data/packages/%s_%s_Sources' % (root_path, release, archive)
+
+def namePackages(release, archive, arch):
+    return '%s/data/packages/%s_%s_%s_Packages' % (root_path, release,
+                                                   archive, arch)
+
+def cmd_download(args):
+    url_base = args[0]
+    if url_base[-1] != '/':
+        url_base += '/'
+        
+    for release, archs in explodeReleases(args[1:]):
+        # Security updates are stored in a different directory.
+        if release[-9:] == '-security':
+            rrel = release[:-9] + '/updates'
+        else:
+            rrel = release
+
+        for archive in archives:
+            print "Updating source package %s/%s" % (release, archive)
+            debian_support.updateFile("%sdists/%s/%s/source/Sources"
+                                      % (url_base, rrel, archive),
+                                      nameSources(release, archive),
+                                      verbose=True)
+            for arch in archs:
+                print "Updating binary package %s/%s/%s" \
+                                      % (release, archive, arch)
+                debian_support.updateFile("%sdists/%s/%s/binary-%s/Packages"
+                                          % (url_base, rrel, archive, arch),
+                                          namePackages(release, archive, arch),
+                                          verbose=True)
+
+def cmd_import(args):
+    db_file = root_path + '/data/security.db'
+    db = security_db.DB(db_file)
+    try:
+        for release, archs in explodeReleases(args):
+            for archive in archives:
+                c = db.writeTxn()
+                db.maybeUpdateSources(c, release, archive,
+                                      nameSources(release, archive))
+                db.commit(c)
+                for arch in archs:
+                    c = db.writeTxn()
+                    db.maybeUpdatePackages(c, release, archive, arch,
+                                           namePackages(release,
+                                                        archive, arch))
+                    db.commit(c)
+    except IOError, e:
+        if e.errno == errno.ENOENT:
+            sys.stderr.write(
+"""error: could not open a file
+error: please run 'update-packages download' first
+""")
+            sys.exit(1)
+
+cmds = {"download" : cmd_download,
+        "import" : cmd_import}
+
+if len(sys.argv) < 3 or not cmds.has_key(sys.argv[1]):
+    sys.stderr.write(\
+"""usage: update-packages download URL-BASE RELEASE=ARCH...
+       update-packages import RELEASE=ARCH...
+""")
+    sys.exit(1)
+try:
+    cmds[sys.argv[1]](sys.argv[2:])
+except debian_support.ParseError, e:
+    e.printOut(sys.stderr)
+    sys.exit(1)
+


Property changes on: bin/update-packages
___________________________________________________________________
Name: svn:executable
   + *


Property changes on: data/packages
___________________________________________________________________
Name: svn:ignore
   + *_Sources
*_Packages


Modified: lib/python/security_db.py
===================================================================
--- lib/python/security_db.py	2005-09-13 09:03:54 UTC (rev 1946)
+++ lib/python/security_db.py	2005-09-13 09:12:19 UTC (rev 1947)
@@ -29,6 +29,7 @@
 import apsw
 import bugs
 import debian_support
+import os
 import re
 import sys
 import types
@@ -91,6 +92,10 @@
         """Creates the database schema."""
         cursor = self.cursor()
 
+        cursor.execute("""CREATE TABLE inodeprints
+        (file TEXT NOT NULL PRIMARY KEY,
+         inodeprint TEXT NOT NULL)""")
+
         cursor.execute("""CREATE TABLE source_packages
         (package TEXT NOT NULL,
          release TEXT NOT NULL, archive TEXT NOT NULL,
@@ -178,7 +183,6 @@
                            + 'VALUES (?, ?, ?, ?)',
                            (pkg_name, release, archive, str(pkg_version)))
 
-            
     def updatePackages(self, cursor,
                        release, archive, architecture,
                        packages):
@@ -240,6 +244,49 @@
                             str(pkg_version),
                             pkg_source, str(pkg_source_version)))
 
+    def filePrint(self, filename):
+        """Returns a fingerprint string for filename."""
+
+        st = os.stat(filename)
+        # The "1" is a version number which can be used to trigger a
+        # re-read if the code has changed in an incompatible way.
+        return `(st.st_size, st.st_ino, st.st_mtime, 1)`
+
+    def _maybeUpdate(self, cursor, args, filename, action):
+        """Internal routine used for conditional update."""
+        
+        current_print = self.filePrint(filename)
+
+        for (old_print,) in cursor.execute\
+           ("SELECT inodeprint FROM inodeprints WHERE file = ?", (filename,)):
+            if old_print == current_print:
+                return
+            result = apply(action, (cursor,) + args
+                           + (debian_support.PackageFile(filename),))
+            cursor.execute("""UPDATE inodeprints SET inodeprint = ?
+            WHERE file = ?""", (current_print, filename))
+            return result
+
+        # No inodeprints entry, load file and add one.
+        result = apply(action, (cursor,) + args
+                       + (debian_support.PackageFile(filename),))
+        cursor.execute("""INSERT INTO inodeprints (file, inodeprint)
+        VALUES (?, ?)""", (filename, current_print))
+        return result
+        
+    
+    def maybeUpdateSources(self, cursor, release, archive, filename):
+        """Reads the Sources file filename if it has been modified."""
+        
+        self._maybeUpdate(cursor, (release, archive), filename,
+                          self.updateSources)
+
+    def maybeUpdatePackages(self, cursor, release, archive, arch, filename):
+        """Reads the Packages file filename if it has been modified."""
+        
+        self._maybeUpdate(cursor, (release, archive, arch), filename,
+                          self.updatePackages)
+
     def deleteBugs(self, cursor):
         """Deletes all record bug reports from the database."""
         cursor.execute("DELETE FROM package_notes")
@@ -383,23 +430,19 @@
 def test():
     import os
 
-    os.unlink('test_security.db')
+    if os.path.exists('test_security.db'):
+        os.unlink('test_security.db')
     db = DB('test_security.db')
     db.initSchema()
 
-    data_prefix = '../../data/packages/sarge/'
-    if False:
-        cursor = db.writeTxn()
-        db.updateSources(cursor, 'sarge', '',
-                debian_support.PackageFile(data_prefix + 'Sources'))
-        db.updateSources(cursor, 'sarge', 'security',
-                debian_support.PackageFile(data_prefix + 'Sources.security'))
-        db.updatePackages(cursor, 'sarge', '', 'i386',
-                debian_support.PackageFile(data_prefix + 'Packages.i386'))
-        db.updatePackages(cursor, 'sarge', 'security', 'i386',
-                debian_support.PackageFile(data_prefix
-                                           + 'Packages.security-i386'))
-        db.commit(cursor)
+    data_prefix = '../../data/packages/'
+    cursor = db.writeTxn()
+    db.updateSources(cursor, 'sarge', 'main',
+            debian_support.PackageFile(data_prefix + 'sarge_main_Sources'))
+    db.updatePackages(cursor, 'sarge', 'main', 'i386',
+            debian_support.PackageFile(data_prefix
+                                       + 'sarge_main_i386_Packages'))
+    db.commit(cursor)
 
     # db.check(cursor)
 




More information about the Secure-testing-commits mailing list