diff --git a/scripts/boot/blitz-run-context.sh b/scripts/boot/blitz-run-context.sh index 50be475..b159722 100644 --- a/scripts/boot/blitz-run-context.sh +++ b/scripts/boot/blitz-run-context.sh @@ -7,6 +7,14 @@ source "${SCRIPT_DIR}/common.sh" STEP="run-context" +on_error() { + local rc="$?" + blitz_log "${STEP}" "error" "failure" "line=${1:-unknown} cmd=${BASH_COMMAND:-unknown}" "${rc}" + exit "${rc}" +} + +trap 'on_error "${LINENO}"' ERR + blitz_load_boot_env blitz_require_root "${STEP}" blitz_require_command python3 "${STEP}" diff --git a/scripts/boot/common.sh b/scripts/boot/common.sh index bbbf104..573b2de 100644 --- a/scripts/boot/common.sh +++ b/scripts/boot/common.sh @@ -50,6 +50,10 @@ blitz_load_boot_env() { fi done + if declare -F normalize_loaded_env_vars >/dev/null 2>&1; then + normalize_loaded_env_vars + fi + default_time_server="$(blitz_host_from_addr "${ROBOT_SIDE_OMNISOCKET_SERVER_ADDR:-}" || true)" export BLITZ_BOOT_DELAY_SEC="${BLITZ_BOOT_DELAY_SEC:-30}" diff --git a/scripts/boot/systemd/blitz-5g-link-logger.service.in b/scripts/boot/systemd/blitz-5g-link-logger.service.in index 436d03e..81b810b 100644 --- a/scripts/boot/systemd/blitz-5g-link-logger.service.in +++ b/scripts/boot/systemd/blitz-5g-link-logger.service.in @@ -2,6 +2,7 @@ Description=Blitz robot 5G link logger PartOf=blitz-robot.target After=blitz-run-context.service blitz-5g-dial.service +Requires=blitz-run-context.service Wants=blitz-run-context.service blitz-5g-dial.service [Service] diff --git a/scripts/boot/systemd/blitz-b-side-omnid.service.in b/scripts/boot/systemd/blitz-b-side-omnid.service.in index db5a938..bce9b11 100644 --- a/scripts/boot/systemd/blitz-b-side-omnid.service.in +++ b/scripts/boot/systemd/blitz-b-side-omnid.service.in @@ -2,6 +2,7 @@ Description=Blitz robot b-side omnid PartOf=blitz-robot.target After=blitz-run-context.service blitz-5g-dial.service blitz-ros-receiver.service +Requires=blitz-run-context.service Wants=blitz-run-context.service blitz-5g-dial.service blitz-ros-receiver.service [Service] @@ -9,7 +10,7 @@ Type=simple EnvironmentFile=-/run/blitz-robot/run-context.env ExecStartPre=/bin/bash @OMNISOCKETGO_ROOT@/scripts/boot/prepare-runtime-dir.sh ExecStart=/bin/bash @OMNISOCKETGO_ROOT@/scripts/boot/start-b-side-omnid-service.sh -ExecStopPost=/bin/bash -lc 'if [[ "${SERVICE_RESULT:-success}" != "success" ]]; then exec "@OMNISOCKETGO_ROOT@/scripts/boot/blitz-incident-capture-launch.sh" --source exec-stop-post --unit "%n" --result "${SERVICE_RESULT:-}" --exit-status "${EXIT_STATUS:-}" --reason b-side-service-exit; fi' +ExecStopPost=/bin/bash -lc 'if [[ "${SERVICE_RESULT:-success}" != "success" ]]; then exec /bin/bash "@OMNISOCKETGO_ROOT@/scripts/boot/blitz-incident-capture-launch.sh" --source exec-stop-post --unit "%n" --result "${SERVICE_RESULT:-}" --exit-status "${EXIT_STATUS:-}" --reason b-side-service-exit; fi' Restart=always RestartSec=2 StandardOutput=append:@BLITZ_LOG_FILE@ diff --git a/scripts/boot/systemd/blitz-ros-receiver.service.in b/scripts/boot/systemd/blitz-ros-receiver.service.in index 71492f0..634b19b 100644 --- a/scripts/boot/systemd/blitz-ros-receiver.service.in +++ b/scripts/boot/systemd/blitz-ros-receiver.service.in @@ -2,6 +2,7 @@ Description=Blitz robot ROS receiver PartOf=blitz-robot.target After=blitz-run-context.service blitz-5g-dial.service +Requires=blitz-run-context.service Wants=blitz-run-context.service blitz-5g-dial.service [Service] @@ -12,7 +13,7 @@ EnvironmentFile=-/run/blitz-robot/run-context.env ExecStartPre=/bin/bash @OMNISOCKETGO_ROOT@/scripts/boot/prepare-runtime-dir.sh ExecStart=/bin/bash @OMNISOCKETGO_ROOT@/scripts/boot/start-ros-receiver-service.sh ExecStartPost=/bin/bash @OMNISOCKETGO_ROOT@/scripts/boot/wait-for-unix-socket.sh --step ros-receiver -ExecStopPost=/bin/bash -lc 'if [[ "${SERVICE_RESULT:-success}" != "success" ]]; then exec "@OMNISOCKETGO_ROOT@/scripts/boot/blitz-incident-capture-launch.sh" --source exec-stop-post --unit "%n" --result "${SERVICE_RESULT:-}" --exit-status "${EXIT_STATUS:-}" --reason ros-service-exit; fi' +ExecStopPost=/bin/bash -lc 'if [[ "${SERVICE_RESULT:-success}" != "success" ]]; then exec /bin/bash "@OMNISOCKETGO_ROOT@/scripts/boot/blitz-incident-capture-launch.sh" --source exec-stop-post --unit "%n" --result "${SERVICE_RESULT:-}" --exit-status "${EXIT_STATUS:-}" --reason ros-service-exit; fi' Restart=always RestartSec=2 StandardOutput=append:@BLITZ_LOG_FILE@ diff --git a/scripts/boot/systemd/blitz-watchdog.service.in b/scripts/boot/systemd/blitz-watchdog.service.in index 23a9ffe..882d5b7 100644 --- a/scripts/boot/systemd/blitz-watchdog.service.in +++ b/scripts/boot/systemd/blitz-watchdog.service.in @@ -2,6 +2,7 @@ Description=Blitz robot health watchdog PartOf=blitz-robot.target After=blitz-run-context.service blitz-b-side-omnid.service blitz-ros-receiver.service +Requires=blitz-run-context.service Wants=blitz-run-context.service blitz-b-side-omnid.service blitz-ros-receiver.service [Service] diff --git a/scripts/dev/load-env.sh b/scripts/dev/load-env.sh index f3357f9..c966cb3 100644 --- a/scripts/dev/load-env.sh +++ b/scripts/dev/load-env.sh @@ -9,6 +9,23 @@ die() { return 1 2>/dev/null || exit 1 } +normalize_loaded_env_vars() { + local var_name + local value + + for var_name in $(compgen -A variable); do + case "${var_name}" in + BACKEND_*|BLITZ_*|B_SIDE_*|CONTROL_*|FRONTEND_*|OMNI_*|PYTHON3_BIN|PYTHON_VENV_PATH|ROBOT_*|ROS_DISTRO|VITE_*) + value="${!var_name}" + if [[ "${value}" == *$'\r' ]]; then + printf -v "${var_name}" '%s' "${value%$'\r'}" + export "${var_name}" + fi + ;; + esac + done +} + is_omnisocketgo_root() { local dir="$1" [[ -f "${dir}/Makefile" && -f "${dir}/cmd/b_side_omnid.c" && -d "${dir}/ros-control-py" ]] @@ -68,6 +85,8 @@ for env_file in "${ENV_FILES[@]}"; do fi done +normalize_loaded_env_vars + if [[ "${omni_camera_device_was_set}" == "1" ]]; then export OMNI_CAMERA_DEVICE="${preserved_omni_camera_device}" fi