133 Commits

Author SHA1 Message Date
Armin Briegel
ecc9ccedca Revert "santa and nomad are forced to ignore blocking" 2022-10-03 15:57:34 -07:00
Armin Briegel
c36c14c2d6 removed extraneous file 2022-10-03 14:43:35 -07:00
Armin Briegel
01d1238b0d fixed parallelsrasclient file name 2022-10-03 13:57:56 -07:00
Armin Briegel
bf89f4b42b added missing line breaks 2022-10-03 13:56:12 -07:00
Adam Codega
ec1e6e6dc9 Merge pull request #711 from Installomator/acodega-MDMscriptsREADME
Update and reformatting of README
2022-10-03 13:55:26 -04:00
Theile
76ee861038 Smart quotes and a few italic and bold formatting 2022-10-03 19:49:47 +02:00
Adam Codega
3ef2b8e3fb Update and reformatting of README 2022-10-03 13:18:19 -04:00
Adam Codega
bcf9ddf248 Clarify beta statement regarding repos 2022-10-03 12:36:21 -04:00
Theile
d01cb5fb97 10.0beta3, 2022-09-30 2022-09-30 22:37:21 +02:00
Søren Theilgaard
180da16722 Merge pull request #608 from macmangr/jdk18
New Label: Java SE Development Kit 18
2022-09-30 22:33:00 +02:00
Theile
6b6ce8e23e Beta-warning! 2022-09-30 22:21:22 +02:00
Theile
b45c2f81ea 10.0beta3, 2022-09-30 2022-09-30 22:18:29 +02:00
Søren Theilgaard
2b67f3db9e Merge pull request #655 from FletcherS7/label-Egnyte-Core
New Label: Egnyte Desktop Core
2022-09-30 22:15:51 +02:00
Theile
ee02bee37c 10.0beta3, 2022-09-30 2022-09-30 22:12:09 +02:00
Søren Theilgaard
3f3f32db9b Merge pull request #605 from macmangr/libreoffice
Update libreoffice.sh
2022-09-30 22:08:30 +02:00
Søren Theilgaard
ac3815b758 Merge branch 'main' into libreoffice 2022-09-30 22:08:16 +02:00
Fletcher Salesky
2c378360c4 Omit xpath error lines from output 2022-09-30 13:07:25 -07:00
Søren Theilgaard
940fc5a0d6 Merge pull request #609 from macmangr/filemakerpro
New Label: Filemaker Pro
2022-09-30 22:04:49 +02:00
Søren Theilgaard
b5ead8f650 Merge pull request #610 from macmangr/horos
New Label: Horos
2022-09-30 22:03:54 +02:00
Søren Theilgaard
6bdddff6d7 Merge pull request #617 from macmangr/chronoagent
New Label: ChronoAgent
2022-09-30 22:00:15 +02:00
Søren Theilgaard
4a52d8ce46 Merge pull request #620 from xdgc/label-tailscale
Add Tailscale label
2022-09-30 21:54:58 +02:00
Søren Theilgaard
bc85c8195e Merge pull request #616 from macmangr/chronosync
New Label: ChronoSync
2022-09-30 21:53:44 +02:00
Søren Theilgaard
36860fd694 Merge pull request #624 from macmangr/awpst
New Label: Archiware P5
2022-09-30 21:52:06 +02:00
Søren Theilgaard
377e7e039c Merge pull request #625 from macmangr/awb2go
New Label: Archiware P5 Backup2Go
2022-09-30 21:51:08 +02:00
Søren Theilgaard
cb7c00751a Merge pull request #633 from FletcherS7/label-Nudge-Suite
New Label: Nudge Suite
2022-09-30 21:49:27 +02:00
Søren Theilgaard
1744c65773 Merge pull request #634 from kryptonit1/zotero-label
New Label: Zotero
2022-09-30 21:45:05 +02:00
Søren Theilgaard
5b9da39349 Merge pull request #621 from kenchan0130/patch-2
santa and nomad are forced to ignore blocking
2022-09-30 21:35:52 +02:00
Søren Theilgaard
67ae307f86 Merge pull request #708 from dnikles/Update-audacity-label
Update audacity label to check for arch
2022-09-30 21:35:13 +02:00
Søren Theilgaard
f5f2c3c605 Merge pull request #701 from Theile/MDM-scripts-with-Dialog-and-adding-to-Dock
Mdm scripts with dialog and adding to dock
2022-09-30 21:31:32 +02:00
Søren Theilgaard
1903e8da80 Merge pull request #691 from Theile/Fall-back-on-GitHub-downloadURL
If GitHub does not give an URL we can fall back on API call
2022-09-30 21:30:53 +02:00
Søren Theilgaard
0ceb8d2803 Merge pull request #658 from Theile/Dialog-additions
Dialog update when app is already at the latest version
2022-09-30 21:30:34 +02:00
Søren Theilgaard
e33dbc1c6d Merge pull request #656 from FletcherS7/label-zoom-outlook
New Label: Zoom Outlook Plugin
2022-09-30 21:29:53 +02:00
Søren Theilgaard
939119da83 Merge pull request #660 from buckbanzai/add-splashtopbusiness
Add splashtopbusiness Label
2022-09-30 21:29:00 +02:00
Søren Theilgaard
3f860cd2cb Merge pull request #661 from speedybutters/New-Label-bitrix24
New Label: bitrix24
2022-09-30 21:27:48 +02:00
Søren Theilgaard
32327ae03a Merge pull request #662 from speedybutters/New-Label-Origin
New Label: origin
2022-09-30 21:26:24 +02:00
Søren Theilgaard
90efc9f110 Merge pull request #670 from meschwartz/New-Label-Charles-Proxy
Created new label for Charles Proxy
2022-09-30 21:21:39 +02:00
Søren Theilgaard
d926ac34b4 Merge pull request #671 from FletcherS7/label-polylens
New Label: Poly Lens
2022-09-30 21:20:53 +02:00
Søren Theilgaard
44793e5b5e Merge pull request #678 from Theile/acroniscyberprotectconnectagent
Update acroniscyberprotectconnectagent.sh
2022-09-30 21:14:30 +02:00
Søren Theilgaard
125cb221d3 Merge pull request #690 from Theile/gfxCardStatus-label
gfxCardStatus label
2022-09-30 21:12:37 +02:00
Søren Theilgaard
3b44907148 Merge pull request #684 from kryptonit1/latexit-label
New Label: LaTeXiT
2022-09-30 21:11:13 +02:00
Søren Theilgaard
758c8b4687 Merge pull request #689 from kryptonit1/cytoscape-label
New Label: Cytoscape
2022-09-30 21:06:29 +02:00
Søren Theilgaard
f62b100cfe Merge pull request #692 from FletcherS7/update-obs-label
Update OBS Label
2022-09-30 21:05:43 +02:00
Søren Theilgaard
3d304a1a29 Merge pull request #704 from Theile/DuckDuckGo-web-browser-label-update
DuckDuckGo label — Latest url and version is last in appcast feed
2022-09-30 21:04:01 +02:00
Søren Theilgaard
2f4bbb2c68 Merge pull request #702 from Theile/R-project
R project for Apple Silicon and intel
2022-09-30 21:03:43 +02:00
Søren Theilgaard
a8d0f636d3 Merge pull request #707 from Theile/Adobe-labels-from-Isaac
Adobe labels from isaac
2022-09-30 21:03:26 +02:00
Søren Theilgaard
e700bbe7b7 Merge pull request #705 from Theile/VLC-version-on-file-name
VLC version from file name
2022-09-30 21:02:57 +02:00
Søren Theilgaard
1394d3968d Merge pull request #680 from Theile/xcreds-version-fix
Change `appNewVersion`
2022-09-30 21:00:45 +02:00
Søren Theilgaard
33c2dd626f Merge pull request #607 from macmangr/rasclient
New Label: Parallels Client
2022-09-30 20:58:26 +02:00
Søren Theilgaard
25ca38b95e Merge pull request #599 from duongt01/fellow
New Label: Fellow
2022-09-30 20:53:10 +02:00
Søren Theilgaard
11e953057a Merge pull request #598 from Chriscodinglife/fujifilmwebcam
New Label: Fujifilmwebcam
2022-09-30 20:52:36 +02:00
Søren Theilgaard
a7cefea5dd Merge pull request #665 from niavlysAO/label-screamingfrogspider-dmg-per-arch
label screamingfrogspider.sh fix, dmg per arch
2022-09-30 20:40:03 +02:00
dnikles
be62fa9895 check for arch
previous version of label was downloading the arm64 version every time
2022-09-30 11:07:30 -04:00
Theile
dd3ac338b3 Examples 2022-09-30 13:41:20 +02:00
Theile
feedc86a0a Works with version 9 and 10 comment. 2022-09-30 10:57:04 +02:00
Theile
3f41926cf9 adobecreativeclouddesktop and adobereaderdc-update
Fixing #694 and fixing #687
2022-09-30 10:14:13 +02:00
Theile
5e1dba614a Merge remote-tracking branch 'upstream/acodega-fix-AdobeCC-urls' into Adobe-labels-from-Isaac 2022-09-30 09:23:27 +02:00
Theile
d404e93365 adobeacrobatprodc, adobereaderdc 2022-09-30 09:22:29 +02:00
Theile
e0222cfe49 API call first, then fall back on home page url. 2022-09-29 16:10:36 +02:00
Theile
c955a69e47 App-update scripts
And added a bit to the README.md.
2022-09-29 13:07:42 +02:00
Theile
c5ad2291e0 VLC version from file name
```
# utils/assemble.sh vlc DEBUG=0
2022-09-28 15:22:49 : INFO  : vlc : setting variable from argument DEBUG=0
2022-09-28 15:22:49 : REQ   : vlc : ################## Start Installomator v. 10.0beta3, date 2022-09-28
2022-09-28 15:22:49 : INFO  : vlc : ################## Version: 10.0beta3
2022-09-28 15:22:49 : INFO  : vlc : ################## Date: 2022-09-28
2022-09-28 15:22:49 : INFO  : vlc : ################## vlc
2022-09-28 15:22:49 : INFO  : vlc : BLOCKING_PROCESS_ACTION=tell_user
2022-09-28 15:22:49 : INFO  : vlc : NOTIFY=success
2022-09-28 15:22:49 : INFO  : vlc : LOGGING=INFO
2022-09-28 15:22:49 : INFO  : vlc : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-09-28 15:22:49 : INFO  : vlc : Label type: dmg
2022-09-28 15:22:49 : INFO  : vlc : archiveName: VLC.dmg
2022-09-28 15:22:49 : INFO  : vlc : no blocking processes defined, using VLC as default
2022-09-28 15:22:49 : INFO  : vlc : App(s) found: /Applications/VLC.app
2022-09-28 15:22:49 : INFO  : vlc : found app at /Applications/VLC.app, version 3.0.17.3, on versionKey CFBundleShortVersionString
2022-09-28 15:22:49 : INFO  : vlc : appversion: 3.0.17.3
2022-09-28 15:22:49 : INFO  : vlc : Latest version of VLC is 3.0.17.3
2022-09-28 15:22:49 : INFO  : vlc : There is no newer version available.
2022-09-28 15:22:49 : INFO  : vlc : App not closed, so no reopen.
2022-09-28 15:22:49 : REQ   : vlc : No newer version.
2022-09-28 15:22:49 : REQ   : vlc : ################## End Installomator, exit code 0
```
2022-09-28 15:24:02 +02:00
Theile
3d2c72a672 Examples 2022-09-28 13:45:38 +02:00
Theile
f87df8bd99 Update README.md 2022-09-28 12:41:50 +02:00
Theile
2a9fd6292c Latest version is last in appcast feed 2022-09-28 10:00:34 +02:00
Theile
b7c8214b62 Variables cleaning 2022-09-27 11:22:59 +02:00
Theile
9faa9a17a9 Variables cleaning 2022-09-27 10:52:58 +02:00
Theile
e7ebeecc5b Variables cleaning 2022-09-27 10:49:58 +02:00
Theile
fdb717019f Examples 2022-09-27 10:14:56 +02:00
Theile
e3f5b2bebd Making LOGO empty 2022-09-27 08:58:52 +02:00
Theile
ddc7a67e38 Corrections and fixes 2022-09-26 16:13:35 +02:00
Theile
a68ac0d065 Missing notification and other fields for Installomator call 2022-09-26 15:45:51 +02:00
Theile
1c45e09134 RStudio with a matching appNewVersion 2022-09-26 15:11:51 +02:00
Theile
82b429a4be R project for Apple Silicon and intel 2022-09-26 14:43:43 +02:00
Theile
92d7bec606 Update README.md 2022-09-26 11:50:17 +02:00
Theile
d00ddbc891 Create README.md 2022-09-23 16:27:24 +02:00
Theile
515087f7e9 More minor tweaks 2022-09-23 14:48:09 +02:00
Theile
0a4c8cfe6e Cleaning 2022-09-21 17:36:03 +02:00
Theile
91af2427fa Fix for #698
GitHub download links changed, fixed #698.
2022-09-21 11:58:56 +02:00
Theile
24c550477a GitHub download fix 2022-09-21 11:34:01 +02:00
Theile
44cee15ac2 Dialog cmd file: /var/tmp/dialog.log 2022-09-21 09:05:05 +02:00
Theile
53cbc342c3 Minor renaming of a few file names 2022-09-21 09:04:06 +02:00
Theile
5b39697bf8 No printlog function so echo it is 2022-09-21 08:43:31 +02:00
Theile
e6088a2eda Install swiftDialog in preparation script 2022-09-20 16:34:12 +02:00
Theile
938a40943e Cleaning and adding prevention scripts 2022-09-20 09:50:54 +02:00
Theile
c0a850848b Version number matching 2022-09-20 08:36:55 +02:00
Theile
909a61fbe3 Improved icon checks and failovers 2022-09-19 21:40:03 +02:00
Theile
9c5ab45851 Version 9.4 of my MDM scripts 2022-09-19 11:38:43 +02:00
macmangr
6c829ed0d6 Added architecture check and ARM version of Horos
The developer has now also released an Apple Silicon version of the software, so a review of the processor and the appropriate download links have been added

The expectedTeamID is now a variable because the Apple Silicon version of the app has a different TeamID
2022-09-17 16:53:15 +02:00
macmangr
96380b2f27 Label name changed to "archiwarepst"
The name of the label has been changed from "awpst" to "archiwarepst"
2022-09-17 14:59:49 +02:00
macmangr
b061f37924 Label name changed to "archiwareb2go"
The name of the label has been changed from "awb2go" to "archiwareb2go"
2022-09-17 14:57:15 +02:00
macmangr
5a54cd92b6 Label name changed to "parallelsrasclient"
The name of the label has been changed from "rasclient" to "parallelsrasclient"
2022-09-17 14:52:08 +02:00
Fletcher Salesky
57ed4e77f4 Move archiveName before downloadURL 2022-09-14 16:34:03 -07:00
Fletcher Salesky
a01bfd7dae Update obs.sh 2022-09-14 16:25:56 -07:00
Theile
e5d309a9d9 Minor correction to the if statement 2022-09-14 16:19:57 +02:00
Theile
1412f86e69 If GItHub does not give an URL we can fall back on API call
Today something strange happened for Installomator on GitHub. Or latest release would spend too much time loading the assets, and would not return an URL, like here:

```
% gitusername="Installomator"; gitreponame="Installomator"; curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.pkg" | head -1
% gitusername="bartreardon"; gitreponame="swiftDialog"; curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.pkg" | head -1
/bartreardon/swiftDialog/releases/download/v1.11.2/dialog-1.11.2-3095.pkg
```

As can be seen above it worked for swiftDialog, but not for Installomator.

Now we can fall back on the API call if we do not get the URL in first try.
2022-09-14 15:45:00 +02:00
Theile
13d574bd0d Create gfxcardstatus.sh
Text run:
```
% utils/assemble.sh gfxcardstatus DEBUG=2
2022-09-14 10:26:07 : INFO  : gfxcardstatus : setting variable from argument DEBUG=2
2022-09-14 10:26:07 : REQ   : gfxcardstatus : ################## Start Installomator v. 10.0beta3, date 2022-09-14
2022-09-14 10:26:07 : INFO  : gfxcardstatus : ################## Version: 10.0beta3
2022-09-14 10:26:07 : INFO  : gfxcardstatus : ################## Date: 2022-09-14
2022-09-14 10:26:07 : INFO  : gfxcardstatus : ################## gfxcardstatus
2022-09-14 10:26:07 : DEBUG : gfxcardstatus : DEBUG mode 2 enabled.
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : name=gfxCardStatus
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : appName=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : type=zip
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : archiveName=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : downloadURL=https://github.com/codykrieger/gfxCardStatus/releases/download/v2.5/gfxCardStatus-2.5.zip
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : curlOptions=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : appNewVersion=2.5
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : appCustomVersion function: Not defined
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : versionKey=CFBundleShortVersionString
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : packageID=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : pkgName=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : choiceChangesXML=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : expectedTeamID=LF22FTQC25
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : blockingProcesses=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : installerTool=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : CLIInstaller=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : CLIArguments=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : updateTool=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : updateToolArguments=
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : updateToolRunAsCurrentUser=
2022-09-14 10:26:08 : INFO  : gfxcardstatus : BLOCKING_PROCESS_ACTION=tell_user
2022-09-14 10:26:08 : INFO  : gfxcardstatus : NOTIFY=success
2022-09-14 10:26:08 : INFO  : gfxcardstatus : LOGGING=DEBUG
2022-09-14 10:26:08 : INFO  : gfxcardstatus : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-09-14 10:26:08 : INFO  : gfxcardstatus : Label type: zip
2022-09-14 10:26:08 : INFO  : gfxcardstatus : archiveName: gfxCardStatus.zip
2022-09-14 10:26:08 : INFO  : gfxcardstatus : no blocking processes defined, using gfxCardStatus as default
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : Changing directory to /var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6
2022-09-14 10:26:08 : INFO  : gfxcardstatus : name: gfxCardStatus, appName: gfxCardStatus.app
2022-09-14 10:26:08 : INFO  : gfxcardstatus : App(s) found: /Users/st/Downloads/2022-09-14-10-21-02/gfxCardStatus.app
2022-09-14 10:26:08 : WARN  : gfxcardstatus : could not determine location of gfxCardStatus.app
2022-09-14 10:26:08 : INFO  : gfxcardstatus : appversion:
2022-09-14 10:26:08 : INFO  : gfxcardstatus : Latest version of gfxCardStatus is 2.5
2022-09-14 10:26:08 : REQ   : gfxcardstatus : Downloading https://github.com/codykrieger/gfxCardStatus/releases/download/v2.5/gfxCardStatus-2.5.zip to gfxCardStatus.zip
2022-09-14 10:26:08 : DEBUG : gfxcardstatus : No Dialog connection, just download
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : File list: -rw-r--r--  1 st  staff   2,2M 14 Sep 10:26 gfxCardStatus.zip
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : File type: gfxCardStatus.zip: Zip archive data, at least v1.0 to extract, compression method=store
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : curl output was:
*   Trying 140.82.121.3:443...
* Connected to github.com (140.82.121.3) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
…
* Connection #1 to host objects.githubusercontent.com left intact

2022-09-14 10:26:10 : REQ   : gfxcardstatus : no more blocking processes, continue with update
2022-09-14 10:26:10 : REQ   : gfxcardstatus : Installing gfxCardStatus
2022-09-14 10:26:10 : INFO  : gfxcardstatus : Unzipping gfxCardStatus.zip
2022-09-14 10:26:10 : INFO  : gfxcardstatus : Verifying: /var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6/gfxCardStatus.app
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : App size: 5,5M	/var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6/gfxCardStatus.app
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : Debugging enabled, App Verification output was:
/var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6/gfxCardStatus.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Cody Krieger (LF22FTQC25)

2022-09-14 10:26:10 : INFO  : gfxcardstatus : Team ID matching: LF22FTQC25 (expected: LF22FTQC25 )
2022-09-14 10:26:10 : INFO  : gfxcardstatus : Installing gfxCardStatus version 2.5 on versionKey CFBundleShortVersionString.
2022-09-14 10:26:10 : INFO  : gfxcardstatus : App has LSMinimumSystemVersion: 10.9
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : DEBUG mode 2 enabled, not installing anything, exiting
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : Deleting /var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : Debugging enabled, Deleting tmpDir output was:
/var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6/gfxCardStatus.app/Contents/CodeResources
…
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : /var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6/gfxCardStatus.app
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : /var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6/gfxCardStatus.zip
2022-09-14 10:26:10 : DEBUG : gfxcardstatus : /var/folders/gy/vrjt7sl52t9ghzn1lnttjtg40000gp/T/tmp.cR1129g6
2022-09-14 10:26:11 : INFO  : gfxcardstatus : App not closed, so no reopen.
2022-09-14 10:26:11 : INFO  : gfxcardstatus :
2022-09-14 10:26:11 : REQ   : gfxcardstatus : ################## End Installomator, exit code 0
```
2022-09-14 10:31:06 +02:00
Fredrik Larsson
4e003b2292 New Label: Cytoscape
2022-09-13 11:18:47 : REQ   : cytoscape : ################## Start Installomator v. 10.0beta3, date 2022-09-13
2022-09-13 11:18:47 : INFO  : cytoscape : ################## Version: 10.0beta3
2022-09-13 11:18:47 : INFO  : cytoscape : ################## Date: 2022-09-13
2022-09-13 11:18:47 : INFO  : cytoscape : ################## cytoscape
2022-09-13 11:18:47 : INFO  : cytoscape : SwiftDialog is not installed, clear cmd file var
2022-09-13 11:18:49 : INFO  : cytoscape : BLOCKING_PROCESS_ACTION=tell_user
2022-09-13 11:18:49 : INFO  : cytoscape : NOTIFY=success
2022-09-13 11:18:50 : INFO  : cytoscape : LOGGING=INFO
2022-09-13 11:18:50 : INFO  : cytoscape : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-09-13 11:18:50 : INFO  : cytoscape : Label type: dmg
2022-09-13 11:18:50 : INFO  : cytoscape : archiveName: Cytoscape.dmg
2022-09-13 11:18:50 : INFO  : cytoscape : no blocking processes defined, using Cytoscape as default
2022-09-13 11:18:50 : INFO  : cytoscape : name: Cytoscape, appName: Cytoscape.app
2022-09-13 11:18:50 : WARN  : cytoscape : No previous app found
2022-09-13 11:18:50 : WARN  : cytoscape : could not find Cytoscape.app
2022-09-13 11:18:50 : INFO  : cytoscape : appversion:
2022-09-13 11:18:50 : INFO  : cytoscape : Latest version of Cytoscape is 3.9.1
2022-09-13 11:18:50 : REQ   : cytoscape : Downloading https://github.com/cytoscape/cytoscape/releases/download/3.9.1/Cytoscape_3_9_1_macos.dmg to Cytoscape.dmg
2022-09-13 11:19:12 : REQ   : cytoscape : no more blocking processes, continue with update
2022-09-13 11:19:12 : REQ   : cytoscape : Installing Cytoscape
2022-09-13 11:19:12 : REQ   : cytoscape : installerTool used: Cytoscape Installer.app
2022-09-13 11:19:12 : INFO  : cytoscape : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.zwfhpav8/Cytoscape.dmg
2022-09-13 11:19:13 : INFO  : cytoscape : Mounted: /Volumes/Cytoscape 1
2022-09-13 11:19:13 : INFO  : cytoscape : Verifying: /Volumes/Cytoscape 1/Cytoscape Installer.app
2022-09-13 11:19:14 : INFO  : cytoscape : Team ID matching: 35LDCJ33QT (expected: 35LDCJ33QT )
2022-09-13 11:19:14 : INFO  : cytoscape : Installing Cytoscape version 3.9.1 on versionKey CFBundleShortVersionString.
2022-09-13 11:19:14 : INFO  : cytoscape : App has LSMinimumSystemVersion: 10.7.3
2022-09-13 11:19:14 : INFO  : cytoscape : CLIInstaller exists, running installer command /Volumes/Cytoscape 1/Cytoscape Installer.app/Contents/MacOS/JavaApplicationStub -q
2022-09-13 11:19:49 : INFO  : cytoscape : Succesfully ran /Volumes/Cytoscape 1/Cytoscape Installer.app/Contents/MacOS/JavaApplicationStub -q
2022-09-13 11:19:49 : INFO  : cytoscape : Finishing...
2022-09-13 11:19:52 : INFO  : cytoscape : name: Cytoscape, appName: Cytoscape Installer.app
2022-09-13 11:19:52 : INFO  : cytoscape : App(s) found: /Applications/Cytoscape_v3.9.1/Cytoscape Uninstaller.app/Applications/Cytoscape_v3.9.1/Cytoscape.app
2022-09-13 11:19:52 : WARN  : cytoscape : could not determine location of Cytoscape Installer.app
2022-09-13 11:19:52 : REQ   : cytoscape : Installed Cytoscape
2022-09-13 11:19:52 : INFO  : cytoscape : notifying
2022-09-13 11:19:53 : INFO  : cytoscape : App not closed, so no reopen.
2022-09-13 11:19:53 : REQ   : cytoscape : All done!
2022-09-13 11:19:53 : REQ   : cytoscape : ################## End Installomator, exit code 0
2022-09-13 11:29:16 +02:00
Søren Theilgaard
cd2637d30f Verify for “Adobe Installer” before running
Also added another option for getting current version that we could consider using. Removed some old stuff already commented out.
2022-09-13 09:05:04 +02:00
Adam Codega
22170a89ae Swap Adobe URL parsing filter
The filters for ARM and Intel were swapped by accident, this correctly returns the ARM URL for ARM and Intel URL for Intel.
2022-09-12 12:37:11 -04:00
Fredrik Larsson
527490e72f New Label: LaTeXiT
2022-09-12 14:49:00 : INFO  : latexit : setting variable from argument NOTIFY=silent
2022-09-12 14:49:00 : INFO  : latexit : setting variable from argument DEBUG=0
2022-09-12 14:49:00 : REQ   : latexit : ################## Start Installomator v. 10.0beta3, date 2022-09-12
2022-09-12 14:49:00 : INFO  : latexit : ################## Version: 10.0beta3
2022-09-12 14:49:00 : INFO  : latexit : ################## Date: 2022-09-12
2022-09-12 14:49:00 : INFO  : latexit : ################## latexit
2022-09-12 14:49:00 : INFO  : latexit : SwiftDialog is not installed, clear cmd file var
2022-09-12 14:49:01 : INFO  : latexit : BLOCKING_PROCESS_ACTION=tell_user
2022-09-12 14:49:01 : INFO  : latexit : NOTIFY=silent
2022-09-12 14:49:01 : INFO  : latexit : LOGGING=INFO
2022-09-12 14:49:01 : INFO  : latexit : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-09-12 14:49:01 : INFO  : latexit : Label type: dmg
2022-09-12 14:49:01 : INFO  : latexit : archiveName: LaTeXiT.dmg
2022-09-12 14:49:01 : INFO  : latexit : no blocking processes defined, using LaTeXiT as default
2022-09-12 14:49:01 : INFO  : latexit : name: LaTeXiT, appName: LaTeXiT.app
2022-09-12 14:49:01 : WARN  : latexit : No previous app found
2022-09-12 14:49:01 : WARN  : latexit : could not find LaTeXiT.app
2022-09-12 14:49:01 : INFO  : latexit : appversion:
2022-09-12 14:49:01 : INFO  : latexit : Latest version of LaTeXiT is 2.16.4
2022-09-12 14:49:01 : REQ   : latexit : Downloading https://pierre.chachatelier.fr/latexit/downloads/LaTeXiT-2_16_4.dmg to LaTeXiT.dmg
2022-09-12 14:49:03 : REQ   : latexit : no more blocking processes, continue with update
2022-09-12 14:49:04 : REQ   : latexit : Installing LaTeXiT
2022-09-12 14:49:04 : INFO  : latexit : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.p6c9hBly/LaTeXiT.dmg
2022-09-12 14:49:07 : INFO  : latexit : Mounted: /Volumes/LaTeXiT 2.16.4 1
2022-09-12 14:49:07 : INFO  : latexit : Verifying: /Volumes/LaTeXiT 2.16.4 1/LaTeXiT.app
2022-09-12 14:49:08 : INFO  : latexit : Team ID matching: 7SFX84GNR7 (expected: 7SFX84GNR7 )
2022-09-12 14:49:08 : INFO  : latexit : Installing LaTeXiT version 2.16.4 on versionKey CFBundleShortVersionString.
2022-09-12 14:49:08 : INFO  : latexit : App has LSMinimumSystemVersion: 10.9
2022-09-12 14:49:08 : INFO  : latexit : Copy /Volumes/LaTeXiT 2.16.4 1/LaTeXiT.app to /Applications
2022-09-12 14:49:12 : WARN  : latexit : Changing owner to kryptonit
2022-09-12 14:49:13 : INFO  : latexit : Finishing...
2022-09-12 14:49:16 : INFO  : latexit : App(s) found: /Applications/LaTeXiT.app
2022-09-12 14:49:16 : INFO  : latexit : found app at /Applications/LaTeXiT.app, version 2.16.4, on versionKey CFBundleShortVersionString
2022-09-12 14:49:16 : REQ   : latexit : Installed LaTeXiT, version 2.16.4
2022-09-12 14:49:16 : INFO  : latexit : App not closed, so no reopen.
2022-09-12 14:49:16 : REQ   : latexit : All done!
2022-09-12 14:49:16 : REQ   : latexit : ################## End Installomator, exit code 0
2022-09-12 14:51:56 +02:00
Søren Theilgaard
776c955cdd Comments to label 2022-09-05 10:17:09 +02:00
Søren Theilgaard
7239ec454a Change appNewVersion
GitHub tag contain “_” and not “.” so our function fails to get the right version, so isolating it out from the `downloadURL`.
2022-09-05 10:04:33 +02:00
Armin Briegel
0c4d7b0c56 Update version.sh 2022-09-02 15:22:35 +02:00
Søren Theilgaard
95bd32769c Update acroniscyberprotectconnectagent.sh
`blockingProcesses=( NONE )`
2022-09-02 14:57:04 +02:00
Fletcher Salesky
d18fd7f221 Create polylens.sh 2022-08-27 02:57:27 -07:00
meschwartz
cabe867b30 Created new label for Charles Proxy
Output:
```
# ./Installomator/utils/assemble.sh charles DEBUG=0
2022-08-25 13:31:09 : INFO  : charles : setting variable from argument DEBUG=0
2022-08-25 13:31:09 : REQ   : charles : ################## Start Installomator v. 10.0beta1, date 2022-08-25
2022-08-25 13:31:09 : INFO  : charles : ################## Version: 10.0beta1
2022-08-25 13:31:10 : INFO  : charles : ################## Date: 2022-08-25
2022-08-25 13:31:10 : INFO  : charles : ################## charles
2022-08-25 13:31:10 : INFO  : charles : SwiftDialog is not installed, clear cmd file var
2022-08-25 13:31:10 : INFO  : charles : BLOCKING_PROCESS_ACTION=tell_user
2022-08-25 13:31:10 : INFO  : charles : NOTIFY=success
2022-08-25 13:31:10 : INFO  : charles : LOGGING=INFO
2022-08-25 13:31:10 : INFO  : charles : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-08-25 13:31:10 : INFO  : charles : Label type: dmg
2022-08-25 13:31:10 : INFO  : charles : archiveName: Charles.dmg
2022-08-25 13:31:10 : INFO  : charles : no blocking processes defined, using Charles as default
2022-08-25 13:31:10 : INFO  : charles : name: Charles, appName: Charles.app
2022-08-25 13:31:10 : WARN  : charles : No previous app found
2022-08-25 13:31:10 : WARN  : charles : could not find Charles.app
2022-08-25 13:31:10 : INFO  : charles : appversion:
2022-08-25 13:31:10 : INFO  : charles : Latest version of Charles is 4.6.2
2022-08-25 13:31:10 : REQ   : charles : Downloading https://www.charlesproxy.com/assets/release/4.6.2/charles-proxy-4.6.2.dmg to Charles.dmg
2022-08-25 13:31:32 : REQ   : charles : no more blocking processes, continue with update
2022-08-25 13:31:32 : REQ   : charles : Installing Charles
2022-08-25 13:31:32 : INFO  : charles : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.MO2B5ihQ/Charles.dmg
2022-08-25 13:31:37 : INFO  : charles : Mounted: /Volumes/Charles Proxy v4.6.2
2022-08-25 13:31:37 : INFO  : charles : Verifying: /Volumes/Charles Proxy v4.6.2/Charles.app
updateDialog:26: no such file or directory:
2022-08-25 13:31:45 : INFO  : charles : Team ID matching: 9A5PCU4FSD (expected: 9A5PCU4FSD )
2022-08-25 13:31:45 : INFO  : charles : Installing Charles version 4.6.2 on versionKey CFBundleShortVersionString.
2022-08-25 13:31:45 : INFO  : charles : App has LSMinimumSystemVersion: 10.7
2022-08-25 13:31:45 : INFO  : charles : Copy /Volumes/Charles Proxy v4.6.2/Charles.app to /Applications
2022-08-25 13:31:46 : WARN  : charles : Changing owner to schwartzm
updateDialog:26: no such file or directory:
2022-08-25 13:31:46 : INFO  : charles : Finishing...
2022-08-25 13:31:49 : INFO  : charles : App(s) found: /Applications/Charles.app
2022-08-25 13:31:49 : INFO  : charles : found app at /Applications/Charles.app, version 4.6.2, on versionKey CFBundleShortVersionString
2022-08-25 13:31:49 : REQ   : charles : Installed Charles, version 4.6.2
2022-08-25 13:31:49 : INFO  : charles : notifying
2022-08-25 13:31:49 : INFO  : charles : App not closed, so no reopen.
2022-08-25 13:31:49 : REQ   : charles : All done!
2022-08-25 13:31:49 : REQ   : charles : ################## End Installomator, exit code 0
```
2022-08-25 13:32:28 -04:00
Sylvain Roche
6db51a0ab1 label screamingfrogspider.sh fix, dmg per arch
ScreamingFrogSpider now has different dmg per CPU arch.
Download page provides 2 dmg links, therefore we must fix downloadURL grep
2022-08-23 12:20:47 +02:00
speedybutters
f8b82a3c5f Create origin.sh
New label for Origin app.

Couldn't find a way to specify appNewVersion, sorry.

Output:

sudo /Users/user/Documents/GitHub/Installomator/utils/assemble.sh origin DEBUG=0
Password:
2022-08-22 16:29:17 : INFO  : origin : setting variable from argument DEBUG=0
2022-08-22 16:29:17 : REQ   : origin : ################## Start Installomator v. 10.0beta1, date 2022-08-22
2022-08-22 16:29:17 : INFO  : origin : ################## Version: 10.0beta1
2022-08-22 16:29:17 : INFO  : origin : ################## Date: 2022-08-22
2022-08-22 16:29:17 : INFO  : origin : ################## origin
2022-08-22 16:29:17 : INFO  : origin : BLOCKING_PROCESS_ACTION=tell_user
2022-08-22 16:29:17 : INFO  : origin : NOTIFY=success
2022-08-22 16:29:17 : INFO  : origin : LOGGING=INFO
2022-08-22 16:29:18 : INFO  : origin : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-08-22 16:29:18 : INFO  : origin : Label type: dmg
2022-08-22 16:29:18 : INFO  : origin : archiveName: Origin.dmg
2022-08-22 16:29:18 : INFO  : origin : App(s) found: /Applications/Origin.app
2022-08-22 16:29:18 : INFO  : origin : found app at /Applications/Origin.app, version 10.5.113.50894, on versionKey CFBundleShortVersionString
2022-08-22 16:29:18 : INFO  : origin : appversion: 10.5.113.50894
2022-08-22 16:29:18 : INFO  : origin : Latest version not specified.
2022-08-22 16:29:18 : REQ   : origin : Downloading https://www.dm.origin.com/mac/download/Origin.dmg to Origin.dmg
2022-08-22 16:29:23 : REQ   : origin : no more blocking processes, continue with update
2022-08-22 16:29:23 : REQ   : origin : Installing Origin
2022-08-22 16:29:23 : INFO  : origin : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.ZcXEV9XX/Origin.dmg
2022-08-22 16:29:27 : INFO  : origin : Mounted: /Volumes/Origin
2022-08-22 16:29:27 : INFO  : origin : Verifying: /Volumes/Origin/Origin.app
updateDialog:26: no such file or directory:
2022-08-22 16:29:29 : INFO  : origin : Team ID matching: TSTV75T6Q5 (expected: TSTV75T6Q5 )
2022-08-22 16:29:29 : INFO  : origin : Downloaded version of Origin is 10.5.115.51547 on versionKey CFBundleShortVersionString (replacing version 10.5.113.50894).
2022-08-22 16:29:29 : INFO  : origin : App has LSMinimumSystemVersion: 10.6
2022-08-22 16:29:29 : WARN  : origin : Removing existing /Applications/Origin.app
2022-08-22 16:29:29 : INFO  : origin : Copy /Volumes/Origin/Origin.app to /Applications
2022-08-22 16:29:31 : WARN  : origin : Changing owner to adam
updateDialog:26: no such file or directory:
2022-08-22 16:29:31 : INFO  : origin : Finishing...
2022-08-22 16:29:34 : INFO  : origin : App(s) found: /Applications/Origin.app
2022-08-22 16:29:34 : INFO  : origin : found app at /Applications/Origin.app, version 10.5.115.51547, on versionKey CFBundleShortVersionString
2022-08-22 16:29:34 : REQ   : origin : Installed Origin, version 10.5.115.51547
2022-08-22 16:29:34 : INFO  : origin : notifying
2022-08-22 16:29:34 : INFO  : origin : App not closed, so no reopen.
2022-08-22 16:29:34 : REQ   : origin : All done!
2022-08-22 16:29:34 : REQ   : origin : ################## End Installomator, exit code 0
2022-08-22 16:30:11 +01:00
speedybutters
958cf59a64 Create bitrix24.sh
New label for Bitrix24 app.

Couldn't find a way to specify appNewVersion, sorry.

Output:

sudo /Users/user/Documents/GitHub/Installomator/utils/assemble.sh bitrix24 DEBUG=0
Password:
2022-08-22 16:23:13 : INFO  : bitrix24 : setting variable from argument DEBUG=0
2022-08-22 16:23:13 : REQ   : bitrix24 : ################## Start Installomator v. 10.0beta1, date 2022-08-22
2022-08-22 16:23:13 : INFO  : bitrix24 : ################## Version: 10.0beta1
2022-08-22 16:23:13 : INFO  : bitrix24 : ################## Date: 2022-08-22
2022-08-22 16:23:13 : INFO  : bitrix24 : ################## bitrix24
2022-08-22 16:23:13 : INFO  : bitrix24 : BLOCKING_PROCESS_ACTION=tell_user
2022-08-22 16:23:13 : INFO  : bitrix24 : NOTIFY=success
2022-08-22 16:23:13 : INFO  : bitrix24 : LOGGING=INFO
2022-08-22 16:23:13 : INFO  : bitrix24 : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-08-22 16:23:13 : INFO  : bitrix24 : Label type: dmg
2022-08-22 16:23:13 : INFO  : bitrix24 : archiveName: bitrix24_desktop.dmg
2022-08-22 16:23:13 : INFO  : bitrix24 : name: Bitrix24, appName: Bitrix24.app
2022-08-22 16:23:13 : WARN  : bitrix24 : No previous app found
2022-08-22 16:23:13 : WARN  : bitrix24 : could not find Bitrix24.app
2022-08-22 16:23:13 : INFO  : bitrix24 : appversion:
2022-08-22 16:23:13 : INFO  : bitrix24 : Latest version not specified.
2022-08-22 16:23:13 : REQ   : bitrix24 : Downloading https://dl.bitrix24.com/b24/bitrix24_desktop.dmg to bitrix24_desktop.dmg
2022-08-22 16:23:18 : REQ   : bitrix24 : no more blocking processes, continue with update
2022-08-22 16:23:18 : REQ   : bitrix24 : Installing Bitrix24
2022-08-22 16:23:18 : INFO  : bitrix24 : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.DrdpdQ4H/bitrix24_desktop.dmg
2022-08-22 16:23:27 : INFO  : bitrix24 : Mounted: /Volumes/Bitrix24 for macOS
2022-08-22 16:23:27 : INFO  : bitrix24 : Verifying: /Volumes/Bitrix24 for macOS/Bitrix24.app
updateDialog:26: no such file or directory:
2022-08-22 16:23:41 : INFO  : bitrix24 : Team ID matching: 5B3T3A994N (expected: 5B3T3A994N )
2022-08-22 16:23:41 : INFO  : bitrix24 : Installing Bitrix24 version 14.0.16 on versionKey CFBundleShortVersionString.
2022-08-22 16:23:41 : INFO  : bitrix24 : App has LSMinimumSystemVersion: 10.11
2022-08-22 16:23:41 : INFO  : bitrix24 : Copy /Volumes/Bitrix24 for macOS/Bitrix24.app to /Applications
2022-08-22 16:23:54 : WARN  : bitrix24 : Changing owner to adam
updateDialog:26: no such file or directory:
2022-08-22 16:23:54 : INFO  : bitrix24 : Finishing...
2022-08-22 16:23:57 : INFO  : bitrix24 : App(s) found: /Applications/Bitrix24.app
2022-08-22 16:23:57 : INFO  : bitrix24 : found app at /Applications/Bitrix24.app, version 14.0.16, on versionKey CFBundleShortVersionString
2022-08-22 16:23:57 : REQ   : bitrix24 : Installed Bitrix24, version 14.0.16
2022-08-22 16:23:57 : INFO  : bitrix24 : notifying
2022-08-22 16:23:58 : INFO  : bitrix24 : App not closed, so no reopen.
2022-08-22 16:23:58 : REQ   : bitrix24 : All done!
2022-08-22 16:23:58 : REQ   : bitrix24 : ################## End Installomator, exit code 0
2022-08-22 16:25:12 +01:00
Liam Steckler
faffd059db Add newline at end of file 2022-08-19 09:10:52 -07:00
Liam Steckler
d864c8e410 Add splashtopbusiness label 2022-08-19 09:07:52 -07:00
Søren Theilgaard
a8ba97b87e One $ too many 2022-08-19 15:08:42 +02:00
Søren Theilgaard
dcfd7d8328 More Dialog messages 2022-08-19 11:19:12 +02:00
Søren Theilgaard
7bf47ff9e5 Dialog update when app is already at the latest version
Not sure I use the correct values in the `updateDialog` call, but it works fine.
2022-08-19 11:10:04 +02:00
Fletcher Salesky
3d3114515a Create zoomoutlookplugin.sh 2022-08-17 15:28:26 -07:00
Fletcher Salesky
f124e2321b Create egnytecore.sh 2022-08-17 11:23:48 -07:00
Fredrik Larsson
0460aa2724 Created Zotero label
Output:
```
2022-07-29 08:44:17 : WARN  : zotero : setting variable from argument DEBUG=0
2022-07-29 08:44:17 : REQ   : zotero : ################## Start Installomator v. 10.0beta, date 2022-07-29
2022-07-29 08:44:17 : INFO  : zotero : ################## Version: 10.0beta
2022-07-29 08:44:17 : INFO  : zotero : ################## Date: 2022-07-29
2022-07-29 08:44:17 : INFO  : zotero : ################## zotero
2022-07-29 08:44:18 : INFO  : zotero : BLOCKING_PROCESS_ACTION=tell_user
2022-07-29 08:44:19 : INFO  : zotero : NOTIFY=success
2022-07-29 08:44:19 : INFO  : zotero : LOGGING=INFO
2022-07-29 08:44:19 : INFO  : zotero : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-29 08:44:19 : INFO  : zotero : Label type: dmg
2022-07-29 08:44:19 : INFO  : zotero : archiveName: Zotero.dmg
2022-07-29 08:44:19 : INFO  : zotero : no blocking processes defined, using Zotero as default
2022-07-29 08:44:19 : INFO  : zotero : name: Zotero, appName: Zotero.app
2022-07-29 08:44:19 : WARN  : zotero : No previous app found
2022-07-29 08:44:19 : WARN  : zotero : could not find Zotero.app
2022-07-29 08:44:19 : INFO  : zotero : appversion:
2022-07-29 08:44:19 : INFO  : zotero : Latest version of Zotero is 6.0.11
2022-07-29 08:44:19 : REQ   : zotero : Downloading https://www.zotero.org/download/client/dl?channel=release&platform=mac&version=6.0.11 to Zotero.dmg
2022-07-29 08:44:22 : REQ   : zotero : no more blocking processes, continue with update
2022-07-29 08:44:22 : REQ   : zotero : Installing Zotero
2022-07-29 08:44:22 : INFO  : zotero : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.2kvEQHFJ/Zotero.dmg
2022-07-29 08:44:26 : INFO  : zotero : Mounted: /Volumes/Zotero
2022-07-29 08:44:26 : INFO  : zotero : Verifying: /Volumes/Zotero/Zotero.app
2022-07-29 08:44:32 : INFO  : zotero : Team ID matching: 8LAYR367YV (expected: 8LAYR367YV )
2022-07-29 08:44:32 : INFO  : zotero : Installing Zotero version 6.0.11 on versionKey CFBundleShortVersionString.
2022-07-29 08:44:32 : INFO  : zotero : App has LSMinimumSystemVersion: 10.9.0
2022-07-29 08:44:32 : INFO  : zotero : Copy /Volumes/Zotero/Zotero.app to /Applications
2022-07-29 08:44:39 : WARN  : zotero : Changing owner to kryptonit
2022-07-29 08:44:39 : INFO  : zotero : Finishing...
2022-07-29 08:44:49 : INFO  : zotero : App(s) found: /Applications/Zotero.app
2022-07-29 08:44:49 : INFO  : zotero : found app at /Applications/Zotero.app, version 6.0.11, on versionKey CFBundleShortVersionString
2022-07-29 08:44:49 : REQ   : zotero : Installed Zotero, version 6.0.11
2022-07-29 08:44:49 : INFO  : zotero : notifying
2022-07-29 08:44:50 : INFO  : zotero : App not closed, so no reopen.
2022-07-29 08:44:50 : REQ   : zotero : All done!
2022-07-29 08:44:50 : REQ   : zotero : ################## End Installomator, exit code 0
```
2022-07-29 08:48:27 +02:00
Fletcher Salesky
2a1b7056c9 Create nudgesuite.sh 2022-07-28 11:19:42 -07:00
macmangr
d0d3510689 New Label: Archiware P5 Backup2Go
"P5 Backup2Go is the ideal tool to backup workstations – regardless of their location.

In the office, on the road or at home, P5 works cross-platform and allows mobile backups of laptops and desktops on central disk storage."

sudo ./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels awb2go NOTIFY=silent DEBUG=0
2022-07-13 18:11:07 : WARN  : awb2go : setting variable from argument NOTIFY=silent
2022-07-13 18:11:07 : WARN  : awb2go : setting variable from argument DEBUG=0
2022-07-13 18:11:07 : REQ   : awb2go : ################## Start Installomator v. 10.0beta, date 2022-07-13
2022-07-13 18:11:07 : INFO  : awb2go : ################## Version: 10.0beta
2022-07-13 18:11:07 : INFO  : awb2go : ################## Date: 2022-07-13
2022-07-13 18:11:07 : INFO  : awb2go : ################## awb2go
2022-07-13 18:11:07 : INFO  : awb2go : BLOCKING_PROCESS_ACTION=tell_user
2022-07-13 18:11:07 : INFO  : awb2go : NOTIFY=silent
2022-07-13 18:11:07 : INFO  : awb2go : LOGGING=INFO
2022-07-13 18:11:07 : INFO  : awb2go : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-13 18:11:07 : INFO  : awb2go : Label type: pkgInDmg
2022-07-13 18:11:07 : INFO  : awb2go : archiveName: P5 Workstation.dmg
2022-07-13 18:11:07 : INFO  : awb2go : no blocking processes defined, using P5 Workstation as default
2022-07-13 18:11:08 : INFO  : awb2go : found packageID com.archiware.presstore installed, version 7.0.6
2022-07-13 18:11:08 : INFO  : awb2go : appversion: 7.0.6
2022-07-13 18:11:08 : INFO  : awb2go : Latest version of P5 Workstation is 7.0.7
2022-07-13 18:11:08 : REQ   : awb2go : Downloading https://p5-downloads.s3.amazonaws.com/awpst707-darwin.dmg to P5 Workstation.dmg
2022-07-13 18:11:27 : REQ   : awb2go : no more blocking processes, continue with update
2022-07-13 18:11:27 : REQ   : awb2go : Installing P5 Workstation
2022-07-13 18:11:27 : INFO  : awb2go : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.Lw7ac9Pw/P5 Workstation.dmg
2022-07-13 18:11:28 : INFO  : awb2go : Mounted: /Volumes/P5-707
2022-07-13 18:11:28 : INFO  : awb2go : found pkg: /Volumes/P5-707/B2Go-Workstation/P5-Workstation-707-Install.pkg
2022-07-13 18:11:28 : INFO  : awb2go : Verifying: /Volumes/P5-707/B2Go-Workstation/P5-Workstation-707-Install.pkg
2022-07-13 18:11:28 : INFO  : awb2go : Team ID: 5H5EU6F965 (expected: 5H5EU6F965 )
2022-07-13 18:11:28 : INFO  : awb2go : Checking package version.
2022-07-13 18:11:28 : INFO  : awb2go : Downloaded package com.archiware.presstore version
2022-07-13 18:11:28 : INFO  : awb2go : Installing /Volumes/P5-707/B2Go-Workstation/P5-Workstation-707-Install.pkg to /
2022-07-13 18:12:01 : INFO  : awb2go : Finishing...
2022-07-13 18:12:11 : INFO  : awb2go : found packageID com.archiware.presstore installed, version 7.0.7
2022-07-13 18:12:11 : REQ   : awb2go : Installed P5 Workstation, version 7.0.7
2022-07-13 18:12:12 : INFO  : awb2go : App not closed, so no reopen.
2022-07-13 18:12:12 : REQ   : awb2go : All done!
2022-07-13 18:12:12 : REQ   : awb2go : ################## End Installomator, exit code 0
2022-07-13 18:14:42 +02:00
macmangr
e4cff5821d New Label: Archiware P5
"Archiware's P5 Software Suite is ideal for businesses in the Media and Entertainment industry.
Four modules in the Archiware P5 Suite secure data using the A-B-C of data management: Archive, Backup and Cloning.
All modules can be combined to create multiple-step security concepts to achieve maximum data protection.
Archiware P5 secures data to disk, tape and cloud and has integrations with numerous partners."

sudo ./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels awpst NOTIFY=silent DEBUG=0
Password:
2022-07-13 17:46:07 : WARN  : awpst : setting variable from argument NOTIFY=silent
2022-07-13 17:46:07 : WARN  : awpst : setting variable from argument DEBUG=0
2022-07-13 17:46:07 : REQ   : awpst : ################## Start Installomator v. 10.0beta, date 2022-07-13
2022-07-13 17:46:07 : INFO  : awpst : ################## Version: 10.0beta
2022-07-13 17:46:07 : INFO  : awpst : ################## Date: 2022-07-13
2022-07-13 17:46:07 : INFO  : awpst : ################## awpst
2022-07-13 17:46:07 : INFO  : awpst : BLOCKING_PROCESS_ACTION=tell_user
2022-07-13 17:46:07 : INFO  : awpst : NOTIFY=silent
2022-07-13 17:46:07 : INFO  : awpst : LOGGING=INFO
2022-07-13 17:46:07 : INFO  : awpst : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-13 17:46:07 : INFO  : awpst : Label type: pkgInDmg
2022-07-13 17:46:07 : INFO  : awpst : archiveName: P5.dmg
2022-07-13 17:46:07 : INFO  : awpst : no blocking processes defined, using P5 as default
2022-07-13 17:46:07 : INFO  : awpst : found packageID com.archiware.presstore installed, version 7.0.6
2022-07-13 17:46:07 : INFO  : awpst : appversion: 7.0.6
2022-07-13 17:46:07 : INFO  : awpst : Latest version of P5 is 7.0.7
2022-07-13 17:46:07 : REQ   : awpst : Downloading https://p5-downloads.s3.amazonaws.com/awpst707-darwin.dmg to P5.dmg
2022-07-13 17:46:27 : REQ   : awpst : no more blocking processes, continue with update
2022-07-13 17:46:27 : REQ   : awpst : Installing P5
2022-07-13 17:46:27 : INFO  : awpst : Mounting /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/tmp.rwTUoQOZ/P5.dmg
2022-07-13 17:46:27 : INFO  : awpst : Mounted: /Volumes/P5-707
2022-07-13 17:46:27 : INFO  : awpst : found pkg: /Volumes/P5-707/P5-707-Install.pkg
2022-07-13 17:46:27 : INFO  : awpst : Verifying: /Volumes/P5-707/P5-707-Install.pkg
2022-07-13 17:46:28 : INFO  : awpst : Team ID: 5H5EU6F965 (expected: 5H5EU6F965 )
2022-07-13 17:46:28 : INFO  : awpst : Checking package version.
2022-07-13 17:46:28 : INFO  : awpst : Downloaded package com.archiware.presstore version
2022-07-13 17:46:28 : INFO  : awpst : Installing /Volumes/P5-707/P5-707-Install.pkg to /
2022-07-13 17:47:06 : INFO  : awpst : Finishing...
2022-07-13 17:47:16 : INFO  : awpst : found packageID com.archiware.presstore installed, version 7.0.7
2022-07-13 17:47:16 : REQ   : awpst : Installed P5, version 7.0.7
2022-07-13 17:47:16 : INFO  : awpst : App not closed, so no reopen.
2022-07-13 17:47:16 : REQ   : awpst : All done!
2022-07-13 17:47:16 : REQ   : awpst : ################## End Installomator, exit code 0
2022-07-13 18:05:44 +02:00
Tadayuki Onishi
9fb414958a santa and nomad are forced to ignore blocking
Those applications are forcibly restarted by the launch agent, resulting in infinite blocking process processing.
2022-07-12 10:54:36 +09:00
David Champion
e90dfd6d82 Add Tailscale label 2022-07-11 12:25:56 -07:00
macmangr
72d2c4ab74 New Label: ChronoAgent
"ChronoAgent is an invisible app that runs silently in the background providing ChronoSync or InterConneX a direct connection to a remote Mac. It provides a much more secure, reliable and higher performance connection than standard file sharing. If you’re synchronizing or backing up files between two Macs, ChronoAgent is simply the best way to establish a connection between them."

./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels chronoagent
2022-07-09 12:55:23 : REQ   : chronoagent : ################## Start Installomator v. 10.0beta, date 2022-07-09
2022-07-09 12:55:23 : INFO  : chronoagent : ################## Version: 10.0beta
2022-07-09 12:55:23 : INFO  : chronoagent : ################## Date: 2022-07-09
2022-07-09 12:55:23 : INFO  : chronoagent : ################## chronoagent
2022-07-09 12:55:23 : DEBUG : chronoagent : DEBUG mode 1 enabled.
2022-07-09 12:55:24 : INFO  : chronoagent : BLOCKING_PROCESS_ACTION=tell_user
2022-07-09 12:55:24 : INFO  : chronoagent : NOTIFY=success
2022-07-09 12:55:24 : INFO  : chronoagent : LOGGING=DEBUG
2022-07-09 12:55:24 : INFO  : chronoagent : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-09 12:55:24 : INFO  : chronoagent : Label type: pkgInDmg
2022-07-09 12:55:24 : INFO  : chronoagent : archiveName: ChronoAgent.dmg
2022-07-09 12:55:24 : INFO  : chronoagent : no blocking processes defined, using ChronoAgent as default
2022-07-09 12:55:24 : DEBUG : chronoagent : Changing directory to /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build
2022-07-09 12:55:24 : INFO  : chronoagent : name: ChronoAgent, appName: ChronoAgent.app
2022-07-09 12:55:24 : WARN  : chronoagent : No previous app found
2022-07-09 12:55:24 : WARN  : chronoagent : could not find ChronoAgent.app
2022-07-09 12:55:24 : INFO  : chronoagent : appversion:
2022-07-09 12:55:24 : INFO  : chronoagent : Latest version of ChronoAgent is 2.1.0
2022-07-09 12:55:24 : INFO  : chronoagent : ChronoAgent.dmg exists and DEBUG mode 1 enabled, skipping download
2022-07-09 12:55:24 : DEBUG : chronoagent : DEBUG mode 1, not checking for blocking processes
2022-07-09 12:55:24 : REQ   : chronoagent : Installing ChronoAgent
2022-07-09 12:55:24 : INFO  : chronoagent : Mounting /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build/ChronoAgent.dmg
2022-07-09 12:55:25 : DEBUG : chronoagent : Debugging enabled, dmgmount output was:
Prüfsumme für whole disk (Apple_HFS : 0) berechnen …
whole disk (Apple_HFS : 0): Die überprüfte CRC32-Prüfsumme ist $46C474C3
Die überprüfte CRC32-Prüfsumme ist $40A3C999
/dev/disk4          	                               	/Volumes/ChronoAgent

2022-07-09 12:55:25 : INFO  : chronoagent : Mounted: /Volumes/ChronoAgent
2022-07-09 12:55:25 : DEBUG : chronoagent : Found pkg(s):
/Volumes/ChronoAgent/Install.pkg
2022-07-09 12:55:25 : DEBUG : chronoagent : /Volumes/ChronoAgent/Remove.pkg
2022-07-09 12:55:25 : INFO  : chronoagent : found pkg: /Volumes/ChronoAgent/Install.pkg
2022-07-09 12:55:25 : INFO  : chronoagent : Verifying: /Volumes/ChronoAgent/Install.pkg
2022-07-09 12:55:25 : DEBUG : chronoagent : File list: -rw-r--r--@ 1 savvas  staff    35M 27 Apr 14:37 /Volumes/ChronoAgent/Install.pkg
2022-07-09 12:55:25 : DEBUG : chronoagent : File type: /Volumes/ChronoAgent/Install.pkg: xar archive compressed TOC: 8440, SHA-1 checksum, contains iAPX 286 executable large model (COFF) not stripped
2022-07-09 12:55:25 : DEBUG : chronoagent : - iAPX 286 executable large model (COFF) not stripped
2022-07-09 12:55:25 : DEBUG : chronoagent : spctlOut is /Volumes/ChronoAgent/Install.pkg: accepted
2022-07-09 12:55:25 : DEBUG : chronoagent : source=Notarized Developer ID
2022-07-09 12:55:25 : DEBUG : chronoagent : origin=Developer ID Installer: Econ Technologies, Inc. (9U697UM7YX)
2022-07-09 12:55:25 : INFO  : chronoagent : Team ID: 9U697UM7YX (expected: 9U697UM7YX )
2022-07-09 12:55:25 : DEBUG : chronoagent : DEBUG enabled, skipping installation
2022-07-09 12:55:25 : INFO  : chronoagent : Finishing...
2022-07-09 12:55:35 : INFO  : chronoagent : name: ChronoAgent, appName: ChronoAgent.app
2022-07-09 12:55:35 : WARN  : chronoagent : No previous app found
2022-07-09 12:55:35 : WARN  : chronoagent : could not find ChronoAgent.app
2022-07-09 12:55:35 : REQ   : chronoagent : Installed ChronoAgent
2022-07-09 12:55:35 : INFO  : chronoagent : notifying
2022-07-09 12:55:35 : DEBUG : chronoagent : Unmounting /Volumes/ChronoAgent
2022-07-09 12:55:36 : DEBUG : chronoagent : Debugging enabled, Unmounting output was:
"disk4" ejected.
2022-07-09 12:55:36 : DEBUG : chronoagent : DEBUG mode 1, not reopening anything
2022-07-09 12:55:36 : REQ   : chronoagent : All done!
2022-07-09 12:55:36 : REQ   : chronoagent : ################## End Installomator, exit code 0
2022-07-09 13:05:46 +02:00
macmangr
14fc1db433 New Label: ChronoSync
"ChronoSync is a complete, all-in-one solution for file syncs, backups, bootable backups and cloud storage for your Mac. In use by thousands of photographers, video editors, filmmakers, musicians and other data professionals. It’s simply the best way to backup and sync your Mac. No other app can compare! Whatever your backup and sync scenario, ChronoSync has got you covered!"

./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels chronosync
2022-07-09 12:56:22 : REQ   : chronosync : ################## Start Installomator v. 10.0beta, date 2022-07-09
2022-07-09 12:56:22 : INFO  : chronosync : ################## Version: 10.0beta
2022-07-09 12:56:22 : INFO  : chronosync : ################## Date: 2022-07-09
2022-07-09 12:56:22 : INFO  : chronosync : ################## chronosync
2022-07-09 12:56:22 : DEBUG : chronosync : DEBUG mode 1 enabled.
2022-07-09 12:56:23 : INFO  : chronosync : BLOCKING_PROCESS_ACTION=tell_user
2022-07-09 12:56:23 : INFO  : chronosync : NOTIFY=success
2022-07-09 12:56:23 : INFO  : chronosync : LOGGING=DEBUG
2022-07-09 12:56:23 : INFO  : chronosync : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-09 12:56:23 : INFO  : chronosync : Label type: pkgInDmg
2022-07-09 12:56:23 : INFO  : chronosync : archiveName: ChronoSync.dmg
2022-07-09 12:56:23 : INFO  : chronosync : no blocking processes defined, using ChronoSync as default
2022-07-09 12:56:23 : DEBUG : chronosync : Changing directory to /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build
2022-07-09 12:56:23 : INFO  : chronosync : name: ChronoSync, appName: ChronoSync.app
2022-07-09 12:56:23 : WARN  : chronosync : No previous app found
2022-07-09 12:56:23 : WARN  : chronosync : could not find ChronoSync.app
2022-07-09 12:56:23 : INFO  : chronosync : appversion:
2022-07-09 12:56:23 : INFO  : chronosync : Latest version of ChronoSync is 10.2.0
2022-07-09 12:56:23 : INFO  : chronosync : ChronoSync.dmg exists and DEBUG mode 1 enabled, skipping download
2022-07-09 12:56:23 : DEBUG : chronosync : DEBUG mode 1, not checking for blocking processes
2022-07-09 12:56:23 : REQ   : chronosync : Installing ChronoSync
2022-07-09 12:56:23 : INFO  : chronosync : Mounting /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build/ChronoSync.dmg
2022-07-09 12:56:24 : DEBUG : chronosync : Debugging enabled, dmgmount output was:
Prüfsumme für whole disk (Apple_HFS : 0) berechnen …
whole disk (Apple_HFS : 0): Die überprüfte CRC32-Prüfsumme ist $09AFB4EC
Die überprüfte CRC32-Prüfsumme ist $A77D4F24
/dev/disk4          	                               	/Volumes/ChronoSync

2022-07-09 12:56:24 : INFO  : chronosync : Mounted: /Volumes/ChronoSync
2022-07-09 12:56:24 : DEBUG : chronosync : Found pkg(s):
/Volumes/ChronoSync/Install.pkg
2022-07-09 12:56:24 : DEBUG : chronosync : /Volumes/ChronoSync/Remove.pkg
2022-07-09 12:56:24 : INFO  : chronosync : found pkg: /Volumes/ChronoSync/Install.pkg
2022-07-09 12:56:24 : INFO  : chronosync : Verifying: /Volumes/ChronoSync/Install.pkg
2022-07-09 12:56:24 : DEBUG : chronosync : File list: -rw-r--r--@ 1 savvas  staff    85M 18 Mai 16:02 /Volumes/ChronoSync/Install.pkg
2022-07-09 12:56:24 : DEBUG : chronosync : File type: /Volumes/ChronoSync/Install.pkg: xar archive compressed TOC: 8245, SHA-1 checksum
2022-07-09 12:56:24 : DEBUG : chronosync : spctlOut is /Volumes/ChronoSync/Install.pkg: accepted
2022-07-09 12:56:24 : DEBUG : chronosync : source=Notarized Developer ID
2022-07-09 12:56:24 : DEBUG : chronosync : origin=Developer ID Installer: Econ Technologies, Inc. (9U697UM7YX)
2022-07-09 12:56:24 : INFO  : chronosync : Team ID: 9U697UM7YX (expected: 9U697UM7YX )
2022-07-09 12:56:24 : DEBUG : chronosync : DEBUG enabled, skipping installation
2022-07-09 12:56:24 : INFO  : chronosync : Finishing...
2022-07-09 12:56:34 : INFO  : chronosync : name: ChronoSync, appName: ChronoSync.app
2022-07-09 12:56:34 : WARN  : chronosync : No previous app found
2022-07-09 12:56:34 : WARN  : chronosync : could not find ChronoSync.app
2022-07-09 12:56:34 : REQ   : chronosync : Installed ChronoSync
2022-07-09 12:56:34 : INFO  : chronosync : notifying
2022-07-09 12:56:34 : DEBUG : chronosync : Unmounting /Volumes/ChronoSync
2022-07-09 12:56:35 : DEBUG : chronosync : Debugging enabled, Unmounting output was:
"disk4" ejected.
2022-07-09 12:56:35 : DEBUG : chronosync : DEBUG mode 1, not reopening anything
2022-07-09 12:56:35 : REQ   : chronosync : All done!
2022-07-09 12:56:35 : REQ   : chronosync : ################## End Installomator, exit code 0
2022-07-09 13:02:07 +02:00
macmangr
6d7a64667f New Label: Horos
"Horos™ is a free, open source medical image viewer. The goal of the Horos Project is to develop a fully functional, 64-bit medical image viewer for OS X. Horos is based upon OsiriX and other open source medical imaging libraries. Horos is made freely available under the GNU Lesser General Public License, Version 3 (LGPL-3.0)"

./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels horos
2022-07-04 23:48:31 : REQ   : horos : ################## Start Installomator v. 10.0beta, date 2022-07-04
2022-07-04 23:48:31 : INFO  : horos : ################## Version: 10.0beta
2022-07-04 23:48:31 : INFO  : horos : ################## Date: 2022-07-04
2022-07-04 23:48:31 : INFO  : horos : ################## horos
2022-07-04 23:48:31 : DEBUG : horos : DEBUG mode 1 enabled.
2022-07-04 23:48:31 : INFO  : horos : BLOCKING_PROCESS_ACTION=tell_user
2022-07-04 23:48:31 : INFO  : horos : NOTIFY=success
2022-07-04 23:48:31 : INFO  : horos : LOGGING=DEBUG
2022-07-04 23:48:31 : INFO  : horos : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-04 23:48:31 : INFO  : horos : Label type: dmg
2022-07-04 23:48:31 : INFO  : horos : archiveName: Horos.dmg
2022-07-04 23:48:31 : INFO  : horos : no blocking processes defined, using Horos as default
2022-07-04 23:48:31 : DEBUG : horos : Changing directory to /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build
2022-07-04 23:48:31 : INFO  : horos : App(s) found: /Applications/Horos.app
2022-07-04 23:48:32 : INFO  : horos : found app at /Applications/Horos.app, version Horos v4.0.0 RC5, on versionKey CFBundleGetInfoString
2022-07-04 23:48:32 : INFO  : horos : appversion: Horos v4.0.0 RC5
2022-07-04 23:48:32 : INFO  : horos : Latest version of Horos is 4.0.0RC5
2022-07-04 23:48:32 : INFO  : horos : Horos.dmg exists and DEBUG mode 1 enabled, skipping download
2022-07-04 23:48:32 : DEBUG : horos : DEBUG mode 1, not checking for blocking processes
2022-07-04 23:48:32 : REQ   : horos : Installing Horos
2022-07-04 23:48:32 : INFO  : horos : Mounting /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build/Horos.dmg
2022-07-04 23:48:33 : DEBUG : horos : Debugging enabled, dmgmount output was:
SOFTWARE LICENSE: By initiating this download and installation you
acknowledge and agree that this software application is not intended
for medical usage or diagnostic purposes.

============================================

Horos is free software: you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation,  version 3 of the License.

The Horos Project was based originally upon the OsiriX Project which
at the time of the code fork was licensed as a LGPL project.  However,
not all of the the source-code was properly documented and file
headers were not all updated with the appropriate license terms.
The Horos Project, originally was licensed under the  GNU GPL
license. However, contributors to the software since that time have
agreed to modify the license to the GNU LGPL in order to be conform
to the changes previously made to the OsiriX Project.

Horos is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE OR USE.  

See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with Horos.  If not, see
http://www.gnu.org/licenses/lgpl.html

Prior versions of this file were published by the OsiriX team
pursuant to the below notice and licensing protocol.

============================================

Program:   OsiriX Copyright (c) OsiriX Team All rights
reserved. Distributed under GNU - LGPL   See
http://www.osirix-viewer.com/copyright.html for details.

This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.

============================================

This version of Horos is linked against the Grok JPEG 2000 library,
for fast viewing of JPEG 2000 images.

https://github.com/GrokImageCompression/grok

The Grok JPEG 2000 library is licensed under the terms of the GNU
Affero General Public License as follows

Copyright (C) 2016 Grok Image Compression Inc.

This program is free software: you can redistribute it and/or  modify
it under the terms of the GNU Affero General Public License, version
3, as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public
License along with this program.  If not, see
<http://www.gnu.org/licenses/>.

============================================

GNU LESSER GENERAL PUBLIC LICENSE

GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of
this license document, but changing it is not allowed.

This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

0. Additional Definitions.  As used herein, “this License” refers
to version 3 of the GNU Lesser General Public License, and the “GNU
GPL” refers to version 3 of the GNU General Public License.

“The Library” refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.

An “Application” is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a
mode of using an interface provided by the Library.

A “Combined Work” is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the “Linked
Version”.

The “Minimal Corresponding Source” for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source
code for portions of the Combined Work that, considered in isolation,
are based on the Application, and not on the Linked Version.

The “Corresponding Application Code” for a Combined Work means the
object code and/or source code for the Application, including any
data and utility programs needed for reproducing the Combined Work
from the Application, but excluding the System Libraries of the
Combined Work.

1. Exception to Section 3 of the GNU GPL.  You may convey a covered
work under sections 3 and 4 of this License without being bound by
section 3 of the GNU GPL.

2. Conveying Modified Versions.  If you modify a copy of the Library,
and, in your modifications, a facility refers to a function or data
to be supplied by an Application that uses the facility (other than
as an argument passed when the facility is invoked), then you may
convey a copy of the modified version:

a) under this License, provided that you make a good faith effort
to ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs whatever
part of its purpose remains meaningful, or b) under the GNU GPL,
with none of the additional permissions of this License applicable
to that copy.  3. Object Code Incorporating Material from Library
Header Files.  The object code form of an Application may incorporate
material from a header file that is part of the Library. You may
convey such object code under terms of your choice, provided that,
if the incorporated material is not limited to numerical parameters,
data structure layouts and accessors, or small macros, inline
functions and templates (ten or fewer lines in length), you do both
of the following:

a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are covered
by this License.  b) Accompany the object code with a copy of the
GNU GPL and this license document.  4. Combined Works.  You may
convey a Combined Work under terms of your choice that, taken
together, effectively do not restrict modification of the portions
of the Library contained in the Combined Work and reverse engineering
for debugging such modifications, if you also do each of the
following:

a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.  b) Accompany the Combined Work with a
copy of the GNU GPL and this license document.  c) For a Combined
Work that displays copyright notices during execution, include the
copyright notice for the Library among these notices, as well as a
reference directing the user to the copies of the GNU GPL and this
license document.  d) Do one of the following: 0) Convey the Minimal
Corresponding Source under the terms of this License, and the
Corresponding Application Code in a form suitable for, and under
terms that permit, the user to recombine or relink the Application
with a modified version of the Linked Version to produce a modified
Combined Work, in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.  1) Use a suitable shared library
mechanism for linking with the Library. A suitable mechanism is one
that (a) uses at run time a copy of the Library already present on
the user's computer system, and (b) will operate properly with a
modified version of the Library that is interface-compatible with
the Linked Version.  e) Provide Installation Information, but only
if you would otherwise be required to provide such information under
section 6 of the GNU GPL, and only to the extent that such information
is necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the Application
with a modified version of the Linked Version. (If you use option
4d0, the Installation Information must accompany the Minimal
Corresponding Source and Corresponding Application Code. If you use
option 4d1, you must provide the Installation Information in the
manner specified by section 6 of the GNU GPL for conveying Corresponding
Source.) 5. Combined Libraries.  You may place library facilities
that are a work based on the Library side by side in a single library
together with other library facilities that are not Applications
and are not covered by this License, and convey such a combined
library under terms of your choice, if you do both of the following:

a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.  b) Give prominent notice
with the combined library that part of it is a work based on the
Library, and explaining where to find the accompanying uncombined
form of the same work.  6. Revised Versions of the GNU Lesser General
Public License.  The Free Software Foundation may publish revised
and/or new versions of the GNU Lesser General Public License from
time to time. Such new versions will be similar in spirit to the
present version, but may differ in detail to address new problems
or concerns.

Each version is given a distinguishing version number. If the Library
as you received it specifies that a certain numbered version of the
GNU Lesser General Public License “or any later version” applies
to it, you have the option of following the terms and conditions
either of that published version or of any later version published
by the Free Software Foundation. If the Library as you received it
does not specify a version number of the GNU Lesser General Public
License, you may choose any version of the GNU Lesser General Public
License ever published by the Free Software Foundation.

If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License
shall apply, that proxy's public statement of acceptance of any
version is permanent authorization for you to choose that version
for the Library.

===============================================================================================================

GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of
this license document, but changing it is not allowed.

Preamble The GNU General Public License is a free, copyleft license
for software and other kinds of works.

The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom
to share and change all versions of a program--to make sure it
remains free software for all its users. We, the Free Software
Foundation, use the GNU General Public License for most of our
software; it applies also to any other work released this way by
its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and
charge for them if you wish), that you receive source code or can
get it if you want it, that you can change the software or use
pieces of it in new free programs, and that you know you can do
these things.

To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you
have certain responsibilities if you distribute copies of the
software, or if you modify it: responsibilities to respect the
freedom of others.

For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too,
receive or can get the source code. And you must show them these
terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users'
and authors' sake, the GPL requires that modified versions be marked
as changed, so that their problems will not be attributed erroneously
to authors of previous versions.

Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the
manufacturer can do so. This is fundamentally incompatible with the
aim of protecting users' freedom to change the software. The
systematic pattern of such abuse occurs in the area of products for
individuals to use, which is precisely where it is most unacceptable.
Therefore, we have designed this version of the GPL to prohibit the
practice for those products. If such problems arise substantially
in other domains, we stand ready to extend this provision to those
domains in future versions of the GPL, as needed to protect the
freedom of users.

Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we
wish to avoid the special danger that patents applied to a free
program could make it effectively proprietary. To prevent this, the
GPL assures that patents cannot be used to render the program
non-free.

The precise terms and conditions for copying, distribution and
modification follow.

TERMS AND CONDITIONS 0. Definitions.  “This License” refers to
version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds
of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this
License. Each licensee is addressed as “you”. “Licensees” and
“recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the
work in a fashion requiring copyright permission, other than the
making of an exact copy. The resulting work is called a “modified
version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based
on the Program.

To “propagate” a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it
on a computer or modifying a private copy. Propagation includes
copying, distribution (with or without modification), making available
to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user
through a computer network, with no transfer of a copy, is not
conveying.

An interactive user interface displays “Appropriate Legal Notices”
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to
the extent that warranties are provided), that licensees may convey
the work under this License, and how to view a copy of this License.
If the interface presents a list of user commands or options, such
as a menu, a prominent item in the list meets this criterion.

1. Source Code.  The “source code” for a work means the preferred
form of the work for making modifications to it. “Object code” means
any non-source form of a work.

A “Standard Interface” means an interface that either is an official
standard defined by a recognized standards body, or, in the case
of interfaces specified for a particular programming language, one
that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form
of packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
“Major Component”, in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts
to control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available
free programs which are used unmodified in performing those activities
but which are not part of the work. For example, Corresponding
Source includes interface definition files associated with source
files for the work, and the source code for shared libraries and
dynamically linked subprograms that the work is specifically designed
to require, such as by intimate data communication or control flow
between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can
regenerate automatically from other parts of the Corresponding
Source.

The Corresponding Source for a work in source code form is that
same work.

2. Basic Permissions.  All rights granted under this License are
granted for the term of copyright on the Program, and are irrevocable
provided the stated conditions are met. This License explicitly
affirms your unlimited permission to run the unmodified Program.
The output from running a covered work is covered by this License
only if the output, given its content, constitutes a covered work.
This License acknowledges your rights of fair use or other equivalent,
as provided by copyright law.

You may make, run and propagate covered works that you do not convey,
without conditions so long as your license otherwise remains in
force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide
you with facilities for running those works, provided that you
comply with the terms of this License in conveying all material for
which you do not control copyright. Those thus making or running
the covered works for you must do so exclusively on your behalf,
under your direction and control, on terms that prohibit them from
making any copies of your copyrighted material outside their
relationship with you.

Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section
10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.  No
covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect
to the covered work, and you disclaim any intention to limit operation
or modification of the work as a means of enforcing, against the
work's users, your or third parties' legal rights to forbid
circumvention of technological measures.

4. Conveying Verbatim Copies.  You may convey verbatim copies of
the Program's source code as you receive it, in any medium, provided
that you conspicuously and appropriately publish on each copy an
appropriate copyright notice; keep intact all notices stating that
this License and any non-permissive terms added in accord with
section 7 apply to the code; keep intact all notices of the absence
of any warranty; and give all recipients a copy of this License
along with the Program.

You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.  You may convey a work based
on the Program, or the modifications to produce it from the Program,
in the form of source code under the terms of section 4, provided
that you also meet all of these conditions:

a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.  b) The work must carry prominent
notices stating that it is released under this License and any
conditions added under section 7. This requirement modifies the
requirement in section 4 to “keep intact all notices”.  c) You must
license the entire work, as a whole, under this License to anyone
who comes into possession of a copy. This License will therefore
apply, along with any applicable section 7 additional terms, to the
whole of the work, and all its parts, regardless of how they are
packaged. This License gives no permission to license the work in
any other way, but it does not invalidate such permission if you
have separately received it.  d) If the work has interactive user
interfaces, each must display Appropriate Legal Notices; however,
if the Program has interactive interfaces that do not display
Appropriate Legal Notices, your work need not make them do so.  A
compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called
an “aggregate” if the compilation and its resulting copyright are
not used to limit the access or legal rights of the compilation's
users beyond what the individual works permit. Inclusion of a covered
work in an aggregate does not cause this License to apply to the
other parts of the aggregate.

6. Conveying Non-Source Forms.  You may convey a covered work in
object code form under the terms of sections 4 and 5, provided that
you also convey the machine-readable Corresponding Source under the
terms of this License, in one of these ways:

a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium customarily
used for software interchange.  b) Convey the object code in, or
embodied in, a physical product (including a physical distribution
medium), accompanied by a written offer, valid for at least three
years and valid for as long as you offer spare parts or customer
support for that product model, to give anyone who possesses the
object code either (1) a copy of the Corresponding Source for all
the software in the product that is covered by this License, on a
durable physical medium customarily used for software interchange,
for a price no more than your reasonable cost of physically performing
this conveying of source, or (2) access to copy the Corresponding
Source from a network server at no charge.  c) Convey individual
copies of the object code with a copy of the written offer to provide
the Corresponding Source. This alternative is allowed only occasionally
and noncommercially, and only if you received the object code with
such an offer, in accord with subsection 6b.  d) Convey the object
code by offering access from a designated place (gratis or for a
charge), and offer equivalent access to the Corresponding Source
in the same way through the same place at no further charge. You
need not require recipients to copy the Corresponding Source along
with the object code. If the place to copy the object code is a
network server, the Corresponding Source may be on a different
server (operated by you or a third party) that supports equivalent
copying facilities, provided you maintain clear directions next to
the object code saying where to find the Corresponding Source.
Regardless of what server hosts the Corresponding Source, you remain
obligated to ensure that it is available for as long as needed to
satisfy these requirements.  e) Convey the object code using
peer-to-peer transmission, provided you inform other peers where
the object code and Corresponding Source of the work are being
offered to the general public at no charge under subsection 6d.  A
separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means
any tangible personal property which is normally used for personal,
family, or household purposes, or (2) anything designed or sold for
incorporation into a dwelling. In determining whether a product is
a consumer product, doubtful cases shall be resolved in favor of
coverage. For a particular product received by a particular user,
“normally used” refers to a typical or common use of that class of
product, regardless of the status of the particular user or of the
way in which the particular user actually uses, or expects or is
expected to use, the product. A product is a consumer product
regardless of whether the product has substantial commercial,
industrial or non-consumer uses, unless such uses represent the
only significant mode of use of the product.

“Installation Information” for a User Product means any methods,
procedures, authorization keys, or other information required to
install and execute modified versions of a covered work in that
User Product from a modified version of its Corresponding Source.
The information must suffice to ensure that the continued functioning
of the modified object code is in no case prevented or interfered
with solely because modification has been made.

If you convey an object code work under this section in, or with,
or specifically for use in, a User Product, and the conveying occurs
as part of a transaction in which the right of possession and use
of the User Product is transferred to the recipient in perpetuity
or for a fixed term (regardless of how the transaction is characterized),
the Corresponding Source conveyed under this section must be
accompanied by the Installation Information. But this requirement
does not apply if neither you nor any third party retains the ability
to install modified object code on the User Product (for example,
the work has been installed in ROM).

The requirement to provide Installation Information does not include
a requirement to continue to provide support service, warranty, or
updates for a work that has been modified or installed by the
recipient, or for the User Product in which it has been modified
or installed. Access to a network may be denied when the modification
itself materially and adversely affects the operation of the network
or violates the rules and protocols for communication across the
network.

Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

7. Additional Terms.  “Additional permissions” are terms that
supplement the terms of this License by making exceptions from one
or more of its conditions. Additional permissions that are applicable
to the entire Program shall be treated as though they were included
in this License, to the extent that they are valid under applicable
law. If additional permissions apply only to part of the Program,
that part may be used separately under those permissions, but the
entire Program remains governed by this License without regard to
the additional permissions.

When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part
of it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material
you add to a covered work, you may (if authorized by the copyright
holders of that material) supplement the terms of this License with
terms:

a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or b) Requiring
preservation of specified reasonable legal notices or author
attributions in that material or in the Appropriate Legal Notices
displayed by works containing it; or c) Prohibiting misrepresentation
of the origin of that material, or requiring that modified versions
of such material be marked in reasonable ways as different from the
original version; or d) Limiting the use for publicity purposes of
names of licensors or authors of the material; or e) Declining to
grant rights under trademark law for use of some trade names,
trademarks, or service marks; or f) Requiring indemnification of
licensors and authors of that material by anyone who conveys the
material (or modified versions of it) with contractual assumptions
of liability to the recipient, for any liability that these contractual
assumptions directly impose on those licensors and authors.  All
other non-permissive additional terms are considered “further
restrictions” within the meaning of section 10. If the Program as
you received it, or any part of it, contains a notice stating that
it is governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under
this License, you may add to a covered work material governed by
the terms of that license document, provided that the further
restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in
the form of a separately written license, or stated as exceptions;
the above requirements apply either way.

8. Termination.  You may not propagate or modify a covered work
except as expressly provided under this License. Any attempt otherwise
to propagate or modify it is void, and will automatically terminate
your rights under this License (including any patent licenses granted
under the third paragraph of section 11).

However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from
that copyright holder, and you cure the violation prior to 30 days
after your receipt of the notice.

Termination of your rights under this section does not terminate
the licenses of parties who have received copies or rights from you
under this License. If your rights have been terminated and not
permanently reinstated, you do not qualify to receive new licenses
for the same material under section 10.

9. Acceptance Not Required for Having Copies.  You are not required
to accept this License in order to receive or run a copy of the
Program. Ancillary propagation of a covered work occurring solely
as a consequence of using peer-to-peer transmission to receive a
copy likewise does not require acceptance. However, nothing other
than this License grants you permission to propagate or modify any
covered work. These actions infringe copyright if you do not accept
this License. Therefore, by modifying or propagating a covered work,
you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.  Each time you
convey a covered work, the recipient automatically receives a license
from the original licensors, to run, modify and propagate that work,
subject to this License. You are not responsible for enforcing
compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of
an organization, or substantially all assets of one, or subdividing
an organization, or merging organizations. If propagation of a
covered work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or
could give under the previous paragraph, plus a right to possession
of the Corresponding Source of the work from the predecessor in
interest, if the predecessor has it or can get it with reasonable
efforts.

You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging
that any patent claim is infringed by making, using, selling,
offering for sale, or importing the Program or any portion of it.

11. Patents.  A “contributor” is a copyright holder who authorizes
use under this License of the Program or a work on which the Program
is based. The work thus licensed is called the contributor's
“contributor version”.

A contributor's “essential patent claims” are all patent claims
owned or controlled by the contributor, whether already acquired
or hereafter acquired, that would be infringed by some manner,
permitted by this License, of making, using, or selling its contributor
version, but do not include claims that would be infringed only as
a consequence of further modification of the contributor version.
For purposes of this definition, “control” includes the right to
grant patent sublicenses in a manner consistent with the requirements
of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify
and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express
agreement or commitment, however denominated, not to enforce a
patent (such as an express permission to practice a patent or
covenant not to sue for patent infringement). To “grant” such a
patent license to a party means to make such an agreement or
commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through
a publicly available network server or other readily accessible
means, then you must either (1) cause the Corresponding Source to
be so available, or (2) arrange to deprive yourself of the benefit
of the patent license for this particular work, or (3) arrange, in
a manner consistent with the requirements of this License, to extend
the patent license to downstream recipients. “Knowingly relying”
means you have actual knowledge that, but for the patent license,
your conveying the covered work in a country, or your recipient's
use of the covered work in a country, would infringe one or more
identifiable patents in that country that you have reason to believe
are valid.

If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of,
a covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate,
modify or convey a specific copy of the covered work, then the
patent license you grant is automatically extended to all recipients
of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within
the scope of its coverage, prohibits the exercise of, or is conditioned
on the non-exercise of one or more of the rights that are specifically
granted under this License. You may not convey a covered work if
you are a party to an arrangement with a third party that is in the
business of distributing software, under which you make payment to
the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.  If conditions are imposed on
you (whether by court order, agreement or otherwise) that contradict
the conditions of this License, they do not excuse you from the
conditions of this License. If you cannot convey a covered work so
as to satisfy simultaneously your obligations under this License
and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that
obligate you to collect a royalty for further conveying from those
to whom you convey the Program, the only way you could satisfy both
those terms and this License would be to refrain entirely from
conveying the Program.

13. Use with the GNU Affero General Public License.  Notwithstanding
any other provision of this License, you have permission to link
or combine any covered work with a work licensed under version 3
of the GNU Affero General Public License into a single combined
work, and to convey the resulting work. The terms of this License
will continue to apply to the part which is the covered work, but
the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to
the combination as such.

14. Revised Versions of this License.  The Free Software Foundation
may publish revised and/or new versions of the GNU General Public
License from time to time. Such new versions will be similar in
spirit to the present version, but may differ in detail to address
new problems or concerns.

Each version is given a distinguishing version number. If the Program
specifies that a certain numbered version of the GNU General Public
License “or any later version” applies to it, you have the option
of following the terms and conditions either of that numbered version
or of any later version published by the Free Software Foundation.
If the Program does not specify a version number of the GNU General
Public License, you may choose any version ever published by the
Free Software Foundation.

If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes
you to choose that version for the Program.

Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow
a later version.

15. Disclaimer of Warranty.  THERE IS NO WARRANTY FOR THE PROGRAM,
TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE
THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.  IN NO EVENT UNLESS REQUIRED BY
APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER,
OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS
PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS
OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH
ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.  If the disclaimer of
warranty and limitation of liability provided above cannot be given
local legal effect according to their terms, reviewing courts shall
apply local law that most closely approximates an absolute waiver
of all civil liability in connection with the Program, unless a
warranty or assumption of liability accompanies a copy of the Program
in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs If you develop a new
program, and you want it to be of the greatest possible use to the
public, the best way to achieve this is to make it free software
which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the “copyright” line and a pointer to where the full notice is
found.

<one line to give the program's name and a brief idea of what it
does.> Copyright (C) <year>  <name of author>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper
mail.

If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

<program>  Copyright (C) <year>  <name of author> This program comes
with ABSOLUTELY NO WARRANTY; for details type `show w'.  This is
free software, and you are welcome to redistribute it under certain
conditions; type `show c' for details. The hypothetical commands
`show w' and `show c' should show the appropriate parts of the
General Public License. Of course, your program's commands might
be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or
school, if any, to sign a “copyright disclaimer” for the program,
if necessary. For more information on this, and how to apply and
follow the GNU GPL, see <https://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your
program into proprietary programs. If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library. If this is what you want to do, use
the GNU Lesser General Public License instead of this License. But
first, please read <https://www.gnu.org/licenses/why-not-lgpl.html>.

Die erwartete CRC32-Prüfsumme ist $2C68A922
/dev/disk2          	Apple_partition_scheme
/dev/disk2s1        	Apple_partition_map
/dev/disk2s2        	Apple_HFS                      	/Volumes/Horos

2022-07-04 23:48:33 : INFO  : horos : Mounted: /Volumes/Horos
2022-07-04 23:48:33 : INFO  : horos : Verifying: /Volumes/Horos/Horos.app
2022-07-04 23:48:33 : DEBUG : horos : App size: 146M	/Volumes/Horos/Horos.app
2022-07-04 23:48:36 : DEBUG : horos : Debugging enabled, App Verification output was:
/Volumes/Horos/Horos.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Nimble CO LLC (TPT6TVH8UY)

2022-07-04 23:48:36 : INFO  : horos : Team ID matching: TPT6TVH8UY (expected: TPT6TVH8UY )
2022-07-04 23:48:36 : INFO  : horos : Downloaded version of Horos is Horos v4.0.0 RC5 on versionKey CFBundleGetInfoString, same as installed.
2022-07-04 23:48:36 : DEBUG : horos : Unmounting /Volumes/Horos
2022-07-04 23:48:36 : DEBUG : horos : Debugging enabled, Unmounting output was:
"disk2" ejected.
2022-07-04 23:48:36 : DEBUG : horos : DEBUG mode 1, not reopening anything
2022-07-04 23:48:36 : REG   : horos : No new version to install
2022-07-04 23:48:36 : REQ   : horos : ################## End Installomator, exit code 0
2022-07-04 23:55:38 +02:00
macmangr
face2a7e93 New Label: Filemaker Pro
"FileMaker is a cross-platform relational database application from Claris International, a subsidiary of Apple Inc. It integrates a database engine with a graphical user interface (GUI) and security features, allowing users to modify a database by dragging new elements into layouts, screens, or forms. It is available in desktop, server, iOS and web-delivery configurations"

./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels filemakerpro
2022-07-04 15:35:36 : REQ   : filemakerpro : ################## Start Installomator v. 10.0beta, date 2022-07-04
2022-07-04 15:35:36 : INFO  : filemakerpro : ################## Version: 10.0beta
2022-07-04 15:35:36 : INFO  : filemakerpro : ################## Date: 2022-07-04
2022-07-04 15:35:36 : INFO  : filemakerpro : ################## filemakerpro
2022-07-04 15:35:37 : DEBUG : filemakerpro : DEBUG mode 1 enabled.
2022-07-04 15:35:37 : INFO  : filemakerpro : BLOCKING_PROCESS_ACTION=tell_user
2022-07-04 15:35:37 : INFO  : filemakerpro : NOTIFY=success
2022-07-04 15:35:37 : INFO  : filemakerpro : LOGGING=DEBUG
2022-07-04 15:35:37 : INFO  : filemakerpro : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-04 15:35:37 : INFO  : filemakerpro : Label type: dmg
2022-07-04 15:35:37 : INFO  : filemakerpro : archiveName: FileMaker Pro.dmg
2022-07-04 15:35:37 : INFO  : filemakerpro : no blocking processes defined, using FileMaker Pro as default
2022-07-04 15:35:37 : DEBUG : filemakerpro : Changing directory to /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build
2022-07-04 15:35:37 : INFO  : filemakerpro : App(s) found: /Applications/FileMaker Pro.app
2022-07-04 15:35:37 : INFO  : filemakerpro : found app at /Applications/FileMaker Pro.app, version 19.5.1.36, on versionKey BuildVersion
2022-07-04 15:35:37 : INFO  : filemakerpro : appversion: 19.5.1.36
2022-07-04 15:35:37 : INFO  : filemakerpro : Latest version of FileMaker Pro is 19.5.1.36
2022-07-04 15:35:37 : WARN  : filemakerpro : DEBUG mode 1 enabled, not exiting, but there is no new version of app.
2022-07-04 15:35:37 : INFO  : filemakerpro : FileMaker Pro.dmg exists and DEBUG mode 1 enabled, skipping download
2022-07-04 15:35:37 : DEBUG : filemakerpro : DEBUG mode 1, not checking for blocking processes
2022-07-04 15:35:37 : REQ   : filemakerpro : Installing FileMaker Pro
2022-07-04 15:35:37 : INFO  : filemakerpro : Mounting /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build/FileMaker Pro.dmg
2022-07-04 15:35:38 : DEBUG : filemakerpro : Debugging enabled, dmgmount output was:
Die erwartete CRC32-Prüfsumme ist $4150F8F9
/dev/disk2          	GUID_partition_scheme
/dev/disk2s1        	Apple_HFS                      	/Volumes/FileMaker Pro 19

2022-07-04 15:35:38 : INFO  : filemakerpro : Mounted: /Volumes/FileMaker Pro 19
2022-07-04 15:35:38 : INFO  : filemakerpro : Verifying: /Volumes/FileMaker Pro 19/FileMaker Pro.app
2022-07-04 15:35:38 : DEBUG : filemakerpro : App size: 966M	/Volumes/FileMaker Pro 19/FileMaker Pro.app
2022-07-04 15:38:04 : DEBUG : filemakerpro : Debugging enabled, App Verification output was:
/Volumes/FileMaker Pro 19/FileMaker Pro.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Claris International Inc. (J6K4T76U7W)

2022-07-04 15:38:04 : INFO  : filemakerpro : Team ID matching: J6K4T76U7W (expected: J6K4T76U7W )
2022-07-04 15:38:04 : INFO  : filemakerpro : Downloaded version of FileMaker Pro is 19.5.1.36 on versionKey BuildVersion, same as installed.
2022-07-04 15:38:04 : DEBUG : filemakerpro : Unmounting /Volumes/FileMaker Pro 19
2022-07-04 15:38:05 : DEBUG : filemakerpro : Debugging enabled, Unmounting output was:
"disk2" ejected.
2022-07-04 15:38:05 : DEBUG : filemakerpro : DEBUG mode 1, not reopening anything
2022-07-04 15:38:05 : REG   : filemakerpro : No new version to install
2022-07-04 15:38:05 : REQ   : filemakerpro : ################## End Installomator, exit code 0
2022-07-04 15:46:02 +02:00
macmangr
02946d88c8 New Label: Java SE Development Kit 18
./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels jdk18
2022-07-04 13:21:27 : REQ   : jdk18 : ################## Start Installomator v. 10.0beta, date 2022-07-04
2022-07-04 13:21:27 : INFO  : jdk18 : ################## Version: 10.0beta
2022-07-04 13:21:27 : INFO  : jdk18 : ################## Date: 2022-07-04
2022-07-04 13:21:27 : INFO  : jdk18 : ################## jdk18
2022-07-04 13:21:27 : DEBUG : jdk18 : DEBUG mode 1 enabled.
2022-07-04 13:21:27 : INFO  : jdk18 : BLOCKING_PROCESS_ACTION=tell_user
2022-07-04 13:21:27 : INFO  : jdk18 : NOTIFY=success
2022-07-04 13:21:27 : INFO  : jdk18 : LOGGING=DEBUG
2022-07-04 13:21:28 : INFO  : jdk18 : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-04 13:21:28 : INFO  : jdk18 : Label type: pkgInDmg
2022-07-04 13:21:28 : INFO  : jdk18 : archiveName: Java SE Development Kit 18.dmg
2022-07-04 13:21:28 : INFO  : jdk18 : no blocking processes defined, using Java SE Development Kit 18 as default
2022-07-04 13:21:28 : DEBUG : jdk18 : Changing directory to /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build
2022-07-04 13:21:28 : INFO  : jdk18 : Custom App Version detection is used, found 18.0.1.1
2022-07-04 13:21:28 : INFO  : jdk18 : appversion: 18.0.1.1
2022-07-04 13:21:28 : INFO  : jdk18 : Latest version of Java SE Development Kit 18 is 18.0.1.1
2022-07-04 13:21:28 : WARN  : jdk18 : DEBUG mode 1 enabled, not exiting, but there is no new version of app.
2022-07-04 13:21:28 : REQ   : jdk18 : Downloading https://download.oracle.com/java/18/latest/jdk-18_macos-x64_bin.dmg to Java SE Development Kit 18.dmg
2022-07-04 13:21:53 : DEBUG : jdk18 : File list: -rw-r--r--  1 savvas  staff   170M  4 Jul 13:21 Java SE Development Kit 18.dmg
2022-07-04 13:21:53 : DEBUG : jdk18 : File type: Java SE Development Kit 18.dmg: zlib compressed data
2022-07-04 13:21:53 : DEBUG : jdk18 : curl output was:
*   Trying 104.76.200.85:443...
* Connected to download.oracle.com (104.76.200.85) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* (304) (OUT), TLS handshake, Client hello (1):
} [324 bytes data]
* (304) (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* (304) (IN), TLS handshake, Unknown (8):
{ [35 bytes data]
* (304) (IN), TLS handshake, Certificate (11):
{ [2926 bytes data]
* (304) (IN), TLS handshake, CERT verify (15):
{ [80 bytes data]
* (304) (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* (304) (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=US; ST=California; L=Redwood City; O=Oracle Corporation; CN=download.oracle.com
*  start date: Sep 13 00:00:00 2021 GMT
*  expire date: Sep 13 23:59:59 2022 GMT
*  subjectAltName: host "download.oracle.com" matched cert's "download.oracle.com"
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
*  SSL certificate verify ok.
> GET /java/18/latest/jdk-18_macos-x64_bin.dmg HTTP/1.1
> Host: download.oracle.com
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Content-Type: application/octet-stream
< Server: AkamaiNetStorage
< Last-Modified: Tue, 26 Apr 2022 18:40:47 GMT
< ETag: "a5314d086c18af3e93121e11fc25f5af:1650998873.170204"
< Content-Length: 178108545
< Date: Mon, 04 Jul 2022 11:21:28 GMT
< Connection: keep-alive
<
{ [16083 bytes data]
* Connection #0 to host download.oracle.com left intact

2022-07-04 13:21:53 : DEBUG : jdk18 : DEBUG mode 1, not checking for blocking processes
2022-07-04 13:21:53 : REQ   : jdk18 : Installing Java SE Development Kit 18
2022-07-04 13:21:53 : INFO  : jdk18 : Mounting /Users/savvas/Desktop/Mosyle/Resources/Installomator-main original/build/Java SE Development Kit 18.dmg
2022-07-04 13:21:56 : DEBUG : jdk18 : Debugging enabled, dmgmount output was:
Prüfsumme für Protective Master Boot Record (MBR : 0) berechnen …
Protective Master Boot Record (MBR :: Die überprüfte CRC32-Prüfsumme ist $A63E199D
Prüfsumme für GPT Header (Primary GPT Header : 1) berechnen …
GPT Header (Primary GPT Header : 1): Die überprüfte CRC32-Prüfsumme ist $4CAA2C48
Prüfsumme für GPT Partition Data (Primary GPT Table : 2) berechnen …
GPT Partition Data (Primary GPT Tabl: Die überprüfte CRC32-Prüfsumme ist $D15A79FE
Prüfsumme für  (Apple_Free : 3) berechnen …
(Apple_Free : 3): Die überprüfte CRC32-Prüfsumme ist $00000000
Prüfsumme für disk image (Apple_HFS : 4) berechnen …
disk image (Apple_HFS : 4): Die überprüfte CRC32-Prüfsumme ist $0F56211E
Prüfsumme für  (Apple_Free : 5) berechnen …
(Apple_Free : 5): Die überprüfte CRC32-Prüfsumme ist $00000000
Prüfsumme für GPT Partition Data (Backup GPT Table : 6) berechnen …
GPT Partition Data (Backup GPT Table: Die überprüfte CRC32-Prüfsumme ist $D15A79FE
Prüfsumme für GPT Header (Backup GPT Header : 7) berechnen …
GPT Header (Backup GPT Header : 7): Die überprüfte CRC32-Prüfsumme ist $D36773E6
Die überprüfte CRC32-Prüfsumme ist $EF324497
/dev/disk2          	GUID_partition_scheme
/dev/disk2s1        	Apple_HFS                      	/Volumes/JDK 18.0.1.1

2022-07-04 13:21:56 : INFO  : jdk18 : Mounted: /Volumes/JDK 18.0.1.1
2022-07-04 13:21:56 : DEBUG : jdk18 : Found pkg(s):
/Volumes/JDK 18.0.1.1/JDK 18.0.1.1.pkg
2022-07-04 13:21:56 : INFO  : jdk18 : found pkg: /Volumes/JDK 18.0.1.1/JDK 18.0.1.1.pkg
2022-07-04 13:21:56 : INFO  : jdk18 : Verifying: /Volumes/JDK 18.0.1.1/JDK 18.0.1.1.pkg
2022-07-04 13:21:56 : DEBUG : jdk18 : File list: -rw-r--r--  1 savvas  staff   171M 25 Apr 23:09 /Volumes/JDK 18.0.1.1/JDK 18.0.1.1.pkg
2022-07-04 13:21:56 : DEBUG : jdk18 : File type: /Volumes/JDK 18.0.1.1/JDK 18.0.1.1.pkg: xar archive compressed TOC: 5557, SHA-1 checksum
2022-07-04 13:21:56 : DEBUG : jdk18 : spctlOut is /Volumes/JDK 18.0.1.1/JDK 18.0.1.1.pkg: accepted
2022-07-04 13:21:56 : DEBUG : jdk18 : source=Notarized Developer ID
2022-07-04 13:21:56 : DEBUG : jdk18 : origin=Developer ID Installer: Oracle America, Inc. (VB5E2TV963)
2022-07-04 13:21:56 : INFO  : jdk18 : Team ID: VB5E2TV963 (expected: VB5E2TV963 )
2022-07-04 13:21:56 : DEBUG : jdk18 : DEBUG enabled, skipping installation
2022-07-04 13:21:56 : INFO  : jdk18 : Finishing...
2022-07-04 13:22:06 : INFO  : jdk18 : Custom App Version detection is used, found 18.0.1.1
2022-07-04 13:22:06 : REQ   : jdk18 : Installed Java SE Development Kit 18, version 18.0.1.1
2022-07-04 13:22:06 : INFO  : jdk18 : notifying
2022-07-04 13:22:06 : DEBUG : jdk18 : Unmounting /Volumes/JDK 18.0.1.1
2022-07-04 13:22:07 : DEBUG : jdk18 : Debugging enabled, Unmounting output was:
"disk2" ejected.
2022-07-04 13:22:07 : DEBUG : jdk18 : DEBUG mode 1, not reopening anything
2022-07-04 13:22:07 : REQ   : jdk18 : All done!
2022-07-04 13:22:07 : REQ   : jdk18 : ################## End Installomator, exit code 0
2022-07-04 13:23:03 +02:00
macmangr
05816942cc New Label: Parallels Client
"Access Windows Applications, Desktops, or Data on Any Device

Parallels® Client is a lightweight software that enables end-users to securely access virtual applications and desktops from Windows, Mac, Linux, iOS/iPadOS, Android, Google Chromebook and any HTML5 web browser."

./assemble.sh -l /Desktop/Mosyle/Resources/InstallomatorLabels rasclient NOTIFY=silent DEBUG=0
Password:
2022-07-04 12:59:53 : WARN  : rasclient : setting variable from argument NOTIFY=silent
2022-07-04 12:59:53 : WARN  : rasclient : setting variable from argument DEBUG=0
2022-07-04 12:59:53 : REQ   : rasclient : ################## Start Installomator v. 10.0beta, date 2022-07-04
2022-07-04 12:59:53 : INFO  : rasclient : ################## Version: 10.0beta
2022-07-04 12:59:53 : INFO  : rasclient : ################## Date: 2022-07-04
2022-07-04 12:59:53 : INFO  : rasclient : ################## rasclient
2022-07-04 12:59:53 : INFO  : rasclient : BLOCKING_PROCESS_ACTION=tell_user
2022-07-04 12:59:53 : INFO  : rasclient : NOTIFY=silent
2022-07-04 12:59:53 : INFO  : rasclient : LOGGING=INFO
2022-07-04 12:59:53 : INFO  : rasclient : LOGO=/System/Applications/App Store.app/Contents/Resources/AppIcon.icns
2022-07-04 12:59:53 : INFO  : rasclient : Label type: pkg
2022-07-04 12:59:53 : INFO  : rasclient : archiveName: Parallels Client.pkg
2022-07-04 12:59:53 : INFO  : rasclient : no blocking processes defined, using Parallels Client as default
2022-07-04 12:59:53 : INFO  : rasclient : App(s) found: /Applications/Parallels Client.app
2022-07-04 12:59:53 : INFO  : rasclient : found app at /Applications/Parallels Client.app, version 18.3.22907, on versionKey CFBundleShortVersionString
2022-07-04 12:59:53 : INFO  : rasclient : appversion: 18.3.22907
2022-07-04 12:59:53 : INFO  : rasclient : Latest version of Parallels Client is 18.3.1.22907
2022-07-04 12:59:53 : REQ   : rasclient : Downloading https://download.parallels.com/ras/v18/18.3.1.22907/RasClient-Mac-Notarized-18.3.1-22907.pkg to Parallels Client.pkg
2022-07-04 12:59:55 : REQ   : rasclient : no more blocking processes, continue with update
2022-07-04 12:59:55 : REQ   : rasclient : Installing Parallels Client
2022-07-04 12:59:55 : INFO  : rasclient : Verifying: Parallels Client.pkg
2022-07-04 12:59:55 : INFO  : rasclient : Team ID: 4C6364ACXT (expected: 4C6364ACXT )
2022-07-04 12:59:55 : INFO  : rasclient : Installing Parallels Client.pkg to /
2022-07-04 13:00:02 : INFO  : rasclient : Finishing...
2022-07-04 13:00:12 : INFO  : rasclient : App(s) found: /Applications/Parallels Client.app
2022-07-04 13:00:12 : INFO  : rasclient : found app at /Applications/Parallels Client.app, version 18.3.22907, on versionKey CFBundleShortVersionString
2022-07-04 13:00:12 : REQ   : rasclient : Installed Parallels Client, version 18.3.22907
2022-07-04 13:00:12 : INFO  : rasclient : App not closed, so no reopen.
2022-07-04 13:00:12 : REQ   : rasclient : All done!
2022-07-04 13:00:12 : REQ   : rasclient : ################## End Installomator, exit code 0
2022-07-04 13:15:22 +02:00
macmangr
6a2da9f55c Update libreoffice.sh
Changed appNewVersion check, so that no download is started if the same version of the software is installed

Changed download url
2022-07-04 12:49:29 +02:00
duongt01
09a34c05b7 New Label: Fellow 2022-06-28 16:10:29 -05:00
Chriscodinglife
8116800835 Added the much needed ending ) 2022-06-28 16:45:15 -04:00
Chriscodinglife
3fd88f6207 Corrected the version grab one more time 2022-06-28 16:43:41 -04:00
Chriscodinglife
a84b14234e Corrected appnewversion variable with sed grabbing the version number displayed in the package file 2022-06-28 16:36:41 -04:00
Chriscodinglife
66133a5520 Added the Fujifilm label for future dslr webcam fans 2022-06-28 15:18:41 -04:00
81 changed files with 5520 additions and 793 deletions

View File

@@ -322,8 +322,8 @@ if [[ $(/usr/bin/arch) == "arm64" ]]; then
rosetta2=no
fi
fi
VERSION="10.0beta2"
VERSIONDATE="2022-09-02"
VERSION="10.0beta3"
VERSIONDATE="2022-09-30"
# MARK: Functions
@@ -489,11 +489,19 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name
fi
if [ -n "$archiveName" ]; then
#downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }")
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1)
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }")
if [[ "$(echo $downloadURL | grep -ioE "https.*$archiveName")" == "" ]]; then
printlog "GitHub API not returning URL, trying https://github.com/$gitusername/$gitreponame/releases/latest."
#downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1)
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1)"
fi
else
#downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "GitHub API not returning URL, trying https://github.com/$gitusername/$gitreponame/releases/latest."
#downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
fi
fi
if [ -z "$downloadURL" ]; then
cleanupAndExit 14 "could not retrieve download URL for $gitusername/$gitreponame" ERROR
@@ -612,6 +620,10 @@ getAppVersion() {
printlog "Replacing App Store apps, no matter the version" WARN
appversion=0
else
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "wait" "Already installed from App Store. Not replaced."
sleep 4
fi
cleanupAndExit 23 "App previously installed from App Store, and we respect that" ERROR
fi
fi
@@ -789,6 +801,10 @@ installAppWithPath() { # $1: path to app to install in $targetDir
printlog "notifying"
displaynotification "$message" "No update for $name!"
fi
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "wait" "Latest version already installed..."
sleep 2
fi
cleanupAndExit 0 "No new version to install" REG
else
printlog "Using force to install anyway."
@@ -955,6 +971,10 @@ installFromPKG() {
printlog "notifying"
displaynotification "$message" "No update for $name!"
fi
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "wait" "Latest version already installed..."
sleep 2
fi
cleanupAndExit 0 "No new version to install" REQ
else
printlog "Using force to install anyway."
@@ -1557,6 +1577,15 @@ remotixagent)
versionKey="CFBundleVersion"
appNewVersion=$(curl -fsIL "${downloadURL}" | grep -i "^location" | sed -E 's/.*\/[a-zA-Z]*-[0-9.]*-([0-9.]*)\.pkg/\1/g')
expectedTeamID="H629V387SY"
blockingProcesses=( NONE )
;;
adobeacrobatprodc)
name="Adobe Acrobat Pro DC"
type="pkgInDmg"
downloadURL="https://trials.adobe.com/AdobeProducts/APRO/Acrobat_HelpX/osx10/Acrobat_DC_Web_WWMUI.dmg"
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "Acrobat Pro DC" )
Company="Adobe"
;;
adobebrackets)
name="Brackets"
@@ -1577,30 +1606,98 @@ adobeconnect)
;;
adobecreativeclouddesktop)
name="Adobe Creative Cloud"
#appName="Install.app"
appName="Install.app"
type="dmg"
adobeurl="https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html"
if [[ $(arch) == "arm64" ]]; then
downloadURL=$(curl -fs "$adobeurl" | xmllint -html -xpath "string(//a[contains(@href,'osx10')][contains(text(),'Download')]/@href)" - 2> /dev/null)
elif [[ $(arch) == "i386" ]]; then
downloadURL=$(curl -fs "$adobeurl" | xmllint -html -xpath "string(//a[contains(@href,'macarm64')][contains(text(),'Download')]/@href)" - 2> /dev/null)
if pgrep -q "Adobe Installer"; then
printlog "Adobe Installer is running, not a good time to update." WARN
printlog "################## End $APPLICATION \n\n" INFO
exit 75
fi
#downloadURL=$(curl -fs "https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html" | grep -o "https*.*dmg" | head -1)
appNewVersion=$(curl -fs "https://helpx.adobe.com/creative-cloud/release-note/cc-release-notes.html" | grep "mandatory" | head -1 | grep -o "Version *.* released" | cut -d " " -f2)
if [[ "$(arch)" == "arm64" ]]; then
downloadURL=$(curl -fs "https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html" | grep -o 'https.*macarm64.*dmg' | head -1 | cut -d '"' -f1)
else
downloadURL=$(curl -fs "https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html" | grep -o 'https.*osx10.*dmg' | head -1 | cut -d '"' -f1)
fi
#appNewVersion=$(curl -fs "https://helpx.adobe.com/creative-cloud/release-note/cc-release-notes.html" | grep "mandatory" | head -1 | grep -o "Version *.* released" | cut -d " " -f2)
appNewVersion=$(echo $downloadURL | grep -o '[^x]*$' | cut -d '.' -f 1 | sed 's/_/\./g')
targetDir="/Applications/Utilities/Adobe Creative Cloud/ACC/"
installerTool="Install.app"
CLIInstaller="Install.app/Contents/MacOS/Install"
CLIArguments=(--mode=silent)
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "Creative Cloud" )
Company="Adobe"
;;
adobereaderdc-install)
name="Adobe Acrobat Reader DC"
type="pkgInDmg"
printlog "Changing IFS for Adobe Reader" INFO
SAVEIFS=$IFS
IFS=$'\n'
versions=( $( curl -s https://www.adobe.com/devnet-docs/acrobatetk/tools/ReleaseNotesDC/index.html | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+"| head -n 30) )
local version
for version in $versions; do
version="${version//.}"
printlog "trying version: $version" INFO
local httpstatus=$(curl -X HEAD -s "https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/${version}/AcroRdrDC_${version}_MUI.dmg" --write-out "%{http_code}")
printlog "HTTP status for Adobe Reader full installer URL https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/${version}/AcroRdrDC_${version}_MUI.dmg is $httpstatus" DEBUG
if [[ "${httpstatus}" == "200" ]]; then
downloadURL="https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/${version}/AcroRdrDC_${version}_MUI.dmg"
unset httpstatus
break
fi
done
unset version
IFS=$SAVEIFS
appNewVersion=$i
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "AdobeReader" )
Company="Adobe"
PatchName="AcrobatReader"
;;
adobereaderdc-update)
name="Adobe Acrobat Reader DC"
type="pkgInDmg"
downloadURL=$(adobecurrent=`curl --fail --silent https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt | tr -d '.'` && echo https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/"$adobecurrent"/AcroRdrDC_"$adobecurrent"_MUI.dmg)
if [[ -d "/Applications/Adobe Acrobat Reader DC.app" ]]; then
printlog "Found /Applications/Adobe Acrobat Reader DC.app"
mkdir -p "/Library/Application Support/Adobe/Acrobat/11.0"
defaults write "/Library/Application Support/Adobe/Acrobat/11.0/com.adobe.Acrobat.InstallerOverrides.plist" ReaderAppPath "/Applications/Adobe Acrobat Reader DC.app"
if ! defaults read "/Applications/Adobe Acrobat Reader DC.app/Contents/Resources/AcroLocale.plist" ; then
printlog "Missing locale data, this will cause the updater to fail. Deleting Adobe Acrobat Reader DC.app and installing fresh." WARN
rm -Rf "/Applications/Adobe Acrobat Reader DC.app"
if [[ $1 == "/" ]]; then
printlog "Running through Jamf: $0." INFO
$0 $1 $2 $3 adobereaderdc-install ${5} ${6} ${7} ${8} ${9} ${10} ${11}
else
printlog "Installomator running locally: $0." INFO
$0 adobereaderdc-install ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} ${10} ${11}
fi
fi
fi
adobecurrent=$(curl -sL https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt | tr -d '.')
if [[ "${adobecurrent}" != <-> ]]; then
printlog "Got an invalid response for the Adobe Reader Current Version: ${adobecurrent}" ERROR
printlog "################## End $APPLICATION \n\n" INFO
exit 50
fi
downloadURL=$(echo https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/"$adobecurrent"/AcroRdrDCUpd"$adobecurrent"_MUI.dmg)
reader_preinstall() {
if pgrep -a "AdobeReader" >/dev/null 2>&1; then
printlog "AdobeReader is still running, forcefully killing." WARN
killall AdobeReader
fi
}
preinstall="reader_preinstall"
updateTool="/usr/local/bin/RemoteUpdateManager"
updateToolArguments=( --productVersions=RDR )
appNewVersion=$(curl -s https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt)
#appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
updateToolLog="/Users/$currentUser/Library/Logs/RemoteUpdateManager.log"
updateToolLogDateFormat="%m/%d/%y %H:%M:%S"
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "AdobeReader" )
Company=Adobe
PatchName=AcrobatReader
PatchSkip="YES"
;;
adobereaderdc|\
adobereaderdc-install)
@@ -1785,6 +1882,26 @@ aquaskk)
appNewVersion=$(versionFromGit codefirst aquaskk)
expectedTeamID="FPZK4WRGW7"
;;
archiwareb2go)
name="P5 Workstation"
type="pkgInDmg"
packageID="com.archiware.presstore"
appNewVersion=$(curl -sf https://www.archiware.com/download-p5 | grep -m 1 "ARCHIWARE P5 Version" | sed "s|.*Version \(.*\) -.*|\\1|")
downloadURL=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo https://p5-downloads.s3.amazonaws.com/awpst"$appNrVersion"-darwin.dmg)
pkgName=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo P5-Workstation-"$appNrVersion"-Install.pkg)
expectedTeamID="5H5EU6F965"
# blockingProcesses=( nsd )
;;
archiwarepst)
name="P5"
type="pkgInDmg"
packageID="com.archiware.presstore"
appNewVersion=$(curl -sf https://www.archiware.com/download-p5 | grep -m 1 "ARCHIWARE P5 Version" | sed "s|.*Version \(.*\) -.*|\\1|")
downloadURL=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo https://p5-downloads.s3.amazonaws.com/awpst"$appNrVersion"-darwin.dmg)
pkgName=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo P5-"$appNrVersion"-Install.pkg)
expectedTeamID="5H5EU6F965"
# blockingProcesses=( nsd )
;;
arq7)
name="Arq7"
type="pkg"
@@ -1825,7 +1942,13 @@ atom)
audacity)
name="Audacity"
type="dmg"
downloadURL=$(downloadURLFromGit audacity audacity)
if [[ $(arch) == "arm64" ]]; then
archiveName="audacity-macOS-[0-9.]*-arm64.dmg"
downloadURL=$(downloadURLFromGit audacity audacity)
elif [[ $(arch) == "i386" ]]; then
archiveName="audacity-macOS-[0-9.]*-x86_64.dmg"
downloadURL=$(downloadURLFromGit audacity audacity)
fi
appNewVersion=$(versionFromGit audacity audacity)
expectedTeamID="AWEYX923UX"
;;
@@ -1942,7 +2065,14 @@ bettertouchtool)
appNewVersion=$(curl -fs https://updates.folivora.ai/bettertouchtool_release_notes.html | grep BetterTouchTool | head -n 2 | tail -n 1 | sed -E 's/.* ([0-9\.]*) .*/\1/g')
expectedTeamID="DAFVSXZ82P"
;;
bitwarden)
bitrix24)
name="Bitrix24"
type="dmg"
archiveName="bitrix24_desktop.dmg"
downloadURL="https://dl.bitrix24.com/b24/bitrix24_desktop.dmg"
expectedTeamID="5B3T3A994N"
blockingProcesses=( "Bitrix24" )
;;bitwarden)
name="Bitwarden"
type="dmg"
downloadURL=$(downloadURLFromGit bitwarden desktop )
@@ -2111,12 +2241,37 @@ carboncopycloner)
appNewVersion=$(sed -E 's/.*-([0-9.]*)\.zip/\1/g' <<< $downloadURL | sed 's/\.[^.]*$//')
expectedTeamID="L4F2DED5Q7"
;;
chatwork)
charles)
name="Charles"
type="dmg"
appNewVersion=$(curl -fs https://www.charlesproxy.com/download/latest-release/ | sed -nE 's/.*version.*value="([^"]*).*/\1/p')
downloadURL="https://www.charlesproxy.com/assets/release/$appNewVersion/charles-proxy-$appNewVersion.dmg"
expectedTeamID="9A5PCU4FSD"
;;chatwork)
name="Chatwork"
type="dmg"
downloadURL="https://desktop-app.chatwork.com/installer/Chatwork.dmg"
expectedTeamID="H34A3H2Y54"
;;
chronoagent)
name="ChronoAgent"
type="pkgInDmg"
# packageID="com.econtechnologies.preference.chronoagent"
# versionKey="CFBundleVersion"
# None of the above can read out the installed version
releaseURL="https://www.econtechnologies.com/UC/updatecheck.php?prod=ChronoAgent&lang=en&plat=mac&os=10.14.1&hw=i64&req=1&vers=#"
appNewVersion=$(curl -sf $releaseURL | sed -r 's/.*VERSION=([^<]+).*/\1/')
downloadURL="https://downloads.econtechnologies.com/CA_Mac_Download.dmg"
expectedTeamID="9U697UM7YX"
;;
chronosync)
name="ChronoSync"
type="pkgInDmg"
releaseURL="https://www.econtechnologies.com/UC/updatecheck.php?prod=ChronoSync&lang=en&plat=mac&os=10.14.1&hw=i64&req=1&vers=#"
appNewVersion=$(curl -sf $releaseURL | sed -r 's/.*VERSION=([^<]+).*/\1/')
downloadURL="https://downloads.econtechnologies.com/CS4_Download.dmg"
expectedTeamID="9U697UM7YX"
;;
cisdem-documentreader)
name="cisdem-documentreader"
type="dmg"
@@ -2276,6 +2431,17 @@ cyberduck)
appNewVersion=$(curl -fs https://version.cyberduck.io/changelog.rss | xpath '//rss/channel/item/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2 )
expectedTeamID="G69SCX94XU"
;;
cytoscape)
name="Cytoscape"
#appName="Cytoscape Installer.app"
type="dmg"
downloadURL="$(downloadURLFromGit cytoscape cytoscape)"
appNewVersion="$(versionFromGit cytoscape cytoscape)"
installerTool="Cytoscape Installer.app"
CLIInstaller="Cytoscape Installer.app/Contents/MacOS/JavaApplicationStub"
CLIArguments=(-q)
expectedTeamID="35LDCJ33QT"
;;
daisydisk)
name="DaisyDisk"
type="zip"
@@ -2444,10 +2610,10 @@ duckduckgo)
name="DuckDuckGo"
type="dmg"
#downloadURL="https://staticcdn.duckduckgo.com/macos-desktop-browser/duckduckgo.dmg"
#downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[last()]' 2>/dev/null | cut -d '"' -f2)
downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | cut -d '"' -f2)
#appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@sparkle:version)[last()]' 2>/dev/null | cut -d '"' -f2)
appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/sparkle:shortVersionString)[1]' 2>/dev/null | cut -d ">" -f2 | cut -d "<" -f1)
downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[last()]' 2>/dev/null | cut -d '"' -f2)
#downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | cut -d '"' -f2)
appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@sparkle:version)[last()]' 2>/dev/null | cut -d '"' -f2)
#appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/sparkle:shortVersionString)[1]' 2>/dev/null | cut -d ">" -f2 | cut -d "<" -f1)
expectedTeamID="HKE973VLUW"
;;
duodevicehealth)
@@ -2490,6 +2656,15 @@ egnyte)
expectedTeamID="FELUD555VC"
blockingProcesses=( NONE )
;;
egnytecore)
name="Egnyte Core"
appName="Egnyte.app"
type="dmg"
downloadURL=$(curl -fs "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/versions/default.xml" | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | cut -d '"' -f 2)
appNewVersion=$(curl -fs "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/versions/default.xml" | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | cut -d '"' -f 2)
expectedTeamID="FELUD555VC"
blockingProcesses=( NONE )
;;
egnytewebedit)
name="EgnyteWebEdit"
type="pkg"
@@ -2603,6 +2778,14 @@ figma)
appNewVersion="$(curl -fsL https://desktop.figma.com/mac/RELEASE.json | awk -F '"' '{ print $8 }')"
expectedTeamID="T8RA8NE3B7"
;;
filemakerpro)
name="FileMaker Pro"
type="dmg"
versionKey="BuildVersion"
downloadURL=$(curl -fs https://www.filemaker.com/redirects/ss.txt | grep '\"PRO..MAC\"' | tail -1 | sed "s|.*url\":\"\(.*\)\".*|\\1|")
appNewVersion=$(curl -fs https://www.filemaker.com/redirects/ss.txt | grep '\"PRO..MAC\"' | tail -1 | sed "s|.*fmp_\(.*\).dmg.*|\\1|")
expectedTeamID="J6K4T76U7W"
;;
filezilla)
name="FileZilla"
type="tbz"
@@ -2796,6 +2979,20 @@ fsmonitor)
downloadURL=$(curl --location --fail --silent "https://fsmonitor.com/FSMonitor/Archives/appcast2.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2)
expectedTeamID="V85GBYB7B9"
;;
fujifilmwebcam)
name="FUJIFILM X Webcam 2"
type="pkg"
downloadURL=$(curl -fs "https://fujifilm-x.com/en-us/support/download/software/x-webcam/" | grep "https.*pkg" | sed -E 's/.*(https:\/\/dl.fujifilm-x\.com\/support\/software\/.*\.pkg[^\<]).*/\1/g' | sed -e 's/^"//' -e 's/"$//')
appNewVersion=$( echo${downloadURL}| sed -E 's/.*XWebcamIns([0-9]*).*/\1/g' | sed -E 's/([0-9])([0-9]).*/\1\.\2/g')
expectedTeamID="34LRP8AV2M"
;;
gfxcardstatus)
name="gfxCardStatus"
type="zip"
downloadURL="$(downloadURLFromGit codykrieger gfxCardStatus)"
appNewVersion="$(versionFromGit codykrieger gfxCardStatus)"
expectedTeamID="LF22FTQC25"
;;
gimp)
name="GIMP-2.10"
type="dmg"
@@ -2999,6 +3196,20 @@ hazel)
appNewVersion=$(curl -fsI https://www.noodlesoft.com/Products/Hazel/download | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')
expectedTeamID="86Z3GCJ4MF"
;;
horos)
name="Horos"
type="dmg"
versionKey="CFBundleGetInfoString"
appNewVersion=$(curl -fs https://github.com/horosproject/horos/blob/horos/Horos/Info.plist | grep -A 4 "CFBundleGetInfoString" | tail -1 | sed -r 's/.*Horos v([^<]+).*/\1/' | sed 's/ //g')
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://horosproject.org/horos-content/Horos"$appNewVersion"_Apple.dmg"
TeamID="8NDFEW7285"
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://horosproject.org/horos-content/Horos"$appNewVersion".dmg"
TeamID="TPT6TVH8UY"
fi
expectedTeamID=$TeamID
;;
houdahspot)
name="HoudahSpot"
type="zip"
@@ -3201,6 +3412,19 @@ jamfreenroller)
#appNewVersion=$(versionFromGit jamf ReEnroller)
expectedTeamID="PS2F6S478M"
;;
jdk18)
name="Java SE Development Kit 18"
type="pkgInDmg"
versionKey="CFBundleShortVersionString"
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://download.oracle.com/java/18/latest/jdk-18_macos-aarch64_bin.dmg"
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://download.oracle.com/java/18/latest/jdk-18_macos-x64_bin.dmg"
fi
appCustomVersion(){ java --version | grep java | awk '{print $2}' }
appNewVersion=$(curl -sf "https://www.oracle.com/java/technologies/downloads/#jdk18-mac" | grep -m 1 "Java SE Development Kit" | sed "s|.*Kit \(.*\) downloads.*|\\1|")
expectedTeamID="VB5E2TV963"
;;
jetbrainsclion)
name="CLion"
type="dmg"
@@ -3430,6 +3654,13 @@ lastpass)
expectedTeamID="N24REP3BMN"
Company="Marvasol, Inc DBA LastPass"
;;
latexit)
name="LaTeXiT"
type="dmg"
downloadURL="$(curl -fs "https://pierre.chachatelier.fr/latexit/downloads/latexit-sparkle-en.rss" | xpath '(//rss/channel/item/enclosure/@url)[last()]' 2>/dev/null | cut -d '"' -f 2)"
appNewVersion="$(curl -fs "https://pierre.chachatelier.fr/latexit/downloads/latexit-sparkle-en.rss" | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[last()]' 2>/dev/null | cut -d '"' -f 2)"
expectedTeamID="7SFX84GNR7"
;;
launchbar)
name="LaunchBar"
type="dmg"
@@ -3454,11 +3685,14 @@ libreoffice)
name="LibreOffice"
type="dmg"
if [[ $(arch) == "arm64" ]]; then
arch_type="aarch64"
releaseURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/aarch64/"
appNewVersion=$(curl -sf $releaseURL | grep -m 1 "_MacOS_aarch64.dmg" | sed "s|.*LibreOffice_\(.*\)_MacOS.*|\\1|")
downloadURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/aarch64/LibreOffice_"$appNewVersion"_MacOS_aarch64.dmg"
elif [[ $(arch) == "i386" ]]; then
releaseURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/x86_64/"
appNewVersion=$(curl -sf $releaseURL | grep -m 1 "_MacOS_x86-64.dmg" | sed "s|.*LibreOffice_\(.*\)_MacOS.*|\\1|")
downloadURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/x86_64/LibreOffice_"$appNewVersion"_MacOS_x86-64.dmg"
fi
libreoffice_latest_version="$(curl -Ls https://www.libreoffice.org/download/download-libreoffice/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)"
downloadURL="https://download.documentfoundation.org/libreoffice/stable/${libreoffice_latest_version}/mac/${arch_type:-x86_64}/LibreOffice_${libreoffice_latest_version}_MacOS_${arch_type:-x86-64}.dmg"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)_.*/\1/g')
expectedTeamID="7P5S3ZLCN7"
blockingProcesses=( soffice )
;;
@@ -4147,10 +4381,21 @@ notion)
nudge)
name="Nudge"
type="pkg"
archiveName="Nudge-[0-9.]*.pkg"
downloadURL=$(downloadURLFromGit macadmins Nudge )
appNewVersion=$(versionFromGit macadmins Nudge )
expectedTeamID="9GQZ7KUFR6"
archiveName="Nudge-[0-9.]*.pkg"
;;
nudgesuite)
name="Nudge Suite"
appName="Nudge.app"
type="pkg"
archiveName="Nudge_Suite-[0-9.]*.pkg"
downloadURL=$(downloadURLFromGit macadmins Nudge )
appNewVersion=$(versionFromGit macadmins Nudge )
expectedTeamID="9GQZ7KUFR6"
blockingProcesses=( "Nudge" )
;;
nvivo)
name="NVivo"
@@ -4161,10 +4406,15 @@ nvivo)
blockingProcesses=( NVivo NVivoHelper )
;;
obs)
# credit: Gabe Marchan (gabemarchan.com - @darklink87)
name="OBS"
type="dmg"
downloadURL=$(curl -fs "https://obsproject.com/download" | awk -F '"' "/dmg/ {print \$10}")
if [[ $(arch) == "arm64" ]]; then
archiveName="obs-studio-[0-9.]*-macos-arm64.dmg"
elif [[ $(arch) == "i386" ]]; then
archiveName="obs-studio-[0-9.]*-macos-x86_64.dmg"
fi
downloadURL=$(downloadURLFromGit obsproject obs-studio )
appNewVersion=$(versionFromGit obsproject obs-studio )
expectedTeamID="2MMRE5MTB8"
;;
obsidian)
@@ -4282,7 +4532,13 @@ opera)
versionKey="CFBundleVersion"
expectedTeamID="A2P9LX4JPN"
;;
ottomatic)
origin)
name="Origin"
type="dmg"
downloadURL="https://www.dm.origin.com/mac/download/Origin.dmg"
expectedTeamID="TSTV75T6Q5"
blockingProcesses=( "Origin" )
;;ottomatic)
name="Otto Matic"
type="dmg"
downloadURL=$(downloadURLFromGit jorio OttoMatic)
@@ -4383,6 +4639,13 @@ plisteditpro)
downloadURL="https://www.fatcatsoftware.com/plisteditpro/PlistEditPro.zip"
expectedTeamID="8NQ43ND65V"
;;
polylens)
name="Poly Lens"
type="dmg"
appNewVersion=$(curl -fs "https://info.lens.poly.com/lens-dt-rn/atom.xml" | grep "Version" | head -1 | cut -d "[" -f3 | sed 's/Version //g' | sed 's/]]\>\<\/title\>//g')
downloadURL="https://swupdate.lens.poly.com/lens-desktop-mac/$appNewVersion/$appNewVersion/PolyLens-$appNewVersion.dmg"
expectedTeamID="SKWK2Q7JJV"
;;
postman)
name="Postman"
type="zip"
@@ -4484,8 +4747,13 @@ qgis-pr)
r)
name="R"
type="pkg"
downloadURL="https://cloud.r-project.org/bin/macosx/$( curl -fsL https://cloud.r-project.org/bin/macosx/ | grep -m 1 -o '<a href=".*pkg">' | sed -E 's/.+"(.+)".+/\1/g' )"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://cloud.r-project.org/bin/macosx/$( curl -fsL https://cloud.r-project.org/bin/macosx/ | grep -m 1 -o '<a href=".*arm64\.pkg">' | sed -E 's/.+"(.+)".+/\1/g' )"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)-.*\..*/\1/g')
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://cloud.r-project.org/bin/macosx/$( curl -fsL https://cloud.r-project.org/bin/macosx/ | grep -o '<a href=".*pkg">' | grep -m 1 -v "arm64" | sed -E 's/.+"(.+)".+/\1/g' )"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')
fi
expectedTeamID="VZLD955F6P"
;;
ramboxce)
@@ -4635,7 +4903,7 @@ rstudio)
name="RStudio"
type="dmg"
downloadURL=$(curl -s -L "https://rstudio.com/products/rstudio/download/" | grep -m 1 -Eio 'href="https://download1.rstudio.org/desktop/macos/RStudio-(.*).dmg"' | cut -c7- | sed -e 's/"$//')
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.-]*)\..*/\1/g' | sed 's/-/+/' )
expectedTeamID="FYF2F5GFX4"
;;
santa)
@@ -4658,7 +4926,12 @@ scaleft)
screamingfrogseospider)
name="Screaming Frog SEO Spider"
type="dmg"
downloadURL=$(curl -fs "https://www.screamingfrog.co.uk/wp-content/themes/screamingfrog/inc/download-modal.php" | grep -i -o "https.*\.dmg" | head -1)
if [[ $(arch) == i386 ]]; then
platform="Mac - (intel)"
elif [[ $(arch) == arm64 ]]; then
platform="Mac - (apple silicon)"
fi
downloadURL=$(curl -fs "https://www.screamingfrog.co.uk/wp-content/themes/screamingfrog/inc/download-modal.php" | grep "${platform}" | grep -i -o "https.*\.dmg" | head -1)
appNewVersion=$(print "$downloadURL" | sed -E 's/https.*\/[a-zA-Z]*-([0-9.]*)\.dmg/\1/g')".0"
expectedTeamID="CAHEVC3HZC"
;;
@@ -4875,6 +5148,14 @@ sourcetree)
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/Sourcetree_([0-9.]*)_[0-9]*\.zip/\1/g')
expectedTeamID="UPXU4CQZ5P"
;;
splashtopbusiness)
name="Splashtop Business"
type="pkgInDmg"
splashtopbusinessVersions=$(curl -fsL "https://www.splashtop.com/wp-content/themes/responsive/downloadx.php?product=stb&platform=mac-client")
downloadURL=$(getJSONValue "$splashtopbusinessVersions" "url")
appNewVersion="${${downloadURL#*INSTALLER_v}%*.dmg}"
expectedTeamID="CPQQ3AW49Y"
;;
splashtopsos)
name="Splashtop SOS"
type="dmg"
@@ -5026,6 +5307,14 @@ tageditor)
appNewVersion=$(curl -sf "https://amvidia.com/tag-editor" | grep -o -E '"softwareVersion":.'"{8}" | sed -E 's/.*"([0-9.]*).*/\1/g')
expectedTeamID="F2TH9XX9CJ"
;;
tailscale)
name="Tailscale"
type="zip"
appNewVersion="$(curl -s https://pkgs.tailscale.com/stable/ | awk -F- '/Tailscale.*macos.zip/ {print $2}')"
downloadURL="https://pkgs.tailscale.com/stable/Tailscale-${appNewVersion}-macos.zip"
expectedTeamID="W5364U7YZB"
versionKey="CFBundleShortVersionString"
;;
talkdeskcallbar)
name="Callbar"
type="dmg"
@@ -5341,11 +5630,12 @@ vlc)
type="dmg"
if [[ $(arch) == "arm64" ]]; then
downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 )
appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
#appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
elif [[ $(arch) == "i386" ]]; then
downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 )
appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
#appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
fi
appNewVersion=$(echo ${downloadURL} | sed -E 's/.*\/vlc-([0-9.]*).*\.dmg/\1/' )
expectedTeamID="75GAHG3SZQ"
;;
vmwarehorizonclient)
@@ -5451,13 +5741,16 @@ wwdc)
;;
xcreds)
name="XCreds"
#type="pkgInZip"
# Downloading from twocanoes homepage
#type="pkgInDmg"
#packageID="com.twocanoes.pkg.secureremoteaccess"
#downloadURL=$(curl -fs "https://twocanoes.com/products/mac/xcreds/" | grep -ioE "https://.*\.zip" | head -1)
#appNewVersion=$(curl -fs "https://twocanoes.com/products/mac/xcreds/" | grep -io "Current Version:.*" | sed -E 's/.*XCreds *([0-9.]*)<.*/\1/g')
# GitHub download
type="pkg"
downloadURL="$(downloadURLFromGit twocanoes xcreds)"
appNewVersion="$(versionFromGit twocanoes xcreds)"
#appNewVersion="$(versionFromGit twocanoes xcreds)" # GitHub tag contain “_” and not “.” so our function fails to get the right version
appNewVersion=$(echo "$downloadURL" | sed -E 's/.*XCreds_.*-([0-9.]*)\.pkg/\1/')
expectedTeamID="UXP6YEHSPW"
;;
xeroxphaser7800)
@@ -5588,6 +5881,16 @@ zoomgov)
expectedTeamID="BJ4HAAB9B3"
versionKey="CFBundleVersion"
;;
zoomoutlookplugin)
name="Zoom Outlook Plugin"
appName="PluginLauncher.app"
targetDir="/Applications/ZoomOutlookPlugin"
type="pkg"
downloadURL="https://zoom.us/client/latest/ZoomMacOutlookPlugin.pkg"
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5 | cut -d "." -f1-3)"
expectedTeamID="BJ4HAAB9B3"
blockingProcesses=( "PluginLauncher" )
;;
zoomrooms)
name="ZoomRooms"
type="pkg"
@@ -5597,6 +5900,14 @@ zoomrooms)
expectedTeamID="BJ4HAAB9B3"
blockingProcesses=( "ZoomPresence" )
;;
zotero)
name="Zotero"
type="dmg"
downloadURL="https://www.zotero.org/download/client/dl?channel=release&platform=mac&version=$(curl -fs "https://www.zotero.org/download/" | grep -Eio '"mac":"(.*)' | cut -d '"' -f 4)"
expectedTeamID="8LAYR367YV"
appNewVersion=$(curl -fs "https://www.zotero.org/download/" | grep -Eio '"mac":"(.*)' | cut -d '"' -f 4)
#Company="Corporation for Digital Scholarship"
;;
zulujdk11)
name="Zulu JDK 11"
type="pkgInDmg"
@@ -5847,6 +6158,10 @@ if [[ -n $appNewVersion ]]; then
printlog "notifying"
displaynotification "$message" "No update for $name!"
fi
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "complete" "Latest version already installed..."
sleep 2
fi
cleanupAndExit 0 "No newer version." REQ
fi
else

View File

@@ -7,11 +7,13 @@ abetterfinderrename11
abstract
acroniscyberprotectconnect
acroniscyberprotectconnectagent
adobeacrobatprodc
adobebrackets
adobeconnect
adobecreativeclouddesktop
adobereaderdc
adobereaderdc-install
adobereaderdc-install
adobereaderdc-update
aircall
airserver
@@ -35,6 +37,8 @@ applesfmono
applesfpro
applesfsymbols
aquaskk
archiwareb2go
archiwarepst
arq7
asana
atext
@@ -56,7 +60,7 @@ bartender
basecamp3
bbedit
bettertouchtool
bitwarden
bitrix24
blender
bluejeans
bluejeanswithaudiodriver
@@ -76,7 +80,9 @@ camtasia2020
camtasia2021
canva
carboncopycloner
chatwork
charles
chronoagent
chronosync
cisdem-documentreader
citrixworkspace
clevershare2
@@ -97,6 +103,7 @@ craftmanagerforsketch
cricutdesignspace
cryptomator
cyberduck
cytoscape
daisydisk
dangerzone
darktable
@@ -123,6 +130,7 @@ dynalist
easeusdatarecoverywizard
easyfind
egnyte
egnytecore
egnytewebedit
element
eraseinstall
@@ -137,6 +145,7 @@ favro
fellow
ferdi
figma
filemakerpro
filezilla
findanyfile
firefox
@@ -154,6 +163,8 @@ flycut
fontexplorer
front
fsmonitor
fujifilmwebcam
gfxcardstatus
gimp
githubdesktop
golang
@@ -178,6 +189,7 @@ gyazogif
hancock
handbrake
hazel
horos
houdahspot
hpeasyadmin
hpeasystart
@@ -205,6 +217,7 @@ jamfconnectconfiguration
jamfmigrator
jamfpppcutility
jamfreenroller
jdk18
jetbrainsclion
jetbrainsdatagrip
jetbrainsintellijidea
@@ -227,6 +240,7 @@ knockknock
krisp
krita
lastpass
latexit
launchbar
lcadvancedvpnclient
lexarrecoverytool
@@ -299,6 +313,7 @@ nomadlogin
nordlayer
notion
nudge
nudgesuite
nvivo
obs
obsidian
@@ -316,7 +331,7 @@ onlyofficedesktop
openvpnconnect
openvpnconnectv3
opera
ottomatic
origin
overflow
pacifist
packages
@@ -330,6 +345,7 @@ pitch
plantronicshub
platypus
plisteditpro
polylens
postman
prism9
pritunl
@@ -400,6 +416,7 @@ sonos
sonoss1
sonoss2
sourcetree
splashtopbusiness
splashtopsos
spotify
sqlpropostgres
@@ -420,6 +437,7 @@ tableaudesktop
tableaupublic
tableaureader
tageditor
tailscale
talkdeskcallbar
talkdeskcxcloud
taskpaper
@@ -489,7 +507,9 @@ zohoworkdrivetruesync
zoom
zoomclient
zoomgov
zoomoutlookplugin
zoomrooms
zotero
zulujdk11
zulujdk13
zulujdk15

View File

@@ -1,185 +0,0 @@
#!/bin/zsh
# Installation using Installomator
what="brave" # enter the software to install
# To be used as a script sent out from a MDM.
# Fill the variable "what" above with a label.
# Script will run this label.
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
######################################################################
# Parameters for reinstall/initial install (owner root:wheel):
# "BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes SYSTEMOWNER=1"
# Parameters for Self Service installed app:
# "BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all"
# Parameters for security important apps, like browsers (run automaticaly every day):
# "BLOCKING_PROCESS_ACTION=tell_user_then_kill"
# Update of service apps (run automatically):
# "BLOCKING_PROCESS_ACTION=quit_kill NOTIFY=silent"
parameters="BLOCKING_PROCESS_ACTION=tell_user_then_kill NOTIFY=all"
###############################################
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
cmdOutput="$(${destFile} ${what} LOGO=$LOGO $parameters LOGGING=WARN || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -ne 0 ]] ; then
echo -e "Error installing ${what}. Exit code ${exitStatus}"
#echo "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
echo "$errorOutput"
echo "Error installing ${what}. Exit code $?"
caffexit $?
fi
echo "[$(DATE)][LOG-END]"
caffexit 0
# notify behavior
# NOTIFY=success
# options:
# - success notify the user on success
# - silent no notifications
# - all all notifications (great for Self Service installation)
# behavior when blocking processes are found
# BLOCKING_PROCESS_ACTION=tell_user
# options:
# - ignore continue even when blocking processes are found
# - quit app will be told to quit nicely, if running
# - quit_kill told to quit twice, then it will be killed
# Could be great for service apps, if they do not respawn
# - silent_fail exit script without prompt or installation
# - prompt_user show a user dialog for each blocking process found
# abort after three attempts to quit
# (only if user accepts to quit the apps, otherwise
# the update is cancelled).
# - prompt_user_then_kill
# show a user dialog for each blocking process found,
# attempt to quit two times, kill the process finally
# - prompt_user_loop
# Like prompt-user, but clicking "Not Now", will just wait an hour,
# and then it will ask again.
# WARNING! It might block the MDM agent on the machine, as
# the scripts gets stuct in waiting until the hour has passed,
# possibly blocking for other management actions in this time.
# - tell_user User will be showed a notification about the important update,
# but user is only allowed to quit and continue, and then we
# ask the app to quit.
# - tell_user_then_kill
# Show dialog 2 times, and if the quitting fails, the
# blocking processes will be killed.
# - kill kill process without prompting or giving the user a chance to save
# logo-icon used in dialog boxes if app is blocking
# LOGO=appstore
# options:
# - appstore Icon is Apple App Store (default)
# - jamf JAMF Pro
# - mosyleb Mosyle Business
# - mosylem Mosyle Manager (Education)
# - addigy Addigy
# path can also be set in the command call, and if file exists, it will be used.
# Like 'LOGO="/System/Applications/App\ Store.app/Contents/Resources/AppIcon.icns"'
# (spaces have to be escaped).
# App Store apps handling
# IGNORE_APP_STORE_APPS=no
# options:
# - no If installed app is from App Store (which include VPP installed apps)
# it will not be touched, no matter it's version (default)
# - yes Replace App Store (and VPP) version of app and handle future
# updates using Installomator, even if latest version.
# Shouldnt give any problems for the user in most cases.
# Known bad example: Slack will loose all settings.
# install behavior
# INSTALL=""
# options:
# - When not set, software will only be installed
# if it is newer/different in version
# - force Install even if its the same version
# Re-opening of closed app
# REOPEN="yes"
# options:
# - yes App wil be reopened if it was closed
# - no App not reopened
########################
# Often used labels:
########################
# firefox
# firefox_intl
# brave
# torbrowser
# googlechrome
# netnewswire
# adobereaderdc
# textmate
# cyberduck
# keka
# theunarchiver
# vlc
# handbrake
# inkscape
# signal
# telegram
# whatsapp
# hazel
# devonthink
# teamviewerqs
# zoom
# malwarebytes
# githubdesktop
# sublimetext
# textmate
# visualstudiocode
# microsoftskypeforbusiness
# microsoftteams
# microsoftyammer
# microsoftedgeenterprisestable
# microsoftedgeconsumerstable
# microsoftsharepointplugin
# microsoftdefenderatp
# googledrivefilestream
# cdef
# desktoppr
# supportapp
# xink
# wwdc

View File

@@ -0,0 +1,346 @@
#!/bin/sh
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
# Installation of software using `valuesfromarguments` to install a custom software using Installomator through GitHub
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
#item="gfxcardstatus" # enter the software to install (if it has a label in future version of Installomator)
# Label variables below
# GitHub functions
downloadURLFromGit() { # $1 git user name, $2 git repo name
gitusername=${1?:"no git user name"}
gitreponame=${2?:"no git repo name"}
if [[ $type == "pkgInDmg" ]]; then
filetype="dmg"
elif [[ $type == "pkgInZip" ]]; then
filetype="zip"
else
filetype=$type
fi
if [ -n "$archiveName" ]; then
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1 || true)
if [[ "$(echo $downloadURL | grep -ioE "https.*$archiveName" || true)" == "" ]]; then
#printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }" || true)
fi
else
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1 || true)
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype" || true)" == "" ]]; then
#printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }" || true)
fi
fi
if [ -z "$downloadURL" ]; then
echo "could not retrieve download URL for $gitusername/$gitreponame"
exit 1
else
echo "$downloadURL"
return 0
fi
}
versionFromGit() {
# credit: Søren Theilgaard (@theilgaard)
# $1 git user name, $2 git repo name
gitusername=${1?:"no git user name"}
gitreponame=${2?:"no git repo name"}
#appNewVersion=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | grep tag_name | cut -d '"' -f 4 | sed 's/[^0-9\.]//g' || true)
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g' || true)
if [ -z "$appNewVersion" ]; then
#echo "could not retrieve version number for $gitusername/$gitreponame"
appNewVersion=""
else
echo "$appNewVersion"
return 0
fi
}
# Variables for label
name="gfxCardStatus"
type="zip"
packageID=""
downloadURL="$(downloadURLFromGit codykrieger gfxCardStatus)"
appNewVersion="$(versionFromGit codykrieger gfxCardStatus)"
versionKey=""
expectedTeamID="LF22FTQC25"
# Dialog icon
icon=""
# icon should be a file system path or an URL to an online PNG.
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
# dockutil variables
addToDock="1" # with dockutil after installation (0 if not)
appPath="/Applications/$name.app"
# Other variables
dialog_command_file="/var/tmp/dialog.log"
dialogApp="/Library/Application Support/Dialog/Dialog.app"
dockutil="/usr/local/bin/dockutil"
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 10.0.2 : Improved icon checks and failovers
# v. 10.0.1 : github-functions added. Improved appIcon handling. Can add the app to Dock using dockutil.
# v. 10.0 : Integration with Dialog and Installomator v. 10
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
dialogUpdate() {
# $1: dialog command
local dcommand="$1"
if [[ -n $dialog_command_file ]]; then
echo "$dcommand" >> "$dialog_command_file"
echo "Dialog: $dcommand"
fi
}
checkCmdOutput () {
# $1: cmdOutput
local cmdOutput="$1"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
}
# Check the currently logged in user
currentUser=$(stat -f "%Su" /dev/console)
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
exit 97
fi
# Get the current user's UID for dockutil
uid=$(id -u "$currentUser")
# Find the home folder of the user
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Mark: Installation begins
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
installomatorNotify="NOTIFY=all"
else
installomatorNotify="NOTIFY=silent"
# check for Swift Dialog
if [[ ! -d $dialogApp ]]; then
echo "Cannot find dialog at $dialogApp"
# Install using Installlomator
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
# Configure and display swiftDialog
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
message="Installing ${itemName}"
else
message="Installing ${item}"
fi
echo "$item $itemName"
#Check icon (expecting beginning with “http” to be web-link and “/” to be disk file)
echo "icon before check: $icon"
if [[ "$(echo ${icon} | grep -iE "^(http|ftp).*")" != "" ]]; then
echo "icon looks to be web-link"
if ! curl -sfL --output /dev/null -r 0-0 "${icon}" ; then
echo "ERROR: Cannot download link. Reset icon."
icon=""
fi
elif [[ "$(echo ${icon} | grep -iE "^\/.*")" != "" ]]; then
echo "icon looks to be a file"
if [[ ! -a "${icon}" ]]; then
echo "ERROR: Cannot find file. Reset icon."
icon=""
fi
else
echo "ERROR: Cannot figure out icon. Reset icon."
icon=""
fi
echo "icon after first check: $icon"
# If no icon defined we are trying to search for installed app icon
if [[ "$icon" == "" ]]; then
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
appIcon="${appIcon}.icns"
fi
icon="${appPath}/Contents/Resources/${appIcon}"
echo "Icon before file check: ${icon}"
if [ ! -f "${icon}" ]; then
# Using LOGO variable to show logo in swiftDialog
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
icon="${LOGO_PATH}"
fi
fi
echo "LOGO: $LOGO"
echo "icon: ${icon}"
# display first screen
open -a "$dialogApp" --args \
--title none \
--icon "$icon" \
--message "$message" \
--mini \
--progress 100 \
--position bottomright \
--movable \
--commandfile "$dialog_command_file"
# give everything a moment to catch up
sleep 0.1
fi
# Install software using Installomator with valuesfromarguments
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
name=${name} \
type=${type} \
packageID=${packageID} \
downloadURL=\"$downloadURL\" \
appNewVersion=${appNewVersion} \
versionKey=${versionKey} \
expectedTeamID=${expectedTeamID} \
${installomatorOptions} ${installomatorNotify} || true)"
checkCmdOutput $cmdOutput
# Mark: dockutil stuff
if [[ $addToDock -eq 1 ]]; then
dialogUpdate "progresstext: Adding to Dock"
if [[ ! -d $dockutil ]]; then
echo "Cannot find dockutil at $dockutil, trying installation"
# Install using Installlomator
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
echo "Adding to Dock"
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
sleep 1
else
echo "Not adding to Dock."
fi
# Mark: Ending
if [[ $installomatorVersion -lt 10 ]]; then
echo "Again skipping Dialog stuff."
else
# close and quit dialog
dialogUpdate "progress: complete"
dialogUpdate "progresstext: Done"
# pause a moment
sleep 0.5
dialogUpdate "quit:"
# let everything catch up
sleep 0.5
# just to be safe
#killall "Dialog" 2>/dev/null || true
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,293 @@
#!/bin/sh
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
# Installation of software using `valuesfromarguments` to install a custom software using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
#item="" # enter the software to install (if it has a label in future version of Installomator)
# Variables for label
name="ClickShare"
type="appInDmgInZip"
packageID=""
downloadURL="https://www.barco.com$( curl -fs "https://www.barco.com/en/clickshare/app" | grep -A6 -i "macos" | grep -i "FileNumber" | tr '"' "\n" | grep -i "FileNumber" )"
appNewVersion="$(eval "$( echo $downloadURL | sed -E 's/.*(MajorVersion.*BuildVersion=[0-9]*).*/\1/' | sed 's/&amp//g' )" ; ((MajorVersion++)) ; ((MajorVersion--)); ((MinorVersion++)) ; ((MinorVersion--)); ((PatchVersion++)) ; ((PatchVersion--)); ((BuildVersion++)) ; ((BuildVersion--)); echo "${MajorVersion}.${MinorVersion}.${PatchVersion}-b${BuildVersion}")"
versionKey=""
expectedTeamID="P6CDJZR997"
# Dialog icon
icon=""
# icon should be a file system path or an URL to an online PNG.
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
# dockutil variables
addToDock="1" # with dockutil after installation (0 if not)
appPath="/Applications/$name.app"
# Other variables
dialog_command_file="/var/tmp/dialog.log"
dialogApp="/Library/Application Support/Dialog/Dialog.app"
dockutil="/usr/local/bin/dockutil"
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 10.0.2 : Improved icon checks and failovers
# v. 10.0.1 : Improved appIcon handling. Can add the app to Dock using dockutil
# v. 10.0 : Integration with Dialog and Installomator v. 10
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
dialogUpdate() {
# $1: dialog command
local dcommand="$1"
if [[ -n $dialog_command_file ]]; then
echo "$dcommand" >> "$dialog_command_file"
echo "Dialog: $dcommand"
fi
}
checkCmdOutput () {
# $1: cmdOutput
local cmdOutput="$1"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
}
# Check the currently logged in user
currentUser=$(stat -f "%Su" /dev/console)
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
exit 97
fi
# Get the current user's UID for dockutil
uid=$(id -u "$currentUser")
# Find the home folder of the user
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Mark: Installation begins
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
installomatorNotify="NOTIFY=all"
else
installomatorNotify="NOTIFY=silent"
# check for Swift Dialog
if [[ ! -d $dialogApp ]]; then
echo "Cannot find dialog at $dialogApp"
# Install using Installlomator
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
# Configure and display swiftDialog
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
message="Installing ${itemName}"
else
message="Installing ${item}"
fi
echo "$item $itemName"
#Check icon (expecting beginning with “http” to be web-link and “/” to be disk file)
echo "icon before check: $icon"
if [[ "$(echo ${icon} | grep -iE "^(http|ftp).*")" != "" ]]; then
echo "icon looks to be web-link"
if ! curl -sfL --output /dev/null -r 0-0 "${icon}" ; then
echo "ERROR: Cannot download link. Reset icon."
icon=""
fi
elif [[ "$(echo ${icon} | grep -iE "^\/.*")" != "" ]]; then
echo "icon looks to be a file"
if [[ ! -a "${icon}" ]]; then
echo "ERROR: Cannot find file. Reset icon."
icon=""
fi
else
echo "ERROR: Cannot figure out icon. Reset icon."
icon=""
fi
echo "icon after first check: $icon"
# If no icon defined we are trying to search for installed app icon
if [[ "$icon" == "" ]]; then
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
appIcon="${appIcon}.icns"
fi
icon="${appPath}/Contents/Resources/${appIcon}"
echo "Icon before file check: ${icon}"
if [ ! -f "${icon}" ]; then
# Using LOGO variable to show logo in swiftDialog
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
icon="${LOGO_PATH}"
fi
fi
echo "LOGO: $LOGO"
echo "icon: ${icon}"
# display first screen
open -a "$dialogApp" --args \
--title none \
--icon "$icon" \
--message "$message" \
--mini \
--progress 100 \
--position bottomright \
--movable \
--commandfile "$dialog_command_file"
# give everything a moment to catch up
sleep 0.1
fi
# Install software using Installomator with valuesfromarguments
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
name=${name} \
type=${type} \
packageID=${packageID} \
downloadURL=\"$downloadURL\" \
appNewVersion=${appNewVersion} \
versionKey=${versionKey} \
expectedTeamID=${expectedTeamID} \
${installomatorOptions} ${installomatorNotify} || true)"
checkCmdOutput $cmdOutput
# Mark: dockutil stuff
if [[ $addToDock -eq 1 ]]; then
dialogUpdate "progresstext: Adding to Dock"
if [[ ! -d $dockutil ]]; then
echo "Cannot find dockutil at $dockutil, trying installation"
# Install using Installlomator
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
echo "Adding to Dock"
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
sleep 1
else
echo "Not adding to Dock."
fi
# Mark: Ending
if [[ $installomatorVersion -lt 10 ]]; then
echo "Again skipping Dialog stuff."
else
# close and quit dialog
dialogUpdate "progress: complete"
dialogUpdate "progresstext: Done"
# pause a moment
sleep 0.5
dialogUpdate "quit:"
# let everything catch up
sleep 0.5
# just to be safe
#killall "Dialog" 2>/dev/null || true
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,275 @@
#!/bin/sh
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="" # enter the software to install
# Examples: brave, duckduckgo, firefoxpkg, googlechromepkg, microsoftedge, opera
# Dialog icon
icon=""
# icon should be a file system path or an URL to an online PNG.
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
# dockutil variables
addToDock="1" # with dockutil after installation (0 if not)
appPath="/Applications/Firefox.app"
# Other variables
dialog_command_file="/var/tmp/dialog.log"
dialogApp="/Library/Application Support/Dialog/Dialog.app"
dockutil="/usr/local/bin/dockutil"
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user_then_quit DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 10.0.2 : Improved icon checks and failovers
# v. 10.0.1 : Improved appIcon handling. Can add the app to Dock using dockutil
# v. 10.0 : Integration with Dialog and Installomator v. 10
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
dialogUpdate() {
# $1: dialog command
local dcommand="$1"
if [[ -n $dialog_command_file ]]; then
echo "$dcommand" >> "$dialog_command_file"
echo "Dialog: $dcommand"
fi
}
checkCmdOutput () {
# $1: cmdOutput
local cmdOutput="$1"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
}
# Check the currently logged in user
currentUser=$(stat -f "%Su" /dev/console)
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
exit 97
fi
# Get the current user's UID for dockutil
uid=$(id -u "$currentUser")
# Find the home folder of the user
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Mark: Installation begins
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
installomatorNotify="NOTIFY=all"
else
installomatorNotify="NOTIFY=silent"
# check for Swift Dialog
if [[ ! -d $dialogApp ]]; then
echo "Cannot find dialog at $dialogApp"
# Install using Installlomator
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
# Configure and display swiftDialog
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
message="Installing ${itemName}"
else
message="Installing ${item}"
fi
echo "$item $itemName"
#Check icon (expecting beginning with “http” to be web-link and “/” to be disk file)
echo "icon before check: $icon"
if [[ "$(echo ${icon} | grep -iE "^(http|ftp).*")" != "" ]]; then
echo "icon looks to be web-link"
if ! curl -sfL --output /dev/null -r 0-0 "${icon}" ; then
echo "ERROR: Cannot download link. Reset icon."
icon=""
fi
elif [[ "$(echo ${icon} | grep -iE "^\/.*")" != "" ]]; then
echo "icon looks to be a file"
if [[ ! -a "${icon}" ]]; then
echo "ERROR: Cannot find file. Reset icon."
icon=""
fi
else
echo "ERROR: Cannot figure out icon. Reset icon."
icon=""
fi
echo "icon after first check: $icon"
# If no icon defined we are trying to search for installed app icon
if [[ "$icon" == "" ]]; then
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
appIcon="${appIcon}.icns"
fi
icon="${appPath}/Contents/Resources/${appIcon}"
echo "Icon before file check: ${icon}"
if [ ! -f "${icon}" ]; then
# Using LOGO variable to show logo in swiftDialog
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
icon="${LOGO_PATH}"
fi
fi
echo "LOGO: $LOGO"
echo "icon: ${icon}"
# display first screen
open -a "$dialogApp" --args \
--title none \
--icon "$icon" \
--message "$message" \
--mini \
--progress 100 \
--position bottomright \
--movable \
--commandfile "$dialog_command_file"
# give everything a moment to catch up
sleep 0.1
fi
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
checkCmdOutput $cmdOutput
# Mark: dockutil stuff
if [[ $addToDock -eq 1 ]]; then
dialogUpdate "progresstext: Adding to Dock"
if [[ ! -d $dockutil ]]; then
echo "Cannot find dockutil at $dockutil, trying installation"
# Install using Installlomator
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
echo "Adding to Dock"
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
sleep 1
else
echo "Not adding to Dock."
fi
# Mark: Ending
if [[ $installomatorVersion -lt 10 ]]; then
echo "Again skipping Dialog stuff."
else
# close and quit dialog
dialogUpdate "progress: complete"
dialogUpdate "progresstext: Done"
# pause a moment
sleep 0.5
dialogUpdate "quit:"
# let everything catch up
sleep 0.5
# just to be safe
#killall "Dialog" 2>/dev/null || true
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,278 @@
#!/bin/sh
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="microsoftoffice365" # enter the software to install
# Examples: microsoftofficebusinesspro, microsoftoffice365
# Dialog icon
icon=""
# icon should be a file system path or an URL to an online PNG.
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
# dockutil variables
addToDock="1" # with dockutil after installation (0 if not)
appPaths=("/Applications/Microsoft Outlook.app" "/Applications/Microsoft Word.app" "/Applications/Microsoft Excel.app" "/Applications/Microsoft PowerPoint.app" "/Applications/Microsoft OneNote.app")
# Other variables
dialog_command_file="/var/tmp/dialog.log"
dialogApp="/Library/Application Support/Dialog/Dialog.app"
dockutil="/usr/local/bin/dockutil"
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 10.0.2 : Improved icon checks and failovers
# v. 10.0.1 : Improved appIcon handling. Can add the app to Dock using dockutil
# v. 10.0 : Integration with Dialog and Installomator v. 10
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
dialogUpdate() {
# $1: dialog command
local dcommand="$1"
if [[ -n $dialog_command_file ]]; then
echo "$dcommand" >> "$dialog_command_file"
echo "Dialog: $dcommand"
fi
}
checkCmdOutput () {
# $1: cmdOutput
local cmdOutput="$1"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
}
# Check the currently logged in user
currentUser=$(stat -f "%Su" /dev/console)
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
exit 97
fi
# Get the current user's UID for dockutil
uid=$(id -u "$currentUser")
# Find the home folder of the user
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Mark: Installation begins
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
installomatorNotify="NOTIFY=all"
else
installomatorNotify="NOTIFY=silent"
# check for Swift Dialog
if [[ ! -d $dialogApp ]]; then
echo "Cannot find dialog at $dialogApp"
# Install using Installlomator
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
# Configure and display swiftDialog
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
message="Installing ${itemName}"
else
message="Installing ${item}"
fi
echo "$item $itemName"
#Check icon (expecting beginning with “http” to be web-link and “/” to be disk file)
echo "icon before check: $icon"
if [[ "$(echo ${icon} | grep -iE "^(http|ftp).*")" != "" ]]; then
echo "icon looks to be web-link"
if ! curl -sfL --output /dev/null -r 0-0 "${icon}" ; then
echo "ERROR: Cannot download link. Reset icon."
icon=""
fi
elif [[ "$(echo ${icon} | grep -iE "^\/.*")" != "" ]]; then
echo "icon looks to be a file"
if [[ ! -a "${icon}" ]]; then
echo "ERROR: Cannot find file. Reset icon."
icon=""
fi
else
echo "ERROR: Cannot figure out icon. Reset icon."
icon=""
fi
echo "icon after first check: $icon"
# If no icon defined we are trying to search for installed app icon
if [[ "$icon" == "" ]]; then
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
appIcon="${appIcon}.icns"
fi
icon="${appPath}/Contents/Resources/${appIcon}"
echo "Icon before file check: ${icon}"
if [ ! -f "${icon}" ]; then
# Using LOGO variable to show logo in swiftDialog
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
icon="${LOGO_PATH}"
fi
fi
echo "LOGO: $LOGO"
echo "icon: ${icon}"
# display first screen
open -a "$dialogApp" --args \
--title none \
--icon "$icon" \
--message "$message" \
--mini \
--progress 100 \
--position bottomright \
--movable \
--commandfile "$dialog_command_file"
# give everything a moment to catch up
sleep 0.1
fi
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
checkCmdOutput $cmdOutput
# Mark: dockutil stuff
if [[ $addToDock -eq 1 ]]; then
dialogUpdate "progresstext: Adding to Dock"
if [[ ! -d $dockutil ]]; then
echo "Cannot find dockutil at $dockutil, trying installation"
# Install using Installlomator
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
echo "Adding to Dock"
for appPath in "${appPaths[@]}"; do
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" --no-restart || true
done
$dockutil --add "/AppThatDoesNotExistAnywhereOnDiskButMakingDockutilRestartTheDock" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
sleep 1
else
echo "Not adding to Dock."
fi
# Mark: Ending
if [[ $installomatorVersion -lt 10 ]]; then
echo "Again skipping Dialog stuff."
else
# close and quit dialog
dialogUpdate "progress: complete"
dialogUpdate "progresstext: Done"
# pause a moment
sleep 0.5
dialogUpdate "quit:"
# let everything catch up
sleep 0.5
# just to be safe
#killall "Dialog" 2>/dev/null || true
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,272 @@
#!/bin/sh
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="" # enter the software to install
# Examples: adobecreativeclouddesktop, canva, cyberduck, handbrake, inkscape, textmate, vlc
# Dialog icon
icon=""
# icon should be a file system path or an URL to an online PNG, so beginning with either “/” or “http”.
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
# dockutil variables
addToDock="0" # with dockutil after installation (0 if not)
appPath="/Applications/Cyberduck.app"
# Other variables
dialog_command_file="/var/tmp/dialog.log"
dialogApp="/Library/Application Support/Dialog/Dialog.app"
dockutil="/usr/local/bin/dockutil"
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 10.0.2 : Improved icon checks and failovers
# v. 10.0.1 : Improved appIcon handling. Can add the app to Dock using dockutil
# v. 10.0 : Integration with Dialog and Installomator v. 10
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
dialogUpdate() {
# $1: dialog command
local dcommand="$1"
if [[ -n $dialog_command_file ]]; then
echo "$dcommand" >> "$dialog_command_file"
echo "Dialog: $dcommand"
fi
}
checkCmdOutput () {
# $1: cmdOutput
local cmdOutput="$1"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
}
# Check the currently logged in user
currentUser=$(stat -f "%Su" /dev/console)
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
exit 97
fi
# Get the current user's UID for dockutil
uid=$(id -u "$currentUser")
# Find the home folder of the user
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Mark: Installation begins
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
installomatorNotify="NOTIFY=all"
else
installomatorNotify="NOTIFY=silent"
# check for Swift Dialog
if [[ ! -d $dialogApp ]]; then
echo "Cannot find dialog at $dialogApp"
# Install using Installlomator
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
# Configure and display swiftDialog
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
message="Installing ${itemName}"
else
message="Installing ${item}"
fi
echo "$item $itemName"
#Check icon (expecting beginning with “http” to be web-link and “/” to be disk file)
echo "icon before check: $icon"
if [[ "$(echo ${icon} | grep -iE "^(http|ftp).*")" != "" ]]; then
echo "icon looks to be web-link"
if ! curl -sfL --output /dev/null -r 0-0 "${icon}" ; then
echo "ERROR: Cannot download link. Reset icon."
icon=""
fi
elif [[ "$(echo ${icon} | grep -iE "^\/.*")" != "" ]]; then
echo "icon looks to be a file"
if [[ ! -a "${icon}" ]]; then
echo "ERROR: Cannot find file. Reset icon."
icon=""
fi
else
echo "ERROR: Cannot figure out icon. Reset icon."
icon=""
fi
echo "icon after first check: $icon"
# If no icon defined we are trying to search for installed app icon
if [[ "$icon" == "" ]]; then
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
appIcon="${appIcon}.icns"
fi
icon="${appPath}/Contents/Resources/${appIcon}"
echo "Icon before file check: ${icon}"
if [ ! -f "${icon}" ]; then
# Using LOGO variable to show logo in swiftDialog
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
icon="${LOGO_PATH}"
fi
fi
echo "LOGO: $LOGO"
echo "icon: ${icon}"
# display first screen
open -a "$dialogApp" --args \
--title none \
--icon "$icon" \
--message "$message" \
--mini \
--progress 100 \
--position bottomright \
--movable \
--commandfile "$dialog_command_file"
# give everything a moment to catch up
sleep 0.1
fi
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
checkCmdOutput $cmdOutput
# Mark: dockutil stuff
if [[ $addToDock -eq 1 ]]; then
dialogUpdate "progresstext: Adding to Dock"
if [[ ! -d $dockutil ]]; then
echo "Cannot find dockutil at $dockutil, trying installation"
# Install using Installlomator
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
echo "Adding to Dock"
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
sleep 1
else
echo "Not adding to Dock."
fi
# Mark: Ending
if [[ $installomatorVersion -lt 10 ]]; then
echo "Again skipping Dialog stuff."
else
# close and quit dialog
dialogUpdate "progress: complete"
dialogUpdate "progresstext: Done"
# pause a moment
sleep 0.5
dialogUpdate "quit:"
# let everything catch up
sleep 0.5
# just to be safe
#killall "Dialog" 2>/dev/null || true
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,275 @@
#!/bin/sh
# Installation using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="" # enter the software to install
# Examples: applenyfonts, applesfarabic, applesfcompact, applesfmono, applesfpro, applesfsymbols, desktoppr, dialog, dockutil, knockknock, lulu, nomad, nudge, shield, supportapp, wordservice, xcreds, xink
# Dialog icon
icon=""
# icon should be a file system path or an URL to an online PNG.
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
# dockutil variables
addToDock="1" # with dockutil after installation (0 if not)
appPath="/Applications/Xink.app"
# Other variables
dialog_command_file="/var/tmp/dialog.log"
dialogApp="/Library/Application Support/Dialog/Dialog.app"
dockutil="/usr/local/bin/dockutil"
installomatorOptions="BLOCKING_PROCESS_ACTION=ignore NOTIFY=silent DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 10.0.2 : Improved icon checks and failovers
# v. 10.0.1 : Can add the app to Dock using dockutil
# v. 10.0 : Integration with Dialog and Installomator v. 10
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
dialogUpdate() {
# $1: dialog command
local dcommand="$1"
if [[ -n $dialog_command_file ]]; then
echo "$dcommand" >> "$dialog_command_file"
echo "Dialog: $dcommand"
fi
}
checkCmdOutput () {
# $1: cmdOutput
local cmdOutput="$1"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
}
# Check the currently logged in user
currentUser=$(stat -f "%Su" /dev/console)
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
exit 97
fi
# Get the current user's UID for dockutil
uid=$(id -u "$currentUser")
# Find the home folder of the user
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Mark: Installation begins
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
installomatorNotify="NOTIFY=all"
else
installomatorNotify="NOTIFY=silent"
# check for Swift Dialog
if [[ ! -d $dialogApp ]]; then
echo "Cannot find dialog at $dialogApp"
# Install using Installlomator
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
# Configure and display swiftDialog
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
message="Installing ${itemName}"
else
message="Installing ${item}"
fi
echo "$item $itemName"
#Check icon (expecting beginning with “http” to be web-link and “/” to be disk file)
echo "icon before check: $icon"
if [[ "$(echo ${icon} | grep -iE "^(http|ftp).*")" != "" ]]; then
echo "icon looks to be web-link"
if ! curl -sfL --output /dev/null -r 0-0 "${icon}" ; then
echo "ERROR: Cannot download link. Reset icon."
icon=""
fi
elif [[ "$(echo ${icon} | grep -iE "^\/.*")" != "" ]]; then
echo "icon looks to be a file"
if [[ ! -a "${icon}" ]]; then
echo "ERROR: Cannot find file. Reset icon."
icon=""
fi
else
echo "ERROR: Cannot figure out icon. Reset icon."
icon=""
fi
echo "icon after first check: $icon"
# If no icon defined we are trying to search for installed app icon
if [[ "$icon" == "" ]]; then
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
appIcon="${appIcon}.icns"
fi
icon="${appPath}/Contents/Resources/${appIcon}"
echo "Icon before file check: ${icon}"
if [ ! -f "${icon}" ]; then
# Using LOGO variable to show logo in swiftDialog
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
icon="${LOGO_PATH}"
fi
fi
echo "LOGO: $LOGO"
echo "icon: ${icon}"
# display first screen
open -a "$dialogApp" --args \
--title none \
--icon "$icon" \
--message "$message" \
--mini \
--progress 100 \
--position bottomright \
--movable \
--commandfile "$dialog_command_file"
# give everything a moment to catch up
sleep 0.1
fi
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
checkCmdOutput $cmdOutput
# Mark: dockutil stuff
if [[ $addToDock -eq 1 ]]; then
dialogUpdate "progresstext: Adding to Dock"
if [[ ! -d $dockutil ]]; then
echo "Cannot find dockutil at $dockutil, trying installation"
# Install using Installlomator
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
checkCmdOutput $cmdOutput
fi
echo "Adding to Dock"
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
sleep 1
else
echo "Not adding to Dock."
fi
# Mark: Ending
if [[ $installomatorVersion -lt 10 ]]; then
echo "Again skipping Dialog stuff."
else
# close and quit dialog
dialogUpdate "progress: complete"
dialogUpdate "progresstext: Done"
# pause a moment
sleep 0.5
dialogUpdate "quit:"
# let everything catch up
sleep 0.5
# just to be safe
#killall "Dialog" 2>/dev/null || true
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

98
MDM/App-install/App VFA.sh Executable file
View File

@@ -0,0 +1,98 @@
#!/bin/sh
# Installation using Installomator
# Installation of software using valuesfromarguments to install a custom software using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
#item="" # enter the software to install (if it has a label in future version of Installomator)
# Variables for label
name="ClickShare"
type="appInDmgInZip"
packageID=""
downloadURL="https://www.barco.com$( curl -fs "https://www.barco.com/en/clickshare/app" | grep -A6 -i "macos" | grep -i "FileNumber" | tr '"' "\n" | grep -i "FileNumber" )"
appNewVersion="$(eval "$( echo $downloadURL | sed -E 's/.*(MajorVersion.*BuildVersion=[0-9]*).*/\1/' | sed 's/&amp//g' )" ; ((MajorVersion++)) ; ((MajorVersion--)); ((MinorVersion++)) ; ((MinorVersion--)); ((PatchVersion++)) ; ((PatchVersion--)); ((BuildVersion++)) ; ((BuildVersion--)); echo "${MajorVersion}.${MinorVersion}.${PatchVersion}-b${BuildVersion}")"
versionKey=""
expectedTeamID="P6CDJZR997"
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user LOGGING=INFO NOTIFY=all" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "what" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $what"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator with valuesfromarguments
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
name=\"${name}\" \
type=${type} \
packageID=${packageID} \
downloadURL=\"$downloadURL\" \
appNewVersion=${appNewVersion} \
versionKey=${versionKey} \
expectedTeamID=${expectedTeamID} \
blockingProcesses=\"NONE\" \
${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${what} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${what}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,79 @@
#!/bin/sh
# Installation using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="firefoxpkg" # enter the software to install
# Examples: brave, duckduckgo, firefoxpkg, googlechromepkg, microsoftedge, opera
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user_then_quit" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,79 @@
#!/bin/sh
# Installation using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="" # enter the software to install
# Examples: brave, duckduckgo, firefoxpkg, googlechromepkg, microsoftedge, opera
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user_then_quit NOTIFY=all" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "what" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $what"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${what} LOGO=$LOGO ${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${what} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${what}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,79 @@
#!/bin/sh
# Installation using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="" # enter the software to install
# Examples: adobecreativeclouddesktop, textmate, vlc
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,80 @@
#!/bin/sh
# Installation using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="" # enter the software to install
# Examples: adobecreativeclouddesktop, canva, cyberduck, handbrake, inkscape, textmate, vlc
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,79 @@
#!/bin/sh
# Installation using Installomator
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="dockutil" # enter the software to install
# Examples: applenyfonts, applesfarabic, applesfcompact, applesfmono, applesfpro, applesfsymbols, desktoppr, dialog, dockutil, knockknock, lulu, nomad, nudge, shield, supportapp, wordservice, xcreds, xink
installomatorOptions="BLOCKING_PROCESS_ACTION=ignore NOTIFY=silent" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -1,193 +0,0 @@
#!/bin/zsh
# Installation using Installomator
whatList="microsoftteams microsoftyammer firefox bravebrowser cyberduck vlc signal" # enter the software to install separated with spaces
# To be used as a script sent out from a MDM.
# Fill the variable "whatList" above with labels separated by space " ".
# Script will loop through these labels.
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
######################################################################
# Parameters for reinstall/initial install (owner root:wheel):
# "BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes SYSTEMOWNER=1"
# Parameters for Self Service installed app:
# "BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all"
# Parameters for security important apps, like browsers (run automaticaly every day):
# "BLOCKING_PROCESS_ACTION=tell_user_then_kill"
# Update of service apps (run automatically):
# "BLOCKING_PROCESS_ACTION=quit_kill NOTIFY=silent"
parameters="BLOCKING_PROCESS_ACTION=tell_user NOTIFY=all"
######################################################################
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Count errors
errorCount=0
for what in $whatList; do
#echo $what
# Install software using Installomator
cmdOutput="$(${destFile} ${what} LOGO=$LOGO $parameters LOGGING=WARN || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -ne 0 ]] ; then
echo -e "Error installing ${what}. Exit code ${exitStatus}"
#echo "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
echo "$errorOutput"
let errorCount++
fi
done
echo
echo "Errors: $errorCount"
echo "[$(DATE)][LOG-END]"
caffexit $errorCount
# notify behavior
# NOTIFY=success
# options:
# - success notify the user on success
# - silent no notifications
# - all all notifications (great for Self Service installation)
# behavior when blocking processes are found
# BLOCKING_PROCESS_ACTION=tell_user
# options:
# - ignore continue even when blocking processes are found
# - quit app will be told to quit nicely, if running
# - quit_kill told to quit twice, then it will be killed
# Could be great for service apps, if they do not respawn
# - silent_fail exit script without prompt or installation
# - prompt_user show a user dialog for each blocking process found
# abort after three attempts to quit
# (only if user accepts to quit the apps, otherwise
# the update is cancelled).
# - prompt_user_then_kill
# show a user dialog for each blocking process found,
# attempt to quit two times, kill the process finally
# - prompt_user_loop
# Like prompt-user, but clicking "Not Now", will just wait an hour,
# and then it will ask again.
# WARNING! It might block the MDM agent on the machine, as
# the scripts gets stuct in waiting until the hour has passed,
# possibly blocking for other management actions in this time.
# - tell_user User will be showed a notification about the important update,
# but user is only allowed to quit and continue, and then we
# ask the app to quit.
# - tell_user_then_kill
# Show dialog 2 times, and if the quitting fails, the
# blocking processes will be killed.
# - kill kill process without prompting or giving the user a chance to save
# logo-icon used in dialog boxes if app is blocking
# LOGO=appstore
# options:
# - appstore Icon is Apple App Store (default)
# - jamf JAMF Pro
# - mosyleb Mosyle Business
# - mosylem Mosyle Manager (Education)
# - addigy Addigy
# path can also be set in the command call, and if file exists, it will be used.
# Like 'LOGO="/System/Applications/App\ Store.app/Contents/Resources/AppIcon.icns"'
# (spaces have to be escaped).
# App Store apps handling
# IGNORE_APP_STORE_APPS=no
# options:
# - no If installed app is from App Store (which include VPP installed apps)
# it will not be touched, no matter it's version (default)
# - yes Replace App Store (and VPP) version of app and handle future
# updates using Installomator, even if latest version.
# Shouldnt give any problems for the user in most cases.
# Known bad example: Slack will loose all settings.
# install behavior
# INSTALL=""
# options:
# - When not set, software will only be installed
# if it is newer/different in version
# - force Install even if its the same version
# Re-opening of closed app
# REOPEN="yes"
# options:
# - yes App wil be reopened if it was closed
# - no App not reopened
########################
# Often used labels:
########################
# firefox
# firefox_intl
# brave
# torbrowser
# googlechrome
# netnewswire
# adobereaderdc
# textmate
# cyberduck
# keka
# theunarchiver
# vlc
# handbrake
# inkscape
# signal
# telegram
# whatsapp
# hazel
# devonthink
# teamviewerqs
# zoom
# malwarebytes
# githubdesktop
# sublimetext
# textmate
# visualstudiocode
# microsoftskypeforbusiness
# microsoftteams
# microsoftyammer
# microsoftedgeenterprisestable
# microsoftedgeconsumerstable
# microsoftsharepointplugin
# microsoftdefenderatp
# googledrivefilestream
# cdef
# desktoppr
# supportapp
# xink
# wwdc

View File

@@ -0,0 +1,92 @@
#!/bin/sh
# Update with Installomator if app exist
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="microsoftedge" # enter the software to install
# Examples: brave, duckduckgo, firefoxpkg, googlechromepkg, microsoftedge, opera
appPath="/Applications/Microsoft Edge.app"
# Examples: Microsoft Edge.app, Brave Browser.app, DuckDuckGo.app, Google Chrome.app, Firefox.app, Opera.app
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user_then_quit" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
# Check if app is installed
# We only want this to run if it's already installed
if [ ! -e "${appPath}" ]; then
echo "App not found here:"
echo "${appPath}"
echo "Exiting."
exit 98
fi
echo "${appPath} Found!"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -0,0 +1,92 @@
#!/bin/sh
# Update with Installomator if app exist
LOGO="" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
item="" # enter the software to install
# Examples: cyberduck, handbrake, textmate, vlc
appPath="/Applications/Cyberduck.app"
# Examples: Cyberduck.app, Handbrake.app, Textmate.app, VLC.app
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user" # Separated by space
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
# To be used as a script sent out from a MDM.
# Fill the variable "item" above with a label.
# Script will run this label through Installomator.
######################################################################
# v. 9.2.1 : Better logging handling and installomatorOptions fix.
######################################################################
# Mark: Script
# PATH declaration
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
# Check if app is installed
# We only want this to run if it's already installed
if [ ! -e "${appPath}" ]; then
echo "App not found here:"
echo "${appPath}"
echo "Exiting."
exit 98
fi
echo "${appPath} Found!"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
echo "$warnOutput"
else
echo "ERROR installing ${item}. Exit code ${exitStatus}"
echo "$cmdOutput"
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
#echo "$errorOutput"
fi
echo "[$(DATE)][LOG-END]"
caffexit $exitStatus

View File

@@ -1,43 +0,0 @@
#!/bin/sh
# This script is meant to povide the simplest MDM/management platform agnostic way to install Installomator
# The only requirement is an Internet connection
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Get the URL of the latest PKG From the Installomator GitHub repo
url=$(curl --silent --fail "https://api.github.com/repos/Installomator/Installomator/releases/latest" | awk -F '"' "/browser_download_url/ && /pkg\"/ { print \$4; exit }")
# Expected Team ID of the downloaded PKG
expectedTeamID="JME5BW3F3R"
exitCode=0
# Check for Installomator and install if not found
if [ ! -e "/usr/local/Installomator/Installomator.sh" ]; then
echo "Installomator not found. Installing."
# Create temporary working directory
tempDirectory=$( mktemp -d )
echo "Created working directory '$tempDirectory'"
# Download the installer package
echo "Downloading Installomator package"
curl --location --silent "$url" -o "$tempDirectory/Installomator.pkg"
# Verify the download
teamID=$(spctl -a -vv -t install "$tempDirectory/Installomator.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()')
echo "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
echo "Package verified. Installing package Installomator.pkg"
installer -pkg "$tempDirectory/Installomator.pkg" -target / -verbose
exitCode=$?
else
echo "Package verification failed before package installation could start. Download link may be invalid. Aborting."
exitCode=1
exit $exitCode
fi
# Remove the temporary working directory when done
echo "Deleting working directory '$tempDirectory' and its contents"
rm -Rf "$tempDirectory"
else
echo "Installomator already installed."
fi
exit $exitCode

View File

@@ -0,0 +1,360 @@
#!/bin/sh
# Installomator 1st installation with DEPNotify window (auto installation at enrollment)
instance="" # Name of used instance
LOGO="" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
items=(dialog dockutil microsoftautoupdate supportapp applenyfonts applesfpro applesfmono applesfcompact xink zohoworkdrivetruesync textmate 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
# Remember: dialog dockutil
installomatorOptions="NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore INSTALL=force IGNORE_APP_STORE_APPS=yes LOGGING=REQ"
# DEPNotify display settings, change as desired
title="Installing Apps and other software"
message="Please wait while we download and install the needed software."
endMessage="Installation complete! Please reboot to activate FileVault."
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
######################################################################
# Installomator 1st DEPNotify
#
# Installation using Installomator showing progress with DEPNotify
# Great stand-alone solution if installs are only done using Installomator.
# No customization below…
######################################################################
# This script can be used to install software using Installomator.
# Script will start DEPNotify to display a progress bar.
# Progress bar moves between installations
######################################################################
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
#
# This script made by Søren Theilgaard
# https://github.com/Theile
# Twitter and MacAdmins Slack: @theilgaard
#
# Some functions and code from Installomator:
# https://github.com/Installomator/Installomator
#
######################################################################
scriptVersion="9.5"
# v. 9.5 : 2022-09-21 : change of GitHub download
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
# v. 9.2.1 : 2022-05-30 : Some changes to logging
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
# v. 9.1 : 2022-04-13 : Using INSTALL=force in Label only, so Microsoft labels will not start updating
# v. 9.0.1 : 2022-02-21 : LOGO=addigy, few more "true" lines, and errorOutput on error
# v. 9.0.0 : 2022-02-14 : Updated for Inst. 9.0, Logging improved with printlog
######################################################################
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Check before running
case $LOGO in
addigy|microsoft)
conditionFile="/var/db/.Installomator1stDone"
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
if [ -e "$conditionFile" ]; then
echo "$LOGO setup detected"
echo "$conditionFile exists, so we exit."
exit 0
else
echo "$conditionFile not found, so we continue…"
fi
;;
esac
# Mark: Constants, logging and caffeinate
log_message="$instance: Installomator 1st with DEPNotify, v$scriptVersion"
label="1st-v$scriptVersion"
log_location="/private/var/log/Installomator.log"
printlog(){
timestamp=$(date +%F\ %T)
if [[ "$(whoami)" == "root" ]]; then
echo "$timestamp :: $label : $1" | tee -a $log_location
else
echo "$timestamp :: $label : $1"
fi
}
printlog "[LOG-BEGIN] ${log_message}"
# Internet check
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
printlog "ERROR. No internet connection, we cannot continue."
exit 90
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid" || true
pkill caffeinate || true
printlog "[LOG-END] Status $1"
exit $1
}
# Command-file to DEPNotify
DEPNOTIFY_LOG="/var/tmp/depnotify.log"
# Counters
errorCount=0
countLabels=${#items[@]}
printlog "Total installations: $countLabels"
# Using LOGO variable to specify MDM and shown logo
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
printlog "LOGO: $LOGO - LOGO_PATH: $LOGO_PATH"
# Mark: Functions
printlog "depnotify_command function"
echo "" > $DEPNOTIFY_LOG || true
function depnotify_command(){
printlog "DEPNotify-command: $1"
echo "$1" >> $DEPNOTIFY_LOG || true
}
printlog "startDEPNotify function"
function startDEPNotify() {
currentUser="$(stat -f "%Su" /dev/console)"
currentUserID=$(id -u "$currentUser")
launchctl asuser $currentUserID open -a "/Applications/Utilities/DEPNotify.app/Contents/MacOS/DEPNotify" --args -path "$DEPNOTIFY_LOG" || true # --args -fullScreen
sleep 5
depnotify_command "Command: KillCommandFile:"
depnotify_command "Command: MainTitle: $title"
depnotify_command "Command: Image: $LOGO_PATH"
depnotify_command "Command: MainText: $message"
depnotify_command "Command: Determinate: $countLabels"
}
# Notify the user using AppleScript
printlog "displayDialog function"
function displayDialog(){
currentUser="$(stat -f "%Su" /dev/console)"
currentUserID=$(id -u "$currentUser")
if [[ "$currentUser" != "" ]]; then
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
fi
}
# Mark: Code
name="Installomator"
printlog "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg
gitusername="Installomator"
gitreponame="Installomator"
#printlog "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#printlog "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#printlog "$appNewVersion"
expectedTeamID="JME5BW3F3R"
destFile="/usr/local/Installomator/Installomator.sh"
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
printlog "${destFile} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
printlog "$name not found or version not latest."
printlog "${destFile}"
printlog "Installing version ${appNewVersion} ..."
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
printlog "Created working directory '$tmpDir'"
# Download the installer package
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
printlog "${curlDownload}"
exitCode=1
else
printlog "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
printlog "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
printlog "ERROR. $name package installation failed."
printlog "${pkgInstall}"
exitCode=2
else
printlog "Installing $name package succes."
exitCode=0
fi
else
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
printlog "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
printlog "Download and install of $name succes."
fi
done
# Remove the temporary working directory
printlog "Deleting working directory '$tmpDir' and its contents."
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
printlog "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
printlog "$name version $appNewVersion installed!"
fi
else
printlog "$name version $appNewVersion already found. Perfect!"
fi
# Installing DEPNotify
cmdOutput="$( ${destFile} depnotify LOGO=$LOGO NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore LOGGING=WARN || true )"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
printlog "DEPNotify install result: $exitStatus"
itemName=""
errorLabels=""
((countLabels++))
((countLabels--))
printlog "$countLabels labels to install"
startDEPNotify
for item in "${items[@]}"; do
# Check if DEPNotify is running and try open it if not
if ! pgrep -xq "DEPNotify"; then
startDEPNotify
fi
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
depnotify_command "Status: $itemName installing…"
else
depnotify_command "Status: $item installing…"
fi
printlog "$item $itemName"
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
#cmdOutput="2022-05-19 13:20:45 : REQ : installomator : ################## End Installomator, exit code 0"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
printlog "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
printlog "$warnOutput"
else
printlog "Error installing ${item}. Exit code ${exitStatus}"
#printlog "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
printlog "$errorOutput"
((errorCount++))
errorLabels="$errorLabels ${item}"
fi
((countLabels--))
itemName=""
done
# Mark: Finishing
# Prevent re-run of script if conditionFile is set
if [[ ! -z "$conditionFile" ]]; then
printlog "Touching condition file so script will not run again"
touch "$conditionFile" || true
printlog "$(ls -al "$conditionFile" || true)"
fi
# Show error to user if any
printlog "Errors: $errorCount"
if [[ $errorCount -ne 0 ]]; then
errorMessage="${errorMessage} Total errors: $errorCount"
message="$errorMessage"
displayDialog &
endMessage="$message"
printlog "errorLabels: $errorLabels"
fi
depnotify_command "Command: MainText: $endMessage"
depnotify_command "Command: Quit: $endMessage"
sleep 1
printlog "Remove $(rm -fv $DEPNOTIFY_LOG || true)"
printlog "Ending"
caffexit $errorCount

View File

@@ -0,0 +1,308 @@
#!/bin/sh
# Installomator 1st installation (auto installation at enrollment)
instance="" # Name of used instance
LOGO="" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
items=(dialog dockutil microsoftautoupdate supportapp xink zohoworkdrivetruesync textmate applenyfonts applesfpro applesfmono applesfcompact 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
# Remember: dialog dockutil
installomatorOptions="NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore INSTALL=force IGNORE_APP_STORE_APPS=yes LOGGING=REQ"
# Error message to user if any occur
showError="1" # Show error message if 1 (0 if it should not be shown)
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
######################################################################
# Installomator 1st
#
# Installation using Installomator
# (use separate Progress 1st script to show progress)
# No customization below…
######################################################################
# This script can be used to install software using Installomator.
# Script will display a dialog if any errors happens.
# User is not notified about installations.
######################################################################
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
#
# This script made by Søren Theilgaard
# https://github.com/Theile
# Twitter and MacAdmins Slack: @theilgaard
#
# Some functions and code from Installomator:
# https://github.com/Installomator/Installomator
#
######################################################################
scriptVersion="9.5"
# v. 9.5 : 2022-09-21 : change of GitHub download
# v. 9.4 : 2022-09-14 : Making error message optional. downloadURL can fall back on GitHub API.
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
# v. 9.2.1 : 2022-05-30 : Some changes to logging
# v. 9.2 : 2022-05-19 : Built in installer for Installomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
######################################################################
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Check before running
case $LOGO in
addigy|microsoft)
conditionFile="/var/db/.Installomator1stDone"
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
if [ -e "$conditionFile" ]; then
echo "$LOGO setup detected"
echo "$conditionFile exists, so we exit."
exit 0
else
echo "$conditionFile not found, so we continue…"
fi
;;
esac
# Mark: Constants, logging and caffeinate
log_message="$instance: Installomator 1st, v$scriptVersion"
label="1st-v$scriptVersion"
log_location="/private/var/log/Installomator.log"
printlog(){
timestamp=$(date +%F\ %T)
if [[ "$(whoami)" == "root" ]]; then
echo "$timestamp :: $label : $1" | tee -a $log_location
else
echo "$timestamp :: $label : $1"
fi
}
printlog "[LOG-BEGIN] ${log_message}"
# Internet check
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
printlog "ERROR. No internet connection, we cannot continue."
caffexit 90
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid" || true
pkill caffeinate || true
printlog "[LOG-END] Status $1"
exit $1
}
# Counters
errorCount=0
countLabels=${#items[@]}
printlog "Total installations: $countLabels"
# Using LOGO variable to specify MDM and shown logo
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
printlog "LOGO: $LOGO LOGO_PATH: $LOGO_PATH"
# Mark: Functions
# Notify the user using AppleScript
function displayDialog(){
currentUser="$(stat -f "%Su" /dev/console)"
currentUserID=$(id -u "$currentUser")
if [[ "$currentUser" != "" ]]; then
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
fi
}
# Mark: Code
name="Installomator"
printlog "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg
gitusername="Installomator"
gitreponame="Installomator"
#printlog "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#printlog "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#printlog "$appNewVersion"
expectedTeamID="JME5BW3F3R"
destFile="/usr/local/Installomator/Installomator.sh"
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
printlog "${destFile} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
printlog "$name not found or version not latest."
printlog "${destFile}"
printlog "Installing version ${appNewVersion} ..."
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
printlog "Created working directory '$tmpDir'"
# Download the installer package
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
printlog "${curlDownload}"
exitCode=1
else
printlog "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
printlog "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
printlog "ERROR. $name package installation failed."
printlog "${pkgInstall}"
exitCode=2
else
printlog "Installing $name package succes."
exitCode=0
fi
else
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
printlog "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
printlog "Download and install of $name succes."
fi
done
# Remove the temporary working directory
printlog "Deleting working directory '$tmpDir' and its contents."
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
printlog "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
printlog "$name version $appNewVersion installed!"
fi
else
printlog "$name version $appNewVersion already found. Perfect!"
fi
errorLabels=""
((countLabels++))
((countLabels--))
printlog "$countLabels labels to install"
for item in "${items[@]}"; do
printlog "$item"
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
printlog "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
printlog "$warnOutput"
else
printlog "Error installing ${item}. Exit code ${exitStatus}"
#printlog "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
printlog "$errorOutput"
((errorCount++))
errorLabels="$errorLabels ${item}"
fi
((countLabels--))
itemName=""
done
# Mark: Finishing
# Prevent re-run of script if conditionFile is set
if [[ ! -z "$conditionFile" ]]; then
printlog "Touching condition file so script will not run again"
touch "$conditionFile" || true
printlog "$(ls -al "$conditionFile" || true)"
fi
# Show error to user if any
printlog "Errors: $errorCount"
if [[ $errorCount -ne 0 ]]; then
printlog "ERROR: Display error dialog to user!"
errorMessage="${errorMessage} Total errors: $errorCount"
if [[ $showError -eq 1 ]]; then
message="$errorMessage"
displayDialog &
fi
printlog "errorLabels: $errorLabels"
fi
printlog "Ending"
caffexit $errorCount

View File

@@ -0,0 +1,360 @@
#!/bin/sh
# Installomator 1st installation with DEPNotify window (for self Service deployment)
instance="" # Name of used instance
LOGO="" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
items=(dialog dockutil microsoftautoupdate supportapp applenyfonts applesfpro applesfmono applesfcompact xink zohoworkdrivetruesync textmate 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
# Remember: dialog dockutil
installomatorOptions="NOTIFY=all BLOCKING_PROCESS_ACTION=prompt_user"
# DEPNotify display settings, change as desired
title="Installing Apps and other software"
message="Please wait while we download and install the needed software."
endMessage="Installation complete! Please reboot to activate FileVault."
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
######################################################################
# Installomator 1st DEPNotify
#
# Installation using Installomator showing progress with DEPNotify
# Great stand-alone solution if installs are only done using Installomator.
# No customization below…
######################################################################
# This script can be used to install software using Installomator.
# Script will start DEPNotify to display a progress bar.
# Progress bar moves between installations
######################################################################
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
#
# This script made by Søren Theilgaard
# https://github.com/Theile
# Twitter and MacAdmins Slack: @theilgaard
#
# Some functions and code from Installomator:
# https://github.com/Installomator/Installomator
#
######################################################################
scriptVersion="9.5"
# v. 9.5 : 2022-09-21 : change of GitHub download
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
# v. 9.2.1 : 2022-05-30 : Some changes to logging
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
# v. 9.1 : 2022-04-13 : Using INSTALL=force in Label only, so Microsoft labels will not start updating
# v. 9.0.1 : 2022-02-21 : LOGO=addigy, few more "true" lines, and errorOutput on error
# v. 9.0.0 : 2022-02-14 : Updated for Inst. 9.0, Logging improved with printlog
######################################################################
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Check before running
case $LOGO in
addigy|microsoft)
conditionFile="/var/db/.Installomator1stDone"
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
if [ -e "$conditionFile" ]; then
echo "$LOGO setup detected"
echo "$conditionFile exists, so we exit."
exit 0
else
echo "$conditionFile not found, so we continue…"
fi
;;
esac
# Mark: Constants, logging and caffeinate
log_message="$instance: Installomator 1st with DEPNotify, v$scriptVersion"
label="1st-v$scriptVersion"
log_location="/private/var/log/Installomator.log"
printlog(){
timestamp=$(date +%F\ %T)
if [[ "$(whoami)" == "root" ]]; then
echo "$timestamp :: $label : $1" | tee -a $log_location
else
echo "$timestamp :: $label : $1"
fi
}
printlog "[LOG-BEGIN] ${log_message}"
# Internet check
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
printlog "ERROR. No internet connection, we cannot continue."
exit 90
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid" || true
pkill caffeinate || true
printlog "[LOG-END] Status $1"
exit $1
}
# Command-file to DEPNotify
DEPNOTIFY_LOG="/var/tmp/depnotify.log"
# Counters
errorCount=0
countLabels=${#items[@]}
printlog "Total installations: $countLabels"
# Using LOGO variable to specify MDM and shown logo
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
printlog "LOGO: $LOGO - LOGO_PATH: $LOGO_PATH"
# Mark: Functions
printlog "depnotify_command function"
echo "" > $DEPNOTIFY_LOG || true
function depnotify_command(){
printlog "DEPNotify-command: $1"
echo "$1" >> $DEPNOTIFY_LOG || true
}
printlog "startDEPNotify function"
function startDEPNotify() {
currentUser="$(stat -f "%Su" /dev/console)"
currentUserID=$(id -u "$currentUser")
launchctl asuser $currentUserID open -a "/Applications/Utilities/DEPNotify.app/Contents/MacOS/DEPNotify" --args -path "$DEPNOTIFY_LOG" || true # --args -fullScreen
sleep 5
depnotify_command "Command: KillCommandFile:"
depnotify_command "Command: MainTitle: $title"
depnotify_command "Command: Image: $LOGO_PATH"
depnotify_command "Command: MainText: $message"
depnotify_command "Command: Determinate: $countLabels"
}
# Notify the user using AppleScript
printlog "displayDialog function"
function displayDialog(){
currentUser="$(stat -f "%Su" /dev/console)"
currentUserID=$(id -u "$currentUser")
if [[ "$currentUser" != "" ]]; then
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
fi
}
# Mark: Code
name="Installomator"
printlog "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg
gitusername="Installomator"
gitreponame="Installomator"
#printlog "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#printlog "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#printlog "$appNewVersion"
expectedTeamID="JME5BW3F3R"
destFile="/usr/local/Installomator/Installomator.sh"
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
printlog "${destFile} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
printlog "$name not found or version not latest."
printlog "${destFile}"
printlog "Installing version ${appNewVersion} ..."
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
printlog "Created working directory '$tmpDir'"
# Download the installer package
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
printlog "${curlDownload}"
exitCode=1
else
printlog "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
printlog "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
printlog "ERROR. $name package installation failed."
printlog "${pkgInstall}"
exitCode=2
else
printlog "Installing $name package succes."
exitCode=0
fi
else
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
printlog "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
printlog "Download and install of $name succes."
fi
done
# Remove the temporary working directory
printlog "Deleting working directory '$tmpDir' and its contents."
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
printlog "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
printlog "$name version $appNewVersion installed!"
fi
else
printlog "$name version $appNewVersion already found. Perfect!"
fi
# Installing DEPNotify
cmdOutput="$( ${destFile} depnotify LOGO=$LOGO NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore LOGGING=WARN || true )"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
printlog "DEPNotify install result: $exitStatus"
itemName=""
errorLabels=""
((countLabels++))
((countLabels--))
printlog "$countLabels labels to install"
startDEPNotify
for item in "${items[@]}"; do
# Check if DEPNotify is running and try open it if not
if ! pgrep -xq "DEPNotify"; then
startDEPNotify
fi
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
if [[ "$itemName" != "#" ]]; then
depnotify_command "Status: $itemName installing…"
else
depnotify_command "Status: $item installing…"
fi
printlog "$item $itemName"
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
#cmdOutput="2022-05-19 13:20:45 : REQ : installomator : ################## End Installomator, exit code 0"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
printlog "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
printlog "$warnOutput"
else
printlog "Error installing ${item}. Exit code ${exitStatus}"
#printlog "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
printlog "$errorOutput"
((errorCount++))
errorLabels="$errorLabels ${item}"
fi
((countLabels--))
itemName=""
done
# Mark: Finishing
# Prevent re-run of script if conditionFile is set
if [[ ! -z "$conditionFile" ]]; then
printlog "Touching condition file so script will not run again"
touch "$conditionFile" || true
printlog "$(ls -al "$conditionFile" || true)"
fi
# Show error to user if any
printlog "Errors: $errorCount"
if [[ $errorCount -ne 0 ]]; then
errorMessage="${errorMessage} Total errors: $errorCount"
message="$errorMessage"
displayDialog &
endMessage="$message"
printlog "errorLabels: $errorLabels"
fi
depnotify_command "Command: MainText: $endMessage"
depnotify_command "Command: Quit: $endMessage"
sleep 1
printlog "Remove $(rm -fv $DEPNOTIFY_LOG || true)"
printlog "Ending"
caffexit $errorCount

307
MDM/Installomator 1st SS.sh Executable file
View File

@@ -0,0 +1,307 @@
#!/bin/sh
# Installomator 1st installation (for Self Service deployment)
instance="" # Name of used instance
LOGO="" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
items=(dialog dockutil microsoftautoupdate supportapp applenyfonts applesfpro applesfmono applesfcompact xink zohoworkdrivetruesync textmate 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
# Remember: dialog dockutil
installomatorOptions="NOTIFY=all BLOCKING_PROCESS_ACTION=prompt_user"
# Error message to user if any occur
showError="1" # Show error message if 1 (0 if it should not be shown)
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
######################################################################
# Installomator 1st for Self Service
#
# Installation using Installomator
# No customization below…
######################################################################
# This script can be used to install software using Installomator, where the user activate it in Self Service.
# Script will display a dialog if any errors happens.
# Progress is shown in notifications to the user
######################################################################
# Other installomatorOptions:
# LOGGING=REQ
# LOGGING=DEBUG
# LOGGING=WARN
# BLOCKING_PROCESS_ACTION=ignore
# BLOCKING_PROCESS_ACTION=tell_user
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
# BLOCKING_PROCESS_ACTION=prompt_user
# BLOCKING_PROCESS_ACTION=prompt_user_loop
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
# BLOCKING_PROCESS_ACTION=quit
# BLOCKING_PROCESS_ACTION=kill
# NOTIFY=all
# NOTIFY=success
# NOTIFY=silent
# IGNORE_APP_STORE_APPS=yes
# INSTALL=force
######################################################################
#
# This script made by Søren Theilgaard
# https://github.com/Theile
# Twitter and MacAdmins Slack: @theilgaard
#
# Some functions and code from Installomator:
# https://github.com/Installomator/Installomator
#
######################################################################
scriptVersion="9.5"
# v. 9.5 : 2022-09-21 : change of GitHub download
# v. 9.4 : 2022-09-14 : Making error message optional. downloadURL can fall back on GitHub API.
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
# v. 9.2.1 : 2022-05-30 : Some changes to logging
# v. 9.2 : 2022-05-19 : Built in installer for Installomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
######################################################################
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Check before running
case $LOGO in
addigy|microsoft)
conditionFile="/var/db/.Installomator1stDone"
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
if [ -e "$conditionFile" ]; then
echo "$LOGO setup detected"
echo "$conditionFile exists, so we exit."
exit 0
else
echo "$conditionFile not found, so we continue…"
fi
;;
esac
# Mark: Constants, logging and caffeinate
log_message="$instance: Installomator 1st, v$scriptVersion"
label="1st-v$scriptVersion"
log_location="/private/var/log/Installomator.log"
printlog(){
timestamp=$(date +%F\ %T)
if [[ "$(whoami)" == "root" ]]; then
echo "$timestamp :: $label : $1" | tee -a $log_location
else
echo "$timestamp :: $label : $1"
fi
}
printlog "[LOG-BEGIN] ${log_message}"
# Internet check
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
printlog "ERROR. No internet connection, we cannot continue."
caffexit 90
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid" || true
pkill caffeinate || true
printlog "[LOG-END] Status $1"
exit $1
}
# Counters
errorCount=0
countLabels=${#items[@]}
printlog "Total installations: $countLabels"
# Using LOGO variable to specify MDM and shown logo
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
printlog "LOGO: $LOGO LOGO_PATH: $LOGO_PATH"
# Mark: Functions
# Notify the user using AppleScript
function displayDialog(){
currentUser="$(stat -f "%Su" /dev/console)"
currentUserID=$(id -u "$currentUser")
if [[ "$currentUser" != "" ]]; then
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
fi
}
# Mark: Code
name="Installomator"
printlog "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg
gitusername="Installomator"
gitreponame="Installomator"
#printlog "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#printlog "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#printlog "$appNewVersion"
expectedTeamID="JME5BW3F3R"
destFile="/usr/local/Installomator/Installomator.sh"
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
printlog "${destFile} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
printlog "$name not found or version not latest."
printlog "${destFile}"
printlog "Installing version ${appNewVersion} ..."
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
printlog "Created working directory '$tmpDir'"
# Download the installer package
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
printlog "${curlDownload}"
exitCode=1
else
printlog "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
printlog "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
printlog "ERROR. $name package installation failed."
printlog "${pkgInstall}"
exitCode=2
else
printlog "Installing $name package succes."
exitCode=0
fi
else
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
printlog "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
printlog "Download and install of $name succes."
fi
done
# Remove the temporary working directory
printlog "Deleting working directory '$tmpDir' and its contents."
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
printlog "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
printlog "$name version $appNewVersion installed!"
fi
else
printlog "$name version $appNewVersion already found. Perfect!"
fi
errorLabels=""
((countLabels++))
((countLabels--))
printlog "$countLabels labels to install"
for item in "${items[@]}"; do
printlog "$item"
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
printlog "${item} succesfully installed."
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
printlog "$warnOutput"
else
printlog "Error installing ${item}. Exit code ${exitStatus}"
#printlog "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
printlog "$errorOutput"
((errorCount++))
errorLabels="$errorLabels ${item}"
fi
((countLabels--))
itemName=""
done
# Mark: Finishing
# Prevent re-run of script if conditionFile is set
if [[ ! -z "$conditionFile" ]]; then
printlog "Touching condition file so script will not run again"
touch "$conditionFile" || true
printlog "$(ls -al "$conditionFile" || true)"
fi
# Show error to user if any
printlog "Errors: $errorCount"
if [[ $errorCount -ne 0 ]]; then
printlog "ERROR: Display error dialog to user!"
errorMessage="${errorMessage} Total errors: $errorCount"
if [[ $showError -eq 1 ]]; then
message="$errorMessage"
displayDialog &
fi
printlog "errorLabels: $errorLabels"
fi
printlog "Ending"
caffexit $errorCount

View File

@@ -0,0 +1,13 @@
#!/bin/sh
# Mark: Addigy Condition on condition file
# Install on success
conditionFile="/var/db/.Installomator1stDone"
if [ -e "$conditionFile" ]; then
echo "$conditionFile exists. Exiting."
exit 1
else
echo "$conditionFile not found. Continue…"
exit 0
fi

View File

@@ -0,0 +1,11 @@
#!/bin/sh
# PREVENT Installomator 1st Auto-install from running
# DESCRIPTION
# Will create the file to prevent Installomator 1st Auto-install from running.
# Only for MDM solutions (like Addigy and Microsoft) that have conditions for runnning scripts and do not offer an enrollment event for runnning the script.
# By runninng this script, the file will be created on the client, that will prevent Installomator 1st Auto-install from runnning.
# This is a great help for implementing Installomator 1st Auto-install in a running solution, where the command below have to be run on currently enrolled devices, and then Installomator 1st Auto-install can be assigned to all machines, and will run only on newly enrolled devices.
/usr/bin/touch "/var/db/.Installomator1stDone"

View File

@@ -1,42 +0,0 @@
#!/bin/bash
# Updating Installomator
# Usefull to push out after deployment if earlier version was deployed in DEP profile
what="installomator" # enter the software to install
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Install software using Installomator
cmdOutput="$(${destFile} ${what} LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore NOTIFY=silent LOGGING=req || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo -e "${what} succesfully installed.\n"
else
echo -e "Error installing ${what}. Exit code ${exitStatus}\n"
#echo "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
echo "$errorOutput"
caffexit $exitStatus
fi
echo "[$(DATE)][LOG-END]"
caffexit 0

View File

@@ -0,0 +1,160 @@
#!/bin/zsh
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# MARK: Arguments/Parameters
# Parameter 4: path to the swiftDialog command file
dialog_command_file=${4:-"/var/tmp/dialog.log"}
# Parameter 5: message displayed over the progress bar
message=${5:-"Self Service Progress"}
# Parameter 6: path or URL to an icon
icon=${6:-"/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"}
# see Dan Snelson's advice on how to get a URL to an icon in Self Service
# https://rumble.com/v119x6y-harvesting-self-service-icons.html
# MARK: Constants
dialogApp="/Library/Application Support/Dialog/Dialog.app"
# MARK: Functions
dialogUpdate() {
# $1: dialog command
local dcommand="$1"
if [[ -n $dialog_command_file ]]; then
echo "$dcommand" >> "$dialog_command_file"
echo "Dialog: $dcommand"
fi
}
# MARK: sanity checks
# check minimal macOS requirement
if [[ $(sw_vers -buildVersion ) < "20A" ]]; then
echo "This script requires at least macOS 11 Big Sur."
exit 98
fi
# check we are running as root
if [[ $DEBUG -eq 0 && $(id -u) -ne 0 ]]; then
echo "This script should be run as root"
exit 97
fi
# swiftDialog installation
name="Dialog"
echo "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg w. app version check
gitusername="bartreardon"
gitreponame="swiftDialog"
#echo "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
echo "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#echo "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#echo "$appNewVersion"
expectedTeamID="PWA5E9TQ59"
destFile="/Library/Application Support/Dialog/Dialog.app"
versionKey="CFBundleShortVersionString" #CFBundleVersion
currentInstalledVersion="$(defaults read "${destFile}/Contents/Info.plist" $versionKey || true)"
echo "${name} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
echo "$name not found or version not latest."
echo "${destFile}"
echo "Installing version ${appNewVersion}"
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
echo "Created working directory '$tmpDir'"
# Download the installer package
echo "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
echo "error downloading $downloadURL, with status $curlDownloadStatus"
echo "${curlDownload}"
exitCode=1
else
echo "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
echo "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
echo "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
echo "ERROR. $name package installation failed."
echo "${pkgInstall}"
exitCode=2
else
echo "Installing $name package succes."
exitCode=0
fi
else
echo "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
echo "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
echo "Sleep a bit before trying download and install again. $installationCount time(s)."
echo "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
echo "Download and install of $name succes."
fi
done
# Remove the temporary working directory
echo "Deleting working directory '$tmpDir' and its contents."
echo "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
echo "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
echo "$name version $appNewVersion installed!"
fi
else
echo "$name version $appNewVersion already found. Perfect!"
fi
# check for Swift Dialog
if [[ ! -d $dialogApp ]]; then
echo "Cannot find dialog at $dialogApp"
exit 95
fi
# MARK: Configure and display swiftDialog
# display first screen
open -a "$dialogApp" --args \
--title none \
--icon "$icon" \
--message "$message" \
--mini \
--progress 100 \
--position bottomright \
--movable \
--commandfile "$dialog_command_file"
# give everything a moment to catch up
sleep 0.1

View File

@@ -20,7 +20,7 @@ The different scripts require a set of parameters. We will use the `googlechrome
`00_Prepare_SwiftDialog.sh`
Parameter 4: `/var/tmp/dialog` (Path to the swiftDialog command file)
Parameter 4: `/var/tmp/dialog.log` (Path to the swiftDialog command file)
Parameter 5: `Installing Google Chrome...` (text shown in the swiftDialog window above the progress bar)
@@ -30,7 +30,7 @@ Parameter 6: Path to or URL for an icon in swiftDialog. This can be a path on th
Parameter 4: `googlechromepkg` (the label to install)
Parameter 5: `DIALOG_CMD_FILE=\var\log\dialog.log` (the swiftDialog command file, this has to be the same value as parameter 4 in the previous script)
Parameter 5: `DIALOG_CMD_FILE=/var/tmp/dialog.log` (the swiftDialog command file, this has to be the same value as parameter 4 in the previous script)
Parameter 6: `NOTIFY=silent` (disable Installomator notifications, optional)
@@ -38,7 +38,7 @@ You can add more configurations to the Installomator script when needed.
`zz_Quit_SwiftDialog`
Parameter 4: `/var/log/dialog.log` (the swiftDialog command file, this has to be the same value as parameter 4 in the first script)
Parameter 4: `/var/tmp/dialog.log` (the swiftDialog command file, this has to be the same value as parameter 4 in the first script)
Then setup the remainder of the Jamf Policy to your needs. This works best with Self Service policies.

View File

@@ -1,115 +0,0 @@
#!/bin/zsh
# Specific settings in Addigy to configure Custom Software for installomator.
# Addigy has 3 parts to fill out for this, Installation script, Condition, and Removal steps (see RemoveInstallomator.sh).
# Mark: Installation script
# Just click “Add” to autogenerate the installer script line by clicking the “Add”-button next to the Installer PKG, replace with first line below
/usr/sbin/installer -pkg "/Library/Addigy/ansible/packages/Installomator (9.1.0)/Installomator-9.1.pkg" -target /
# Installation using Installomator
whatList="supportapp xink textmate microsoftedge wwdc keka vlc " # enter the software to installed separated with spaces
# To be used as a script sent out from a MDM.
# Fill the variable "whatList" above with labels separated by space " ".
# Script will loop through these labels and exit with number of errors.
######################################################################
# Parameters for reinstall/initial install (owner root:wheel):
# "BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes SYSTEMOWNER=1"
# Parameters for Self Service installed app:
# "BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all"
# Parameters for security important apps, like browsers (run automaticaly every day):
# "BLOCKING_PROCESS_ACTION=tell_user_then_kill"
# Update of service apps (run automatically):
# "BLOCKING_PROCESS_ACTION=quit_kill NOTIFY=silent"
parameters="BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes"
######################################################################
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Count errors
errorCount=0
for what in $whatList; do
#echo $what
# Install software using Installomator
cmdOutput="$(${destFile} ${what} LOGO=addigy $parameters || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -ne 0 ]] ; then
echo -e "Error installing ${what}. Exit code ${exitStatus}"
#echo "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
echo "$errorOutput"
let errorCount++
fi
done
echo
echo "Errors: $errorCount"
echo "[$(DATE)][LOG-END]"
caffexit $errorCount
# Mark: Conditions
# Install on success
# Remember to fill out the correct “TARGET_VERSION” and “PKG_ID”, and click "Install on succes".
PKG_ID="com.scriptingosx.Installomator"
TARGET_VERSION="9.1"
vercomp () {
if [[ $1 == $2 ]]; then
return 0
fi
local IFS=.
local i ver1=($1) ver2=($2)
# fill empty fields in ver1 with zeros
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
ver1[i]=0
done
for ((i=0; i<${#ver1[@]}; i++)); do
if [[ -z ${ver2[i]} ]]; then
# fill empty fields in ver2 with zeros
ver2[i]=0
fi
if ((10#${ver1[i]} > 10#${ver2[i]})); then
return 1
fi
if ((10#${ver1[i]} < 10#${ver2[i]})); then
return 2
fi
done
return 0
}
INSTALLED_VERSION="$(pkgutil --pkg-info $PKG_ID | grep -i "^version" | awk '{print $2}')"
echo "Current Version: ${INSTALLED_VERSION}"
vercomp ${TARGET_VERSION} ${INSTALLED_VERSION}
COMP=$? # 0 means the same, 1 means TARGET is newer, 2 means INSTALLED is newer
echo "COMPARISON: ${COMP}"
if [ "${COMP}" -eq 1 ]; then
echo "Installed version is older than ${TARGET_VERSION}."
exit 0
else
echo "Installed version is the same or newer than ${TARGET_VERSION}."
exit 1
fi

View File

@@ -1,79 +0,0 @@
PKG_ID="com.scriptingosx.Installomator"
TARGET_VERSION="9.1"
URLDOWNLOAD="%MosyleCDNFile:blah-blah-blah%"
######################################################################
# Installation using Installomator (enter the software to install separated with spaces in the "whatList"-variable)
whatList="handbrake theunarchiver microsoftoffice365"
# Covered by Mosyle Catalog: "brave firefox googlechrome microsoftedge microsoftteams signal sublimetext vlc webex zoom" among others
LOGO="mosyleb" # or "mosylem"
######################################################################
## Mark: Code here
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Mark: Condition for Installomator installation
INSTALLED_VERSION="$(pkgutil --pkg-info $PKG_ID 2>/dev/null | grep -i "^version" | awk '{print $2}')"
echo "Current Version: ${INSTALLED_VERSION}"
if [[ "$TARGET_VERSION" != "$INSTALLED_VERSION" ]]; then
TMPDIR=$(mktemp -d )
if ! cd "$TMPDIR"; then
echo "error changing directory $TMPDIR"
caffexit 98
fi
NAME=$TMPDIR/$(date +%s).pkg
if ! curl -fsL "$URLDOWNLOAD" -o "$NAME"; then
echo "error downloading $URLDOWNLOAD to $NAME."
caffexit 97
fi
installer -pkg "$NAME" -target /
rm -rf "$TMPDIR"
else
echo "Installomator version $INSTALLED_VERSION already installed!"
fi
# Mark: Start Installomator label(s) installation
# Count errors
errorCount=0
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
caffexit 99
fi
for what in $whatList; do
#echo $item
# Install software using Installomator
cmdOutput="$(${destFile} ${what} LOGO=$LOGO NOTIFY=all BLOCKING_PROCESS_ACTION=tell_user || true)" # NOTIFY=silent BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -ne 0 ]] ; then
echo "Error installing ${what}. Exit code ${exitStatus}"
#echo "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
echo "$errorOutput"
let errorCount++
fi
done
echo
echo "Errors: $errorCount"
echo "[$(DATE)][LOG-END]"
caffexit $errorCount

View File

@@ -1,56 +0,0 @@
#!/bin/bash
# Software
# Installation using Installomator
# Example of installing software using valuesfromarguments to install a custom software
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
###############################################
# Verify that Installomator has been installed
destFile="/usr/local/Installomator/Installomator.sh"
if [ ! -e "${destFile}" ]; then
echo "Installomator not found here:"
echo "${destFile}"
echo "Exiting."
exit 99
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid"
pkill caffeinate
exit $1
}
# Variables to calculate
downloadURL="https://craft-assets.invisionapp.com/CraftManager/production/CraftManager.zip"
appNewVersion=$(curl -fs https://craft-assets.invisionapp.com/CraftManager/production/appcast.xml | xpath -e '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f2)
# Install software using Installomator
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
name=CraftManager \
type=zip \
downloadURL=$downloadURL \
appNewVersion=$appNewVersion \
expectedTeamID=VRXQSNCL5W \
BLOCKING_PROCESS_ACTION=prompt_user \
LOGGING=REQ \
NOTIFY=all || true)"
# Check result
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
if [[ ${exitStatus} -eq 0 ]] ; then
echo -e "${what} succesfully installed.\n"
else
echo -e "Error installing ${what}. Exit code ${exitStatus}\n"
#printlog "$cmdOutput"
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
echo "$errorOutput"
caffexit $exitStatus
fi
echo "[$(DATE)][LOG-END]"
caffexit 0

View File

@@ -0,0 +1,13 @@
#!/bin/sh
# Mark: Addigy Condition on condition file
# Install on success
conditionFile="/var/db/.Progress1stDone"
if [ -e "$conditionFile" ]; then
echo "$conditionFile exists. Exiting."
exit 1
else
echo "$conditionFile not found. Continue…"
exit 0
fi

View File

@@ -0,0 +1,11 @@
#!/bin/sh
# PREVENT Progress 1st swiftDialog from running
# DESCRIPTION
# Will create the file to prevent Progress 1st swiftDialog from running.
# Only for MDM solutions (like Addigy and Microsoft) that have conditions for runnning scripts and do not offer an enrollment event for runnning the script.
# By runninng this script, the file will be created on the client, that will prevent Progress 1st swiftDialog from runnning.
# This is a great help for implementing Progress 1st swiftDialog in a running solution, where the command below have to be run on currently enrolled devices, and then Progress 1st swiftDialog can be assigned to all machines, and will run only on newly enrolled devices.
/usr/bin/touch "/var/db/.Progress1stDone"

397
MDM/Progress 1st swiftDialog.sh Executable file
View File

@@ -0,0 +1,397 @@
#!/bin/sh
# Progress 1st with swiftDialog (auto installation at enrollment)
instance="" # Name of used instance
LOGO="" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
apps=(
"swiftDialog,/usr/local/bin/dialog"
"dockutil,/usr/local/bin/dockutil"
"desktoppr,/usr/local/bin/desktoppr"
"SupportApp,/Applications/Support.app"
"Xink,/Applications/Xink.app"
"Apple NewYork Font,/Library/Fonts/NewYork.ttf"
"Apple SF Pro Font,/Library/Fonts/SF-Pro.ttf"
"Apple SF Mono Font,/Library/Fonts/SF-Mono-Bold.otf"
"Apple SF Compact Font,/Library/Fonts/SF-Compact.ttf"
"Zoho WorkDrive TrueSync,/Applications/Zoho WorkDrive TrueSync.app"
"TextMate,/Applications/TextMate.app"
"Sublime Text,/Applications/Sublime Text.app"
"1Password,/Applications/1Password 7.app"
"Mactracker,/Applications/Mactracker.app"
"WWDC,/Applications/WWDC.app"
"The Unarchiver,/Applications/The Unarchiver.app"
"Keka,/Applications/Keka.app"
"Brave,/Applications/Brave Browser.app"
"Firefox,/Applications/Firefox.app"
"Microsoft AutoUpdate,/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app"
"Microsoft Edge,/Applications/Microsoft Edge.app"
"Microsoft Teams,/Applications/Microsoft Teams.app"
"Microsoft Excel,/Applications/Microsoft Excel.app"
"Microsoft OneNote,/Applications/Microsoft OneNote.app"
"Microsoft Outlook,/Applications/Microsoft Outlook.app"
"Microsoft PowerPoint,/Applications/Microsoft PowerPoint.app"
"Microsoft Word,/Applications/Microsoft Word.app"
"Microsoft OneDrive,/Applications/OneDrive.app"
)
# Dialog display settings, change as desired
title="Installing Apps and other software"
message="Please wait while we download and install the needed software."
endMessage="Installation complete! Please reboot to activate FileVault."
displayEndMessageDialog=1 # Should endMessage be shown as a dialog? (0|1)
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
######################################################################
# Progress 1st Dialog
#
# Showing installation progress using swiftDialog
# No customization below…
######################################################################
# Complete script meant for running via MDM on device enrollment. This will download
# and install Dialog on the fly before opening Dialog.
#
# Log: /private/var/log/InstallationProgress.log
# This file prevents script from running again on Addigy and Microsoft Endpoint (Intune):
# "/var/db/.Progress1stDone"
#
# Display a Dialog with a list of applications and indicate when theyve been installed
# Useful when apps are deployed at random, perhaps without local logging.
# Applies to Mosyle App Catalog installs, VPP app installs, Installomator installs etc.
# The script watches the existence of files in the file system, so that is used to show progress.
#
# Requires Dialog v1.9.1 or later (will be installed) https://github.com/bartreardon/swiftDialog
#
######################################################################
#
# This script made by Søren Theilgaard
# https://github.com/Theile
# Twitter and MacAdmins Slack: @theilgaard
#
# Based on the work by Adam Codega:
# https://github.com/acodega/dialog-scripts
#
# Some functions and code from Installomator:
# https://github.com/Installomator/Installomator
#
######################################################################
# List of apps/installs to process in “apps” array.
# Provide the display name as you prefer and the path to the app/file. ex:
# "Google Chrome,/Applications/Google Chrome.app"
# A comma separates the display name from the path. Do not use commas in your display name text.
#
# Tip: Check for something like print drivers using the pkg receipt, like:
# "Konica-Minolta drivers,/var/db/receipts/jp.konicaminolta.print.package.C759.plist"
# Or fonts, like:
# "Apple SF Pro Font,/Library/Fonts/SF-Pro.ttf"
######################################################################
scriptVersion="9.5"
# v. 9.5 : 2022-09-21 : change of GitHub download
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
# v. 9.3 : 2022-08-29 : Logging changed for current version. Improved installation with looping if it fails, so it can try again. Improved GitHub handling.
# v. 9.2.2 : 2022-06-17 : Improved Dialog installation. Check 1.1.1.1 for internet connection.
# v. 9.2 : 2022-05-19 : Not using GitHub api for download of Dialog, show a dialog when finished to make message more important. Now universal script for all supported MDMs based on LOGO variable.
# v. 9.0 : 2022-05-16 : Based on acodegas work, I have added progress bar, changed logging and use another log-location, a bit more error handling for Dialog download, added some "|| true"-endings to some lines to not make them fail in Addigy, and some more.
######################################################################
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Check before running
case $LOGO in
addigy|microsoft)
conditionFile="/var/db/.Progress1stDone"
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
if [ -e "$conditionFile" ]; then
echo "$LOGO setup detected"
echo "$conditionFile exists, so we exit."
exit 0
else
echo "$conditionFile not found, so we continue…"
fi
;;
esac
# Mark: Constants and logging
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
log_message="$instance: Progress 1st with Dialog, v$scriptVersion"
label="P1st-v$scriptVersion"
log_location="/private/var/log/Installomator.log"
function printlog(){
timestamp=$(date +%F\ %T)
if [[ "$(whoami)" == "root" ]]; then
echo "$timestamp :: $label : $1" | tee -a $log_location
else
echo "$timestamp :: $label : $1"
fi
}
printlog "[LOG-BEGIN] ${log_message}"
# Internet check
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
printlog "ERROR. No internet connection, we cannot continue."
exit 90
fi
# Location of dialog and dialog command file
dialogApp="/usr/local/bin/dialog"
dialog_command_file="/var/tmp/dialog.log"
counterFile="/var/tmp/Progress1st.plist"
# Counters
progress_index=0
step_progress=0
defaults write $counterFile step -int 0
progress_total=${#apps[@]}
printlog "Total watched installations: $progress_total"
# Using LOGO variable to specify MDM and shown logo
case $LOGO in
appstore)
# Apple App Store on Mac
if [[ $(sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
;;
jamf)
# Jamf Pro
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
;;
mosyleb)
# Mosyle Business
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
;;
mosylem)
# Mosyle Manager (education)
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
;;
addigy)
# Addigy
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
;;
ws1)
# Workspace ONE (AirWatch)
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
;;
esac
if [[ ! -a "${LOGO_PATH}" ]]; then
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
else
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi
fi
printlog "LOGO: $LOGO LOGO_PATH: $LOGO_PATH"
# Mark: Functions
# execute a dialog command
echo "" > $dialog_command_file || true
function dialog_command(){
printlog "Dialog-command: $1"
echo "$1" >> $dialog_command_file || true
}
function appCheck(){
dialog_command "listitem: $(echo "$app" | cut -d ',' -f1): wait"
while [ ! -e "$(echo "$app" | cut -d ',' -f2)" ]; do
sleep 2
done
dialog_command "progresstext: Install of “$(echo "$app" | cut -d ',' -f1)” complete"
dialog_command "listitem: $(echo "$app" | cut -d ',' -f1): ✅"
progress_index=$(defaults read $counterFile step)
progress_index=$(( progress_index + 1 ))
defaults write $counterFile step -int $progress_index
dialog_command "progress: $progress_index"
printlog "at item number $progress_index"
}
# Notify the user using AppleScript
function displayDialog(){
if [[ "$currentUser" != "" ]]; then
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
fi
}
# Mark: Code
name="Dialog"
printlog "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg w. app version check
gitusername="bartreardon"
gitreponame="swiftDialog"
#printlog "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#printlog "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#printlog "$appNewVersion"
expectedTeamID="PWA5E9TQ59"
destFile="/Library/Application Support/Dialog/Dialog.app"
versionKey="CFBundleShortVersionString" #CFBundleVersion
currentInstalledVersion="$(defaults read "${destFile}/Contents/Info.plist" $versionKey || true)"
printlog "${name} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
printlog "$name not found or version not latest."
printlog "${destFile}"
printlog "Installing version ${appNewVersion}"
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
printlog "Created working directory '$tmpDir'"
# Download the installer package
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
printlog "${curlDownload}"
exitCode=1
else
printlog "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
printlog "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
printlog "ERROR. $name package installation failed."
printlog "${pkgInstall}"
exitCode=2
else
printlog "Installing $name package succes."
exitCode=0
fi
else
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
printlog "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
printlog "Download and install of $name succes."
fi
done
# Remove the temporary working directory
printlog "Deleting working directory '$tmpDir' and its contents."
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
printlog "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
printlog "$name version $appNewVersion installed!"
fi
else
printlog "$name version $appNewVersion already found. Perfect!"
fi
while [ "$(pgrep -l "Setup Assistant")" != "" ]; do
printlog "Setup Assistant Still Running. PID $setupAssistantProcess."
sleep 1
done
printlog "Out of Setup Assistant."
while [ "$(pgrep -l "Finder")" = "" ]; do
printlog "Finder process not found. Assuming device is at login screen. PID $finderProcess"
sleep 1
done
printlog "Finder is running…"
currentUser=$(stat -f "%Su" /dev/console)
currentUserID=$(id -u "$currentUser")
printlog "Logged in user is $currentUser with ID $currentUserID"
# set icon based on whether computer is a desktop or laptop
#hwType=$(system_profiler SPHardwareDataType | grep "Model Identifier" | grep "Book" || true)
#if [ "$hwType" != "" ]; then
# LOGO_PATH="SF=laptopcomputer.and.arrow.down,weight=thin,colour1=#51a3ef,colour2=#5154ef"
#else
# LOGO_PATH="SF=desktopcomputer.and.arrow.down,weight=thin,colour1=#51a3ef,colour2=#5154ef"
#fi
dialogCMD="$dialogApp -p --title \"$title\" \
--message \"$message\" \
--icon \"$LOGO_PATH\" \
--progress $progress_total \
--button1text \"Please Wait\" \
--button1disabled"
# create the list of apps
listitems=""
for app in "${apps[@]}"; do
listitems="$listitems --listitem '$(echo "$app" | cut -d ',' -f1)'"
done
# final command to execute
dialogCMD="$dialogCMD $listitems"
printlog "$dialogCMD"
# Launch dialog and run it in the background sleep for a second to let thing initialise
printlog "About to launch Dialog."
eval "$dialogCMD" &
sleep 2
(for app in "${apps[@]}"; do
#step_progress=$(( 1 + progress_index ))
#dialog_command "progress: $step_progress"
sleep 0.5
appCheck &
done
wait)
# Mark: Finishing
# Prevent re-run of script if conditionFile is set
if [[ ! -z "$conditionFile" ]]; then
printlog "Touching condition file so script will not run again"
touch "$conditionFile" || true
printlog "$(ls -al "$conditionFile" || true)"
fi
# all done. close off processing and enable the "Done" button
printlog "Finalizing."
dialog_command "progresstext: $endMessage"
dialog_command "progress: complete"
dialog_command "button1text: Done"
dialog_command "button1: enable"
if [[ $displayEndMessageDialog -eq 1 ]]; then
message="$endMessage"
displayDialog &
fi
sleep 1
printlog $(rm -fv $dialog_command_file || true)
printlog $(rm -fv $counterFile || true)
printlog "Ending"

83
MDM/README.md Normal file
View File

@@ -0,0 +1,83 @@
# Scripts for use with MDM
These example scripts are meant for use with MDM to run __Installomator__ and process installs. Examples are also included which use swiftDialog to provide user feedback and dockutil to add app icons to the dock.
There are basically two ways to use Installomator with MDM. The _“Jamf way”_ is where, through the MDM admin interface, your upload the Installomator script to a policy, and you provide additional parameters in the policy configuration like which app to install. The _“other way”_ to use Installomator is by having the MDM install Installomator locally on the computer, just once, and then on subsequent runs the MDM runs a script which calls Installomator and provides the parameters.
Examples of MDMs which use the “other way” are Mosyle Manager/Mosyle Business, Addigy, and Microsoft Endpoint Manager (Intune).
The scripts utilizing __swiftDialog__ require version 10 of __Installomator__. If Installomator version 9 is installed, it will set `NOTIFY=all` and use the traditional __Installomator__ notifications for showing progress, where as on version 10 it will be `NOTIFY=silent` as __swiftDialog__ is used instead.
## Abbreviations used in script names
- SS — Self Service — scripts designed for use through a Self Service catalog
- VFA — valuesfromarguments — a custom label call to Installomator. When using an MDM and the "other way", you can use these scripts to provide the label variables to Installomator for custom labels.
## Condition scripts
Scripts with the `condition` suffix are for use with MDMs like Addigy, where a script is run to determine if the rest of the policy should run.
## Prevention scripts
The `Installomator 1st` and `Progress 1st` scripts are meant to run automatically upon device enrollment. They check for the existance of a file, `/var/db/.Installomator1stDone`, to determine whether the computer has already been deployed. You can run the prevention scripts on existing Macs to ensure the 1st scripts won't inadvertently run on them.
## "Jamf" folder
This folder has Jamf specific examples using __swiftDialog__ as part of the Installomator installation. Perfect for use with Jamf Self Service. Separate [ReadMe-file](Jamf/ReadMe.md) in this folder.
# Scripts to install prerequisites
Use these scripts to handle installing Installomator itself. Additionally, you may want to install swiftDialog manually instead of having Installomator install it.
- `install Installomator direct.sh` — can be run at enrollment and as maintenance at any time to install __Installomator__.
- `install swiftDialog direct.sh` — can be used at enrollment and as maintenance at any time to install __swiftDialog__.
Once Installomator has been installed, __dockutil__ can be installed by Installomator, using this script:
- `App-install/App service Auto-install.sh` — This script uses pre-installed installomator to install __dockutil__.
# Enrollment scripts
For enrollment purposes, some 1st-scripts has been created. One runs silently, another is using __DEPNotify__ to show progress and feedback:
- `Installomator 1st Auto-install DEPNotify.sh` — will install __DEPNotify__ first, start that up, and change progress on the installation bar at each installed label. Very good for Addigy an Microsoft.
- `Installomator 1st Auto-install.sh` — runnning silently installing Installomator labels in the given order. Can be used in combination with the Progress-script.
- `Progress 1st swiftDialog.sh` — It will install __swiftDialog__ and start that up with a list of software it will look for. It will look for an installed file/folder in the file system for each item. This is great if some apps are being installed outside of Installomator, like by Apple Apps & Books, and then this script can show when it has been installed.
There are also Self Service versions of the above.
## “App-install”-folder
- App browser-security Auto-install.sh
- App browser-security SS.sh
- App normal Auto-install.sh
- App normal SS.sh
- App service Auto-install.sh
- App VFA.sh
Here you can use scripts for Self Service (SS) or for Auto-install. There will be a difference in how many notifications will be used and maybe handling of blocking processes.
`browser-security`: For an app like a web browser, youll want the install performed right away, so there isnt a deferral option.
`normal`: The user can defer/skip the update.
`service`: These are apps where we dont need to ask the user to allow the update. Menu bar apps and utilities would fall under this category.
## “App-install SS with swiftDialog and dockutil”-folder
- App browser-security SS.sh
- App normal SS multi-app.sh
- App normal SS.sh
- App service SS.sh
- App VFA SS github.sh
- App VFA SS.sh
These scripts are similar to the App-install folder but also utilize __swiftDialog__ to show user feedback and installation status, and they also have an option to use __dockutil__ to add the installed software to the Dock.
# App-update
A common requested behavior is to only update an app if it is already installed. These script verifies if the app is already installed before runnning Installomator.
- App browser-security Auto-install.sh
- App normal Auto-install.sh

View File

@@ -0,0 +1,17 @@
#!/bin/sh
# Mark: Addigy Condition
# Install on success
gitusername="Installomator"
gitreponame="Installomator"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
destFile="/usr/local/Installomator/Installomator.sh"
if [[ ! -e "${destFile}" || "$(${destFile} version)" != "$appNewVersion" ]]; then
#echo "Let's install…"
exit 0
else
#echo "No need!"
exit 1
fi

View File

@@ -0,0 +1,149 @@
#!/bin/sh
######################################################################
# Installation of Installomator
#
# No customization below…
######################################################################
# This script can be used to install Installomator directly from GitHub.
######################################################################
#
# This script made by Søren Theilgaard
# https://github.com/Theile
# Twitter and MacAdmins Slack: @theilgaard
#
# Some functions and code from Installomator:
# https://github.com/Installomator/Installomator
#
######################################################################
scriptVersion="9.5"
# v. 9.5 : 2022-09-21 : change of GitHub download
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
# v. 9.3 : 2022-08-29 : Logging changed for current version. Improved installation with looping if it fails, so it can try again. Improved GitHub handling.
# v. 9.2.2 : 2022-06-17 : Check 1.1.1.1 for internet connection.
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator. Universal script.
######################################################################
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Mark: Constants, logging and caffeinate
log_message="Installomator install, v$scriptVersion"
label="Inst-v$scriptVersion"
log_location="/private/var/log/Installomator.log"
printlog(){
timestamp=$(date +%F\ %T)
if [[ "$(whoami)" == "root" ]]; then
echo "$timestamp :: $label : $1" | tee -a $log_location
else
echo "$timestamp :: $label : $1"
fi
}
printlog "[LOG-BEGIN] ${log_message}"
# Internet check
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
printlog "ERROR. No internet connection, we cannot continue."
exit 90
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid" || true
pkill caffeinate || true
printlog "[LOG-END] Status $1"
exit $1
}
name="Installomator"
printlog "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg with destFile
gitusername="Installomator"
gitreponame="Installomator"
#printlog "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#printlog "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#printlog "$appNewVersion"
expectedTeamID="JME5BW3F3R"
destFile="/usr/local/Installomator/Installomator.sh"
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
printlog "${destFile} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
printlog "$name not found or version not latest."
printlog "${destFile}"
printlog "Installing version ${appNewVersion} ..."
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
printlog "Created working directory '$tmpDir'"
# Download the installer package
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
printlog "${curlDownload}"
exitCode=1
else
printlog "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
printlog "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
printlog "ERROR. $name package installation failed."
printlog "${pkgInstall}"
exitCode=2
else
printlog "Installing $name package succes."
exitCode=0
fi
else
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
printlog "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
printlog "Download and install of $name succes."
fi
done
# Remove the temporary working directory
printlog "Deleting working directory '$tmpDir' and its contents."
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
printlog "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
printlog "$name version $appNewVersion installed!"
fi
else
printlog "$name version $appNewVersion already found. Perfect!"
fi
caffexit 0

View File

@@ -0,0 +1,20 @@
#!/bin/sh
# Mark: Addigy Condition
# Install on success
gitusername="bartreardon"
gitreponame="swiftDialog"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
destFile="/Library/Application Support/Dialog/Dialog.app"
versionKey="CFBundleShortVersionString" #CFBundleVersion
currentInstalledVersion="$(defaults read "${destFile}/Contents/Info.plist" $versionKey || true)"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
#echo "Let's install…"
exit 0
else
#echo "No need!"
exit 1
fi

150
MDM/install swiftDialog direct.sh Executable file
View File

@@ -0,0 +1,150 @@
#!/bin/sh
######################################################################
# Installation of swiftDialog
#
# No customization below…
######################################################################
# This script can be used to install swiftDialog directly from GitHub.
######################################################################
#
# This script made by Søren Theilgaard
# https://github.com/Theile
# Twitter and MacAdmins Slack: @theilgaard
#
# Some functions and code from Installomator:
# https://github.com/Installomator/Installomator
#
######################################################################
scriptVersion="9.5"
# v. 9.5 : 2022-09-21 : change of GitHub download
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API.
# v. 9.3 : 2022-08-29 : Logging changed for current version. Improved installation with looping if it fails, so it can try again. Improved GitHub handling.
# v. 9.2.2 : 2022-06-17 : Check 1.1.1.1 for internet connection.
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator. Universal script.
######################################################################
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Mark: Constants, logging and caffeinate
log_message="Dialog install, v$scriptVersion"
label="Dialog-v$scriptVersion"
log_location="/private/var/log/Installomator.log"
printlog(){
timestamp=$(date +%F\ %T)
if [[ "$(whoami)" == "root" ]]; then
echo "$timestamp :: $label : $1" | tee -a $log_location
else
echo "$timestamp :: $label : $1"
fi
}
printlog "[LOG-BEGIN] ${log_message}"
# Internet check
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
printlog "ERROR. No internet connection, we cannot continue."
exit 90
fi
# No sleeping
/usr/bin/caffeinate -d -i -m -u &
caffeinatepid=$!
caffexit () {
kill "$caffeinatepid" || true
pkill caffeinate || true
printlog "[LOG-END] Status $1"
exit $1
}
name="Dialog"
printlog "$name check for installation"
# download URL, version and Expected Team ID
# Method for GitHub pkg w. app version check
gitusername="bartreardon"
gitreponame="swiftDialog"
#printlog "$gitusername $gitreponame"
filetype="pkg"
#downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "Trying GitHub API for download URL."
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
fi
#printlog "$downloadURL"
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
#printlog "$appNewVersion"
expectedTeamID="PWA5E9TQ59"
destFile="/Library/Application Support/Dialog/Dialog.app"
versionKey="CFBundleShortVersionString" #CFBundleVersion
currentInstalledVersion="$(defaults read "${destFile}/Contents/Info.plist" $versionKey || true)"
printlog "${name} version: $currentInstalledVersion"
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
printlog "$name not found or version not latest."
printlog "${destFile}"
printlog "Installing version ${appNewVersion}"
# Create temporary working directory
tmpDir="$(mktemp -d || true)"
printlog "Created working directory '$tmpDir'"
# Download the installer package
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
installationCount=0
exitCode=9
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
curlDownloadStatus=$(echo $?)
if [[ $curlDownloadStatus -ne 0 ]]; then
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
printlog "${curlDownload}"
exitCode=1
else
printlog "Download $name succes."
# Verify the download
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
printlog "Team ID for downloaded package: $teamID"
# Install the package if Team ID validates
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
pkgInstallStatus=$(echo $?)
if [[ $pkgInstallStatus -ne 0 ]]; then
printlog "ERROR. $name package installation failed."
printlog "${pkgInstall}"
exitCode=2
else
printlog "Installing $name package succes."
exitCode=0
fi
else
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
exitCode=3
fi
fi
((installationCount++))
printlog "$installationCount time(s), exitCode $exitCode"
if [[ $installationCount -lt 3 ]]; then
if [[ $exitCode -gt 0 ]]; then
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
sleep 2
fi
else
printlog "Download and install of $name succes."
fi
done
# Remove the temporary working directory
printlog "Deleting working directory '$tmpDir' and its contents."
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
# Handle installation errors
if [[ $exitCode != 0 ]]; then
printlog "ERROR. Installation of $name failed. Aborting."
caffexit $exitCode
else
printlog "$name version $appNewVersion installed!"
fi
else
printlog "$name version $appNewVersion already found. Perfect!"
fi
caffexit 0

View File

@@ -1,3 +1,7 @@
# Note: The main repo is a beta version
Please locate “Releases” on the right, and download the latest 9.2 release (either pkg or zip) for a supported release.
# Installomator
_The one installer script to rule them all._

View File

@@ -162,11 +162,19 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name
fi
if [ -n "$archiveName" ]; then
#downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }")
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1)
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }")
if [[ "$(echo $downloadURL | grep -ioE "https.*$archiveName")" == "" ]]; then
printlog "GitHub API not returning URL, trying https://github.com/$gitusername/$gitreponame/releases/latest."
#downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1)
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1)"
fi
else
#downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
printlog "GitHub API not returning URL, trying https://github.com/$gitusername/$gitreponame/releases/latest."
#downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)
downloadURL="https://github.com$(curl -sfL "$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "expanded_assets" | head -1)" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
fi
fi
if [ -z "$downloadURL" ]; then
cleanupAndExit 14 "could not retrieve download URL for $gitusername/$gitreponame" ERROR
@@ -285,6 +293,10 @@ getAppVersion() {
printlog "Replacing App Store apps, no matter the version" WARN
appversion=0
else
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "wait" "Already installed from App Store. Not replaced."
sleep 4
fi
cleanupAndExit 23 "App previously installed from App Store, and we respect that" ERROR
fi
fi
@@ -462,6 +474,10 @@ installAppWithPath() { # $1: path to app to install in $targetDir
printlog "notifying"
displaynotification "$message" "No update for $name!"
fi
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "wait" "Latest version already installed..."
sleep 2
fi
cleanupAndExit 0 "No new version to install" REG
else
printlog "Using force to install anyway."
@@ -628,6 +644,10 @@ installFromPKG() {
printlog "notifying"
displaynotification "$message" "No update for $name!"
fi
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "wait" "Latest version already installed..."
sleep 2
fi
cleanupAndExit 0 "No new version to install" REQ
else
printlog "Using force to install anyway."

View File

@@ -7,4 +7,5 @@ remotixagent)
versionKey="CFBundleVersion"
appNewVersion=$(curl -fsIL "${downloadURL}" | grep -i "^location" | sed -E 's/.*\/[a-zA-Z]*-[0-9.]*-([0-9.]*)\.pkg/\1/g')
expectedTeamID="H629V387SY"
blockingProcesses=( NONE )
;;

View File

@@ -0,0 +1,8 @@
adobeacrobatprodc)
name="Adobe Acrobat Pro DC"
type="pkgInDmg"
downloadURL="https://trials.adobe.com/AdobeProducts/APRO/Acrobat_HelpX/osx10/Acrobat_DC_Web_WWMUI.dmg"
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "Acrobat Pro DC" )
Company="Adobe"
;;

View File

@@ -1,18 +1,24 @@
adobecreativeclouddesktop)
name="Adobe Creative Cloud"
#appName="Install.app"
appName="Install.app"
type="dmg"
adobeurl="https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html"
if [[ $(arch) == "arm64" ]]; then
downloadURL=$(curl -fs "$adobeurl" | xmllint -html -xpath "string(//a[contains(@href,'osx10')][contains(text(),'Download')]/@href)" - 2> /dev/null)
elif [[ $(arch) == "i386" ]]; then
downloadURL=$(curl -fs "$adobeurl" | xmllint -html -xpath "string(//a[contains(@href,'macarm64')][contains(text(),'Download')]/@href)" - 2> /dev/null)
if pgrep -q "Adobe Installer"; then
printlog "Adobe Installer is running, not a good time to update." WARN
printlog "################## End $APPLICATION \n\n" INFO
exit 75
fi
#downloadURL=$(curl -fs "https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html" | grep -o "https*.*dmg" | head -1)
appNewVersion=$(curl -fs "https://helpx.adobe.com/creative-cloud/release-note/cc-release-notes.html" | grep "mandatory" | head -1 | grep -o "Version *.* released" | cut -d " " -f2)
if [[ "$(arch)" == "arm64" ]]; then
downloadURL=$(curl -fs "https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html" | grep -o 'https.*macarm64.*dmg' | head -1 | cut -d '"' -f1)
else
downloadURL=$(curl -fs "https://helpx.adobe.com/download-install/kb/creative-cloud-desktop-app-download.html" | grep -o 'https.*osx10.*dmg' | head -1 | cut -d '"' -f1)
fi
#appNewVersion=$(curl -fs "https://helpx.adobe.com/creative-cloud/release-note/cc-release-notes.html" | grep "mandatory" | head -1 | grep -o "Version *.* released" | cut -d " " -f2)
appNewVersion=$(echo $downloadURL | grep -o '[^x]*$' | cut -d '.' -f 1 | sed 's/_/\./g')
targetDir="/Applications/Utilities/Adobe Creative Cloud/ACC/"
installerTool="Install.app"
CLIInstaller="Install.app/Contents/MacOS/Install"
CLIArguments=(--mode=silent)
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "Creative Cloud" )
Company="Adobe"
;;

View File

@@ -0,0 +1,27 @@
adobereaderdc-install)
name="Adobe Acrobat Reader DC"
type="pkgInDmg"
printlog "Changing IFS for Adobe Reader" INFO
SAVEIFS=$IFS
IFS=$'\n'
versions=( $( curl -s https://www.adobe.com/devnet-docs/acrobatetk/tools/ReleaseNotesDC/index.html | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+"| head -n 30) )
local version
for version in $versions; do
version="${version//.}"
printlog "trying version: $version" INFO
local httpstatus=$(curl -X HEAD -s "https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/${version}/AcroRdrDC_${version}_MUI.dmg" --write-out "%{http_code}")
printlog "HTTP status for Adobe Reader full installer URL https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/${version}/AcroRdrDC_${version}_MUI.dmg is $httpstatus" DEBUG
if [[ "${httpstatus}" == "200" ]]; then
downloadURL="https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/${version}/AcroRdrDC_${version}_MUI.dmg"
unset httpstatus
break
fi
done
unset version
IFS=$SAVEIFS
appNewVersion=$i
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "AdobeReader" )
Company="Adobe"
PatchName="AcrobatReader"
;;

View File

@@ -1,9 +1,44 @@
adobereaderdc-update)
name="Adobe Acrobat Reader DC"
type="pkgInDmg"
downloadURL=$(adobecurrent=`curl --fail --silent https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt | tr -d '.'` && echo https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/"$adobecurrent"/AcroRdrDC_"$adobecurrent"_MUI.dmg)
if [[ -d "/Applications/Adobe Acrobat Reader DC.app" ]]; then
printlog "Found /Applications/Adobe Acrobat Reader DC.app"
mkdir -p "/Library/Application Support/Adobe/Acrobat/11.0"
defaults write "/Library/Application Support/Adobe/Acrobat/11.0/com.adobe.Acrobat.InstallerOverrides.plist" ReaderAppPath "/Applications/Adobe Acrobat Reader DC.app"
if ! defaults read "/Applications/Adobe Acrobat Reader DC.app/Contents/Resources/AcroLocale.plist" ; then
printlog "Missing locale data, this will cause the updater to fail. Deleting Adobe Acrobat Reader DC.app and installing fresh." WARN
rm -Rf "/Applications/Adobe Acrobat Reader DC.app"
if [[ $1 == "/" ]]; then
printlog "Running through Jamf: $0." INFO
$0 $1 $2 $3 adobereaderdc-install ${5} ${6} ${7} ${8} ${9} ${10} ${11}
else
printlog "Installomator running locally: $0." INFO
$0 adobereaderdc-install ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} ${10} ${11}
fi
fi
fi
adobecurrent=$(curl -sL https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt | tr -d '.')
if [[ "${adobecurrent}" != <-> ]]; then
printlog "Got an invalid response for the Adobe Reader Current Version: ${adobecurrent}" ERROR
printlog "################## End $APPLICATION \n\n" INFO
exit 50
fi
downloadURL=$(echo https://ardownload2.adobe.com/pub/adobe/reader/mac/AcrobatDC/"$adobecurrent"/AcroRdrDCUpd"$adobecurrent"_MUI.dmg)
reader_preinstall() {
if pgrep -a "AdobeReader" >/dev/null 2>&1; then
printlog "AdobeReader is still running, forcefully killing." WARN
killall AdobeReader
fi
}
preinstall="reader_preinstall"
updateTool="/usr/local/bin/RemoteUpdateManager"
updateToolArguments=( --productVersions=RDR )
appNewVersion=$(curl -s https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt)
#appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
updateToolLog="/Users/$currentUser/Library/Logs/RemoteUpdateManager.log"
updateToolLogDateFormat="%m/%d/%y %H:%M:%S"
expectedTeamID="JQ525L2MZD"
blockingProcesses=( "AdobeReader" )
Company=Adobe
PatchName=AcrobatReader
PatchSkip="YES"
;;

View File

@@ -0,0 +1,10 @@
archiwareb2go)
name="P5 Workstation"
type="pkgInDmg"
packageID="com.archiware.presstore"
appNewVersion=$(curl -sf https://www.archiware.com/download-p5 | grep -m 1 "ARCHIWARE P5 Version" | sed "s|.*Version \(.*\) -.*|\\1|")
downloadURL=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo https://p5-downloads.s3.amazonaws.com/awpst"$appNrVersion"-darwin.dmg)
pkgName=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo P5-Workstation-"$appNrVersion"-Install.pkg)
expectedTeamID="5H5EU6F965"
# blockingProcesses=( nsd )
;;

View File

@@ -0,0 +1,10 @@
archiwarepst)
name="P5"
type="pkgInDmg"
packageID="com.archiware.presstore"
appNewVersion=$(curl -sf https://www.archiware.com/download-p5 | grep -m 1 "ARCHIWARE P5 Version" | sed "s|.*Version \(.*\) -.*|\\1|")
downloadURL=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo https://p5-downloads.s3.amazonaws.com/awpst"$appNrVersion"-darwin.dmg)
pkgName=$(appNrVersion=`sed 's/[^0-9]//g' <<< $appNewVersion` && echo P5-"$appNrVersion"-Install.pkg)
expectedTeamID="5H5EU6F965"
# blockingProcesses=( nsd )
;;

View File

@@ -1,7 +1,13 @@
audacity)
name="Audacity"
type="dmg"
downloadURL=$(downloadURLFromGit audacity audacity)
if [[ $(arch) == "arm64" ]]; then
archiveName="audacity-macOS-[0-9.]*-arm64.dmg"
downloadURL=$(downloadURLFromGit audacity audacity)
elif [[ $(arch) == "i386" ]]; then
archiveName="audacity-macOS-[0-9.]*-x86_64.dmg"
downloadURL=$(downloadURLFromGit audacity audacity)
fi
appNewVersion=$(versionFromGit audacity audacity)
expectedTeamID="AWEYX923UX"
;;

View File

@@ -0,0 +1,8 @@
bitrix24)
name="Bitrix24"
type="dmg"
archiveName="bitrix24_desktop.dmg"
downloadURL="https://dl.bitrix24.com/b24/bitrix24_desktop.dmg"
expectedTeamID="5B3T3A994N"
blockingProcesses=( "Bitrix24" )
;;

View File

@@ -0,0 +1,7 @@
charles)
name="Charles"
type="dmg"
appNewVersion=$(curl -fs https://www.charlesproxy.com/download/latest-release/ | sed -nE 's/.*version.*value="([^"]*).*/\1/p')
downloadURL="https://www.charlesproxy.com/assets/release/$appNewVersion/charles-proxy-$appNewVersion.dmg"
expectedTeamID="9A5PCU4FSD"
;;

View File

@@ -0,0 +1,11 @@
chronoagent)
name="ChronoAgent"
type="pkgInDmg"
# packageID="com.econtechnologies.preference.chronoagent"
# versionKey="CFBundleVersion"
# None of the above can read out the installed version
releaseURL="https://www.econtechnologies.com/UC/updatecheck.php?prod=ChronoAgent&lang=en&plat=mac&os=10.14.1&hw=i64&req=1&vers=#"
appNewVersion=$(curl -sf $releaseURL | sed -r 's/.*VERSION=([^<]+).*/\1/')
downloadURL="https://downloads.econtechnologies.com/CA_Mac_Download.dmg"
expectedTeamID="9U697UM7YX"
;;

View File

@@ -0,0 +1,8 @@
chronosync)
name="ChronoSync"
type="pkgInDmg"
releaseURL="https://www.econtechnologies.com/UC/updatecheck.php?prod=ChronoSync&lang=en&plat=mac&os=10.14.1&hw=i64&req=1&vers=#"
appNewVersion=$(curl -sf $releaseURL | sed -r 's/.*VERSION=([^<]+).*/\1/')
downloadURL="https://downloads.econtechnologies.com/CS4_Download.dmg"
expectedTeamID="9U697UM7YX"
;;

View File

@@ -0,0 +1,11 @@
cytoscape)
name="Cytoscape"
#appName="Cytoscape Installer.app"
type="dmg"
downloadURL="$(downloadURLFromGit cytoscape cytoscape)"
appNewVersion="$(versionFromGit cytoscape cytoscape)"
installerTool="Cytoscape Installer.app"
CLIInstaller="Cytoscape Installer.app/Contents/MacOS/JavaApplicationStub"
CLIArguments=(-q)
expectedTeamID="35LDCJ33QT"
;;

View File

@@ -2,9 +2,9 @@ duckduckgo)
name="DuckDuckGo"
type="dmg"
#downloadURL="https://staticcdn.duckduckgo.com/macos-desktop-browser/duckduckgo.dmg"
#downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[last()]' 2>/dev/null | cut -d '"' -f2)
downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | cut -d '"' -f2)
#appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@sparkle:version)[last()]' 2>/dev/null | cut -d '"' -f2)
appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/sparkle:shortVersionString)[1]' 2>/dev/null | cut -d ">" -f2 | cut -d "<" -f1)
downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[last()]' 2>/dev/null | cut -d '"' -f2)
#downloadURL=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | cut -d '"' -f2)
appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/enclosure/@sparkle:version)[last()]' 2>/dev/null | cut -d '"' -f2)
#appNewVersion=$(curl -fs https://staticcdn.duckduckgo.com/macos-desktop-browser/appcast.xml | xpath '(//rss/channel/item/sparkle:shortVersionString)[1]' 2>/dev/null | cut -d ">" -f2 | cut -d "<" -f1)
expectedTeamID="HKE973VLUW"
;;

View File

@@ -0,0 +1,9 @@
egnytecore)
name="Egnyte Core"
appName="Egnyte.app"
type="dmg"
downloadURL=$(curl -fs "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/versions/default.xml" | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | cut -d '"' -f 2)
appNewVersion=$(curl -fs "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/versions/default.xml" | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | cut -d '"' -f 2)
expectedTeamID="FELUD555VC"
blockingProcesses=( NONE )
;;

View File

@@ -0,0 +1,8 @@
filemakerpro)
name="FileMaker Pro"
type="dmg"
versionKey="BuildVersion"
downloadURL=$(curl -fs https://www.filemaker.com/redirects/ss.txt | grep '\"PRO..MAC\"' | tail -1 | sed "s|.*url\":\"\(.*\)\".*|\\1|")
appNewVersion=$(curl -fs https://www.filemaker.com/redirects/ss.txt | grep '\"PRO..MAC\"' | tail -1 | sed "s|.*fmp_\(.*\).dmg.*|\\1|")
expectedTeamID="J6K4T76U7W"
;;

View File

@@ -0,0 +1,7 @@
fujifilmwebcam)
name="FUJIFILM X Webcam 2"
type="pkg"
downloadURL=$(curl -fs "https://fujifilm-x.com/en-us/support/download/software/x-webcam/" | grep "https.*pkg" | sed -E 's/.*(https:\/\/dl.fujifilm-x\.com\/support\/software\/.*\.pkg[^\<]).*/\1/g' | sed -e 's/^"//' -e 's/"$//')
appNewVersion=$( echo${downloadURL}| sed -E 's/.*XWebcamIns([0-9]*).*/\1/g' | sed -E 's/([0-9])([0-9]).*/\1\.\2/g')
expectedTeamID="34LRP8AV2M"
;;

View File

@@ -0,0 +1,7 @@
gfxcardstatus)
name="gfxCardStatus"
type="zip"
downloadURL="$(downloadURLFromGit codykrieger gfxCardStatus)"
appNewVersion="$(versionFromGit codykrieger gfxCardStatus)"
expectedTeamID="LF22FTQC25"
;;

14
fragments/labels/horos.sh Normal file
View File

@@ -0,0 +1,14 @@
horos)
name="Horos"
type="dmg"
versionKey="CFBundleGetInfoString"
appNewVersion=$(curl -fs https://github.com/horosproject/horos/blob/horos/Horos/Info.plist | grep -A 4 "CFBundleGetInfoString" | tail -1 | sed -r 's/.*Horos v([^<]+).*/\1/' | sed 's/ //g')
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://horosproject.org/horos-content/Horos"$appNewVersion"_Apple.dmg"
TeamID="8NDFEW7285"
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://horosproject.org/horos-content/Horos"$appNewVersion".dmg"
TeamID="TPT6TVH8UY"
fi
expectedTeamID=$TeamID
;;

13
fragments/labels/jdk18.sh Normal file
View File

@@ -0,0 +1,13 @@
jdk18)
name="Java SE Development Kit 18"
type="pkgInDmg"
versionKey="CFBundleShortVersionString"
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://download.oracle.com/java/18/latest/jdk-18_macos-aarch64_bin.dmg"
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://download.oracle.com/java/18/latest/jdk-18_macos-x64_bin.dmg"
fi
appCustomVersion(){ java --version | grep java | awk '{print $2}' }
appNewVersion=$(curl -sf "https://www.oracle.com/java/technologies/downloads/#jdk18-mac" | grep -m 1 "Java SE Development Kit" | sed "s|.*Kit \(.*\) downloads.*|\\1|")
expectedTeamID="VB5E2TV963"
;;

View File

@@ -0,0 +1,7 @@
latexit)
name="LaTeXiT"
type="dmg"
downloadURL="$(curl -fs "https://pierre.chachatelier.fr/latexit/downloads/latexit-sparkle-en.rss" | xpath '(//rss/channel/item/enclosure/@url)[last()]' 2>/dev/null | cut -d '"' -f 2)"
appNewVersion="$(curl -fs "https://pierre.chachatelier.fr/latexit/downloads/latexit-sparkle-en.rss" | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[last()]' 2>/dev/null | cut -d '"' -f 2)"
expectedTeamID="7SFX84GNR7"
;;

View File

@@ -2,11 +2,14 @@ libreoffice)
name="LibreOffice"
type="dmg"
if [[ $(arch) == "arm64" ]]; then
arch_type="aarch64"
releaseURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/aarch64/"
appNewVersion=$(curl -sf $releaseURL | grep -m 1 "_MacOS_aarch64.dmg" | sed "s|.*LibreOffice_\(.*\)_MacOS.*|\\1|")
downloadURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/aarch64/LibreOffice_"$appNewVersion"_MacOS_aarch64.dmg"
elif [[ $(arch) == "i386" ]]; then
releaseURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/x86_64/"
appNewVersion=$(curl -sf $releaseURL | grep -m 1 "_MacOS_x86-64.dmg" | sed "s|.*LibreOffice_\(.*\)_MacOS.*|\\1|")
downloadURL="https://downloadarchive.documentfoundation.org/libreoffice/old/latest/mac/x86_64/LibreOffice_"$appNewVersion"_MacOS_x86-64.dmg"
fi
libreoffice_latest_version="$(curl -Ls https://www.libreoffice.org/download/download-libreoffice/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)"
downloadURL="https://download.documentfoundation.org/libreoffice/stable/${libreoffice_latest_version}/mac/${arch_type:-x86_64}/LibreOffice_${libreoffice_latest_version}_MacOS_${arch_type:-x86-64}.dmg"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)_.*/\1/g')
expectedTeamID="7P5S3ZLCN7"
blockingProcesses=( soffice )
;;

View File

@@ -1,8 +1,9 @@
nudge)
name="Nudge"
type="pkg"
archiveName="Nudge-[0-9.]*.pkg"
downloadURL=$(downloadURLFromGit macadmins Nudge )
appNewVersion=$(versionFromGit macadmins Nudge )
expectedTeamID="9GQZ7KUFR6"
archiveName="Nudge-[0-9.]*.pkg"
;;

View File

@@ -0,0 +1,10 @@
nudgesuite)
name="Nudge Suite"
appName="Nudge.app"
type="pkg"
archiveName="Nudge_Suite-[0-9.]*.pkg"
downloadURL=$(downloadURLFromGit macadmins Nudge )
appNewVersion=$(versionFromGit macadmins Nudge )
expectedTeamID="9GQZ7KUFR6"
blockingProcesses=( "Nudge" )
;;

View File

@@ -1,7 +1,12 @@
obs)
# credit: Gabe Marchan (gabemarchan.com - @darklink87)
name="OBS"
type="dmg"
downloadURL=$(curl -fs "https://obsproject.com/download" | awk -F '"' "/dmg/ {print \$10}")
if [[ $(arch) == "arm64" ]]; then
archiveName="obs-studio-[0-9.]*-macos-arm64.dmg"
elif [[ $(arch) == "i386" ]]; then
archiveName="obs-studio-[0-9.]*-macos-x86_64.dmg"
fi
downloadURL=$(downloadURLFromGit obsproject obs-studio )
appNewVersion=$(versionFromGit obsproject obs-studio )
expectedTeamID="2MMRE5MTB8"
;;

View File

@@ -0,0 +1,7 @@
origin)
name="Origin"
type="dmg"
downloadURL="https://www.dm.origin.com/mac/download/Origin.dmg"
expectedTeamID="TSTV75T6Q5"
blockingProcesses=( "Origin" )
;;

View File

@@ -0,0 +1,7 @@
parallelsrasclient)
name="Parallels Client"
type="pkg"
appNewVersion=$(curl -sf "https://download.parallels.com/ras/v18/RAS%20Client%20for%20Mac%20Changelog.txt" | grep -m 1 "Parallels Client for Mac Version" | sed "s|.*Version \(.*\) -.*|\\1|" | sed 's/ /./g' | sed 's/[^0-9.]//g')
downloadURL=$(appMajorVersion=`sed 's/\..*//' <<< $appNewVersion` && appHyphenVersion=`curl -sf "https://download.parallels.com/ras/v18/RAS%20Client%20for%20Mac%20Changelog.txt" | grep -m 1 "Parallels Client for Mac Version" | sed "s|.*Version \(.*\) -.*|\\1|" | sed 's/ /-/g' | sed 's/[^0-9.-]//g'` && echo https://download.parallels.com/ras/v"$appMajorVersion"/"$appNewVersion"/RasClient-Mac-Notarized-"$appHyphenVersion".pkg)
expectedTeamID="4C6364ACXT"
;;

View File

@@ -0,0 +1,7 @@
polylens)
name="Poly Lens"
type="dmg"
appNewVersion=$(curl -fs "https://info.lens.poly.com/lens-dt-rn/atom.xml" | grep "Version" | head -1 | cut -d "[" -f3 | sed 's/Version //g' | sed 's/]]\>\<\/title\>//g')
downloadURL="https://swupdate.lens.poly.com/lens-desktop-mac/$appNewVersion/$appNewVersion/PolyLens-$appNewVersion.dmg"
expectedTeamID="SKWK2Q7JJV"
;;

View File

@@ -1,7 +1,12 @@
r)
name="R"
type="pkg"
downloadURL="https://cloud.r-project.org/bin/macosx/$( curl -fsL https://cloud.r-project.org/bin/macosx/ | grep -m 1 -o '<a href=".*pkg">' | sed -E 's/.+"(.+)".+/\1/g' )"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://cloud.r-project.org/bin/macosx/$( curl -fsL https://cloud.r-project.org/bin/macosx/ | grep -m 1 -o '<a href=".*arm64\.pkg">' | sed -E 's/.+"(.+)".+/\1/g' )"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)-.*\..*/\1/g')
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://cloud.r-project.org/bin/macosx/$( curl -fsL https://cloud.r-project.org/bin/macosx/ | grep -o '<a href=".*pkg">' | grep -m 1 -v "arm64" | sed -E 's/.+"(.+)".+/\1/g' )"
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')
fi
expectedTeamID="VZLD955F6P"
;;

View File

@@ -2,6 +2,6 @@ rstudio)
name="RStudio"
type="dmg"
downloadURL=$(curl -s -L "https://rstudio.com/products/rstudio/download/" | grep -m 1 -Eio 'href="https://download1.rstudio.org/desktop/macos/RStudio-(.*).dmg"' | cut -c7- | sed -e 's/"$//')
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.-]*)\..*/\1/g' | sed 's/-/+/' )
expectedTeamID="FYF2F5GFX4"
;;

View File

@@ -1,7 +1,12 @@
screamingfrogseospider)
name="Screaming Frog SEO Spider"
type="dmg"
downloadURL=$(curl -fs "https://www.screamingfrog.co.uk/wp-content/themes/screamingfrog/inc/download-modal.php" | grep -i -o "https.*\.dmg" | head -1)
if [[ $(arch) == i386 ]]; then
platform="Mac - (intel)"
elif [[ $(arch) == arm64 ]]; then
platform="Mac - (apple silicon)"
fi
downloadURL=$(curl -fs "https://www.screamingfrog.co.uk/wp-content/themes/screamingfrog/inc/download-modal.php" | grep "${platform}" | grep -i -o "https.*\.dmg" | head -1)
appNewVersion=$(print "$downloadURL" | sed -E 's/https.*\/[a-zA-Z]*-([0-9.]*)\.dmg/\1/g')".0"
expectedTeamID="CAHEVC3HZC"
;;

View File

@@ -0,0 +1,8 @@
splashtopbusiness)
name="Splashtop Business"
type="pkgInDmg"
splashtopbusinessVersions=$(curl -fsL "https://www.splashtop.com/wp-content/themes/responsive/downloadx.php?product=stb&platform=mac-client")
downloadURL=$(getJSONValue "$splashtopbusinessVersions" "url")
appNewVersion="${${downloadURL#*INSTALLER_v}%*.dmg}"
expectedTeamID="CPQQ3AW49Y"
;;

View File

@@ -0,0 +1,8 @@
tailscale)
name="Tailscale"
type="zip"
appNewVersion="$(curl -s https://pkgs.tailscale.com/stable/ | awk -F- '/Tailscale.*macos.zip/ {print $2}')"
downloadURL="https://pkgs.tailscale.com/stable/Tailscale-${appNewVersion}-macos.zip"
expectedTeamID="W5364U7YZB"
versionKey="CFBundleShortVersionString"
;;

View File

@@ -3,10 +3,11 @@ vlc)
type="dmg"
if [[ $(arch) == "arm64" ]]; then
downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 )
appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
#appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
elif [[ $(arch) == "i386" ]]; then
downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 )
appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
#appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
fi
appNewVersion=$(echo ${downloadURL} | sed -E 's/.*\/vlc-([0-9.]*).*\.dmg/\1/' )
expectedTeamID="75GAHG3SZQ"
;;

View File

@@ -1,11 +1,14 @@
xcreds)
name="XCreds"
#type="pkgInZip"
# Downloading from twocanoes homepage
#type="pkgInDmg"
#packageID="com.twocanoes.pkg.secureremoteaccess"
#downloadURL=$(curl -fs "https://twocanoes.com/products/mac/xcreds/" | grep -ioE "https://.*\.zip" | head -1)
#appNewVersion=$(curl -fs "https://twocanoes.com/products/mac/xcreds/" | grep -io "Current Version:.*" | sed -E 's/.*XCreds *([0-9.]*)<.*/\1/g')
# GitHub download
type="pkg"
downloadURL="$(downloadURLFromGit twocanoes xcreds)"
appNewVersion="$(versionFromGit twocanoes xcreds)"
#appNewVersion="$(versionFromGit twocanoes xcreds)" # GitHub tag contain “_” and not “.” so our function fails to get the right version
appNewVersion=$(echo "$downloadURL" | sed -E 's/.*XCreds_.*-([0-9.]*)\.pkg/\1/')
expectedTeamID="UXP6YEHSPW"
;;

View File

@@ -0,0 +1,10 @@
zoomoutlookplugin)
name="Zoom Outlook Plugin"
appName="PluginLauncher.app"
targetDir="/Applications/ZoomOutlookPlugin"
type="pkg"
downloadURL="https://zoom.us/client/latest/ZoomMacOutlookPlugin.pkg"
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5 | cut -d "." -f1-3)"
expectedTeamID="BJ4HAAB9B3"
blockingProcesses=( "PluginLauncher" )
;;

View File

@@ -0,0 +1,8 @@
zotero)
name="Zotero"
type="dmg"
downloadURL="https://www.zotero.org/download/client/dl?channel=release&platform=mac&version=$(curl -fs "https://www.zotero.org/download/" | grep -Eio '"mac":"(.*)' | cut -d '"' -f 4)"
expectedTeamID="8LAYR367YV"
appNewVersion=$(curl -fs "https://www.zotero.org/download/" | grep -Eio '"mac":"(.*)' | cut -d '"' -f 4)
#Company="Corporation for Digital Scholarship"
;;

View File

@@ -183,6 +183,10 @@ if [[ -n $appNewVersion ]]; then
printlog "notifying"
displaynotification "$message" "No update for $name!"
fi
if [[ $DIALOG_CMD_FILE != "" ]]; then
updateDialog "complete" "Latest version already installed..."
sleep 2
fi
cleanupAndExit 0 "No newer version." REQ
fi
else

View File

@@ -1 +1 @@
10.0beta2
10.0beta3