--- /dev/null
+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
--- /dev/null
+-- 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;
--- /dev/null
+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 "";
+};
--- /dev/null
+#!/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()
+
--- /dev/null
+#!/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()
+
--- /dev/null
+#!/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()
--- /dev/null
+#!/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()
+
--- /dev/null
+#!/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."
--- /dev/null
+#!/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
--- /dev/null
+#!/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()
+
--- /dev/null
+#!/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
--- /dev/null
+#!/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."
+
--- /dev/null
+#! /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
--- /dev/null
+#! /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.
--- /dev/null
+#! /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.
--- /dev/null
+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:
--- /dev/null
+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.
--- /dev/null
+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.
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+#!/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()
+
--- /dev/null
+#!/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()
+
--- /dev/null
+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"
+ };
+
+}
--- /dev/null
+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";
+ };
+
+};
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+#!/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 $!;
--- /dev/null
+<?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>
--- /dev/null
+# 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