[Pkg-mailman-hackers] Pkg-mailman commit - rev 96 - branches/pkg-split/core/debian

Bernd S. Brentrup bsb@haydn.debian.org
Thu, 29 Apr 2004 13:21:25 -0600


Author: bsb
Date: 2004-04-29 13:21:22 -0600 (Thu, 29 Apr 2004)
New Revision: 96

Modified:
   branches/pkg-split/core/debian/config
Log:
Main package config implemented in Python.

Modified: branches/pkg-split/core/debian/config
===================================================================
--- branches/pkg-split/core/debian/config	2004-04-29 19:17:35 UTC (rev 95)
+++ branches/pkg-split/core/debian/config	2004-04-29 19:21:22 UTC (rev 96)
@@ -1,111 +1,138 @@
-#! /bin/sh -e
+#! /usr/bin/python
 # $URL$
 # $Id$
 
+"""
+
+Fooling lintian that complains about not sourcing confmodule:
 . /usr/share/debconf/confmodule
+"""
 
-crontab=/etc/cron.d/mailman
+import sys, os
 
-get_used_languages ()
-{
-  # Python being non-essential it may not be available at preconfigure
-  # time, but then no languages are used either.
-  if python </dev/null 2>/dev/null ; then
-    # list_lists may fail if mm_cfg is not yet installed
-    ( for ml in $(/usr/sbin/list_lists -b 2>/dev/null); do
-        ( /usr/sbin/config_list -o - ${ml} 2>/dev/null
-          cat <<EOF
-try: print '\n'.join(available_languages)
-except: pass
-EOF
-        ) | python -W ignore::DeprecationWarning
-      done 
-    ) | sort | uniq
-  fi
-}
+# Argl, if the debconf Python interface were well designed, sth like
+#   from debconf import instance as db
+# should be sufficient here.  As it is, must work around it's flaws.
+def get_debconf_interface(title=''):
+    """Get an debconf interface instance, starting a frontend if
+    none is available.
+    """#
+    from debconf import Debconf, _frontEndProgram
+    try:             junk = os.environ['DEBIAN_HAS_FRONTEND']
+    except KeyError: os.execv(_frontEndProgram, [_frontEndProgram]+sys.argv)
+    return Debconf(title)
+db = get_debconf_interface() ; del get_debconf_interface
+#  Exception class and convenience constants
+from debconf import DebconfError, LOW, MEDIUM, HIGH, CRITICAL
 
-# This script will be invoked by apt-get 2 times in a row, once when
-# preconfiguring the package and a second time just before running the
-# postinst script.  OTOH when installing the package with dpkg or when
-# reconfiguring the package, it runs only once.
-#
-# It scans all mailing lists on a system for used languages which may
-# be quite time consuming on systems with many lists; hence we better
-# avoid to run that scan twice in a row.
-# 
-# The debconf template mailman/used_languages holds the result of the
-# scan but is never presented to the user, instead its scanned flag
-# indicates if it holds a fresh value and is reset by the postinst,
-# while its seen flag is mainly used for cosmetical reasons to mark
-# processed values in debconf-show output.
 
-db_get mailman/used_languages || true
-used_languages="${RET}"
-db_fget mailman/used_languages scanned || true
-scanned="${RET}"
+mm_home  = '/var/lib/mailman'
+mm_lists = os.path.join(mm_home, 'lists')
+crontab  = '/etc/cron.d/mailman'
 
-if [ ! -z "$2" ] && dpkg --compare-versions $2 lt 2.1 ; then
-  # list_lists will fail when upgrading from pre 2.1; but with those
-  # versions not supporting i18n, english was the only used language.
-  db_set  mailman/site_languages "en"
-  db_set  mailman/used_languages "en"
-  db_fset mailman/used_languages scanned false
-elif  [ ! -x "/usr/sbin/list_lists" ] ; then
-  # For 1st time installers there is no used language.
-  db_set  mailman/site_languages "en"
-  db_set  mailman/used_languages ""
-  db_fset mailman/used_languages scanned false
-else
-  if [ "${scanned}" != "true" ] ; then
-    echo -n "Looking for enabled languages (this may take some time) ..."
-    unset used_languages
-    for l in $(get_used_languages); do
-      used_languages=${used_languages:+${used_languages} }$l
-    done
-    db_set  mailman/used_languages "${used_languages}"
-    db_fset mailman/used_languages scanned true
-    db_fset mailman/used_languages seen false
-    echo " done."
-  fi
-  # Install only languages selected by the administrator
-  # forcing used languages to be always available.
-  db_get mailman/site_languages
-  site_languages="$(echo $RET | sed -e 's/, */ /g')"
-  need_languages="${site_languages}"
-  for lang in ${used_languages} ; do
-    if echo " ${site_languages} " | grep -v -q " ${lang} " ; then
-      need_languages="${lang} ${need_languages}"
-    fi
-  done
-  if [ "${need_languages}" != "${site_languages}" ]; then
-    db_set mailman/site_languages "$(echo ${need_languages} | sed -e 's/  */, /g')"
-  fi
-fi
 
-site_languages=""
-while [ -z "${site_languages}" ]; do
-  db_input high mailman/site_languages || true
-  # Let the db go, and ask the user, so we won't get back a stale setting
-  db_go || true
-  db_get mailman/site_languages && site_languages=${RET}
-done
-db_subst mailman/default_server_language site_languages "${site_languages}"
-db_input high mailman/default_server_language || true
+def gate_news_enabled():
+    """Checks crontab if gate_news is enabled.
 
-if [ -f "${crontab}" ]; then
-  COMMENT=`awk '/^.*gate_news/ { print substr($1,1,1) } ' < ${crontab}`
-  if [ "$COMMENT" = "#" ]; then
-    db_set mailman/gate_news false
-  else
-    db_set mailman/gate_news true
-  fi
-fi
+    Assume valid crontab(5) format: lines whose first non-space character
+    is a # are comments, comments on command lines are disallowed.
+    """
+    gn = os.popen('grep gate_news %(crontab)s' % globals())
+    result = False
+    for line in gn.readlines():
+        line = line.strip()
+        result |= line[0] != '#'
+    if gn.close() != 0:
+        result = False
+    return result
 
-db_input low mailman/gate_news || true
 
-if [ ! -e /etc/mailman/mm_cfg.py -o ! -x /var/lib/mailman/bin/list_lists ] || \
-    [ "$(/var/lib/mailman/bin/list_lists -b | grep ^mailman$ )" = "" ]; then
-    db_input critical mailman/create_site_list || true
-fi
+def have_list(listname):
+    """Check if a list with the specified internal name exists.
 
-db_go || true
+    When upgrading, use installed MM's own notion of list existence.
+    On a first time install (or when MM has been removed prior to this
+    installation, simply checks for directory existence.
+    """#
+    try:
+        from Mailman.Utils import list_exists
+        return list_exists(listname)
+    except ImportError:
+        list_dir = os.path.join(mm_lists, listname)
+        return os.path.isdir(list_dir)
+
+
+def main(operation, prev_version):
+
+    log('config main(operation=%(operation)r, '
+        'prev_version=%(prev_version)r)'
+        % locals(), lvl=2)
+
+    def db_input(*args):
+        try:
+            db.input(*args)
+        except DebconfError, exc:
+            if exc.args[0] != 30:
+                raise
+
+    gbls = globals().copy()
+    mm_cfg = '/etc/mailman/mm_cfg.py'
+
+    if os.path.exists('/etc/mailname'):
+        mailname = open('/etc/mailname')
+    else:
+        mailname = os.popen('hostname --fqdn')
+    mailname = mailname.read().strip()
+
+    if os.path.exists(mm_cfg):
+        for line in os.popen('egrep "^DEFAULT_[^ ]+ =" %(mm_cfg)s' % locals()):
+            exec line in gbls
+    default_email_host      = gbls.get('DEFAULT_EMAIL_HOST', mailname)
+    default_url_host        = gbls.get('DEFAULT_URL_HOST', '')
+    default_server_language = gbls.get('DEFAULT_SERVER_LANGUAGE', 'en')
+
+    db.set('mailman/email_host', default_email_host)
+    db_input(MEDIUM, 'mailman/email_host')
+
+    db.set('mailman/url_host',   default_url_host)
+    db_input(MEDIUM, 'mailman/url_host')
+
+    site_languages = db.get('mailman/site_languages')
+    langs = site_languages.split(', ')
+    if len(langs) > 1 and default_server_language not in langs:
+        default_server_language = ''
+    db.subst('mailman/default_server_language', 'site_languages', site_languages)
+    db.set('mailman/default_server_language', default_server_language)
+    db_input(HIGH, 'mailman/default_server_language')
+
+    db.set('mailman/gate_news',
+           gate_news_enabled() and 'true' or 'false')
+    db_input(LOW, 'mailman/gate_news')
+
+    site_list = 'mailman'
+    if not have_list(site_list):
+        db_input(CRITICAL, 'mailman/site_list')
+
+    db.go()
+
+
+if __name__ == '__main__':
+    if len(sys.argv) == 2:
+        operation, prev_version = sys.argv[1], None
+    elif len(sys.argv) == 3:
+        operation, prev_version = sys.argv[1:]
+
+    def dummy_logger(*args, **kw):
+        pass
+
+    try:
+        sys.path.insert(0, mm_home)
+        from Mailman.Debian import DebuggingLogger
+        log = DebuggingLogger('MM_MAINT')
+        try:
+            main(operation, prev_version)
+        finally:
+            log.sys_info()
+    except ImportError:
+        log = dummy_logger
+        main(operation, prev_version)