X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Finit_dirs.py;h=347945a3e8c037ac6a0d428b5a798592e8e69a7b;hb=519c1dbf89c13557afc15a429164616ac563d379;hp=82be3463ef6810bd2dd0c23f6d345d8b4b94d2cc;hpb=7aaaad3135c9164390af5897925660842368660b;p=dak.git diff --git a/dak/init_dirs.py b/dak/init_dirs.py index 82be3463..347945a3 100755 --- a/dak/init_dirs.py +++ b/dak/init_dirs.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Initial setup of an archive +"""Initial setup of an archive.""" # Copyright (C) 2002, 2004, 2006 James Troup # This program is free software; you can redistribute it and/or modify @@ -21,16 +21,18 @@ import os, sys import apt_pkg -import dak.lib.utils as utils +from daklib import utils +from daklib.dbconn import * ################################################################################ Cnf = None -AptCnf = None ################################################################################ def usage(exit_code=0): + """Print a usage message and exit with 'exit_code'.""" + print """Usage: dak init-dirs Creates directories for an archive based on dak.conf configuration file. @@ -40,80 +42,151 @@ Creates directories for an archive based on dak.conf configuration file. ################################################################################ def do_dir(target, config_name): + """If 'target' exists, make sure it is a directory. If it doesn't, create +it.""" + if os.path.exists(target): if not os.path.isdir(target): - utils.fubar("%s (%s) is not a directory." % (target, config_name)) + utils.fubar("%s (%s) is not a directory." + % (target, config_name)) else: print "Creating %s ..." % (target) os.makedirs(target) def process_file(config, config_name): + """Create directories for a config entry that's a filename.""" + if config.has_key(config_name): target = os.path.dirname(config[config_name]) do_dir(target, config_name) def process_tree(config, tree): - for entry in config.SubTree(tree).List(): + """Create directories for a config tree.""" + + for entry in config.subtree(tree).list(): entry = entry.lower() - if tree == "Dir": - if entry in [ "poolroot", "queue" , "morguereject" ]: - continue config_name = "%s::%s" % (tree, entry) target = config[config_name] do_dir(target, config_name) def process_morguesubdir(subdir): + """Create directories for morgue sub directories.""" + config_name = "%s::MorgueSubDir" % (subdir) if Cnf.has_key(config_name): target = os.path.join(Cnf["Dir::Morgue"], Cnf[config_name]) do_dir(target, config_name) +def process_keyring(fullpath, secret=False): + """Create empty keyring if necessary.""" + + if os.path.exists(fullpath): + return + + keydir = os.path.dirname(fullpath) + + if not os.path.isdir(keydir): + print "Creating %s ..." % (keydir) + os.makedirs(keydir) + if secret: + # Make sure secret keyring directories are 0700 + os.chmod(keydir, 0o700) + + # Touch the file + print "Creating %s ..." % (fullpath) + file(fullpath, 'w') + if secret: + os.chmod(fullpath, 0o600) + else: + os.chmod(fullpath, 0o644) + ###################################################################### def create_directories(): - # Process directories from apt.conf + """Create directories referenced in dak.conf.""" + + session = DBConn().session() + + # Process directories from dak.conf process_tree(Cnf, "Dir") - process_tree(Cnf, "Dir::Queue") - for file in [ "Dinstall::LockFile", "Rm::LogFile", "Import-Archive::ExportDir" ]: - process_file(Cnf, file) + + # Hardcode creation of the unchecked directory + if Cnf.has_key("Dir::Base"): + do_dir(os.path.join(Cnf["Dir::Base"], "queue", "unchecked"), 'unchecked directory') + + # Process queue directories + for queue in session.query(PolicyQueue): + do_dir(queue.path, '%s queue' % queue.queue_name) + # If we're doing the NEW queue, make sure it has a COMMENTS directory + if queue.queue_name == 'new': + do_dir(os.path.join(queue.path, "COMMENTS"), '%s queue comments' % queue.queue_name) + + for config_name in [ "Rm::LogFile", + "Import-Archive::ExportDir" ]: + process_file(Cnf, config_name) + for subdir in [ "Clean-Queues", "Clean-Suites" ]: process_morguesubdir(subdir) - # Process directories from apt.conf - process_tree(AptCnf, "Dir") - for tree in AptCnf.SubTree("Tree").List(): - config_name = "Tree::%s" % (tree) - tree_dir = os.path.join(Cnf["Dir::Root"], tree) - do_dir(tree_dir, tree) - for file in [ "FileList", "SourceFileList" ]: - process_file(AptCnf, "%s::%s" % (config_name, file)) - for component in AptCnf["%s::Sections" % (config_name)].split(): - for architecture in AptCnf["%s::Architectures" % (config_name)].split(): - if architecture != "source": - architecture = "binary-"+architecture - target = os.path.join(tree_dir,component,architecture) - do_dir(target, "%s, %s, %s" % (tree, component, architecture)) + suite_suffix = "%s" % (Cnf.find("Dinstall::SuiteSuffix")) + + # Process secret keyrings + if Cnf.has_key('Dinstall::SigningKeyring'): + process_keyring(Cnf['Dinstall::SigningKeyring'], secret=True) + + if Cnf.has_key('Dinstall::SigningPubKeyring'): + process_keyring(Cnf['Dinstall::SigningPubKeyring'], secret=True) + + # Process public keyrings + for keyring in session.query(Keyring).filter_by(active=True): + process_keyring(keyring.keyring_name) + + # Process dists directories + # TODO: Store location of each suite in database + for suite in session.query(Suite): + suite_dir = os.path.join(suite.archive.path, 'dists', suite.suite_name, suite_suffix) + # TODO: Store valid suite/component mappings in database + for component in session.query(Component): + component_name = component.component_name + + sc_dir = os.path.join(suite_dir, component_name) + + do_dir(sc_dir, "%s/%s" % (suite.suite_name, component_name)) + + for arch in suite.architectures: + if arch.arch_string == 'source': + arch_string = 'source' + else: + arch_string = 'binary-%s' % arch.arch_string + + suite_arch_dir = os.path.join(sc_dir, arch_string) + + do_dir(suite_arch_dir, "%s/%s/%s" % (suite.suite_name, component_name, arch_string)) ################################################################################ def main (): - global AptCnf, Cnf, projectB + """Initial setup of an archive.""" + + global Cnf Cnf = utils.get_conf() - Arguments = [('h',"help","Init-Dirs::Options::Help")] + arguments = [('h', "help", "Init-Dirs::Options::Help")] for i in [ "help" ]: - if not Cnf.has_key("Init-Dirs::Options::%s" % (i)): - Cnf["Init-Dirs::Options::%s" % (i)] = "" + if not Cnf.has_key("Init-Dirs::Options::%s" % (i)): + Cnf["Init-Dirs::Options::%s" % (i)] = "" - apt_pkg.ParseCommandLine(Cnf, Arguments, sys.argv) + d = DBConn() - Options = Cnf.SubTree("Init-Dirs::Options") - if Options["Help"]: - usage() + arguments = apt_pkg.parse_commandline(Cnf, arguments, sys.argv) - AptCnf = apt_pkg.newConfiguration() - apt_pkg.ReadConfigFileISC(AptCnf,utils.which_apt_conf_file()) + options = Cnf.subtree("Init-Dirs::Options") + if options["Help"]: + usage() + elif arguments: + utils.warn("dak init-dirs takes no arguments.") + usage(exit_code=1) create_directories() @@ -121,4 +194,3 @@ def main (): if __name__ == '__main__': main() -