X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils.py;h=ebe3f9653c55544ffd4da24b840af25b76dfcbfe;hb=e0b8c1b28a727fa524933497011a7aa6039e8561;hp=814a21d80b8198b71064ba8c8fca7f0e085d2cdc;hpb=5fbc2d55d4ce38253dea48fd0a23f7a9fb38f3e4;p=dak.git diff --git a/utils.py b/utils.py index 814a21d8..ebe3f965 100644 --- a/utils.py +++ b/utils.py @@ -1,6 +1,6 @@ # Utility functions # Copyright (C) 2000, 2001 James Troup -# $Id: utils.py,v 1.31 2001-09-13 23:52:37 troup Exp $ +# $Id: utils.py,v 1.37 2002-01-19 18:58:07 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 @@ -16,7 +16,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -import commands, os, pwd, re, socket, shutil, stat, string, sys, tempfile +import commands, os, pwd, re, socket, shutil, stat, string, sys, tempfile, traceback import apt_pkg re_comments = re.compile(r"\#.*") @@ -29,6 +29,7 @@ re_issource = re.compile (r"(.+)_(.+?)\.(orig\.tar\.gz|diff\.gz|tar\.gz|dsc)"); re_single_line_field = re.compile(r"^(\S*)\s*:\s*(.*)"); re_multi_line_field = re.compile(r"^\s(.*)"); +re_taint_free = re.compile(r"^[-+\.\w]+$"); re_parse_maintainer = re.compile(r"^\s*(\S.*\S)\s*\<([^\> \t]+)\>"); @@ -44,14 +45,8 @@ send_mail_invalid_args_exc = "Both arguments are non-null."; sendmail_failed_exc = "Sendmail invocation failed"; tried_too_hard_exc = "Tried too hard to find a free filename."; -# Valid components; used by extract_component_from_section() because -# it doesn't know about Conf from it's caller. FIXME - -valid_components = { - "main": "", - "contrib": "", - "non-free": "" - }; +default_config = "/etc/katie/katie.conf"; +default_apt_config = "/etc/katie/apt.conf"; ###################################################################################### @@ -62,6 +57,10 @@ def open_file(filename, mode='r'): raise cant_open_exc, filename return f +def touch_file(filename): + fd = os.open(filename, os.O_RDONLY | os.O_CREAT); + os.close(fd); + ###################################################################################### # From reportbug @@ -84,18 +83,15 @@ def str_isnum (s): ###################################################################################### -# Prefix and components hardcoded into this like a good'un; need to unhardcod at some -# stage. [FIXME] - def extract_component_from_section(section): component = ""; if string.find(section, '/') != -1: component = string.split(section, '/')[0]; if string.lower(component) == "non-us" and string.count(section, '/') > 0: - s = string.split(section, '/')[1]; - if valid_components.has_key(s): # Avoid e.g. non-US/libs - component = string.split(section, '/')[0]+ '/' + string.split(section, '/')[1]; + s = component + '/' + string.split(section, '/')[1]; + if Cnf.has_key("Component::%s" % s): # Avoid e.g. non-US/libs + component = s; if string.lower(section) == "non-us": component = "non-US/main"; @@ -106,7 +102,7 @@ def extract_component_from_section(section): # Expand default component if component == "": - if valid_components.has_key(section): + if Cnf.has_key("Component::%s" % section): component = section; else: component = "main"; @@ -131,12 +127,12 @@ def extract_component_from_section(section): # "-----BEGIN PGP SIGNATURE-----". def parse_changes(filename, dsc_whitespace_rules): - changes_in = open_file(filename,'r'); + changes_in = open_file(filename); error = ""; changes = {}; lines = changes_in.readlines(); - if lines == []: + if not lines: raise changes_parse_error_exc, "[Empty changes file]"; # Reindex by line number so we can easily verify the format of @@ -160,13 +156,13 @@ def parse_changes(filename, dsc_whitespace_rules): if index > max(indices): raise invalid_dsc_format_exc, index; line = indexed_lines[index]; - if line[:24] != "-----BEGIN PGP SIGNATURE": + if string.find(line, "-----BEGIN PGP SIGNATURE") != 0: raise invalid_dsc_format_exc, index; inside_signature = 0; break; - if line[:24] == "-----BEGIN PGP SIGNATURE": + if string.find(line, "-----BEGIN PGP SIGNATURE") == 0: break; - if line[:29] == "-----BEGIN PGP SIGNED MESSAGE": + if string.find(line, "-----BEGIN PGP SIGNED MESSAGE") == 0: if dsc_whitespace_rules: inside_signature = 1; while index < max(indices) and line != "": @@ -269,9 +265,6 @@ def fix_maintainer (maintainer): # sendmail wrapper, takes _either_ a message string or a file as arguments def send_mail (message, filename): - #### FIXME, how do I get this out of Cnf in katie? - sendmail_command = "/usr/sbin/sendmail -odq -oi -t"; - # Sanity check arguments if message != "" and filename != "": raise send_mail_invalid_args_exc; @@ -284,7 +277,7 @@ def send_mail (message, filename): os.close (fd); # Invoke sendmail - (result, output) = commands.getstatusoutput("%s < %s" % (sendmail_command, filename)); + (result, output) = commands.getstatusoutput("%s < %s" % (Cnf["Dinstall::SendmailCommand"], filename)); if (result != 0): raise sendmail_failed_exc, output; @@ -354,42 +347,27 @@ def copy (src, dest, overwrite = 0): ###################################################################################### -# FIXME: this is inherently nasty. Can't put this mapping in a conf -# file because the conf file depends on the archive.. doh. Maybe an -# archive independent conf file is needed. - def where_am_i (): res = socket.gethostbyaddr(socket.gethostname()); - if res[0] == 'pandora.debian.org': - return 'non-US'; - elif res[0] == 'auric.debian.org': - return 'ftp-master'; + database_hostname = Cnf.get("Config::" + res[0] + "::DatabaseHostname"); + if database_hostname: + return database_hostname; else: - raise unknown_hostname_exc, res; - -###################################################################################### - -# FIXME: this isn't great either. + return res[0]; def which_conf_file (): - archive = where_am_i (); - if archive == 'non-US': - return '/org/non-us.debian.org/katie/katie.conf-non-US'; - elif archive == 'ftp-master': - return '/org/ftp.debian.org/katie/katie.conf'; + res = socket.gethostbyaddr(socket.gethostname()); + if Cnf.get("Config::" + res[0] + "::KatieConfig"): + return Cnf["Config::" + res[0] + "::KatieConfig"] else: - raise unknown_hostname_exc, archive - -# FIXME: if the above isn't great, this can't be either :) + return default_config; def which_apt_conf_file (): - archive = where_am_i (); - if archive == 'non-US': - return '/org/non-us.debian.org/katie/apt.conf-non-US'; - elif archive == 'ftp-master': - return '/org/ftp.debian.org/katie/apt.conf'; + res = socket.gethostbyaddr(socket.gethostname()); + if Cnf.get("Config::" + res[0] + "::AptConfig"): + return Cnf["Config::" + res[0] + "::AptConfig"] else: - raise unknown_hostname_exc, archive + return default_apt_config; ###################################################################################### @@ -505,3 +483,29 @@ def find_next_free (dest, too_many=100): return dest; ################################################################################ + +def result_join (original, sep = '\t'): + list = []; + for i in xrange(len(original)): + if original[i] == None: + list.append(""); + else: + list.append(original[i]); + return string.join(list, sep); + +################################################################################ + +def get_conf(): + return Cnf; + +################################################################################ + +apt_pkg.init() + +Cnf = apt_pkg.newConfiguration(); +apt_pkg.ReadConfigFileISC(Cnf,default_config); + +if which_conf_file() != default_config: + apt_pkg.ReadConfigFileISC(Cnf,which_conf_file()) + +################################################################################