#!/bin/zsh set -euo pipefail SCRIPT_DIR=${0:A:h} PROJECT_DIR=${SCRIPT_DIR:h} BIN_DIR="${HOME}/.local/bin" STATE_DIR="${HOME}/Library/Application Support/UltraMesh" LAUNCH_DIR="${HOME}/Library/LaunchAgents" PLIST_PATH="${LAUNCH_DIR}/com.ultramesh.umnd.plist" HELPER_BIN="/Library/PrivilegedHelperTools/com.ultramesh.umn-helper" HELPER_PLIST="/Library/LaunchDaemons/com.ultramesh.umn-helper.plist" HELPER_SOCKET="/var/run/ultramesh-helper.sock" RESOLVER_PATH="/etc/resolver/mesh" TEMP_DIR=$(mktemp -d) trap 'rm -rf "${TEMP_DIR}"' EXIT cd "${PROJECT_DIR}" swift build -c release --product umnd swift build -c release --product umn swift build -c release --product umn-helper BUILD_DIR=$(swift build -c release --show-bin-path) mkdir -p "${BIN_DIR}" "${STATE_DIR}" "${LAUNCH_DIR}" install -m 755 "${BUILD_DIR}/umnd" "${BIN_DIR}/umnd" install -m 755 "${BUILD_DIR}/umn" "${BIN_DIR}/umn" codesign --force --sign - "${BIN_DIR}/umnd" >/dev/null 2>&1 codesign --force --sign - "${BIN_DIR}/umn" >/dev/null 2>&1 codesign --force --sign - "${BUILD_DIR}/umn-helper" >/dev/null 2>&1 cat > "${TEMP_DIR}/helper.plist" < Labelcom.ultramesh.umn-helper ProgramArguments${HELPER_BIN}--uid${UID}--socket${HELPER_SOCKET} RunAtLoadKeepAlive StandardOutPath/var/log/ultramesh-helper.log StandardErrorPath/var/log/ultramesh-helper.log EOF cat > "${TEMP_DIR}/resolver" <<'EOF' # Managed by Ultra Mesh Network nameserver 127.0.0.1 port 53535 EOF plutil -lint "${TEMP_DIR}/helper.plist" >/dev/null if [[ -e "${RESOLVER_PATH}" ]] && ! cmp -s "${TEMP_DIR}/resolver" "${RESOLVER_PATH}"; then echo "Refusing to overwrite unmanaged ${RESOLVER_PATH}." >&2 exit 1 fi sudo -v sudo launchctl bootout system "${HELPER_PLIST}" >/dev/null 2>&1 || true sudo install -d -m 755 /Library/PrivilegedHelperTools /Library/LaunchDaemons /etc/resolver sudo install -m 755 "${BUILD_DIR}/umn-helper" "${HELPER_BIN}" sudo install -m 644 "${TEMP_DIR}/helper.plist" "${HELPER_PLIST}" sudo install -m 644 "${TEMP_DIR}/resolver" "${RESOLVER_PATH}" sudo launchctl bootstrap system "${HELPER_PLIST}" launchctl bootout "gui/${UID}" "${PLIST_PATH}" >/dev/null 2>&1 || true plutil -create xml1 "${PLIST_PATH}" plutil -insert Label -string com.ultramesh.umnd "${PLIST_PATH}" plutil -insert ProgramArguments -array "${PLIST_PATH}" plutil -insert ProgramArguments.0 -string "${BIN_DIR}/umnd" "${PLIST_PATH}" plutil -insert RunAtLoad -bool true "${PLIST_PATH}" plutil -insert KeepAlive -bool true "${PLIST_PATH}" plutil -insert ProcessType -string Background "${PLIST_PATH}" plutil -insert StandardOutPath -string "${STATE_DIR}/umnd.log" "${PLIST_PATH}" plutil -insert StandardErrorPath -string "${STATE_DIR}/umnd.log" "${PLIST_PATH}" chmod 600 "${PLIST_PATH}" launchctl bootstrap "gui/${UID}" "${PLIST_PATH}" for _ in {1..20}; do [[ -S "${HELPER_SOCKET}" ]] && [[ -S "${STATE_DIR}/umnd.sock" ]] && break; sleep 0.25; done echo "Ultra Mesh Network installed." echo "Binary directory: ${BIN_DIR}" if [[ ":${PATH}:" != *":${BIN_DIR}:"* ]]; then echo "Add this line to ~/.zshrc: export PATH=\"\$HOME/.local/bin:\$PATH\"" fi STATUS=$("${BIN_DIR}/umn" status) echo "${STATUS}" INTERFACE=$("${BIN_DIR}/umn" interface status) echo "${INTERFACE}" [[ "${STATUS}" == *"DNS listening"* ]] || { echo "DNS health check failed (port 53535 may be busy)." >&2; exit 1; } [[ "${INTERFACE}" == *"helper: connected"* ]] || { echo "native interface health check failed." >&2; exit 1; }