# -*- coding: utf-8 -*-
import logging, os, time
import commands
import subprocess
import ConfigParser
import urllib2
config_file = "mv_config"
data_config = __import__(config_file, globals(), locals(), [])

module_config = ConfigParser.RawConfigParser()
try:
    module_config.read('/etc/mythvantage.cfg')
except:
    logging.info("couldn't read mythvantage.cfg")

class config_extra_reader(object):
    def __init__(self,url):
        self.url=url
        self.Config = ConfigParser.ConfigParser()
        req = urllib2.Request(url)
        response = urllib2.urlopen(req)
        self.Config.readfp(response)

    def print_url(self):
        print self.url


    def print_sections(self):
        print self.Config.sections()


    def read_config(self,data):
        rvalue = True
        section = "extra"
        try:
            rvalue = self.Config.get(section, data)
            if rvalue == "False":
                rvalue = False
            if rvalue == "no":
                rvalue = False
        except:
            logging.debug("Couldn't read config_file")
            rvalue = True

        return rvalue



def read_config(module_config,data):
    rvalue = True
    section = "mythvantage"
    try:
        rvalue = module_config.get(section, data)
        if rvalue == "False":
            rvalue = False
        if rvalue == "no":
            rvalue = False


    except:
        logging.debug("Couldn't read mythvantage.cfg")
        rvalue = True

    return rvalue


def runcmd_bg(cmd):
    subprocess.Popen(cmd)

def runcmd(cmd):
    if data_config.NOOPDEBUG=="FALSE":
        pass
    else:
        cmd = "echo "+cmd
    logging.debug("    %s",cmd)
    cmdout = commands.getstatusoutput(cmd)
    logging.debug("    %s",cmdout)
    return cmdout[0]

def runcmd_output(cmd):
    if data_config.NOOPDEBUG=="FALSE":
        pass
    else:
        cmd = "echo "+cmd
    logging.debug("    %s",cmd)
    cmdout = commands.getstatusoutput(cmd)
    logging.debug("    %s",cmdout)
    return cmdout[1]

def services(systemconfig):
    logging.debug("______Start of services______")
    logging.debug("__End services")

def cp_and_log(srcfile,destfile):
    #return
    if not os.path.exists(srcfile):
        logging.info("%s is not present, skipping...",srcfile)
    else:
        cmd = ("rsync -arhp %s %s") %(srcfile,destfile)
        runcmd(cmd)

def link_file(srcfile,link_name):
    logging.info("    Trying to link %s ->  %s",srcfile,link_name)
    if not os.path.exists(srcfile):
        logging.info("    %s is not present, skipping...",srcfile)
    elif os.path.exists(link_name):
        logging.info("    %s is present, skipping...",link_name)
    else:
        try:
            os.symlink(srcfile, link_name)
        except:
            logging.info("    Problem linking files occured")

    return

def mkdir_mythhome(mythhome,user,grp=1000):
     if not os.path.exists(mythhome+"/.mythtv"):
        logging.debug("    Creating %s/.mythtv",mythhome)
        try:
            os.mkdir(mythhome+"/.mythtv")
        except:
            logging.debug("   Couldn't create .mythtv ")

        try:
            #os.chown(mythhome+"/.mythtv", int(user), int(grp))
            #logging.debug("*    Couldn't chown of %s", mythhome)

            cmd = ''' chown -R %s %s/.mythtv''' %(user,mythhome)
            runcmd(cmd)
            cmd = ''' chgrp -R %s %s/.mythtv''' %(grp,mythhome)
            runcmd(cmd)
        except:
            logging.debug("*    Couldn't chown of %s", mythhome)
            pass



def add_service(daemon):
    logging.info("    Adding service %s",daemon)
    cmd = "add_service.sh %s" %daemon
    runcmd(cmd)

def remove_service(daemon):
    logging.info("    Removing service %s",daemon)
    stop_service(daemon)
    cmd = "remove_service.sh %s" %daemon
    runcmd(cmd)

def start_service(daemon):
    logging.info("    start service %s",daemon)
    cmd = "sv start %s" %daemon
    runcmd(cmd)

def stop_service(daemon):
    logging.info("    stop service %s",daemon)
    cmd = "sv stop %s" %daemon
    runcmd(cmd)

def restart_service(daemon):
    logging.info("    Restarting service %s",daemon)
    if daemon == "lcdd":
        stop_service(daemon)
        logging.debug("    killing all lcdd")
        cmd = "killall -9 LCDd"
        runcmd(cmd)
        time.sleep(2)
        start_service(daemon)
    else:
        cmd = "sv restart %s" %daemon
        runcmd(cmd)

def check_service(daemon):
    logging.info("    Checking status of service %s",daemon)
    cmd = "sv status %s" %daemon
    results = runcmd_output(cmd)
    status = results.split()[0]
    if status == "run:":
        return True
    else:
        return False

def hup_service(daemon):
    logging.info("    hup service %s",daemon)
    cmd = "sv hup %s" %daemon
    runcmd(cmd)



def pkg_blacklist_check(pkg):
    cmd = '''grep -q %s /etc/blacklist.package''' %pkg
    rc = runcmd(cmd)
    if rc == 0:
        return True
    else:
        return False

def pkg_installed_check(pkg):
    logging.debug("    Checking if %s is installed",pkg)
    cmd = "pacman -Q %s " %pkg
    rc = runcmd(cmd)
    if rc == 0:
        return True
    else:
        return False


def pacinstall(pkg):
    logging.info("    Checking %s for install",pkg)
    #extra pkg check
    if pkg == "xine":
        pacinstall("xine-ui")
    elif pkg == "dvdcss":
        pacinstall("libdvdcss")
    elif pkg == "webmin":
        add_service("webmin")
    elif pkg == "fuppes":
        pacinstall("fuppes-svn")
    elif pkg == "mupen64":
        pacinstall("mupen64plus")
    elif pkg == "dolphinemu":
        pacinstall("dolphin-emu")
    elif pkg == "webonlinhes":
        pacinstall("web-on-linhes")
    elif pkg == "xbmc":
        pacinstall("xbmc-pvr-addons")
    elif pkg == "kodi":
        pacinstall("kodi-addon-pvr-mythtv-git")
    elif pkg == "plexhometheater":
        pacinstall("openpht")
    elif pkg == "plexmediaserver":
        pacinstall("plex-media-server")
    elif pkg == "mame":
         pacinstall("sdlmame")
    elif pkg == "foldingathome":
         add_service("fah")

    elif pkg == "xymonclient":
        if os.path.exists('/home/xymon/client'):
            cmd='''pacman --noconfirm --dbonly -Sdd --force xymonclient'''
            runcmd(cmd)

    if  not pkg_blacklist_check(pkg):
        if pkg_installed_check(pkg):
            logging.info("    %s is already installed, will not install",pkg)
        else:
            logging.info("    Installing %s",pkg)
            cmd ='''pacman --noconfirm -S --force %s ''' %pkg
            runcmd(cmd)
    else:
        logging.info("    %s is blacklisted, will not install",pkg)

def pacremove(pkg):
    logging.info("    Checking %s for removal",pkg)
    if pkg == "xine":
        pacremove("xine-ui")
    elif pkg == "dvdcss":
        pacremove("libdvdcss")
    elif pkg == "webmin":
        remove_service("webmin")
    elif pkg == "fuppes":
        pacremove("fuppes-svn")
    elif pkg == "mupen64":
        pacremove("mupen64plus")
    elif pkg == "dolphinemu":
        pacremove("dolphin-emu")
    elif pkg == "webonlinhes":
        pacremove("web-on-linhes")
    elif pkg == "xbmc":
        pacremove("xbmc-pvr-addons")
    elif pkg == "kodi":
        pacremove("kodi-addon-pvr-mythtv-git")
    elif pkg == "plexhometheater":
        pacremove("openpht")
    elif pkg == "plexmediaserver":
        pacremove("plex-media-server")
    elif pkg == "mame":
        pacremove("sdlmame")
    elif pkg == "foldingathome":
        remove_service("fah")


    if  not pkg_blacklist_check(pkg):
        if not pkg_installed_check(pkg):
            logging.info("    %s is not installed, will not remove",pkg)
        else:
            logging.info("    Removing %s",pkg)
            cmd ='''pacman --noconfirm -R  %s ''' %pkg
            runcmd(cmd)
    else:
        logging.info("    %s is blacklisted, will not remove",pkg)

def getpid(process):
    return commands.getoutput('pidof %s' % process)

def remove_file(filename):
    logging.debug("    Removing %s", filename)
    try:
        os.remove(filename)
    except:
        logging.debug("*     Could not remove %s", filename)


def restartLCD(RESTART_LCD):
    if  RESTART_LCD :
        logging.info("    Restarting lcd server")
        cmd = "killall -9 mythlcdserver"
        runcmd(cmd)
    else:
        logging.debug("    Not restarting MYTHLCD server")


def reloadfe(dbhost,RESTART_LCD):
    logging.debug("____Start of reloadfe____")
    if data_config.SYSTEMTYPE == "MythVantage":
        logging.info("    Clearing Backend cache")
        cmd = '''/usr/bin/backend_control.sh  clearcache  behost %s''' %dbhost
        runcmd(cmd)

    restartLCD(RESTART_LCD)
#    for pid in getpid("mythfrontend"):
    pid = getpid("mythfrontend")
    cmd = ''' kill -s USR1 %s ''' %pid
    runcmd(cmd)
    logging.info("    Reloading frontend with pid of %s",pid)

    logging.debug("__End of reloadfe\n")


def restartfe(RESTART_LCD):
    logging.debug("____Start of restartfe____")
    if data_config.SYSTEMTYPE=="LinHES":
        logging.debug("    LinHES seems to be running will not restartfe")
        return
    logging.info("    Restarting frontend")
    restartLCD(RESTART_LCD)
    cmd="killall -9 mythfrontend"
    runcmd(cmd)
    cmd="killall -9 welcome"
    runcmd(cmd)
    logging.debug("__End of restartfe\n")


def udev_trigger():
    logging.info("    Triggering udev")
    cmd = "udevadm settle"
    runcmd(cmd)
    cmd = "udevadm trigger"
    runcmd(cmd)
    cmd = "udevadm settle"
    runcmd(cmd)
    cmd = "udevadm trigger"
    runcmd(cmd)