Discover independent camera instances and prepare their versioned runtime from Node or remote Core. Add isolated SDK workers, camera controls, raw dual-fisheye WebRTC preview, and shared action/region loading states. Recover existing Node bindings over known Tailscale addresses after a Core LAN address change. Preserve identities and trust, pin both peers, migrate endpoints with revision checks, and require real heartbeats for online status. Fix the Python client certificate profile for Go X509 verification. Pin Design Guideline 8c53f73 and retain installer/build/acceptance history. Node 0.8.19 is installed; X4 0.1.3-3 is bundled but hardware activation is pending. Validation: qualified DG/Node builds and Go race tests; 31 fleet tests; Python-to-Go certificate interoperability and live tailnet recovery with five fresh heartbeats; prior 38 X4 tests and bounded remote WebRTC acceptance. Clean-OS, replug/power autonomy, local X4 video and long-run stability remain open.
49 lines
2.9 KiB
Bash
49 lines
2.9 KiB
Bash
#!/bin/sh
|
|
set -eu
|
|
if [ "$1" = install ] || [ "$1" = upgrade ]; then
|
|
if [ -d /run/systemd/system ]; then
|
|
if [ -S /run/mission-core-sensors/driver.sock ]; then
|
|
if ! /usr/bin/python3 -I -c 'import http.client,json,socket; c=http.client.HTTPConnection("driver",timeout=5); c.sock=socket.socket(socket.AF_UNIX); c.sock.settimeout(5); c.sock.connect("/run/mission-core-sensors/driver.sock"); c.request("GET","/prepare-safe"); r=c.getresponse(); assert r.status==200 and json.load(r).get("safe") is True'; then
|
|
echo "Mission Core Node: остановите захват или просмотр записи перед обновлением или удалением." >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
if [ -S /run/mission-core-k1/driver.sock ]; then
|
|
if ! /usr/bin/python3 -I -c 'import http.client,json,socket; c=http.client.HTTPConnection("k1",timeout=5); c.sock=socket.socket(socket.AF_UNIX); c.sock.settimeout(5); c.sock.connect("/run/mission-core-k1/driver.sock"); c.request("GET","/prepare-safe"); r=c.getresponse(); assert r.status==200 and json.load(r).get("safe") is True'; then
|
|
echo "Mission Core Node: завершите подключение или запись K1 перед обновлением." >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
mc_node_x4_job=$(systemctl show --property=ActiveState --value mission-core-node-insta360-x4-profile.service 2>/dev/null || true)
|
|
case "$mc_node_x4_job" in
|
|
active|activating) echo "Mission Core Node: дождитесь завершения подготовки X4." >&2; exit 1 ;;
|
|
esac
|
|
mc_node_device_job=$(systemctl show --property=ActiveState --value mission-core-node-realsense-prepare.service 2>/dev/null || true)
|
|
case "$mc_node_device_job" in
|
|
active|activating) echo "Mission Core Node: дождитесь завершения подготовки устройства." >&2; exit 1 ;;
|
|
esac
|
|
|
|
mc_node_environment_state=$(systemctl show --property=ActiveState --value mission-core-node-environment.service 2>/dev/null || true)
|
|
case "$mc_node_environment_state" in
|
|
active|activating)
|
|
echo "Mission Core Node: дождитесь завершения настройки окружения в приложении." >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
# End the admitted idle worker before dpkg replaces its Python modules.
|
|
# New UI commands now fail unavailable instead of racing the package copy.
|
|
if systemctl is-active --quiet mission-core-k1.service; then
|
|
# Preserve an optional worker's prior running state across a Node-only
|
|
# update. /run is root-owned; the plugin still owns initial activation.
|
|
(umask 077; : > /run/mission-core-node-k1-upgrade-active)
|
|
systemctl stop mission-core-k1.service
|
|
fi
|
|
systemctl stop mission-core-node-monitor.service 2>/dev/null || true
|
|
fi
|
|
. /etc/os-release
|
|
if [ "${ID:-}" != ubuntu ] || [ "${VERSION_ID:-}" != 24.04 ]; then
|
|
echo "Mission Core Node: this package does not support the installed system." >&2
|
|
exit 1
|
|
fi
|
|
fi
|