#!/usr/bin/python
#Jaws ntp upgrade script

import logging
import os
import sys
import syslog
import time

from isi.config import mxd
from isi.config import ntp
from isi.app.lib import safelockfile

IFS_BACKUP_PATH = "/ifs/.ifsvar/tmp"
LOG_FILE = os.path.join(IFS_BACKUP_PATH, "jaws-ntp-upgrade.log")
NTP_UPGRADE_LOCKFILE = os.path.join(IFS_BACKUP_PATH, "jaws-ntp-upgraded")

NTP_BASE_CONFIG = "/etc/mcp/sys/ntpd.xml"
NTP_OVERRIDE_CONFIG = "/etc/mcp/override/ntpd.xml"

NTP_DEFAULT_PATH = "/ifs/.ifsvar/modules/ntp"
NTP_UPGRADED_FILE = os.path.join(NTP_DEFAULT_PATH, "jaws-ntp-upgrade-complete")

def main():
    if os.path.exists(NTP_UPGRADED_FILE):
        return 0

    logger = logging.getLogger("jaws-ntp-upgrade")

    ntpdoc = mxd.loadmxd(NTP_BASE_CONFIG, NTP_OVERRIDE_CONFIG)

    try:
        logger = logging.getLogger("jaws-ntp-upgrade")
        fh = logging.FileHandler(LOG_FILE, 'a')
        fh.setLevel(logging.DEBUG)
        logger.addHandler(fh)
    except EnvironmentError, e:
        syslog.syslog(syslog.LOG_NOTICE,
            "Error running ntp 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))

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

    if os.path.exists(NTP_UPGRADED_FILE):
        logger.info("%s: Ntp upgrade has already occured successfully." %
                    time.ctime())
        sentry.close()
        return 0

    servers = []
    excluded = []
    keyfile = None
    if ntpdoc:
        ntproot = ntpdoc.getroot()
        if ntpdoc:
            server = ntproot.getchildrennamed('server')
            exclude = ntproot.getchildrennamed('excluded')
            key_file = ntproot.getchildrennamed('keyfile')
            if server:
                for i in server:
                    servers.append(i.gettext())
                ntp.set_servers(servers)
            if exclude:
                for i in exclude:
                    excluded.append(i.gettext())
                ntp.set_excluded(excluded)
            if key_file:
                keyfile = key_file[0].gettext()
                if len(keyfile.strip()) != 0:
                    ntp.set_key_file(keyfile)

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

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