mirror of
https://github.com/mtan93/Installomator.git
synced 2026-03-09 21:02:49 +00:00
Compare commits
135 Commits
v0.7b1
...
v0.7releas
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c38386c53 | ||
|
|
39f67c9e89 | ||
|
|
c40168f301 | ||
|
|
e0a0b65b80 | ||
|
|
d1923a4e7f | ||
|
|
f0ff1e6269 | ||
|
|
b6092df909 | ||
|
|
2fb80375ec | ||
|
|
796f8a4e25 | ||
|
|
310140d64f | ||
|
|
8db95578c7 | ||
|
|
ba7edf8d02 | ||
|
|
c0a0b37f7e | ||
|
|
cd27693125 | ||
|
|
adbe98718f | ||
|
|
fcde9e2e4c | ||
|
|
ded8787da5 | ||
|
|
05039ae826 | ||
|
|
7c0a4ef04a | ||
|
|
8feb2e5578 | ||
|
|
47dfa8fdf4 | ||
|
|
425722acda | ||
|
|
0b3d703e02 | ||
|
|
4b53da0fb7 | ||
|
|
bf5f5ca936 | ||
|
|
1b6d82e880 | ||
|
|
c9ca70e836 | ||
|
|
0530cba21b | ||
|
|
0adc02ba0c | ||
|
|
f16ee55ed6 | ||
|
|
a67ba0934f | ||
|
|
26ae2b3139 | ||
|
|
97ec3efedb | ||
|
|
b0ed6432f6 | ||
|
|
174a2b5a46 | ||
|
|
9edc256caa | ||
|
|
8e9488c68f | ||
|
|
5799c5d432 | ||
|
|
d97c84dd0c | ||
|
|
effd470ce7 | ||
|
|
38326e87e3 | ||
|
|
e8464c5c47 | ||
|
|
9dbac45621 | ||
|
|
db3e109c21 | ||
|
|
039de95b5c | ||
|
|
028fbd60d6 | ||
|
|
50bc2fd708 | ||
|
|
c37daf5b7b | ||
|
|
468ac0de6e | ||
|
|
c21dde0074 | ||
|
|
6267736abf | ||
|
|
7803d1afe2 | ||
|
|
54b57cc83d | ||
|
|
8077cb91b9 | ||
|
|
261c92946e | ||
|
|
28dc87fdbe | ||
|
|
33e2e829c5 | ||
|
|
968e3b3ab0 | ||
|
|
b2cd2b74be | ||
|
|
66b1f9a319 | ||
|
|
f0d3828054 | ||
|
|
4bc03223ae | ||
|
|
394b8dabdc | ||
|
|
bc046cfc07 | ||
|
|
897a85a54c | ||
|
|
2b0cb9dbc0 | ||
|
|
c8ae2aa6f0 | ||
|
|
63af53fb34 | ||
|
|
498a8a28af | ||
|
|
20be5255a7 | ||
|
|
eb501486e4 | ||
|
|
66b4769369 | ||
|
|
65b82cf20d | ||
|
|
9a57ecc66b | ||
|
|
fcbe0626da | ||
|
|
82a1ed8180 | ||
|
|
1e971cc063 | ||
|
|
49c7338e9d | ||
|
|
a74d3106c0 | ||
|
|
a4e4c38423 | ||
|
|
d603a2805b | ||
|
|
84e26c07e2 | ||
|
|
8fdfaadf6d | ||
|
|
0c0977e61f | ||
|
|
012b4db5f6 | ||
|
|
d250e5a8b9 | ||
|
|
7abcf51a55 | ||
|
|
dbf0d34ac6 | ||
|
|
f65010ecb4 | ||
|
|
8a95e02d21 | ||
|
|
e18361b36c | ||
|
|
a2305d5c8c | ||
|
|
1250812203 | ||
|
|
2829a466dc | ||
|
|
7a4feb0ee7 | ||
|
|
071947cb38 | ||
|
|
8c8ea13ad3 | ||
|
|
70337cab58 | ||
|
|
614e412f01 | ||
|
|
f5730ec79b | ||
|
|
14f3725ed9 | ||
|
|
44a64b83b9 | ||
|
|
a7ec5b9531 | ||
|
|
2b06ba1f22 | ||
|
|
ca17fa3c6b | ||
|
|
e0459f3d06 | ||
|
|
a8f3944e65 | ||
|
|
409c84b7ef | ||
|
|
d69a102334 | ||
|
|
aa761f2583 | ||
|
|
71fbb7fe0c | ||
|
|
719a78ae73 | ||
|
|
6d6c011d30 | ||
|
|
0513a2d6a5 | ||
|
|
cfaac1eb28 | ||
|
|
c97a0545d3 | ||
|
|
546c5d6aa1 | ||
|
|
3bcb9e7e32 | ||
|
|
04880d329e | ||
|
|
d167a51ee6 | ||
|
|
a87f0a6ec4 | ||
|
|
c37229d763 | ||
|
|
1d634b9a80 | ||
|
|
a481b17a78 | ||
|
|
30bd4797ae | ||
|
|
5585f8c558 | ||
|
|
21b9709f6b | ||
|
|
db5c9ded56 | ||
|
|
4859efa72f | ||
|
|
a20770314e | ||
|
|
4ddc8a7f92 | ||
|
|
400be8581e | ||
|
|
553d06826d | ||
|
|
11a06eb264 | ||
|
|
1dc42a22a4 |
13
.editorconfig
Normal file
13
.editorconfig
Normal file
@@ -0,0 +1,13 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# Unix-style newlines and whitespace cleanup
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
# shell formatting
|
||||
[*.{sh,bash,zsh}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -11,3 +11,4 @@ scratch/
|
||||
|
||||
# do include Installomator .pkg files
|
||||
#!Installomator-*.pkg
|
||||
checkLabelCurrent.sh
|
||||
|
||||
12
CHANGELOG.md
12
CHANGELOG.md
@@ -1,9 +1,11 @@
|
||||
## v0.7 - pre-release
|
||||
## v0.7
|
||||
|
||||
- default for `BLOCKING_PROCESS_ACTION`is now `BLOCKING_PROCESS_ACTION=tell_user` and not `prompt_user`. It will demand the user to quit the app to get it updated, and not present any option to skip it. In considering various use cases in different MDM solutions this is the best option going forward. Users usually choose to update, and is most often not bothered much with this information. If it's absoultely a bad time, then they can move the dialog box to the side, and click it when ready.
|
||||
- script is now assembled from fragments. This helps avoid merging conflicts on git and allows the core team to work on the script logic while also accepting new labels. See the "Assemble Script ReadMe" for details.
|
||||
- We now detect App Store installed apps, and we do not replace them automatically. An example is Slack that will loose all settings if it is suddenly changed from App Store version to the "web" version (they differ in the handling of settings files). If `INSTALL=force` then we will replace the App Store app. We log all this.
|
||||
- Change in finding installed apps. We now look in /Applications and /Applications/Utilities first. If not found there, we use spotligt to find it. (We discovered a problem when a user has Parallels Windows installed with Microsoft Edge in it. Then Installomator wanted to update the app all the time, becaus spotligt found that Windows version of the app that Parallels created.)
|
||||
- Added bunch of new labels
|
||||
- Improved `buildCaseStatement.sh` a lot. It is a great start when figuring out how to create a new label for an app, or a piece of software.
|
||||
- Added bunch of new labels, and improved others.
|
||||
- Renamed `buildCaseStatement.sh` to `buildLabel.sh` and improved it a lot. It is a great start when figuring out how to create a new label for an app, or a piece of software. Look at the tutorials in our wiki.
|
||||
- Mosyle changed their app name from Business to Self-Service
|
||||
|
||||
## v0.6 - 2021-07-14
|
||||
@@ -22,10 +24,10 @@
|
||||
- Major update and now with help from @Theile and @Isaac
|
||||
- Added additional `BLOCKING_PROCESS_ACTION` handlings
|
||||
- Added additional `NOTIFY=all`. Usuful if used in Self Service, as the user will be notified before download, before install as well as when it is done.
|
||||
- Added variable `LOGO` for icons i dialogs, use `LOGO=appstore` (or `jamf` or `mosyleb` or `mosylem` or `addigy`). It's also possible to set it to a direct path to a specific icon. Default is `appstore`.
|
||||
- Added variable `LOGO` for icons i dialogs, use `LOGO=appstore` (or `jamf` or `mosyleb` or `mosylem` or `addigy`). It's also possible to set it to a direct path to a specific icon. Default is `appstore`.
|
||||
- Added variable `INSTALL` that can be set to `INSTALL=force` if software needs to be installed even though latest version is already installed (it will be a reinstall).
|
||||
- Version control now included. The variable `appNewVersion` in a label can be used to tell what the latest version from the web is. If this is not given, version checking is done after download.
|
||||
- For a label that only installs a pkg without an app in it, a variable `packageID` can be used for version checking.
|
||||
- For a label that only installs a pkg without an app in it, a variable `packageID` can be used for version checking.
|
||||
- Labels now sorted alphabetically, except for the Microsoft ones (that are at the end of the list). A bunch of new labels added, and lots of them have either been changed or improved (with `appNewVersion` og `packageID`).
|
||||
- If an app is asked to be closed down, it will now be opened again after the update.
|
||||
- If your MDM cannot call a script with parameters, the label can be set in the top of the script.
|
||||
|
||||
579
Installomator.sh
579
Installomator.sh
@@ -34,7 +34,7 @@ NOTIFY=success
|
||||
|
||||
|
||||
# behavior when blocking processes are found
|
||||
BLOCKING_PROCESS_ACTION=prompt_user
|
||||
BLOCKING_PROCESS_ACTION=tell_user
|
||||
# options:
|
||||
# - ignore continue even when blocking processes are found
|
||||
# - quit app will be told to quit nicely, if running
|
||||
@@ -51,6 +51,9 @@ BLOCKING_PROCESS_ACTION=prompt_user
|
||||
# - 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.
|
||||
@@ -68,7 +71,20 @@ LOGO=appstore
|
||||
# - 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 are escaped).
|
||||
# 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.
|
||||
# Shouldn’t give any problems for the user in most cases.
|
||||
# Known bad example: Slack will loose all settings.
|
||||
|
||||
|
||||
# install behavior
|
||||
@@ -185,8 +201,8 @@ REOPEN="yes"
|
||||
# - updateToolRunAsCurrentUser:
|
||||
# When this variable is set (any value), $updateTool will be run as the current user.
|
||||
#
|
||||
VERSION="0.7.0b1"
|
||||
VERSIONDATE="2021-08-17"
|
||||
VERSION="0.7.0"
|
||||
VERSIONDATE="2021-10-14"
|
||||
|
||||
# MARK: Functions
|
||||
|
||||
@@ -363,6 +379,16 @@ getAppVersion() {
|
||||
#appversion=$(mdls -name kMDItemVersion -raw $installedAppPath )
|
||||
appversion=$(defaults read $installedAppPath/Contents/Info.plist $versionKey) #Not dependant on Spotlight indexing
|
||||
printlog "found app at $installedAppPath, version $appversion"
|
||||
# Is current app from App Store
|
||||
if [[ -d "$installedAppPath"/Contents/_MASReceipt ]];then
|
||||
printlog "Installed $appName is from App Store, use “IGNORE_APP_STORE_APPS=yes” to replace."
|
||||
if [[ $IGNORE_APP_STORE_APPS == "yes" ]]; then
|
||||
printlog "Replacing App Store apps, no matter the version"
|
||||
appversion=0
|
||||
else
|
||||
cleanupAndExit 1 "App previously installed from App Store, and we respect that"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
printlog "could not determine location of $appName"
|
||||
fi
|
||||
@@ -963,6 +989,13 @@ airserver)
|
||||
#appNewVersion=$() # Cannot find version history or release notes on home page
|
||||
expectedTeamID="6C755KS5W3"
|
||||
;;
|
||||
airtame)
|
||||
name="Airtame"
|
||||
type="dmg"
|
||||
downloadURL="$(curl -fs https://airtame.com/download/ | grep -i platform=mac | head -1 | grep -o -i -E "https.*" | cut -d '"' -f1)"
|
||||
appNewVersion="$(curl -fsIL "${downloadURL}" | grep -i ^location | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')"
|
||||
expectedTeamID="4TPSP88HN2"
|
||||
;;
|
||||
aldente)
|
||||
name="AlDente"
|
||||
type="dmg"
|
||||
@@ -1032,14 +1065,14 @@ appcleaner)
|
||||
applenyfonts)
|
||||
name="Apple New York Font Collection"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/NY-Font.dmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/NY.dmg"
|
||||
packageID="com.apple.pkg.NYFonts"
|
||||
expectedTeamID="Development Update"
|
||||
;;
|
||||
applesfcompact)
|
||||
name="San Francisco Compact"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Font-Compact.dmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Compact.dmg"
|
||||
packageID="com.apple.pkg.SanFranciscoCompact"
|
||||
expectedTeamID="Development Update"
|
||||
;;
|
||||
@@ -1053,10 +1086,17 @@ applesfmono)
|
||||
applesfpro)
|
||||
name="San Francisco Pro"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Font-Pro.dmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Pro.dmg"
|
||||
packageID="com.apple.pkg.SanFranciscoPro"
|
||||
expectedTeamID="Development Update"
|
||||
;;
|
||||
applesfsymbols|\
|
||||
sfsymbols)
|
||||
name="SF Symbols"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://developer.apple.com/design/downloads/SF-Symbols.dmg"
|
||||
expectedTeamID="Software Update"
|
||||
;;
|
||||
aquaskk)
|
||||
# credit: Tadayuki Onishi (@kenchan0130)
|
||||
name="aquaskk"
|
||||
@@ -1103,6 +1143,13 @@ audacity)
|
||||
appNewVersion=$(versionFromGit audacity audacity)
|
||||
expectedTeamID="T3N4JQ7YY6"
|
||||
;;
|
||||
authydesktop)
|
||||
name="Authy Desktop"
|
||||
type="dmg"
|
||||
downloadURL="https://electron.authy.com/download?channel=stable&arch=x64&platform=darwin&version=latest&product=authy"
|
||||
appNewVersion="$(curl -sfL --output /dev/null -r 0-0 "${downloadURL}" --remote-header-name --remote-name -w "%{url_effective}\n" | grep -o -E '([a-zA-Z0-9\_.%-]*)\.(dmg|pkg|zip|tbz)$' | sed -E 's/.*-([0-9.]*)\.dmg/\1/g')"
|
||||
expectedTeamID="9EVH78F4V4"
|
||||
;;
|
||||
autodmg)
|
||||
# credit: Mischa van der Bent (@mischavdbent)
|
||||
name="AutoDMG"
|
||||
@@ -1197,7 +1244,7 @@ bitwarden)
|
||||
blender)
|
||||
name="blender"
|
||||
type="dmg"
|
||||
downloadURL=$(redirect=$(curl -sfL https://www.blender.org/download/ | sed 's/.*href="//' | sed 's/".*//' | grep .dmg) && curl -sfL "$redirect" | sed 's/.*href="//' | sed 's/".*//' | grep .dmg)
|
||||
downloadURL=$(redirect=$(curl -sfL https://www.blender.org/download/ | sed 's/.*href="//' | sed 's/".*//' | grep .dmg) && curl -sfL "$redirect" | sed 's/.*href="//' | sed 's/".*//' | grep -m1 .dmg)
|
||||
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)-.*/\1/g' )
|
||||
expectedTeamID="68UA947AUU"
|
||||
;;
|
||||
@@ -1224,12 +1271,19 @@ boxdrive)
|
||||
fi
|
||||
expectedTeamID="M683GB7CPW"
|
||||
;;
|
||||
boxsync)
|
||||
name="Box Sync"
|
||||
type="dmg"
|
||||
downloadURL="https://e3.boxcdn.net/box-installers/sync/Sync+4+External/Box%20Sync%20Installer.dmg"
|
||||
expectedTeamID="M683GB7CPW"
|
||||
;;
|
||||
boxtools)
|
||||
name="Box Tools"
|
||||
type="pkg"
|
||||
downloadURL="https://box-installers.s3.amazonaws.com/boxedit/mac/currentrelease/BoxToolsInstaller.pkg"
|
||||
expectedTeamID="M683GB7CPW"
|
||||
;;brave)
|
||||
name="Box Tools"
|
||||
type="pkg"
|
||||
downloadURL="https://box-installers.s3.amazonaws.com/boxedit/mac/currentrelease/BoxToolsInstaller.pkg"
|
||||
expectedTeamID="M683GB7CPW"
|
||||
;;
|
||||
brave)
|
||||
# credit: @securitygeneration
|
||||
name="Brave Browser"
|
||||
type="dmg"
|
||||
@@ -1265,6 +1319,10 @@ calibre)
|
||||
type="dmg"
|
||||
downloadURL="https://calibre-ebook.com/dist/osx"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
|
||||
#Maybe change to GitHub for this title. Looks like 5.28.0 release is the first to also release a binary, so maybe see what the next release will be to decide if we should switch.
|
||||
#downloadURL=$(downloadURLFromGit kovidgoyal calibre )
|
||||
#appNewVersion=$(versionFromGit kovidgoyal calibre )
|
||||
#archiveName="OS X dmg"
|
||||
expectedTeamID="NTY7FVCEKP"
|
||||
;;
|
||||
camostudio)
|
||||
@@ -1281,6 +1339,13 @@ camtasia)
|
||||
downloadURL=https://download.techsmith.com/camtasiamac/releases/Camtasia.dmg
|
||||
expectedTeamID="7TQL462TU8"
|
||||
;;
|
||||
cisdem-documentreader)
|
||||
name="cisdem-documentreader"
|
||||
type="dmg"
|
||||
downloadURL="https://download.cisdem.com/cisdem-documentreader.dmg"
|
||||
expectedTeamID="5HGV8EX6BQ"
|
||||
appName="Cisdem Document Reader.app"
|
||||
;;
|
||||
citrixworkspace)
|
||||
#credit: Erik Stam (@erikstam) and #Philipp on MacAdmins Slack
|
||||
name="Citrix Workspace"
|
||||
@@ -1290,10 +1355,9 @@ citrixworkspace)
|
||||
expectedTeamID="S272Y5R93J"
|
||||
;;
|
||||
clevershare2)
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="Clevershare"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs https://archive.clevertouch.com/clevershare2g | grep -i "_Mac" | tr '"' "\n" | grep "^http.*dmg")
|
||||
downloadURL=$(curl -fs https://www.clevertouch.com/eu/clevershare2g | grep -i -o -E "https.*Mac.*\.dmg")
|
||||
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z-]*_Mac\.([0-9.]*)\.[0-9]*\.dmg$/\1/g' )
|
||||
expectedTeamID="P76M9BE8DQ"
|
||||
;;
|
||||
@@ -1304,6 +1368,13 @@ clickshare)
|
||||
downloadURL=https://www.barco.com$(curl -fs "https://www.barco.com/en/clickshare/app" | grep -E -o '(\/\S*Download\?FileNumber=R3306192\S*ShowDownloadPage=False)' | tail -1)
|
||||
expectedTeamID="P6CDJZR997"
|
||||
;;
|
||||
cloudya)
|
||||
name="Cloudya"
|
||||
type="appInDmgInZip"
|
||||
downloadURL="$(curl -fs https://www.nfon.com/de/service/downloads | grep -i -E -o "https://cdn.cloudya.com/Cloudya-[.0-9]+-mac.zip")"
|
||||
appNewVersion="$(curl -fs https://www.nfon.com/de/service/downloads | grep -i -E -o "Cloudya Desktop App MAC [0-9.]*" | sed 's/^.*\ \([^ ]\{0,7\}\)$/\1/g')"
|
||||
expectedTeamID="X26F74J8TH"
|
||||
;;
|
||||
code42)
|
||||
# credit: Isaac Ordonez, Mann consulting (@mannconsulting)
|
||||
name="Code42"
|
||||
@@ -1320,13 +1391,14 @@ coderunner)
|
||||
expectedTeamID="R4GD98AJF9"
|
||||
;;
|
||||
colourcontrastanalyser)
|
||||
name="Colour Contrast Analyser (CCA)"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit ThePacielloGroup CCAe)
|
||||
appNewVersion=$(versionFromGit ThePacielloGroup CCAe)
|
||||
expectedTeamID="34RS4UC3M6"
|
||||
blockingProcesses=( NONE )
|
||||
;;cormorant)
|
||||
name="Colour Contrast Analyser (CCA)"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit ThePacielloGroup CCAe)
|
||||
appNewVersion=$(versionFromGit ThePacielloGroup CCAe)
|
||||
expectedTeamID="34RS4UC3M6"
|
||||
blockingProcesses=( NONE )
|
||||
;;
|
||||
cormorant)
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="Cormorant"
|
||||
type="zip"
|
||||
@@ -1334,6 +1406,14 @@ colourcontrastanalyser)
|
||||
appNewVersion=$(curl -fs https://eclecticlight.co/downloads/ | grep zip | grep -o -E "$name [0-9.]*" | awk '{print $2}')
|
||||
expectedTeamID="QWY4LRW926"
|
||||
;;
|
||||
craftmanager)
|
||||
name="CraftManager"
|
||||
type="zip"
|
||||
#downloadURL="https://craft-assets.invisionapp.com/CraftManager/production/CraftManager.zip"
|
||||
downloadURL="$(curl -fs https://craft-assets.invisionapp.com/CraftManager/production/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
|
||||
appNewVersion="$(curl -fs https://craft-assets.invisionapp.com/CraftManager/production/appcast.xml | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
|
||||
expectedTeamID="VRXQSNCL5W"
|
||||
;;
|
||||
cryptomator)
|
||||
name="Cryptomator"
|
||||
type="dmg"
|
||||
@@ -1416,7 +1496,14 @@ devonthink)
|
||||
appNewVersion=$( echo ${downloadURL} | tr '/' '\n' | grep "[0-9]" | grep "[.]" | head -1 )
|
||||
expectedTeamID="679S2QUWR8"
|
||||
;;
|
||||
dialpad)
|
||||
dialog)
|
||||
name="Dialog"
|
||||
type="pkg"
|
||||
downloadURL=$(downloadURLFromGit bartreardon Dialog-public )
|
||||
appNewVersion=$(versionFromGit bartreardon Dialog-public )
|
||||
expectedTeamID="PWA5E9TQ59"
|
||||
;;
|
||||
dialpad)
|
||||
# credit: @ehosaka
|
||||
name="Dialpad"
|
||||
type="dmg"
|
||||
@@ -1538,7 +1625,12 @@ ferdi)
|
||||
figma)
|
||||
name="Figma"
|
||||
type="zip"
|
||||
downloadURL="https://desktop.figma.com/mac/Figma.zip"
|
||||
if [[ $(arch) == "arm64" ]]; then
|
||||
downloadURL="https://desktop.figma.com/mac-arm/Figma.zip"
|
||||
elif [[ $(arch) == "i386" ]]; then
|
||||
downloadURL="https://desktop.figma.com/mac/Figma.zip"
|
||||
fi
|
||||
appNewVersion="$(curl -fsL https://desktop.figma.com/mac/RELEASE.json | awk -F '"' '{ print $8 }')"
|
||||
expectedTeamID="T8RA8NE3B7"
|
||||
;;
|
||||
firefox)
|
||||
@@ -1620,6 +1712,14 @@ firefoxpkg)
|
||||
expectedTeamID="43AQ936H96"
|
||||
blockingProcesses=( firefox )
|
||||
;;
|
||||
flowjo)
|
||||
name="FlowJo-OSX64-10.8.0"
|
||||
type="dmg"
|
||||
downloadURL="$(curl -fs "https://www.flowjo.com/solutions/flowjo/downloads" | grep -i -o -E "https.*\.dmg")"
|
||||
appNewVersion=$(echo "${downloadURL}" | tr "-" "\n" | grep dmg | sed -E 's/([0-9.]*)\.dmg/\1/g')
|
||||
expectedTeamID="C79HU5AD9V"
|
||||
appName="FlowJo.app"
|
||||
;;
|
||||
front)
|
||||
name="Front"
|
||||
type="dmg"
|
||||
@@ -1667,11 +1767,11 @@ googlechrome)
|
||||
if [[ $(arch) != "i386" ]]; then
|
||||
printlog "Architecture: arm64 (not i386)"
|
||||
downloadURL="https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg"
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac_arm64,stable/{print $3; exit}') # Credit: William Smith (@meck)
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac_arm64,stable/{print $3; exit}')
|
||||
else
|
||||
printlog "Architecture: i386"
|
||||
downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg"
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac,stable/{print $3; exit}') # Credit: William Smith (@meck)
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac,stable/{print $3; exit}')
|
||||
fi
|
||||
expectedTeamID="EQHXZ8M8AV"
|
||||
;;
|
||||
@@ -1791,9 +1891,8 @@ hancock)
|
||||
handbrake)
|
||||
name="HandBrake"
|
||||
type="dmg"
|
||||
downloadURL=$(curl --silent --fail "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" \
|
||||
| awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ { print \$4 }")
|
||||
appNewVersion=$(curl -sf "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" | awk -F '"' "/tag_name/ { print \$4 }")
|
||||
downloadURL=$(downloadURLFromGit HandBrake HandBrake )
|
||||
appNewVersion=$(versionFromGit HandBrake HandBrake )
|
||||
expectedTeamID="5X9DE89KYV"
|
||||
;;
|
||||
hazel)
|
||||
@@ -1839,7 +1938,7 @@ icons)
|
||||
expectedTeamID="7R5ZEU67FQ"
|
||||
;;
|
||||
imazingprofileeditor)
|
||||
# Credit: Bilal Habib @Pro4TLZZZ
|
||||
# Credit: Bilal Habib @Pro4TLZZ
|
||||
name="iMazing Profile Editor"
|
||||
type="dmg"
|
||||
downloadURL="https://downloads.imazing.com/mac/iMazing-Profile-Editor/iMazingProfileEditorMac.dmg"
|
||||
@@ -1853,6 +1952,13 @@ inkscape)
|
||||
#appNewVersion=$(curl -fsJL https://inkscape.org/release/ | grep "<h2>Inkscape" | cut -d '>' -f 3 | cut -d '<' -f 1 | sed 's/[^0-9.]*//g') # Can't figure out where exact new version is found. Currently returns 1.0, but version is "1.0.0 (4035a4f)"
|
||||
expectedTeamID="SW3D6BB6A6"
|
||||
;;
|
||||
insomnia)
|
||||
name="insomnia"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit kong insomnia)
|
||||
appNewVersion=$(versionFromGit kong insomnia)
|
||||
expectedTeamID="FX44YY62GV"
|
||||
;;
|
||||
installomator_theile)
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="Installomator"
|
||||
@@ -1883,7 +1989,7 @@ iterm2)
|
||||
;;
|
||||
jabradirect)
|
||||
name="Jabra Direct"
|
||||
type="dmg"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://jabraxpressonlineprdstor.blob.core.windows.net/jdo/JabraDirectSetup.dmg"
|
||||
expectedTeamID="55LV32M29R"
|
||||
appNewVersion=$(curl -fs https://www.jabra.com/Support/release-notes/release-note-jabra-direct | grep -o "Jabra Direct macOS:*.*<" | head -1 | cut -d ":" -f2 | cut -d " " -f2 | cut -d "<" -f1)
|
||||
@@ -1895,6 +2001,12 @@ jamfconnect)
|
||||
downloadURL="https://files.jamfconnect.com/JamfConnect.dmg"
|
||||
expectedTeamID="483DWKW443"
|
||||
;;
|
||||
jamfconnectconfiguration)
|
||||
name="Jamf Connect Configuration"
|
||||
type="dmg"
|
||||
downloadURL="https://files.jamfconnect.com/JamfConnect.dmg"
|
||||
expectedTeamID="483DWKW443"
|
||||
;;
|
||||
jamfmigrator)
|
||||
# credit: Mischa van der Bent
|
||||
name="jamf-migrator"
|
||||
@@ -1919,64 +2031,119 @@ jamfreenroller)
|
||||
#appNewVersion=$(versionFromGit jamf ReEnroller)
|
||||
expectedTeamID="PS2F6S478M"
|
||||
;;
|
||||
jetbrainsclion)
|
||||
name="CLion"
|
||||
type="dmg"
|
||||
jetbrainscode="CL"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainsdatagrip)
|
||||
# credit: AP Orlebeke (@apizz)
|
||||
name="DataGrip"
|
||||
type="dmg"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
if [[ $(arch) == "arm64" ]]; then
|
||||
downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o 'macM1*.*,' | cut -d '"' -f5)
|
||||
elif [[ $(arch) == "i386" ]]; then
|
||||
downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o 'mac*.*,' | cut -d '"' -f5)
|
||||
fi
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;jetbrainsintellijidea)
|
||||
# credit: Gabe Marchan (gabemarchan.com - @darklink87)
|
||||
name="DataGrip"
|
||||
type="dmg"
|
||||
jetbrainscode="DG"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainsintellijidea)
|
||||
name="IntelliJ IDEA"
|
||||
type="dmg"
|
||||
downloadURL="https://download.jetbrains.com/product?code=II&latest&distribution=mac"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=II&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
jetbrainscode="II"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainsintellijideace|\
|
||||
intellijideace)
|
||||
name="IntelliJ IDEA CE"
|
||||
type="dmg"
|
||||
downloadURL="https://download.jetbrains.com/product?code=IIC&latest&distribution=mac"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=IIC&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
jetbrainscode="IIC"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainsphpstorm)
|
||||
# credit: Casey Jensen (@cajenson01 on MacAdmins Slack)Appended by Skylar Damiano @catdad on MacAdmins Slack
|
||||
name="JetBrains PHPStorm"
|
||||
name="PHPStorm"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PS&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PS&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
jetbrainscode="PS"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainspycharm)
|
||||
# This is the Pro version of PyCharm.
|
||||
# Do not confuse with PyCharm CE.
|
||||
# This is the Pro version of PyCharm. Do not confuse with PyCharm CE.
|
||||
name="PyCharm"
|
||||
type="dmg"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PCP&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCP&latest&distribution=mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCP&latest&distribution=macM1"
|
||||
jetbrainscode="PCP"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainspycharmce|\
|
||||
pycharmce)
|
||||
name="PyCharm CE"
|
||||
type="dmg"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PCC&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCC&latest&distribution=mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCC&latest&distribution=macM1"
|
||||
jetbrainscode="PCC"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainstoolbox)
|
||||
name="JetBrains Toolbox"
|
||||
type="dmg"
|
||||
jetbrainscode="TBA"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
jetbrainswebstorm)
|
||||
name="Webstorm"
|
||||
type="dmg"
|
||||
jetbrainscode="WS"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
karabinerelements)
|
||||
@@ -2006,6 +2173,12 @@ keka)
|
||||
appNewVersion=$(versionFromGit aonez Keka)
|
||||
expectedTeamID="4FG648TM2A"
|
||||
;;
|
||||
keybase)
|
||||
name="Keybase"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -s https://keybase.io/docs/the_app/install_macos | grep data-target | cut -d '"' -f2)
|
||||
expectedTeamID="99229SGT5K"
|
||||
;;
|
||||
keyboardmaestro)
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="Keyboard Maestro"
|
||||
@@ -2103,8 +2276,10 @@ lucifer)
|
||||
lulu)
|
||||
name="LuLu"
|
||||
type="dmg"
|
||||
downloadURL=$( curl -fs "https://objective-see.com/products/lulu.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
|
||||
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
|
||||
#downloadURL=$( curl -fs "https://objective-see.com/products/lulu.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
|
||||
#appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
|
||||
downloadURL=$(downloadURLFromGit objective-see LuLu)
|
||||
appNewVersion=$(versionFromGit objective-see LuLu)
|
||||
expectedTeamID="VBG97UB4TA"
|
||||
;;
|
||||
macfuse)
|
||||
@@ -2152,6 +2327,14 @@ microsoftautoupdate)
|
||||
#updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
|
||||
#updateToolArguments=( --install --apps MSau04 )
|
||||
;;
|
||||
microsoftazurestorageexplorer)
|
||||
name="Microsoft Azure Storage Explorer"
|
||||
type="zip"
|
||||
downloadURL=$(downloadURLFromGit microsoft AzureStorageExplorer )
|
||||
appNewVersion=$(versionFromGit microsoft AzureStorageExplorer )
|
||||
expectedTeamID="UBF8T346G9"
|
||||
archiveName="Mac_StorageExplorer.zip"
|
||||
;;
|
||||
microsoftcompanyportal)
|
||||
name="Company Portal"
|
||||
type="pkg"
|
||||
@@ -2229,6 +2412,7 @@ microsoftofficebusinesspro)
|
||||
name="MicrosoftOfficeBusinessPro"
|
||||
type="pkg"
|
||||
downloadURL="https://go.microsoft.com/fwlink/?linkid=2009112"
|
||||
appNewVersion=$(curl -fsIL "$downloadURL" | grep -i location: | grep -o "/Microsoft_.*pkg" | cut -d "_" -f 3)
|
||||
expectedTeamID="UBF8T346G9"
|
||||
# using MS PowerPoint as the 'stand-in' for the entire suite
|
||||
appName="Microsoft PowerPoint.app"
|
||||
@@ -2310,10 +2494,8 @@ microsoftteams)
|
||||
type="pkg"
|
||||
packageID="com.microsoft.teams"
|
||||
downloadURL="https://go.microsoft.com/fwlink/?linkid=869428"
|
||||
#appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.teams.standalone"]/version' 2>/dev/null | sed -E 's/<version>([0-9.]*) .*/\1/')
|
||||
# Still using macadmin.software for version, as the path does not contain the version in a matching format. packageID can be used, but version is the same.
|
||||
appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.teams.standalone"]/version' 2>/dev/null | sed -E 's/<version>([0-9.]*) .*/\1/')
|
||||
# Looks like macadmin.software has package ID version. At least on 2021-05-28 version 1.00.411161 is matched on installed version and homepage.
|
||||
# Looks like macadmin.software has package ID version. At least on 202105-28 version 1.00.411161 is matched on installed version and homepage.
|
||||
expectedTeamID="UBF8T346G9"
|
||||
blockingProcesses=( Teams "Microsoft Teams Helper" )
|
||||
# Commenting out msupdate as it is not really supported *yet* for teams
|
||||
@@ -2358,6 +2540,14 @@ miro)
|
||||
downloadURL="https://desktop.miro.com/platforms/darwin/Miro.dmg"
|
||||
expectedTeamID="M3GM7MFY7U"
|
||||
;;
|
||||
montereyblocker)
|
||||
name="montereyblocker"
|
||||
type="pkg"
|
||||
packageID="dk.envo-it.montereyblocker"
|
||||
downloadURL=$(downloadURLFromGit Theile montereyblocker )
|
||||
appNewVersion=$(versionFromGit Theile montereyblocker )
|
||||
expectedTeamID="FXW6QXBFW5"
|
||||
;;
|
||||
musescore)
|
||||
name="MuseScore 3"
|
||||
type="dmg"
|
||||
@@ -2365,6 +2555,13 @@ musescore)
|
||||
appNewVersion=$(versionFromGit musescore MuseScore)
|
||||
expectedTeamID="6EPAF2X3PR"
|
||||
;;
|
||||
muzzle)
|
||||
name="Muzzle"
|
||||
type="zip"
|
||||
downloadURL="https://muzzleapp.com/binaries/muzzle.zip"
|
||||
appNewVersion=$(curl -fs https://muzzleapp.com/updates/ | grep -io 'h2.*Version.* [0-9.]*.*h2' | head -1 | sed -E 's/.*ersion *([0-9.]*).*/\1/g')
|
||||
expectedTeamID="49EYHPJ4Q3"
|
||||
;;
|
||||
netnewswire)
|
||||
name="NetNewsWire"
|
||||
type="zip"
|
||||
@@ -2544,6 +2741,12 @@ pacifist)
|
||||
downloadURL="https://charlessoft.com/cgi-bin/pacifist_download.cgi?type=dmg"
|
||||
expectedTeamID="HRLUCP7QP4"
|
||||
;;
|
||||
parsec)
|
||||
name="Parsec"
|
||||
type="pkg"
|
||||
downloadURL="https://builds.parsecgaming.com/package/parsec-macos.pkg"
|
||||
expectedTeamID="Y9MY52XZDB"
|
||||
;;
|
||||
pdfsam)
|
||||
name="PDFsam Basic"
|
||||
type="dmg"
|
||||
@@ -2551,6 +2754,13 @@ pdfsam)
|
||||
appNewVersion=$(versionFromGit torakiki pdfsam)
|
||||
expectedTeamID="8XM3GHX436"
|
||||
;;
|
||||
perimeter81)
|
||||
name="Perimeter 81"
|
||||
type="pkg"
|
||||
downloadURL="https://static.perimeter81.com/agents/mac/snapshot/latest/Perimeter81.pkg"
|
||||
appNewVersion="$(curl -fsIL "${downloadURL}" | grep -i ^x-amz-meta-version | sed -E 's/x-amz-meta-version: //' | cut -d"." -f1-3)"
|
||||
expectedTeamID="924635PD62"
|
||||
;;
|
||||
pitch)
|
||||
name="Pitch"
|
||||
type="dmg"
|
||||
@@ -2565,12 +2775,13 @@ plantronicshub)
|
||||
appNewVersion=$(curl -fs "https://www.poly.com/in/en/support/knowledge-base/kb-article-page?lang=en_US&urlName=Hub-Release-Notes&type=Product_Information__kav" | grep -o "(*.*<span>)" | head -1 | cut -d "(" -f2 | sed 's/\<\/span\>//g' | cut -d "<" -f1)
|
||||
;;
|
||||
platypus)
|
||||
name="Platypus"
|
||||
type="zip"
|
||||
downloadURL=$(downloadURLFromGit sveinbjornt Platypus)
|
||||
appNewVersion=$(versionFromGit sveinbjornt Platypus)
|
||||
expectedTeamID="55GP2M789L"
|
||||
;;plisteditpro)
|
||||
name="Platypus"
|
||||
type="zip"
|
||||
downloadURL=$(downloadURLFromGit sveinbjornt Platypus)
|
||||
appNewVersion=$(versionFromGit sveinbjornt Platypus)
|
||||
expectedTeamID="55GP2M789L"
|
||||
;;
|
||||
plisteditpro)
|
||||
name="PlistEdit Pro"
|
||||
type="zip"
|
||||
downloadURL="https://www.fatcatsoftware.com/plisteditpro/PlistEditPro.zip"
|
||||
@@ -2589,7 +2800,6 @@ prism9)
|
||||
type="dmg"
|
||||
downloadURL="https://cdn.graphpad.com/downloads/prism/9/InstallPrism9.dmg"
|
||||
expectedTeamID="YQ2D36NS9M"
|
||||
Company="GraphPad Software"
|
||||
;;
|
||||
privileges)
|
||||
# credit: Erik Stam (@erikstam)
|
||||
@@ -2722,11 +2932,19 @@ rocketchat)
|
||||
expectedTeamID="S6UPZG7ZR3"
|
||||
blockingProcesses=( Rocket.Chat )
|
||||
;;
|
||||
rodeconnect)
|
||||
name="RODE Connect"
|
||||
type="pkgInZip"
|
||||
#packageID="com.rodeconnect.installer" #Versioned wrong as 0 in 1.1.0 pkg
|
||||
downloadURL="https://cdn1.rode.com/rodeconnect_installer_mac.zip"
|
||||
appNewVersion="$(curl -fs https://rode.com/software/rode-connect | grep -i -o ">Current version .*<" | cut -d " " -f4)"
|
||||
expectedTeamID="Z9T72PWTJA"
|
||||
;;
|
||||
royaltsx)
|
||||
name="Royal TSX"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2)
|
||||
appNewVersion=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2)
|
||||
downloadURL=$(curl -fs https://royaltsx-v5.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2)
|
||||
appNewVersion=$(curl -fs https://royaltsx-v5.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2)
|
||||
expectedTeamID="VXP8K9EDP6"
|
||||
;;
|
||||
rstudio)
|
||||
@@ -2746,37 +2964,34 @@ santa)
|
||||
expectedTeamID="EQHXZ8M8AV"
|
||||
;;
|
||||
scaleft)
|
||||
name="ScaleFT"
|
||||
type="pkg"
|
||||
downloadURL="https://dist.scaleft.com/client-tools/mac/latest/ScaleFT.pkg"
|
||||
appNewVersion=$(curl -sf "https://dist.scaleft.com/client-tools/mac/" | awk '/dir/{i++}i==2' | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p')
|
||||
expectedTeamID="HV2G9Z3RP5"
|
||||
blockingProcesses=( ScaleFT )
|
||||
;;screamingfrogseospider)
|
||||
name="ScaleFT"
|
||||
type="pkg"
|
||||
downloadURL="https://dist.scaleft.com/client-tools/mac/latest/ScaleFT.pkg"
|
||||
appNewVersion=$(curl -sf "https://dist.scaleft.com/client-tools/mac/" | awk '/dir/{i++}i==2' | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p')
|
||||
expectedTeamID="HV2G9Z3RP5"
|
||||
blockingProcesses=( ScaleFT )
|
||||
;;
|
||||
screamingfrogseospider)
|
||||
name="Screaming Frog SEO Spider"
|
||||
type="dmg"
|
||||
downloadURL="https://download.screamingfrog.co.uk/products/seo-spider/ScreamingFrogSEOSpider-14.3.dmg"
|
||||
downloadURL=$(curl -fs "https://www.screamingfrog.co.uk/wp-content/themes/screamingfrog/inc/download-modal.php" | 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"
|
||||
;;
|
||||
screencloudplayer)
|
||||
# credit: AP Orlebeke (@apizz)
|
||||
name="ScreenCloud Player"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -sL "https://screencloud.com/download" | sed -n 's/^.*"url":"\([^"]*\)".*$/\1/p')
|
||||
expectedTeamID="3C4F953K6P"
|
||||
;;screenflick)
|
||||
# credit: AP Orlebeke (@apizz)
|
||||
name="ScreenCloud Player"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -sL "https://screencloud.com/download" | sed -n 's/^.*"url":"\([^"]*\)".*$/\1/p')
|
||||
expectedTeamID="3C4F953K6P"
|
||||
;;
|
||||
screenflick)
|
||||
# credit: Gabe Marchan (gabemarchan.com - @darklink87)
|
||||
name="Screenflick"
|
||||
type="zip"
|
||||
downloadURL="https://www.araelium.com/screenflick/downloads/Screenflick.zip"
|
||||
expectedTeamID="28488A87JB"
|
||||
;;
|
||||
sfsymbols)
|
||||
name="SF Symbols"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://developer.apple.com/design/downloads/SF-Symbols.dmg"
|
||||
expectedTeamID="Software Update"
|
||||
;;
|
||||
shield)
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="Shield"
|
||||
@@ -2825,12 +3040,12 @@ sizeup)
|
||||
expectedTeamID="GVZ7RF955D"
|
||||
;;
|
||||
sketch)
|
||||
name="Sketch"
|
||||
type="zip"
|
||||
downloadURL=$(curl -sf https://www.sketch.com/downloads/mac/ | grep 'href="https://download.sketch.com' | sed -E 's/.*href=\"(.*)\".?/\1/g')
|
||||
appNewVersion=$(curl -fs https://www.sketch.com/updates/ | grep "Sketch Version" | head -1 | sed -E 's/.*Version ([0-9.]*)<.*/\1/g') # version from update page
|
||||
expectedTeamID="WUGMZZ5K46"
|
||||
;;
|
||||
name="Sketch"
|
||||
type="zip"
|
||||
downloadURL=$(curl -sf https://www.sketch.com/downloads/mac/ | grep 'href="https://download.sketch.com' | sed -E 's/.*href=\"(.*)\".?/\1/g')
|
||||
appNewVersion=$(curl -fs https://www.sketch.com/updates/ | grep "Sketch Version" | head -1 | sed -E 's/.*Version ([0-9.]*)<.*/\1/g') # version from update page
|
||||
expectedTeamID="WUGMZZ5K46"
|
||||
;;
|
||||
skype)
|
||||
name="Skype"
|
||||
type="dmg"
|
||||
@@ -2843,14 +3058,16 @@ slack)
|
||||
name="Slack"
|
||||
type="dmg"
|
||||
downloadURL="https://slack.com/ssb/download-osx-universal" # Universal
|
||||
# if [[ $(arch) == "arm64" ]]; then
|
||||
# downloadURL="https://slack.com/ssb/download-osx-silicon"
|
||||
# elif [[ $(arch) == "i386" ]]; then
|
||||
# downloadURL="https://slack.com/ssb/download-osx"
|
||||
# fi
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*macos\/([0-9.]*)\/.*/\1/g' )
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | cut -d "/" -f6 )
|
||||
expectedTeamID="BQR82RBBHL"
|
||||
;;
|
||||
smartgit)
|
||||
name="SmartGit"
|
||||
type="dmg"
|
||||
downloadURL="https://www.syntevo.com$(curl -fs "https://www.syntevo.com/smartgit/download/" | grep -i -o -E "/downloads/.*/smartgit.*\.dmg")"
|
||||
appNewVersion="$(curl -fs "https://www.syntevo.com/smartgit/changelog.txt" | grep -i -E "SmartGit *[0-9.]* *.*" | head -1 | awk '{print $2}')"
|
||||
expectedTeamID="PHMY45PTNW"
|
||||
;;
|
||||
snagit|\
|
||||
snagit2021|\
|
||||
snagit2020)
|
||||
@@ -2887,10 +3104,20 @@ sourcetree)
|
||||
appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*\/Sourcetree_([0-9.]*)_[0-9]*\.zip/\1/g')
|
||||
expectedTeamID="UPXU4CQZ5P"
|
||||
;;
|
||||
splashtopsos)
|
||||
name="Splashtop SOS"
|
||||
type="dmg"
|
||||
downloadURL="https://download.splashtop.com/sos/SplashtopSOS.dmg"
|
||||
expectedTeamID="CPQQ3AW49Y"
|
||||
;;
|
||||
spotify)
|
||||
name="Spotify"
|
||||
type="dmg"
|
||||
downloadURL="https://download.scdn.co/Spotify.dmg"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
downloadURL="https://download.scdn.co/SpotifyARM64.dmg"
|
||||
elif [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://download.scdn.co/Spotify.dmg"
|
||||
fi
|
||||
# appNewVersion=$(curl -fs https://www.spotify.com/us/opensource/ | cat | grep -o "<td>.*.</td>" | head -1 | cut -d ">" -f2 | cut -d "<" -f1) # does not result in the same version as downloaded
|
||||
expectedTeamID="2FNC3A47ZF"
|
||||
;;
|
||||
@@ -2926,6 +3153,13 @@ swiftruntimeforcommandlinetools)
|
||||
downloadURL="https://updates.cdn-apple.com/2019/cert/061-41823-20191025-5efc5a59-d7dc-46d3-9096-396bb8cb4a73/SwiftRuntimeForCommandLineTools.dmg"
|
||||
expectedTeamID="Software Update"
|
||||
;;
|
||||
sync)
|
||||
name="Sync"
|
||||
type="dmg"
|
||||
downloadURL="https://www.sync.com/download/apple/Sync.dmg"
|
||||
appNewVersion="$(curl -fs "https://www.sync.com/blog/category/desktop/feed/" | xpath '(//channel/item/title)[1]' 2>/dev/null | sed -E 's/^.* ([0-9.]*) .*$/\1/g')"
|
||||
expectedTeamID="7QR39CMJ3W"
|
||||
;;
|
||||
tableaudesktop)
|
||||
name="Tableau Desktop"
|
||||
type="pkgInDmg"
|
||||
@@ -2940,6 +3174,13 @@ tableaureader)
|
||||
downloadURL="https://www.tableau.com/downloads/reader/mac"
|
||||
expectedTeamID="QJ4XPRK37C"
|
||||
;;
|
||||
tageditor)
|
||||
name="Tag Editor"
|
||||
type="dmg"
|
||||
downloadURL="https://amvidia.com/downloads/tag-editor-mac.dmg"
|
||||
appNewVersion=curl -sf "https://amvidia.com/tag-editor" | grep -o -E '"softwareVersion":.'"{8}" | sed 's/\"//g' | awk -F ': ' '{print $2}'
|
||||
expectedTeamID="F2TH9XX9CJ"
|
||||
;;
|
||||
taskpaper)
|
||||
# credit: Drew Diver (@grumpydrew on MacAdmins Slack)
|
||||
name="TaskPaper"
|
||||
@@ -3024,12 +3265,6 @@ thunderbird)
|
||||
expectedTeamID="43AQ936H96"
|
||||
blockingProcesses=( thunderbird )
|
||||
;;
|
||||
tigervnc)
|
||||
name="TigerVNC Viewer"
|
||||
type="dmg"
|
||||
downloadURL=https://dl.bintray.com/tigervnc/stable/$(curl -s -l https://dl.bintray.com/tigervnc/stable/ | grep .dmg | sed 's/<pre><a onclick="navi(event)" href="://' | sed 's/".*//' | sort -V | tail -1)
|
||||
expectedTeamID="S5LX88A9BW"
|
||||
;;
|
||||
toggltrack)
|
||||
name="Toggl Track"
|
||||
type="dmg"
|
||||
@@ -3037,6 +3272,13 @@ toggltrack)
|
||||
appNewVersion=$(versionFromGit toggl-open-source toggldesktop )
|
||||
expectedTeamID="B227VTMZ94"
|
||||
;;
|
||||
tom4aconverter)
|
||||
name="To M4A Converter"
|
||||
type="dmg"
|
||||
downloadURL="https://amvidia.com/downloads/to-m4a-converter-mac.dmg"
|
||||
appNewVersion=curl -sf "https://amvidia.com/to-m4a-converter" | grep -o -E '"softwareVersion":.'"{8}" | sed 's/\"//g' | awk -F ': ' '{print $2}'
|
||||
expectedTeamID="F2TH9XX9CJ"
|
||||
;;
|
||||
torbrowser)
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="Tor Browser"
|
||||
@@ -3086,6 +3328,13 @@ universaltypeclient)
|
||||
downloadURL=https://bin.extensis.com/$( curl -fs https://www.extensis.com/support/universal-type-server-7/ | grep -o "UTC-[0-9].*M.zip" )
|
||||
expectedTeamID="J6MMHGD9D6"
|
||||
;;
|
||||
utm)
|
||||
name="UTM"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit utmapp UTM )
|
||||
appNewVersion=$(versionFromGit utmapp UTM )
|
||||
expectedTeamID="WDNLXAD4W8"
|
||||
;;
|
||||
vagrant)
|
||||
# credit: AP Orlebeke (@apizz)
|
||||
name="Vagrant"
|
||||
@@ -3148,11 +3397,10 @@ vlc)
|
||||
expectedTeamID="75GAHG3SZQ"
|
||||
;;
|
||||
vmwarehorizonclient)
|
||||
# credit: Oh4sh0 https://github.com/Oh4sh0
|
||||
name="VMware Horizon Client"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | grep -o 'Url.*..dmg"' | cut -d '"' -f3)
|
||||
appNewVersion=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | sed 's/.*-\(.*\)-.*/\1/')
|
||||
downloadURL=$(curl -fsL "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | grep -o 'Url.*..dmg"' | cut -d '"' -f3)
|
||||
appNewVersion=$(curl -fsL "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | sed 's/.*-\(.*\)-.*/\1/')
|
||||
expectedTeamID="EG7KH642X6"
|
||||
;;
|
||||
vscodium)
|
||||
@@ -3166,6 +3414,14 @@ vscodium)
|
||||
appName="VSCodium.app"
|
||||
blockingProcesses=( Electron )
|
||||
;;
|
||||
wallyezflash)
|
||||
name="Wally"
|
||||
type="dmg"
|
||||
downloadURL="https://configure.zsa.io/wally/osx"
|
||||
#appNewVersion=$(curl -fsIL "${downloadURL}" | grep -i ^location | head -1 | sed -E 's/.*\/[a-zA-Z\-]*-([0-9.]*)\..*/\1/g')
|
||||
expectedTeamID="V32BWKSNYH"
|
||||
#versionKey="CFBundleVersion"
|
||||
;;
|
||||
webex|\
|
||||
webexteams)
|
||||
# credit: Erik Stam (@erikstam)
|
||||
@@ -3188,13 +3444,6 @@ webexmeetings)
|
||||
#blockingProcessesMaxCPU="5"
|
||||
blockingProcesses=( Webex )
|
||||
;;
|
||||
webexteams)
|
||||
# credit: Erik Stam (@erikstam)
|
||||
name="Webex Teams"
|
||||
type="dmg"
|
||||
downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg"
|
||||
expectedTeamID="DE8Y96K9QP"
|
||||
;;
|
||||
whatsapp)
|
||||
name="WhatsApp"
|
||||
type="dmg"
|
||||
@@ -3254,6 +3503,14 @@ xquartz)
|
||||
appNewVersion=$(versionFromGit XQuartz XQuartz)
|
||||
expectedTeamID="NA574AWV7E"
|
||||
;;
|
||||
yed)
|
||||
# This label assumes accept of these T&C’s: https://www.yworks.com/resources/yed/license.html
|
||||
name="yEd"
|
||||
type="dmg"
|
||||
downloadURL="https://www.yworks.com"$(curl -fs "https://www.yworks.com/products/yed/download" | grep -o -e "/resources/.*\.dmg" | tr " " '\n' | grep -o -e "/resources/.*\.dmg")
|
||||
appNewVersion=$(echo $downloadURL | sed -E 's/.*-([0-9.]*)_.*\.dmg/\1/')
|
||||
expectedTeamID="JD89S887M2"
|
||||
;;
|
||||
yubikeymanagerqt)
|
||||
# credit: Tadayuki Onishi (@kenchan0130)
|
||||
name="YubiKey Manager GUI"
|
||||
@@ -3269,19 +3526,34 @@ zappy)
|
||||
downloadURL="https://zappy.zapier.com/releases/zappy-latest.zip"
|
||||
expectedTeamID="6LS97Q5E79"
|
||||
;;
|
||||
zeplin)
|
||||
name="Zeplin"
|
||||
type="zip"
|
||||
downloadURL="https://zpl.io/download-mac"
|
||||
appNewVersion="$(curl -fs "https://api.appcenter.ms/v0.1/public/sparkle/apps/8926efff-e734-b6d3-03d0-9f41d90c34fc" | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | cut -d '"' -f 2)"
|
||||
expectedTeamID="8U3Y4X5WDQ"
|
||||
;;
|
||||
zohoworkdrive)
|
||||
# Using this label expects you to agree to these:
|
||||
# License Areemant: https://www.zoho.com/workdrive/zohoworkdrive-license-agreement.html
|
||||
# Privacy policy: https://www.zoho.com/privacy.html
|
||||
name="Zoho WorkDrive"
|
||||
type="dmg"
|
||||
lines=$(curl -fs https://www.zohowebstatic.com/sites/all/themes/zoho/scripts/workdrive.js | grep files-accl.zohopublic.com | tr '"' "\n")
|
||||
downloadURL=$(echo "$lines" | grep -i "files-accl.zohopublic.com")$(echo "$lines" | grep -i -A17 "files-accl.zohopublic.com" | grep -i -A2 macintosh | tail -1)
|
||||
expectedTeamID="TZ824L8Y37"
|
||||
;;
|
||||
zoom)
|
||||
# credit: Isaac Ordonez, Mann consulting (@mannconsulting)
|
||||
name="Zoom.us"
|
||||
name="zoom.us"
|
||||
type="pkg"
|
||||
downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg"
|
||||
appNewVersion=$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" "https://zoom.us/download" | grep Version | head -n 1 | sed -E 's/.* ([0-9.]* \(.*\)).*/\1/') # credit: Søren Theilgaard (@theilgaard)
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
blockingProcesses=( zoom.us )
|
||||
;;
|
||||
zoomclient)
|
||||
name="zoom.us"
|
||||
type="pkg"
|
||||
packageID="us.zoom.pkg.videmeeting"
|
||||
packageID="us.zoom.pkg.videomeeting"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://zoom.us/client/latest/Zoom.pkg"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
@@ -3292,15 +3564,22 @@ zoomclient)
|
||||
blockingProcesses=( zoom.us )
|
||||
#blockingProcessesMaxCPU="5"
|
||||
;;
|
||||
zoomgov)
|
||||
name="zoom.us"
|
||||
type="pkg"
|
||||
downloadURL="https://www.zoomgov.com/client/latest/ZoomInstallerIT.pkg"
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
;;
|
||||
zoomrooms)
|
||||
name="ZoomRooms"
|
||||
type="pkg"
|
||||
packageID="us.zoom.pkg.zp"
|
||||
downloadURL="https://zoom.us/client/latest/ZoomRooms.pkg"
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
name="ZoomRooms"
|
||||
type="pkg"
|
||||
packageID="us.zoom.pkg.zp"
|
||||
downloadURL="https://zoom.us/client/latest/ZoomRooms.pkg"
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
blockingProcesses=( "ZoomPresence" )
|
||||
;;
|
||||
;;
|
||||
zulujdk11)
|
||||
name="Zulu JDK 11"
|
||||
type="pkgInDmg"
|
||||
@@ -3341,18 +3620,18 @@ zulujdk15)
|
||||
appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
|
||||
;;
|
||||
zulujdk8)
|
||||
name="Zulu JDK 8"
|
||||
type="pkgInDmg"
|
||||
packageID="com.azulsystems.zulu.8"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*x64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*aarch64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
fi
|
||||
expectedTeamID="TDTHCUPYFR"
|
||||
appCustomVersion(){ if [ -f "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" ]; then /usr/bin/defaults read "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" "CFBundleName" | sed 's/Zulu //'; fi }
|
||||
appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
|
||||
;;
|
||||
name="Zulu JDK 8"
|
||||
type="pkgInDmg"
|
||||
packageID="com.azulsystems.zulu.8"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*x64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*aarch64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
fi
|
||||
expectedTeamID="TDTHCUPYFR"
|
||||
appCustomVersion(){ if [ -f "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" ]; then /usr/bin/defaults read "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" "CFBundleName" | sed 's/Zulu //'; fi }
|
||||
appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
|
||||
;;
|
||||
*)
|
||||
# unknown label
|
||||
#printlog "unknown label $label"
|
||||
|
||||
41
Labels.txt
41
Labels.txt
@@ -9,6 +9,7 @@ adobereaderdc-install
|
||||
adobereaderdc-update
|
||||
aircall
|
||||
airserver
|
||||
airtame
|
||||
aldente
|
||||
alfred
|
||||
alttab
|
||||
@@ -22,12 +23,14 @@ applenyfonts
|
||||
applesfcompact
|
||||
applesfmono
|
||||
applesfpro
|
||||
applesfsymbols
|
||||
aquaskk
|
||||
arq7
|
||||
asana
|
||||
atext
|
||||
atom
|
||||
audacity
|
||||
authydesktop
|
||||
autodmg
|
||||
autopkgr
|
||||
aviatrix
|
||||
@@ -43,18 +46,24 @@ bitwarden
|
||||
blender
|
||||
bluejeans
|
||||
boxdrive
|
||||
boxsync
|
||||
boxtools
|
||||
brave
|
||||
caffeine
|
||||
cakebrew
|
||||
calibre
|
||||
camostudio
|
||||
camtasia
|
||||
cisdem-documentreader
|
||||
citrixworkspace
|
||||
clevershare2
|
||||
clickshare
|
||||
cloudya
|
||||
code42
|
||||
coderunner
|
||||
colourcontrastanalyser
|
||||
cormorant
|
||||
craftmanager
|
||||
cryptomator
|
||||
cyberduck
|
||||
dangerzone
|
||||
@@ -66,7 +75,7 @@ depnotify
|
||||
desktoppr
|
||||
detectxswift
|
||||
devonthink
|
||||
dialpad
|
||||
dialog
|
||||
discord
|
||||
docker
|
||||
drift
|
||||
@@ -89,6 +98,7 @@ firefoxesr
|
||||
firefoxesr_intl
|
||||
firefoxesrpkg
|
||||
firefoxpkg
|
||||
flowjo
|
||||
front
|
||||
fsmonitor
|
||||
gimp
|
||||
@@ -118,23 +128,30 @@ hyper
|
||||
icons
|
||||
imazingprofileeditor
|
||||
inkscape
|
||||
insomnia
|
||||
installomator_theile
|
||||
intellijideace
|
||||
istatmenus
|
||||
iterm2
|
||||
jabradirect
|
||||
jamfconnect
|
||||
jamfconnectconfiguration
|
||||
jamfmigrator
|
||||
jamfpppcutility
|
||||
jamfreenroller
|
||||
jetbrainsclion
|
||||
jetbrainsdatagrip
|
||||
jetbrainsintellijidea
|
||||
jetbrainsintellijideace
|
||||
jetbrainsphpstorm
|
||||
jetbrainspycharm
|
||||
jetbrainspycharmce
|
||||
jetbrainstoolbox
|
||||
jetbrainswebstorm
|
||||
karabinerelements
|
||||
keepassxc
|
||||
keka
|
||||
keybase
|
||||
keyboardmaestro
|
||||
klokki
|
||||
knockknock
|
||||
@@ -153,6 +170,7 @@ malwarebytes
|
||||
mattermost
|
||||
menumeters
|
||||
microsoftautoupdate
|
||||
microsoftazurestorageexplorer
|
||||
microsoftcompanyportal
|
||||
microsoftdefenderatp
|
||||
microsoftedge
|
||||
@@ -174,7 +192,9 @@ microsoftvisualstudiocode
|
||||
microsoftword
|
||||
microsoftyammer
|
||||
miro
|
||||
montereyblocker
|
||||
musescore
|
||||
muzzle
|
||||
netnewswire
|
||||
nextcloud
|
||||
nomad
|
||||
@@ -198,10 +218,13 @@ openvpnconnect
|
||||
openvpnconnectv3
|
||||
opera
|
||||
pacifist
|
||||
parsec
|
||||
pdfsam
|
||||
perimeter81
|
||||
pitch
|
||||
plantronicshub
|
||||
platypus
|
||||
plisteditpro
|
||||
postman
|
||||
prism9
|
||||
privileges
|
||||
@@ -223,11 +246,14 @@ ringcentralmeetings
|
||||
ringcentralphone
|
||||
rocket
|
||||
rocketchat
|
||||
rodeconnect
|
||||
royaltsx
|
||||
rstudio
|
||||
santa
|
||||
scaleft
|
||||
screamingfrogseospider
|
||||
screencloudplayer
|
||||
screenflick
|
||||
sfsymbols
|
||||
shield
|
||||
sidekick
|
||||
@@ -238,6 +264,7 @@ sizeup
|
||||
sketch
|
||||
skype
|
||||
slack
|
||||
smartgit
|
||||
snagit
|
||||
snagit2020
|
||||
snagit2021
|
||||
@@ -246,13 +273,16 @@ sonos
|
||||
sonoss1
|
||||
sonoss2
|
||||
sourcetree
|
||||
splashtopsos
|
||||
spotify
|
||||
sublimetext
|
||||
supportapp
|
||||
suspiciouspackage
|
||||
swiftruntimeforcommandlinetools
|
||||
sync
|
||||
tableaudesktop
|
||||
tableaureader
|
||||
tageditor
|
||||
taskpaper
|
||||
teamviewer
|
||||
teamviewerhost
|
||||
@@ -264,8 +294,8 @@ textmate
|
||||
theunarchiver
|
||||
things
|
||||
thunderbird
|
||||
tigervnc
|
||||
toggltrack
|
||||
tom4aconverter
|
||||
torbrowser
|
||||
trex
|
||||
tunnelbear
|
||||
@@ -273,6 +303,7 @@ tunnelblick
|
||||
umbrellaroamingclient
|
||||
uniconverter
|
||||
universaltypeclient
|
||||
utm
|
||||
vagrant
|
||||
vanilla
|
||||
veracrypt
|
||||
@@ -283,10 +314,10 @@ vivaldi
|
||||
vlc
|
||||
vmwarehorizonclient
|
||||
vscodium
|
||||
wallyezflash
|
||||
webex
|
||||
webexmeetings
|
||||
webexteams
|
||||
webexteams
|
||||
whatsapp
|
||||
wickrme
|
||||
wickrpro
|
||||
@@ -295,10 +326,14 @@ wwdc
|
||||
xeroxphaser7800
|
||||
xink
|
||||
xquartz
|
||||
yed
|
||||
yubikeymanagerqt
|
||||
zappy
|
||||
zeplin
|
||||
zohoworkdrive
|
||||
zoom
|
||||
zoomclient
|
||||
zoomgov
|
||||
zoomrooms
|
||||
zulujdk11
|
||||
zulujdk13
|
||||
|
||||
25
README.md
25
README.md
@@ -4,7 +4,7 @@ _The one installer script to rule them all._
|
||||
|
||||
   
|
||||
|
||||
This script is in the "we find it useful, it is working for us" stage.
|
||||
This script is in the “we find it useful, it is working for us” stage.
|
||||
|
||||
Your production and deployment environment will be different, please test thoroughly before rolling it out to your production.
|
||||
|
||||
@@ -12,12 +12,16 @@ I have put a lot of work into making it stable and safe, but I cannot - of cours
|
||||
|
||||
## Support and Contributing
|
||||
|
||||
__Please note, that if you are contributing to this project with new labels or other suggestions in PRs, please put your changes in the fragmented files, not the full `Installomator.sh` script. The full script is now a build of the fragments, and will be overwritten. See the REAMDME.md file in the `utils` directory for detailed instructions.__
|
||||
|
||||
Discussion, support and advice around Installomator happens in the `#installomator` channel in the [MacAdmins.org Slack](https://macadmins.org). Go there for support questions.
|
||||
|
||||
Do not create an issue just when you have a questions, but do file an issue or pull request for bugs or wrong behavior. When in doubt, ask in the above Slack channel.
|
||||
|
||||
If you have added a new label, then please file a pull request. (and Thank you!)
|
||||
|
||||
We try to keep the script as short as possible, and with more than 300 labels, we can save 300 lines in the script, if we do not have credit lines on each of these. So we are thankful for your contribution, but we will be removing these lines in the coming releases.
|
||||
|
||||
## More reading
|
||||
|
||||
There are a few interesting post on Installomator on my weblog:
|
||||
@@ -85,7 +89,7 @@ Installomator can work with the following common archive and installer types:
|
||||
- dmg: for the common 'drag app to /Applications' installation style
|
||||
- zip: the application is just compressed with zip or or tbz
|
||||
|
||||
When the download yields a pkg file, Installomator will run `installer` to install it on the current system.
|
||||
When the download yields a pkg file, Installomator will run `installer` to install it on the current system.
|
||||
|
||||
Applications in dmgs or zips will be copied to `/Applications` and their owner will be set to the current user, so the install works like a standard drag'n drop installation.
|
||||
|
||||
@@ -131,7 +135,9 @@ googlechrome)
|
||||
|
||||
When you know how to extract these pieces of information from the application and/or download, then you can add an application to Installomator.
|
||||
|
||||
The script buildCaseStatement.sh can help with the label creation.
|
||||
The script `buildCaseStatement.sh` can help with the label creation.
|
||||
|
||||
Please note: Labels should be named in small caps, numbers 0-9, “-”, and “_”. No other characters allowed.
|
||||
|
||||
### Not specific to a management system
|
||||
|
||||
@@ -227,11 +233,12 @@ There are eight options:
|
||||
- `prompt_user`: (default) 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.
|
||||
|
||||
If any process was closed, Installomator will try to open the app again, after the update process is done.
|
||||
If any process was closed, Installomator will try to open the app again, after the update process is done.
|
||||
|
||||
### Notification
|
||||
|
||||
@@ -252,6 +259,12 @@ The `LOGO` variable is used for the icon shown in dialog boxes. There are these
|
||||
- `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 are escaped).
|
||||
|
||||
### App Store apps handling
|
||||
Default is `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. Shouldn’t give any problems for the user in most cases. Known bad example: Slack will loose all settings.
|
||||
|
||||
### Install behavior (force installation)
|
||||
|
||||
Since we now make a version checking, and only installs the software if the version is different, an `INSTALL` variable can be used to force the installation:
|
||||
@@ -339,7 +352,7 @@ Depending on the application or pkg there are a few more variables you can or ne
|
||||
dmg or zip:
|
||||
Applications will be copied to this directory.
|
||||
Default value is '`/Applications`' for dmg and zip installations.
|
||||
pkg:
|
||||
pkg:
|
||||
`targetDir` is used as the install-location. Default is '`/`'.
|
||||
|
||||
- `blockingProcesses`: (optional)
|
||||
@@ -364,7 +377,7 @@ Depending on the application or pkg there are a few more variables you can or ne
|
||||
e.g. `msupdate` (see microsoft installations)
|
||||
|
||||
- `updateToolRunAsCurrentUser`:
|
||||
When this variable is set (any value), `$updateTool` will be run as the current user. Default is unset and
|
||||
When this variable is set (any value), `$updateTool` will be run as the current user. Default is unset and
|
||||
|
||||
### Configuration from Arguments
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
cdef)
|
||||
# cdef currently not signed
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="cdef"
|
||||
type="pkg"
|
||||
downloadURL=$(downloadURLFromGit Shufflepuck cdef)
|
||||
appNewVersion=$(versionFromGit Shufflepuck cdef)
|
||||
#expectedTeamID="EM3ER8T33A"
|
||||
;;
|
||||
8
fragments/disabled/parallels.sh
Normal file
8
fragments/disabled/parallels.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
parallels)
|
||||
# This downloads an installer app, so not really useful here
|
||||
name="Parallels Desktop"
|
||||
type="dmg"
|
||||
downloadURL="https://parallels.com/directdownload/pd15/"
|
||||
appNewVersion=$(curl -fsIL "${downloadURL}" | grep -i ^location | tail -1 | cut -d "/" -f6)
|
||||
expectedTeamID="4C6364ACXT"
|
||||
;;
|
||||
@@ -173,6 +173,16 @@ getAppVersion() {
|
||||
#appversion=$(mdls -name kMDItemVersion -raw $installedAppPath )
|
||||
appversion=$(defaults read $installedAppPath/Contents/Info.plist $versionKey) #Not dependant on Spotlight indexing
|
||||
printlog "found app at $installedAppPath, version $appversion"
|
||||
# Is current app from App Store
|
||||
if [[ -d "$installedAppPath"/Contents/_MASReceipt ]];then
|
||||
printlog "Installed $appName is from App Store, use “IGNORE_APP_STORE_APPS=yes” to replace."
|
||||
if [[ $IGNORE_APP_STORE_APPS == "yes" ]]; then
|
||||
printlog "Replacing App Store apps, no matter the version"
|
||||
appversion=0
|
||||
else
|
||||
cleanupAndExit 1 "App previously installed from App Store, and we respect that"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
printlog "could not determine location of $appName"
|
||||
fi
|
||||
|
||||
@@ -34,7 +34,7 @@ NOTIFY=success
|
||||
|
||||
|
||||
# behavior when blocking processes are found
|
||||
BLOCKING_PROCESS_ACTION=prompt_user
|
||||
BLOCKING_PROCESS_ACTION=tell_user
|
||||
# options:
|
||||
# - ignore continue even when blocking processes are found
|
||||
# - quit app will be told to quit nicely, if running
|
||||
@@ -51,6 +51,9 @@ BLOCKING_PROCESS_ACTION=prompt_user
|
||||
# - 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.
|
||||
@@ -68,7 +71,20 @@ LOGO=appstore
|
||||
# - 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 are escaped).
|
||||
# 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.
|
||||
# Shouldn’t give any problems for the user in most cases.
|
||||
# Known bad example: Slack will loose all settings.
|
||||
|
||||
|
||||
# install behavior
|
||||
|
||||
7
fragments/labels/airtame.sh
Normal file
7
fragments/labels/airtame.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
airtame)
|
||||
name="Airtame"
|
||||
type="dmg"
|
||||
downloadURL="$(curl -fs https://airtame.com/download/ | grep -i platform=mac | head -1 | grep -o -i -E "https.*" | cut -d '"' -f1)"
|
||||
appNewVersion="$(curl -fsIL "${downloadURL}" | grep -i ^location | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')"
|
||||
expectedTeamID="4TPSP88HN2"
|
||||
;;
|
||||
@@ -1,7 +1,7 @@
|
||||
applenyfonts)
|
||||
name="Apple New York Font Collection"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/NY-Font.dmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/NY.dmg"
|
||||
packageID="com.apple.pkg.NYFonts"
|
||||
expectedTeamID="Development Update"
|
||||
;;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
applesfcompact)
|
||||
name="San Francisco Compact"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Font-Compact.dmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Compact.dmg"
|
||||
packageID="com.apple.pkg.SanFranciscoCompact"
|
||||
expectedTeamID="Development Update"
|
||||
;;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
applesfpro)
|
||||
name="San Francisco Pro"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Font-Pro.dmg"
|
||||
downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Pro.dmg"
|
||||
packageID="com.apple.pkg.SanFranciscoPro"
|
||||
expectedTeamID="Development Update"
|
||||
;;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
applesfsymbols|\
|
||||
sfsymbols)
|
||||
name="SF Symbols"
|
||||
type="pkgInDmg"
|
||||
7
fragments/labels/authydesktop.sh
Normal file
7
fragments/labels/authydesktop.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
authydesktop)
|
||||
name="Authy Desktop"
|
||||
type="dmg"
|
||||
downloadURL="https://electron.authy.com/download?channel=stable&arch=x64&platform=darwin&version=latest&product=authy"
|
||||
appNewVersion="$(curl -sfL --output /dev/null -r 0-0 "${downloadURL}" --remote-header-name --remote-name -w "%{url_effective}\n" | grep -o -E '([a-zA-Z0-9\_.%-]*)\.(dmg|pkg|zip|tbz)$' | sed -E 's/.*-([0-9.]*)\.dmg/\1/g')"
|
||||
expectedTeamID="9EVH78F4V4"
|
||||
;;
|
||||
@@ -1,7 +1,7 @@
|
||||
blender)
|
||||
name="blender"
|
||||
type="dmg"
|
||||
downloadURL=$(redirect=$(curl -sfL https://www.blender.org/download/ | sed 's/.*href="//' | sed 's/".*//' | grep .dmg) && curl -sfL "$redirect" | sed 's/.*href="//' | sed 's/".*//' | grep .dmg)
|
||||
downloadURL=$(redirect=$(curl -sfL https://www.blender.org/download/ | sed 's/.*href="//' | sed 's/".*//' | grep .dmg) && curl -sfL "$redirect" | sed 's/.*href="//' | sed 's/".*//' | grep -m1 .dmg)
|
||||
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)-.*/\1/g' )
|
||||
expectedTeamID="68UA947AUU"
|
||||
;;
|
||||
|
||||
6
fragments/labels/boxsync.sh
Normal file
6
fragments/labels/boxsync.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
boxsync)
|
||||
name="Box Sync"
|
||||
type="dmg"
|
||||
downloadURL="https://e3.boxcdn.net/box-installers/sync/Sync+4+External/Box%20Sync%20Installer.dmg"
|
||||
expectedTeamID="M683GB7CPW"
|
||||
;;
|
||||
@@ -1,6 +1,6 @@
|
||||
boxtools)
|
||||
name="Box Tools"
|
||||
type="pkg"
|
||||
downloadURL="https://box-installers.s3.amazonaws.com/boxedit/mac/currentrelease/BoxToolsInstaller.pkg"
|
||||
expectedTeamID="M683GB7CPW"
|
||||
;;
|
||||
name="Box Tools"
|
||||
type="pkg"
|
||||
downloadURL="https://box-installers.s3.amazonaws.com/boxedit/mac/currentrelease/BoxToolsInstaller.pkg"
|
||||
expectedTeamID="M683GB7CPW"
|
||||
;;
|
||||
|
||||
@@ -4,5 +4,9 @@ calibre)
|
||||
type="dmg"
|
||||
downloadURL="https://calibre-ebook.com/dist/osx"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
|
||||
#Maybe change to GitHub for this title. Looks like 5.28.0 release is the first to also release a binary, so maybe see what the next release will be to decide if we should switch.
|
||||
#downloadURL=$(downloadURLFromGit kovidgoyal calibre )
|
||||
#appNewVersion=$(versionFromGit kovidgoyal calibre )
|
||||
#archiveName="OS X dmg"
|
||||
expectedTeamID="NTY7FVCEKP"
|
||||
;;
|
||||
|
||||
7
fragments/labels/cisdem-documentreader.sh
Normal file
7
fragments/labels/cisdem-documentreader.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
cisdem-documentreader)
|
||||
name="cisdem-documentreader"
|
||||
type="dmg"
|
||||
downloadURL="https://download.cisdem.com/cisdem-documentreader.dmg"
|
||||
expectedTeamID="5HGV8EX6BQ"
|
||||
appName="Cisdem Document Reader.app"
|
||||
;;
|
||||
@@ -1,8 +1,7 @@
|
||||
clevershare2)
|
||||
# credit: Søren Theilgaard (@theilgaard)
|
||||
name="Clevershare"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs https://archive.clevertouch.com/clevershare2g | grep -i "_Mac" | tr '"' "\n" | grep "^http.*dmg")
|
||||
downloadURL=$(curl -fs https://www.clevertouch.com/eu/clevershare2g | grep -i -o -E "https.*Mac.*\.dmg")
|
||||
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z-]*_Mac\.([0-9.]*)\.[0-9]*\.dmg$/\1/g' )
|
||||
expectedTeamID="P76M9BE8DQ"
|
||||
;;
|
||||
|
||||
7
fragments/labels/cloudya.sh
Normal file
7
fragments/labels/cloudya.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
cloudya)
|
||||
name="Cloudya"
|
||||
type="appInDmgInZip"
|
||||
downloadURL="$(curl -fs https://www.nfon.com/de/service/downloads | grep -i -E -o "https://cdn.cloudya.com/Cloudya-[.0-9]+-mac.zip")"
|
||||
appNewVersion="$(curl -fs https://www.nfon.com/de/service/downloads | grep -i -E -o "Cloudya Desktop App MAC [0-9.]*" | sed 's/^.*\ \([^ ]\{0,7\}\)$/\1/g')"
|
||||
expectedTeamID="X26F74J8TH"
|
||||
;;
|
||||
@@ -1,8 +1,8 @@
|
||||
colourcontrastanalyser)
|
||||
name="Colour Contrast Analyser (CCA)"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit ThePacielloGroup CCAe)
|
||||
appNewVersion=$(versionFromGit ThePacielloGroup CCAe)
|
||||
expectedTeamID="34RS4UC3M6"
|
||||
blockingProcesses=( NONE )
|
||||
;;
|
||||
name="Colour Contrast Analyser (CCA)"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit ThePacielloGroup CCAe)
|
||||
appNewVersion=$(versionFromGit ThePacielloGroup CCAe)
|
||||
expectedTeamID="34RS4UC3M6"
|
||||
blockingProcesses=( NONE )
|
||||
;;
|
||||
|
||||
8
fragments/labels/craftmanager.sh
Normal file
8
fragments/labels/craftmanager.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
craftmanager)
|
||||
name="CraftManager"
|
||||
type="zip"
|
||||
#downloadURL="https://craft-assets.invisionapp.com/CraftManager/production/CraftManager.zip"
|
||||
downloadURL="$(curl -fs https://craft-assets.invisionapp.com/CraftManager/production/appcast.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
|
||||
appNewVersion="$(curl -fs https://craft-assets.invisionapp.com/CraftManager/production/appcast.xml | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
|
||||
expectedTeamID="VRXQSNCL5W"
|
||||
;;
|
||||
8
fragments/labels/dialog.sh
Normal file
8
fragments/labels/dialog.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
dialog)
|
||||
name="Dialog"
|
||||
type="pkg"
|
||||
downloadURL=$(downloadURLFromGit bartreardon Dialog-public )
|
||||
appNewVersion=$(versionFromGit bartreardon Dialog-public )
|
||||
expectedTeamID="PWA5E9TQ59"
|
||||
;;
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
figma)
|
||||
name="Figma"
|
||||
type="zip"
|
||||
downloadURL="https://desktop.figma.com/mac/Figma.zip"
|
||||
if [[ $(arch) == "arm64" ]]; then
|
||||
downloadURL="https://desktop.figma.com/mac-arm/Figma.zip"
|
||||
elif [[ $(arch) == "i386" ]]; then
|
||||
downloadURL="https://desktop.figma.com/mac/Figma.zip"
|
||||
fi
|
||||
appNewVersion="$(curl -fsL https://desktop.figma.com/mac/RELEASE.json | awk -F '"' '{ print $8 }')"
|
||||
expectedTeamID="T8RA8NE3B7"
|
||||
;;
|
||||
|
||||
8
fragments/labels/flowjo.sh
Normal file
8
fragments/labels/flowjo.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
flowjo)
|
||||
name="FlowJo-OSX64-10.8.0"
|
||||
type="dmg"
|
||||
downloadURL="$(curl -fs "https://www.flowjo.com/solutions/flowjo/downloads" | grep -i -o -E "https.*\.dmg")"
|
||||
appNewVersion=$(echo "${downloadURL}" | tr "-" "\n" | grep dmg | sed -E 's/([0-9.]*)\.dmg/\1/g')
|
||||
expectedTeamID="C79HU5AD9V"
|
||||
appName="FlowJo.app"
|
||||
;;
|
||||
@@ -4,11 +4,11 @@ googlechrome)
|
||||
if [[ $(arch) != "i386" ]]; then
|
||||
printlog "Architecture: arm64 (not i386)"
|
||||
downloadURL="https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg"
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac_arm64,stable/{print $3; exit}') # Credit: William Smith (@meck)
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac_arm64,stable/{print $3; exit}')
|
||||
else
|
||||
printlog "Architecture: i386"
|
||||
downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg"
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac,stable/{print $3; exit}') # Credit: William Smith (@meck)
|
||||
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac,stable/{print $3; exit}')
|
||||
fi
|
||||
expectedTeamID="EQHXZ8M8AV"
|
||||
;;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
handbrake)
|
||||
name="HandBrake"
|
||||
type="dmg"
|
||||
downloadURL=$(curl --silent --fail "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" \
|
||||
| awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ { print \$4 }")
|
||||
appNewVersion=$(curl -sf "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" | awk -F '"' "/tag_name/ { print \$4 }")
|
||||
downloadURL=$(downloadURLFromGit HandBrake HandBrake )
|
||||
appNewVersion=$(versionFromGit HandBrake HandBrake )
|
||||
expectedTeamID="5X9DE89KYV"
|
||||
;;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
imazingprofileeditor)
|
||||
# Credit: Bilal Habib @Pro4TLZZZ
|
||||
# Credit: Bilal Habib @Pro4TLZZ
|
||||
name="iMazing Profile Editor"
|
||||
type="dmg"
|
||||
downloadURL="https://downloads.imazing.com/mac/iMazing-Profile-Editor/iMazingProfileEditorMac.dmg"
|
||||
|
||||
7
fragments/labels/insomnia.sh
Normal file
7
fragments/labels/insomnia.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
insomnia)
|
||||
name="insomnia"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit kong insomnia)
|
||||
appNewVersion=$(versionFromGit kong insomnia)
|
||||
expectedTeamID="FX44YY62GV"
|
||||
;;
|
||||
@@ -1,6 +1,6 @@
|
||||
jabradirect)
|
||||
name="Jabra Direct"
|
||||
type="dmg"
|
||||
type="pkgInDmg"
|
||||
downloadURL="https://jabraxpressonlineprdstor.blob.core.windows.net/jdo/JabraDirectSetup.dmg"
|
||||
expectedTeamID="55LV32M29R"
|
||||
appNewVersion=$(curl -fs https://www.jabra.com/Support/release-notes/release-note-jabra-direct | grep -o "Jabra Direct macOS:*.*<" | head -1 | cut -d ":" -f2 | cut -d " " -f2 | cut -d "<" -f1)
|
||||
|
||||
6
fragments/labels/jamfconnectconfiguration.sh
Normal file
6
fragments/labels/jamfconnectconfiguration.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
jamfconnectconfiguration)
|
||||
name="Jamf Connect Configuration"
|
||||
type="dmg"
|
||||
downloadURL="https://files.jamfconnect.com/JamfConnect.dmg"
|
||||
expectedTeamID="483DWKW443"
|
||||
;;
|
||||
12
fragments/labels/jetbrainsclion.sh
Normal file
12
fragments/labels/jetbrainsclion.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
jetbrainsclion)
|
||||
name="CLion"
|
||||
type="dmg"
|
||||
jetbrainscode="CL"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
@@ -1,12 +1,13 @@
|
||||
jetbrainsdatagrip)
|
||||
# credit: AP Orlebeke (@apizz)
|
||||
name="DataGrip"
|
||||
type="dmg"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
if [[ $(arch) == "arm64" ]]; then
|
||||
downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o 'macM1*.*,' | cut -d '"' -f5)
|
||||
elif [[ $(arch) == "i386" ]]; then
|
||||
downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o 'mac*.*,' | cut -d '"' -f5)
|
||||
fi
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
name="DataGrip"
|
||||
type="dmg"
|
||||
jetbrainscode="DG"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
jetbrainsintellijidea)
|
||||
# credit: Gabe Marchan (gabemarchan.com - @darklink87)
|
||||
name="IntelliJ IDEA"
|
||||
type="dmg"
|
||||
downloadURL="https://download.jetbrains.com/product?code=II&latest&distribution=mac"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=II&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
jetbrainscode="II"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
|
||||
@@ -2,7 +2,13 @@ jetbrainsintellijideace|\
|
||||
intellijideace)
|
||||
name="IntelliJ IDEA CE"
|
||||
type="dmg"
|
||||
downloadURL="https://download.jetbrains.com/product?code=IIC&latest&distribution=mac"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=IIC&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
jetbrainscode="IIC"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
jetbrainsphpstorm)
|
||||
# credit: Casey Jensen (@cajenson01 on MacAdmins Slack)Appended by Skylar Damiano @catdad on MacAdmins Slack
|
||||
name="JetBrains PHPStorm"
|
||||
name="PHPStorm"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PS&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PS&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
jetbrainscode="PS"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
jetbrainsdistribution="mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
jetbrainspycharm)
|
||||
# This is the Pro version of PyCharm.
|
||||
# Do not confuse with PyCharm CE.
|
||||
# This is the Pro version of PyCharm. Do not confuse with PyCharm CE.
|
||||
name="PyCharm"
|
||||
type="dmg"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PCP&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCP&latest&distribution=mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCP&latest&distribution=macM1"
|
||||
jetbrainscode="PCP"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
|
||||
@@ -2,11 +2,12 @@ jetbrainspycharmce|\
|
||||
pycharmce)
|
||||
name="PyCharm CE"
|
||||
type="dmg"
|
||||
appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PCC&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCC&latest&distribution=mac"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL="https://download.jetbrains.com/product?code=PCC&latest&distribution=macM1"
|
||||
jetbrainscode="PCC"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
|
||||
12
fragments/labels/jetbrainstoolbox.sh
Normal file
12
fragments/labels/jetbrainstoolbox.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
jetbrainstoolbox)
|
||||
name="JetBrains Toolbox"
|
||||
type="dmg"
|
||||
jetbrainscode="TBA"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
12
fragments/labels/jetbrainswebstorm.sh
Normal file
12
fragments/labels/jetbrainswebstorm.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
jetbrainswebstorm)
|
||||
name="Webstorm"
|
||||
type="dmg"
|
||||
jetbrainscode="WS"
|
||||
jetbrainsdistribution="mac"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
jetbrainsdistribution="macM1"
|
||||
fi
|
||||
downloadURL="https://download.jetbrains.com/product?code=${jetbrainscode}&latest&distribution=${jetbrainsdistribution}"
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "location" | tail -1 | sed -E 's/.*\/[a-zA-Z-]*-([0-9.]*).*[-.].*dmg/\1/g' )
|
||||
expectedTeamID="2ZEFAR8TH3"
|
||||
;;
|
||||
6
fragments/labels/keybase.sh
Normal file
6
fragments/labels/keybase.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
keybase)
|
||||
name="Keybase"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -s https://keybase.io/docs/the_app/install_macos | grep data-target | cut -d '"' -f2)
|
||||
expectedTeamID="99229SGT5K"
|
||||
;;
|
||||
@@ -1,7 +1,9 @@
|
||||
lulu)
|
||||
name="LuLu"
|
||||
type="dmg"
|
||||
downloadURL=$( curl -fs "https://objective-see.com/products/lulu.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
|
||||
appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
|
||||
#downloadURL=$( curl -fs "https://objective-see.com/products/lulu.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
|
||||
#appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
|
||||
downloadURL=$(downloadURLFromGit objective-see LuLu)
|
||||
appNewVersion=$(versionFromGit objective-see LuLu)
|
||||
expectedTeamID="VBG97UB4TA"
|
||||
;;
|
||||
|
||||
8
fragments/labels/microsoftazurestorageexplorer.sh
Normal file
8
fragments/labels/microsoftazurestorageexplorer.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
microsoftazurestorageexplorer)
|
||||
name="Microsoft Azure Storage Explorer"
|
||||
type="zip"
|
||||
downloadURL=$(downloadURLFromGit microsoft AzureStorageExplorer )
|
||||
appNewVersion=$(versionFromGit microsoft AzureStorageExplorer )
|
||||
expectedTeamID="UBF8T346G9"
|
||||
archiveName="Mac_StorageExplorer.zip"
|
||||
;;
|
||||
@@ -2,6 +2,7 @@ microsoftofficebusinesspro)
|
||||
name="MicrosoftOfficeBusinessPro"
|
||||
type="pkg"
|
||||
downloadURL="https://go.microsoft.com/fwlink/?linkid=2009112"
|
||||
appNewVersion=$(curl -fsIL "$downloadURL" | grep -i location: | grep -o "/Microsoft_.*pkg" | cut -d "_" -f 3)
|
||||
expectedTeamID="UBF8T346G9"
|
||||
# using MS PowerPoint as the 'stand-in' for the entire suite
|
||||
appName="Microsoft PowerPoint.app"
|
||||
|
||||
@@ -3,10 +3,8 @@ microsoftteams)
|
||||
type="pkg"
|
||||
packageID="com.microsoft.teams"
|
||||
downloadURL="https://go.microsoft.com/fwlink/?linkid=869428"
|
||||
#appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.teams.standalone"]/version' 2>/dev/null | sed -E 's/<version>([0-9.]*) .*/\1/')
|
||||
# Still using macadmin.software for version, as the path does not contain the version in a matching format. packageID can be used, but version is the same.
|
||||
appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.teams.standalone"]/version' 2>/dev/null | sed -E 's/<version>([0-9.]*) .*/\1/')
|
||||
# Looks like macadmin.software has package ID version. At least on 2021-05-28 version 1.00.411161 is matched on installed version and homepage.
|
||||
# Looks like macadmin.software has package ID version. At least on 202105-28 version 1.00.411161 is matched on installed version and homepage.
|
||||
expectedTeamID="UBF8T346G9"
|
||||
blockingProcesses=( Teams "Microsoft Teams Helper" )
|
||||
# Commenting out msupdate as it is not really supported *yet* for teams
|
||||
|
||||
8
fragments/labels/montereyblocker.sh
Normal file
8
fragments/labels/montereyblocker.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
montereyblocker)
|
||||
name="montereyblocker"
|
||||
type="pkg"
|
||||
packageID="dk.envo-it.montereyblocker"
|
||||
downloadURL=$(downloadURLFromGit Theile montereyblocker )
|
||||
appNewVersion=$(versionFromGit Theile montereyblocker )
|
||||
expectedTeamID="FXW6QXBFW5"
|
||||
;;
|
||||
7
fragments/labels/muzzle.sh
Normal file
7
fragments/labels/muzzle.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
muzzle)
|
||||
name="Muzzle"
|
||||
type="zip"
|
||||
downloadURL="https://muzzleapp.com/binaries/muzzle.zip"
|
||||
appNewVersion=$(curl -fs https://muzzleapp.com/updates/ | grep -io 'h2.*Version.* [0-9.]*.*h2' | head -1 | sed -E 's/.*ersion *([0-9.]*).*/\1/g')
|
||||
expectedTeamID="49EYHPJ4Q3"
|
||||
;;
|
||||
6
fragments/labels/parsec.sh
Normal file
6
fragments/labels/parsec.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
parsec)
|
||||
name="Parsec"
|
||||
type="pkg"
|
||||
downloadURL="https://builds.parsecgaming.com/package/parsec-macos.pkg"
|
||||
expectedTeamID="Y9MY52XZDB"
|
||||
;;
|
||||
7
fragments/labels/perimeter81.sh
Normal file
7
fragments/labels/perimeter81.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
perimeter81)
|
||||
name="Perimeter 81"
|
||||
type="pkg"
|
||||
downloadURL="https://static.perimeter81.com/agents/mac/snapshot/latest/Perimeter81.pkg"
|
||||
appNewVersion="$(curl -fsIL "${downloadURL}" | grep -i ^x-amz-meta-version | sed -E 's/x-amz-meta-version: //' | cut -d"." -f1-3)"
|
||||
expectedTeamID="924635PD62"
|
||||
;;
|
||||
@@ -1,7 +1,7 @@
|
||||
platypus)
|
||||
name="Platypus"
|
||||
type="zip"
|
||||
downloadURL=$(downloadURLFromGit sveinbjornt Platypus)
|
||||
appNewVersion=$(versionFromGit sveinbjornt Platypus)
|
||||
expectedTeamID="55GP2M789L"
|
||||
;;
|
||||
name="Platypus"
|
||||
type="zip"
|
||||
downloadURL=$(downloadURLFromGit sveinbjornt Platypus)
|
||||
appNewVersion=$(versionFromGit sveinbjornt Platypus)
|
||||
expectedTeamID="55GP2M789L"
|
||||
;;
|
||||
|
||||
@@ -3,5 +3,4 @@ prism9)
|
||||
type="dmg"
|
||||
downloadURL="https://cdn.graphpad.com/downloads/prism/9/InstallPrism9.dmg"
|
||||
expectedTeamID="YQ2D36NS9M"
|
||||
Company="GraphPad Software"
|
||||
;;
|
||||
|
||||
8
fragments/labels/rodeconnect.sh
Normal file
8
fragments/labels/rodeconnect.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
rodeconnect)
|
||||
name="RODE Connect"
|
||||
type="pkgInZip"
|
||||
#packageID="com.rodeconnect.installer" #Versioned wrong as 0 in 1.1.0 pkg
|
||||
downloadURL="https://cdn1.rode.com/rodeconnect_installer_mac.zip"
|
||||
appNewVersion="$(curl -fs https://rode.com/software/rode-connect | grep -i -o ">Current version .*<" | cut -d " " -f4)"
|
||||
expectedTeamID="Z9T72PWTJA"
|
||||
;;
|
||||
@@ -1,7 +1,7 @@
|
||||
royaltsx)
|
||||
name="Royal TSX"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2)
|
||||
appNewVersion=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2)
|
||||
downloadURL=$(curl -fs https://royaltsx-v5.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2)
|
||||
appNewVersion=$(curl -fs https://royaltsx-v5.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2)
|
||||
expectedTeamID="VXP8K9EDP6"
|
||||
;;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
scaleft)
|
||||
name="ScaleFT"
|
||||
type="pkg"
|
||||
downloadURL="https://dist.scaleft.com/client-tools/mac/latest/ScaleFT.pkg"
|
||||
appNewVersion=$(curl -sf "https://dist.scaleft.com/client-tools/mac/" | awk '/dir/{i++}i==2' | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p')
|
||||
expectedTeamID="HV2G9Z3RP5"
|
||||
blockingProcesses=( ScaleFT )
|
||||
;;
|
||||
name="ScaleFT"
|
||||
type="pkg"
|
||||
downloadURL="https://dist.scaleft.com/client-tools/mac/latest/ScaleFT.pkg"
|
||||
appNewVersion=$(curl -sf "https://dist.scaleft.com/client-tools/mac/" | awk '/dir/{i++}i==2' | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p')
|
||||
expectedTeamID="HV2G9Z3RP5"
|
||||
blockingProcesses=( ScaleFT )
|
||||
;;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
screamingfrogseospider)
|
||||
name="Screaming Frog SEO Spider"
|
||||
type="dmg"
|
||||
downloadURL="https://download.screamingfrog.co.uk/products/seo-spider/ScreamingFrogSEOSpider-14.3.dmg"
|
||||
downloadURL=$(curl -fs "https://www.screamingfrog.co.uk/wp-content/themes/screamingfrog/inc/download-modal.php" | 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"
|
||||
;;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
screencloudplayer)
|
||||
# credit: AP Orlebeke (@apizz)
|
||||
name="ScreenCloud Player"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -sL "https://screencloud.com/download" | sed -n 's/^.*"url":"\([^"]*\)".*$/\1/p')
|
||||
expectedTeamID="3C4F953K6P"
|
||||
;;
|
||||
# credit: AP Orlebeke (@apizz)
|
||||
name="ScreenCloud Player"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -sL "https://screencloud.com/download" | sed -n 's/^.*"url":"\([^"]*\)".*$/\1/p')
|
||||
expectedTeamID="3C4F953K6P"
|
||||
;;
|
||||
|
||||
@@ -1,15 +1,7 @@
|
||||
sketch)
|
||||
name="Sketch"
|
||||
type="zip"
|
||||
downloadURL=$(curl -sf https://www.sketch.com/downloads/mac/ | grep 'href="https://download.sketch.com' | sed -E 's/.*href=\"(.*)\".?/\1/g')
|
||||
appNewVersion=$(curl -fs https://www.sketch.com/updates/ | grep "Sketch Version" | head -1 | sed -E 's/.*Version ([0-9.]*)<.*/\1/g') # version from update page
|
||||
expectedTeamID="WUGMZZ5K46"
|
||||
;;
|
||||
skype)
|
||||
name="Skype"
|
||||
type="dmg"
|
||||
downloadURL="https://get.skype.com/go/getskype-skypeformac"
|
||||
appNewVersion=$(curl -is "https://get.skype.com/go/getskype-skypeformac" | grep ocation: | grep -o "Skype-.*dmg" | cut -d "-" -f 2 | cut -d "." -f1-2)
|
||||
expectedTeamID="AL798K98FX"
|
||||
Company="Microsoft"
|
||||
name="Sketch"
|
||||
type="zip"
|
||||
downloadURL=$(curl -sf https://www.sketch.com/downloads/mac/ | grep 'href="https://download.sketch.com' | sed -E 's/.*href=\"(.*)\".?/\1/g')
|
||||
appNewVersion=$(curl -fs https://www.sketch.com/updates/ | grep "Sketch Version" | head -1 | sed -E 's/.*Version ([0-9.]*)<.*/\1/g') # version from update page
|
||||
expectedTeamID="WUGMZZ5K46"
|
||||
;;
|
||||
|
||||
8
fragments/labels/skype.sh
Normal file
8
fragments/labels/skype.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
skype)
|
||||
name="Skype"
|
||||
type="dmg"
|
||||
downloadURL="https://get.skype.com/go/getskype-skypeformac"
|
||||
appNewVersion=$(curl -is "https://get.skype.com/go/getskype-skypeformac" | grep ocation: | grep -o "Skype-.*dmg" | cut -d "-" -f 2 | cut -d "." -f1-2)
|
||||
expectedTeamID="AL798K98FX"
|
||||
Company="Microsoft"
|
||||
;;
|
||||
@@ -2,11 +2,6 @@ slack)
|
||||
name="Slack"
|
||||
type="dmg"
|
||||
downloadURL="https://slack.com/ssb/download-osx-universal" # Universal
|
||||
# if [[ $(arch) == "arm64" ]]; then
|
||||
# downloadURL="https://slack.com/ssb/download-osx-silicon"
|
||||
# elif [[ $(arch) == "i386" ]]; then
|
||||
# downloadURL="https://slack.com/ssb/download-osx"
|
||||
# fi
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*macos\/([0-9.]*)\/.*/\1/g' )
|
||||
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | cut -d "/" -f6 )
|
||||
expectedTeamID="BQR82RBBHL"
|
||||
;;
|
||||
|
||||
7
fragments/labels/smartgit.sh
Normal file
7
fragments/labels/smartgit.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
smartgit)
|
||||
name="SmartGit"
|
||||
type="dmg"
|
||||
downloadURL="https://www.syntevo.com$(curl -fs "https://www.syntevo.com/smartgit/download/" | grep -i -o -E "/downloads/.*/smartgit.*\.dmg")"
|
||||
appNewVersion="$(curl -fs "https://www.syntevo.com/smartgit/changelog.txt" | grep -i -E "SmartGit *[0-9.]* *.*" | head -1 | awk '{print $2}')"
|
||||
expectedTeamID="PHMY45PTNW"
|
||||
;;
|
||||
6
fragments/labels/splashtopsos.sh
Normal file
6
fragments/labels/splashtopsos.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
splashtopsos)
|
||||
name="Splashtop SOS"
|
||||
type="dmg"
|
||||
downloadURL="https://download.splashtop.com/sos/SplashtopSOS.dmg"
|
||||
expectedTeamID="CPQQ3AW49Y"
|
||||
;;
|
||||
@@ -1,7 +1,11 @@
|
||||
spotify)
|
||||
name="Spotify"
|
||||
type="dmg"
|
||||
downloadURL="https://download.scdn.co/Spotify.dmg"
|
||||
if [[ $(arch) == arm64 ]]; then
|
||||
downloadURL="https://download.scdn.co/SpotifyARM64.dmg"
|
||||
elif [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://download.scdn.co/Spotify.dmg"
|
||||
fi
|
||||
# appNewVersion=$(curl -fs https://www.spotify.com/us/opensource/ | cat | grep -o "<td>.*.</td>" | head -1 | cut -d ">" -f2 | cut -d "<" -f1) # does not result in the same version as downloaded
|
||||
expectedTeamID="2FNC3A47ZF"
|
||||
;;
|
||||
|
||||
7
fragments/labels/sync.sh
Normal file
7
fragments/labels/sync.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
sync)
|
||||
name="Sync"
|
||||
type="dmg"
|
||||
downloadURL="https://www.sync.com/download/apple/Sync.dmg"
|
||||
appNewVersion="$(curl -fs "https://www.sync.com/blog/category/desktop/feed/" | xpath '(//channel/item/title)[1]' 2>/dev/null | sed -E 's/^.* ([0-9.]*) .*$/\1/g')"
|
||||
expectedTeamID="7QR39CMJ3W"
|
||||
;;
|
||||
7
fragments/labels/tageditor.sh
Normal file
7
fragments/labels/tageditor.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
tageditor)
|
||||
name="Tag Editor"
|
||||
type="dmg"
|
||||
downloadURL="https://amvidia.com/downloads/tag-editor-mac.dmg"
|
||||
appNewVersion=curl -sf "https://amvidia.com/tag-editor" | grep -o -E '"softwareVersion":.'"{8}" | sed 's/\"//g' | awk -F ': ' '{print $2}'
|
||||
expectedTeamID="F2TH9XX9CJ"
|
||||
;;
|
||||
@@ -1,6 +0,0 @@
|
||||
tigervnc)
|
||||
name="TigerVNC Viewer"
|
||||
type="dmg"
|
||||
downloadURL=https://dl.bintray.com/tigervnc/stable/$(curl -s -l https://dl.bintray.com/tigervnc/stable/ | grep .dmg | sed 's/<pre><a onclick="navi(event)" href="://' | sed 's/".*//' | sort -V | tail -1)
|
||||
expectedTeamID="S5LX88A9BW"
|
||||
;;
|
||||
7
fragments/labels/tom4aconverter.sh
Normal file
7
fragments/labels/tom4aconverter.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
tom4aconverter)
|
||||
name="To M4A Converter"
|
||||
type="dmg"
|
||||
downloadURL="https://amvidia.com/downloads/to-m4a-converter-mac.dmg"
|
||||
appNewVersion=curl -sf "https://amvidia.com/to-m4a-converter" | grep -o -E '"softwareVersion":.'"{8}" | sed 's/\"//g' | awk -F ': ' '{print $2}'
|
||||
expectedTeamID="F2TH9XX9CJ"
|
||||
;;
|
||||
7
fragments/labels/utm.sh
Normal file
7
fragments/labels/utm.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
utm)
|
||||
name="UTM"
|
||||
type="dmg"
|
||||
downloadURL=$(downloadURLFromGit utmapp UTM )
|
||||
appNewVersion=$(versionFromGit utmapp UTM )
|
||||
expectedTeamID="WDNLXAD4W8"
|
||||
;;
|
||||
@@ -1,8 +1,7 @@
|
||||
vmwarehorizonclient)
|
||||
# credit: Oh4sh0 https://github.com/Oh4sh0
|
||||
name="VMware Horizon Client"
|
||||
type="dmg"
|
||||
downloadURL=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | grep -o 'Url.*..dmg"' | cut -d '"' -f3)
|
||||
appNewVersion=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | sed 's/.*-\(.*\)-.*/\1/')
|
||||
downloadURL=$(curl -fsL "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | grep -o 'Url.*..dmg"' | cut -d '"' -f3)
|
||||
appNewVersion=$(curl -fsL "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | sed 's/.*-\(.*\)-.*/\1/')
|
||||
expectedTeamID="EG7KH642X6"
|
||||
;;
|
||||
|
||||
8
fragments/labels/wallyezflash.sh
Normal file
8
fragments/labels/wallyezflash.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
wallyezflash)
|
||||
name="Wally"
|
||||
type="dmg"
|
||||
downloadURL="https://configure.zsa.io/wally/osx"
|
||||
#appNewVersion=$(curl -fsIL "${downloadURL}" | grep -i ^location | head -1 | sed -E 's/.*\/[a-zA-Z\-]*-([0-9.]*)\..*/\1/g')
|
||||
expectedTeamID="V32BWKSNYH"
|
||||
#versionKey="CFBundleVersion"
|
||||
;;
|
||||
@@ -1,7 +0,0 @@
|
||||
webexteams)
|
||||
# credit: Erik Stam (@erikstam)
|
||||
name="Webex Teams"
|
||||
type="dmg"
|
||||
downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg"
|
||||
expectedTeamID="DE8Y96K9QP"
|
||||
;;
|
||||
8
fragments/labels/yed.sh
Normal file
8
fragments/labels/yed.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
yed)
|
||||
# This label assumes accept of these T&C’s: https://www.yworks.com/resources/yed/license.html
|
||||
name="yEd"
|
||||
type="dmg"
|
||||
downloadURL="https://www.yworks.com"$(curl -fs "https://www.yworks.com/products/yed/download" | grep -o -e "/resources/.*\.dmg" | tr " " '\n' | grep -o -e "/resources/.*\.dmg")
|
||||
appNewVersion=$(echo $downloadURL | sed -E 's/.*-([0-9.]*)_.*\.dmg/\1/')
|
||||
expectedTeamID="JD89S887M2"
|
||||
;;
|
||||
7
fragments/labels/zeplin.sh
Normal file
7
fragments/labels/zeplin.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
zeplin)
|
||||
name="Zeplin"
|
||||
type="zip"
|
||||
downloadURL="https://zpl.io/download-mac"
|
||||
appNewVersion="$(curl -fs "https://api.appcenter.ms/v0.1/public/sparkle/apps/8926efff-e734-b6d3-03d0-9f41d90c34fc" | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | cut -d '"' -f 2)"
|
||||
expectedTeamID="8U3Y4X5WDQ"
|
||||
;;
|
||||
10
fragments/labels/zohoworkdrive.sh
Normal file
10
fragments/labels/zohoworkdrive.sh
Normal file
@@ -0,0 +1,10 @@
|
||||
zohoworkdrive)
|
||||
# Using this label expects you to agree to these:
|
||||
# License Areemant: https://www.zoho.com/workdrive/zohoworkdrive-license-agreement.html
|
||||
# Privacy policy: https://www.zoho.com/privacy.html
|
||||
name="Zoho WorkDrive"
|
||||
type="dmg"
|
||||
lines=$(curl -fs https://www.zohowebstatic.com/sites/all/themes/zoho/scripts/workdrive.js | grep files-accl.zohopublic.com | tr '"' "\n")
|
||||
downloadURL=$(echo "$lines" | grep -i "files-accl.zohopublic.com")$(echo "$lines" | grep -i -A17 "files-accl.zohopublic.com" | grep -i -A2 macintosh | tail -1)
|
||||
expectedTeamID="TZ824L8Y37"
|
||||
;;
|
||||
@@ -1,9 +1,7 @@
|
||||
zoom)
|
||||
# credit: Isaac Ordonez, Mann consulting (@mannconsulting)
|
||||
name="Zoom.us"
|
||||
name="zoom.us"
|
||||
type="pkg"
|
||||
downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg"
|
||||
appNewVersion=$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" "https://zoom.us/download" | grep Version | head -n 1 | sed -E 's/.* ([0-9.]* \(.*\)).*/\1/') # credit: Søren Theilgaard (@theilgaard)
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
blockingProcesses=( zoom.us )
|
||||
;;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
zoomclient)
|
||||
name="zoom.us"
|
||||
type="pkg"
|
||||
packageID="us.zoom.pkg.videmeeting"
|
||||
packageID="us.zoom.pkg.videomeeting"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL="https://zoom.us/client/latest/Zoom.pkg"
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
|
||||
7
fragments/labels/zoomgov.sh
Normal file
7
fragments/labels/zoomgov.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
zoomgov)
|
||||
name="zoom.us"
|
||||
type="pkg"
|
||||
downloadURL="https://www.zoomgov.com/client/latest/ZoomInstallerIT.pkg"
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
;;
|
||||
@@ -1,9 +1,9 @@
|
||||
zoomrooms)
|
||||
name="ZoomRooms"
|
||||
type="pkg"
|
||||
packageID="us.zoom.pkg.zp"
|
||||
downloadURL="https://zoom.us/client/latest/ZoomRooms.pkg"
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
name="ZoomRooms"
|
||||
type="pkg"
|
||||
packageID="us.zoom.pkg.zp"
|
||||
downloadURL="https://zoom.us/client/latest/ZoomRooms.pkg"
|
||||
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i location | cut -d "/" -f5)"
|
||||
expectedTeamID="BJ4HAAB9B3"
|
||||
blockingProcesses=( "ZoomPresence" )
|
||||
;;
|
||||
;;
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
zulujdk8)
|
||||
name="Zulu JDK 8"
|
||||
type="pkgInDmg"
|
||||
packageID="com.azulsystems.zulu.8"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*x64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*aarch64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
fi
|
||||
expectedTeamID="TDTHCUPYFR"
|
||||
appCustomVersion(){ if [ -f "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" ]; then /usr/bin/defaults read "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" "CFBundleName" | sed 's/Zulu //'; fi }
|
||||
appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
|
||||
;;
|
||||
name="Zulu JDK 8"
|
||||
type="pkgInDmg"
|
||||
packageID="com.azulsystems.zulu.8"
|
||||
if [[ $(arch) == i386 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*x64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
elif [[ $(arch) == arm64 ]]; then
|
||||
downloadURL=https://cdn.azul.com/zulu/bin/$(curl -fs "https://cdn.azul.com/zulu/bin/" | grep -Eio '">zulu8.*ca-jdk8.*aarch64.dmg(.*)' | cut -c3- | sed 's/<\/a>//' | sed -E 's/([0-9.]*)M//' | awk '{print $2 $1}' | sort | cut -c11- | tail -1)
|
||||
fi
|
||||
expectedTeamID="TDTHCUPYFR"
|
||||
appCustomVersion(){ if [ -f "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" ]; then /usr/bin/defaults read "/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Info.plist" "CFBundleName" | sed 's/Zulu //'; fi }
|
||||
appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
|
||||
;;
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.7.0b1
|
||||
0.7.0
|
||||
|
||||
@@ -19,7 +19,7 @@ zparseopts -D -E -a opts r -run s -script p -pkg n -notarize h -help -labels+:=l
|
||||
|
||||
if (( ${opts[(I)(-h|--help)]} )); then
|
||||
echo "usage: assemble.sh [--script|--pkg|--notarize] [-labels path/to/labels ...] [arguments...]"
|
||||
echo
|
||||
echo
|
||||
echo "builds and runs the installomator script from the fragements."
|
||||
echo "additional arguments are passed into the Installomator script for testing."
|
||||
exit
|
||||
@@ -68,7 +68,7 @@ labels_dir="$fragments_dir/labels"
|
||||
# add default labels_dir to label_paths
|
||||
label_paths+=$labels_dir
|
||||
|
||||
echo "label_paths: $label_paths"
|
||||
#echo "label_paths: $label_paths"
|
||||
|
||||
fragment_files=( header.sh version.sh functions.sh arguments.sh main.sh )
|
||||
|
||||
@@ -134,7 +134,7 @@ fi
|
||||
# build a pkg when flag is set
|
||||
if [[ buildPkg -eq 1 ]]; then
|
||||
echo "# building installer package"
|
||||
|
||||
|
||||
tmpfolder=$(mktemp -d)
|
||||
payloadfolder="${tmpfolder}/payload"
|
||||
|
||||
@@ -185,4 +185,4 @@ if [[ $notarizePkg -eq 1 ]]; then
|
||||
# staple result
|
||||
echo "# Stapling $productpath"
|
||||
xcrun stapler staple "$productpath"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1,30 +1,32 @@
|
||||
#!/bin/sh
|
||||
#!/bin/zsh
|
||||
|
||||
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||
|
||||
downloadURL=${1?:"need to provide a download URL"}
|
||||
downloadURL=${1?:"need to provide a download URL."}
|
||||
|
||||
# Note: this tool _very_ experimental and does not work in many cases
|
||||
# That being said, it's a great place to start for building up the label in the Case-statement
|
||||
|
||||
# Usage
|
||||
# ./buildCaseStatement.sh <URL to download software>
|
||||
# ./buildLabel.sh <URL to download software>
|
||||
|
||||
|
||||
# create temporary working directory
|
||||
tmpDir=$(dirname $0 )
|
||||
# Use working directory as download folder
|
||||
tmpDir="$(pwd)/$(date "+%Y-%m-%d-%H-%M-%S")"
|
||||
# Create a n almost unique folder name
|
||||
mkdir $tmpDir
|
||||
|
||||
# change directory to temporary working directory
|
||||
echo "Changing directory to $tmpDir"
|
||||
if ! cd "$tmpDir"; then
|
||||
echo "error changing directory $tmpDir"
|
||||
#rm -Rf "$tmpDir"
|
||||
echo "Error changing directory $tmpDir"
|
||||
exit 1
|
||||
fi
|
||||
echo "Working dir: $(pwd)"
|
||||
|
||||
# download the URL
|
||||
echo "Downloading $downloadURL"
|
||||
if ! downloadOut="$(curl -fsL "$downloadURL" --remote-header-name --remote-name -w "%{filename_effective}\n%{url_effective}\n")"; then
|
||||
echo "Redirecting to (maybe this can help us with version):\n$(curl -fsIL "$downloadURL" | grep -i ^location)"
|
||||
if ! downloadOut="$(curl -fL "$downloadURL" --remote-header-name --remote-name -w "%{filename_effective}\n%{url_effective}\n")"; then
|
||||
echo "error downloading $downloadURL"
|
||||
exit 2
|
||||
fi
|
||||
@@ -62,19 +64,35 @@ appInvestigation() {
|
||||
exit 4
|
||||
fi
|
||||
}
|
||||
echo "downloadOut: ${downloadOut}"
|
||||
|
||||
#echo "downloadOut:\n${downloadOut}"
|
||||
archiveTempName=$( echo "${downloadOut}" | head -1 )
|
||||
echo "archiveTempName: $archiveTempName"
|
||||
archivePath=$( echo "${downloadOut}" | tail -1 )
|
||||
echo "archivePath: $archivePath"
|
||||
archiveName=${archivePath##*/}
|
||||
echo "archiveName: $archiveName"
|
||||
|
||||
try1archiveName=${${archiveTempName##*/}%%\?*}
|
||||
try2archiveName=${${archivePath##*/}%%\?*}
|
||||
fileName_re='^([a-zA-Z0-9\_.%-]*)\.(dmg|pkg|zip|tbz)$'
|
||||
if [[ "${try1archiveName}" =~ $fileName_re ]]; then
|
||||
archiveName=${try1archiveName}
|
||||
elif [[ "${try2archiveName}" =~ $fileName_re ]]; then
|
||||
archiveName=${try2archiveName}
|
||||
else
|
||||
echo "Could not determine archiveName from “$try1archiveName” and “$try2archiveName”"
|
||||
#echo "Extensions $archiveTempName:t:e $archivePath:t:e"
|
||||
exit
|
||||
fi
|
||||
|
||||
echo "Calculated archiveName: $archiveName"
|
||||
mv $archiveTempName $archiveName
|
||||
name=${archiveName%.*}
|
||||
echo "name: $name"
|
||||
archiveExt=${archiveName##*.}
|
||||
echo "archiveExt: $archiveExt"
|
||||
identifier=$(echo $name | tr '[:upper:]' '[:lower:]')
|
||||
identifier=${name:l}
|
||||
identifier=${identifier//\%[0-9a-fA-F][0-9a-fA-F]}
|
||||
identifier=${identifier//[,._*@$\(\)\-]}
|
||||
echo "identifier: $identifier"
|
||||
|
||||
if [ "$archiveExt" = "pkg" ]; then
|
||||
@@ -121,7 +139,11 @@ elif [ "$archiveExt" = "zip" ] || [ "$archiveExt" = "tbz" ]; then
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "appNewVersion is often difficult to find. Can sometimes be found in the filename, but also on a web page. See archivePath above if link contains information about this."
|
||||
echo "**********"
|
||||
echo
|
||||
echo "Labels should be named in small caps, numbers 0-9, “-”, and “_”. No other characters allowed."
|
||||
echo
|
||||
echo "appNewVersion is often difficult to find. Can sometimes be found in the filename, sometimes as part of the download redirects, but also on a web page. See redirect and archivePath above if link contains information about this. That is a good place to start"
|
||||
echo
|
||||
echo "$identifier)"
|
||||
echo " name=\"$name\""
|
||||
@@ -137,10 +159,9 @@ echo " appName=\"$appName\""
|
||||
fi
|
||||
echo " ;;"
|
||||
echo
|
||||
echo "Above should be saved in a file with exact same name as label, and given extension “.sh”."
|
||||
echo "Put this file in folder “fragments/labels”."
|
||||
echo
|
||||
|
||||
#if [ -e "${tmpDir}" ]; then
|
||||
# #echo "deleting tmp dir"
|
||||
# rm -rf "${tmpDir}"
|
||||
#fi
|
||||
|
||||
exit 0
|
||||
230
utils/checkLabels.sh
Executable file
230
utils/checkLabels.sh
Executable file
@@ -0,0 +1,230 @@
|
||||
#!/bin/zsh
|
||||
|
||||
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||
|
||||
# Check Installomator labels from fragments
|
||||
# 2021 Søren Theilgaard (@theilgaard)
|
||||
|
||||
# This script will test labels and check if download link is active, and if version is defined.
|
||||
# If labels are written to the script only those will be tested.
|
||||
# If none are provided, it will test all labels.
|
||||
|
||||
# Labels should be named in small caps, numbers 0-9, “-”, and “_”. No other characters allowed.
|
||||
|
||||
# To check this script use these labels:
|
||||
# desktoppr dbeaverce brave microsoftteams whatsapp citrixworkspace aircall devonthink
|
||||
|
||||
|
||||
# MARK: Constants
|
||||
pathToLabels="fragments/labels"
|
||||
|
||||
if [[ ! -d ${pathToLabels} ]]; then
|
||||
echo "This script should be called from Installomator directory as working directory with this command:"
|
||||
echo "utils/checkLabels.sh"
|
||||
echo
|
||||
exit 99
|
||||
fi
|
||||
|
||||
# MARK: Check minimal macOS requirement
|
||||
if [[ $(sw_vers -buildVersion ) < "18" ]]; then
|
||||
echo "Installomator requires at least macOS 10.14 Mojave."
|
||||
exit 98
|
||||
fi
|
||||
|
||||
currentUser=$(stat -f "%Su" /dev/console)
|
||||
|
||||
|
||||
# MARK: Functions
|
||||
|
||||
printlog(){
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
runAsUser() {
|
||||
if [[ $currentUser != "loginwindow" ]]; then
|
||||
uid=$(id -u "$currentUser")
|
||||
launchctl asuser $uid sudo -u $currentUser "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
# will get the latest release download from a github repo
|
||||
downloadURLFromGit() { # $1 git user name, $2 git repo name
|
||||
gitusername=${1?:"no git user name"}
|
||||
gitreponame=${2?:"no git repo name"}
|
||||
|
||||
#githubPart="$gitusername/$gitreponame/releases/download"
|
||||
#echo "$githubPart"
|
||||
downloadURL="https://github.com/$gitusername/$gitreponame/releases/latest"
|
||||
echo "$downloadURL"
|
||||
return 0
|
||||
}
|
||||
|
||||
versionFromGit() { # $1 git user name, $2 git repo name
|
||||
gitusername=${1?:"no git user name"}
|
||||
gitreponame=${2?:"no git repo name"}
|
||||
|
||||
appNewVersion=$(curl --silent --fail "https://github.com/$gitusername/$gitreponame/releases/latest" | sed -E 's/.*tag\/(.*)\">.*/\1/g' | sed 's/[^0-9\.]//g')
|
||||
if [ -z "$appNewVersion" ]; then
|
||||
printlog "could not retrieve version number for $gitusername/$gitreponame: $appNewVersion"
|
||||
exit 9
|
||||
else
|
||||
echo "$appNewVersion"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Handling of differences in xpath between Catalina and Big Sur
|
||||
xpath() {
|
||||
# the xpath tool changes in Big Sur and now requires the `-e` option
|
||||
if [[ $(sw_vers -buildVersion) > "20A" ]]; then
|
||||
/usr/bin/xpath -e $@
|
||||
else
|
||||
/usr/bin/xpath $@
|
||||
fi
|
||||
}
|
||||
|
||||
# Handling architecture, so I can verify both i386 and arm64 architectures
|
||||
arch () {
|
||||
echo $fixedArch
|
||||
}
|
||||
|
||||
|
||||
# MARK: Script
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[1;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Labels with the $(arch) call for different versions for Intel and Apple Silicon should be listed here:
|
||||
archLabels=( $(grep "\$(arch)" ${pathToLabels}/* | awk '{print $1}' | sed -E 's/.*\/([a-z0-9\_-]*)\..*/\1/g'| uniq ) )
|
||||
echo "${BLUE}Labels with \"\$(arch)\" call:${NC}\n${archLabels}\n"
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
allLabels=( $(grep -h -E '^([a-z0-9\_-]*)(\)|\|\\)$' ${pathToLabels}/*.sh | tr -d ')|\\' | sort) )
|
||||
else
|
||||
allLabels=( ${=@} )
|
||||
fi
|
||||
echo "${BLUE}Total labels:${NC}\n${allLabels}\n"
|
||||
|
||||
secondRoundLabels="" # variable for labels with $(arch) call in them
|
||||
countWarning=0
|
||||
countError=0
|
||||
for fixedArch in i386 arm64; do
|
||||
echo "${BLUE}Architecture: $fixedArch${NC}"
|
||||
echo
|
||||
|
||||
# Go through all labels
|
||||
for label in $allLabels; do
|
||||
echo "########## $label"
|
||||
labelWarning=0; labelError=0; expectedExtension=""; URLextension=""
|
||||
name=""; type=""; downloadURL=""; appNewVersion=""; expectedTeamID=""; blockingProcesses=""; updateTool=""; updateToolArguments=""; archiveName=""
|
||||
|
||||
#caseLabel
|
||||
if cat "${pathToLabels}/${label}.sh" | grep -v -E '^[a-z0-9\_-]*(\)|\|\\)$' | grep -v ";;" > checkLabelCurrent.sh; then
|
||||
source checkLabelCurrent.sh
|
||||
|
||||
echo "Name: $name"
|
||||
echo "Download URL: $downloadURL"
|
||||
echo "Type: $type"
|
||||
case $type in
|
||||
dmg|pkg|zip|tbz)
|
||||
expectedExtension="$type"
|
||||
;;
|
||||
pkgInDmg)
|
||||
expectedExtension="dmg"
|
||||
;;
|
||||
*InZip)
|
||||
expectedExtension="zip"
|
||||
;;
|
||||
*)
|
||||
echo "Cannot handle type $type"
|
||||
;;
|
||||
esac
|
||||
if [[ "$appNewVersion" == "" ]] ; then
|
||||
echo "No appNewVersion!"
|
||||
else
|
||||
if [[ $( echo "$appNewVersion" | grep -i "[0-9.]" ) == "" || $appNewVersion == "" ]]; then
|
||||
echo "${RED}-> !! ERROR in appNewVersion${NC}"
|
||||
labelError=1
|
||||
else
|
||||
if [[ $appNewVersion != $( echo "$appNewVersion" | sed -E 's/[^0-9]*([0-9.]*)[^0-9]*/\1/g' ) ]]; then
|
||||
echo "${YELLOW}Warning: Version contain not only numbers and dots.${NC}"
|
||||
labelWarning=1
|
||||
fi
|
||||
echo "Version: $appNewVersion" ;
|
||||
fi
|
||||
fi
|
||||
if curl -sfL --output /dev/null -r 0-0 "$downloadURL" ; then
|
||||
echo "${GREEN}OK: downloadURL works OK${NC}"
|
||||
if [[ $(echo "$downloadURL" | sed -E 's/.*\.([a-zA-Z]*)\s*/\1/g' ) == "${expectedExtension}" ]]; then
|
||||
echo "${GREEN}OK: download extension MATCH on ${expectedExtension}${NC}"
|
||||
else
|
||||
if [[ $(echo "$downloadURL" | grep -io "github.com") != "github.com" ]]; then
|
||||
URLheader=$( curl -fsIL "$downloadURL" )
|
||||
if [[ "${URLheader}" != "" ]]; then
|
||||
URLlocation=$( echo "${URLheader}" | grep -i "^location" )
|
||||
URLfilename=$( echo "${URLheader}" | grep -i "filename=" )
|
||||
if [[ "${URLlocation}" != "" ]]; then
|
||||
URLextension=$( echo "${URLlocation}" | tail -1 | sed -E 's/.*\.([a-zA-Z]*)\s*/\1/g' | tr -d '\r\n' )
|
||||
else
|
||||
URLextension=$( echo "${URLfilename}" | tail -1 | sed -E 's/.*\.([a-zA-Z]*)\s*/\1/g' | tr -d '\r\n' )
|
||||
fi
|
||||
URLextension=${${URLextension:l}%%\?*}
|
||||
if [[ "${URLextension}" == "${expectedExtension}" ]]; then
|
||||
echo "${GREEN}OK: download extension MATCH on ${URLextension}${NC}"
|
||||
else
|
||||
echo "${RED}-> !! ERROR in download extension, expected ${expectedExtension}, but got ${URLextension}.${NC}"
|
||||
labelError=1
|
||||
fi
|
||||
else
|
||||
echo "no header provided from server."
|
||||
fi
|
||||
else
|
||||
githubPart="$(echo "$downloadURL" | cut -d "/" -f4-6)"
|
||||
if [[ "$(curl -fsL "$downloadURL" | grep -io "${githubPart}.*\.${expectedExtension}")" != "" ]]; then
|
||||
echo "${GREEN}OK: download extension MATCH on ${expectedExtension}${NC}"
|
||||
else
|
||||
echo "${RED}-> !! ERROR in download extension, expected ${expectedExtension}, but it was wrong${NC}"
|
||||
labelError=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "${RED}-> !! ERROR in downloadURL${NC}"
|
||||
labelError=1
|
||||
fi
|
||||
if [[ $labelWarning != 0 ]]; then; echo "${YELLOW}########## Warning in label: $label${NC}"; ((countWarning++)); fi
|
||||
if [[ $labelError != 0 ]]; then; echo "${RED}########## ERROR in label: $label${NC}"; ((countError++)); fi
|
||||
|
||||
if (($archLabels[(Ie)$label])); then
|
||||
secondRoundLabels+=( "$label" )
|
||||
fi
|
||||
else
|
||||
echo "Label: ${label} is not it's own file in Labels-folder. Skipping"
|
||||
fi
|
||||
echo
|
||||
done
|
||||
allLabels=( ${=secondRoundLabels} )
|
||||
archLabels=()
|
||||
echo
|
||||
done
|
||||
|
||||
rm checkLabelCurrent.sh
|
||||
|
||||
#${SELFLOCATION}/Installomator.sh version
|
||||
#echo
|
||||
|
||||
if [[ countWarning > 0 ]]; then
|
||||
echo "${YELLOW}Warnings counted: $countWarning${NC}"
|
||||
else
|
||||
echo "${GREEN}No warnings detected!${NC}"
|
||||
fi
|
||||
if [[ countError > 0 ]]; then
|
||||
echo "${RED}ERRORS counted: $countError${NC}"
|
||||
else
|
||||
echo "${GREEN}No errors detected!${NC}"
|
||||
fi
|
||||
|
||||
echo "Done!"
|
||||
@@ -1,5 +1,8 @@
|
||||
#!/bin/zsh
|
||||
|
||||
# This script will create individual labels files from the original Installomator.sh script
|
||||
# Only for internal use
|
||||
|
||||
label_re='^([a-z0-9\_-]*)(\)|\|\\)$'
|
||||
endlabel_re='^( |\t);;$'
|
||||
|
||||
@@ -24,4 +27,4 @@ while read -r line; do
|
||||
current_label=""
|
||||
fi
|
||||
|
||||
done <./Installomator.sh
|
||||
done <../Installomator.sh
|
||||
|
||||
Reference in New Issue
Block a user