From 984dc3c472a3eee64904a490efbc7a099744e078 Mon Sep 17 00:00:00 2001 From: Rod Christiansen Date: Fri, 31 Jul 2026 20:44:57 -0700 Subject: [PATCH] Rename app to Managed Bootstrap Install The app bundle becomes /Applications/Utilities/Managed Bootstrap Install.app for naming uniformity with Managed Software Center and Managed Reports Runner across the managed-client tooling. The CLI binary stays managedbootstrapinstall, all com.github.bootstrapmate identifiers stay, and the pkg filename stays BootstrapMate-.pkg so the downstream Munki pipeline glob keeps working. Postinstall removes the old BootstrapMate.app on upgrade, and every Makefile expansion of the bundle path is quoted for the space in the new name. [tracked internally] --- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 2 +- Makefile | 38 +++++++++---------- Sources/app/Views/RunView.swift | 4 +- Sources/app/Views/SettingsView.swift | 2 +- .../Utilities/BootstrapMateConstants.swift | 2 +- .../com.github.bootstrapmate.plist | 2 +- packaging/resources/Info.plist.template | 4 +- packaging/scripts/postinstall | 12 +++++- 9 files changed, 39 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a79331a..65c2f22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: BUILD_DIR=build PKG_ROOT=$BUILD_DIR/pkg-root PACKAGING_DIR=packaging - APP_PATH="$PKG_ROOT/Applications/Utilities/BootstrapMate.app" + APP_PATH="$PKG_ROOT/Applications/Utilities/Managed Bootstrap Install.app" # Create app bundle mkdir -p "$APP_PATH/Contents/MacOS" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6f2bc5c..7e92b74 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -78,7 +78,7 @@ jobs: PACKAGING_DIR=packaging SWIFT_REL=.build/apple/Products/Release ACTOOL_OUT="$BUILD_DIR/actool-out" - APP="$PKG_ROOT/Applications/Utilities/BootstrapMate.app" + APP="$PKG_ROOT/Applications/Utilities/Managed Bootstrap Install.app" APP_MACOS="$APP/Contents/MacOS" APP_RES="$APP/Contents/Resources" APP_HELPER_LD="$APP/Contents/Library/LaunchDaemons" diff --git a/Makefile b/Makefile index 7205e53..b642882 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ BINARY_NAME = managedbootstrapinstall GUI_BINARY_NAME = BootstrapMateGUI HELPER_BINARY_NAME = BootstrapMateHelper BINARY_INSTALL_PATH = usr/local/bootstrapmate -APP_BUNDLE_PATH = Applications/Utilities/BootstrapMate.app +APP_BUNDLE_PATH = Applications/Utilities/Managed Bootstrap Install.app APP_MACOS_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/MacOS APP_RESOURCES_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Resources APP_HELPER_LD_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Library/LaunchDaemons @@ -126,7 +126,7 @@ swift-build: copy-binary: swift-build @echo "$(BLUE)Signing and copying binaries to app bundle...$(NC)" - @mkdir -p $(APP_MACOS_DIR) + @mkdir -p "$(APP_MACOS_DIR)" # Sign the CLI binary with hardened runtime before packaging @codesign --force --sign "$(SIGNING_IDENTITY_APP)" \ @@ -150,12 +150,12 @@ copy-binary: swift-build $(SWIFT_HELPER_BINARY) # Copy all binaries to app bundle MacOS directory - @cp $(SWIFT_BINARY) $(APP_MACOS_DIR)/$(BINARY_NAME) - @chmod 755 $(APP_MACOS_DIR)/$(BINARY_NAME) - @cp $(SWIFT_GUI_BINARY) $(APP_MACOS_DIR)/$(GUI_BINARY_NAME) - @chmod 755 $(APP_MACOS_DIR)/$(GUI_BINARY_NAME) - @cp $(SWIFT_HELPER_BINARY) $(APP_MACOS_DIR)/$(HELPER_BINARY_NAME) - @chmod 755 $(APP_MACOS_DIR)/$(HELPER_BINARY_NAME) + @cp $(SWIFT_BINARY) "$(APP_MACOS_DIR)/$(BINARY_NAME)" + @chmod 755 "$(APP_MACOS_DIR)/$(BINARY_NAME)" + @cp $(SWIFT_GUI_BINARY) "$(APP_MACOS_DIR)/$(GUI_BINARY_NAME)" + @chmod 755 "$(APP_MACOS_DIR)/$(GUI_BINARY_NAME)" + @cp $(SWIFT_HELPER_BINARY) "$(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)" + @chmod 755 "$(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)" # Create placeholder for symlink directory @mkdir -p $(PKG_ROOT)/$(BINARY_INSTALL_PATH) @@ -177,19 +177,19 @@ compile-icon: create-app-bundle: copy-binary compile-icon @echo "$(BLUE)Creating app bundle...$(NC)" - @mkdir -p $(APP_RESOURCES_DIR) - @rm -rf $(APP_RESOURCES_DIR)/* - + @mkdir -p "$(APP_RESOURCES_DIR)" + @rm -rf "$(APP_RESOURCES_DIR)"/* + # Copy Info.plist template and substitute version placeholders @sed -e 's/{{MARKETING_VERSION}}/$(MARKETING_VERSION)/g' \ -e 's/{{BUILD_NUMBER}}/$(BUILD_NUMBER)/g' \ - $(PACKAGING_DIR)/resources/Info.plist.template > $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Info.plist - + $(PACKAGING_DIR)/resources/Info.plist.template > "$(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Info.plist" + # Copy compiled Assets.car (contains Liquid Glass icon for macOS 26+) - @cp $(ACTOOL_OUT)/Assets.car $(APP_RESOURCES_DIR)/Assets.car - + @cp $(ACTOOL_OUT)/Assets.car "$(APP_RESOURCES_DIR)/Assets.car" + # Copy .icns fallback (macOS 13–25) - composited by actool, not a raw layer PNG - @cp $(ACTOOL_OUT)/$(ICON_NAME).icns $(APP_RESOURCES_DIR)/$(ICON_NAME).icns + @cp $(ACTOOL_OUT)/$(ICON_NAME).icns "$(APP_RESOURCES_DIR)/$(ICON_NAME).icns" @echo "$(GREEN)✓ App bundle created$(NC)" @@ -197,9 +197,9 @@ create-launchdaemon: create-app-bundle @echo "$(BLUE)Copying LaunchDaemon plists...$(NC)" @mkdir -p $(PKG_ROOT)/Library/LaunchDaemons @mkdir -p $(SCRIPTS_DIR) - @mkdir -p $(APP_HELPER_LD_DIR) + @mkdir -p "$(APP_HELPER_LD_DIR)" @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.plist $(PKG_ROOT)/Library/LaunchDaemons/ - @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.helper.plist $(APP_HELPER_LD_DIR)/ + @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.helper.plist "$(APP_HELPER_LD_DIR)/" @cp $(PACKAGING_DIR)/scripts/postinstall $(SCRIPTS_DIR)/ @chmod +x $(SCRIPTS_DIR)/postinstall @echo "$(GREEN)✓ LaunchDaemon plists and scripts copied$(NC)" @@ -210,7 +210,7 @@ sign-app: create-launchdaemon --options runtime \ --timestamp \ --deep \ - $(PKG_ROOT)/$(APP_BUNDLE_PATH) + "$(PKG_ROOT)/$(APP_BUNDLE_PATH)" @echo "$(GREEN)✓ App bundle signed$(NC)" build-pkg: sign-app diff --git a/Sources/app/Views/RunView.swift b/Sources/app/Views/RunView.swift index 2151bf9..963f94c 100644 --- a/Sources/app/Views/RunView.swift +++ b/Sources/app/Views/RunView.swift @@ -67,7 +67,7 @@ struct RunView: View { Button { startRun() } label: { - Label("Run BootstrapMate", systemImage: "play.fill") + Label("Run Managed Bootstrap Install", systemImage: "play.fill") } .buttonStyle(.glassProminent) .tint(.green) @@ -77,7 +77,7 @@ struct RunView: View { Button { startRun() } label: { - Label("Run BootstrapMate", systemImage: "play.fill") + Label("Run Managed Bootstrap Install", systemImage: "play.fill") } .controlSize(.large) .disabled(xpcClient.helperStatus != .registered) diff --git a/Sources/app/Views/SettingsView.swift b/Sources/app/Views/SettingsView.swift index 77fd08c..cc5b21a 100644 --- a/Sources/app/Views/SettingsView.swift +++ b/Sources/app/Views/SettingsView.swift @@ -66,7 +66,7 @@ struct SettingsView: View { .aspectRatio(contentMode: .fit) .frame(width: 72, height: 72) - Text("BootstrapMate") + Text("Managed Bootstrap Install") .font(.largeTitle.bold()) Text("Enterprise management tools provisioning for automated device setup using manifests.") diff --git a/Sources/core/Utilities/BootstrapMateConstants.swift b/Sources/core/Utilities/BootstrapMateConstants.swift index a0902b3..73cb49b 100644 --- a/Sources/core/Utilities/BootstrapMateConstants.swift +++ b/Sources/core/Utilities/BootstrapMateConstants.swift @@ -2,7 +2,7 @@ import Foundation public enum BootstrapMateConstants { public static let daemonIdentifier = "com.github.bootstrapmate" - public static let executablePath = "/Applications/Utilities/BootstrapMate.app/Contents/MacOS/managedbootstrapinstall" + public static let executablePath = "/Applications/Utilities/Managed Bootstrap Install.app/Contents/MacOS/managedbootstrapinstall" public static let helperBundleID = "com.github.bootstrapmate.helper" public static let helperPlistName = "com.github.bootstrapmate.helper.plist" public static let defaultRetryCount = 3 diff --git a/packaging/LaunchDaemons/com.github.bootstrapmate.plist b/packaging/LaunchDaemons/com.github.bootstrapmate.plist index 07cfcee..22d4a1c 100644 --- a/packaging/LaunchDaemons/com.github.bootstrapmate.plist +++ b/packaging/LaunchDaemons/com.github.bootstrapmate.plist @@ -6,7 +6,7 @@ com.github.bootstrapmate ProgramArguments - /Applications/Utilities/BootstrapMate.app/Contents/MacOS/managedbootstrapinstall + /Applications/Utilities/Managed Bootstrap Install.app/Contents/MacOS/managedbootstrapinstall RunAtLoad diff --git a/packaging/resources/Info.plist.template b/packaging/resources/Info.plist.template index 46a456b..e2be4bd 100644 --- a/packaging/resources/Info.plist.template +++ b/packaging/resources/Info.plist.template @@ -7,7 +7,9 @@ CFBundleIdentifier com.github.bootstrapmate CFBundleName - BootstrapMate + Managed Bootstrap Install + CFBundleDisplayName + Managed Bootstrap Install CFBundleIconFile BootstrapMate CFBundleIconName diff --git a/packaging/scripts/postinstall b/packaging/scripts/postinstall index 0aeb733..7db560f 100755 --- a/packaging/scripts/postinstall +++ b/packaging/scripts/postinstall @@ -11,7 +11,8 @@ log() { log "=== BootstrapMate postinstall started ===" -APP_PATH="/Applications/Utilities/BootstrapMate.app" +APP_PATH="/Applications/Utilities/Managed Bootstrap Install.app" +LEGACY_APP_PATH="/Applications/Utilities/BootstrapMate.app" BINARY_PATH="${APP_PATH}/Contents/MacOS/managedbootstrapinstall" SYMLINK_DIR="/usr/local/bootstrapmate" SYMLINK_PATH="${SYMLINK_DIR}/managedbootstrapinstall" @@ -24,6 +25,13 @@ CACHE_DIR="${MANAGED_DIR}/cache" log "Creating directories..." +# Remove the pre-rename app bundle: the payload no longer covers the old path, +# so an upgrade would otherwise leave both apps in /Applications/Utilities +if [[ -d "${LEGACY_APP_PATH}" ]]; then + rm -rf "${LEGACY_APP_PATH}" + log "Removed legacy app bundle: ${LEGACY_APP_PATH}" +fi + # Create Managed Bootstrap directories FIRST (before daemon can start) mkdir -p "${LOG_DIR}" chmod 755 "${LOG_DIR}" @@ -37,7 +45,7 @@ if [[ -x "${BINARY_PATH}" ]]; then log "Binary found: ${BINARY_PATH}" # Get binary info - log "Binary architecture: $(file ${BINARY_PATH})" + log "Binary architecture: $(file "${BINARY_PATH}")" # Create symlink directory and symlink rm -f "${SYMLINK_DIR}/.placeholder" 2>/dev/null || true