| #!/usr/bin/env python | 
 |  | 
 | import requests | 
 | import websocket | 
 | import json | 
 | import ssl | 
 | import gen_valid as gv | 
 | import gen_print as gp | 
 |  | 
 |  | 
 | class event_notification(): | 
 |     r""" | 
 |     Main class to subscribe and receive event notifications. | 
 |     """ | 
 |  | 
 |     def __init__(self, host, username, password): | 
 |         r""" | 
 |         Initialize instance variables. | 
 |  | 
 |         Description of argument(s): | 
 |         host        The IP or host name of the system to subscribe to. | 
 |         username    The username for the host system. | 
 |         password    The password for the host system. | 
 |         """ | 
 |         self.__host = host | 
 |         self.__user = username | 
 |         self.__password = password | 
 |  | 
 |     def __del__(self): | 
 |         try: | 
 |             self.__websocket.close() | 
 |         except AttributeError: | 
 |             pass | 
 |  | 
 |     def login(self): | 
 |         r""" | 
 |         Login and return session object. | 
 |         """ | 
 |         http_header = {'Content-Type': 'application/json'} | 
 |         session = requests.session() | 
 |         response = session.post('https://' + self.__host + '/login', | 
 |                                 headers=http_header, | 
 |                                 json={"data": [self.__user, self.__password]}, | 
 |                                 verify=False, timeout=30) | 
 |         gv.valid_value(response.status_code, valid_values=[200]) | 
 |         login_response = json.loads(response.text) | 
 |         gp.qprint_var(login_response) | 
 |         gv.valid_value(login_response['status'], valid_values=['ok']) | 
 |         return session | 
 |  | 
 |     def subscribe(self, dbus_path, enable_trace=False): | 
 |  | 
 |         r""" | 
 |         Subscribe to the given path and return a list of event notifications. | 
 |  | 
 |         For more details on "subscribe" and "events" go to | 
 |         https://github.com/openbmc/docs/blob/master/rest-api.md#event-subscription-protocol | 
 |  | 
 |         Example robot code: | 
 |         ${event_notifications}=  Subscribe  /xyz/openbmc_project/sensors | 
 |         Rprint Vars  event_notifications | 
 |  | 
 |         Example output: | 
 |         event_notifications: | 
 |           [0]: | 
 |             [interface]:             xyz.openbmc_project.Sensor.Value | 
 |             [path]:                  /xyz/openbmc_project/sensors/temperature/ambient | 
 |             [event]:                 PropertiesChanged | 
 |             [properties]: | 
 |               [Value]:               23813 | 
 |  | 
 |         Description of argument(s): | 
 |         dbus_path              The subscribing event's path (e.g. | 
 |                                "/xyz/openbmc_project/sensors"). | 
 |         enable_trace           Enable or disable trace. | 
 |         """ | 
 |  | 
 |         session = self.login() | 
 |         cookies = session.cookies.get_dict() | 
 |         # Convert from dictionary to a string of the following format: | 
 |         # key=value;key=value... | 
 |         cookies = gp.sprint_var(cookies, fmt=gp.no_header() | gp.strip_brackets(), | 
 |                                 col1_width=0, trailing_char="", | 
 |                                 delim="=").replace("\n", ";") | 
 |  | 
 |         websocket.enableTrace(enable_trace) | 
 |         self.__websocket = websocket.create_connection("wss://{host}/subscribe".format(host=self.__host), | 
 |                                                        sslopt={"cert_reqs": ssl.CERT_NONE}, | 
 |                                                        cookie=cookies) | 
 |         dbus_path = [path.strip() for path in dbus_path.split(',')] | 
 |         dbus_path = {"paths": dbus_path} | 
 |  | 
 |         self.__websocket.send(json.dumps(dbus_path)) | 
 |         event_notifications = json.loads(self.__websocket.recv()) | 
 |         self.__websocket.close() | 
 |         return event_notifications |