#!/usr/bin/env python
-# Initial setup of an archive
-# Copyright (C) 2002, 2004 James Troup <james@nocrew.org>
-# $Id: rose,v 1.4 2004-03-11 00:20:51 troup Exp $
+"""Initial setup of an archive."""
+# Copyright (C) 2002, 2004, 2006 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
################################################################################
import os, sys
-import utils
import apt_pkg
+from daklib import utils
+from daklib.dbconn import *
################################################################################
Cnf = None
-AptCnf = None
################################################################################
def usage(exit_code=0):
- print """Usage: rose
-Creates directories for an archive based on katie.conf configuration file.
+ """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.
-h, --help show this help and exit."""
sys.exit(exit_code)
################################################################################
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):
+ """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, 0700)
+
+ # Touch the file
+ print "Creating %s ..." % (fullpath)
+ file(fullpath, 'w')
+ if secret:
+ os.chmod(fullpath, 0600)
+ else:
+ os.chmod(fullpath, 0644)
+
######################################################################
def create_directories():
- # Process directories from apt.conf
+ """Create directories referenced in dak.conf and apt.conf."""
+
+ session = DBConn().session()
+
+ # Process directories from dak.conf
process_tree(Cnf, "Dir")
- process_tree(Cnf, "Dir::Queue")
- for file in [ "Dinstall::LockFile", "Melanie::LogFile", "Neve::ExportDir" ]:
- process_file(Cnf, file)
- for subdir in [ "Shania", "Rhona" ]:
+
+ # Process queue directories
+ for queue in session.query(PolicyQueue):
+ do_dir(queue.path, '%s queue' % 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).all():
+ process_keyring(keyring.keyring_name)
+
+ # Process pool directories
+ for component in session.query(Component):
+ directory = os.path.join( Cnf['Dir::Pool'], component.component_name )
+
+ do_dir(directory, '%s pool' % component.component_name)
+
+
+ # Process dists directories
+ # TODO: Store location of each suite in database
+ for suite in session.query(Suite):
+ suite_dir = os.path.join( Cnf['Dir::Root'], 'dists', "%s/%s" % (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","Rose::Options::Help")]
+ arguments = [('h', "help", "Init-Dirs::Options::Help")]
for i in [ "help" ]:
- if not Cnf.has_key("Rose::Options::%s" % (i)):
- Cnf["Rose::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("Rose::Options")
- if Options["Help"]:
- usage()
+ arguments = apt_pkg.ParseCommandLine(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()
if __name__ == '__main__':
main()
-