blob: d754bea1cdc8ecf3b95b3a48d025aabae4cea765 [file] [log] [blame]
#!/usr/bin/env python3
import os
import re
import json
from data import variables
from collections import OrderedDict
bmc_rec_pattern = '^=(.*)\n(.*)\n(.*)\n(.*)\n(.*)'
bmc_prop_pattern = [r"\w+", r"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}", '443']
bmc_rec_prop = ['hostname', 'address', 'port', 'txt']
class Exception(Exception):
def __init__(self, exc_value):
self.exc_value = exc_value
def __str__(self):
return repr(self.exc_value)
def Check_bmc_record_exists(bmc_records, bmc_ip):
r"""
Parse the BMC records to check for passed input.
Description of arguments:
bmc_records Contains the list of discoverd BMC records.
bmc_ip BMC ip address.
"""
try:
for bmc_key, bmc_val in bmc_records.items():
temp_ip = bmc_val.get('address', None)
if bmc_ip.strip() == temp_ip.strip():
return True
else:
return False
except Exception as exc_obj:
return exc_obj
def validate_bmc_properties(bmc_prop_pattern, bmc_prop, bmc_value,
bmc_rec_valid):
r"""
This function is to check pattern match in bmc properties.
Description of arguments:
bmc_prop_pattern Regex pattern.
bmc_prop BMC property (e.g. hostname, address, port).
bmc_value BMC property value.
bmc_rec_valid Contain BMC properties record.
"""
try:
status = \
[lambda bmc_prop: re.search(bmc_prop_pattern, bmc_prob),
bmc_value]
if None in status:
bmc_rec_valid[bmc_prop] = None
except Exception as exc_obj:
return exc_obj
finally:
return bmc_rec_valid
def bmc_record_validation(bmc_rec_valid):
r"""
Parse the BMC records to validate the data is valid.
Description of arguments:
bmc_rec_valid Contain BMC properties record.
"""
try:
for bmc_prop_key, bmc_pattern_val in \
zip(bmc_rec_prop, bmc_prop_pattern):
bmc_prop_value = bmc_rec_valid.get(bmc_prop_key, False)
if bmc_rec_valid[bmc_prop_key] is not False:
valid_status = validate_bmc_properties(bmc_pattern_val,
bmc_prop_key,
bmc_prop_value,
bmc_rec_valid)
if None not in bmc_rec_valid.values():
return bmc_rec_valid
else:
return None
except Exception as exc_obj:
return exc_obj
def bmc_inventory(service_type, bmc_inv_record):
r"""
Parse single record of BMC inventory and pack to dictionary form.
Description of arguments:
service_type Service type (e.g. _obmc_rest._tcp, _obmc_redfish._tcp).
bmc_inv_record Individual BMC inventory record.
This function will return this variable i.e.
bmc_inv in dictionary form as mention below.
Below are the discovered BMC detail.
[service]: _obmc_XXXX._tcp
[hostname]: System Name
[address]: XXX.XXX.XXX.XXX
[port]: XXX
[txt]:
"""
try:
exc_obj = None
bmc_inv = OrderedDict()
service_count = 0
for line in bmc_inv_record.split('\n'):
if line == "":
pass
elif service_type in line:
bmc_inv['service'] = service_type
service_count += 1
elif not line.startswith('=') and service_count == 1:
bmc_inv[line.split('=')[0].strip()] = \
str(line.split('=')[-1].strip())[1:-1]
except Exception as exc_obj:
return exc_obj
finally:
valid_status = bmc_record_validation(bmc_inv)
if valid_status is None:
return None, exc_obj
else:
return valid_status, exc_obj
def get_bmc_records(service_type, bmc_records):
r"""
Parse the string to filter BMC discovery.
Description of arguments:
service_type Service type (e.g. RESTService, RedfishService).
bmc_records Contains the list of discoverd BMC records.
This function will return this variable i.e.
bmc_inv_list in dictionary form as mention below.
Below are the list of discovered BMC details.
[1]:
[service]: _obmc_XXXX._tcp
[hostname]: System Name
[address]: XXX.XXX.XXX.XXX
[port]: XXX
[txt]:
[2]:
[service]: _obmc_XXXX._tcp
[hostname]: System Name
[address]: XXX.XXX.XXX.XXX
[port]: XXX
[txt]:
"""
try:
count = 0
exe_obj = None
bmc_inv_list = OrderedDict()
for match in re.finditer(bmc_rec_pattern, bmc_records,
re.MULTILINE):
bmc_record, exc_msg = \
bmc_inventory(service_type, match.group())
if bmc_record is not None and exc_msg is None:
count += 1
bmc_inv_list[count] = bmc_record
except Exception as exe_obj:
return exe_obj
finally:
if len(bmc_inv_list) == 0:
'', exe_obj
else:
return bmc_inv_list, exe_obj