|
|
@ -10,10 +10,8 @@ import cereal.messaging as messaging |
|
|
|
import selfdrive.crash as crash |
|
|
|
import selfdrive.crash as crash |
|
|
|
from common.basedir import BASEDIR |
|
|
|
from common.basedir import BASEDIR |
|
|
|
from common.params import Params |
|
|
|
from common.params import Params |
|
|
|
from common.spinner import Spinner |
|
|
|
|
|
|
|
from common.text_window import TextWindow |
|
|
|
from common.text_window import TextWindow |
|
|
|
from selfdrive.hardware import HARDWARE |
|
|
|
from selfdrive.hardware import HARDWARE |
|
|
|
from selfdrive.manager.build import MAX_BUILD_PROGRESS, PREBUILT |
|
|
|
|
|
|
|
from selfdrive.manager.helpers import unblock_stdout |
|
|
|
from selfdrive.manager.helpers import unblock_stdout |
|
|
|
from selfdrive.manager.process import ensure_running |
|
|
|
from selfdrive.manager.process import ensure_running |
|
|
|
from selfdrive.manager.process_config import managed_processes |
|
|
|
from selfdrive.manager.process_config import managed_processes |
|
|
@ -22,7 +20,7 @@ from selfdrive.swaglog import add_logentries_handler, cloudlog |
|
|
|
from selfdrive.version import dirty, version |
|
|
|
from selfdrive.version import dirty, version |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def manager_init(spinner=None): |
|
|
|
def manager_init(): |
|
|
|
params = Params() |
|
|
|
params = Params() |
|
|
|
params.manager_start() |
|
|
|
params.manager_start() |
|
|
|
|
|
|
|
|
|
|
@ -69,7 +67,7 @@ def manager_init(spinner=None): |
|
|
|
print("WARNING: failed to make /dev/shm") |
|
|
|
print("WARNING: failed to make /dev/shm") |
|
|
|
|
|
|
|
|
|
|
|
# set dongle id |
|
|
|
# set dongle id |
|
|
|
reg_res = register(spinner) |
|
|
|
reg_res = register(show_spinner=True) |
|
|
|
if reg_res: |
|
|
|
if reg_res: |
|
|
|
dongle_id = reg_res |
|
|
|
dongle_id = reg_res |
|
|
|
else: |
|
|
|
else: |
|
|
@ -85,16 +83,9 @@ def manager_init(spinner=None): |
|
|
|
crash.bind_extra(version=version, dirty=dirty, device=HARDWARE.get_device_type()) |
|
|
|
crash.bind_extra(version=version, dirty=dirty, device=HARDWARE.get_device_type()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def manager_prepare(spinner=None): |
|
|
|
def manager_prepare(): |
|
|
|
# build all processes |
|
|
|
for p in managed_processes.values(): |
|
|
|
os.chdir(os.path.dirname(os.path.abspath(__file__))) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
total = 100.0 - (0 if PREBUILT else MAX_BUILD_PROGRESS) |
|
|
|
|
|
|
|
for i, p in enumerate(managed_processes.values()): |
|
|
|
|
|
|
|
p.prepare() |
|
|
|
p.prepare() |
|
|
|
if spinner: |
|
|
|
|
|
|
|
perc = (100.0 - total) + total * (i + 1) / len(managed_processes) |
|
|
|
|
|
|
|
spinner.update_progress(perc, 100.) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def manager_cleanup(): |
|
|
|
def manager_cleanup(): |
|
|
@ -104,7 +95,7 @@ def manager_cleanup(): |
|
|
|
cloudlog.info("everything is dead") |
|
|
|
cloudlog.info("everything is dead") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def manager_thread(spinner=None): |
|
|
|
def manager_thread(): |
|
|
|
cloudlog.info("manager start") |
|
|
|
cloudlog.info("manager start") |
|
|
|
cloudlog.info({"environ": os.environ}) |
|
|
|
cloudlog.info({"environ": os.environ}) |
|
|
|
|
|
|
|
|
|
|
@ -118,8 +109,6 @@ def manager_thread(spinner=None): |
|
|
|
ignore += os.getenv("BLOCK").split(",") |
|
|
|
ignore += os.getenv("BLOCK").split(",") |
|
|
|
|
|
|
|
|
|
|
|
ensure_running(managed_processes.values(), started=False, not_run=ignore) |
|
|
|
ensure_running(managed_processes.values(), started=False, not_run=ignore) |
|
|
|
if spinner: # close spinner when ui has started |
|
|
|
|
|
|
|
spinner.close() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
started_prev = False |
|
|
|
started_prev = False |
|
|
|
params = Params() |
|
|
|
params = Params() |
|
|
@ -158,18 +147,25 @@ def manager_thread(spinner=None): |
|
|
|
break |
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(spinner=None): |
|
|
|
def main(): |
|
|
|
manager_init(spinner) |
|
|
|
prepare_only = os.getenv("PREPAREONLY") is not None |
|
|
|
manager_prepare(spinner) |
|
|
|
|
|
|
|
|
|
|
|
manager_init() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Start ui early so prepare can happen in the background |
|
|
|
|
|
|
|
if not prepare_only: |
|
|
|
|
|
|
|
managed_processes['ui'].start() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
manager_prepare() |
|
|
|
|
|
|
|
|
|
|
|
if os.getenv("PREPAREONLY") is not None: |
|
|
|
if prepare_only: |
|
|
|
return |
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
# SystemExit on sigterm |
|
|
|
# SystemExit on sigterm |
|
|
|
signal.signal(signal.SIGTERM, lambda signum, frame: sys.exit(1)) |
|
|
|
signal.signal(signal.SIGTERM, lambda signum, frame: sys.exit(1)) |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
try: |
|
|
|
manager_thread(spinner) |
|
|
|
manager_thread() |
|
|
|
except Exception: |
|
|
|
except Exception: |
|
|
|
traceback.print_exc() |
|
|
|
traceback.print_exc() |
|
|
|
crash.capture_exception() |
|
|
|
crash.capture_exception() |
|
|
@ -183,11 +179,9 @@ def main(spinner=None): |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
if __name__ == "__main__": |
|
|
|
unblock_stdout() |
|
|
|
unblock_stdout() |
|
|
|
spinner = Spinner() |
|
|
|
|
|
|
|
spinner.update_progress(MAX_BUILD_PROGRESS, 100) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
try: |
|
|
|
main(spinner) |
|
|
|
main() |
|
|
|
except Exception: |
|
|
|
except Exception: |
|
|
|
add_logentries_handler(cloudlog) |
|
|
|
add_logentries_handler(cloudlog) |
|
|
|
cloudlog.exception("Manager failed to start") |
|
|
|
cloudlog.exception("Manager failed to start") |
|
|
@ -195,7 +189,6 @@ if __name__ == "__main__": |
|
|
|
# Show last 3 lines of traceback |
|
|
|
# Show last 3 lines of traceback |
|
|
|
error = traceback.format_exc(-3) |
|
|
|
error = traceback.format_exc(-3) |
|
|
|
error = "Manager failed to start\n\n" + error |
|
|
|
error = "Manager failed to start\n\n" + error |
|
|
|
spinner.close() |
|
|
|
|
|
|
|
with TextWindow(error) as t: |
|
|
|
with TextWindow(error) as t: |
|
|
|
t.wait_for_exit() |
|
|
|
t.wait_for_exit() |
|
|
|
|
|
|
|
|
|
|
|