#!/usr/bin/python
#Mavericks http upgrade script

import logging
import os
import sys
import syslog
import time

from isi.config import mxd
from isi.config import http
from isi.app.lib import safelockfile
IFS_BACKUP_PATH = "/ifs/.ifsvar/tmp"
LOG_FILE = os.path.join(IFS_BACKUP_PATH, "mavericks-http-upgrade.log")
HTTP_UPGRADE_LOCKFILE = os.path.join(IFS_BACKUP_PATH, "mavericks-http-upgraded")

MCP_BASE_PATH = "/etc/mcp/sys"
MCP_OVERRIDE_PATH = "/etc/mcp/override"
APACHE_FILE = "apache2.xml"
WEBUI_FILE = "webui_port.xml"
CONFIG_FILE = "ui_config.xml"

HTTP_DEFAULT_PATH = "/ifs/.ifsvar/modules/http"
HTTP_UPGRADED_FILE = os.path.join(HTTP_DEFAULT_PATH, "mavericks-http-upgrade-complete")

def main():
    logger = logging.getLogger("mavericks-http-upgrade")

    apachedoc = mxd.loadmxd(os.path.join(MCP_BASE_PATH, APACHE_FILE),
                            os.path.join(MCP_OVERRIDE_PATH, APACHE_FILE))
    webuidoc  = mxd.loadmxd(os.path.join(MCP_BASE_PATH, WEBUI_FILE),
                            os.path.join(MCP_OVERRIDE_PATH, WEBUI_FILE))
    configdoc = mxd.loadmxd(os.path.join(MCP_BASE_PATH, CONFIG_FILE),
                            os.path.join(MCP_OVERRIDE_PATH, CONFIG_FILE))

    try:
        logger = logging.getLogger("mavericks-http-upgrade")
        fh = logging.FileHandler(LOG_FILE, 'a')
        fh.setLevel(logging.DEBUG)
        logger.addHandler(fh)
    except EnvironmentError, e:
        syslog.syslog(syslog.LOG_NOTICE,
            "Error running http upgrade script: %s" % e)
        return 1

    try:
        os.chmod(LOG_FILE, 0640)
    except OSError, e:
        # log chmod errors and continue
        syslog.syslog(syslog.LOG_NOTICE,
                      "Error chmod'ing %s (errno: %d)" % (LOG_FILE, e.errno))

    if os.path.exists(HTTP_UPGRADED_FILE):
        return 0

    try:
        sentry = safelockfile(HTTP_UPGRADE_LOCKFILE, 'w')
    except EnvironmentError, e:
        syslog.syslog(syslog.LOG_NOTICE,
            "Error running http upgrade script: %s" %e)
        return 1

    if os.path.exists(HTTP_UPGRADED_FILE):
        logger.info("%s: Http upgrade has already occured successfully." %
                    time.ctime())
        return 0

    rule = {}
    if apachedoc:
        apacheroot = apachedoc.getroot()
        if apacheroot:
            server = apacheroot.getchildnamed('server')
            if server:
                 for j in server.getchildren():
                     rule[j.name()] = j.gettext()

    if 'serverroot' in rule:
        rule['server_root'] = rule['serverroot']
        del rule['serverroot']

    if 'serveradmin' in rule:
        rule['server_admin'] = rule['serveradmin']
        del rule['serveradmin']

    if 'customlog' in rule:
        rule['custom_log'] = rule['customlog']
        del rule['customlog']

    if 'errorlog' in rule:
        rule['error_log'] = rule['errorlog']
        del rule['errorlog']

    if 'customssllog' in rule:
        del rule['customssllog']

    if 'timestamp' in rule:
        del rule['timestamp']

    if 'enabled' in rule:
        if rule['enabled'] == 'redirect':
            rule['redirect'] = True
        else:
            rule['redirect'] = False
        del rule['enabled']

    if 'dav' in rule:
        if rule['dav'] == 'on':
            rule['webdav'] = True
        del rule['dav']

    adsauth = rule.get('adsauth', None)
    if adsauth:
        if adsauth.find('negotiate') > -1:
            rule['auth_negotiate'] = True
        if adsauth.find('basic') > -1:
            rule['auth_basic'] = True
        if adsauth.find('access') > -1:
            rule['auth_access_check'] = True
        del rule['adsauth']

    if webuidoc:
        webuiroot = webuidoc.getroot()
        if webuiroot:
            adminui = webuiroot.getchildnamed('admin-ui')
            if adminui:
                aport = adminui.getchildnamed('port')
                if aport:
                    rule['webui_port'] = int(aport.gettext())

    if configdoc:
        configroot = configdoc.getroot()
        if configroot:
            server = configroot.getchildnamed('server-description')
            if server:
                descript = server.getchildnamed('description')
                if descript:
                    rule['cluster_description'] = descript.gettext()
                motd = server.getchildnamed('motd_header')
                if motd:
                    rule['motd_header'] = motd.gettext()
    for s in rule:
        funct = getattr(http, 'set_' + s)
        funct(rule[s])

    msg = "%s: Upgrade was successful" % time.ctime()
    logger.info(msg)
    print >> file(HTTP_UPGRADED_FILE, 'w'), msg
    os.chmod(HTTP_UPGRADED_FILE, 0640)
    sentry.close()
    return 0

if __name__ == "__main__":
    sys.exit(main())
