#!/usr/bin/python
import sys, os, tempfile
import krb5user

from Tartarus.system import check, krbconf
from Tartarus.client import initialize
from Tartarus.deploy.common import Wizard
from optparse import OptionParser

def _make_tmpfile(realm, kdc):
    tmp = tempfile.TemporaryFile()
    _sections = krbconf.CfgReader()(tmp.read())
    d = _sections.section('libdefaults')
    d.setTag('default_realm', realm)
    s = _sections.section('realms')
    val = krbconf.Subsection()
    val.setTag('kdc', kdc)
    val.setTag('admin_server', kdc)
    s.setTag('realm', val)
    tmp.write(str(_sections))
    tmp.seek(0)
    getpath = tempfile.mkstemp()
    path = getpath[1]
    os.environ['KRB5_CONFIG']=path

def _get_opt(usage=None, defaults=None):
    optp = OptionParser(usage=usage)
    optp.add_option('-d', '--domain')
    optp.add_option('-f', '--fqdn')
    return optp

def main(argv=None):
    if argv is None:
        argv = sys.argv
        opts, argv = _get_opt().parse_args(argv)
        domain = opts.domain
        fqdn = opts.fqdn
        if (domain ==  None) and (fqdn == None) and (len(argv) == 2):
            domain = argv[1]
    else:
        domain = argv
        fqdn = None

    sys.stdout.write("\nCheck of host and domain: ")
    success, error = check.check_host_domain(domain = domain, fqdn = fqdn)
    if (error == []):
        sys.stdout.write('\033[92mDONE\033[0m\n')
    else:
        sys.stdout.write('\033[91mFAIL\033[0m\n')

    for i in success:
        if i.split()[0].startswith("Domain"):
            domain = i.split()[1]
        sys.stdout.write('\t%s\n' % i)
    if (error != []):
        for y in error:
            sys.stdout.write('\t%s\n' % y)

    sys.stdout.write("\nCheck of kerberos DNS-records: ")
    realm, kdc, success, error = check.check_krb5_lookup(domain)
    if (error == []):
        sys.stdout.write('\033[92mDONE\033[0m\n')
    else:
        sys.stdout.write('\033[91mFAIL\033[0m\n')
    for i in success:
        sys.stdout.write('\t%s\n' % i)
    if (error != []):
        for y in error:
            sys.stdout.write('\t%s\n' % y)

    w = Wizard()
    w.opts = {}
    login = w.dialog.ask('\nNext operations needs credentials\nLogin:', 'sysadmin')
    login += "@" + domain.upper()
    krb5user.kinitPasswordPromptPosix(login)

    _make_tmpfile(realm, kdc)
    comm, argv = initialize('deploy', domain = domain)

    sys.stdout.write("\nCheck of time on server and localtime: ")
    success, error = check.check_Time(comm)
    if (error == []):
        sys.stdout.write('\033[92mDONE\033[0m\n')
    else:
        sys.stdout.write('\033[91mFAIL\033[0m\n')
    for i in success:
        sys.stdout.write('\t%s\n' % i)
    if (error != []):
        for y in error:
            sys.stdout.write('\t%s\n' % y)

    sys.stdout.write("\nCheck of DNS Service: ")
    success, error = check.check_DNS(comm)
    if (error == []):
        sys.stdout.write('\033[92mDONE\033[0m\n')
    else:
        sys.stdout.write('\033[91mFAIL\033[0m\n')
    for i in success:
        sys.stdout.write('\t%s\n' % i)
    if (error != []):
        for y in error:
            sys.stdout.write('\t%s\n' % y)

if __name__ == '__main__':
    main()
