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 time 10*ddfc6752SPatrick Williamsimport traceback 11*ddfc6752SPatrick Williams 12*ddfc6752SPatrick Williamsimport requests 135e89efd9SSpencerKu 145e89efd9SSpencerKuparser = argparse.ArgumentParser() 155e89efd9SSpencerKuparser.add_argument("--host", help="Host to connect to", required=True) 165e89efd9SSpencerKuparser.add_argument("--cert", help="File path to cert", required=True) 171349014dSPatrick Williamsparser.add_argument( 181349014dSPatrick Williams "--username", help="Username to connect with", default="root" 191349014dSPatrick Williams) 205e89efd9SSpencerKuparser.add_argument("--password", help="Password to use", default="0penBmc") 215e89efd9SSpencerKu 225e89efd9SSpencerKuargs = parser.parse_args() 235e89efd9SSpencerKu 245e89efd9SSpencerKu 255e89efd9SSpencerKudef requests_get(url): 265e89efd9SSpencerKu try: 275e89efd9SSpencerKu resp = requests.get( 285e89efd9SSpencerKu url=url, 295e89efd9SSpencerKu cert=args.cert, 305e89efd9SSpencerKu verify=False, 315e89efd9SSpencerKu headers={"Cache-Control": "no-cache"}, 325e89efd9SSpencerKu timeout=5, 335e89efd9SSpencerKu ) 345e89efd9SSpencerKu data = resp.json() 355e89efd9SSpencerKu 365e89efd9SSpencerKu if resp.status_code != requests.codes.ok: 371349014dSPatrick Williams print( 381349014dSPatrick Williams "There occurs error when get request, status_code = " 391349014dSPatrick Williams + str(resp.status_code) 401349014dSPatrick Williams + "\n" 411349014dSPatrick Williams ) 421349014dSPatrick Williams print(json.dumps(data, indent=4, sort_keys=True)) 435e89efd9SSpencerKu pass 445e89efd9SSpencerKu 455e89efd9SSpencerKu return data 465e89efd9SSpencerKu 47*ddfc6752SPatrick Williams except Exception: 485e89efd9SSpencerKu traceback.print_exc() 495e89efd9SSpencerKu pass 505e89efd9SSpencerKu 515e89efd9SSpencerKu 525e89efd9SSpencerKudef label_parser(url, label): 535e89efd9SSpencerKu data = requests_get(url) 545e89efd9SSpencerKu for key in sorted(data.keys()): 555e89efd9SSpencerKu if key == label: 565e89efd9SSpencerKu content = data[key] 575e89efd9SSpencerKu break 585e89efd9SSpencerKu return content 595e89efd9SSpencerKu 605e89efd9SSpencerKu 615e89efd9SSpencerKudef main(): 625e89efd9SSpencerKu logging.captureWarnings(True) 635e89efd9SSpencerKu totalEntryUri = ( 64*ddfc6752SPatrick Williams f"https://{args.host}/redfish/v1/Systems/system/" 65*ddfc6752SPatrick Williams + "LogServices/HostLogger/Entries/" 665e89efd9SSpencerKu ) 675e89efd9SSpencerKu id = 0 685e89efd9SSpencerKu entryCount = 0 695e89efd9SSpencerKu message = "" 705e89efd9SSpencerKu 715e89efd9SSpencerKu while 1: 725e89efd9SSpencerKu entryCount = label_parser(totalEntryUri, "Members@odata.count") 735e89efd9SSpencerKu if id == entryCount: 741349014dSPatrick Williams # entryCount equals to ID means there has no change during the 751349014dSPatrick Williams # interval, sleep 5 seconds for next search. 765e89efd9SSpencerKu time.sleep(5) 775e89efd9SSpencerKu elif id < entryCount: 785e89efd9SSpencerKu # print new entries which created in this interval. 795e89efd9SSpencerKu for i in range(id + 1, entryCount): 805e89efd9SSpencerKu singleEntryUri = ( 815e89efd9SSpencerKu "https://{}/redfish/v1/Systems/system/LogServices/" 825e89efd9SSpencerKu "HostLogger/Entries/{}".format(args.host, i) 835e89efd9SSpencerKu ) 845e89efd9SSpencerKu message = label_parser(singleEntryUri, "Message") 851349014dSPatrick Williams # need to present all special characters, so use "repr" 861349014dSPatrick Williams # function 875e89efd9SSpencerKu print(repr(message)) 885e89efd9SSpencerKu id = entryCount 895e89efd9SSpencerKu 905e89efd9SSpencerKu 915e89efd9SSpencerKumain() 92