mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-05-20 10:34:30 +00:00
app: During startup, run post-init operation in background
- This allows for the service to become "ready" and serving web connection sooner. - If some operations such as obtaining certificates and domain configurations are happening, these can be shown as operations with UI notifications. Tests: - Running 'freedombox-develop --setup' works. 'App initialization completed' message is printed before 'Running setup...' message. Process exits successfully. - Running 'freedombox-develop --setup-no-install' works. 'App initialization completed' message is printed before 'Running setup...' message. Process exits successfully. - Running 'freedombox-develop' works. 'App initialization completed' message is printed before 'Running regular setup' and 'Setup finished'. Cherrypy starts listening before 'App initialization completed' message. - Running a fresh VM setup works. Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org> Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
parent
a8eba9e719
commit
6cc71aa5d7
@ -4,6 +4,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
import threading
|
||||||
|
|
||||||
from . import __version__
|
from . import __version__
|
||||||
from . import app as app_module
|
from . import app as app_module
|
||||||
@ -95,6 +96,13 @@ def on_web_server_stop():
|
|||||||
glib.stop()
|
glib.stop()
|
||||||
|
|
||||||
|
|
||||||
|
def run_post_init_and_setup():
|
||||||
|
"""Run post-init operations on the apps and setup operations."""
|
||||||
|
app_module.apps_post_init()
|
||||||
|
frontpage.add_custom_shortcuts()
|
||||||
|
setup.run_setup_on_startup() # Long running, retrying
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Initialize and start the application"""
|
"""Initialize and start the application"""
|
||||||
arguments = parse_arguments()
|
arguments = parse_arguments()
|
||||||
@ -134,16 +142,16 @@ def main():
|
|||||||
|
|
||||||
module_loader.load_modules()
|
module_loader.load_modules()
|
||||||
app_module.apps_init()
|
app_module.apps_init()
|
||||||
app_module.apps_post_init()
|
|
||||||
frontpage.add_custom_shortcuts()
|
|
||||||
|
|
||||||
if arguments.setup is not False:
|
if arguments.setup is not False:
|
||||||
|
app_module.apps_post_init()
|
||||||
run_setup_and_exit(arguments.setup, allow_install=True)
|
run_setup_and_exit(arguments.setup, allow_install=True)
|
||||||
|
|
||||||
if arguments.setup_no_install is not False:
|
if arguments.setup_no_install is not False:
|
||||||
|
app_module.apps_post_init()
|
||||||
run_setup_and_exit(arguments.setup_no_install, allow_install=False)
|
run_setup_and_exit(arguments.setup_no_install, allow_install=False)
|
||||||
|
|
||||||
setup.run_setup_in_background()
|
threading.Thread(target=run_post_init_and_setup).start()
|
||||||
|
|
||||||
glib.run()
|
glib.run()
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,6 @@ from .privileged import packages as packages_privileged
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
_is_first_setup = False
|
|
||||||
is_first_setup_running = False
|
is_first_setup_running = False
|
||||||
_is_shutting_down = False
|
_is_shutting_down = False
|
||||||
|
|
||||||
@ -273,18 +272,15 @@ def list_dependencies(app_ids=None, essential=False):
|
|||||||
print(package_expression)
|
print(package_expression)
|
||||||
|
|
||||||
|
|
||||||
def run_setup_in_background():
|
def run_setup_on_startup():
|
||||||
"""Run setup in a background thread."""
|
|
||||||
_set_is_first_setup()
|
|
||||||
threading.Thread(target=_run_setup_on_startup).start()
|
|
||||||
|
|
||||||
|
|
||||||
def _run_setup_on_startup():
|
|
||||||
"""Run setup with retry till it succeeds."""
|
"""Run setup with retry till it succeeds."""
|
||||||
|
is_first_setup = any((app for app in app_module.App.list()
|
||||||
|
if app.info.is_essential and app.needs_setup()))
|
||||||
|
|
||||||
sleep_time = 10
|
sleep_time = 10
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
if _is_first_setup:
|
if is_first_setup:
|
||||||
logger.info('Running first setup.')
|
logger.info('Running first setup.')
|
||||||
_run_first_setup()
|
_run_first_setup()
|
||||||
break
|
break
|
||||||
@ -299,7 +295,7 @@ def _run_setup_on_startup():
|
|||||||
if _is_shutting_down:
|
if _is_shutting_down:
|
||||||
break
|
break
|
||||||
|
|
||||||
logger.info('Setup thread finished.')
|
logger.info('Setup finished.')
|
||||||
|
|
||||||
|
|
||||||
def _run_first_setup():
|
def _run_first_setup():
|
||||||
@ -337,13 +333,6 @@ def _get_apps_for_regular_setup():
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def _set_is_first_setup():
|
|
||||||
"""Set whether all essential apps have been setup at least once."""
|
|
||||||
global _is_first_setup
|
|
||||||
_is_first_setup = any((app for app in app_module.App.list()
|
|
||||||
if app.info.is_essential and app.needs_setup()))
|
|
||||||
|
|
||||||
|
|
||||||
def run_setup_on_apps(app_ids, allow_install=True):
|
def run_setup_on_apps(app_ids, allow_install=True):
|
||||||
"""Run setup on the given list of apps.
|
"""Run setup on the given list of apps.
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user