From 02e3107a2338ef71b39e9ea192c5c0f70207bb12 Mon Sep 17 00:00:00 2001 From: yyy-amnezia Date: Fri, 30 Jan 2026 06:05:20 +0200 Subject: [PATCH] feat: implement service kickstart and improve macos post install script (#2131) --- deploy/data/macos/AmneziaVPN.plist | 2 + deploy/data/macos/post_install.sh | 64 +++++++++++++++++------------ deploy/data/macos/post_uninstall.sh | 2 +- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/deploy/data/macos/AmneziaVPN.plist b/deploy/data/macos/AmneziaVPN.plist index 8dabbc9e4..0627024c9 100644 --- a/deploy/data/macos/AmneziaVPN.plist +++ b/deploy/data/macos/AmneziaVPN.plist @@ -10,6 +10,8 @@ KeepAlive + RunAtLoad + Sockets Listeners diff --git a/deploy/data/macos/post_install.sh b/deploy/data/macos/post_install.sh index 053c8e13b..6a01bdbd3 100755 --- a/deploy/data/macos/post_install.sh +++ b/deploy/data/macos/post_install.sh @@ -7,42 +7,54 @@ LOG_FOLDER=/var/log/$APP_NAME LOG_FILE="$LOG_FOLDER/post-install.log" APP_PATH=/Applications/$APP_NAME.app +rm -rf "$LOG_FOLDER" +mkdir -p "$LOG_FOLDER" +echo "`date` Script started" > "$LOG_FILE" + +log() { + echo "`date` $*" >> "$LOG_FILE" +} + +run_cmd() { + log "CMD: $*" + "$@" >> "$LOG_FILE" 2>&1 + local ec=$? + log "EXIT: $ec" + return $ec +} + # Handle new installations unpacked into localized folder if [ -d "/Applications/${APP_NAME}.localized" ]; then - echo "`date` Detected ${APP_NAME}.localized, migrating to standard path" >> $LOG_FILE - sudo rm -rf "$APP_PATH" - sudo mv "/Applications/${APP_NAME}.localized/${APP_NAME}.app" "$APP_PATH" - sudo rm -rf "/Applications/${APP_NAME}.localized" + log "Detected ${APP_NAME}.localized, migrating to standard path" + run_cmd sudo rm -rf "$APP_PATH" + run_cmd sudo mv "/Applications/${APP_NAME}.localized/${APP_NAME}.app" "$APP_PATH" + run_cmd sudo rm -rf "/Applications/${APP_NAME}.localized" fi -if launchctl list "$APP_NAME-service" &> /dev/null; then - launchctl unload "$LAUNCH_DAEMONS_PLIST_NAME" - rm -f "$LAUNCH_DAEMONS_PLIST_NAME" -fi +run_cmd launchctl bootout system "$LAUNCH_DAEMONS_PLIST_NAME" || run_cmd launchctl unload "$LAUNCH_DAEMONS_PLIST_NAME" +run_cmd rm -f "$LAUNCH_DAEMONS_PLIST_NAME" -sudo chmod -R a-w "$APP_PATH/" -sudo chown -R root "$APP_PATH/" -sudo chgrp -R wheel "$APP_PATH/" +run_cmd sudo chmod -R a-w "$APP_PATH/" +run_cmd sudo chown -R root "$APP_PATH/" +run_cmd sudo chgrp -R wheel "$APP_PATH/" -rm -rf $LOG_FOLDER -mkdir -p $LOG_FOLDER - -echo "`date` Script started" > $LOG_FILE - -echo "Requesting ${APP_NAME} to quit gracefully" >> "$LOG_FILE" -osascript -e 'tell application "AmneziaVPN" to quit' +log "Requesting ${APP_NAME} to quit gracefully" +run_cmd osascript -e 'tell application "AmneziaVPN" to quit' || true PLIST_SOURCE="$APP_PATH/Contents/Resources/$PLIST_NAME" if [ -f "$PLIST_SOURCE" ]; then - mv -f "$PLIST_SOURCE" "$LAUNCH_DAEMONS_PLIST_NAME" 2>> $LOG_FILE + run_cmd mv -f "$PLIST_SOURCE" "$LAUNCH_DAEMONS_PLIST_NAME" else - echo "`date` ERROR: service plist not found at $PLIST_SOURCE" >> $LOG_FILE + log "ERROR: service plist not found at $PLIST_SOURCE" fi -chown root:wheel "$LAUNCH_DAEMONS_PLIST_NAME" -launchctl load "$LAUNCH_DAEMONS_PLIST_NAME" -echo "`date` Launching ${APP_NAME} application" >> $LOG_FILE -open -a "$APP_PATH" 2>> $LOG_FILE || true +run_cmd chown root:wheel "$LAUNCH_DAEMONS_PLIST_NAME" +run_cmd chmod 644 "$LAUNCH_DAEMONS_PLIST_NAME" +run_cmd launchctl bootstrap system "$LAUNCH_DAEMONS_PLIST_NAME" || run_cmd launchctl load "$LAUNCH_DAEMONS_PLIST_NAME" +run_cmd launchctl enable "system/$APP_NAME-service" || true +run_cmd launchctl kickstart -k "system/$APP_NAME-service" || true +run_cmd launchctl print "system/$APP_NAME-service" || true +log "Launching ${APP_NAME} application" +run_cmd open -a "$APP_PATH" || true -echo "`date` Service status: $?" >> $LOG_FILE -echo "`date` Script finished" >> $LOG_FILE +log "Script finished" diff --git a/deploy/data/macos/post_uninstall.sh b/deploy/data/macos/post_uninstall.sh index d6c5cdbd9..c9336b8af 100755 --- a/deploy/data/macos/post_uninstall.sh +++ b/deploy/data/macos/post_uninstall.sh @@ -29,7 +29,7 @@ fi # Unload the service if loaded and remove its plist file regardless if launchctl list "${APP_NAME}-service" &> /dev/null; then - sudo launchctl unload "$LAUNCH_DAEMONS_PLIST_NAME" + sudo launchctl bootout system "$LAUNCH_DAEMONS_PLIST_NAME" || sudo launchctl unload "$LAUNCH_DAEMONS_PLIST_NAME" fi sudo rm -f "$LAUNCH_DAEMONS_PLIST_NAME"