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

import commands
import json
from datetime import datetime

import signal

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

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

def get_config_data(data):
    data = data.replace('"', "").replace("{", "").replace("}", "").replace("'", "")
    return(data)

def func_config_inconsistency():
    alraised = False
    metric_name = "config-inconsistency"
    metric = {}
    metric_info = ""
    health_state = ""
    health_msg = ""
    output = "" 
    metric['config_inconsistency_metric'] = {}
    metric['config_inconsistency_metric']['metric_info'] = {}

    cmd = "/pkg/bin/sdr_actioncmd \'CONFIG_INCONSISTENCY_STATE_XR\'"
    status, xr_output = commands.getstatusoutput(cmd)
    if status:
        print(FAILURE_STR)
        sys.exit(0)     

    cmd = "/pkg/bin/sdr_actioncmd \'CONFIG_INCONSISTENCY_STATE_ADMIN\'"    
    status, admin_output = commands.getstatusoutput(cmd)
    if status:
        print(FAILURE_STR)
        sys.exit(0)     

    msg = ""
    if xr_output == "alarm_raised" and admin_output == "alarm_raised":
       msg = "Config inconsistency alarm raised on XR and Admin"
       alraised = True  
    elif xr_output == "alarm_raised" and admin_output == "alarm_not_raised":
       msg = "Config inconsistency alarm raised on XR"
       alraised = True
    elif xr_output == "alarm_not_raised" and admin_output == "alarm_raised":
       msg = "Config inconsistency alarm raised on Admin"
       alraised = True
    elif xr_output == "alarm_not_raised" and admin_output == "alarm_not_raised":
       msg = "Config inconsistency alarm not raised on XR and Admin"

    if alraised:
        metric_info = msg
        health_state = 'Warning'
        health_msg = 'Alarm raised for config inconsistency'
    else:     
        metric_info = msg
        health_state = 'Normal'
        health_msg = 'No alarm raised for config inconsistency'

    last_update = datetime.now().strftime('%-d %b %H:%M:%S.%f')

    if(metric['config_inconsistency_metric']['metric_info']):
        metric_info = get_config_data(str(metric['config_inconsistency_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_config_inconsistency()

