Files

213 lines
7.8 KiB
Python

###
# Copyright 2016-2024 Hewlett Packard Enterprise, Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
###
# -*- coding: utf-8 -*-
"""DetectiLO Command for RDMC"""
from redfish.hpilo.vnichpilo import AppAccount
from redfish.rest.connections import ChifDriverMissingOrNotFound, VnicNotEnabledError
import requests
try:
from rdmc_helper import (
UI,
InvalidCommandLineErrorOPTS,
ReturnCodes,
GenBeforeLoginError,
VnicExistsError,
)
except ImportError:
from ilorest.rdmc_helper import (
UI,
InvalidCommandLineErrorOPTS,
ReturnCodes,
GenBeforeLoginError,
VnicExistsError,
)
class DetectiLOCommand:
"""Constructor"""
def __init__(self):
self.ident = {
"name": "detectilo",
"usage": None,
"description": "Provides the iLO generation of the currently logged-in server.\n\n"
"If --ignore_session is specified, it retrieves the iLO generation of the IP mentioned in --url\n"
"or attempts to determine the iLO generation of the current server.",
"summary": "Retrieves the iLO generation of the server.",
"aliases": [],
"auxcommands": [],
}
self.cmdbase = None
self.rdmc = None
self.auxcommands = dict()
def run(self, line, help_disp=False):
"""Main get worker function
:param line: command line input
:type line: string.
"""
if help_disp:
line.append("-h")
try:
(_, _) = self.rdmc.rdmc_parse_arglist(self, line)
except:
return ReturnCodes.SUCCESS
return ReturnCodes.SUCCESS
try:
(options, _) = self.rdmc.rdmc_parse_arglist(self, line)
except (InvalidCommandLineErrorOPTS, SystemExit):
if ("-h" in line) or ("--help" in line):
return ReturnCodes.SUCCESS
else:
raise InvalidCommandLineErrorOPTS("")
if not options.ignore_session and not options.url:
client = self.detectilovalidation(options)
if client:
if not options.json:
self.rdmc.ui.printer("Using the current logged in session information.\n")
if not any(substring in client.base_url for substring in ("blobstore", "16.1.15.1")):
options.url = client.base_url.split("/")[-1]
if options.url:
if not options.json:
self.rdmc.ui.printer("Detecting iLO for remote device %s\n" % options.url)
retcode = self.detect_remote_ilotype(options)
else:
if not options.json:
self.rdmc.ui.printer("Detecting iLO for this server.\n")
retcode = self.detect_local_ilotype(options)
return retcode
def detectilovalidation(self, options):
"""detectilo validation function
:param options: command line options
:type options: list.
"""
return self.rdmc.login_select_validation(self, options)
def detect_remote_ilotype(self, options):
try:
path = "https://" + options.url + "/redfish/v1"
data = requests.get(path, verify=False)
json_data = data.json()
Oem_Hpe = json_data["Oem"]["Hpe"]
if "ManagerType" in Oem_Hpe["Manager"][0]:
ilo_ver = int(Oem_Hpe["Manager"][0]["ManagerType"].split(" ")[1])
else:
manager_data = Oem_Hpe["Moniker"]
ilo_ver = int(manager_data["PRODGEN"].split(" ")[1])
except Exception as excp:
raise GenBeforeLoginError(
"An error occurred while retrieving the iLO generation. "
"Please ensure that the virtual NIC is enabled for iLO7 based "
"servers, or that the CHIF driver is installed for iLO5 "
"and iLO6 based servers.\n"
)
if options.json:
content = {"iLOType": ilo_ver}
UI().print_out_json(content)
else:
self.rdmc.ui.printer("iLO Type: %s\n" % ilo_ver)
return ReturnCodes.SUCCESS
def detect_local_ilotype(self, options):
app_obj = AppAccount(log_dir=self.rdmc.log_dir)
security_state_dict = {
0: "Error occurred while fetching the security state",
1: "Factory",
2: "Wipe",
3: "Production",
4: "HighSecurity",
5: "FIPS",
6: "SuiteB",
}
try:
ilo_ver, sec_state = self.rdmc.app.getilover_beforelogin(app_obj)
if options.json:
contents = {"iLOType": str(ilo_ver)}
if ilo_ver < 7:
contents["SecurityState"] = security_state_dict[sec_state]
UI().print_out_json(contents)
else:
self.rdmc.ui.printer("iLO Type: %s\n" % ilo_ver)
if ilo_ver < 7:
self.rdmc.ui.printer("Security State: %s\n" % security_state_dict[sec_state])
return ReturnCodes.SUCCESS
except ChifDriverMissingOrNotFound:
if options.json:
contents = {"iLOType": "5_6"}
UI().print_out_json(contents)
else:
self.rdmc.ui.printer("iLO Type: Unable to find iLO generation\n")
raise
except VnicNotEnabledError:
ilo_ver = 7
if options.json:
contents = {"iLOType": str(ilo_ver)}
UI().print_out_json(contents)
else:
self.rdmc.ui.printer("iLO Type: %s\n" % ilo_ver)
raise VnicExistsError(
"Unable to access iLO using virtual NIC. "
"Please ensure virtual NIC is enabled in iLO. "
"Ensure that virtual NIC in the host OS is "
"configured properly. Refer to documentation for more information.\n"
)
except Exception:
raise GenBeforeLoginError(
"An error occurred while retrieving the iLO generation. "
"Please ensure that the virtual NIC is enabled for iLO7 based "
"servers, or that the CHIF driver is installed for iLO5 and iLO6 "
"based servers.\n"
)
def definearguments(self, customparser):
"""Wrapper function for new command main function
:param customparser: command line input
:type customparser: parser.
"""
if not customparser:
return
self.cmdbase.add_login_arguments_group(customparser)
customparser.add_argument(
"-j",
"--json",
dest="json",
action="store_true",
help="Optionally include this flag if you wish to change the"
" displayed output to JSON format. Preserving the JSON data"
" structure makes the information easier to parse.",
default=False,
)
customparser.add_argument(
"--ignore_session",
dest="ignore_session",
action="store_true",
help="Optionally include this flag if you wish to ignore any"
" session that has been logged in, in order to perform detectilo",
default=False,
)