blob: 49ba69d1c7d8ea7cf980d9944994bbd0af4079c4 [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
Andrew Geisslerd35538c2017-08-25 08:43:08 -05005import json
Patrick Williamsb19c34c2017-03-27 14:52:28 -05006
Andrew Geissler39541fd2017-08-19 08:31:07 -05007import urllib3
Andrew Geissler4449be32017-09-29 15:03:18 -05008from warnings import catch_warnings
Andrew Geissler39541fd2017-08-19 08:31:07 -05009urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
10
Patrick Williams533c13a2017-03-27 15:28:51 -050011
Patrick Williamsb19c34c2017-03-27 14:52:28 -050012class BMC:
13 def __init__(self, server):
14 self.url = "https://{0}/".format(server)
15 self.session = requests.Session()
16 self.login()
17
18 def login(self):
19 r = self.session.post(self.url + 'login',
Patrick Williams533c13a2017-03-27 15:28:51 -050020 json={'data': ['root', '0penBmc']},
Patrick Williamsb19c34c2017-03-27 14:52:28 -050021 verify=False)
22 j = r.json()
23 if j['status'] != 'ok':
24 raise Exception("Failed to login: \n" + r.text)
25
Patrick Williamsec472d82017-03-27 15:15:43 -050026 def list_events(self):
27 r = self.session.get(self.url + 'xyz/openbmc_project/logging/entry/',
28 verify=False)
29 j = r.json()
Andrew Geissler4449be32017-09-29 15:03:18 -050030 if j['message'] == '404 Not Found':
31 print "No error logs on system\n"
32 return
Patrick Williamsec472d82017-03-27 15:15:43 -050033 if j['status'] != 'ok':
34 raise Exception("Failed to query entries: \n" + r.text)
35
36 events = j['data']
37 events.sort(key=lambda x: int(x.split("/")[-1]))
38
39 return events
Patrick Williamsb19c34c2017-03-27 14:52:28 -050040
Patrick Williams5e98b3a2017-03-27 15:28:35 -050041 def get_event(self, event):
42 r = self.session.get(self.url + event, verify=False)
43
44 j = r.json()
45 if j['status'] != 'ok':
46 raise Exception("Failed to get event " + event + ": \n" + r.text)
47
48 return j['data']
Andrew Geissler50a753c2017-08-19 09:00:16 -050049
50 def clear_event(self,event):
51 r = self.session.delete(self.url + event)
52 j = r.json()
53 if j['status'] != 'ok':
54 raise Exception("Failed to clear event " + event + ": \n" + r.text)
Patrick Williams5e98b3a2017-03-27 15:28:35 -050055
Andrew Geissler96916f62017-10-03 13:57:26 -050056 def clear_all_events(self):
57 r = self.session.post(self.url + 'xyz/openbmc_project/logging/action/deleteall',
58 headers={'Content-Type': 'application/json'},
59 data='{"data":[]}',
60 verify=False)
61 j = r.json()
62 if j['status'] != 'ok':
63 raise Exception("Failed to clear all events\n" + r.text)
64
Andrew Geissler4370d992017-08-21 10:32:27 -050065 def list_dumps(self):
66 r = self.session.get(self.url + 'xyz/openbmc_project/dump/entry/',
67 verify=False)
68 j = r.json()
69 if j['status'] != 'ok':
70 raise Exception("Failed to list dumps: \n" + r.text)
71
72 dumps = j['data']
73 dumps.sort(key=lambda x: int(x.split("/")[-1]))
74
75 return dumps
76
77 def create_dump(self):
78 r = self.session.post(self.url + 'xyz/openbmc_project/dump/action/CreateDump')
79 j = r.json()
80 if j['status'] != 'ok':
81 raise Exception("Failed to create dump: \n" + r.text)
82
83 def get_dump(self,dump):
84 r = self.session.get(self.url + dump,
85 verify=False)
86 j = r.json()
87 if j['status'] != 'ok':
88 raise Exception("Failed to get dump " + event + ": \n" + r.text)
89
90 def clear_dump(self,dump):
91 r = self.session.delete(self.url + dump)
92 j = r.json()
93 if j['status'] != 'ok':
94 raise Exception("Failed to clear dump " + dump + ": \n" + r.text)
Patrick Williamsb19c34c2017-03-27 14:52:28 -050095
Patrick Williams9b05ea32017-03-27 15:22:31 -050096def do_list_events(args):
97 s = BMC(server=args.server)
Andrew Geissler4449be32017-09-29 15:03:18 -050098 try:
99 for e in s.list_events():
100 print(e)
101 except:
102 # ignore if we get nothing back
103 return;
Patrick Williams9b05ea32017-03-27 15:22:31 -0500104
Patrick Williams5e98b3a2017-03-27 15:28:35 -0500105
106def do_view_event(args):
107 s = BMC(server=args.server)
Andrew Geisslerd35538c2017-08-25 08:43:08 -0500108 print json.dumps(s.get_event(args.event), indent=4)
Patrick Williams5e98b3a2017-03-27 15:28:35 -0500109
Andrew Geissler50a753c2017-08-19 09:00:16 -0500110def do_clear_event(args):
111 s = BMC(server=args.server)
112 s.clear_event(args.event)
Patrick Williams4296f4b2017-03-27 16:26:41 -0500113
Andrew Geissler96916f62017-10-03 13:57:26 -0500114def do_clear_all_events(args):
115 s = BMC(server=args.server)
116 s.clear_all_events()
117
Andrew Geissler4370d992017-08-21 10:32:27 -0500118def do_list_dumps(args):
119 s = BMC(server=args.server)
120 for e in s.list_dumps():
121 print(e)
122
123def do_create_dump(args):
124 s = BMC(server=args.server)
125 s.create_dump()
126
127def do_get_dump(args):
128 s = BMC(server=args.server)
129 s.get_dump(args.dump)
130
131def do_clear_dump(args):
132 s = BMC(server=args.server)
133 s.clear_dump(args.dump)
134
Patrick Williams7a09b672017-03-27 15:39:12 -0500135def do_get_esel(args):
136 s = BMC(server=args.server)
137 e = s.get_event(args.event)
138 if e['Message'] != 'org.open_power.Error.Host.Event' and\
139 e['Message'] != 'org.open_power.Error.Host.Event.Event':
140 raise Exception("Event is not from Host: " + e['Message'])
141 for d in e['AdditionalData']:
Patrick Williams842308b2017-03-27 15:49:38 -0500142 data = d.split("=")
143 tag = data.pop(0)
Patrick Williams7a09b672017-03-27 15:39:12 -0500144 if tag != 'ESEL':
145 continue
146 data = "=".join(data)
Patrick Williams6f5c3ea2017-03-27 16:23:52 -0500147 if args.binary:
148 data = data.split(" ")
149 if '' == data[-1]:
150 data.pop()
151 data = "".join(map(lambda x: chr(int(x, 16)), data))
Patrick Williams7a09b672017-03-27 15:39:12 -0500152 print(data)
153
Patrick Williams5e98b3a2017-03-27 15:28:35 -0500154
Patrick Williams9b05ea32017-03-27 15:22:31 -0500155parser = argparse.ArgumentParser()
156parser.add_argument('--server', help='hostname or IP of BMC', type=str,
157 required=True)
158
159subparsers = parser.add_subparsers()
Andrew Geissler50a753c2017-08-19 09:00:16 -0500160
Patrick Williams9b05ea32017-03-27 15:22:31 -0500161list_events = subparsers.add_parser('list', help='List all events on BMC')
162list_events.set_defaults(func=do_list_events)
Andrew Geissler50a753c2017-08-19 09:00:16 -0500163
Patrick Williams5e98b3a2017-03-27 15:28:35 -0500164view_event = subparsers.add_parser(
165 'view', help='View all data for an individual event')
166view_event.add_argument('event', help='The event to view')
167view_event.set_defaults(func=do_view_event)
Andrew Geissler50a753c2017-08-19 09:00:16 -0500168
Patrick Williams7a09b672017-03-27 15:39:12 -0500169get_esel = subparsers.add_parser(
170 'get-esel', help='Extract OpenPOWER eSEL data for an individual event')
171get_esel.add_argument('event', help='The event to get eSEL from')
Patrick Williams6f5c3ea2017-03-27 16:23:52 -0500172get_esel.add_argument('--binary', help='Print event in raw binary',
173 action='store_const', const=True)
Patrick Williams7a09b672017-03-27 15:39:12 -0500174get_esel.set_defaults(func=do_get_esel)
Patrick Williams9b05ea32017-03-27 15:22:31 -0500175
Andrew Geissler50a753c2017-08-19 09:00:16 -0500176clear_event = subparsers.add_parser(
177 'clear', help="Clear individual event")
178clear_event.add_argument('event', help="The event to clear")
179clear_event.set_defaults(func=do_clear_event)
180
Andrew Geissler96916f62017-10-03 13:57:26 -0500181clear_all_events = subparsers.add_parser(
182 'clear-all', help="Clear all event")
183clear_all_events.set_defaults(func=do_clear_all_events)
184
Andrew Geissler4370d992017-08-21 10:32:27 -0500185list_dumps = subparsers.add_parser(
186 'list-dumps', help="List all dumps")
187list_dumps.set_defaults(func=do_list_dumps)
188
189create_dump = subparsers.add_parser(
190 'create-dump', help="Create a dump")
191create_dump.set_defaults(func=do_create_dump)
192
193get_dump = subparsers.add_parser(
194 'get-dump', help="Get a dump")
195get_dump.add_argument('dump', help="The dump to get")
196get_dump.set_defaults(func=do_get_dump)
197
198clear_dump = subparsers.add_parser(
199 'clear-dump', help="Clear individual dump")
200clear_dump.add_argument('dump', help="The dump to clear")
201clear_dump.set_defaults(func=do_clear_dump)
202
Patrick Williams9b05ea32017-03-27 15:22:31 -0500203args = parser.parse_args()
204
205if 'func' in args:
206 args.func(args)
207else:
208 parser.print_help()