diff options
Diffstat (limited to 'module/obmc/wsgi')
-rw-r--r-- | module/obmc/wsgi/apps/rest_dbus.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/module/obmc/wsgi/apps/rest_dbus.py b/module/obmc/wsgi/apps/rest_dbus.py index ffbab94..bf4fe7c 100644 --- a/module/obmc/wsgi/apps/rest_dbus.py +++ b/module/obmc/wsgi/apps/rest_dbus.py @@ -15,6 +15,7 @@ # permissions and limitations under the License. import os +import sys import dbus import dbus.exceptions import json @@ -630,8 +631,13 @@ class SessionHandler(MethodHandler): no_user_str = "No user logged in" bad_json_str = "Expecting request format { 'data': " \ "[<username>, <password>] }, got '%s'" + bmc_not_ready_str = "BMC is not ready (booting)" _require_auth = None MAX_SESSIONS = 16 + BMCSTATE_IFACE = 'xyz.openbmc_project.State.BMC' + BMCSTATE_PATH = '/xyz/openbmc_project/state/bmc0' + BMCSTATE_PROPERTY = 'CurrentBMCState' + BMCSTATE_READY = 'xyz.openbmc_project.State.BMC.BMCState.Ready' def __init__(self, app, bus): super(SessionHandler, self).__init__( @@ -696,6 +702,15 @@ class SessionHandler(MethodHandler): if not self.authenticate(*request.parameter_list): abort(401, self.bad_passwd_str) + force = False + try: + force = request.json.get('force') + except (ValueError, AttributeError, KeyError, TypeError): + force = False + + if not force and not self.is_bmc_ready(): + abort(503, self.bmc_not_ready_str) + user = request.parameter_list[0] session = self.new_session() session['user'] = user @@ -705,6 +720,22 @@ class SessionHandler(MethodHandler): httponly=True) return self.login_str % (user, 'in') + def is_bmc_ready(self): + if not self.app.with_bmc_check: + return True + + try: + obj = self.bus.get_object(self.BMCSTATE_IFACE, self.BMCSTATE_PATH) + iface = dbus.Interface(obj, dbus.PROPERTIES_IFACE) + state = iface.Get(self.BMCSTATE_IFACE, self.BMCSTATE_PROPERTY) + if state == self.BMCSTATE_READY: + return True + + except dbus.exceptions.DBusException: + pass + + return False + def find(self, **kw): pass @@ -1419,6 +1450,7 @@ class App(Bottle): super(App, self).__init__(autojson=False) self.have_wsock = kw.get('have_wsock', False) + self.with_bmc_check = '--with-bmc-check' in sys.argv self.bus = dbus.SystemBus() self.mapper = obmc.mapper.Mapper(self.bus) |