Author: rjollos
Date: Mon Mar 24 02:26:15 2014
New Revision: 1580702
URL: http://svn.apache.org/r1580702
Log:
0.8dev: Added MySQL support to install script. Refs #787.
Initial patch by JoKoT3.
Modified:
bloodhound/trunk/RELEASE_NOTES
bloodhound/trunk/installer/bloodhound_setup.py
Modified: bloodhound/trunk/RELEASE_NOTES
URL:
http://svn.apache.org/viewvc/bloodhound/trunk/RELEASE_NOTES?rev=1580702&r1=1580701&r2=1580702&view=diff
==============================================================================
--- bloodhound/trunk/RELEASE_NOTES (original)
+++ bloodhound/trunk/RELEASE_NOTES Mon Mar 24 02:26:15 2014
@@ -10,6 +10,7 @@
* BloodhoundSearch now supports Whoosh >= 2.5.1 (upgraded from 2.4.1).
* Fixed errors in BloodhoundRelations validation logic.
* Bootstrap template for the Roadmap view.
+ * Bloodhound installer support for MySQL database.
* Numerous other important fixes and minor enhancements.
Modified: bloodhound/trunk/installer/bloodhound_setup.py
URL:
http://svn.apache.org/viewvc/bloodhound/trunk/installer/bloodhound_setup.py?rev=1580702&r1=1580701&r2=1580702&view=diff
==============================================================================
--- bloodhound/trunk/installer/bloodhound_setup.py (original)
+++ bloodhound/trunk/installer/bloodhound_setup.py Mon Mar 24 02:26:15 2014
@@ -20,26 +20,20 @@
import os
import pkg_resources
+import shutil
import sys
-import traceback
-
-import ConfigParser
+from createdigest import htdigest_create
from getpass import getpass
from optparse import OptionParser
-import shutil
-import time
-
-from createdigest import htdigest_create
-
-LANG = os.environ.get('LANG')
try:
- from trac.util import translation
- from trac.util.translation import _, get_negotiated_locale, has_babel
from trac.admin.console import TracAdmin
from trac.config import Configuration
+ from trac.util import translation
+ from trac.util.translation import _, get_negotiated_locale, has_babel
except ImportError, e:
- print("Requirements must be installed before running
bloodhound_setup.py.\n"
+ print("Requirements must be installed before running "
+ "bloodhound_setup.py.\n"
"You can install them with the following command:\n"
" pip install -r requirements.txt\n")
sys.exit(1)
@@ -49,8 +43,16 @@ try:
except ImportError:
psycopg2 = None
+try:
+ import MySQLdb as mysqldb
+except ImportError:
+ mysqldb = None
+
+LANG = os.environ.get('LANG')
+
MAXBACKUPNUMBER = 64 # Max attempts to create backup file
+SUPPORTED_DBTYPES = ('sqlite', 'postgres', 'mysql')
DEFAULT_DB_USER = 'bloodhound'
DEFAULT_DB_NAME = 'bloodhound'
DEFAULT_ADMIN_USER = 'admin'
@@ -136,23 +138,27 @@ class BloodhoundSetup(object):
def _generate_db_str(self, options):
"""Builds an appropriate db string for trac-admin for sqlite and
- postgres options. Also allows for a user to provide their own db string
- to allow database initialisation beyond these."""
- dbdata = {'user': options.get('dbuser'),
+ postgres options. Also allows for a user to provide their own db
+ string to allow database initialisation beyond these."""
+ dbdata = {'type': options.get('dbtype', 'sqlite'),
+ 'user': options.get('dbuser'),
'pass': options.get('dbpass'),
'host': options.get('dbhost', 'localhost'),
- 'port': options.get('dbport', '5432'),
+ 'port': options.get('dbport'),
'name': options.get('dbname', 'bloodhound'),
}
db = options.get('dbstring')
if db is None:
- dbtype = options.get('dbtype', 'sqlite')
- if (dbtype == 'postgres' and dbdata['user'] is not None
- and dbdata['pass'] is not None):
- db = 'postgres://%(user)s:%(pass)s@%(host)s:%(port)s/%(name)s'
+ if dbdata['type'] in ('postgres', 'mysql') \
+ and dbdata['user'] is not None \
+ and dbdata['pass'] is not None:
+ if dbdata['port'] is not None:
+ db =
'%(type)s://%(user)s:%(pass)s@%(host)s:%(port)s/%(name)s'
+ else: # no port specified = default port
+ db = '%(type)s://%(user)s:%(pass)s@%(host)s/%(name)s'
else:
- db = 'sqlite:%s' % os.path.join('db', '%(name)s.db')
+ db = '%%(type)s:%s' % os.path.join('db', '%(name)s.db')
return db % dbdata
def setup(self, **kwargs):
@@ -173,6 +179,9 @@ class BloodhoundSetup(object):
if psycopg2 is None and options.get('dbtype') == 'postgres':
print "psycopg2 needs to be installed to initialise a postgresql
db"
return False
+ elif mysqldb is None and options.get('dbtype') == 'mysql':
+ print "MySQLdb needs to be installed to initialise a mysql db"
+ return False
environments_path = options['envsdir']
if not os.path.exists(environments_path):
@@ -303,7 +312,8 @@ And point your browser at http://localho
"""Writes or updates a config file. A list of dictionaries is used so
that options for different aspects of the configuration can be kept
separate while being able to update the same sections. Note that the
- result is order dependent where two dictionaries update the same
option.
+ result is order dependent where two dictionaries update the same
+ option.
"""
config = Configuration(filepath)
file_changed = False
@@ -354,7 +364,7 @@ def handle_options():
help='Set the directory to contain environments',
default=os.path.join('bloodhound', 'environments'))
parser.add_option('-d', '--database-type', dest='dbtype',
- help="Specify as either 'postgres' or 'sqlite'",
+ help="Specify as either 'sqlite', 'postgres' or 'mysql'",
default='')
parser.add_option('--database-string', dest='dbstring',
help=('Advanced: provide a custom database string, '
@@ -364,15 +374,15 @@ def handle_options():
help='Specify the database name',
default='bloodhound')
parser.add_option('-u', '--user', dest='dbuser',
- help='Specify the db user (required for postgres)',
+ help='Specify the db user (required for postgres and
mysql)',
default='')
parser.add_option('-p', '--password', dest='dbpass',
- help='Specify the db password (option for postgres)')
+ help='Specify the db password (required for postgres and
mysql)')
parser.add_option('--database-host', dest='dbhost',
- help='Specify the database host (optional for postgres)',
+ help='Specify the database host (optional for postgres
and mysql)',
default='localhost')
parser.add_option('--database-port', dest='dbport',
- help='Specify the database port (optional for postgres)',
+ help='Specify the database port (optional for postgres
and mysql)',
default='5432')
# Account Manager Options
@@ -419,28 +429,33 @@ def handle_options():
password2 = getpass('Please reenter the password: ')
if password1 and password1 == password2:
return password1
- print "Passwords did not match. Quitting."
+ print "Passwords did not match. Quiting."
sys.exit(1)
- if options.dbtype.lower() not in ['postgres','sqlite']:
- answer = ask_question('''
-This installer is able to install Apache Bloodhound with either SQLite or
-PostgreSQL databases. SQLite is an easier option for installing Bloodhound as
-SQLite is usually built into Python and also requires no special permissions to
-run. However, PostgreSQL is generally expected to be more robust for production
-use.
-Do you want to install to a PostgreSQL database [%s]: ''', default='Y/n')
+ if options.dbtype.lower() not in SUPPORTED_DBTYPES:
+ answer = ask_question("""
+This installer is able to install Apache Bloodhound with either SQLite,
+PostgreSQL or MySQL databases. SQLite is an easier option for installing
+Bloodhound as SQLite support is built into Python and requires no special
+permissions to run. However, PostgreSQL and MySQL are generally expected to
+be more robust for production use.
+What type of database do you want to instant to (%s)?
+[%%s]: """ % '/'.join(SUPPORTED_DBTYPES), default='sqlite')
answer = answer.lower()
- options.dbtype = 'postgres' if answer not in ['n','no'] else 'sqlite'
+ if answer in SUPPORTED_DBTYPES:
+ options.dbtype = answer
+ else:
+ print "Unrecognized dbtype \"%s\". Quiting." % answer
+ sys.exit(1)
else:
options.dbtype = options.dbtype.lower()
- if options.dbtype == 'postgres':
+ if options.dbtype in ('postgres','mysql'):
if not options.dbuser:
options.dbuser = ask_question("""
-For PostgreSQL you need to have PostgreSQL installed and you need to have
-created a database user to connect to the database with. Setting this up may
-require admin access rights to the server.
+For PostgreSQL/MySQL you need to have PostgreSQL/MySQL installed and you need
+to have created a database user to connect to the database with. Setting this
+up may require admin access rights to the server.
DB user name [%s]: """, DEFAULT_DB_USER)
if not options.dbpass:
@@ -448,10 +463,9 @@ DB user name [%s]: """, DEFAULT_DB_USER)
if not options.dbname:
options.dbname = ask_question("""
-For PostgreSQL setup, you need to specify a database that you have created for
-Bloodhound to use. This installer currently assumes that this database will be
-empty.
-DB name [%s]: """, DEFAULT_DB_NAME)
+For PostgreSQL/MySQL setup, you need to specify a database that you have
+created for Bloodhound to use. This installer currently assumes that this
+database will be empty. DB name [%s]: """, DEFAULT_DB_NAME)
if not options.adminuser:
options.adminuser = ask_question("""
Please supply a username for the admin user [%s]: """, DEFAULT_ADMIN_USER)
@@ -460,6 +474,7 @@ Please supply a username for the admin u
return options
+
if __name__ == '__main__':
options = handle_options()
bsetup = BloodhoundSetup(options)