Branch 'pykolab-0.4' - 3 commits - pykolab/setup pykolab/utils.py
Jeroen van Meeuwen
vanmeeuwen at kolabsys.com
Thu May 10 16:41:55 CEST 2012
pykolab/setup/setup_freebusy.py | 19 +++++++++++++--
pykolab/setup/setup_imap.py | 7 ++++-
pykolab/setup/setup_kolabd.py | 7 ++++-
pykolab/setup/setup_ldap.py | 48 +++++++++++++++++++++++++++++++++++---
pykolab/setup/setup_mysql.py | 42 +++++++++++++++++++++++++++++----
pykolab/setup/setup_roundcube.py | 11 +++++++-
pykolab/utils.py | 49 ++++++++++++++++++++++++++++++++++++++-
7 files changed, 168 insertions(+), 15 deletions(-)
New commits:
commit 65906121805fe74f384bc265883731a1c0a0695e
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date: Thu May 10 14:41:16 2012 +0100
Allow utils.ask_question() to request confirmation of the input
diff --git a/pykolab/utils.py b/pykolab/utils.py
index 4858579..6326bf8 100644
--- a/pykolab/utils.py
+++ b/pykolab/utils.py
@@ -24,7 +24,7 @@ import sys
from pykolab import constants
from pykolab.translate import _
-def ask_question(question, default="", password=False):
+def ask_question(question, default="", password=False, confirm=False):
"""
Ask a question on stderr.
@@ -46,6 +46,26 @@ def ask_question(question, default="", password=False):
else:
answer = raw_input("%s [%s]: " % (question, default))
+ if not answer == "" and not default == "":
+ if confirm:
+ answer_confirm = None
+ answer_confirmed = False
+ while not answer_confirmed:
+ if default == "":
+ answer_confirm = raw_input("Confirm %s: " % (question))
+ else:
+ answer_confirm = raw_input("Confirm %s [%s]: " % (question, default))
+
+ if not answer_confirm == answer:
+ print >> sys.stderr, _("Incorrect confirmation. " + \
+ "Please try again.")
+ if default == "":
+ answer = raw_input("%s: " % (question))
+ else:
+ answer = raw_input("%s [%s]: " % (question, default))
+ else:
+ answer_confirmed = True
+
if answer == "":
return default
else:
commit 87f6005647a2df19f5b6e24869b6f681ffe65e5f
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date: Thu May 10 15:24:20 2012 +0100
Add verbiage on what accounts and what passwords we are asking for (#738)
Ask for confirmation of passwords (#748)
diff --git a/pykolab/setup/setup_freebusy.py b/pykolab/setup/setup_freebusy.py
index 5c4b2e7..3b522f1 100644
--- a/pykolab/setup/setup_freebusy.py
+++ b/pykolab/setup/setup_freebusy.py
@@ -34,7 +34,12 @@ log = pykolab.getLogger('pykolab.setup')
conf = pykolab.getConf()
def __init__():
- components.register('freebusy', execute, description=description(), after=['mysql','ldap', 'roundcube'])
+ components.register(
+ 'freebusy',
+ execute,
+ description=description(),
+ after=['mysql','ldap', 'roundcube']
+ )
def description():
return _("Setup Free/Busy.")
@@ -45,9 +50,19 @@ def execute(*args, **kw):
return
if not hasattr(conf, 'mysql_roundcube_password'):
+ print >> sys.sdterr, utils.multiline_message(
+ _("""
+ Please supply the MySQL password for the 'roundcube'
+ user. You have supplied this password earlier, and it is
+ available from the database URI setting in
+ /etc/roundcubemail/db.inc.php.
+ """)
+ )
+
conf.mysql_roundcube_password = utils.ask_question(
_("MySQL roundcube password"),
- password=True
+ password=True,
+ confirm=True
)
freebusy_settings = {
diff --git a/pykolab/setup/setup_imap.py b/pykolab/setup/setup_imap.py
index df676e7..de927f3 100644
--- a/pykolab/setup/setup_imap.py
+++ b/pykolab/setup/setup_imap.py
@@ -33,7 +33,12 @@ log = pykolab.getLogger('pykolab.setup')
conf = pykolab.getConf()
def __init__():
- components.register('imap', execute, description=description(), after=['ldap'])
+ components.register(
+ 'imap',
+ execute,
+ description=description(),
+ after=['ldap']
+ )
def description():
return _("Setup IMAP.")
diff --git a/pykolab/setup/setup_kolabd.py b/pykolab/setup/setup_kolabd.py
index 03c2cae..13e1fd7 100644
--- a/pykolab/setup/setup_kolabd.py
+++ b/pykolab/setup/setup_kolabd.py
@@ -32,7 +32,12 @@ log = pykolab.getLogger('pykolab.setup')
conf = pykolab.getConf()
def __init__():
- components.register('kolabd', execute, description=description(), after=['ldap','imap'])
+ components.register(
+ 'kolabd',
+ execute,
+ description=description(),
+ after=['ldap','imap']
+ )
def description():
return _("Setup the Kolab daemon.")
diff --git a/pykolab/setup/setup_ldap.py b/pykolab/setup/setup_ldap.py
index 71c1e5d..9a9db2b 100644
--- a/pykolab/setup/setup_ldap.py
+++ b/pykolab/setup/setup_ldap.py
@@ -62,16 +62,35 @@ def execute(*args, **kw):
_input = {}
if ask_questions:
+ print >> sys.stderr, utils.multiline_message(
+ _("""
+ Please supply a password for the LDAP administrator user
+ 'admin', used to login to the graphical console of 389
+ Directory server.
+ """)
+ )
+
_input['admin_pass'] = utils.ask_question(
_("Administrator password"),
default=utils.generate_password(),
- password=True
+ password=True,
+ confirm=True
+ )
+
+ print >> sys.stderr, utils.multiline_message(
+ _("""
+ Please supply a password for the LDAP Directory Manager
+ user, which is the administrator user you will be using
+ to at least initially log in to the Web Admin, and that
+ Kolab uses to perform administrative tasks.
+ """)
)
_input['dirmgr_pass'] = utils.ask_question(
_("Directory Manager password"),
default=utils.generate_password(),
- password=True
+ password=True,
+ confirm=True
)
_input['userid'] = utils.ask_question(_("User"), default="nobody")
@@ -185,16 +204,37 @@ ServerAdminPwd = %(admin_pass)s
"directory server service."))
if ask_questions:
+ print >> sys.stderr, utils.multiline_message(
+ _("""
+ Please supply a Cyrus Administrator password. This
+ password is used by Kolab to execute administrative
+ tasks in Cyrus IMAP. You may also need the password
+ yourself to troubleshoot Cyrus IMAP and/or perform
+ other administrative tasks against Cyrus IMAP directly.
+ """)
+ )
+
_input['cyrus_admin_pass'] = utils.ask_question(
_("Cyrus Administrator password"),
default=utils.generate_password(),
- password=True
+ password=True,
+ confirm=True
+ )
+
+ print >> sys.stderr, utils.multiline_message(
+ _("""
+ Please supply a Kolab Service account password. This
+ account is used by various services such as Postfix,
+ and Roundcube, as anonymous binds to the LDAP server
+ will not be allowed.
+ """)
)
_input['kolab_service_pass'] = utils.ask_question(
_("Kolab Service password"),
default=utils.generate_password(),
- password=True
+ password=True,
+ confirm=True
)
else:
diff --git a/pykolab/setup/setup_mysql.py b/pykolab/setup/setup_mysql.py
index 36bfe14..ac63add 100644
--- a/pykolab/setup/setup_mysql.py
+++ b/pykolab/setup/setup_mysql.py
@@ -49,13 +49,25 @@ def execute(*args, **kw):
log.error(_("Could not start and configure to start on boot, the " + \
"MySQL database service."))
- mysql_root_pw = utils.ask_question(
+ print >> sys.stderr, utils.multiline_message(
+ _("""
+ Please supply a root password for MySQL. This password will
+ be the administrative user for this MySQL server, and it
+ should be kept a secret. After this setup process has
+ completed, Kolab is going to discard and forget about this
+ password, but you will need it for administrative tasks in
+ MySQL.
+ """)
+ )
+
+ mysql_root_password = utils.ask_question(
_("MySQL root password"),
default=utils.generate_password(),
- password=True
+ password=True,
+ confirm=True
)
- p1 = subprocess.Popen(['echo', 'UPDATE mysql.user SET Password=PASSWORD(\'%s\') WHERE User=\'root\';' % (mysql_root_pw)], stdout=subprocess.PIPE)
+ p1 = subprocess.Popen(['echo', 'UPDATE mysql.user SET Password=PASSWORD(\'%s\') WHERE User=\'root\';' % (mysql_root_password)], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['mysql'], stdin=p1.stdout)
p1.stdout.close()
p2.communicate()
@@ -69,7 +81,7 @@ def execute(*args, **kw):
[mysql]
user=root
password=%s
-""" % (mysql_root_pw)
+""" % (mysql_root_password)
fp = open('/tmp/kolab-setup-my.cnf', 'w')
fp.write(data)
@@ -87,12 +99,32 @@ password=%s
p1.stdout.close()
p2.communicate()
+ print >> sys.stderr, utils.multiline_message(
+ _("""
+ Please supply a password for the MySQL user 'kolab'.
+ This password will be used by Kolab services, such as
+ the Web Administration Panel.
+ """)
+ )
+
+ mysql_kolab_password = utils.ask_question(
+ _("MySQL kolab password"),
+ default=utils.generate_password(),
+ password=True,
+ confirm=True
+ )
+
+ p1 = subprocess.Popen(['echo', 'GRANT ALL PRIVILEGES ON kolab.* TO \'kolab\'@\'localhost\' IDENTIFIED BY \'%s\';' % (mysql_kolab_password)], stdout=subprocess.PIPE)
+ p2 = subprocess.Popen(['mysql', '--defaults-file=/tmp/kolab-setup-my.cnf'], stdin=p1.stdout)
+ p1.stdout.close()
+ p2.communicate()
+
p1 = subprocess.Popen(['cat', schema_file], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['mysql', '--defaults-file=/tmp/kolab-setup-my.cnf', 'kolab'], stdin=p1.stdout)
p1.stdout.close()
p2.communicate()
- conf.command_set('kolab_wap', 'sql_uri', 'mysql://root:%s@localhost/kolab' % (mysql_root_pw))
+ conf.command_set('kolab_wap', 'sql_uri', 'mysql://kolab:%s@localhost/kolab' % (mysql_kolab_password))
else:
log.warning(_("Could not find the Kolab schema file"))
diff --git a/pykolab/setup/setup_roundcube.py b/pykolab/setup/setup_roundcube.py
index cd6e5d2..0077a3d 100644
--- a/pykolab/setup/setup_roundcube.py
+++ b/pykolab/setup/setup_roundcube.py
@@ -40,10 +40,19 @@ def description():
return _("Setup Roundcube.")
def execute(*args, **kw):
+ print >> sys.stderr, utils.multiline_message(
+ _("""
+ Please supply a password for the MySQL user 'roundcube'.
+ This password will be used by the Roundcube webmail
+ interface.
+ """)
+ )
+
mysql_roundcube_password = utils.ask_question(
_("MySQL roundcube password"),
default=utils.generate_password(),
- password=True
+ password=True,
+ confirm=True
)
conf.mysql_roundcube_password = mysql_roundcube_password
commit d1984de0fa16015d02bf48312047fe66bf06e338
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date: Thu May 10 15:25:31 2012 +0100
Provide required function for multi-line messages while keeping the source code somewhat clean
diff --git a/pykolab/utils.py b/pykolab/utils.py
index 0ba203a..4858579 100644
--- a/pykolab/utils.py
+++ b/pykolab/utils.py
@@ -103,6 +103,33 @@ def generate_password():
return output
+def multiline_message(message):
+ _msg = ""
+
+ column_width = 80
+
+ # First, replace all occurences of "\n"
+ message = message.replace(" ", "")
+ message = message.replace("\n", " ")
+
+ lines = []
+ line_length = 0
+
+ line = ""
+ for word in message.split():
+ if (len(line) + len(word)) > column_width:
+ lines.append(line)
+ line = word
+ else:
+ if line == "":
+ line = word
+ else:
+ line += " %s" % (word)
+
+ lines.append(line)
+
+ return "\n".join(lines)
+
def normalize(_object):
if type(_object) == list:
result = []
More information about the commits
mailing list