diff -u --recursive roundup-0.8.3-vanilla/roundup/admin.py roundup-0.8.3/roundup/admin.py
--- roundup-0.8.3-vanilla/roundup/admin.py	2005-05-02 01:12:29.000000000 -0500
+++ roundup-0.8.3/roundup/admin.py	2005-07-11 21:05:47.000000000 -0500
@@ -341,7 +341,7 @@
         print _('Back ends:'), ', '.join(backends)
 
     def do_install(self, tracker_home, args):
-        ""'''Usage: install [template [backend [admin password]]]
+        ""'''Usage: install [template [backend [admin password [key=val[,key=val]]]]]
         Install a new Roundup tracker.
 
         The command will prompt for the tracker home directory
@@ -402,8 +402,15 @@
                 backend = 'anydbm'
         # XXX perform a unit test based on the user's selections
 
+        # Process configuration file definitions
+        defns = {}
+        deflist = len(args) > 3 and args[3].split(',') or []
+        for defn in deflist:
+            k, v = defn.split('=')
+            defns[k] = v 
+
         # install!
-        init.install(tracker_home, templates[template]['path'])
+        init.install(tracker_home, templates[template]['path'], defns)
         init.write_select_db(tracker_home, backend)
 
         print _("""
@@ -413,7 +420,7 @@
         # find list of options that need manual adjustments
         # XXX config._get_unset_options() is marked as private
         #   (leading underscore).  make it public or don't care?
-        need_set = CoreConfig(tracker_home)._get_unset_options()
+        need_set = CoreConfig(defns, tracker_home)._get_unset_options()
         if need_set:
             print _(" ... at a minimum, you must set following options:")
             for section, options in need_set.items():
diff -u --recursive roundup-0.8.3-vanilla/roundup/configuration.py roundup-0.8.3/roundup/configuration.py
--- roundup-0.8.3-vanilla/roundup/configuration.py	2005-02-13 20:55:30.000000000 -0600
+++ roundup-0.8.3/roundup/configuration.py	2005-07-12 20:42:13.000000000 -0500
@@ -391,201 +391,209 @@
 # setting, default, [description, [aliases]]
 # Note: aliases should only exist in historical options for backwards
 # compatibility - new options should *not* have aliases!
-SETTINGS = (
-    ("main", (
-        (FilePathOption, "database", "db", "Database directory path."),
-        (FilePathOption, "templates", "html",
-            "Path to the HTML templates directory."),
-        (NullableFilePathOption, "static_files", "",
-            "Path to directory holding additional static files\n"
-            "available via Web UI.  This directory may contain\n"
-            "sitewide images, CSS stylesheets etc. and is searched\n"
-            "for these files prior to the TEMPLATES directory\n"
-            "specified above.  If this option is not set, all static\n"
-            "files are taken from the TEMPLATES directory"),
-        (MailAddressOption, "admin_email", "roundup-admin",
-            "Email address that roundup will complain to"
-            " if it runs into trouble."),
-        (MailAddressOption, "dispatcher_email", "roundup-admin",
-            "The 'dispatcher' is a role that can get notified\n"
-            "of new items to the database.\n"
-            "It is used by the ERROR_MESSAGES_TO config setting."),
-        (Option, "email_from_tag", "",
-            "Additional text to include in the \"name\" part\n"
-            "of the From: address used in nosy messages.\n"
-            "If the sending user is \"Foo Bar\", the From: line\n"
-            "is usually: \"Foo Bar\" <issue_tracker@tracker.example>\n"
-            "the EMAIL_FROM_TAG goes inside the \"Foo Bar\" quotes like so:\n"
-            "\"Foo Bar EMAIL_FROM_TAG\" <issue_tracker@tracker.example>"),
-        (Option, "new_web_user_roles", "User",
-            "Roles that a user gets when they register"
-            " with Web User Interface.\n"
-            "This is a comma-separated string of role names"
-            " (e.g. 'Admin,User')."),
-        (Option, "new_email_user_roles", "User",
-            "Roles that a user gets when they register"
-            " with Email Gateway.\n"
-            "This is a comma-separated string of role names"
-            " (e.g. 'Admin,User')."),
-        (Option, "error_messages_to", "user",
-            # XXX This description needs better wording,
-            #   with explicit allowed values list.
-            "Send error message emails to the dispatcher, user, or both?\n"
-            "The dispatcher is configured using the DISPATCHER_EMAIL"
-            " setting."),
-        (Option, "html_version", "html4",
-            "HTML version to generate. The templates are html4 by default.\n"
-            "If you wish to make them xhtml, then you'll need to change this\n"
-            "var to 'xhtml' too so all auto-generated HTML is compliant.\n"
-            "Allowed values: html4, xhtml"),
-        # It seems to me that all timezone offsets in the modern world
-        # are integral hours.  However, there were fractional hour offsets
-        # in the past.  Use float number for sure.
-        (FloatNumberOption, "timezone", "0",
-            "Numeric timezone offset used when users do not choose their own\n"
-            "in their settings.",
-            ["DEFAULT_TIMEZONE"]),
-        (BooleanOption, "instant_registration", "no",
-            "Register new users instantly, or require confirmation via\n"
-            "email?"),
-    )),
-    ("tracker", (
-        (Option, "name", "Roundup issue tracker",
-            "A descriptive name for your roundup instance."),
-        (Option, "web", NODEFAULT,
-            "The web address that the tracker is viewable at.\n"
-            "This will be included in information"
-            " sent to users of the tracker.\n"
-            "The URL MUST include the cgi-bin part or anything else\n"
-            "that is required to get to the home page of the tracker.\n"
-            "You MUST include a trailing '/' in the URL."),
-        (MailAddressOption, "email", "issue_tracker",
-            "Email address that mail to roundup should go to."),
-        (NullableOption, "language", "",
-            "Default locale name for this tracker.\n"
-            "If this option is not set, the language is determined\n"
-            "by OS environment variable LANGUAGE, LC_ALL, LC_MESSAGES,\n"
-            "or LANG, in that order of preference."),
-    )),
-    ("rdbms", (
-        (Option, 'name', 'roundup',
-            "Name of the database to use.",
-            ['MYSQL_DBNAME']),
-        (NullableOption, 'host', 'localhost',
-            "Database server host.",
-            ['MYSQL_DBHOST']),
-        (NullableOption, 'port', '',
-            "TCP port number of the database server.\n"
-            "Postgresql usually resides on port 5432 (if any),\n"
-            "for MySQL default port number is 3306.\n"
-            "Leave this option empty to use backend default"),
-        (NullableOption, 'user', 'roundup',
-            "Database user name that Roundup should use.",
-            ['MYSQL_DBUSER']),
-        (NullableOption, 'password', 'roundup',
-            "Database user password.",
-            ['MYSQL_DBPASSWORD']),
-        (NullableOption, 'read_default_file', '~/.my.cnf',
-            "Name of the MySQL defaults file.\n"
-            "Only used in MySQL connections."),
-        (NullableOption, 'read_default_group', 'roundup',
-            "Name of the group to use in the MySQL defaults file (.my.cnf).\n"
-            "Only used in MySQL connections."),
-    ), "Settings in this section are used"
-        " by Postgresql and MySQL backends only"
-    ),
-    ("logging", (
-        (FilePathOption, "config", "",
-            "Path to configuration file for standard Python logging module.\n"
-            "If this option is set, logging configuration is loaded\n"
-            "from specified file; options 'filename' and 'level'\n"
-            "in this section are ignored."),
-        (FilePathOption, "filename", "",
-            "Log file name for minimal logging facility built into Roundup.\n"
-            "If no file name specified, log messages are written on stderr.\n"
-            "If above 'config' option is set, this option has no effect."),
-        (Option, "level", "ERROR",
-            "Minimal severity level of messages written to log file.\n"
-            "If above 'config' option is set, this option has no effect.\n"
-            "Allowed values: DEBUG, INFO, WARNING, ERROR"),
-    )),
-    ("mail", (
-        (Option, "domain", NODEFAULT, "Domain name used for email addresses."),
-        (Option, "host", NODEFAULT,
-            "SMTP mail host that roundup will use to send mail",
-            ["MAILHOST"],),
-        (Option, "username", "", "SMTP login name.\n"
-            "Set this if your mail host requires authenticated access.\n"
-            "If username is not empty, password (below) MUST be set!"),
-        (Option, "password", NODEFAULT, "SMTP login password.\n"
-            "Set this if your mail host requires authenticated access."),
-        (BooleanOption, "tls", "no",
-            "If your SMTP mail host provides or requires TLS\n"
-            "(Transport Layer Security) then set this option to 'yes'."),
-        (NullableFilePathOption, "tls_keyfile", "",
-            "If TLS is used, you may set this option to the name\n"
-            "of a PEM formatted file that contains your private key."),
-        (NullableFilePathOption, "tls_certfile", "",
-            "If TLS is used, you may set this option to the name\n"
-            "of a PEM formatted certificate chain file."),
-        (Option, "charset", "utf-8",
-            "Character set to encode email headers with.\n"
-            "We use utf-8 by default, as it's the most flexible.\n"
-            "Some mail readers (eg. Eudora) can't cope with that,\n"
-            "so you might need to specify a more limited character set\n"
-            "(eg. iso-8859-1).",
-            ["EMAIL_CHARSET"]),
-        (FilePathOption, "debug", "",
-            "Setting this option makes Roundup to write all outgoing email\n"
-            "messages to this file *instead* of sending them.\n"
-            "This option has the same effect as environment variable"
-            " SENDMAILDEBUG.\nEnvironment variable takes precedence."),
-    ), "Outgoing email options.\nUsed for nozy messages and approval requests"),
-    ("mailgw", (
-        (BooleanOption, "keep_quoted_text", "yes",
-            "Keep email citations when accepting messages.\n"
-            "Setting this to \"no\" strips out \"quoted\" text"
-            " from the message.\n"
-            "Signatures are also stripped.",
-            ["EMAIL_KEEP_QUOTED_TEXT"]),
-        (BooleanOption, "leave_body_unchanged", "no",
-            "Preserve the email body as is - that is,\n"
-            "keep the citations _and_ signatures.",
-            ["EMAIL_LEAVE_BODY_UNCHANGED"]),
-        (Option, "default_class", "issue",
-            "Default class to use in the mailgw\n"
-            "if one isn't supplied in email subjects.\n"
-            "To disable, leave the value blank.",
-            ["MAIL_DEFAULT_CLASS"]),
-        (NullableOption, "language", "",
-            "Default locale name for the tracker mail gateway.\n"
-            "If this option is not set, mail gateway will use\n"
-            "the language of the tracker instance."),
-    ), "Roundup Mail Gateway options"),
-    ("nosy", (
-        (RunDetectorOption, "messages_to_author", "no",
-            "Send nosy messages to the author of the message.",
-            ["MESSAGES_TO_AUTHOR"]),
-        (Option, "signature_position", "bottom",
-            "Where to place the email signature.\n"
-            "Allowed values: top, bottom, none",
-            ["EMAIL_SIGNATURE_POSITION"]),
-        (RunDetectorOption, "add_author", "new",
-            "Does the author of a message get placed on the nosy list\n"
-            "automatically?  If 'new' is used, then the author will\n"
-            "only be added when a message creates a new issue.\n"
-            "If 'yes', then the author will be added on followups too.\n"
-            "If 'no', they're never added to the nosy.\n",
-            ["ADD_AUTHOR_TO_NOSY"]),
-        (RunDetectorOption, "add_recipients", "new",
-            "Do the recipients (To:, Cc:) of a message get placed on the\n"
-            "nosy list?  If 'new' is used, then the recipients will\n"
-            "only be added when a message creates a new issue.\n"
-            "If 'yes', then the recipients will be added on followups too.\n"
-            "If 'no', they're never added to the nosy.\n",
-            ["ADD_RECIPIENTS_TO_NOSY"]),
-    ), "Nosy messages sending"),
-)
+def settings(defns):
+     return (
+        ("main", (
+            (FilePathOption, "database", "db", "Database directory path."),
+            (FilePathOption, "templates", "html",
+                "Path to the HTML templates directory."),
+            (NullableFilePathOption, "static_files", "",
+                "Path to directory holding additional static files\n"
+                "available via Web UI.  This directory may contain\n"
+                "sitewide images, CSS stylesheets etc. and is searched\n"
+                "for these files prior to the TEMPLATES directory\n"
+                "specified above.  If this option is not set, all static\n"
+                "files are taken from the TEMPLATES directory"),
+            (MailAddressOption, "admin_email", "roundup-admin",
+                "Email address that roundup will complain to"
+                " if it runs into trouble."),
+            (MailAddressOption, "dispatcher_email", "roundup-admin",
+                "The 'dispatcher' is a role that can get notified\n"
+                "of new items to the database.\n"
+                "It is used by the ERROR_MESSAGES_TO config setting."),
+            (Option, "email_from_tag", "",
+                "Additional text to include in the \"name\" part\n"
+                "of the From: address used in nosy messages.\n"
+                "If the sending user is \"Foo Bar\", the From: line\n"
+                "is usually: \"Foo Bar\" <issue_tracker@tracker.example>\n"
+                "the EMAIL_FROM_TAG goes inside the \"Foo Bar\" quotes like so:\n"
+                "\"Foo Bar EMAIL_FROM_TAG\" <issue_tracker@tracker.example>"),
+            (Option, "new_web_user_roles", "User",
+                "Roles that a user gets when they register"
+                " with Web User Interface.\n"
+                "This is a comma-separated string of role names"
+                " (e.g. 'Admin,User')."),
+            (Option, "new_email_user_roles", "User",
+                "Roles that a user gets when they register"
+                " with Email Gateway.\n"
+                "This is a comma-separated string of role names"
+                " (e.g. 'Admin,User')."),
+            (Option, "error_messages_to", "user",
+                # XXX This description needs better wording,
+                #   with explicit allowed values list.
+                "Send error message emails to the dispatcher, user, or both?\n"
+                "The dispatcher is configured using the DISPATCHER_EMAIL"
+                " setting."),
+            (Option, "html_version", "html4",
+                "HTML version to generate. The templates are html4 by default.\n"
+                "If you wish to make them xhtml, then you'll need to change this\n"
+                "var to 'xhtml' too so all auto-generated HTML is compliant.\n"
+                "Allowed values: html4, xhtml"),
+            # It seems to me that all timezone offsets in the modern world
+            # are integral hours.  However, there were fractional hour offsets
+            # in the past.  Use float number for sure.
+            (FloatNumberOption, "timezone", "0",
+                "Numeric timezone offset used when users do not choose their own\n"
+                "in their settings.",
+                ["DEFAULT_TIMEZONE"]),
+            (BooleanOption, "instant_registration", "no",
+                "Register new users instantly, or require confirmation via\n"
+                "email?"),
+        )),
+        ("tracker", (
+            (Option, "name", "Roundup issue tracker",
+                "A descriptive name for your roundup instance."),
+            (Option, "web", defns.has_key("tracker.web")
+                            and defns["tracker.web"] or NODEFAULT,
+                "The web address that the tracker is viewable at.\n"
+                "This will be included in information"
+                " sent to users of the tracker.\n"
+                "The URL MUST include the cgi-bin part or anything else\n"
+                "that is required to get to the home page of the tracker.\n"
+                "You MUST include a trailing '/' in the URL."),
+            (MailAddressOption, "email", "issue_tracker",
+                "Email address that mail to roundup should go to."),
+            (NullableOption, "language", "",
+                "Default locale name for this tracker.\n"
+                "If this option is not set, the language is determined\n"
+                "by OS environment variable LANGUAGE, LC_ALL, LC_MESSAGES,\n"
+                "or LANG, in that order of preference."),
+        )),
+        ("rdbms", (
+            (Option, 'name', 'roundup',
+                "Name of the database to use.",
+                ['MYSQL_DBNAME']),
+            (NullableOption, 'host', 'localhost',
+                "Database server host.",
+                ['MYSQL_DBHOST']),
+            (NullableOption, 'port', '',
+                "TCP port number of the database server.\n"
+                "Postgresql usually resides on port 5432 (if any),\n"
+                "for MySQL default port number is 3306.\n"
+                "Leave this option empty to use backend default"),
+            (NullableOption, 'user', 'roundup',
+                "Database user name that Roundup should use.",
+                ['MYSQL_DBUSER']),
+            (NullableOption, 'password', defns.has_key('rdbms.password')
+                                         and defns['rdbms.password']
+                                         or 'roundup',
+                "Database user password.",
+                ['MYSQL_DBPASSWORD']),
+            (NullableOption, 'read_default_file', '~/.my.cnf',
+                "Name of the MySQL defaults file.\n"
+                "Only used in MySQL connections."),
+            (NullableOption, 'read_default_group', 'roundup',
+                "Name of the group to use in the MySQL defaults file (.my.cnf).\n"
+                "Only used in MySQL connections."),
+        ), "Settings in this section are used"
+            " by Postgresql and MySQL backends only"
+        ),
+        ("logging", (
+            (FilePathOption, "config", "",
+                "Path to configuration file for standard Python logging module.\n"
+                "If this option is set, logging configuration is loaded\n"
+                "from specified file; options 'filename' and 'level'\n"
+                "in this section are ignored."),
+            (FilePathOption, "filename", "",
+                "Log file name for minimal logging facility built into Roundup.\n"
+                "If no file name specified, log messages are written on stderr.\n"
+                "If above 'config' option is set, this option has no effect."),
+            (Option, "level", "ERROR",
+                "Minimal severity level of messages written to log file.\n"
+                "If above 'config' option is set, this option has no effect.\n"
+                "Allowed values: DEBUG, INFO, WARNING, ERROR"),
+        )),
+        ("mail", (
+            (Option, "domain", defns.has_key("mail.domain")
+                               and defns["mail.domain"] or NODEFAULT,
+                "Domain name used for email addresses."),
+            (Option, "host", defns.has_key("mail.host")
+                             and defns["mail.host"] or NODEFAULT,
+                "SMTP mail host that roundup will use to send mail",
+                ["MAILHOST"],),
+            (Option, "username", "", "SMTP login name.\n"
+                "Set this if your mail host requires authenticated access.\n"
+                "If username is not empty, password (below) MUST be set!"),
+            (Option, "password", defns.has_key("mail.password")
+                                 and defns["mail.password"] or NODEFAULT,
+                "Set this if your mail host requires authenticated access."),
+            (BooleanOption, "tls", "no",
+                "If your SMTP mail host provides or requires TLS\n"
+                "(Transport Layer Security) then set this option to 'yes'."),
+            (NullableFilePathOption, "tls_keyfile", "",
+                "If TLS is used, you may set this option to the name\n"
+                "of a PEM formatted file that contains your private key."),
+            (NullableFilePathOption, "tls_certfile", "",
+                "If TLS is used, you may set this option to the name\n"
+                "of a PEM formatted certificate chain file."),
+            (Option, "charset", "utf-8",
+                "Character set to encode email headers with.\n"
+                "We use utf-8 by default, as it's the most flexible.\n"
+                "Some mail readers (eg. Eudora) can't cope with that,\n"
+                "so you might need to specify a more limited character set\n"
+                "(eg. iso-8859-1).",
+                ["EMAIL_CHARSET"]),
+            (FilePathOption, "debug", "",
+                "Setting this option makes Roundup to write all outgoing email\n"
+                "messages to this file *instead* of sending them.\n"
+                "This option has the same effect as environment variable"
+                " SENDMAILDEBUG.\nEnvironment variable takes precedence."),
+        ), "Outgoing email options.\nUsed for nozy messages and approval requests"),
+        ("mailgw", (
+            (BooleanOption, "keep_quoted_text", "yes",
+                "Keep email citations when accepting messages.\n"
+                "Setting this to \"no\" strips out \"quoted\" text"
+                " from the message.\n"
+                "Signatures are also stripped.",
+                ["EMAIL_KEEP_QUOTED_TEXT"]),
+            (BooleanOption, "leave_body_unchanged", "no",
+                "Preserve the email body as is - that is,\n"
+                "keep the citations _and_ signatures.",
+                ["EMAIL_LEAVE_BODY_UNCHANGED"]),
+            (Option, "default_class", "issue",
+                "Default class to use in the mailgw\n"
+                "if one isn't supplied in email subjects.\n"
+                "To disable, leave the value blank.",
+                ["MAIL_DEFAULT_CLASS"]),
+            (NullableOption, "language", "",
+                "Default locale name for the tracker mail gateway.\n"
+                "If this option is not set, mail gateway will use\n"
+                "the language of the tracker instance."),
+        ), "Roundup Mail Gateway options"),
+        ("nosy", (
+            (RunDetectorOption, "messages_to_author", "no",
+                "Send nosy messages to the author of the message.",
+                ["MESSAGES_TO_AUTHOR"]),
+            (Option, "signature_position", "bottom",
+                "Where to place the email signature.\n"
+                "Allowed values: top, bottom, none",
+                ["EMAIL_SIGNATURE_POSITION"]),
+            (RunDetectorOption, "add_author", "new",
+                "Does the author of a message get placed on the nosy list\n"
+                "automatically?  If 'new' is used, then the author will\n"
+                "only be added when a message creates a new issue.\n"
+                "If 'yes', then the author will be added on followups too.\n"
+                "If 'no', they're never added to the nosy.\n",
+                ["ADD_AUTHOR_TO_NOSY"]),
+            (RunDetectorOption, "add_recipients", "new",
+                "Do the recipients (To:, Cc:) of a message get placed on the\n"
+                "nosy list?  If 'new' is used, then the recipients will\n"
+                "only be added when a message creates a new issue.\n"
+                "If 'yes', then the recipients will be added on followups too.\n"
+                "If 'no', they're never added to the nosy.\n",
+                ["ADD_RECIPIENTS_TO_NOSY"]),
+        ), "Nosy messages sending"),
+    )
 
 ### Configuration classes
 
@@ -1033,8 +1041,8 @@
     ext = None
     detectors = None
 
-    def __init__(self, home_dir=None):
-        Config.__init__(self, home_dir, SETTINGS)
+    def __init__(self, defns=None, home_dir=None):
+        Config.__init__(self, home_dir, settings(defns or {}))
         # load the config if home_dir given
         if home_dir is None:
             self.init_logging()
diff -u --recursive roundup-0.8.3-vanilla/roundup/init.py roundup-0.8.3/roundup/init.py
--- roundup-0.8.3-vanilla/roundup/init.py	2005-01-02 20:53:03.000000000 -0600
+++ roundup-0.8.3/roundup/init.py	2005-07-11 21:00:42.000000000 -0500
@@ -55,7 +55,7 @@
         else:
             install_util.copyDigestedFile(srcname, dstname)
 
-def install(instance_home, template):
+def install(instance_home, template, defns):
     '''Install an instance using the named template and backend.
 
     'instance_home'
@@ -99,7 +99,7 @@
     # installed from the template, write default config text
     config_ini_file = os.path.join(instance_home, CoreConfig.INI_FILE)
     if not os.path.isfile(config_ini_file):
-        config = CoreConfig()
+        config = CoreConfig(defns)
         config.save(config_ini_file)
 
 
diff -u --recursive roundup-0.8.3-vanilla/roundup/instance.py roundup-0.8.3/roundup/instance.py
--- roundup-0.8.3-vanilla/roundup/instance.py	2005-01-02 20:53:03.000000000 -0600
+++ roundup-0.8.3/roundup/instance.py	2005-07-12 20:38:18.000000000 -0500
@@ -45,7 +45,7 @@
         """
         self.tracker_home = tracker_home
         self.optimize = optimize
-        self.config = configuration.CoreConfig(tracker_home)
+        self.config = configuration.CoreConfig(None, tracker_home)
         self.cgi_actions = {}
         self.templating_utils = {}
         self.load_interfaces()
@@ -225,7 +225,7 @@
                     'Required tracker attribute "%s" missing'%required
 
         # load and apply the config
-        tracker.config = configuration.CoreConfig(tracker_home)
+        tracker.config = configuration.CoreConfig(None, tracker_home)
         tracker.dbinit.config = tracker.config
 
         tracker.optimize = optimize

 	  	 
