]> git.decadent.org.uk Git - dak.git/commitdiff
Initial revision
authorJames Troup <james@nocrew.org>
Fri, 24 Nov 2000 00:20:11 +0000 (00:20 +0000)
committerJames Troup <james@nocrew.org>
Fri, 24 Nov 2000 00:20:11 +0000 (00:20 +0000)
30 files changed:
README [new file with mode: 0644]
THANKS [new file with mode: 0644]
add_constraints.sql [new file with mode: 0644]
apt.conf-non-US [new file with mode: 0644]
catherine [new file with mode: 0755]
charisma [new file with mode: 0755]
contrib/fix.1 [new file with mode: 0755]
contrib/fix.2 [new file with mode: 0755]
contrib/fix.3 [new file with mode: 0755]
contrib/fix.4 [new file with mode: 0755]
contrib/fix.6 [new file with mode: 0755]
contrib/fix.7 [new file with mode: 0755]
contrib/fix.8 [new file with mode: 0755]
copyoverrides [new file with mode: 0755]
cron.daily [new file with mode: 0755]
cron.daily-non-US [new file with mode: 0755]
debian/changelog [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/postinst [new file with mode: 0644]
debian/rules [new file with mode: 0755]
heidi [new file with mode: 0755]
jenna [new file with mode: 0755]
katie.conf [new file with mode: 0644]
katie.conf-non-US [new file with mode: 0644]
mkchecksums [new file with mode: 0755]
mklslar [new file with mode: 0755]
sortover.pl [new file with mode: 0755]
tagdb.dia [new file with mode: 0644]
vars-non-US [new file with mode: 0644]

diff --git a/README b/README
new file mode 100644 (file)
index 0000000..3ffe41b
--- /dev/null
+++ b/README
@@ -0,0 +1,25 @@
+This is the README file for da-katie version -1.
+
+da-katie is the collection of programs used to maintain the Debian GNU
+project archive.
+
+See TODO for an incomplete list of things needing to be done.
+
+See the file NEWS for user-visible changes since the last version.
+
+See the file INSTALL for installation instructions.
+
+da-katie is used on the following platforms :-
+
+Linux/i386 2.2
+Linux/UltraSparc 2.2
+
+da-katie is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, a copy of
+which is provided under the name COPYING, or (at your option) any
+later version.
+
+-- 
+James Troup <james@nocrew.org>, Oldenburg, Germany
+Thu, 12 Oct 2000 12:45:16 +0100
diff --git a/THANKS b/THANKS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/add_constraints.sql b/add_constraints.sql
new file mode 100644 (file)
index 0000000..a23951f
--- /dev/null
@@ -0,0 +1,106 @@
+-- Fix up after population off the database...
+
+-- First of all readd the constraints (takes ~1:30 on auric)
+
+ALTER TABLE files ADD CONSTRAINT files_location FOREIGN KEY (location) REFERENCES location(id) MATCH FULL;
+
+ALTER TABLE source ADD CONSTRAINT source_maintainer FOREIGN KEY (maintainer) REFERENCES maintainer(id) MATCH FULL;
+ALTER TABLE source ADD CONSTRAINT source_file FOREIGN KEY (file) REFERENCES files(id) MATCH FULL;
+
+ALTER TABLE dsc_files ADD CONSTRAINT dsc_files_source FOREIGN KEY (source) REFERENCES source(id) MATCH FULL;
+ALTER TABLE dsc_files ADD CONSTRAINT dsc_files_file FOREIGN KEY (file) REFERENCES files(id) MATCH FULL;
+
+ALTER TABLE binaries ADD CONSTRAINT binaries_maintainer FOREIGN KEY (maintainer) REFERENCES maintainer(id) MATCH FULL;
+ALTER TABLE binaries ADD CONSTRAINT binaries_source FOREIGN KEY (source) REFERENCES source(id) MATCH FULL;
+ALTER TABLE binaries ADD CONSTRAINT binaries_architecture FOREIGN KEY (architecture) REFERENCES architecture(id) MATCH FULL;
+ALTER TABLE binaries ADD CONSTRAINT binaries_file FOREIGN KEY (file) REFERENCES files(id) MATCH FULL;
+
+ALTER TABLE suite_architectures ADD CONSTRAINT suite_architectures_suite FOREIGN KEY (suite) REFERENCES suite(id) MATCH FULL;
+ALTER TABLE suite_architectures ADD CONSTRAINT suite_architectures_architecture FOREIGN KEY (architecture) REFERENCES architecture(id) MATCH FULL;
+
+ALTER TABLE bin_associations ADD CONSTRAINT bin_associations_suite FOREIGN KEY (suite) REFERENCES suite(id) MATCH FULL;
+ALTER TABLE bin_associations ADD CONSTRAINT bin_associations_bin FOREIGN KEY (bin) REFERENCES binaries(id) MATCH FULL;
+  
+ALTER TABLE src_associations ADD CONSTRAINT src_associations_suite FOREIGN KEY (suite) REFERENCES suite(id) MATCH FULL;
+ALTER TABLE src_associations ADD CONSTRAINT src_associations_source FOREIGN KEY (source) REFERENCES source(id) MATCH FULL;
+
+-- Then correct all the id SERIAL PRIMARY KEY columns...
+
+CREATE FUNCTION files_id_max() RETURNS INT4
+    AS 'SELECT max(id) FROM files' 
+    LANGUAGE 'sql';
+CREATE FUNCTION source_id_max() RETURNS INT4
+    AS 'SELECT max(id) FROM source' 
+    LANGUAGE 'sql';
+CREATE FUNCTION src_associations_id_max() RETURNS INT4
+    AS 'SELECT max(id) FROM src_associations' 
+    LANGUAGE 'sql';
+CREATE FUNCTION dsc_files_id_max() RETURNS INT4
+    AS 'SELECT max(id) FROM dsc_files' 
+    LANGUAGE 'sql';
+CREATE FUNCTION binaries_id_max() RETURNS INT4
+    AS 'SELECT max(id) FROM binaries' 
+    LANGUAGE 'sql';
+CREATE FUNCTION bin_associations_id_max() RETURNS INT4
+    AS 'SELECT max(id) FROM bin_associations' 
+    LANGUAGE 'sql';
+
+SELECT setval('files_id_seq', files_id_max());
+SELECT setval('source_id_seq', source_id_max());
+SELECT setval('src_associations_id_seq', src_associations_id_max());
+SELECT setval('dsc_files_id_seq', dsc_files_id_max());
+SELECT setval('binaries_id_seq', binaries_id_max());
+SELECT setval('bin_associations_id_seq', bin_associations_id_max());
+
+-- Vacuum the tables for efficency
+
+VACUUM archive;
+VACUUM component;
+VACUUM architecture;
+VACUUM maintainer;
+VACUUM location;
+VACUUM files;
+VACUUM source;
+VACUUM dsc_files;
+VACUUM binaries;
+VACUUM suite;
+VACUUM suite_architectures;
+VACUUM bin_associations;
+VACUUM src_associations;
+
+-- FIXME: has to be a better way to do this
+GRANT ALL ON 
+  architecture, architecture_id_seq, archive, archive_id_seq,
+  bin_associations, bin_associations_id_seq, binaries,
+  binaries_id_seq, component, component_id_seq, dsc_files,
+  dsc_files_id_seq, files, files_id_seq, location, location_id_seq,
+  maintainer, maintainer_id_seq, source, source_id_seq,
+  src_associations, src_associations_id_seq, suite,
+  suite_architectures, suite_id_seq
+     TO GROUP ftpmaster;
+
+-- Give write privileges to the associations tables for AJ for the purposes of `testing'
+GRANT ALL ON 
+  binaries, binaries_id_seq, 
+  bin_associations, bin_associations_id_seq,
+  source, source_id_seq, 
+  src_associations, src_associations_id_seq,
+  suite, suite_id_seq 
+     TO ajt;
+
+-- RO access to AJ for all other tables
+GRANT SELECT ON 
+  architecture, archive, binaries, component,
+  dsc_files, files, location, maintainer, source, suite, suite_architectures
+     TO ajt;
+
+-- Read only access to user 'nobody'
+GRANT SELECT ON 
+  architecture, architecture_id_seq, archive, archive_id_seq,
+  bin_associations, bin_associations_id_seq, binaries,
+  binaries_id_seq, component, component_id_seq, dsc_files,
+  dsc_files_id_seq, files, files_id_seq, location, location_id_seq,
+  maintainer, maintainer_id_seq, source, source_id_seq,
+  src_associations, src_associations_id_seq, suite,
+  suite_architectures, suite_id_seq
+     TO PUBLIC;
diff --git a/apt.conf-non-US b/apt.conf-non-US
new file mode 100644 (file)
index 0000000..ca4bfd9
--- /dev/null
@@ -0,0 +1,57 @@
+Dir 
+{
+   ArchiveDir "/org/non-us.debian.org/ftp/";
+   OverrideDir "/org/non-us.debian.org/scripts/override/";
+   CacheDir "/org/non-us.debian.org/database/";
+};
+
+Default
+{
+   Packages::Compress ". gzip";
+   Sources::Compress "gzip";
+   Contents::Compress "gzip";
+   DeLinkLimit 0;
+   MaxContentsChange 6000;
+   FileMode 0664;
+}
+
+TreeDefault
+{
+   Contents::Header "/org/non-us.debian.org/scripts/masterfiles/Contents.top";
+};
+
+tree "dists/stable/non-US"
+{
+   FileList "/org/non-us.debian.org/database/dists/stable_non-us/$(SECTION)_binary-$(ARCH).list";
+   SourceFileList "/org/non-us.debian.org/database/dists/stable_non-us/$(SECTION)_source.list";
+   Sections "main contrib non-free";
+   Architectures "alpha arm i386 m68k powerpc sparc source";
+   BinOverride "override.potato.$(SECTION)";
+   SrcOverride "override.potato.$(SECTION).src";
+   External-Links false;
+};
+
+tree "dists/unstable/non-US"
+{
+   FileList "/org/non-us.debian.org/database/dists/unstable_non-us/$(SECTION)_binary-$(ARCH).list";
+   SourceFileList "/org/non-us.debian.org/database/dists/unstable_non-us/$(SECTION)_source.list";
+   Sections "main contrib non-free";
+   Architectures "alpha arm hppa hurd-i386 i386 mips mipsel m68k powerpc sh sparc source";
+   BinOverride "override.woody.$(SECTION)";
+   SrcOverride "override.woody.$(SECTION).src";
+};
+
+bindirectory "dists/proposed-updates"
+{
+
+   FileList "/org/non-us.debian.org/database/dists/proposed-updates_-_binary.list";
+   SourceFileList "/org/non-us.debian.org/database/proposed-updates_-_source.list";
+   Packages "dists/proposed-updates/Packages";
+   Sources "dists/proposed-updates/Sources";
+   Contents "";
+
+   BinOverride "override.potato.all3";
+   BinCacheDB "packages-proposed-updates.db";
+   
+   PathPrefix "";
+};
diff --git a/catherine b/catherine
new file mode 100755 (executable)
index 0000000..573d57e
--- /dev/null
+++ b/catherine
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+
+# Poolify (move packages from "legacy" type locations to pool locations)
+# Copyright (C) 2000  James Troup <james@nocrew.org>
+# $Id: catherine,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+################################################################################
+
+import pg
+import utils
+import apt_pkg;
+
+################################################################################
+
+Cnf = None;
+projectB = None;
+
+################################################################################
+
+def main ():
+    global Cnf, projectB;
+
+    apt_pkg.init();
+    
+    Cnf = apt_pkg.newConfiguration();
+    apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file());
+
+    Arguments = [('d',"debug","Heidi::Options::Debug", "IntVal"),
+                 ('h',"help","Heidi::Options::Help"),
+                 ('v',"version","Heidi::Options::Version")];
+
+    amount = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+
+    print amount
+    
+    return
+
+    projectB = pg.connect('projectb', 'localhost');
+
+    db_access.init(Cnf, projectB);
+
+    if (Cnf["Heidi::Options::Add"] == "" and Cnf["Heidi::Options::Remove"] == "") or (Cnf["Heidi::Options::Add"] != "" and Cnf["Heidi::Options::Remove"] != ""):
+
+        sys.stderr.write("Need either --add <suite> or --remove <suite> command line argument; not neither or both.\n");
+        sys.exit(2);
+
+    for i in ("add", "remove"):
+        suite = Cnf["Heidi::Options::%s" % (i)];
+        if suite !="":
+            if not Cnf.has_key("Suite::%s" % (suite)):
+                sys.stderr.write("Unknown suite %s.\n" %(suite));
+                sys.exit(2);
+            else:
+                suite_id = db_access.get_suite_id(suite);
+                action = i;
+
+    if file_list != []:
+        for file in file_list:
+            process_file(utils.open_file(file_list[0],'r'), suite_id, action);
+    else:
+        process_file(sys.stdin, suite_id, action);
+
+    db_access.init (Cnf, projectB);
+
+#######################################################################################
+
+if __name__ == '__main__':
+    main()
+
diff --git a/charisma b/charisma
new file mode 100755 (executable)
index 0000000..1579802
--- /dev/null
+++ b/charisma
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+
+# Generate Maintainers file used by e.g. the Debian Bug Tracking System
+# Copyright (C) 2000  James Troup <james@nocrew.org>
+# $Id: charisma,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+# ``As opposed to "Linux sucks. Respect my academic authoritah, damn
+#   you!" or whatever all this hot air amounts to.''
+#                             -- ajt@ in _that_ thread on debian-devel@
+
+####################################################################################################################################
+
+import os, pg, re, string, sys
+import apt_pkg
+import utils
+
+####################################################################################################################################
+
+projectB = None
+Cnf = None
+maintainer_cache = {}
+maintainer_from_source_cache = {}
+packages = {}
+fixed_maintainer_cache = {}
+
+re_split = re.compile(r"(\S+)\s+(\S+.*)")
+
+####################################################################################################################################
+
+def fix_maintainer (maintainer):
+    global fixed_maintainer_cache;
+
+    if not fixed_maintainer_cache.has_key(maintainer):
+        fixed_maintainer_cache[maintainer] = utils.fix_maintainer(maintainer)[0]
+
+    return fixed_maintainer_cache[maintainer]
+
+def get_maintainer_from_source (source_id):
+    global maintainer_from_source_cache
+    
+    if not maintainer_from_source_cache.has_key(source_id):
+        q = projectB.query("SELECT name FROM maintainer WHERE id IN (SELECT maintainer FROM source WHERE id = %s)" % (source_id));
+        maintainer = q.getresult()[0][0]
+        maintainer_from_source_cache[source_id] = fix_maintainer(maintainer)
+        
+    return maintainer_from_source_cache[source_id]
+
+def get_maintainer (maintainer_id):
+    global maintainer_cache
+    
+    if not maintainer_cache.has_key(maintainer_id):
+        q = projectB.query("SELECT name FROM maintainer WHERE id = %s" % (maintainer_id));
+        maintainer = q.getresult()[0][0]
+        maintainer_cache[maintainer_id] = fix_maintainer(maintainer)
+        
+    return maintainer_cache[maintainer_id]
+
+####################################################################################################################################
+
+def main():
+    global Cnf, projectB;
+
+    projectB = pg.connect('projectb', 'localhost');
+
+    apt_pkg.init();
+    
+    Cnf = apt_pkg.newConfiguration();
+    apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file());
+
+    extra_files = apt_pkg.ParseCommandLine(Cnf,[],sys.argv);
+
+    for suite in Cnf.SubTree("Suite").List():
+        suite = string.lower(suite);
+        suite_priority = int(Cnf["Suite::%s::Priority" % (suite)])
+        # Binary packages
+        q = projectB.query("SELECT b.package, b.source, b.maintainer FROM bin_associations ba, binaries b, suite s WHERE s.suite_name = '%s' AND ba.suite = s.id AND ba.bin = b.id" % (suite));
+        binaries = q.getresult();
+        for binary in binaries:
+            package = binary[0]
+            source_id = binary[1]
+            # Use the source maintainer first; falling back on the binary maintainer as a last resort only
+            if source_id != 0:
+                maintainer = get_maintainer_from_source(source_id)
+            else:
+                maintainer = get_maintainer(binary[2])
+            if packages.has_key(package):
+                if packages[package]["priority"] < suite_priority:
+                    packages[package] = { "maintainer": maintainer, "priority": suite_priority }
+            else:
+                packages[package] = { "maintainer": maintainer, "priority": suite_priority }
+
+        # Source packages
+        q = projectB.query("SELECT s.source, m.name FROM src_associations sa, source s, suite su, maintainer m WHERE su.suite_name = '%s' AND sa.suite = su.id AND sa.source = s.id AND m.id = s.maintainer" % (suite))
+        sources = q.getresult();
+        for source in sources:
+            package = source[0]
+            maintainer = fix_maintainer(source[1])
+            if packages.has_key(package):
+                if packages[package]["priority"] < suite_priority:
+                    packages[package] = { "maintainer": maintainer, "priority": suite_priority }
+            else:
+                packages[package] = { "maintainer": maintainer, "priority": suite_priority }
+
+    # Process any additional Maintainer files (e.g. from non-US or pseudo packages)
+    for filename in extra_files:
+        file = utils.open_file(filename, 'r')
+        for line in file.readlines():
+            m = re_split.match(line[:-1])
+            package = m.group(1)
+            maintainer = fix_maintainer(m.group(2))
+            if not packages.has_key(package):
+                packages[package] = { "maintainer": maintainer, "priority": 0 }
+        file.close()
+    
+    package_keys = packages.keys()
+    package_keys.sort()
+    for package in package_keys:
+        print "%-20s %s" % (package, packages[package]["maintainer"])
+
+if __name__ == '__main__':
+    main()
+
diff --git a/contrib/fix.1 b/contrib/fix.1
new file mode 100755 (executable)
index 0000000..0cb2ad6
--- /dev/null
@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+
+# Populate the DB
+# Copyright (C) 2000  James Troup <james@nocrew.org>
+# $Id: fix.1,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+################################################################################
+
+# 04:36|<aj> elmo: you're making me waste 5 seconds per architecture!!!!!! YOU BASTARD!!!!!
+
+################################################################################
+
+# This code is a horrible mess for two reasons:
+
+#   (o) For Debian's usage, it's doing something like 160k INSERTs,
+#   even on auric, that makes the program unusable unless we get
+#   involed in sorts of silly optimization games (local dicts to avoid
+#   redundant SELECTS, using COPY FROM rather than INSERTS etc.)
+
+#   (o) It's very site specific, because I don't expect to use this
+#   script again in a hurry, and I don't want to spend any more time
+#   on it than absolutely necessary.
+
+###############################################################################################################
+
+import commands, os, pg, re, sys, string, tempfile
+import apt_pkg
+import db_access, utils
+
+###############################################################################################################
+
+re_arch_from_filename = re.compile(r"binary-[^/]+")
+
+###############################################################################################################
+
+Cnf = None;
+projectB = None;
+files_id_cache = {};
+source_cache = {};
+arch_all_cache = {};
+binary_cache = {};
+#
+files_id_serial = 0;
+source_id_serial = 0;
+src_associations_id_serial = 0;
+dsc_files_id_serial = 0;
+files_query_cache = None;
+source_query_cache = None;
+src_associations_query_cache = None;
+dsc_files_query_cache = None;
+orig_tar_gz_cache = {};
+#
+binaries_id_serial = 0;
+binaries_query_cache = None;
+bin_associations_id_serial = 0;
+bin_associations_query_cache = None;
+#
+source_cache_for_binaries = {};
+
+###############################################################################################################
+
+# Prepares a filename or directory (s) to be file.filename by stripping any part of the location (sub) from it.
+def poolify (s, sub):
+    for i in xrange(len(sub)):
+        if sub[i:] == s[0:len(sub)-i]:
+            return s[len(sub)-i:];
+    return s;
+
+##############################################################################################################
+
+def get_or_set_files_id (filename, size, md5sum, location_id):
+    global files_id_cache, files_id_serial, files_query_cache;
+
+    cache_key = string.join((filename, size, md5sum, repr(location_id)), '~')
+    if not files_id_cache.has_key(cache_key):
+        files_id_serial = files_id_serial + 1
+        files_query_cache.write("%d\t%s\t%s\t%s\t%d\n" % (files_id_serial, filename, size, md5sum, location_id));
+        files_id_cache[cache_key] = files_id_serial
+        
+    return files_id_cache[cache_key]
+
+##############################################################################################################
+def process_packages (location, filename, suite, component, archive):
+    global arch_all_cache, binary_cache, binaries_id_serial, binaries_query_cache, bin_associations_id_serial, bin_associations_query_cache;
+    
+    apt_pkg.init();
+    
+    Cnf = apt_pkg.newConfiguration();
+    apt_pkg.ReadConfigFileISC(Cnf,'/home/troup/katie/katie.conf');
+
+    projectB = pg.connect('projectb', 'localhost', -1, None, None, 'postgres')
+      
+    db_access.init (Cnf, projectB);
+
+    count_total = 0;
+    count_bad = 0;
+    suite = string.lower(suite);
+    suite_id = db_access.get_suite_id(suite);
+    if suite == "stable":
+        testing_id = db_access.get_suite_id("testing");
+    suite_codename = Cnf["Suite::%s::CodeName" % (suite)];
+    try:
+        file = utils.open_file (filename, "r")
+    except utils.cant_open_exc:
+        print "WARNING: can't open '%s'" % (filename);
+        return;
+    Scanner = apt_pkg.ParseTagFile(file);
+    while Scanner.Step() != 0:
+        package = Scanner.Section["package"]
+        version = Scanner.Section["version"]
+        maintainer = Scanner.Section["maintainer"]
+        maintainer = string.replace(maintainer, "'", "\\'")
+        maintainer_id = db_access.get_or_set_maintainer_id(maintainer);
+        architecture = Scanner.Section["architecture"]
+        architecture_id = db_access.get_architecture_id (architecture);
+        if not Scanner.Section.has_key("source"):
+            source = package
+        else:
+            source = Scanner.Section["source"]
+        source_version = ""
+        if string.find(source, "(") != -1:
+            m = utils.re_extract_src_version.match(source)
+            source = m.group(1)
+            source_version = m.group(2)
+        if not source_version:
+            source_version = version
+        xfilename = Scanner.Section["filename"]
+        filename = xfilename
+        location_id = db_access.get_location_id (location, component, archive)
+        filename = poolify (filename, location)
+        if architecture == "all":
+            filename = re_arch_from_filename.sub("binary-all", filename);
+        cache_key = "%s~%s" % (source, source_version);
+        source_id = source_cache_for_binaries.get(cache_key, None);
+        size = Scanner.Section["size"];
+        md5sum = Scanner.Section["md5sum"];
+        files_id = get_or_set_files_id (filename, size, md5sum, location_id);
+        cache_key = "%s~%s~%s~%d~%d~%d" % (package, version, repr(source_id), architecture_id, location_id, files_id);
+        if not arch_all_cache.has_key(cache_key):
+            arch_all_cache[cache_key] = 1;
+            cache_key = "%s~%s~%d" % (package, version, architecture_id);
+            if not binary_cache.has_key(cache_key):
+                binary_cache[cache_key] = (size, md5sum);
+            else:
+                (oldsize, oldmd5sum) = binary_cache[cache_key];
+                if oldsize != size or oldmd5sum != md5sum:
+                    #print "/org/ftp.debian.org/ftp/%s" % (xfilename);
+                    print "%s: %s vs. %s and %s vs. %s" % (xfilename, oldsize, size, oldmd5sum, md5sum);
+                    #count_bad = count_bad + 1;
+
+            count_total = count_total +1;
+
+    file.close();
+    if count_bad != 0:
+        print "Found %d bad." % (count_bad)
+
+##############################################################################################################
+
+def main ():
+    global Cnf, projectB, query_cache, files_query_cache, source_query_cache, src_associations_query_cache, dsc_files_query_cache, bin_associations_query_cache, binaries_query_cache;
+
+    apt_pkg.init();
+    
+    Cnf = apt_pkg.newConfiguration();
+    apt_pkg.ReadConfigFileISC(Cnf,'/home/troup/katie/katie.conf');
+
+    files_query_cache = utils.open_file(Cnf["Neve::ExportDir"]+"files","w");
+    source_query_cache = utils.open_file(Cnf["Neve::ExportDir"]+"source","w");
+    src_associations_query_cache = utils.open_file(Cnf["Neve::ExportDir"]+"src_associations","w");
+    dsc_files_query_cache = utils.open_file(Cnf["Neve::ExportDir"]+"dsc_files","w");
+    binaries_query_cache = utils.open_file(Cnf["Neve::ExportDir"]+"binaries","w");
+    bin_associations_query_cache = utils.open_file(Cnf["Neve::ExportDir"]+"bin_associations","w");
+
+    # Process Packages files to populate `binaries' and friends
+
+    for location in Cnf.SubTree("Location").List():
+        SubSec = Cnf.SubTree("Location::%s" % (location));
+        server = SubSec["Archive"];
+        if server != "ftp-master": # FIXME, don't hard code
+            continue;
+        type = Cnf.Find("Location::%s::Type" % (location));
+        if type == "legacy-mixed":
+            packages = location + 'Packages';
+            suite = Cnf.Find("Location::%s::Suite" % (location));
+            process_packages (location, packages, suite, "", server);
+        elif type == "legacy":
+            for suite in Cnf.SubTree("Location::%s::Suites" % (location)).List():
+                for component in Cnf.SubTree("Component").List():
+                    for architecture in Cnf.SubTree("Suite::%s::Architectures" % (suite)).List():
+                        if architecture == "source" or architecture == "all":
+                            continue;
+                        packages = location + Cnf.Find("Suite::%s::CodeName" % (suite)) + '/' + component + '/binary-' + architecture + '/Packages'
+                        process_packages (location, packages, suite, component, server);
+        elif type == "pool":
+            continue;
+            
+    files_query_cache.close();
+    source_query_cache.close();
+    src_associations_query_cache.close();
+    dsc_files_query_cache.close();
+    binaries_query_cache.close();
+    bin_associations_query_cache.close();
+   
+    return;
+            
+if __name__ == '__main__':
+    main()
diff --git a/contrib/fix.2 b/contrib/fix.2
new file mode 100755 (executable)
index 0000000..7a643fe
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+import commands, os, string, sys
+import apt_inst, apt_pkg
+import utils
+
+Cnf = None
+
+def main():
+    global Cnf
+    
+    apt_pkg.init();
+    
+    Cnf = apt_pkg.newConfiguration();
+    apt_pkg.ReadConfigFileISC(Cnf,'/home/troup/katie/katie.conf');
+
+    Arguments = [];
+    
+    dsc_files = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+
+    for dsc_file in dsc_files:
+       dsc = utils.parse_changes(dsc_file);
+        files = utils.build_file_list(dsc, 1);
+        for file in files.keys():
+            if not os.path.exists(file):
+                (result, output) = commands.getstatusoutput("locate %s | grep /org/ftp.debian.org/ftp/dists/potato/" % (file));
+                if (result != 0):
+                    print "%s: can't find '%s'." % (dsc_file, file);
+                    continue;
+                output = string.replace(output, "/org/ftp.debian.org/ftp/dists/potato/", "../potato/");
+                print "symlinking '%s' to '%s'." % (output, file);
+                os.symlink(output, file);
+
+if __name__ == '__main__':
+    main()
+
diff --git a/contrib/fix.3 b/contrib/fix.3
new file mode 100755 (executable)
index 0000000..643fedc
--- /dev/null
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+# restore binary-all links
+# Copyright (C) 2000 James Troup <james@nocrew.org>
+
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# WARNING: this is a quick hack to fix several architectures in sid;
+#          it has lots of things hardcoded when they shouldn't be etc.
+
+#######################################################################
+source `dirname $0`/vars
+
+# defaults
+
+dry_run=no
+
+#######################################################################
+
+count=0 
+
+# Write usage message
+usage() {
+        echo "usage: $progname [-n] architecture" 1>&2
+}
+
+# Write error message to stderr and quit.
+error() {
+        echo "$progname: $@" 1>&2
+        exit 1
+}
+
+# Check for at least one argument
+if [ $# -eq 0 ]; then 
+  usage
+  exit 1
+fi
+
+# Parse options
+progname="$0"
+loop=yes
+while [ $loop = yes ]
+do
+        case "$1" in
+       -n|--dry-run) dry_run="yes"; shift 1;;
+        --)             shift; loop=no ;;
+        -h|--help)      usage; exit 0 ;;
+        -*)             error "unknown option $1" ;;
+        *)              loop=no ;;
+        esac
+done
+
+cd $ftp/dists/potato/
+
+if [ ! -d main/binary-$1 ]; then
+    echo "Can't find arch $1"
+    exit 1
+fi
+
+echo "About to run this horrible script for arch $1 which will probably break things."
+echo -n "Are you sure? [Y/n]: "
+read answer
+if [ -z "$answer" ]; then answer="y"; fi
+case "$answer" in
+  n|N) echo "Aborting..";exit 0;;
+  y|Y) ;;
+  *)   echo "E: '$answer' not understood, exiting.";rm .genreport; exit 1;;
+esac
+
+for j in main non-free contrib; do
+    for i in $(find $j/binary-all/ ! -type d); do 
+       dir=$(dirname $i | sed -e "s/binary-all/binary-$1/")
+       pushd $dir >/dev/null
+       if [ ! -e $(basename $i) ]; then
+           if [ "$dry_run" = "no" ]; then
+               echo "Linking to $i"
+               ln -s ../../../$i .
+           else
+               echo "Would link to $i"
+           fi
+           count=$(expr $count + 1)
+       fi
+       popd > /dev/null
+    done
+done
+
+echo "Added $count links."
diff --git a/contrib/fix.4 b/contrib/fix.4
new file mode 100755 (executable)
index 0000000..39c94f0
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+dir=/org/ftp.debian.org/ftp/dists/woody/
+
+for component in main non-free contrib; do # non-free contrib
+  for i in $(find $dir/$component/binary-all/ -type f); do 
+    new=$(find $dir/$component/binary-i386/ -type f -name $(basename $i | sed -e "s/_.*//")_\*);
+    if [ ! -z "$new" ]; then 
+      oldver=$(dpkg-deb -f $i version)
+      newver=$(dpkg-deb -f $new version)
+      if dpkg --compare-versions $oldver gt $newver; then
+        echo EEH???
+        echo $(basename $i) dominates $(basename $new) ???;
+      fi;
+      if dpkg --compare-versions $oldver eq $newver; then
+        #echo $(basename $i) equals $(basename $new);
+        true;
+      fi;
+      if dpkg --compare-versions $oldver lt $newver; then
+        echo \# $(basename $new) \(arch: any\) DOMINATES $(basename $i) \(arch: all\);
+        echo mv -iv $i ~troup/removed-from-ftp/all/
+      fi;
+    fi; 
+  done
+done
+
+echo
+echo \# Cleanup dangling symlinks
+echo symlinks -rd $dir
diff --git a/contrib/fix.6 b/contrib/fix.6
new file mode 100755 (executable)
index 0000000..6a3c25f
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+
+import pg, string, os, shutil
+import utils
+import apt_pkg
+
+def move(src, dest):
+    if os.path.exists(dest):
+        print 'overwrite `'+dest+'\'? ',
+        yn = utils.our_raw_input()
+        if yn != 'Y' and yn != 'y':
+            return
+    print src + ' -> ' + dest
+    shutil.copyfile (src, dest)
+    os.unlink (src)
+
+def main():
+    projectB = pg.connect('projectb', 'localhost')
+
+    apt_pkg.init();
+    
+    suite = "unstable";
+    architecture = "i386";
+
+# too slow to run every time
+# "select b.package from binaries b, architecture a where a.arch_string = 'all' and b.architecture = a.id INTERSECT select b.package from binaries b, architecture a where a.arch_string = 'i386' and b.architecture = a.id;"
+
+    borked = utils.open_file('broken', 'r')
+    for line in borked.readlines():
+        package = string.strip(line[:-1])
+
+        #print "========="
+        #print package
+        q = projectB.query("SELECT b.version, a.arch_string, l.path, b.filename FROM bin_associations ba, binaries b, architecture a, suite s, location l WHERE b.package = '%s' AND (a.arch_string = '%s' OR a.arch_string = 'all') AND s.suite_name = '%s' AND ba.bin = b.id AND ba.suite = s.id AND b.architecture = a.id AND l.id = b .location" % (package, architecture, suite))
+        entries = q.getresult()
+        version = {}
+        filename = ""
+        for entry in entries:
+            version[entry[1]] = entry[0]
+            if entry[1] == "all":
+                filename = entry[2] + entry[3]
+        if not version.has_key(architecture) or not version.has_key("all"):
+            #print "SKIPPING"
+            continue
+        if apt_pkg.VersionCompare(version[architecture], version["all"]) != 1:
+            #print architecture+" too new... SKIPPING"
+            continue
+        #print "  "+repr(version)
+        if os.path.exists(filename):
+            if os.path.islink(filename):
+                print "FIXING: unlinking %s" % (filename);
+                os.unlink(filename);
+            else:
+                print "FIXING: moving %s to /home/troup/removed-from-ftp/foad/" % (filename);
+                move(filename, "/home/troup/removed-from-ftp/foad/%s" % (os.path.basename(filename)));
+
+if __name__ == '__main__':
+    main()
+
diff --git a/contrib/fix.7 b/contrib/fix.7
new file mode 100755 (executable)
index 0000000..08b2614
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+# "I tried to understand you.. I tried to love you right"
+
+dists=/org/ftp.debian.org/ftp/dists/
+dir=$dists/woody/
+
+for i in main contrib non-free; do # main contrib non-free
+  for j in arm; do # hurd-i386 hppa mips mipsel sh
+    echo "Processing $j ($i)..."
+    for k in $(find $dir/$i/binary-$j/ -type l); do
+      dest=$(readlink $k)
+      echo $dest | grep -q /binary-all/
+      if [ $? -eq 0 ]; then
+        file=$(basename $k)
+       woody=$(find $dists/woody/$i/binary-all/ -name $file)
+       if [ -z "$woody" ]; then 
+          echo "Killing link to $file"; 
+         rm $k
+        fi
+      fi
+    done
+  done
+done
diff --git a/contrib/fix.8 b/contrib/fix.8
new file mode 100755 (executable)
index 0000000..75d5a38
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+total=0
+
+for i in $(cat foo.2); do
+  if [ -f $i -a ! -L $i ]; then
+    dir=$(dirname $i)
+    file=$(basename $i)
+    size=$(du -b $i | cut -f 1)
+    arch=$(echo $i | sed -e "s#.*binary-\([a-z]*\).*#\1#")
+    pushd $dir > /dev/null
+    destdir=/home/troup/removed-from-ftp/badmd5-$arch/
+    if [ ! -d $destdir ]; then mkdir $destdir; fi
+    mv -iv $file $destdir/
+    ln -s ../../../../potato/$(echo $i | sed -e "s#.*woody/##") .
+    popd > /dev/null
+    total=$(expr $total + $size)
+  fi
+done
+
+echo
+echo "Replaced $total bytes."
+
diff --git a/copyoverrides b/copyoverrides
new file mode 100755 (executable)
index 0000000..23714dd
--- /dev/null
@@ -0,0 +1,32 @@
+#! /bin/sh
+# $Id: copyoverrides,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+set -e
+. $SCRIPTVARS
+echo 'Copying override files into public view ...'
+
+for f in $copyoverrides ; do
+       cd $overridedir
+       sortover.pl <override.$f >override.$f.new
+       ln -f override.$f old/override.$f.old
+       mv override.$f.new override.$f
+       chmod g+w override.$f
+
+       cd $indices
+       rm -f .newover-$f.gz
+       pc="`gzip 2>&1 -9nv <$overridedir/override.$f >.newover-$f.gz`"
+       set +e
+       nf=override.$f.gz
+       cmp -s .newover-$f.gz $nf
+       rc=$?
+       set -e
+        if [ $rc = 0 ]; then
+               rm -f .newover-$f.gz
+       elif [ $rc = 1 -o ! -f $nf ]; then
+               echo "   installing new $nf $pc"
+               mv -f .newover-$f.gz $nf
+       else
+               echo $? $pc
+               exit 1
+       fi
+done
diff --git a/cron.daily b/cron.daily
new file mode 100755 (executable)
index 0000000..59bf12a
--- /dev/null
@@ -0,0 +1,73 @@
+#! /bin/sh
+#
+# Executed daily via cron, out of troup's crontab.
+
+set -e
+export SCRIPTVARS=/org/ftp.debian.org/scripts/masterfiles/vars
+. $SCRIPTVARS
+
+##### 
+
+echo Archive maintenance started at $(date +%X)
+
+NOTICE="$ftpdir/Archive_Maintenance_In_Progress"
+
+cleanup() {
+  rm -f "$NOTICE"
+}
+trap cleanup 0
+
+rm -f "$NOTICE"
+cat > "$NOTICE" <<EOF
+Packages are currently being installed and indices rebuilt.
+Maintenance is automatic, starting at 13:52 US Central time, and
+ending at about 15:30.  This file is then removed.
+
+You should not mirror the archive during this period.
+EOF
+
+##### 
+
+TERM=vt100 update-bugdoctxt
+
+##### 
+
+pg_dump > FIXME
+
+##### 
+
+# temporary hack to work around the lack of an apt-utils package
+export PYTHONPATH=$PYTHONPATH:/org/ftp.debian.org/scripts/apt/build/bin/
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/org/ftp.debian.org/scripts/apt/build/bin/
+export PATH=$PATH:/org/ftp.debian.org/scripts/apt/build/bin/
+
+cd $incoming
+rm -f REPORT
+dak-install -pak *.changes | direport | tee REPORT | \
+     mail -s "Install for $(date +%D)" ftpmaster@ftp-master.debian.org
+chgrp debadmin REPORT
+chmod 664 REPORT
+
+cd $masterdir
+symlinks -d -r $ftpdir
+
+cd $masterdir
+apt-ftparchive generate apt.conf
+dak-mkmaintainers
+copyoverrides
+mklslar
+mkchecksums
+
+# [JT] temporary hack to make the buildd daemons and proposed-updates get along
+pushd /org/ftp.debian.org/ftp/dists/proposed-updates
+/home/troup/katie/drow *.dsc
+popd
+
+rm -f $NOTICE
+echo Archive maintenance finished at $(date +%X)
+
+ulimit -m 90000 -d 90000 -s 10000 -v 90000
+
+run-parts --report /org/ftp.debian.org/scripts/distmnt
+
+echo Daily cron scripts successful.
diff --git a/cron.daily-non-US b/cron.daily-non-US
new file mode 100755 (executable)
index 0000000..553775f
--- /dev/null
@@ -0,0 +1,78 @@
+#! /bin/sh
+#
+# Executed daily via cron, out of troup's crontab.
+
+set -e
+export SCRIPTVARS=/org/non-us.debian.org/katie/vars-non-US
+. $SCRIPTVARS
+
+################################################################################
+
+echo Archive maintenance started at $(date +%X)
+
+NOTICE="$ftpdir/Archive_Maintenance_In_Progress"
+
+cleanup() {
+  rm -f "$NOTICE"
+}
+trap cleanup 0
+
+rm -f "$NOTICE"
+cat > "$NOTICE" <<EOF
+Packages are currently being installed and indices rebuilt.
+Maintenance is automatic, starting at 13:52 US Central time, and
+ending at about 15:30.  This file is then removed.
+
+You should not mirror the archive during this period.
+EOF
+
+################################################################################
+
+echo "Creating pre-daily-cron-job backup of projectb database..."
+pg_dump projectb > /org/non-us.debian.org/backup/dump_$(date +%Y.%m.%d-%H:%M:%S)
+
+################################################################################
+
+# temporary hack to work around the lack of an apt-utils & python-apt package
+export PYTHONPATH=$PYTHONPATH:/org/ftp.debian.org/scripts/apt/build/bin/
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/org/ftp.debian.org/scripts/apt/build/bin/
+export PATH=$PATH:/org/ftp.debian.org/scripts/apt/build/bin/
+
+cd $incoming
+rm -f REPORT
+katie -pak *.changes | direport | tee REPORT | \
+     mail -s "Non-US Install for $(date +%D)" ftpmaster@ftp-master.debian.org
+chgrp debadmin REPORT
+chmod 664 REPORT
+
+cd $masterdir
+symlinks -d -r $ftpdir
+
+cd $masterdir
+jenna
+apt-ftparchive generate apt.conf-non-US
+cd $indices
+charisma > .new-maintainers
+mv -f .new-maintainers Maintainers
+gzip -9v <Maintainers >.new-maintainers.gz
+mv -f .new-maintainers.gz Maintainers.gz
+cd $masterdir
+copyoverrides
+mklslar
+mkchecksums
+
+rm -f $NOTICE
+echo Archive maintenance finished at $(date +%X)
+
+################################################################################
+
+echo "Creating post-daily-cron-job backup of projectb database..."
+pg_dump projectb > /org/non-us.debian.org/backup/dump_$(date +%Y.%m.%d-%H:%M:%S)
+
+################################################################################
+
+ulimit -m 90000 -d 90000 -s 10000 -v 90000
+
+run-parts --report /org/ftp.debian.org/scripts/distmnt
+
+echo Daily cron scripts successful.
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..6f87f6a
--- /dev/null
@@ -0,0 +1,9 @@
+katie (0.0-0) unstable; urgency=low
+
+  * Initial non-release.
+
+ -- James Troup <james@nocrew.org>  Fri, 29 Sep 2000 01:19:17 +0100
+
+Local variables:
+mode: debian-changelog
+End:
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..918c825
--- /dev/null
@@ -0,0 +1,13 @@
+Source: katie
+Section: misc
+Priority: extra
+Maintainer: James Troup <james@nocrew.org>
+Standards-Version: 3.1.1.1
+
+Package: katie
+Architecture: all
+Depends: python, apt-utils, gnupg
+Suggests: gnupg (>= 1.0.3-1)
+Description: Debian's archive maintenance scripts
+ This is a collection of archive maintenance scripts used by the
+ Debian project.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..165e2a7
--- /dev/null
@@ -0,0 +1,23 @@
+This is Debian GNU's prepackaged version of katie, Debian's archive
+maintenance scripts.
+
+This package was put together by me, James Troup <james@nocrew.org>,
+from my sources.
+
+Program Copyright (C) 2000 James Troup.
+
+katie is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+katie is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License with
+your Debian GNU system, in /usr/share/common-licenses/GPL, or with the
+Debian GNU gnupg source package as the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA 02111-1307, USA.
diff --git a/debian/postinst b/debian/postinst
new file mode 100644 (file)
index 0000000..cb8cb1b
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "configure" ]; then
+      if [ -d /usr/doc -a ! -e /usr/doc/katie \
+          -a -d /usr/share/doc/katie ]; then
+              ln -sf ../share/doc/katie /usr/doc/katie
+      fi
+fi
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..74c4a05
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/make -f
+# debian/rules file - for Katie (0.0)
+# Based on sample debian/rules file - for GNU Hello (1.3).
+# Copyright 1994,1995 by Ian Jackson.
+# Copyright 1998,1999,2000 James Troup
+# I hereby give you perpetual unlimited permission to copy,
+# modify and relicense this file, provided that you do not remove
+# my name from the file itself.  (I assert my moral right of
+# paternity under the Copyright, Designs and Patents Act 1988.)
+# This file may have to be extensively modified
+
+build:
+
+clean:
+       $(checkdir)
+       -rm -rf debian/tmp debian/*~ debian/files* debian/substvars
+
+binary-indep: checkroot
+       $(checkdir)
+       -rm -rf debian/tmp
+       install -d debian/tmp/DEBIAN/
+       install -m 755 debian/prerm debian/postinst debian/tmp/DEBIAN/
+       install -d debian/tmp/usr/bin/
+       install -m 755 katie debian/tmp/usr/bin/da_install
+       install -m 755 jenna debian/tmp/usr/bin/da_mkfilelist
+       install -m 755 heidi debian/tmp/usr/bin/da_tags
+       install -m 755 charisma debian/tmp/usr/bin/da_mkmaintainers
+       install -m 755 neve debian/tmp/usr/bin/da_populate
+       install -m 755 leon debian/tmp/usr/bin/da_clean
+       install -d debian/tmp/usr/share/doc/gnupg/
+       install -m 644 debian/changelog debian/tmp/usr/share/doc/gnupg/changelog.Debian
+       install -m 644 README NEWS THANKS TODO debian/tmp/usr/share/doc/gnupg/
+       install -m 644 ChangeLog debian/tmp/usr/share/doc/gnupg/changelog
+       gzip -9v debian/tmp/usr/share/doc/gnupg/*
+       install -m 644 debian/copyright debian/tmp/usr/share/doc/gnupg/
+       dpkg-gencontrol -isp
+       chown -R root.root debian/tmp
+       chmod -R go=rX debian/tmp
+       dpkg --build debian/tmp ..
+
+binary-arch:
+
+define checkdir
+       test -f katie -a -f debian/rules
+endef
+
+# Below here is fairly generic really
+
+binary:        binary-indep binary-arch
+
+checkroot:
+       $(checkdir)
+       test root = "`whoami`"
+
+.PHONY: binary binary-arch binary-indep clean checkroot
diff --git a/heidi b/heidi
new file mode 100755 (executable)
index 0000000..b34f951
--- /dev/null
+++ b/heidi
@@ -0,0 +1,205 @@
+#!/usr/bin/env python
+
+# Manipulate suite tags
+# Copyright (C) 2000  James Troup <james@nocrew.org>
+# $Id: heidi,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+#######################################################################################
+
+# 8to6Guy: "Wow, Bob, You look rough!"
+# BTAF: "Mbblpmn..."
+# BTAF <.oO>: "You moron! This is what you get for staying up all night drinking vodka and salad dressing!"
+# BTAF <.oO>: "This coffee I.V. drip is barely even keeping me awake! I need something with more kick! But what?"
+# BTAF: "OMIGOD! I OVERDOSED ON HEROIN"
+# CoWorker#n: "Give him air!!"
+# CoWorker#n+1: "We need a syringe full of adrenaline!"
+# CoWorker#n+2: "Stab him in the heart!"
+# BTAF: "*YES!*"
+# CoWorker#n+3: "Bob's been overdosing quite a bit lately..."
+# CoWorker#n+4: "Third time this week."
+
+# -- http://www.angryflower.com/8to6.gif
+
+#######################################################################################
+
+# Adds or removes packages from a suite.  Takes the list of files
+# either from stdin or as a command line argument.  Special action
+# "set", will reset the suite (!) and add all packages from scratch. 
+
+#######################################################################################
+
+import os, pg, string, sys;
+import apt_pkg;
+import utils, db_access;
+
+#######################################################################################
+
+Cnf = None;
+projectB = None;
+
+#######################################################################################
+
+def process_file (file, suite_id, action):
+
+    if action == "set":
+        projectB.query("DELETE FROM bin_associations WHERE suite = %d" % (suite_id));
+        projectB.query("DELETE FROM src_associations WHERE suite = %d" % (suite_id));
+        action = "add";
+        
+    for line in file.readlines():
+        split_line = string.split(string.strip(line[:-1]));
+        if len(split_line) != 3:
+            sys.stderr.write("W: '%s' does not break into 'package version architecture'.\n");
+            continue;
+        
+        (package, version, architecture) = split_line;
+
+        if architecture == "source":
+            q = projectB.query("SELECT id FROM source WHERE source = '%s' AND version = '%s'" % (package, version))
+        else:
+            q = projectB.query("SELECT b.id FROM binaries b, architecture a WHERE package = '%s' AND b.version = '%s' AND (a.arch_string = '%s' OR a.arch_string = 'all') AND b.architecture = a.id" % (package, version, architecture))
+
+        ql = q.getresult();
+        if ql == []:
+            sys.stderr.write("W: Couldn't find '%s~%s~%s'.\n" % (package, version, architecture));
+            continue;
+        if len(ql) > 1:
+            sys.stderr.write("E: Found more than one match for '%s~%s~%s'.\n" % (package, version, architecture));
+            continue;
+        id = ql[0][0];
+
+        if architecture == "source": 
+            # Find the existing assoications ID, if any
+            q = projectB.query("SELECT id FROM src_associations WHERE suite = %d and source = %d" % (suite_id, id));
+            ql = q.getresult();
+            if ql == []:
+                assoication_id = None;
+            else:
+                assoication_id = ql[0][0];
+            # Take action
+            if action == "add":
+                if assoication_id != None:
+                    sys.stderr.write("W: '%s~%s~%s' already exists in suite %d.\n" % (package, version, architecture, suite_id));
+                    continue;
+                else:
+                    q = projectB.query("INSERT INTO src_associations (suite, source) VALUES (%d, %d)" % (suite_id, id));
+            elif action == "remove":
+                if assoication_id == None:
+                    sys.stderr.write("W: '%s~%s~%s' doesn't exist in suite %d.\n" % (package, version, architecture, suite_id));
+                    continue;
+                else:
+                    q = projectB.query("DELETE FROM src_associations WHERE id = %d" % (assoication_id));
+        else:
+            # Find the existing assoications ID, if any
+            q = projectB.query("SELECT id FROM bin_associations WHERE suite = %d and bin = %d" % (suite_id, id));
+            ql = q.getresult();
+            if ql == []:
+                assoication_id = None;
+            else:
+                assoication_id = ql[0][0];
+            # Take action
+            if action == "add":
+                if assoication_id != None:
+                    sys.stderr.write("W: '%s~%s~%s' already exists in suite %d.\n" % (package, version, architecture, suite_id));
+                    continue;
+                else:
+                    q = projectB.query("INSERT INTO bin_associations (suite, bin) VALUES (%d, %d)" % (suite_id, id));
+            elif action == "remove":
+                if assoication_id == None:
+                    sys.stderr.write("W: '%s~%s~%s' doesn't exist in suite %d.\n" % (package, version, architecture, suite_id));
+                    continue;
+                else:
+                    q = projectB.query("DELETE FROM bin_associations WHERE id = %d" % (assoication_id));
+              
+#######################################################################################
+
+def get_list (suite_id):
+    # List binaries
+    q = projectB.query("SELECT b.package, b.version, a.arch_string FROM binaries b, bin_associations ba, architecture a WHERE ba.suite = %d AND ba.bin = b.id AND b.architecture = a.id" % (suite_id));
+    ql = q.getresult();
+    for i in ql:
+        print "%s %s %s" % (i[0], i[1], i[2]);
+
+    # List source
+    q = projectB.query("SELECT s.source, s.version FROM source s, src_associations sa WHERE sa.suite = %d AND sa.source = s.id" % (suite_id));
+    ql = q.getresult();
+    for i in ql:
+        print "%s %s source" % (i[0], i[1]);
+
+#######################################################################################
+
+def main ():
+    global Cnf, projectB;
+
+    apt_pkg.init();
+    
+    Cnf = apt_pkg.newConfiguration();
+    apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file());
+
+    Arguments = [('a',"add","Heidi::Options::Add", "HasArg"),
+                 ('d',"debug","Heidi::Options::Debug", "IntVal"),
+                 ('h',"help","Heidi::Options::Help"),
+                 ('l',"list","Heidi::Options::List","HasArg"),
+                 ('r',"remove", "Heidi::Options::Remove", "HasArg"),
+                 ('s',"set", "Heidi::Options::Set", "HasArg"),
+                 ('v',"version","Heidi::Options::Version")];
+
+    file_list = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+
+    projectB = pg.connect('projectb', 'localhost');
+
+    db_access.init(Cnf, projectB);
+
+    action = None;
+
+    for i in ("add", "list", "remove", "set"):
+        suite = Cnf["Heidi::Options::%s" % (i)];
+        if suite !="":
+            if not Cnf.has_key("Suite::%s" % (suite)):
+                sys.stderr.write("Unknown suite %s.\n" %(suite));
+                sys.exit(2);
+            else:
+                suite_id = db_access.get_suite_id(suite);
+                if action != None:
+                    sys.stderr.write("Can only do one action at a time.\n");
+                    sys.exit(2);
+                action = i;
+
+    # Need an action...
+    if action == None:
+        sys.stderr.write("No action specified.\n");
+        sys.exit(2);
+
+    # Safety/Sanity check
+    if action == "set" and suite != "testing":
+        sys.stderr.write("Will not reset a suite other than testing...\n");
+        sys.exit(2);
+
+    if action == "list":
+        get_list(suite_id);
+    else:
+        if file_list != []:
+            for file in file_list:
+                process_file(utils.open_file(file_list[0],'r'), suite_id, action);
+        else:
+            process_file(sys.stdin, suite_id, action);
+
+#######################################################################################
+
+if __name__ == '__main__':
+    main()
+
diff --git a/jenna b/jenna
new file mode 100755 (executable)
index 0000000..11b5c91
--- /dev/null
+++ b/jenna
@@ -0,0 +1,197 @@
+#!/usr/bin/env python
+
+# Generate file list which is then fed to apt-ftparchive to generate Packages and Sources files
+# Copyright (C) 2000  James Troup <james@nocrew.org>
+# $Id: jenna,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+#######################################################################################
+
+# BTAF: "GOD *DAMMIT*!!  What the FUCK happened to my free will??"
+#
+# -- http://www.angryflower.com/timelo.gif
+
+#######################################################################################
+
+import pg, string, os, sys
+import apt_pkg
+import db_access, utils
+
+projectB = None
+Cnf = None
+
+def generate_src_list(suite, component, output):
+    sources = {}
+
+    suite_id = db_access.get_suite_id(suite);
+    
+    if component == "-":
+        q = projectB.query("SELECT s.source, s.version, l.path, f.filename, s.id FROM source s, src_associations sa, location l, files f WHERE sa.source = s.id AND sa.suite = '%d' AND l.id = f.location AND s.file = f.id"
+                           % (suite_id));
+    else:
+        q = projectB.query("SELECT s.source, s.version, l.path, f.filename, s.id FROM source s, src_associations sa, location l, component c, files f WHERE lower(c.name) = '%s' AND (c.id = l.component OR l.component = NULL) AND sa.source = s.id AND sa.suite = '%d' AND l.id = f.location AND s.file = f.id"
+                           % (component, suite_id));
+    entries = q.getresult();
+    for entry in entries:
+        source = entry[0]
+        version = entry[1]
+        filename = entry[2]+entry[3];
+        id = entry[4]
+        add_new = 0
+        if os.path.exists(filename):
+            if sources.has_key(source):
+                if apt_pkg.VersionCompare(sources[source]["version"], version) == -1:
+                    if not Cnf.Find("Suite::%s::Untouchable" % (suite)):
+                        print "deleting %s (%s) in favour of newer version %s..." % (source, sources[source]["version"], version)
+                        projectB.query("DELETE FROM src_associations WHERE source = %s AND suite = %d" % (sources[source]["id"], suite_id))
+                    else:
+                        if Cnf.Find("Jenna::Options::Verbose"):
+                            print "[untouchable] would delete %s (%s) in favour of newer version %s..." % (source, sources[source]["version"], version)
+                    sources[source] = { "id": id, "version": version, "filename": filename }
+                else:
+                    if not Cnf.Find("Suite::%s::Untouchable" % (suite)):
+                        print "deleting %s (%s) in favour of newer version %s..." % (source, version, sources[source]["version"])
+                        projectB.query("DELETE FROM src_associations WHERE source = %s AND suite = %d" % (id, suite_id))
+                    else:
+                        if Cnf.Find("Jenna::Options::Verbose"):
+                            print "[untouchable] would delete %s (%s) in favour of newer version %s..." % (source, version, sources[source]["version"])
+            else:
+                sources[source] = { "id": id, "version": version, "filename": filename }
+        else:
+            if not Cnf.Find("Suite::%s::Untouchable" % (suite)):
+                sys.stderr.write("WARNING: deleting %s because it doesn't exist.\n" % (filename));
+                projectB.query("DELETE FROM src_associations WHERE source = %s AND suite = %d" % (id, suite_id))
+
+    # Write the list of files out
+    source_keys = sources.keys();
+    source_keys.sort();
+    for source in source_keys:
+        output.write(sources[source]["filename"]+'\n')
+    
+def generate_bin_list(suite, component, architecture, output, type):
+    packages = {}
+
+    suite_id = db_access.get_suite_id(suite);
+    
+    if component == "-":
+        q = projectB.query("SELECT b.package, b.version, l.path, f.filename, b.id FROM architecture a, binaries b, bin_associations ba, location l, files f WHERE ( a.arch_string = '%s' OR a.arch_string = 'all' ) AND a.id = b.architecture AND ba.bin = b.id AND ba.suite = '%d' AND l.id = f.location AND b.file = f.id AND b.type = '%s'" % (architecture, suite_id, type));
+    else:
+        q = projectB.query("SELECT b.package, b.version, l.path, f.filename, b.id FROM architecture a, binaries b, bin_associations ba, location l, component c, files f WHERE lower(c.name) = '%s' AND (c.id = l.component OR l.component = NULL) AND (a.arch_string = '%s' OR a.arch_string = 'all') AND a.id = b.architecture AND ba.bin = b.id AND ba.suite = '%d' AND l.id = f.location AND b.file = f.id AND b.type = '%s'" % (component, architecture, suite_id, type));
+    entries = q.getresult();
+    for entry in entries:
+        package = entry[0]
+        version = entry[1]
+        filename = entry[2]+entry[3];
+        id = entry[4]
+        add_new = 0
+        
+        # Hack to handle screwed up sid distro [FIXME: this may have issues, remove ASAP]
+        if not os.path.exists(filename):
+            sid_filename = string.replace(filename, "/woody/", "/potato/");
+            if os.path.exists(sid_filename):
+                filename = sid_filename;
+                
+        if os.path.exists(filename):
+            if packages.has_key(package):
+                if apt_pkg.VersionCompare(packages[package]["version"], version) == -1:
+                    if not Cnf.Find("Suite::%s::Untouchable" % (suite)):
+                        print "deleting %s (%s) in favour of newer version %s..." % (package, packages[package]["version"], version)
+                        projectB.query("DELETE FROM bin_associations WHERE bin = %s AND suite = %d" % (packages[package]["id"], suite_id))
+                    else:
+                        if Cnf.Find("Jenna::Options::Verbose"):
+                            print "[untouchable] would delete %s (%s) in favour of newer version %s..." % (package, packages[package]["version"], version)
+                    packages[package] = { "id": id, "version": version, "filename": filename }
+                else:
+                    if not Cnf.Find("Suite::%s::Untouchable" % (suite)):
+                        print "deleting %s (%s) in favour of newer version %s..." % (package, version, packages[package]["version"])
+                        projectB.query("DELETE FROM bin_associations WHERE bin = %s AND suite = %d" % (id, suite_id))
+                    else:
+                        if Cnf.Find("Jenna::Options::Verbose"):
+                            print "[untochable] would delete %s (%s) in favour of newer version %s..." % (package, version, packages[package]["version"])
+            else:
+                packages[package] = { "id": id, "version": version, "filename": filename }
+        else:
+            if not Cnf.Find("Suite::%s::Untouchable" % (suite)):
+                sys.stderr.write("WARNING: deleting %s because it doesn't exist.\n" % (filename));
+                projectB.query("DELETE FROM bin_associations WHERE bin = %s AND suite = %d" % (id, suite_id))
+
+    # Write the list of files out
+    package_keys = packages.keys();
+    package_keys.sort();
+    for package in package_keys:
+        output.write(packages[package]["filename"]+'\n')
+    
+    
+
+def main():
+    global Cnf, projectB;
+    
+    projectB = pg.connect('projectb', 'localhost');
+    
+    apt_pkg.init();
+    
+    Cnf = apt_pkg.newConfiguration();
+    apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file());
+
+    Arguments = [('a',"architecture","Jenna::Options::Architecture", "HasArg"),
+                 ('c',"component","Jenna::Options::Component", "HasArg"),
+                 ('d',"debug","Jenna::Options::Debug", "IntVal"),
+                 ('h',"help","Jenna::Options::Help"),
+                 ('s',"suite", "Jenna::Options::Suite", "HasArg"),
+                 ('v',"verbose","Jenna::Options::Verbose"),
+                 ('V',"version","Jenna::Options::Version")];
+
+    apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+
+    db_access.init(Cnf, projectB);
+
+    if Cnf["Jenna::Options::Suite"] == "":
+        Cnf["Jenna::Options::Suite"] = string.join(Cnf.SubTree("Suite").List());
+    for suite in string.split(Cnf["Jenna::Options::Suite"]):
+        suite = string.lower(suite);
+        components = Cnf["Jenna::Options::Component"];
+        if not Cnf.has_key("Suite::%s::Components" % (suite)):
+            components = "-";
+        if components == "":
+            components = string.join(Cnf.SubTree("Suite::%s::Components" % (suite)).List());
+        for component in string.split(components):
+            component = string.lower(component)
+            architectures = Cnf["Jenna::Options::Architecture"];
+            if architectures == "":
+                architectures = string.join(Cnf.SubTree("Suite::%s::Architectures" % (suite)).List());
+            for architecture in string.split(architectures):
+                architecture = string.lower(architecture)
+                if architecture == "all":
+                    continue
+                if architecture == "source":
+                    print "Processing dists/%s/%s/%s..." % (suite, component, architecture);
+                    output = utils.open_file("%s/%s_%s_%s.list" % (Cnf["Dir::ListsDir"], suite, component, architecture), "w")
+                    generate_src_list(suite, component, output);
+                    output.close();
+                else:
+                    print "Processing dists/%s/%s/binary-%s..." % (suite, component, architecture);
+                    output = utils.open_file("%s/%s_%s_binary-%s.list" % (Cnf["Dir::ListsDir"], suite, component, architecture), "w");
+                    generate_bin_list(suite, component, architecture, output, "deb");
+                    output.close();
+                    if component == "main": # FIXME: must be a cleaner way to say debian-installer is main only?
+                        print "Processing dists/%s/%s/debian-installer/binary-%s..." % (suite,component, architecture);
+                        output = utils.open_file("%s/%s_%s_debian-installer_binary-%s.list" % (Cnf["Dir::ListsDir"], suite, component, architecture), "w");
+                        generate_bin_list(suite, component, architecture, output, "udeb");
+                        output.close();
+
+if __name__ == '__main__':
+    main()
+
diff --git a/katie.conf b/katie.conf
new file mode 100644 (file)
index 0000000..40d39c6
--- /dev/null
@@ -0,0 +1,331 @@
+Dinstall
+{
+  Options
+  {
+       Automatic "";
+        Debug "";
+        Help "";
+        Ack-New "";
+        Manual-Reject "";
+        No-Action "";
+        No-Lock "";
+        No-Version-Check "";
+        No-Mail "";
+        Override-Distribution "";
+        Version "";
+   };
+
+   PGPKeyring "/org/keyring.debian.org/keyrings/debian-keyring.pgp";
+   GPGKeyring "/org/keyring.debian.org/keyrings/debian-keyring.gpg";
+   SendmailCommand "/usr/sbin/sendmail -oi -t";
+   MyEmailAddress "Debian Installer <installer@ftp-master.debian.org>";
+   MyHost "debian.org";  // used for generating user@my_host addresses in e.g. manual_reject()
+   NewAckList "/home/troup/katie/log"; // !!FIXME!!
+   LockFile "/home/troup/katie/lock"; // !!FIXME!!
+
+};
+
+Heidi
+{
+
+  Options
+  {
+    Add "";
+    Debug "";
+    Help "";
+    List "";
+    Remove "";
+    Set "";
+    Version "";
+   };
+
+};
+
+Jenna
+{
+
+  Options
+  {
+    Architecture "";
+    Component "";
+    Debug "";
+    Help "";
+    Suite "";
+    Verbose "";
+    Version "";
+   };
+
+};
+
+Neve
+{
+
+  ExportDir "/home/troup/katie/neve-files/";
+
+};
+
+Rhona
+{
+
+  Options  // Currently don't do anything
+  {
+        Debug "";
+        Help "";
+       Interactive "";
+        Version "";
+   };
+
+  //Morgue "/org/ftp.debian.org/morgue/";
+   Morgue "/org/scratch/troup/morgue/";
+   // How long (in seconds) dead packages are left before being killed
+   StayOfExecution 259200;
+};
+
+Suite
+{
+
+  // Priority determines which suite is used for the Maintainers filed as generated by charisma/da_mkmaintainers (highest wins)
+  
+  Experimental
+  {
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Announce "debian-devel-changes@lists.debian.org";
+       Version "xx";
+       Origin "Debian";
+       Description "Experimental packages - not released; use at your own risk.";
+       CodeName "experimental";
+       OverrideCodeName "experimental";
+       SingleOverrideFile "true";
+       Priority "0";
+  };
+
+  Stable
+  {
+       Components 
+       {
+         main "";
+         contrib "";
+         non-free "";
+       };
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Announce "debian-changes@lists.debian.org";
+       Version "2.2r0";
+       Origin "Debian";
+       Description "Debian 2.2 Released 14th August 2000";
+       CodeName "potato";
+       OverrideCodeName "potato";
+       Priority "1";
+       Untouchable "1";
+  };
+
+  Proposed-Updates
+  {
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Announce "debian-changes@lists.debian.org";
+       CopyChanges "dists/proposed-updates/";
+       Version "2.2r1";
+       Origin "Debian";
+       Description "Proposed Updates for Debian 2.2r1 - Not Released";
+       CodeName "proposed-updates";
+       OverrideCodeName "potato";
+       Priority "2";
+  };
+
+  Testing
+  {
+       Components 
+       {
+         main "";
+         contrib "";
+         non-free "";
+       };
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Version "2.3-testing";
+       Origin "Debian";
+       Description "Debian 2.3 Testing distribution - Not Released";
+       Priority "3";
+  };
+
+  Unstable
+  {
+       Components 
+       {
+         main "";
+         contrib "";
+         non-free "";
+       };
+       Architectures 
+       {
+         "source" ""; 
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "hppa" "";
+         "hurd-i386" "";
+         "i386" "";
+         "m68k" "";
+         "mips" "";
+         "mipsel" "";
+         "powerpc" "";
+         "sh" "";
+         "sparc" "";
+       };
+       Announce "debian-devel-changes@lists.debian.org";
+       Version "2.3";
+       Origin "Debian";
+       Description "Debian 2.3 Unstable - Not Released";
+       CodeName "woody";
+       OverrideCodeName "woody";
+       Priority "4";
+  };
+
+};
+
+Dir
+{
+  RootDir "/org/ftp.debian.org/ftp/";
+  PoolDir "/org/scratch/troup/pool/";
+  PoolRoot "pool/";
+  IncomingDir "/org/ftp.debian.org/incoming/";
+  OverrideDir "/org/ftp.debian.org/scripts/override/";
+  ListsDir "/org/ftp.debian.org/database/dists/";
+};
+
+DB
+{
+  Host "ftp-master.debian.org";
+  Port -1;
+  ROUser "nobody";
+}
+
+Architectures
+{
+
+  source "Source";
+  all "Architecture Independent";
+  alpha "DEC Alpha";
+  hurd-i386 "Intel ia32 running the HURD";
+  hppa "HP PA RISC";
+  arm "Arm";
+  i386 "Intel ia32";
+  m68k "Motorola Mc680x0";
+  mips "SGI MIPS";
+  mipsel "SGI MIPS (Little Endian)";
+  powerpc "PowerPC";
+  sh "Hitatchi SuperH";
+  sparc "Sun SPARC/UltraSPARC";
+
+};
+
+Archive
+{
+
+  ftp-master
+  {
+    OriginServer "ftp-master.debian.org";
+    Description "Master Archive for the Debian project";
+  };
+
+};
+
+Component
+{
+
+  main
+  {
+       Description "Main";
+       MeetsDFSG "true";
+  };
+
+  contrib
+  {
+       Description "Contrib";
+       MeetsDFSG "true";
+  };
+
+  non-free
+  {
+       Description "Software that fails to meet the DFSG";
+       MeetsDFSG "false";
+  };
+
+};
+
+Location
+{
+  
+  // Old style locations on ftp-master.debian.org
+
+  /org/ftp.debian.org/ftp/project/experimental/
+    {
+      Archive "ftp-master";
+      Suite "experimental";
+      Type "legacy-mixed";
+    };
+
+  /org/ftp.debian.org/ftp/dists/proposed-updates/
+    {
+      Archive "ftp-master";
+      Suite "proposed-updates";
+      Type "legacy-mixed";
+    };
+
+  /org/ftp.debian.org/ftp/dists/
+    {
+      Archive "ftp-master";
+      Suites 
+       {
+         Stable "";
+         Unstable "";
+        };
+      Type "legacy";
+    };
+
+  // New pool locations on ftp-master.debian.org
+  /org/scratch/troup/pool/
+    {
+      Archive "ftp-master";
+      Type "pool"
+    };
+
+}
diff --git a/katie.conf-non-US b/katie.conf-non-US
new file mode 100644 (file)
index 0000000..a4b7a35
--- /dev/null
@@ -0,0 +1,323 @@
+Dinstall
+{
+  Options
+  {
+       Automatic "";
+        Debug "";
+        Help "";
+        Ack-New "";
+        Manual-Reject "";
+        No-Action "";
+        No-Lock "";
+        No-Version-Check "";
+        No-Mail "";
+        Override-Distribution "";
+        Version "";
+   };
+
+   PGPKeyring "/org/keyring.debian.org/keyrings/debian-keyring.pgp";
+   GPGKeyring "/org/keyring.debian.org/keyrings/debian-keyring.gpg";
+   SendmailCommand "/usr/sbin/sendmail -oi -t";
+   MyEmailAddress "Debian Installer <installer@ftp-master.debian.org>";
+   MyHost "debian.org";  // used for generating user@my_host addresses in e.g. manual_reject()
+   NewAckList "/org/non-us.debian.org/katie/log";
+   LockFile "/org/non-us.debian.org/katie/lock";
+
+};
+
+Heidi
+{
+
+  Options
+  {
+    Add "";
+    Debug "";
+    Help "";
+    List "";
+    Remove "";
+    Set "";
+    Version "";
+   };
+
+};
+
+Jenna
+{
+
+  Options
+  {
+    Architecture "";
+    Component "";
+    Debug "";
+    Help "";
+    Suite "";
+    Verbose "";
+    Version "";
+   };
+
+};
+
+Neve
+{
+
+  ExportDir "/org/non-us.debian.org/katie/neve-files/";
+
+};
+
+Rhona
+{
+
+  Options  // Currently don't do anything
+  {
+        Debug "";
+        Help "";
+       Interactive "";
+        Version "";
+   };
+
+  Morgue "/org/non-us.debian.org/morgue/";
+  // How long (in seconds) dead packages are left before being killed
+  StayOfExecution 259200;
+};
+
+Suite
+{
+
+  // Priority determines which suite is used for the Maintainers filed as generated by charisma/da_mkmaintainers (highest wins)
+  
+  Experimental
+  {
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Announce "debian-devel-changes@lists.debian.org";
+       Version "xx";
+       Origin "Debian";
+       Description "Experimental packages - not released; use at your own risk.";
+       CodeName "experimental";
+       OverrideCodeName "experimental";
+       SingleOverrideFile "true";
+       Priority "0";
+  };
+
+  Stable
+  {
+       Components 
+       {
+         non-US/main "";
+         non-US/contrib "";
+         non-US/non-free "";
+       };
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Announce "debian-changes@lists.debian.org";
+       Version "2.2r0";
+       Origin "Debian";
+       Description "Debian 2.2r1 Released 12th November 2000";
+       CodeName "potato";
+       OverrideCodeName "potato";
+       Priority "1";
+       Untouchable "1";
+  };
+
+  Proposed-Updates
+  {
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Announce "debian-changes@lists.debian.org";
+       CopyChanges "dists/proposed-updates/";
+       Version "2.2r2";
+       Origin "Debian";
+       Description "Proposed Updates for Debian 2.2r2 - Not Released";
+       CodeName "proposed-updates";
+       OverrideCodeName "potato";
+       Priority "2";
+  };
+
+  Testing
+  {
+       Components 
+       {
+         non-US/main "";
+         non-US/contrib "";
+         non-US/non-free "";
+       };
+       Architectures 
+       {
+         "source" "";  
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "i386" "";
+         "m68k" "";
+         "powerpc" "";
+         "sparc" "";
+       };
+       Version "2.3-testing";
+       Origin "Debian";
+       Description "Debian 2.3 Testing distribution - Not Released";
+       Priority "3";
+  };
+
+  Unstable
+  {
+       Components 
+       {
+         non-US/main "";
+         non-US/contrib "";
+         non-US/non-free "";
+       };
+       Architectures 
+       {
+         "source" ""; 
+         "all" "";
+         "alpha" ""; 
+         "arm" "";
+         "hppa" "";
+         "hurd-i386" "";
+         "i386" "";
+         "m68k" "";
+         "mips" "";
+         "mipsel" "";
+         "powerpc" "";
+         "sh" "";
+         "sparc" "";
+       };
+       Announce "debian-devel-changes@lists.debian.org";
+       Version "2.3";
+       Origin "Debian";
+       Description "Debian 2.3 Unstable - Not Released";
+       CodeName "woody";
+       OverrideCodeName "woody";
+       Priority "4";
+  };
+
+};
+
+Dir
+{
+  RootDir "/org/non-us.debian.org/ftp/";
+  PoolDir "/org/non-us.debian.org/ftp/pool/";
+  PoolRoot "pool/";
+  IncomingDir "/org/non-us.debian.org/incoming/";
+  OverrideDir "/org/non-us.debian.org/scripts/override/";
+  ListsDir "/org/non-us.debian.org/database/dists/";
+};
+
+DB
+{
+  Host "non-us.debian.org";
+  Port -1;
+  ROUser "nobody";
+};
+
+Architectures
+{
+
+  source "Source";
+  all "Architecture Independent";
+  alpha "DEC Alpha";
+  hurd-i386 "Intel ia32 running the HURD";
+  hppa "HP PA RISC";
+  arm "Arm";
+  i386 "Intel ia32";
+  m68k "Motorola Mc680x0";
+  mips "SGI MIPS";
+  mipsel "SGI MIPS (Little Endian)";
+  powerpc "PowerPC";
+  sh "Hitatchi SuperH";
+  sparc "Sun SPARC/UltraSPARC";
+
+};
+
+Archive
+{
+
+  non-US 
+  {
+    OriginServer "non-us.debian.org";
+    Description "Non-US Archive for the Debian project";
+  };
+
+};
+
+Component
+{
+
+  non-US/main
+  {
+       Description "Main (non-US)";
+       MeetsDFSG "true";
+  };
+
+  non-US/contrib
+  {
+       Description "Contrib (non-US)";
+       MeetsDFSG "true";
+  };
+
+  non-US/non-free
+  {
+       Description "Software that fails to meet the DFSG (non-US)";
+       MeetsDFSG "false";
+  };
+
+};
+
+Location
+{
+  
+  // Old style locations on non-US.debian.org
+
+  /org/non-us.debian.org/ftp/dists/proposed-updates/
+    {
+      Archive "non-US";
+      Suite "proposed-updates";
+      Type "legacy-mixed";
+    };
+
+  /org/non-us.debian.org/ftp/dists/
+    {
+      Archive "non-US";
+      Suites 
+       {
+         Stable "";
+         Unstable "";
+       };
+      Type "legacy";
+    };
+
+  // New pool locations on non-US.debian.org
+  /org/non-us.debian.org/ftp/pool/
+    {
+      Archive "non-US";
+      Type "pool";
+    };
+
+};
diff --git a/mkchecksums b/mkchecksums
new file mode 100755 (executable)
index 0000000..d614fc1
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh
+# Update the md5sums file
+# $Id: mkchecksums,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+set -e
+. $SCRIPTVARS
+
+dsynclist=$indices/dsync.list
+md5list=$indices/md5sums
+
+echo -n "Creating md5 / dsync index file ... "
+
+cd "$ftpdir"
+dsync-flist -q generate $dsynclist --exclude $dsynclist --md5
+dsync-flist -q md5sums $dsynclist | tee $md5list | gzip -9n > ${md5list}.gz
+dsync-flist -q link-dups $dsynclist || true
diff --git a/mklslar b/mklslar
new file mode 100755 (executable)
index 0000000..f4fa4f1
--- /dev/null
+++ b/mklslar
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Update the ls-lR.
+# $Id: mklslar,v 1.1 2000-11-24 00:20:11 troup Exp $
+
+set -e
+. $SCRIPTVARS
+
+cd $ftpdir
+
+filename=ls-lR
+
+echo "Removing any core files ..."
+find -type f -name core -print0 | xargs -0r rm -v
+
+echo "Checking permissions on files in the FTP tree ..."
+find -type f \( \! -perm -444 -o -perm +002 \) -ls
+find -type d \( \! -perm -555 -o -perm +002 \) -ls
+
+echo "Checking symlinks ..."
+symlinks -r .
+
+echo "Creating recursive directory listing ... "
+rm -f .$filename.new
+ls -lR | grep -v Archive_Maintenance_In_Progress > .$filename.new
+
+if [ -r $filename ] ; then
+  mv -f $filename $filename.old
+  mv -f .$filename.new $filename
+  rm -f $filename.patch.gz
+  diff -u $filename.old $filename | gzip -9cfn - >$filename.patch.gz
+  rm -f $filename.old
+else
+  mv -f .$filename.new $filename
+fi
+
+gzip -9cfN $filename >$filename.gz
diff --git a/sortover.pl b/sortover.pl
new file mode 100755 (executable)
index 0000000..3328cee
--- /dev/null
@@ -0,0 +1,13 @@
+#!/usr/bin/perl
+%iv=qw(required 00
+       important 01
+       standard 02
+       optional 03
+       extra 04);
+sub t {
+    return $_[0] if $_[0] =~ m/^\#/;
+    $_[0] =~ m/^(\S+)\s+(\S+)\s+(\S+)\s/ || die "$0: `$_[0]'";
+    return "$3 $iv{$2} $1";
+}
+print(sort { &t($a) cmp &t($b) } <STDIN>) || die $!;
+close(STDOUT) || die $!;
diff --git a/tagdb.dia b/tagdb.dia
new file mode 100644 (file)
index 0000000..6b098ee
--- /dev/null
+++ b/tagdb.dia
@@ -0,0 +1,1903 @@
+<?xml version="1.0"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+  <dia:diagramdata>
+    <dia:attribute name="background">
+      <dia:color val="#ffffff"/>
+    </dia:attribute>
+    <dia:attribute name="paper">
+      <dia:composite type="paper">
+        <dia:attribute name="name">
+          <dia:string>#A4#</dia:string>
+        </dia:attribute>
+        <dia:attribute name="tmargin">
+          <dia:real val="2.82"/>
+        </dia:attribute>
+        <dia:attribute name="bmargin">
+          <dia:real val="2.82"/>
+        </dia:attribute>
+        <dia:attribute name="lmargin">
+          <dia:real val="2.82"/>
+        </dia:attribute>
+        <dia:attribute name="rmargin">
+          <dia:real val="2.82"/>
+        </dia:attribute>
+        <dia:attribute name="is_portrait">
+          <dia:boolean val="false"/>
+        </dia:attribute>
+        <dia:attribute name="scaling">
+          <dia:real val="0.390055"/>
+        </dia:attribute>
+        <dia:attribute name="fitto">
+          <dia:boolean val="true"/>
+        </dia:attribute>
+        <dia:attribute name="fitwidth">
+          <dia:int val="1"/>
+        </dia:attribute>
+        <dia:attribute name="fitheight">
+          <dia:int val="1"/>
+        </dia:attribute>
+      </dia:composite>
+    </dia:attribute>
+  </dia:diagramdata>
+  <dia:layer name="Background" visible="true">
+    <dia:object type="UML - Class" version="0" id="O0">
+      <dia:attribute name="obj_pos">
+        <dia:point val="8.7,8.75"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="8.65,8.7;21.1852,14.4"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="8.7,8.75"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="12.4352"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="5.6"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#binaries#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#package#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#version#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#version_type#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#source#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#architecture#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#file#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O1">
+      <dia:attribute name="obj_pos">
+        <dia:point val="25.4,14.15"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="25.35,14.1;36.9156,19"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="25.4,14.15"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="11.4656"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="4.8"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#source#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#source#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#version#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#version_type#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#maintainer#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#file#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O2">
+      <dia:attribute name="obj_pos">
+        <dia:point val="-4.7,6.75"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="-4.75,6.7;4.8764,10"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="-4.7,6.75"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="9.5264"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="3.2"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#bin_associations#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#suite#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#binary#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O3">
+      <dia:attribute name="obj_pos">
+        <dia:point val="10.5,18.55"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="10.45,18.5;21.046,21.8"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="10.5,18.55"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="10.496"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="3.2"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#architecture#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#arch_string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#description#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="Standard - Line" version="0" id="O4">
+      <dia:attribute name="obj_pos">
+        <dia:point val="4.8264,9.45"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="3.9764,8.6;9.55,10.3"/>
+      </dia:attribute>
+      <dia:attribute name="conn_endpoints">
+        <dia:point val="4.8264,9.45"/>
+        <dia:point val="8.7,9.45"/>
+      </dia:attribute>
+      <dia:attribute name="numcp">
+        <dia:int val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O2" connection="11"/>
+        <dia:connection handle="1" to="O0" connection="3"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O5">
+      <dia:attribute name="obj_pos">
+        <dia:point val="21.1352,13.05"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="14.898,12.2;23.2966,19.4"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="21.1352,13.05"/>
+        <dia:point val="22.4466,13.05"/>
+        <dia:point val="22.4466,16.8557"/>
+        <dia:point val="15.748,16.8557"/>
+        <dia:point val="15.748,18.55"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O0" connection="15"/>
+        <dia:connection handle="1" to="O3" connection="1"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O6">
+      <dia:attribute name="obj_pos">
+        <dia:point val="21.1352,12.25"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="20.2852,11.4;31.9828,15"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="21.1352,12.25"/>
+        <dia:point val="31.1328,12.25"/>
+        <dia:point val="31.1328,14.15"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O0" connection="13"/>
+        <dia:connection handle="1" to="O1" connection="1"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O7">
+      <dia:attribute name="obj_pos">
+        <dia:point val="-4.7,8.65"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="-7.4207,7.8;0.33175,16.8865"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="-4.7,8.65"/>
+        <dia:point val="-6.5707,8.65"/>
+        <dia:point val="-6.5707,13.0974"/>
+        <dia:point val="-0.51825,13.0974"/>
+        <dia:point val="-0.51825,16.0365"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O2" connection="8"/>
+        <dia:connection handle="1" to="O8" connection="1"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O8">
+      <dia:attribute name="obj_pos">
+        <dia:point val="-7.22065,16.0365"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="-7.27065,15.9865;6.23415,23.2865"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="-7.22065,16.0365"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="13.4048"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="7.2"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#suite#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#suite_name#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#architectures#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#mreference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#version#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#version_type#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#origin#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#label#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#policy_engine#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#text#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#description#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="Standard - Text" version="0" id="O9">
+      <dia:attribute name="obj_pos">
+        <dia:point val="-8.2629,-0.41708"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="-8.2629,-2.13208;12.2351,2.06792"/>
+      </dia:attribute>
+      <dia:attribute name="text">
+        <dia:composite type="text">
+          <dia:attribute name="string">
+            <dia:string>#Project Betsy
+Tag Database Detail#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="font">
+            <dia:font name="NewCenturySchoolbook-Roman"/>
+          </dia:attribute>
+          <dia:attribute name="height">
+            <dia:real val="2.1"/>
+          </dia:attribute>
+          <dia:attribute name="pos">
+            <dia:point val="-8.2629,-0.41708"/>
+          </dia:attribute>
+          <dia:attribute name="color">
+            <dia:color val="#000000"/>
+          </dia:attribute>
+          <dia:attribute name="alignment">
+            <dia:enum val="0"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O10">
+      <dia:attribute name="obj_pos">
+        <dia:point val="6.18415,18.7365"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="5.33415,17.8865;11.35,21.3"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="6.18415,18.7365"/>
+        <dia:point val="8.46913,18.7365"/>
+        <dia:point val="8.46913,20.45"/>
+        <dia:point val="10.5,20.45"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O8" connection="11"/>
+        <dia:connection handle="1" to="O3" connection="8"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O11">
+      <dia:attribute name="obj_pos">
+        <dia:point val="41.1853,23.335"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="41.1353,23.285;51.7313,27.385"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="41.1853,23.335"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="10.496"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="4"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#component#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#name#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#description#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#meets_dfsg#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#boolean#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O12">
+      <dia:attribute name="obj_pos">
+        <dia:point val="40.9355,31.0413"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="40.8855,30.9913;53.4207,35.0913"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="40.9355,31.0413"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="12.4352"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="4"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#archive#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#Name#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#origin_server#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#hostname#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#description#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O13">
+      <dia:attribute name="obj_pos">
+        <dia:point val="24.1353,27.135"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="24.0853,27.085;35.1661,31.185"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="24.1353,27.135"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="10.9808"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="4"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#location#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#path#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="3"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#component#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#archive#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O14">
+      <dia:attribute name="obj_pos">
+        <dia:point val="35.1161,29.835"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="34.2661,23.185;42.0353,30.685"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="35.1161,29.835"/>
+        <dia:point val="38.6053,29.835"/>
+        <dia:point val="38.6053,24.035"/>
+        <dia:point val="41.1853,24.035"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O13" connection="11"/>
+        <dia:connection handle="1" to="O11" connection="3"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O15">
+      <dia:attribute name="obj_pos">
+        <dia:point val="35.1161,30.635"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="34.2661,29.785;41.7855,32.5913"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="35.1161,30.635"/>
+        <dia:point val="38.6553,30.635"/>
+        <dia:point val="38.6553,31.7413"/>
+        <dia:point val="40.9355,31.7413"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O13" connection="13"/>
+        <dia:connection handle="1" to="O12" connection="3"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O16">
+      <dia:attribute name="obj_pos">
+        <dia:point val="16.796,4.2"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="16.746,4.15;26.3724,7.45"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="16.796,4.2"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="9.5264"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="3.2"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#src_associations#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#suite#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#binary#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O17">
+      <dia:attribute name="obj_pos">
+        <dia:point val="26.3224,6.9"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="25.4724,6.05;31.9828,15"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="26.3224,6.9"/>
+        <dia:point val="31.1328,6.9"/>
+        <dia:point val="31.1328,14.15"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O16" connection="11"/>
+        <dia:connection handle="1" to="O1" connection="1"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O18">
+      <dia:attribute name="obj_pos">
+        <dia:point val="16.796,6.1"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="-8.1134,5.25;17.646,16.8865"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="16.796,6.1"/>
+        <dia:point val="-7.2634,6.1"/>
+        <dia:point val="-7.2634,13.9658"/>
+        <dia:point val="-0.51825,13.9658"/>
+        <dia:point val="-0.51825,16.0365"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O16" connection="8"/>
+        <dia:connection handle="1" to="O8" connection="1"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O19">
+      <dia:attribute name="obj_pos">
+        <dia:point val="40.934,15.32"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="40.884,15.27;50.5104,18.57"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="40.934,15.32"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="9.5264"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="3.2"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#maintainer#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#name#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#ldap_user#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O20">
+      <dia:attribute name="obj_pos">
+        <dia:point val="36.8656,17.65"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="36.0156,15.17;41.784,18.5"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="36.8656,17.65"/>
+        <dia:point val="38.3039,17.65"/>
+        <dia:point val="38.3039,16.02"/>
+        <dia:point val="40.934,16.02"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O1" connection="13"/>
+        <dia:connection handle="1" to="O19" connection="3"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O21">
+      <dia:attribute name="obj_pos">
+        <dia:point val="10.8763,25.395"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="10.8263,25.345;21.4223,31.045"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="10.8763,25.395"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="10.496"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="5.6"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#files#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#filename#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#size#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#unsigned#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#md5sum#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#string#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#location#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#last_used#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#time#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="UML - Class" version="0" id="O22">
+      <dia:attribute name="obj_pos">
+        <dia:point val="25.2041,21.78"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="25.1541,21.73;34.7805,25.03"/>
+      </dia:attribute>
+      <dia:attribute name="elem_corner">
+        <dia:point val="25.2041,21.78"/>
+      </dia:attribute>
+      <dia:attribute name="elem_width">
+        <dia:real val="9.5264"/>
+      </dia:attribute>
+      <dia:attribute name="elem_height">
+        <dia:real val="3.2"/>
+      </dia:attribute>
+      <dia:attribute name="name">
+        <dia:string>#dsc_files#</dia:string>
+      </dia:attribute>
+      <dia:attribute name="stereotype">
+        <dia:string/>
+      </dia:attribute>
+      <dia:attribute name="abstract">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_attributes">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="suppress_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="visible_attributes">
+        <dia:boolean val="true"/>
+      </dia:attribute>
+      <dia:attribute name="visible_operations">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#source#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#file#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#reference#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string/>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
+      <dia:attribute name="operations"/>
+      <dia:attribute name="template">
+        <dia:boolean val="false"/>
+      </dia:attribute>
+      <dia:attribute name="templates"/>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O23">
+      <dia:attribute name="obj_pos">
+        <dia:point val="31.1328,18.95"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="30.2828,18.1;37.374,24.53"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="31.1328,18.95"/>
+        <dia:point val="31.1328,20.8"/>
+        <dia:point val="36.524,20.8"/>
+        <dia:point val="36.524,23.68"/>
+        <dia:point val="34.7305,23.68"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="line_width">
+        <dia:real val="0.1"/>
+      </dia:attribute>
+      <dia:attribute name="start_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="start_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="start_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O1" connection="6"/>
+        <dia:connection handle="1" to="O22" connection="9"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O24">
+      <dia:attribute name="obj_pos">
+        <dia:point val="25.4,18.45"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="20.5223,17.6;26.25,26.945"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="25.4,18.45"/>
+        <dia:point val="23.374,18.45"/>
+        <dia:point val="23.374,26.095"/>
+        <dia:point val="21.3723,26.095"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="line_width">
+        <dia:real val="0.1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O1" connection="14"/>
+        <dia:connection handle="1" to="O21" connection="4"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O25">
+      <dia:attribute name="obj_pos">
+        <dia:point val="8.7,13.85"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="6.77403,13;16.9743,26.245"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="8.7,13.85"/>
+        <dia:point val="7.62403,13.85"/>
+        <dia:point val="7.62403,23.5"/>
+        <dia:point val="16.1243,23.5"/>
+        <dia:point val="16.1243,25.395"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O0" connection="16"/>
+        <dia:connection handle="1" to="O21" connection="1"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O26">
+      <dia:attribute name="obj_pos">
+        <dia:point val="21.3723,29.695"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="20.5223,26.985;24.9853,30.545"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="21.3723,29.695"/>
+        <dia:point val="22.4233,29.695"/>
+        <dia:point val="22.4233,27.835"/>
+        <dia:point val="24.1353,27.835"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O21" connection="15"/>
+        <dia:connection handle="1" to="O13" connection="3"/>
+      </dia:connections>
+    </dia:object>
+    <dia:object type="Standard - ZigZagLine" version="0" id="O27">
+      <dia:attribute name="obj_pos">
+        <dia:point val="25.2041,24.48"/>
+      </dia:attribute>
+      <dia:attribute name="obj_bb">
+        <dia:rectangle val="20.5223,23.63;26.0541,26.945"/>
+      </dia:attribute>
+      <dia:attribute name="orth_points">
+        <dia:point val="25.2041,24.48"/>
+        <dia:point val="24.1233,24.48"/>
+        <dia:point val="24.1233,26.095"/>
+        <dia:point val="21.3723,26.095"/>
+      </dia:attribute>
+      <dia:attribute name="orth_orient">
+        <dia:enum val="0"/>
+        <dia:enum val="1"/>
+        <dia:enum val="0"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow">
+        <dia:enum val="1"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_length">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:attribute name="end_arrow_width">
+        <dia:real val="0.8"/>
+      </dia:attribute>
+      <dia:connections>
+        <dia:connection handle="0" to="O22" connection="10"/>
+        <dia:connection handle="1" to="O21" connection="4"/>
+      </dia:connections>
+    </dia:object>
+  </dia:layer>
+</dia:diagram>
diff --git a/vars-non-US b/vars-non-US
new file mode 100644 (file)
index 0000000..5e00637
--- /dev/null
@@ -0,0 +1,19 @@
+# locations used by many scripts
+
+nonushome=/org/non-us.debian.org
+ftpdir=$nonushome/ftp
+indices=$ftpdir/indices-non-US
+archs="alpha arm hppa hurd-i386 i386 m68k powerpc sparc mips mipsel sh"
+
+masterdir=$nonushome/katie
+overridedir=$nonushome/scripts/override
+incoming=$nonushome/incoming
+
+packagesfiles=packagesfiles-non-US
+sourcesfiles=sourcesfiles-non-US
+contentsfiles=contentsfiles-non-US
+
+copyoverrides="potato potato.contrib potato.non-free woody woody.contrib woody.non-free"
+
+PATH=$masterdir:$PATH
+umask 022