68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
import errno
|
|
import fcntl
|
|
import os
|
|
import sys
|
|
import pathlib
|
|
import shutil
|
|
import signal
|
|
import subprocess
|
|
import tempfile
|
|
import threading
|
|
|
|
from openpilot.common.basedir import BASEDIR
|
|
from openpilot.common.params import Params
|
|
|
|
def unblock_stdout() -> None:
|
|
# get a non-blocking stdout
|
|
child_pid, child_pty = os.forkpty()
|
|
if child_pid != 0: # parent
|
|
|
|
# child is in its own process group, manually pass kill signals
|
|
signal.signal(signal.SIGINT, lambda signum, frame: os.kill(child_pid, signal.SIGINT))
|
|
signal.signal(signal.SIGTERM, lambda signum, frame: os.kill(child_pid, signal.SIGTERM))
|
|
|
|
fcntl.fcntl(sys.stdout, fcntl.F_SETFL, fcntl.fcntl(sys.stdout, fcntl.F_GETFL) | os.O_NONBLOCK)
|
|
|
|
while True:
|
|
try:
|
|
dat = os.read(child_pty, 4096)
|
|
except OSError as e:
|
|
if e.errno == errno.EIO:
|
|
break
|
|
continue
|
|
|
|
if not dat:
|
|
break
|
|
|
|
try:
|
|
sys.stdout.write(dat.decode('utf8'))
|
|
except (OSError, UnicodeDecodeError):
|
|
pass
|
|
|
|
# os.wait() returns a tuple with the pid and a 16 bit value
|
|
# whose low byte is the signal number and whose high byte is the exit status
|
|
exit_status = os.wait()[1] >> 8
|
|
os._exit(exit_status)
|
|
|
|
|
|
def write_onroad_params(started, params):
|
|
params.put_bool("IsOnroad", started)
|
|
params.put_bool("IsOffroad", not started)
|
|
|
|
|
|
def save_bootlog():
|
|
# copy current params
|
|
tmp = tempfile.mkdtemp()
|
|
params_dirname = pathlib.Path(Params().get_param_path()).name
|
|
params_dir = os.path.join(tmp, params_dirname)
|
|
shutil.copytree(Params().get_param_path(), params_dir, dirs_exist_ok=True)
|
|
|
|
def fn(tmpdir):
|
|
env = os.environ.copy()
|
|
env['PARAMS_COPY_PATH'] = tmpdir
|
|
subprocess.call("./bootlog", cwd=os.path.join(BASEDIR, "system/loggerd"), env=env)
|
|
shutil.rmtree(tmpdir)
|
|
t = threading.Thread(target=fn, args=(tmp, ))
|
|
t.daemon = True
|
|
t.start()
|