#!/bin/sh set -eu DOG_RESET="" DOG_BOLD="" DOG_CYAN="" DOG_MAGENTA="" DOG_AMBER="" DOG_GREEN="" DOG_RED="" DOG_GRAY="" if [ -t 1 ]; then DOG_RESET="$(printf '\033[0m')" DOG_BOLD="$(printf '\033[1m')" if [ "${COLORTERM:-}" = "truecolor" ] || [ "${COLORTERM:-}" = "24bit" ]; then DOG_CYAN="$(printf '\033[38;2;0;255;255m')" DOG_MAGENTA="$(printf '\033[38;2;255;0;255m')" DOG_AMBER="$(printf '\033[38;2;255;176;0m')" DOG_GREEN="$(printf '\033[38;2;51;255;51m')" DOG_RED="$(printf '\033[38;2;255;51;51m')" DOG_GRAY="$(printf '\033[38;2;106;106;122m')" else DOG_CYAN="$(printf '\033[0;96m')" DOG_MAGENTA="$(printf '\033[0;95m')" DOG_AMBER="$(printf '\033[0;33m')" DOG_GREEN="$(printf '\033[0;32m')" DOG_RED="$(printf '\033[0;31m')" DOG_GRAY="$(printf '\033[0;90m')" fi fi header() { printf "%s%sDOG_ EDGE INSTALLER%s\n" "$DOG_CYAN" "$DOG_BOLD" "$DOG_RESET" printf "%sNative Installer%s\n" "$DOG_BOLD" "$DOG_RESET" printf "%sLocal vision. Cloud-linked.%s\n" "$DOG_MAGENTA" "$DOG_RESET" } step() { printf "%s==>%s %s\n" "$DOG_AMBER" "$DOG_RESET" "$*" } note() { printf "%s•%s %s\n" "$DOG_CYAN" "$DOG_RESET" "$*" } subtle() { printf "%s%s%s\n" "$DOG_GRAY" "$*" "$DOG_RESET" } ok() { printf "%s✓%s %s\n" "$DOG_GREEN" "$DOG_RESET" "$*" } die() { printf "%sERROR:%s %s\n" "$DOG_RED" "$DOG_RESET" "$*" >&2 exit 1 } sha256_file() { target="$1" if command -v sha256sum >/dev/null 2>&1; then sha256sum "$target" | awk '{print $1}' return fi if command -v shasum >/dev/null 2>&1; then shasum -a 256 "$target" | awk '{print $1}' return fi die "Missing sha256 tool (sha256sum or shasum)." } detect_platform() { os="$(uname -s | tr '[:upper:]' '[:lower:]')" arch="$(uname -m)" case "$os/$arch" in linux/x86_64) PLATFORM_KEY="LINUX_AMD64" ;; linux/aarch64|linux/arm64) PLATFORM_KEY="LINUX_ARM64" ;; darwin/arm64) PLATFORM_KEY="DARWIN_ARM64" ;; *) die "Unsupported platform: ${os}/${arch}" ;; esac } MODE="install" CHANNEL="${DOG_EDGE_CHANNEL:-stable}" RELEASE_BASE_URL="${DOG_EDGE_RELEASE_BASE_URL:-https://install.dognet.cam/releases/latest/download}" BOOTSTRAP_URL="${DOG_EDGE_BOOTSTRAP_URL:-https://install.dognet.cam/edge}" INSTALL_ROOT="" CONFIG_DIR="" DATA_DIR="" LOG_DIR="" WEBUI_PORT="${DOG_EDGE_WEBUI_PORT:-8088}" CLOUD_ENDPOINT="${DOG_EDGE_CLOUD_ENDPOINT:-ws://dognet.cam:3001}" while [ "$#" -gt 0 ]; do case "$1" in --update) MODE="update" shift ;; --channel) CHANNEL="$2" shift 2 ;; --release-base-url) RELEASE_BASE_URL="$2" shift 2 ;; --bootstrap-url) BOOTSTRAP_URL="$2" shift 2 ;; --install-root) INSTALL_ROOT="$2" shift 2 ;; --config-dir) CONFIG_DIR="$2" shift 2 ;; --data-dir) DATA_DIR="$2" shift 2 ;; --log-dir) LOG_DIR="$2" shift 2 ;; --webui-port) WEBUI_PORT="$2" shift 2 ;; --cloud-endpoint) CLOUD_ENDPOINT="$2" shift 2 ;; *) die "Unknown argument: $1" ;; esac done detect_platform tmpdir="$(mktemp -d)" trap 'rm -rf "$tmpdir"' EXIT INT TERM manifest_path="${tmpdir}/stable.env" step "Fetching release manifest" curl -fsSL "${RELEASE_BASE_URL}/${CHANNEL}.env" -o "$manifest_path" # shellcheck disable=SC1090 . "$manifest_path" asset_var="DOG_EDGE_${PLATFORM_KEY}_ASSET" sha_var="DOG_EDGE_${PLATFORM_KEY}_SHA256" eval "ASSET=\${${asset_var}:-}" eval "EXPECTED_SHA=\${${sha_var}:-}" VERSION="${DOG_EDGE_VERSION:-unknown}" [ "$ASSET" != "" ] || die "No release asset declared for ${PLATFORM_KEY}." [ "$EXPECTED_SHA" != "" ] || die "No checksum declared for ${PLATFORM_KEY}." header step "Preview" note "Mode: ${MODE}" note "Channel: ${CHANNEL}" note "Release: ${VERSION}" note "Platform: ${PLATFORM_KEY}" note "Model: CERBERUS J-micro H264" note "Web UI: :${WEBUI_PORT}" subtle "This installer will:" note "download a verified DOG_ Edge bundle" note "install the runtime and managed model support" note "register the system service" note "start the Web UI on :${WEBUI_PORT}" note "keep the device ready for pairing" bundle_path="${tmpdir}/${ASSET}" step "Downloading ${ASSET}" curl -fsSL "${RELEASE_BASE_URL}/${ASSET}" -o "$bundle_path" step "Verifying checksum" ACTUAL_SHA="$(sha256_file "$bundle_path")" [ "$ACTUAL_SHA" = "$EXPECTED_SHA" ] || die "Checksum mismatch for ${ASSET}." ok "Checksum verified" step "Extracting bundle" tar -xzf "$bundle_path" -C "$tmpdir" bundle_root="$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d -name 'dog-edge-*' | head -n 1)" [ "$bundle_root" != "" ] || die "Failed to locate extracted bundle." set -- \ --mode "$MODE" \ --release-base-url "$RELEASE_BASE_URL" \ --bootstrap-url "$BOOTSTRAP_URL" \ --channel "$CHANNEL" \ --webui-port "$WEBUI_PORT" \ --cloud-endpoint "$CLOUD_ENDPOINT" if [ -n "$INSTALL_ROOT" ]; then set -- "$@" --install-root "$INSTALL_ROOT" fi if [ -n "$CONFIG_DIR" ]; then set -- "$@" --config-dir "$CONFIG_DIR" fi if [ -n "$DATA_DIR" ]; then set -- "$@" --data-dir "$DATA_DIR" fi if [ -n "$LOG_DIR" ]; then set -- "$@" --log-dir "$LOG_DIR" fi exec "${bundle_root}/scripts/install-local.sh" "$@"