Current File : //proc/3/cwd/etc/node_exporter/scripts/adaptec_6
#!/usr/bin/env python

from subprocess import CalledProcessError
import subprocess
import os

def run(command):

    commands = command.split()
    try:
        res = check_output(commands, stderr=open(os.devnull, 'wb'))
        return res
    except CalledProcessError as e:
        return False

def col_value(data, key, index=0):

    col_index = 0

    for line in data.splitlines():
        columns = line.split(' : ')
        col_num = len(columns)
        col_key = columns[0].strip()
        if col_key == key:
            if col_index == index:
                if col_num == 2:
                    return columns[1].strip()
                elif col_num == 3:
                    return columns[1].strip() + ' ' + columns[2].strip()
            col_index += 1

    return False

def last_value(data, key, index=0):

    col_index = 0

    for line in data.splitlines():
        if key in line:
            if col_index == index:
                return line.split()[-1]

    return False

def print_formated(metric, value, index=-1, isString=False):
    if index != -1:
        if not isString:
            print('adaptec_%s{device="%s"} %s' % (metric,index,value))
        else:
            if value == "Online" or value == "Optimal":
                value = 1
                print('adaptec_%s{device="%s"} %s' % (metric,index,value))
            elif ' ' in value:
                splited = value.split(" ")
                print('adaptec_%s{device="%s"} %s' % (metric,index,value))
            else:
                value = 0
                print('adaptec_%s{device="%s"} %s' % (metric,index,value))
    else:
        if not isString:
            print('adaptec_%s %s' % (metric,value))
        else:
            if value == "Online" or value == "Optimal":
                value = 1
                print('adaptec_%s %s' % (metric,value))
            elif ' ' in value:
                splited = value.split(" ")
                if isinstance(splited[0], int):
                    print('adaptec_%s %s' % (metric,splited[0]))
                else:
                    print('adaptec_%s %s' % (metric,0))
            else:
                value = 0
                print('adaptec_%s %s' % (metric,value))

def check_output(*popenargs, **kwargs):
    r"""Run command with arguments and return its output as a byte string.
    Backported from Python 2.7 as it's implemented as pure python on stdlib.
    >>> check_output(['/usr/bin/python', '--version'])
    Python 2.6.2
    """
    process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        error = subprocess.CalledProcessError(retcode, cmd)
        error.output = output
        raise error
    return output

command = '/usr/Arcconf/arcconf GETCONFIG 1'
res = run(command)
controller_status = col_value(res, 'Controller Status')
print_formated('controller_status',controller_status,-1,True)

raid_status = col_value(res, 'Status of Logical Device')
print_formated('raid_status',raid_status,-1,True)

temperature = col_value(res, 'Temperature')
print_formated('controller_temperature',temperature,-1,True)
health = col_value(res, 'Health')
if health:
	print_formated('controller_battery_health',health,-1,True)
for pd_num in range(10): # 0-9

    if col_value(res, 'State', pd_num):
        state = col_value(res, 'State', pd_num)
        print_formated('state',state,pd_num,True)
        smart_warnings = col_value(res, 'S.M.A.R.T. warnings', pd_num)
        print_formated('smart_warnings',smart_warnings,pd_num,False)
        hardware_error_count =  col_value(res, 'Hardware Error Count', pd_num)
        print_formated('hardware_error_count',hardware_error_count,pd_num,False)
        medium_error_count =  col_value(res, 'Medium Error Count', pd_num)
        print_formated('medium_error_count',medium_error_count,pd_num,False)
        parity_error_count =  col_value(res, 'Parity Error Count', pd_num)
        print_formated('parity_error_count',parity_error_count,pd_num,False)
        link_failure_count =  col_value(res, 'Link Failure Count', pd_num)
        print_formated('link_failure_count',link_failure_count,pd_num,False)
        abort_command_count =  col_value(res, 'Aborted Command Count', pd_num)
        print_formated('abort_command_count',abort_command_count,pd_num,False)
        smart_warning_count =  col_value(res, 'SMART Warning Count', pd_num)
        print_formated('smart_warning_count',smart_warning_count,pd_num,False)