diff --git a/CHANGELOG.md b/CHANGELOG.md index 74d7b8f..2a1d15d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -## 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. +- 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.) @@ -24,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. diff --git a/Installomator.sh b/Installomator.sh index 21e1463..1a82401 100755 --- a/Installomator.sh +++ b/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 "

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/([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/([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 "(*.*)" | 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 ".*." | 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/
/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"
@@ -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"
diff --git a/Labels.txt b/Labels.txt
index 854bdaa..5e72460 100644
--- a/Labels.txt
+++ b/Labels.txt
@@ -58,6 +58,7 @@ cisdem-documentreader
 citrixworkspace
 clevershare2
 clickshare
+cloudya
 code42
 coderunner
 colourcontrastanalyser
@@ -74,7 +75,7 @@ depnotify
 desktoppr
 detectxswift
 devonthink
-dialpad
+dialog
 discord
 docker
 drift
@@ -134,9 +135,11 @@ istatmenus
 iterm2
 jabradirect
 jamfconnect
+jamfconnectconfiguration
 jamfmigrator
 jamfpppcutility
 jamfreenroller
+jetbrainsclion
 jetbrainsdatagrip
 jetbrainsintellijidea
 jetbrainsintellijideace
@@ -144,6 +147,7 @@ jetbrainsphpstorm
 jetbrainspycharm
 jetbrainspycharmce
 jetbrainstoolbox
+jetbrainswebstorm
 karabinerelements
 keepassxc
 keka
@@ -188,6 +192,7 @@ microsoftvisualstudiocode
 microsoftword
 microsoftyammer
 miro
+montereyblocker
 musescore
 muzzle
 netnewswire
@@ -215,6 +220,7 @@ opera
 pacifist
 parsec
 pdfsam
+perimeter81
 pitch
 plantronicshub
 platypus
@@ -276,6 +282,7 @@ swiftruntimeforcommandlinetools
 sync
 tableaudesktop
 tableaureader
+tageditor
 taskpaper
 teamviewer
 teamviewerhost
@@ -288,6 +295,7 @@ theunarchiver
 things
 thunderbird
 toggltrack
+tom4aconverter
 torbrowser
 trex
 tunnelbear
@@ -295,6 +303,7 @@ tunnelblick
 umbrellaroamingclient
 uniconverter
 universaltypeclient
+utm
 vagrant
 vanilla
 veracrypt
diff --git a/README.md b/README.md
index ab031a3..2cfb90a 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
 # Installomator
 
-__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.__
-
 _The one installer script to rule them all._
 
 ![](https://img.shields.io/github/v/release/scriptingosx/Installomator) ![](https://img.shields.io/github/downloads/scriptingosx/Installomator/latest/total) ![](https://img.shields.io/badge/macOS-10.14%2B-success) ![](https://img.shields.io/github/license/scriptingosx/Installomator)
@@ -14,6 +12,8 @@ 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 (PR) for bugs or wrong behavior. When in doubt, ask in the above Slack channel.
@@ -87,7 +87,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.
 
@@ -236,7 +236,7 @@ WARNING! It might block the MDM agent on the machine, as the scripts gets stuct
 - `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
 
@@ -350,7 +350,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)
@@ -375,7 +375,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
 
diff --git a/fragments/labels/airtame.sh b/fragments/labels/airtame.sh
index bbc5dc7..13d637a 100644
--- a/fragments/labels/airtame.sh
+++ b/fragments/labels/airtame.sh
@@ -4,4 +4,4 @@ airtame)
     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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/applenyfonts.sh b/fragments/labels/applenyfonts.sh
index f671819..16c7185 100644
--- a/fragments/labels/applenyfonts.sh
+++ b/fragments/labels/applenyfonts.sh
@@ -4,4 +4,4 @@ applenyfonts)
     downloadURL="https://devimages-cdn.apple.com/design/resources/download/NY.dmg"
     packageID="com.apple.pkg.NYFonts"
     expectedTeamID="Development Update"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/applesfcompact.sh b/fragments/labels/applesfcompact.sh
index f174053..aef7977 100644
--- a/fragments/labels/applesfcompact.sh
+++ b/fragments/labels/applesfcompact.sh
@@ -4,4 +4,4 @@ applesfcompact)
     downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Compact.dmg"
     packageID="com.apple.pkg.SanFranciscoCompact"
     expectedTeamID="Development Update"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/applesfmono.sh b/fragments/labels/applesfmono.sh
index 29233f1..46c32a7 100644
--- a/fragments/labels/applesfmono.sh
+++ b/fragments/labels/applesfmono.sh
@@ -4,4 +4,4 @@ applesfmono)
     downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Mono.dmg"
     packageID="com.apple.pkg.SFMonoFonts"
     expectedTeamID="Software Update"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/applesfpro.sh b/fragments/labels/applesfpro.sh
index 9ba2628..9d76895 100644
--- a/fragments/labels/applesfpro.sh
+++ b/fragments/labels/applesfpro.sh
@@ -4,4 +4,4 @@ applesfpro)
     downloadURL="https://devimages-cdn.apple.com/design/resources/download/SF-Pro.dmg"
     packageID="com.apple.pkg.SanFranciscoPro"
     expectedTeamID="Development Update"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/applesfsymbols.sh b/fragments/labels/applesfsymbols.sh
index f90150b..1b0c751 100644
--- a/fragments/labels/applesfsymbols.sh
+++ b/fragments/labels/applesfsymbols.sh
@@ -4,4 +4,4 @@ sfsymbols)
     type="pkgInDmg"
     downloadURL="https://developer.apple.com/design/downloads/SF-Symbols.dmg"
     expectedTeamID="Software Update"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/boxsync.sh b/fragments/labels/boxsync.sh
index 9962e3f..b6df054 100644
--- a/fragments/labels/boxsync.sh
+++ b/fragments/labels/boxsync.sh
@@ -3,4 +3,4 @@ boxsync)
     type="dmg"
     downloadURL="https://e3.boxcdn.net/box-installers/sync/Sync+4+External/Box%20Sync%20Installer.dmg"
     expectedTeamID="M683GB7CPW"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/boxtools.sh b/fragments/labels/boxtools.sh
index 2963c68..11690f5 100644
--- a/fragments/labels/boxtools.sh
+++ b/fragments/labels/boxtools.sh
@@ -3,4 +3,4 @@ boxtools)
     type="pkg"
     downloadURL="https://box-installers.s3.amazonaws.com/boxedit/mac/currentrelease/BoxToolsInstaller.pkg"
     expectedTeamID="M683GB7CPW"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/cisdem-documentreader.sh b/fragments/labels/cisdem-documentreader.sh
index f8cf75c..f57b72a 100644
--- a/fragments/labels/cisdem-documentreader.sh
+++ b/fragments/labels/cisdem-documentreader.sh
@@ -4,4 +4,4 @@ cisdem-documentreader)
     downloadURL="https://download.cisdem.com/cisdem-documentreader.dmg"
     expectedTeamID="5HGV8EX6BQ"
     appName="Cisdem Document Reader.app"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/clevershare2.sh b/fragments/labels/clevershare2.sh
index 1a7bb90..452ffde 100644
--- a/fragments/labels/clevershare2.sh
+++ b/fragments/labels/clevershare2.sh
@@ -4,4 +4,4 @@ clevershare2)
     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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/colourcontrastanalyser.sh b/fragments/labels/colourcontrastanalyser.sh
index 613ccba..086569c 100644
--- a/fragments/labels/colourcontrastanalyser.sh
+++ b/fragments/labels/colourcontrastanalyser.sh
@@ -5,4 +5,4 @@ colourcontrastanalyser)
     appNewVersion=$(versionFromGit ThePacielloGroup CCAe)
     expectedTeamID="34RS4UC3M6"
     blockingProcesses=( NONE )
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/craftmanager.sh b/fragments/labels/craftmanager.sh
index 6906ad6..6bf89d8 100644
--- a/fragments/labels/craftmanager.sh
+++ b/fragments/labels/craftmanager.sh
@@ -5,4 +5,4 @@ craftmanager)
     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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/flowjo.sh b/fragments/labels/flowjo.sh
index 6ddb9b1..b713914 100644
--- a/fragments/labels/flowjo.sh
+++ b/fragments/labels/flowjo.sh
@@ -5,4 +5,4 @@ flowjo)
     appNewVersion=$(echo "${downloadURL}" | tr "-" "\n" | grep dmg | sed -E 's/([0-9.]*)\.dmg/\1/g')
     expectedTeamID="C79HU5AD9V"
     appName="FlowJo.app"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/insomnia.sh b/fragments/labels/insomnia.sh
index 6d8922a..9de4706 100644
--- a/fragments/labels/insomnia.sh
+++ b/fragments/labels/insomnia.sh
@@ -4,4 +4,4 @@ insomnia)
     downloadURL=$(downloadURLFromGit kong insomnia)
     appNewVersion=$(versionFromGit kong insomnia)
     expectedTeamID="FX44YY62GV"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jamfconnectconfiguration.sh b/fragments/labels/jamfconnectconfiguration.sh
new file mode 100644
index 0000000..7237f2e
--- /dev/null
+++ b/fragments/labels/jamfconnectconfiguration.sh
@@ -0,0 +1,6 @@
+jamfconnectconfiguration)
+    name="Jamf Connect Configuration"
+    type="dmg"
+    downloadURL="https://files.jamfconnect.com/JamfConnect.dmg"
+    expectedTeamID="483DWKW443"
+    ;;
diff --git a/fragments/labels/jetbrainsclion.sh b/fragments/labels/jetbrainsclion.sh
new file mode 100644
index 0000000..5a193a4
--- /dev/null
+++ b/fragments/labels/jetbrainsclion.sh
@@ -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"
+    ;;
diff --git a/fragments/labels/jetbrainsdatagrip.sh b/fragments/labels/jetbrainsdatagrip.sh
index 87a77f3..adb8dba 100644
--- a/fragments/labels/jetbrainsdatagrip.sh
+++ b/fragments/labels/jetbrainsdatagrip.sh
@@ -1,11 +1,13 @@
 jetbrainsdatagrip)
     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)
+    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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jetbrainsintellijidea.sh b/fragments/labels/jetbrainsintellijidea.sh
index 233eda9..262298b 100644
--- a/fragments/labels/jetbrainsintellijidea.sh
+++ b/fragments/labels/jetbrainsintellijidea.sh
@@ -1,7 +1,13 @@
 jetbrainsintellijidea)
     name="IntelliJ IDEA"
     type="dmg"
-    downloadURL="https://download.jetbrains.com/product?code=II&latest&distribution=mac"
+    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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jetbrainsintellijideace.sh b/fragments/labels/jetbrainsintellijideace.sh
index 7675050..3beb6fd 100644
--- a/fragments/labels/jetbrainsintellijideace.sh
+++ b/fragments/labels/jetbrainsintellijideace.sh
@@ -2,7 +2,13 @@ jetbrainsintellijideace|\
 intellijideace)
     name="IntelliJ IDEA CE"
     type="dmg"
-    downloadURL="https://download.jetbrains.com/product?code=IIC&latest&distribution=mac"
+    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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jetbrainsphpstorm.sh b/fragments/labels/jetbrainsphpstorm.sh
index 98e7773..1a21310 100644
--- a/fragments/labels/jetbrainsphpstorm.sh
+++ b/fragments/labels/jetbrainsphpstorm.sh
@@ -1,7 +1,13 @@
 jetbrainsphpstorm)
     name="PHPStorm"
     type="dmg"
-    downloadURL="https://download.jetbrains.com/product?code=PS&latest&distribution=mac"
+    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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jetbrainspycharm.sh b/fragments/labels/jetbrainspycharm.sh
index 18670a1..ca99389 100644
--- a/fragments/labels/jetbrainspycharm.sh
+++ b/fragments/labels/jetbrainspycharm.sh
@@ -2,11 +2,12 @@ jetbrainspycharm)
     # This is the Pro version of PyCharm. Do not confuse with PyCharm CE.
     name="PyCharm"
     type="dmg"
-    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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jetbrainspycharmce.sh b/fragments/labels/jetbrainspycharmce.sh
index 8d738a1..c571ebf 100644
--- a/fragments/labels/jetbrainspycharmce.sh
+++ b/fragments/labels/jetbrainspycharmce.sh
@@ -2,11 +2,12 @@ jetbrainspycharmce|\
 pycharmce)
     name="PyCharm CE"
     type="dmg"
-    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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jetbrainstoolbox.sh b/fragments/labels/jetbrainstoolbox.sh
index 16bef78..8bc695c 100644
--- a/fragments/labels/jetbrainstoolbox.sh
+++ b/fragments/labels/jetbrainstoolbox.sh
@@ -1,11 +1,12 @@
 jetbrainstoolbox)
     name="JetBrains Toolbox"
     type="dmg"
-    if [[ $(arch) == i386 ]]; then
-        downloadURL="https://download.jetbrains.com/product?code=TB&latest&distribution=mac"
-    elif [[ $(arch) == arm64 ]]; then
-        downloadURL="https://download.jetbrains.com/product?code=TB&latest&distribution=macM1"
+    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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/jetbrainswebstorm.sh b/fragments/labels/jetbrainswebstorm.sh
new file mode 100644
index 0000000..c92caab
--- /dev/null
+++ b/fragments/labels/jetbrainswebstorm.sh
@@ -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"
+    ;;
diff --git a/fragments/labels/microsoftteams.sh b/fragments/labels/microsoftteams.sh
index b580758..475ee5a 100644
--- a/fragments/labels/microsoftteams.sh
+++ b/fragments/labels/microsoftteams.sh
@@ -10,4 +10,4 @@ microsoftteams)
     # Commenting out msupdate as it is not really supported *yet* for teams
     # updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     # updateToolArguments=( --install --apps TEAM01 )
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/muzzle.sh b/fragments/labels/muzzle.sh
index 76091f7..9f2fa31 100644
--- a/fragments/labels/muzzle.sh
+++ b/fragments/labels/muzzle.sh
@@ -4,4 +4,4 @@ muzzle)
     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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/parsec.sh b/fragments/labels/parsec.sh
index 68b3841..8b72a04 100644
--- a/fragments/labels/parsec.sh
+++ b/fragments/labels/parsec.sh
@@ -3,4 +3,4 @@ parsec)
     type="pkg"
     downloadURL="https://builds.parsecgaming.com/package/parsec-macos.pkg"
     expectedTeamID="Y9MY52XZDB"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/perimeter81.sh b/fragments/labels/perimeter81.sh
new file mode 100644
index 0000000..2f05459
--- /dev/null
+++ b/fragments/labels/perimeter81.sh
@@ -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"
+    ;;
diff --git a/fragments/labels/platypus.sh b/fragments/labels/platypus.sh
index 62e2f41..257de1a 100644
--- a/fragments/labels/platypus.sh
+++ b/fragments/labels/platypus.sh
@@ -4,4 +4,4 @@ platypus)
     downloadURL=$(downloadURLFromGit sveinbjornt Platypus)
     appNewVersion=$(versionFromGit sveinbjornt Platypus)
     expectedTeamID="55GP2M789L"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/prism9.sh b/fragments/labels/prism9.sh
index 9bdba3f..a94e5e9 100644
--- a/fragments/labels/prism9.sh
+++ b/fragments/labels/prism9.sh
@@ -3,4 +3,4 @@ prism9)
     type="dmg"
     downloadURL="https://cdn.graphpad.com/downloads/prism/9/InstallPrism9.dmg"
     expectedTeamID="YQ2D36NS9M"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/ringcentralclassicapp.sh b/fragments/labels/ringcentralclassicapp.sh
index ef75cee..78d4186 100644
--- a/fragments/labels/ringcentralclassicapp.sh
+++ b/fragments/labels/ringcentralclassicapp.sh
@@ -5,4 +5,4 @@ ringcentralclassicapp)
     expectedTeamID="M932RC5J66"
     blockingProcesses=( "Glip" )
     #blockingProcessesMaxCPU="5"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/royaltsx.sh b/fragments/labels/royaltsx.sh
index af5082e..6ebc77a 100644
--- a/fragments/labels/royaltsx.sh
+++ b/fragments/labels/royaltsx.sh
@@ -4,4 +4,4 @@ royaltsx)
     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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/screencloudplayer.sh b/fragments/labels/screencloudplayer.sh
index e7c1604..6a19dc5 100644
--- a/fragments/labels/screencloudplayer.sh
+++ b/fragments/labels/screencloudplayer.sh
@@ -4,4 +4,4 @@ screencloudplayer)
     type="dmg"
     downloadURL=$(curl -sL "https://screencloud.com/download" | sed -n 's/^.*"url":"\([^"]*\)".*$/\1/p')
     expectedTeamID="3C4F953K6P"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/sketch.sh b/fragments/labels/sketch.sh
index 637a5b6..7cf3b9a 100644
--- a/fragments/labels/sketch.sh
+++ b/fragments/labels/sketch.sh
@@ -4,4 +4,4 @@ sketch)
     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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/skype.sh b/fragments/labels/skype.sh
index f14d15b..a689ffa 100644
--- a/fragments/labels/skype.sh
+++ b/fragments/labels/skype.sh
@@ -5,4 +5,4 @@ skype)
     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"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/snagit.sh b/fragments/labels/snagit.sh
index f748e1b..2c65478 100644
--- a/fragments/labels/snagit.sh
+++ b/fragments/labels/snagit.sh
@@ -5,4 +5,4 @@ snagit2020)
     type="dmg"
     downloadURL="https://download.techsmith.com/snagitmac/releases/Snagit.dmg"
     expectedTeamID="7TQL462TU8"
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/tageditor.sh b/fragments/labels/tageditor.sh
new file mode 100644
index 0000000..666284c
--- /dev/null
+++ b/fragments/labels/tageditor.sh
@@ -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"
+     ;;
diff --git a/fragments/labels/tom4aconverter.sh b/fragments/labels/tom4aconverter.sh
new file mode 100644
index 0000000..bfc2b77
--- /dev/null
+++ b/fragments/labels/tom4aconverter.sh
@@ -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"
+     ;;
diff --git a/fragments/labels/zoomrooms.sh b/fragments/labels/zoomrooms.sh
index c3f87b7..37186be 100644
--- a/fragments/labels/zoomrooms.sh
+++ b/fragments/labels/zoomrooms.sh
@@ -6,4 +6,4 @@ zoomrooms)
     appNewVersion="$(curl -fsIL ${downloadURL} | grep -i location | cut -d "/" -f5)"
     expectedTeamID="BJ4HAAB9B3"
     blockingProcesses=( "ZoomPresence" )
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/labels/zulujdk8.sh b/fragments/labels/zulujdk8.sh
index 5581ffa..0a10e49 100644
--- a/fragments/labels/zulujdk8.sh
+++ b/fragments/labels/zulujdk8.sh
@@ -10,4 +10,4 @@ zulujdk8)
     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
-    ;;
\ No newline at end of file
+    ;;
diff --git a/fragments/version.sh b/fragments/version.sh
index 7cee47d..a3df0a6 100644
--- a/fragments/version.sh
+++ b/fragments/version.sh
@@ -1 +1 @@
-0.7.0b1
\ No newline at end of file
+0.8.0