15e89efd9SSpencerKu#!/usr/bin/env python3 25e89efd9SSpencerKu 35e89efd9SSpencerKu# Simple script to expose host serial console logs 45e89efd9SSpencerKu# Search and get the log via redfish in every 5 seconds 55e89efd9SSpencerKu 65e89efd9SSpencerKuimport argparse 75e89efd9SSpencerKuimport json 85e89efd9SSpencerKuimport logging 95e89efd9SSpencerKuimport os.path 105e89efd9SSpencerKuimport requests 115e89efd9SSpencerKuimport traceback 125e89efd9SSpencerKuimport time 135e89efd9SSpencerKufrom requests.auth import HTTPBasicAuth 145e89efd9SSpencerKu 155e89efd9SSpencerKuparser = argparse.ArgumentParser() 165e89efd9SSpencerKuparser.add_argument("--host", help="Host to connect to", required=True) 175e89efd9SSpencerKuparser.add_argument("--cert", help="File path to cert", required=True) 18*1349014dSPatrick Williamsparser.add_argument( 19*1349014dSPatrick Williams "--username", help="Username to connect with", default="root" 20*1349014dSPatrick Williams) 215e89efd9SSpencerKuparser.add_argument("--password", help="Password to use", default="0penBmc") 225e89efd9SSpencerKu 235e89efd9SSpencerKuargs = parser.parse_args() 245e89efd9SSpencerKu 255e89efd9SSpencerKu 265e89efd9SSpencerKudef requests_get(url): 275e89efd9SSpencerKu try: 285e89efd9SSpencerKu resp = requests.get( 295e89efd9SSpencerKu url=url, 305e89efd9SSpencerKu cert=args.cert, 315e89efd9SSpencerKu verify=False, 325e89efd9SSpencerKu headers={"Cache-Control": "no-cache"}, 335e89efd9SSpencerKu timeout=5, 345e89efd9SSpencerKu ) 355e89efd9SSpencerKu data = resp.json() 365e89efd9SSpencerKu 375e89efd9SSpencerKu if resp.status_code != requests.codes.ok: 38*1349014dSPatrick Williams print( 39*1349014dSPatrick Williams "There occurs error when get request, status_code = " 40*1349014dSPatrick Williams + str(resp.status_code) 41*1349014dSPatrick Williams + "\n" 42*1349014dSPatrick Williams ) 43*1349014dSPatrick Williams print(json.dumps(data, indent=4, sort_keys=True)) 445e89efd9SSpencerKu pass 455e89efd9SSpencerKu 465e89efd9SSpencerKu return data 475e89efd9SSpencerKu 485e89efd9SSpencerKu except Exception as err: 495e89efd9SSpencerKu traceback.print_exc() 505e89efd9SSpencerKu pass 515e89efd9SSpencerKu 525e89efd9SSpencerKu 535e89efd9SSpencerKudef label_parser(url, label): 545e89efd9SSpencerKu data = requests_get(url) 555e89efd9SSpencerKu for key in sorted(data.keys()): 565e89efd9SSpencerKu if key == label: 575e89efd9SSpencerKu content = data[key] 585e89efd9SSpencerKu break 595e89efd9SSpencerKu return content 605e89efd9SSpencerKu 615e89efd9SSpencerKu 625e89efd9SSpencerKudef main(): 635e89efd9SSpencerKu logging.captureWarnings(True) 645e89efd9SSpencerKu totalEntryUri = ( 65*1349014dSPatrick Williams "https://{}/redfish/v1/Systems/system/" 66*1349014dSPatrick Williams + "LogServices/HostLogger/Entries/".format(args.host) 675e89efd9SSpencerKu ) 685e89efd9SSpencerKu id = 0 695e89efd9SSpencerKu entryCount = 0 705e89efd9SSpencerKu message = "" 715e89efd9SSpencerKu 725e89efd9SSpencerKu while 1: 735e89efd9SSpencerKu entryCount = label_parser(totalEntryUri, "Members@odata.count") 745e89efd9SSpencerKu if id == entryCount: 75*1349014dSPatrick Williams # entryCount equals to ID means there has no change during the 76*1349014dSPatrick Williams # interval, sleep 5 seconds for next search. 775e89efd9SSpencerKu time.sleep(5) 785e89efd9SSpencerKu elif id < entryCount: 795e89efd9SSpencerKu # print new entries which created in this interval. 805e89efd9SSpencerKu for i in range(id + 1, entryCount): 815e89efd9SSpencerKu singleEntryUri = ( 825e89efd9SSpencerKu "https://{}/redfish/v1/Systems/system/LogServices/" 835e89efd9SSpencerKu "HostLogger/Entries/{}".format(args.host, i) 845e89efd9SSpencerKu ) 855e89efd9SSpencerKu message = label_parser(singleEntryUri, "Message") 86*1349014dSPatrick Williams # need to present all special characters, so use "repr" 87*1349014dSPatrick Williams # function 885e89efd9SSpencerKu print(repr(message)) 895e89efd9SSpencerKu id = entryCount 905e89efd9SSpencerKu 915e89efd9SSpencerKu 925e89efd9SSpencerKumain() 93