# $Id$

# Copyright (C) 2014  Dragon Research Labs ("DRL")
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND DRL DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS.  IN NO EVENT SHALL DRL BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.

"""
This module contains GUI-specific configuration settings for Django libraries.
"""

# Pull in the irdb configuration, which in turn pulls in the common configuration.

from .irdb import *                     # pylint: disable=W0401,W0614

__version__ = "$Id$"

import socket

# GUI uses the IRDB database configuration, so we don't need to set
# anything here.

# Where to put static files.
STATIC_ROOT = rpki.autoconf.datarootdir + "/rpki/media"

# Must end with a slash!
STATIC_URL = "/media/"

# Where to email server errors.
ADMINS = (("Administrator", "root@localhost"),)

LOGGING = {
    "version": 1,
    "formatters": {
        "verbose": {
            # see http://docs.python.org/2.7/library/logging.html#logging.LogRecord
            "format": "%(levelname)s %(asctime)s %(name)s %(message)s"
        },
    },
    "handlers": {
        "stderr": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "verbose",
        },
        "mail_admins": {
            "level": "ERROR",
            "class": "django.utils.log.AdminEmailHandler",
        },
    },
    "loggers": {
        "django": {
            "level": "ERROR",
            "handlers": ["stderr", "mail_admins"],
        },
        "rpki.gui": {
            "level": "WARNING",
            "handlers": ["stderr"],
        },
    },
}

def select_tz():
    "Find a supported timezone that looks like UTC"
    for tz in ("UTC", "GMT", "Etc/UTC", "Etc/GMT"):
        if os.path.exists("/usr/share/zoneinfo/" + tz):
            return tz
    # Can't determine the proper timezone, fall back to UTC and let Django
    # report the error to the user.
    return "UTC"

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = select_tz()

# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
# for details on why you might need this.
def get_allowed_hosts():
    allowed_hosts = set(cfg.multiget("allowed-hosts", section = "web_portal"))
    allowed_hosts.add(socket.getfqdn())
    allowed_hosts.add("127.0.0.1")
    allowed_hosts.add("::1")
    try:
        import netifaces
        for interface in netifaces.interfaces():
            addresses = netifaces.ifaddresses(interface)
            for af in (netifaces.AF_INET, netifaces.AF_INET6):
                if af in addresses:
                    for address in addresses[af]:
                        if "addr" in address:
                            allowed_hosts.add(address["addr"])
    except ImportError:
        pass
    return list(allowed_hosts)

ALLOWED_HOSTS = get_allowed_hosts()

DOWNLOAD_DIRECTORY = cfg.get("download-directory", "/var/tmp", section = "web_portal")

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    "django.template.loaders.filesystem.Loader",
    "django.template.loaders.app_directories.Loader",
    "django.template.loaders.eggs.Loader"
)

MIDDLEWARE_CLASSES = (
    "django.middleware.common.CommonMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware"
)

ROOT_URLCONF = "rpki.gui.urls"

INSTALLED_APPS.extend((
    "django.contrib.auth",
    #"django.contrib.admin",
    #"django.contrib.admindocs",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.staticfiles",
    "rpki.gui.app",
    "rpki.gui.cacheview",
    "rpki.gui.routeview",
))

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.contrib.messages.context_processors.messages",
    "django.core.context_processors.request",
    "django.core.context_processors.static"
)

# Allow local site to override any setting above -- but if there's
# anything that local sites routinely need to modify, please consider
# putting that configuration into rpki.conf and just adding code here
# to read that configuration.
try:
    from local_settings import *        # pylint: disable=W0401,F0401
except ImportError:
    pass