blob: e56458c79ab49010bff0d590d9368b43f2ed72d1 [file] [log] [blame]
#!/usr/bin/env python3
r"""
This program will get the system serial number from an OBMC machine and print it to stdout.
"""
import os
import sys
import requests
save_path_0 = sys.path[0]
del sys.path[0]
from gen_arg import * # NOQA
from gen_print import * # NOQA
from gen_valid import * # NOQA
# Restore sys.path[0].
sys.path.insert(0, save_path_0)
logging.captureWarnings(True)
parser = argparse.ArgumentParser(
usage="%(prog)s [OPTIONS]",
description="%(prog)s will get the system serial number from an OBMC"
+ " machine and print it to stdout as follows:\n\n"
+ "mch_ser_num:<ser num>",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
prefix_chars="-+",
)
parser.add_argument(
"--openbmc_username",
default="root",
help="The username for communicating with the OpenBMC machine.",
)
parser.add_argument(
"--openbmc_password",
default="0penBmc",
help="The password for communicating with the OpenBMC machine.",
)
parser.add_argument(
"openbmc_host", help="The host name or IP address of the OpenBMC machine."
)
# Populate stock_list with options we want.
stock_list = [("test_mode", 0), ("quiet", 1)]
def exit_function(signal_number=0, frame=None):
r"""
Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT).
"""
dprint_executing()
dprint_var(signal_number)
qprint_pgm_footer()
def signal_handler(signal_number, frame):
r"""
Handle signals. Without a function to catch a SIGTERM or SIGINT, our program would terminate immediately
with return code 143 and without calling our exit_function.
"""
# Our convention is to set up exit_function with atexit.register() so there is no need to explicitly
# call exit_function from here.
dprint_executing()
# Calling exit prevents us from returning to the code that was running when we received the signal.
exit(0)
def validate_parms():
r"""
Validate program parameters, etc. Return True or False (i.e. pass/fail) accordingly.
"""
gen_post_validation(exit_function, signal_handler)
return True
def create_http_prefix(host):
r"""
Create and return an http prefix string.
Description of argument(s):
host The host being communicated with via the curl command.
"""
return "https://" + host + "/"
def main():
if not gen_get_options(parser, stock_list):
return False
if not validate_parms():
return False
qprint_pgm_header()
session = requests.Session()
http_prefix = create_http_prefix(openbmc_host)
command = http_prefix + "login"
qprint_issuing(command)
resp = session.post(
command,
json={"data": [openbmc_username, openbmc_password]},
verify=False,
)
if resp.json()["status"] != "ok":
json = resp.json()
print_error_report("http request failed:\n" + sprint_var(command))
raise Exception("Login failed.\n")
command = http_prefix + "xyz/openbmc_project/inventory/system"
qprint_issuing(command)
resp = session.get(command, verify=False)
json = resp.json()
if json["status"] != "ok":
print_error_report("http request failed:\n" + sprint_var(command))
raise Exception("http request failed.\n")
try:
mch_ser_num = json["data"]["SerialNumber"]
except KeyError:
print_error_report(
"Failed to find 'SerialNumber' key in the"
+ " following data:\n"
+ sprint_var(json)
)
return False
print_var(mch_ser_num, 0, 0, 0)
return True
# Main
if not main():
exit(1)