handle top-level exceptions as documented

Also let install failures be handled at this level.
This commit is contained in:
Michael Hudson-Doyle 2020-12-17 16:28:58 +13:00
parent c77d6b402a
commit 4de9668a17
2 changed files with 20 additions and 12 deletions

View File

@ -93,17 +93,6 @@ class InstallController(SubiquityController):
def tpath(self, *path):
return os.path.join(self.model.target, *path)
def curtin_error(self):
kw = {}
if sys.exc_info()[0] is not None:
log.exception("curtin_error")
# send traceback.format_exc() to journal?
if self.tb_extractor.traceback:
kw["Traceback"] = "\n".join(self.tb_extractor.traceback)
self.app.fatal_error = self.app.make_apport_report(
ErrorReportKind.INSTALL_FAIL, "install failed", **kw)
self.app.update_state(ApplicationState.ERROR)
def logged_command(self, cmd):
return ['systemd-cat', '--level-prefix=false',
'--identifier=' + self.app.log_syslog_id] + cmd
@ -258,7 +247,12 @@ class InstallController(SubiquityController):
self.app.update_state(ApplicationState.DONE)
except Exception:
self.curtin_error()
kw = {}
if self.tb_extractor.traceback:
kw["Traceback"] = "\n".join(self.tb_extractor.traceback)
self.app.make_apport_report(
ErrorReportKind.INSTALL_FAIL, "install failed", **kw)
raise
async def drain_curtin_events(self, *, context):
waited = 0.0

View File

@ -245,6 +245,20 @@ class SubiquityServer(Application):
return self.error_reporter.make_apport_report(
kind, thing, wait=wait, **kw)
def _exception_handler(self, loop, context):
exc = context.get('exception')
if exc is None:
super()._exception_handler(loop, context)
return
report = self.error_reporter.report_for_exc(exc)
log.error("top level error", exc_info=exc)
if not report:
report = self.make_apport_report(
ErrorReportKind.UNKNOWN, "unknown error",
exc=exc)
self.fatal_error = report
self.update_state(ApplicationState.ERROR)
@web.middleware
async def middleware(self, request, handler):
override_status = None