Example #1
0
def main() -> None:
    prepare_only = os.getenv("PREPAREONLY") is not None

    manager_init()

    # Start UI early so prepare can happen in the background
    if not prepare_only:
        managed_processes['ui'].start()

    manager_prepare()

    if prepare_only:
        return

    # SystemExit on sigterm
    signal.signal(signal.SIGTERM, lambda signum, frame: sys.exit(1))

    try:
        manager_thread()
    except Exception:
        traceback.print_exc()
        sentry.capture_exception()
    finally:
        manager_cleanup()

    params = Params()
    if params.get_bool("DoUninstall"):
        cloudlog.warning("uninstalling")
        HARDWARE.uninstall()
    elif params.get_bool("DoReboot"):
        cloudlog.warning("reboot")
        HARDWARE.reboot()
    elif params.get_bool("DoShutdown"):
        cloudlog.warning("shutdown")
        HARDWARE.shutdown()
Example #2
0
  def stop(self, retry: bool=True, block: bool=True) -> Optional[int]:
    if self.proc is None:
      return None

    if self.proc.exitcode is None:
      if not self.shutting_down:
        cloudlog.info(f"killing {self.name}")
        sig = signal.SIGKILL if self.sigkill else signal.SIGINT
        self.signal(sig)
        self.shutting_down = True

        if not block:
          return None

      join_process(self.proc, 5)

      # If process failed to die send SIGKILL or reboot
      if self.proc.exitcode is None and retry:
        if self.unkillable:
          cloudlog.critical(f"unkillable process {self.name} failed to exit! rebooting in 15 if it doesn't die")
          join_process(self.proc, 15)

          if self.proc.exitcode is None:
            cloudlog.critical(f"unkillable process {self.name} failed to die!")
            os.system("date >> /data/unkillable_reboot")
            os.sync()
            HARDWARE.reboot()
            raise RuntimeError
        else:
          cloudlog.info(f"killing {self.name} with SIGKILL")
          self.signal(signal.SIGKILL)
          self.proc.join()

    ret = self.proc.exitcode
    cloudlog.info(f"{self.name} is dead with {ret}")

    if self.proc.exitcode is not None:
      self.shutting_down = False
      self.proc = None

    return ret
Example #3
0
 def do_reboot():
     time.sleep(2)
     HARDWARE.reboot()