import subprocess
import os
import time
from baseCheck import baseCheck

class checkTimeDiffs(baseCheck):

    def getHumanName(self):
            return "Check time synchronization between servers"

    def runCheck(self, config, debug):
        # do whatever is desired to check here.
        # return non-zero if an internal error is detected (equivilent to raising an exception)
        # return 0 for both check pass and check fail.
        #    call self.addWarning(text) or self.addWarning(rawText,humanText) for every warning to be logged
        #    call self.addFailure(text) or self.addFailure(rawText,humanText) for every failure to be logged

        if len(config["environment"]["servers"]) <= 1:
            return 0

        servertime = {}
        for server in config["environment"]["servers"]:

            try:
                datestr = subprocess.Popen(['ssh',server["accessIP"],'-o','StrictHostKeyChecking=no','date','-u','--rfc-3339=seconds'], stdout=subprocess.PIPE).communicate()[0]
                datestr = datestr.strip()
                self.logMsg("Current time on Host %s is %s" % (server["accessIP"], datestr))
                ts = time.strptime(datestr, '%Y-%m-%d %H:%M:%S+00:00')
                servertime[server["accessIP"]] = time.mktime(ts)
            except Exception as e:
                self.addFailure("Unable to determine date/time on server %s." % server["accessIP"])
                self.logMsg("Exception: %s" % str(e))

        if len(servertime) > 0:
            mintime = min(servertime.items(), key=lambda x:x[1])[1]
            maxtime = max(servertime.items(), key=lambda x:x[1])[1]
            diff = maxtime - mintime
            if diff >= (10 * 60):
                self.addFailure("Current time across KVM host servers varies by %d minutes.  Please synchronize time." % (diff / 60))
            elif diff >= 60:
                self.addWarning("Current time across KVM host servers varies by %d minutes.  Please synchronize time." % (diff / 60))

        return 0
