#!/usr/bin/python
# ----------------------------------------------------------------------------
# process_status -- collect systemclock info
#
# January 2022, Anand Kumar, Akshatha
#
# Copyright (c) 2022 by cisco Systems, Inc.
# All rights reserved.
# ----------------------------------------------------------------------------

import sys
import optparse
import commands
import re
import os
platform_prefix = "/opt/cisco/calvados/bin/vrfch.sh CTRL_VRF"
import json
from datetime import datetime
time_zone = {}
import signal

SUCCESS = "success"
FAILURE = "failure"
FAILURE_STR = FAILURE+"$"

def handler(signum, frame):
    print(FAILURE_STR)
    sys.exit(0)

def parse_output(output, metric, vm):
    if output:
        for val in output.split("#"):
            if "@" in val:
                node_name = ""
                if "Warning" in val:
                    lines = val.splitlines()
                    for line in lines:
                        if "Warning" in line:
                            continue
                        val = line.strip() 
                        node_name = (val.split("@")[0]).replace("/", "_")
                else:  
                    node_name = (val.split("@")[0]).replace("/", "_")
                node_time = (val.split("@")[-1]).replace("/", "_").replace("  ", " ")
                tzone = node_time.split()[-2]
                time_zone[tzone] = 1
                metric['systemclock_metric']['metric_info'][node_name] = {}
                metric['systemclock_metric']['metric_info'][node_name]['time'] = node_time
                metric['systemclock_metric']['metric_info'][node_name]['vm_type'] = vm

def get_systemclock_data(data):
    data = data.split("},")
    str = ""

    for i in range(len(data)):
        val = data[i].replace("{", "").replace('"', "").replace("}", "").replace("'", "")
        val = val.split(",")
        node_name =  val[0].split(":")[0]
        vm_type = val[0].split(":")[-1]
        timez = val[-1].split(":", 1)[-1]
        str += node_name + "#" + timez + "#" + vm_type + "\n"
    return (str)

def func_system_clock():
    metric_name = "system-clock"
    metric = {}
    metric_info = "{}"
    output = ""
    health_state = ""
    health_msg = ""
    metric['systemclock_metric'] = {}
    metric['systemclock_metric']['metric_info'] = {}

    vm_list = ["xr", "admin"]
    for vm in vm_list:
        if vm == "xr":
            cmd = "source /pkg/bin/install-functions.sh; xr_time_zone"
        else:
            cmd = "/pkg/bin/install_exec_sysadmin  \"source /opt/cisco/calvados/bin/install-functions.sh; cal_time_zone \""
        status, output = commands.getstatusoutput(cmd)
        if status:
            print(FAILURE_STR)
            sys.exit(0)
        parse_output(output, metric, vm)

    if (len(time_zone.keys()) > 1):
        health_state = 'Warning'
        health_msg = 'System clock is not matching on all nodes'
    else:
        health_state = 'Normal'
        health_msg = 'System clock is matching on all nodes'
    last_update = datetime.now().strftime('%-d %b %H:%M:%S.%f')
    if(metric['systemclock_metric']['metric_info']):
        metric_info = get_systemclock_data(str(metric['systemclock_metric']['metric_info']))

    output = SUCCESS+"$"+metric_name+"$"+health_state+"$"+health_msg+"$"+last_update+"$"+metric_info+"$"
    print(output)

if __name__ == '__main__':
    signal.signal(signal.SIGALRM, handler)
    signal.alarm(6)
    func_system_clock()

