From 6c498dbf31c7f3b42734fa8797a29931ce850419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Fri, 7 Jan 2022 13:44:04 +0100 Subject: [PATCH 1/3] LSMinimumSystemVersion handling If an app has `LSMinimumSystemVersion` in the `Info.plist`, then we will check if the installed macOS lives up to this, and exit if not. First a normal run on Monterey: ``` Installomator/utils/assemble.sh omnidisksweeper DEBUG=0 INSTALL=force 2022-01-07 13:37:43 omnidisksweeper setting variable from argument DEBUG=0 2022-01-07 13:37:43 omnidisksweeper setting variable from argument INSTALL=force 2022-01-07 13:37:43 omnidisksweeper ################## Start Installomator v. 9.0dev 2022-01-07 13:37:43 omnidisksweeper ################## omnidisksweeper 2022-01-07 13:37:44 omnidisksweeper BLOCKING_PROCESS_ACTION=tell_user 2022-01-07 13:37:44 omnidisksweeper NOTIFY=success 2022-01-07 13:37:44 omnidisksweeper LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns 2022-01-07 13:37:44 omnidisksweeper no blocking processes defined, using OmniDiskSweeper as default 2022-01-07 13:37:44 omnidisksweeper Changing directory to /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.41qqoUEN 2022-01-07 13:37:44 omnidisksweeper App(s) found: /Applications/OmniDiskSweeper.app 2022-01-07 13:37:44 omnidisksweeper found app at /Applications/OmniDiskSweeper.app, version 1.13 2022-01-07 13:37:44 omnidisksweeper appversion: 1.13 2022-01-07 13:37:44 omnidisksweeper Using force to install, so not using updateTool. 2022-01-07 13:37:44 omnidisksweeper Latest version of OmniDiskSweeper is 1.13 2022-01-07 13:37:44 omnidisksweeper There is no newer version available. 2022-01-07 13:37:44 omnidisksweeper Downloading https://downloads.omnigroup.com/software/MacOSX/10.14/OmniDiskSweeper-1.13.dmg to OmniDiskSweeper.dmg 2022-01-07 13:37:45 omnidisksweeper no more blocking processes, continue with update 2022-01-07 13:37:45 omnidisksweeper Installing OmniDiskSweeper 2022-01-07 13:37:45 omnidisksweeper Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.41qqoUEN/OmniDiskSweeper.dmg 2022-01-07 13:37:46 omnidisksweeper Mounted: /Volumes/OmniDiskSweeper 2022-01-07 13:37:46 omnidisksweeper Verifying: /Volumes/OmniDiskSweeper/OmniDiskSweeper.app 2022-01-07 13:37:49 omnidisksweeper Team ID matching: 34YW5XSRB7 (expected: 34YW5XSRB7 ) 2022-01-07 13:37:49 omnidisksweeper App has LSMinimumSystemVersion: 10.14 2022-01-07 13:37:49 omnidisksweeper Downloaded version of OmniDiskSweeper is 1.13, same as installed. 2022-01-07 13:37:49 omnidisksweeper Using force to install anyway. 2022-01-07 13:37:49 omnidisksweeper Removing existing /Applications/OmniDiskSweeper.app 2022-01-07 13:37:49 omnidisksweeper Copy /Volumes/OmniDiskSweeper/OmniDiskSweeper.app to /Applications 2022-01-07 13:37:49 omnidisksweeper Changing owner to st 2022-01-07 13:37:49 omnidisksweeper Finishing... 2022-01-07 13:37:59 omnidisksweeper App(s) found: /Applications/OmniDiskSweeper.app 2022-01-07 13:37:59 omnidisksweeper found app at /Applications/OmniDiskSweeper.app, version 1.13 2022-01-07 13:37:59 omnidisksweeper Installed OmniDiskSweeper, version 1.13 2022-01-07 13:37:59 omnidisksweeper notifying 2022-01-07 13:37:59 omnidisksweeper Deleting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.41qqoUEN 2022-01-07 13:37:59 omnidisksweeper Unmounting /Volumes/OmniDiskSweeper "disk4" ejected. 2022-01-07 13:38:00 omnidisksweeper App not closed, so no reopen. 2022-01-07 13:38:00 omnidisksweeper ################## End Installomator, exit code 0 ``` Trying where I manually change OS version to 10.13: ``` Installomator/utils/assemble.sh omnidisksweeper DEBUG=0 INSTALL=force 2022-01-07 13:38:39 omnidisksweeper setting variable from argument DEBUG=0 2022-01-07 13:38:39 omnidisksweeper setting variable from argument INSTALL=force 2022-01-07 13:38:39 omnidisksweeper ################## Start Installomator v. 9.0dev 2022-01-07 13:38:39 omnidisksweeper ################## omnidisksweeper 2022-01-07 13:38:39 omnidisksweeper BLOCKING_PROCESS_ACTION=tell_user 2022-01-07 13:38:39 omnidisksweeper NOTIFY=success 2022-01-07 13:38:39 omnidisksweeper LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns 2022-01-07 13:38:39 omnidisksweeper no blocking processes defined, using OmniDiskSweeper as default 2022-01-07 13:38:39 omnidisksweeper Changing directory to /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.PXjTfPiA 2022-01-07 13:38:39 omnidisksweeper App(s) found: /Applications/OmniDiskSweeper.app 2022-01-07 13:38:39 omnidisksweeper found app at /Applications/OmniDiskSweeper.app, version 1.13 2022-01-07 13:38:40 omnidisksweeper appversion: 1.13 2022-01-07 13:38:40 omnidisksweeper Using force to install, so not using updateTool. 2022-01-07 13:38:40 omnidisksweeper Latest version of OmniDiskSweeper is 1.13 2022-01-07 13:38:40 omnidisksweeper There is no newer version available. 2022-01-07 13:38:40 omnidisksweeper Downloading https://downloads.omnigroup.com/software/MacOSX/10.14/OmniDiskSweeper-1.13.dmg to OmniDiskSweeper.dmg 2022-01-07 13:38:40 omnidisksweeper no more blocking processes, continue with update 2022-01-07 13:38:40 omnidisksweeper Installing OmniDiskSweeper 2022-01-07 13:38:40 omnidisksweeper Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.PXjTfPiA/OmniDiskSweeper.dmg 2022-01-07 13:38:41 omnidisksweeper Mounted: /Volumes/OmniDiskSweeper 2022-01-07 13:38:41 omnidisksweeper Verifying: /Volumes/OmniDiskSweeper/OmniDiskSweeper.app 2022-01-07 13:38:43 omnidisksweeper Team ID matching: 34YW5XSRB7 (expected: 34YW5XSRB7 ) 2022-01-07 13:38:43 omnidisksweeper App has LSMinimumSystemVersion: 10.14 2022-01-07 13:38:43 omnidisksweeper App requires higher System Version than installed: 10.13 2022-01-07 13:38:43 omnidisksweeper ERROR: Installed macOS is too old for this app. 2022-01-07 13:38:43 omnidisksweeper Deleting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.PXjTfPiA 2022-01-07 13:38:43 omnidisksweeper Unmounting /Volumes/OmniDiskSweeper "disk4" ejected. 2022-01-07 13:38:43 omnidisksweeper App not closed, so no reopen. 2022-01-07 13:38:43 omnidisksweeper ################## End Installomator, exit code 6 ``` --- fragments/arguments.sh | 3 ++- fragments/functions.sh | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/fragments/arguments.sh b/fragments/arguments.sh index d682862..6c01519 100644 --- a/fragments/arguments.sh +++ b/fragments/arguments.sh @@ -1,7 +1,8 @@ # MARK: check minimal macOS requirement autoload is-at-least -if ! is-at-least 10.14 $(sw_vers -productVersion); then +installedOSversion=$(sw_vers -productVersion) +if ! is-at-least 10.14 $installedOSversion; then printlog "Installomator requires at least macOS 10.14 Mojave." exit 98 fi diff --git a/fragments/functions.sh b/fragments/functions.sh index f5d5137..b1ba7a0 100644 --- a/fragments/functions.sh +++ b/fragments/functions.sh @@ -345,8 +345,17 @@ installAppWithPath() { # $1: path to app to install in $targetDir cleanupAndExit 5 "Team IDs do not match" fi - # versioncheck - # credit: Søren Theilgaard (@theilgaard) + # macOS versioncheck + minimumOSversion=$(defaults read $appPath/Contents/Info.plist LSMinimumSystemVersion) + if [[ $minimumOSversion =~ '[0-9.]*' ]]; then + printlog "App has LSMinimumSystemVersion: $minimumOSversion" + if ! is-at-least $minimumOSversion $installedOSversion; then + printlog "App requires higher System Version than installed: $installedOSversion" + cleanupAndExit 6 "Installed macOS is too old for this app." + fi + fi + + # app versioncheck appNewVersion=$(defaults read $appPath/Contents/Info.plist $versionKey) if [[ -n $appNewVersion && $appversion == $appNewVersion ]]; then printlog "Downloaded version of $name is $appNewVersion, same as installed." From 75e550acfe4912673343283a531f1701d2026936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Fri, 7 Jan 2022 14:07:21 +0100 Subject: [PATCH 2/3] notification Now with notification: ``` Installomator/utils/assemble.sh omnidisksweeper DEBUG=0 INSTALL=force NOTIFY=all 2022-01-07 14:05:25 omnidisksweeper setting variable from argument DEBUG=0 2022-01-07 14:05:25 omnidisksweeper setting variable from argument INSTALL=force 2022-01-07 14:05:25 omnidisksweeper setting variable from argument NOTIFY=all 2022-01-07 14:05:25 omnidisksweeper ################## Start Installomator v. 9.0dev 2022-01-07 14:05:25 omnidisksweeper ################## omnidisksweeper 2022-01-07 14:05:25 omnidisksweeper BLOCKING_PROCESS_ACTION=tell_user 2022-01-07 14:05:25 omnidisksweeper NOTIFY=all 2022-01-07 14:05:25 omnidisksweeper LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns 2022-01-07 14:05:26 omnidisksweeper no blocking processes defined, using OmniDiskSweeper as default 2022-01-07 14:05:26 omnidisksweeper Changing directory to /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.11IcaInb 2022-01-07 14:05:26 omnidisksweeper App(s) found: /Applications/OmniDiskSweeper.app 2022-01-07 14:05:26 omnidisksweeper found app at /Applications/OmniDiskSweeper.app, version 1.13 2022-01-07 14:05:26 omnidisksweeper appversion: 1.13 2022-01-07 14:05:26 omnidisksweeper Using force to install, so not using updateTool. 2022-01-07 14:05:26 omnidisksweeper Latest version of OmniDiskSweeper is 1.13 2022-01-07 14:05:26 omnidisksweeper There is no newer version available. 2022-01-07 14:05:26 omnidisksweeper Downloading https://downloads.omnigroup.com/software/MacOSX/10.14/OmniDiskSweeper-1.13.dmg to OmniDiskSweeper.dmg 2022-01-07 14:05:26 omnidisksweeper notifying 2022-01-07 14:05:28 omnidisksweeper no more blocking processes, continue with update 2022-01-07 14:05:28 omnidisksweeper Installing OmniDiskSweeper 2022-01-07 14:05:28 omnidisksweeper notifying 2022-01-07 14:05:28 omnidisksweeper Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.11IcaInb/OmniDiskSweeper.dmg 2022-01-07 14:05:29 omnidisksweeper Mounted: /Volumes/OmniDiskSweeper 2022-01-07 14:05:29 omnidisksweeper Verifying: /Volumes/OmniDiskSweeper/OmniDiskSweeper.app 2022-01-07 14:05:31 omnidisksweeper Team ID matching: 34YW5XSRB7 (expected: 34YW5XSRB7 ) 2022-01-07 14:05:31 omnidisksweeper Downloaded version of OmniDiskSweeper is 1.13, same as installed. 2022-01-07 14:05:31 omnidisksweeper Using force to install anyway. 2022-01-07 14:05:31 omnidisksweeper App has LSMinimumSystemVersion: 10.14 2022-01-07 14:05:32 omnidisksweeper App requires higher System Version than installed: 10.13.5 2022-01-07 14:05:32 omnidisksweeper notifying 2022-01-07 14:05:32 omnidisksweeper ERROR: Installed macOS is too old for this app. 2022-01-07 14:05:32 omnidisksweeper Deleting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.11IcaInb 2022-01-07 14:05:32 omnidisksweeper Unmounting /Volumes/OmniDiskSweeper "disk4" ejected. 2022-01-07 14:05:32 omnidisksweeper App not closed, so no reopen. 2022-01-07 14:05:32 omnidisksweeper ################## End Installomator, exit code 6 ``` --- fragments/functions.sh | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/fragments/functions.sh b/fragments/functions.sh index b1ba7a0..02a5f86 100644 --- a/fragments/functions.sh +++ b/fragments/functions.sh @@ -345,16 +345,6 @@ installAppWithPath() { # $1: path to app to install in $targetDir cleanupAndExit 5 "Team IDs do not match" fi - # macOS versioncheck - minimumOSversion=$(defaults read $appPath/Contents/Info.plist LSMinimumSystemVersion) - if [[ $minimumOSversion =~ '[0-9.]*' ]]; then - printlog "App has LSMinimumSystemVersion: $minimumOSversion" - if ! is-at-least $minimumOSversion $installedOSversion; then - printlog "App requires higher System Version than installed: $installedOSversion" - cleanupAndExit 6 "Installed macOS is too old for this app." - fi - fi - # app versioncheck appNewVersion=$(defaults read $appPath/Contents/Info.plist $versionKey) if [[ -n $appNewVersion && $appversion == $appNewVersion ]]; then @@ -373,6 +363,21 @@ installAppWithPath() { # $1: path to app to install in $targetDir printlog "Downloaded version of $name is $appNewVersion (replacing version $appversion)." fi + # macOS versioncheck + minimumOSversion=$(defaults read $appPath/Contents/Info.plist LSMinimumSystemVersion) + if [[ $minimumOSversion =~ '[0-9.]*' ]]; then + printlog "App has LSMinimumSystemVersion: $minimumOSversion" + if ! is-at-least $minimumOSversion $installedOSversion; then + printlog "App requires higher System Version than installed: $installedOSversion" + message="Cannot install $name, version $appNewVersion, as it is not compatible with the running system version." + if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then + printlog "notifying" + displaynotification "$message" "Error updating $name!" + fi + cleanupAndExit 6 "Installed macOS is too old for this app." + fi + fi + # skip install for DEBUG 1 if [ "$DEBUG" -eq 1 ]; then printlog "DEBUG mode 1 enabled, skipping remove, copy and chown steps" From 264dc99a97db8b831164808d9f71d0481201068f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Sun, 9 Jan 2022 10:47:30 +0100 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f87508..6502e02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## v9? - We have moved the root check to the beginning of the script, and improved DEBUG handling with two different modes. `DEBUG=0` is still for production, and `1` is still for the DEBUG we previously knew downloading to the directory it is running from, but `2` will download to temporary folder, will detect updates, but will not install anything, but it will notify the user (almost as running the script without root before). +- `LSMinimumSystemVersion` will now be honered, if the `Info.plist` in the app is specifying this. That means that an app that has this parameter in that file and it shows that the app requires a newer version of the OS than is currently installed, then we will not install it. ## v8.0