summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--reports/reports.wsgi15
-rw-r--r--src/lib/Bcfg2/DBSettings.py17
-rw-r--r--src/lib/Bcfg2/Logger.py2
-rw-r--r--src/lib/Bcfg2/Options/Actions.py2
-rw-r--r--src/lib/Bcfg2/Options/Parser.py2
-rw-r--r--src/lib/Bcfg2/Reporting/models.py10
-rw-r--r--src/lib/Bcfg2/Reporting/views.py2
-rwxr-xr-xsrc/sbin/bcfg2-server1
8 files changed, 36 insertions, 15 deletions
diff --git a/reports/reports.wsgi b/reports/reports.wsgi
index 75eb78c0b..7113b3308 100644
--- a/reports/reports.wsgi
+++ b/reports/reports.wsgi
@@ -2,11 +2,20 @@ import os
import Bcfg2.Options
import Bcfg2.DBSettings
-os.environ['DJANGO_SETTINGS_MODULE'] = 'Bcfg2.DBSettings'
-
-Bcfg2.Options.get_parser().parse()
+config_parsed = False
import django.core.handlers.wsgi
+
def application(environ, start_response):
+ global config_parsed
+
+ # with wsgi, the environment isn't present in os.environ, but
+ # is passwd to the application function
+ if 'BCFG2_CONFIG_FILE' in environ:
+ os.environ['BCFG2_CONFIG_FILE'] = environ['BCFG2_CONFIG_FILE']
+ if not config_parsed:
+ Bcfg2.Options.get_parser().parse()
+ config_parsed = True
+
return django.core.handlers.wsgi.WSGIHandler()(environ, start_response)
diff --git a/src/lib/Bcfg2/DBSettings.py b/src/lib/Bcfg2/DBSettings.py
index e45807094..3b2edd849 100644
--- a/src/lib/Bcfg2/DBSettings.py
+++ b/src/lib/Bcfg2/DBSettings.py
@@ -154,6 +154,17 @@ def migrate_databases(**kwargs):
**kwargs)
+def get_db_label(application):
+ """ Get the name of the database for a given Django "application". The
+ rule is that if a database with the same name as the application exists,
+ use it. Otherwise use the default. Returns a string suitible for use as a
+ key in the Django database settings dict """
+ if application in settings['DATABASES']:
+ return application
+
+ return 'default'
+
+
class PerApplicationRouter(object):
""" Django database router for redirecting different applications to their
own database """
@@ -161,11 +172,7 @@ class PerApplicationRouter(object):
def _db_per_app(self, model, **hints):
""" If a database with the same name as the application exists, use it.
Otherwise use the default """
- app = model._meta.app_label
- if app in settings['DATABASES']:
- return app
-
- return 'default'
+ return get_db_label(model._meta.app_label)
def db_for_read(self, model, **hints):
""" Called when Django wants to find out what database to read from """
diff --git a/src/lib/Bcfg2/Logger.py b/src/lib/Bcfg2/Logger.py
index 0f7995e0f..11eaeebd1 100644
--- a/src/lib/Bcfg2/Logger.py
+++ b/src/lib/Bcfg2/Logger.py
@@ -21,7 +21,7 @@ class TermiosFormatter(logging.Formatter):
def __init__(self, fmt=None, datefmt=None):
logging.Formatter.__init__(self, fmt, datefmt)
- if sys.stdout.isatty():
+ if hasattr(sys.stdout, 'isatty') and sys.stdout.isatty():
# now get termios info
try:
self.width = struct.unpack('hhhh',
diff --git a/src/lib/Bcfg2/Options/Actions.py b/src/lib/Bcfg2/Options/Actions.py
index 0d65c584d..8b941f2bb 100644
--- a/src/lib/Bcfg2/Options/Actions.py
+++ b/src/lib/Bcfg2/Options/Actions.py
@@ -168,7 +168,7 @@ class ConfigFileAction(FinalizableAction):
``bcfg2-lint.conf``). """
def __call__(self, parser, namespace, values, option_string=None):
- get_parser().add_config_file(self.dest, values)
+ parser.add_config_file(self.dest, values, reparse=False)
FinalizableAction.__call__(self, parser, namespace, values,
option_string=option_string)
diff --git a/src/lib/Bcfg2/Options/Parser.py b/src/lib/Bcfg2/Options/Parser.py
index 48f3c5056..677a69e4c 100644
--- a/src/lib/Bcfg2/Options/Parser.py
+++ b/src/lib/Bcfg2/Options/Parser.py
@@ -37,6 +37,7 @@ class Parser(argparse.ArgumentParser):
#: Option for specifying the path to the Bcfg2 config file
configfile = PathOption('-C', '--config',
+ env="BCFG2_CONFIG_FILE",
help="Path to configuration file",
default="/etc/bcfg2.conf")
@@ -219,6 +220,7 @@ class Parser(argparse.ArgumentParser):
_debug("Option parsing phase 1: Get and read main config file")
bootstrap_parser = argparse.ArgumentParser(add_help=False)
self.configfile.add_to_parser(bootstrap_parser)
+ self.configfile.default_from_config(self._cfp)
bootstrap = bootstrap_parser.parse_known_args(args=self.argv)[0]
# check whether the specified bcfg2.conf exists
diff --git a/src/lib/Bcfg2/Reporting/models.py b/src/lib/Bcfg2/Reporting/models.py
index 0598e4d33..2d96990b1 100644
--- a/src/lib/Bcfg2/Reporting/models.py
+++ b/src/lib/Bcfg2/Reporting/models.py
@@ -3,7 +3,7 @@ import sys
from django.core.exceptions import ImproperlyConfigured
try:
- from django.db import models, backend, connection
+ from django.db import models, backend, connections
except ImproperlyConfigured:
e = sys.exc_info()[1]
print("Reports: unable to import django models: %s" % e)
@@ -12,6 +12,7 @@ except ImproperlyConfigured:
from django.core.cache import cache
from datetime import datetime, timedelta
from Bcfg2.Compat import cPickle
+from Bcfg2.DBSettings import get_db_label
TYPE_GOOD = 0
@@ -61,7 +62,8 @@ def _quote(value):
global _our_backend
if not _our_backend:
try:
- _our_backend = backend.DatabaseOperations(connection)
+ _our_backend = backend.DatabaseOperations(
+ connections[get_db_label('Reporting')])
except TypeError:
_our_backend = backend.DatabaseOperations()
return _our_backend.quote_name(value)
@@ -91,8 +93,8 @@ class InteractionManager(models.Manager):
maxdate -- datetime object. Most recent date to pull. (default None)
"""
- from django.db import connection
- cursor = connection.cursor()
+ from django.db import connections
+ cursor = connections[get_db_label('Reporting')].cursor()
cfilter = "expiration is null"
sql = 'select ri.id, x.client_id from ' + \
diff --git a/src/lib/Bcfg2/Reporting/views.py b/src/lib/Bcfg2/Reporting/views.py
index c7c2a503f..0b8ed65cc 100644
--- a/src/lib/Bcfg2/Reporting/views.py
+++ b/src/lib/Bcfg2/Reporting/views.py
@@ -13,7 +13,7 @@ from django.http import \
from django.shortcuts import render_to_response, get_object_or_404
from django.core.urlresolvers import \
resolve, reverse, Resolver404, NoReverseMatch
-from django.db import connection, DatabaseError
+from django.db import DatabaseError
from django.db.models import Q, Count
from Bcfg2.Reporting.models import *
diff --git a/src/sbin/bcfg2-server b/src/sbin/bcfg2-server
index 274bd3659..00b4e92e3 100755
--- a/src/sbin/bcfg2-server
+++ b/src/sbin/bcfg2-server
@@ -16,6 +16,7 @@ class BackendAction(Bcfg2.Options.ComponentAction):
class CLI(object):
""" bcfg2-server CLI class """
+ parse_first = True
options = [
Bcfg2.Options.Option(
cf=('server', 'backend'), help='Server Backend',