blob: 827ed7cfd7439cf3ac187e1e4785ff2278855f7b [file] [log] [blame]
Patrick Williamsb19c34c2017-03-27 14:52:28 -05001#!/bin/env python
2
Patrick Williams9b05ea32017-03-27 15:22:31 -05003import argparse
Patrick Williamsb19c34c2017-03-27 14:52:28 -05004import requests
5
Andrew Geissler39541fd2017-08-19 08:31:07 -05006import urllib3
7urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
8
Patrick Williams533c13a2017-03-27 15:28:51 -05009
Patrick Williamsb19c34c2017-03-27 14:52:28 -050010class BMC:
11 def __init__(self, server):
12 self.url = "https://{0}/".format(server)
13 self.session = requests.Session()
14 self.login()
15
16 def login(self):
17 r = self.session.post(self.url + 'login',
Patrick Williams533c13a2017-03-27 15:28:51 -050018 json={'data': ['root', '0penBmc']},
Patrick Williamsb19c34c2017-03-27 14:52:28 -050019 verify=False)
20 j = r.json()
21 if j['status'] != 'ok':
22 raise Exception("Failed to login: \n" + r.text)
23
Patrick Williamsec472d82017-03-27 15:15:43 -050024 def list_events(self):
25 r = self.session.get(self.url + 'xyz/openbmc_project/logging/entry/',
26 verify=False)
27 j = r.json()
28 if j['status'] != 'ok':
29 raise Exception("Failed to query entries: \n" + r.text)
30
31 events = j['data']
32 events.sort(key=lambda x: int(x.split("/")[-1]))
33
34 return events
Patrick Williamsb19c34c2017-03-27 14:52:28 -050035
Patrick Williams5e98b3a2017-03-27 15:28:35 -050036 def get_event(self, event):
37 r = self.session.get(self.url + event, verify=False)
38
39 j = r.json()
40 if j['status'] != 'ok':
41 raise Exception("Failed to get event " + event + ": \n" + r.text)
42
43 return j['data']
Andrew Geissler50a753c2017-08-19 09:00:16 -050044
45 def clear_event(self,event):
46 r = self.session.delete(self.url + event)
47 j = r.json()
48 if j['status'] != 'ok':
49 raise Exception("Failed to clear event " + event + ": \n" + r.text)
Patrick Williams5e98b3a2017-03-27 15:28:35 -050050
Patrick Williamsb19c34c2017-03-27 14:52:28 -050051
Patrick Williams9b05ea32017-03-27 15:22:31 -050052def do_list_events(args):
53 s = BMC(server=args.server)
54 for e in s.list_events():
55 print(e)
56
Patrick Williams5e98b3a2017-03-27 15:28:35 -050057
58def do_view_event(args):
59 s = BMC(server=args.server)
60 print(s.get_event(args.event))
61
Andrew Geissler50a753c2017-08-19 09:00:16 -050062def do_clear_event(args):
63 s = BMC(server=args.server)
64 s.clear_event(args.event)
Patrick Williams4296f4b2017-03-27 16:26:41 -050065
Patrick Williams7a09b672017-03-27 15:39:12 -050066def do_get_esel(args):
67 s = BMC(server=args.server)
68 e = s.get_event(args.event)
69 if e['Message'] != 'org.open_power.Error.Host.Event' and\
70 e['Message'] != 'org.open_power.Error.Host.Event.Event':
71 raise Exception("Event is not from Host: " + e['Message'])
72 for d in e['AdditionalData']:
Patrick Williams842308b2017-03-27 15:49:38 -050073 data = d.split("=")
74 tag = data.pop(0)
Patrick Williams7a09b672017-03-27 15:39:12 -050075 if tag != 'ESEL':
76 continue
77 data = "=".join(data)
Patrick Williams6f5c3ea2017-03-27 16:23:52 -050078 if args.binary:
79 data = data.split(" ")
80 if '' == data[-1]:
81 data.pop()
82 data = "".join(map(lambda x: chr(int(x, 16)), data))
Patrick Williams7a09b672017-03-27 15:39:12 -050083 print(data)
84
Patrick Williams5e98b3a2017-03-27 15:28:35 -050085
Patrick Williams9b05ea32017-03-27 15:22:31 -050086parser = argparse.ArgumentParser()
87parser.add_argument('--server', help='hostname or IP of BMC', type=str,
88 required=True)
89
90subparsers = parser.add_subparsers()
Andrew Geissler50a753c2017-08-19 09:00:16 -050091
Patrick Williams9b05ea32017-03-27 15:22:31 -050092list_events = subparsers.add_parser('list', help='List all events on BMC')
93list_events.set_defaults(func=do_list_events)
Andrew Geissler50a753c2017-08-19 09:00:16 -050094
Patrick Williams5e98b3a2017-03-27 15:28:35 -050095view_event = subparsers.add_parser(
96 'view', help='View all data for an individual event')
97view_event.add_argument('event', help='The event to view')
98view_event.set_defaults(func=do_view_event)
Andrew Geissler50a753c2017-08-19 09:00:16 -050099
Patrick Williams7a09b672017-03-27 15:39:12 -0500100get_esel = subparsers.add_parser(
101 'get-esel', help='Extract OpenPOWER eSEL data for an individual event')
102get_esel.add_argument('event', help='The event to get eSEL from')
Patrick Williams6f5c3ea2017-03-27 16:23:52 -0500103get_esel.add_argument('--binary', help='Print event in raw binary',
104 action='store_const', const=True)
Patrick Williams7a09b672017-03-27 15:39:12 -0500105get_esel.set_defaults(func=do_get_esel)
Patrick Williams9b05ea32017-03-27 15:22:31 -0500106
Andrew Geissler50a753c2017-08-19 09:00:16 -0500107clear_event = subparsers.add_parser(
108 'clear', help="Clear individual event")
109clear_event.add_argument('event', help="The event to clear")
110clear_event.set_defaults(func=do_clear_event)
111
Patrick Williams9b05ea32017-03-27 15:22:31 -0500112args = parser.parse_args()
113
114if 'func' in args:
115 args.func(args)
116else:
117 parser.print_help()