87 lines
2.3 KiB
Python
87 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
|
|
""" Script to discovery DmOS PSU objects in Zabbix """
|
|
|
|
from subprocess import run
|
|
from json import dumps
|
|
from sys import argv
|
|
from re import search, I
|
|
|
|
|
|
def snmp_discovery_info(host, community, oid):
|
|
""" Return SNMP discovery info """
|
|
|
|
cmd = f"snmpbulkwalk -v 2c -c {community} {host} {oid}"
|
|
process = run(cmd, shell=True, capture_output=True, text=True, timeout=30)
|
|
|
|
snmp_info = []
|
|
snmp_error = ''
|
|
while True:
|
|
return_code = process.returncode
|
|
if return_code is not None:
|
|
for output in process.stdout.rstrip().split('\n'):
|
|
if search(r'no such', output, I):
|
|
snmp_error = output.strip()
|
|
break
|
|
else:
|
|
snmp_error = process.stderr.strip()
|
|
snmp_info.append(output.strip())
|
|
break
|
|
|
|
return snmp_info, snmp_error
|
|
|
|
def convert_snmp_value_string_to_decimal(snmp_value):
|
|
""" Return object size and dotted decimal for use in SNMP get """
|
|
|
|
snmp_value_dec = ''
|
|
|
|
snmp_value_size = len(snmp_value)
|
|
|
|
for index in range(snmp_value_size):
|
|
char_decimal = int(''.join(str(ord(snmp_value[index]))))
|
|
|
|
if index == snmp_value_size-1:
|
|
snmp_value_dec += str(char_decimal)
|
|
else:
|
|
snmp_value_dec += str(char_decimal) + '.'
|
|
|
|
return snmp_value_size, snmp_value_dec
|
|
|
|
def main():
|
|
""" Main function """
|
|
|
|
host = argv[1]
|
|
community = argv[2]
|
|
|
|
oid = 'DMOS-HW-MONITOR-MIB::psuStatus'
|
|
snmp_info = snmp_discovery_info(host, community, oid)
|
|
|
|
number_snmp_info = len(snmp_info[0])
|
|
json_data = []
|
|
|
|
ret_error = snmp_info[1]
|
|
snmp_info = snmp_info[0]
|
|
|
|
if ret_error != '':
|
|
print(ret_error)
|
|
exit(1)
|
|
|
|
for i in range(number_snmp_info):
|
|
object = {}
|
|
|
|
regex = r'%s\.\'\.([a-zA-Z0-9\/]{1,50})\'\s.*\s(.*)$' % oid
|
|
output_regex = search(regex, snmp_info[i])
|
|
|
|
object['{#PSU_SLOT_NAME}'] = output_regex.group(1)
|
|
|
|
snmp_value_decimal = convert_snmp_value_string_to_decimal(output_regex.group(1))
|
|
object['{#PSU_SLOT_NAME_LEN}'] = snmp_value_decimal[0]
|
|
object['{#PSU_SLOT_NAME_DEC}'] = snmp_value_decimal[1]
|
|
|
|
json_data.append(object)
|
|
|
|
print(dumps({"data": json_data}, indent=4))
|
|
|
|
|
|
main()
|