Menu Close

Mac Health Check (5.0.2)

Mac Health Check 5.0.0 adds a dedicated AI skill for easier Mac Admin customization, historical Memory Pressure warnings, targeted post-remediation verification, Jamf Pro clock-skew detection and macOS 27 compatibility improvements

Version 5.0.1 corrects Palo Alto Networks GlobalProtect VPN detection, and version 5.0.2 fixes a Mosyle Check-In error which could leave Self Service stuck when Mosyle had not recorded a check-in date (thanks, @bigdoodr!)

Mac Health Check 5.0.0 adds a dedicated AI skill for easier Mac Admin customization, historical Memory Pressure warnings, targeted post-remediation verification, Jamf Pro clock-skew detection and macOS 27 compatibility improvements

Overview

Mac Health Check provides a practical, user-friendly, MDM-agnostic approach to surfacing Mac compliance information directly to end-users via an MDM’s self-service app.

Built using the open-source utility swiftDialog, the solution acts as a “heads-up display” presenting real-time system health and policy compliance status in a clear and interactive format.

Administrators can customize the user interface using swiftDialog’s visual capabilities, making the experience both informative and approachable.

The tool logs results for review, while not altering device configuration, and a “Silent” Operation Mode makes Mac Health Check ideal for IT visibility without end-user intrusion.

Mac Health Check version 4.0.0 (and later) generates client-side JSON — leveraging new Inspect Mode features of swiftDialog 3.1.0 — which can optionally be delivered via Splunk HEC; version 5.0.0 (and later) requires swiftDialog 3.1.1.4997 (or later)

Use Cases

Mac Health Check is particularly valuable in IT support workflows, serving as an initial triage point for Tier 1 support, while also acting as a verification tool for Tier 2 teams both during and after remediation efforts.

Step 0 for Tier 1

  • User has a working Internet connection
  • User knows their directory credentials
  • Mac can execute policies
  • Validates Network Access Controls

Step 99 for Tier 2

  • Initial assessment for support sessions
  • Easily confirms remediation efforts with targeted rechecks 🎉
  • Provides peace-of-mind for end-users

Silent Mode

  • No dialog is presented to the end-user
  • Silently performs all health checks and logs results
  • Ideal for background compliance reporting
  • Complements existing MDM compliance frameworks

Targeted Post-remediation Verification

New in version 5.0.0, targeted post-remediation verification helps both end-users and support representatives quickly validate remediation efforts were successful.

When a Self Service run reports warnings or failures and the end-user (or support representative) addresses the issue(s), instead of repeating every check (as with previous versions), Mac Health Check 5.0.0 re-runs only the sideways checks and merges the fresh results into the last full report. Confirming a fix takes seconds, rather than a complete health check. (See: Feature Request #103, thanks for the suggestion, @abercrombiejc-cloud!)

Slideshow

  • Applies only to Self Service; Silent, Debug, Development and Test behave as before
  • The previous report (/Library/Management/org.churchofjesuschrist/MacHealthCheck-Report.json) must come from a Self Service or Silent run on the same Mac, with the same MDM, check list and script version (so the first run after each upgrade is a full run), and its full-run baseline must be less than 36 hours old (targetedRecheckMaximumAgeSeconds); nightly Client-Side Cache reports also qualify
  • Rechecked results replace only their matching checks; all other results — and the original full-run timestamp — are preserved, so repeated rechecks never extend the 36-hour baseline
  • The detached Inspect summary still presents every check, distinguishing the recent rechecks from the older full-run results
  • On Jamf Pro, targeted rechecks also run Computer Inventory, so verified fixes reach the server, and send a Microsoft Teams or Slack webhook message (when configured) only when a rechecked status changes
  • A missing, stale or mismatched report automatically falls back to a full run, while a healthy report less than 15 minutes old replays the cached summary instead
  • Force a complete run with Parameter 11 (forceFreshRun=true) or a root-owned trigger file: sudo touch /var/tmp/MacHealthCheck-Force-Fresh-Run

Presentation

Features

The following health checks and information reporting are included in version 5.0.2, which operates in Self Service mode by default. (Use Debug, Development or Test while testing; deploy with Self Service or Silent.)

Health Checks

🎉 New or improved in version 5.0.0, 5.0.1 or 5.0.2

  1. macOS Version
  2. Available Updates (including deferred, staged and DDM-enforced updates) 🎉
  3. System Integrity Protection
  4. Signed System Volume (SSV)
  5. Firewall
  6. FileVault Encryption
  7. Gatekeeper / XProtect
  8. Touch ID
  9. Password Hint (not run on Jamf Pro or Kandji)
  10. AirDrop
  11. AirPlay Receiver 🎉
  12. Bluetooth Sharing
  13. VPN Client 🎉
  14. Last Reboot
  15. Free Disk Space
  16. User’s Directory Size and Item Count
    • Desktop
    • Downloads
    • Trash
  17. MDM Profile
  18. Entra ID Registration**
  19. MDM Certificate Expiration
  20. Apple Push Notification service 🎉
  21. Mosyle Check-In*** 🎉
  22. Jamf Pro Check-In** 🎉
  23. Jamf Pro Inventory**
  24. Clock Skew** 🎉
  25. Extended Network Checks
    • Apple Push Notification Hosts
    • Apple Device Management
    • Apple Software and Carrier Updates
    • Apple Certificate Validation
    • Apple Identity and Content Services
    • Jamf Hosts**
  26. App Auto-Patch 🎉
  27. Homebrew Status
  28. Electron Corner Mask  🔗 🎉
  29. Organizationally required Applications (e.g., Microsoft Teams)
  30. BeyondTrust Privilege Management*
  31. Cisco Umbrella*
  32. CrowdStrike Falcon*
  33. Palo Alto GlobalProtect* 🎉
  34. Wi-Fi Strength
  35. Memory Pressure 🎉
  36. Network Quality Test
  37. Computer Inventory**

*Requires external check (Jamf Pro only)
**Requires Jamf Pro
***Requires Mosyle

Each MDM runs its own list-item array: Jamf Pro runs 42 items, Mosyle 34, Addigy, Fleet, JumpCloud and Microsoft Intune 33, Filewave and Kandji 32, and the MDM-agnostic fallback 29.

Information Reporting

  • IT Support
    • Telephone
    • Email
    • Website
    • Knowledge Base Article
  • User Information
    • Full Name
    • User Name
    • User ID
    • Volume Owners
    • Secure Token
    • Location Services
    • Microsoft OneDrive Sync Date
    • Platform Single Sign-on Extension
  • Computer Information
    • macOS version (build)
    • System Memory
    • System Storage
    • Dialog version
    • Script version
    • Computer Name
    • Serial Number
    • Wi-Fi SSID
    • IP Address (first active network service)
    • VPN IP Address
  • Jamf Pro Information**
    • Jamf Pro Computer ID
    • Site

**Requires Jamf Pro and a configuration profile that uses Payload Variables for Configuration Profiles

Policy Log Reporting

  1. Warning when logged-in user is a member of admin
  2. Logged-in user full name, username and UID
  3. Security Mode
  4. DEP-allowed MDM Control
  5. Activation Lock
  6. Bootstrap Token
  7. Location Services
  8. SSH
  9. Microsoft OneDrive Sync Date
  10. Time Machine destinations and last backup date
  11. Battery Cycle Count
  12. Rosetta-required apps
  13. Wi-Fi SSID
  14. VPN status
  15. Network Time Server
  16. Jamf Pro Computer ID and Site (Jamf Pro only)

At the end of each run, Mac Health Check logs a one-line summary (wrapped below for readability), plus a second line on Jamf Pro:

MHC (5.0.1): 2026-10-14 08:15:42 - [NOTICE]          WARNING: 'localadmin' IS A MEMBER OF 'admin';
User: macOS Server Administrator (localadmin) [503]; Security Mode: Full;
DEP-allowed MDM Control: Enabled; Activation Lock: Disabled; Bootstrap Token supported on server: YES;
Bootstrap Token escrowed to server: YES; Location Services: Enabled; SSH: On;
Microsoft OneDrive Sync Date: Not Configured; Time Machine Backup Date: Not configured;
Battery Cycle Count: 12; Rosetta-required apps: None detected; Wi-Fi: Liahona; VPN: None;
Network Time Server: time.apple.com
MHC (5.0.1): 2026-10-14 08:15:42 - [NOTICE]          Jamf Pro Computer ID: 007; Site: Servers

Deployment

Deployment of Mac Health Check involves configuring organizational defaults, uploading the script to Jamf Pro, creating a policy to run it on demand and testing to ensure proper output and behavior.

Deployment of Mac Health Check involves configuring organizational defaults, uploading the script to your MDM server, creating a policy to run it on-demand and testing to ensure proper output and behavior.

1. Local Test

Jumpstart your Mac Health Check implementation by first conducting a local test on a fully enrolled, non-production Mac

  1. Visit the Mac Health Check repository on GitHub
  2. Download the main branch by selecting Code > Download ZIP
Visit the Mac Health Check repository on GitHub. Download the main branch by selecting Code > Download ZIP
  1. In an elevated Terminal session, change to the downloaded Mac-Health-Check-main directory
cd ~/Downloads/Mac-Health-Check-main
  1. Execute the Mac-Health-Check.zsh script
zsh Mac-Health-Check.zsh
  1. Review the various checks and the static computer information (visible after clicking the Help button in the bottom, right-hand corner).
  2. Review the script’s output:
root@XDT8675309 Mac-Health-Check-main # zsh Mac-Health-Check.zsh       
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      ###
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      # Mac Health Check (5.0.2)
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      # https://snelson.us/mhc
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      #
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      # Operation Mode: Self Service
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      ###
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      Initiating …
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      Dan K. Snelson MacBook Air (M2, 2022) (S/N XDT8675309)
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      Dan K. Snelson (dan) [502]
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      jq found; using jq for JSON validation and formatting.
MHC (5.0.2): 2026-10-19 04:42:13 - [NOTICE]          Client-Side Cache: installing client-side script at /Library/Management/org.churchofjesuschrist/MHC.zsh
MHC (5.0.2): 2026-10-19 04:42:13 - [INFO]            Client-Side Cache: generated LaunchDaemon plist validated at /Library/LaunchDaemons/org.churchofjesuschrist.MHC.plist
MHC (5.0.2): 2026-10-19 04:42:13 - [NOTICE]          Client-Side Cache: client-side assets already current; install skipped.
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      swiftDialog version 3.1.0.4994 found; proceeding …
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      Forcible-quit for all other running dialogs …
MHC (5.0.2): 2026-10-19 04:42:13 - [INFO]            The 'Dialog' process isn’t running.
MHC (5.0.2): 2026-10-19 04:42:13 - [PRE-FLIGHT]      Complete
MHC (5.0.2): 2026-10-19 04:42:13 - [NOTICE]          Current Elapsed Time: 0h:0m:2s
MHC (5.0.2): 2026-10-19 04:42:13 - [NOTICE]          Operation Mode is Self Service; using MDM-specific dialogJSONFile.
MHC (5.0.2): 2026-10-19 04:42:15 - [INFO]            dialogJSONFile verified: /var/tmp/dialogJSONFile_MHC.yCwp
MHC (5.0.2): 2026-10-19 04:42:15 - [INFO]            Dock icon source: /var/tmp/dockicon.png
MHC (5.0.2): 2026-10-19 04:42:15 - [INFO]            Launching dialog binary: /Library/Application Support/Dialog/Mac Health Check.app/Contents/MacOS/dialogcli
MHC (5.0.2): 2026-10-19 04:42:16 - [INFO]            Dialog PID: 25564
MHC (5.0.2): 2026-10-19 04:42:17 - [NOTICE]          Operation Mode is Self Service; using MDM-specific Health Checks.
MHC (5.0.2): 2026-10-19 04:42:17 - [NOTICE]          Check macOS Version …
MHC (5.0.2): 2026-10-19 04:42:19 -                   OS Build, 25F80, ends with a number; proceeding with SOFA compliance check …
MHC (5.0.2): 2026-10-19 04:42:19 -                   Using cached SOFA data (age within 1d)
MHC (5.0.2): 2026-10-19 04:42:19 -                   Model Identifier: Mac14,2
MHC (5.0.2): 2026-10-19 04:42:19 -                   System Version: 26.5.1
MHC (5.0.2): 2026-10-19 04:42:19 -                   Latest Compatible macOS: Tahoe 26
MHC (5.0.2): 2026-10-19 04:42:21 - [INFO]            macOS 26.5.1 (25F80)
MHC (5.0.2): 2026-10-19 04:42:22 - [NOTICE]          Check Available Software Updates …
MHC (5.0.2): 2026-10-19 04:42:23 - [NOTICE]          MDM Client Available OS Updates | Deferred Until
MHC (5.0.2): 2026-10-19 04:42:23 - [INFO]                    HumanReadableName = XProtectPayloads; | 2026-08-31 17:14:47 +0000";
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            DDM Resolver: source=currentApplicableDeclaration | date=Wed Jul 15 04:55:44 2026 | dateSource=padded | version=26.5.2 | build=(null)
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            Found 3 update snapshot(s)
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            Using Preboot UUID directory: /System/Volumes/Preboot/D1D5F7C8-B608-413F-9DFD-D0FFA24F074A
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            Analyzing Preboot path: /System/Volumes/Preboot/D1D5F7C8-B608-413F-9DFD-D0FFA24F074A
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            Listing contents of Preboot UUID directory:
    total 0
    drwxrwxrwx   4 root            wheel   128 Jul 15 02:39 Library
    drwxr-xr-x   4 root            wheel   128 Jul 15 02:57 PreLoginData
    drwxrwxrwx   3 root            wheel    96 Jul 15 02:25 System
    drwxr-xr-x   3 root            wheel    96 Jul 15 03:00 Users
    drwxrwxrwx   6 root            wheel   192 Jul 15 02:54 boot
    drwxrwxrwx   4 root            wheel   128 Jul 15 02:47 cryptex1
    drwxr-xr-x   3 root            wheel    96 Jul 15 02:41 etc
    drwxrwxrwx  11 root            wheel   352 Jul 15 02:32 restore
    drwxr-xr-x  80 _nsurlsessiond  wheel  2560 Jul 15 02:54 restore-staged
    drwxr-xr-x   4 root            wheel   128 Jul 15 02:35 usr
    drwxr-xr-x   3 root            wheel    96 Jul 15 02:34 var
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            Staged update detected: 26.57 GB in cryptex1
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            Additional staged content: 1.59 GB in restore-staged
MHC (5.0.2): 2026-10-19 04:42:24 - [NOTICE]          Update Staging Status: Fully staged
MHC (5.0.2): 2026-10-19 04:42:24 - [NOTICE]          Update Size: 26.57 GB
MHC (5.0.2): 2026-10-19 04:42:24 - [NOTICE]          Location: /System/Volumes/Preboot/D1D5F7C8-B608-413F-9DFD-D0FFA24F074A/cryptex1
MHC (5.0.2): 2026-10-19 04:42:24 - [INFO]            Available Software Updates: macOS 26.5.2 (15-Jul-2026)
MHC (5.0.2): 2026-10-19 04:42:25 - [NOTICE]          Check System Integrity Protection …
MHC (5.0.2): 2026-10-19 04:42:28 - [INFO]            System Integrity Protection: Enabled
MHC (5.0.2): 2026-10-19 04:42:29 - [NOTICE]          Check Signed System Volume …
MHC (5.0.2): 2026-10-19 04:42:32 - [INFO]            Signed System Volume: Enabled
MHC (5.0.2): 2026-10-19 04:42:33 - [NOTICE]          Check Firewall …
MHC (5.0.2): 2026-10-19 04:42:36 - [INFO]            Firewall: Enabled
MHC (5.0.2): 2026-10-19 04:42:37 - [NOTICE]          Check FileVault …
MHC (5.0.2): 2026-10-19 04:42:39 - [INFO]            FileVault: Enabled
MHC (5.0.2): 2026-10-19 04:42:41 - [NOTICE]          Check Gatekeeper / XProtect …
MHC (5.0.2): 2026-10-19 04:42:43 - [INFO]            Gatekeeper / XProtect: Enabled
MHC (5.0.2): 2026-10-19 04:42:45 - [NOTICE]          Check Touch ID …
MHC (5.0.2): 2026-10-19 04:42:48 - [INFO]            Touch ID: Enabled & Enrolled (1 template(s))
MHC (5.0.2): 2026-10-19 04:42:49 - [NOTICE]          Checking AirDrop Settings …
MHC (5.0.2): 2026-10-19 04:42:52 - [INFO]            Run "defaults read /Users/dan/Library/Preferences/com.apple.sharingd.plist DiscoverableMode" as "502" … 
MHC (5.0.2): 2026-10-19 04:42:52 - [ERROR]           AirDrop Settings: Discoverable by Everyone (value: Everyone)
MHC (5.0.2): 2026-10-19 04:42:53 - [NOTICE]          Checking AirPlay Receiver status …
MHC (5.0.2): 2026-10-19 04:42:56 - [INFO]            Run "/usr/bin/defaults -currentHost read com.apple.controlcenter AirplayReceiverEnabled" as "502" … 
MHC (5.0.2): 2026-10-19 04:42:56 - [INFO]            Run "/usr/bin/defaults -currentHost read com.apple.controlcenter AirplayRecieverEnabled" as "502" … 
MHC (5.0.2): 2026-10-19 04:42:56 - [INFO]            Run "/usr/bin/defaults -currentHost read com.apple.controlcenter AirplayReceiverAdvertising" as "502" … 
MHC (5.0.2): 2026-10-19 04:42:56 - [INFO]            AirPlay Receiver: Disabled (key not found on macOS 26.5)
MHC (5.0.2): 2026-10-19 04:42:57 - [NOTICE]          Checking Bluetooth Sharing status …
MHC (5.0.2): 2026-10-19 04:43:00 - [INFO]            Run "defaults -currentHost read com.apple.Bluetooth PrefKeyServicesEnabled" as "502" … 
MHC (5.0.2): 2026-10-19 04:43:00 - [INFO]            Bluetooth Sharing: Disabled
MHC (5.0.2): 2026-10-19 04:43:01 - [NOTICE]          Check GlobalProtect VPN Client …
MHC (5.0.2): 2026-10-19 04:43:02 - [INFO]            GlobalProtect VPN Client Connected
MHC (5.0.2): 2026-10-19 04:43:03 - [NOTICE]          Check Uptime …
MHC (5.0.2): 2026-10-19 04:43:06 - [INFO]            Uptime: 49 mins
MHC (5.0.2): 2026-10-19 04:43:07 - [NOTICE]          Check Free Disk Space …
MHC (5.0.2): 2026-10-19 04:43:10 - [INFO]            Free Disk Space: 440.7 GB free (89.15% available)
MHC (5.0.2): 2026-10-19 04:43:11 - [NOTICE]          Check Desktop directory size and item count …
MHC (5.0.2): 2026-10-19 04:43:14 - [INFO]            Desktop: 2.2M (3 items) — 0% of disk
MHC (5.0.2): 2026-10-19 04:43:15 - [NOTICE]          Check Downloads directory size and item count …
MHC (5.0.2): 2026-10-19 04:43:17 - [INFO]            Downloads: 37M (1 items) — 0% of disk
MHC (5.0.2): 2026-10-19 04:43:19 - [NOTICE]          Check Trash directory size and item count …
MHC (5.0.2): 2026-10-19 04:43:21 - [INFO]            Trash: 35M (1 items) — 0% of disk
MHC (5.0.2): 2026-10-19 04:43:23 - [NOTICE]          Check Jamf Pro MDM Profile …
MHC (5.0.2): 2026-10-19 04:43:25 - [INFO]            Jamf Pro MDM Profile: Installed
MHC (5.0.2): 2026-10-19 04:43:27 - [NOTICE]          Check Entra ID Registration …
MHC (5.0.2): 2026-10-19 04:43:29 - [INFO]            Entra ID Registration: Registered (PSSO registration metadata detected for /Users/dan)
MHC (5.0.2): 2026-10-19 04:43:31 - [NOTICE]          Check the expiration date of the Jamf Pro Certificate Authority …
MHC (5.0.2): 2026-10-19 04:43:33 - [INFO]            Jamf Pro Certificate Authority Expiration: 09-Dec-2027
MHC (5.0.2): 2026-10-19 04:43:35 - [NOTICE]          Check Apple Push Notification service …
MHC (5.0.2): 2026-10-19 04:43:41 - [INFO]            Apple Push Notification service: 2026-10-19 04:29:17
MHC (5.0.2): 2026-10-19 04:43:42 - [NOTICE]          Checking Last Jamf Pro check-in …
MHC (5.0.2): 2026-10-19 04:43:44 - [INFO]            Last Jamf Pro check-in: 4:29 AM
MHC (5.0.2): 2026-10-19 04:43:46 - [NOTICE]          Check Last Jamf Pro inventory update …
MHC (5.0.2): 2026-10-19 04:43:48 - [INFO]            Last Jamf Pro inventory update: 4:29 AM
MHC (5.0.2): 2026-10-19 04:43:49 - [NOTICE]          Check Apple Push Notification Hosts …
MHC (5.0.2): 2026-10-19 04:43:53 - [INFO]            Apple Push Notification Hosts: courier.push.apple.com:5223 PASS; courier.push.apple.com:443 PASS; api.push.apple.com:443 PASS; api.push.apple.com:2197 PASS; 
MHC (5.0.2): 2026-10-19 04:43:54 - [NOTICE]          Check Apple Device Management …
MHC (5.0.2): 2026-10-19 04:43:59 - [INFO]            Apple Device Management: albert.apple.com:443 PASS; captive.apple.com:80 PASS; captive.apple.com:443 PASS; gs.apple.com:443 PASS; humb.apple.com:443 PASS; static.ips.apple.com:80 PASS; static.ips.apple.com:443 PASS; sq-device.apple.com:443 PASS; tbsc.apple.com:443 PASS; time-ios.apple.com:123 PASS; time.apple.com:123 PASS; time-macos.apple.com:123 PASS; deviceenrollment.apple.com:443 PASS; deviceservices-external.apple.com:443 PASS; gdmf.apple.com:443 PASS; identity.apple.com:443 PASS; iprofiles.apple.com:443 PASS; mdmenrollment.apple.com:443 PASS; setup.icloud.com:443 PASS; vpp.itunes.apple.com:443 PASS; 
MHC (5.0.2): 2026-10-19 04:44:00 - [NOTICE]          Check Apple Software and Carrier Updates …
MHC (5.0.2): 2026-10-19 04:44:06 - [INFO]            Apple Software and Carrier Updates: appldnld.apple.com:80 PASS; configuration.apple.com:443 PASS; gdmf.apple.com:443 PASS; gg.apple.com:80 PASS; gg.apple.com:443 PASS; gs.apple.com:80 PASS; gs.apple.com:443 PASS; ig.apple.com:443 PASS; mesu.apple.com:80 PASS; mesu.apple.com:443 PASS; oscdn.apple.com:80 PASS; oscdn.apple.com:443 PASS; osrecovery.apple.com:80 PASS; osrecovery.apple.com:443 PASS; skl.apple.com:443 PASS; swcdn.apple.com:80 PASS; swdist.apple.com:443 PASS; swdownload.apple.com:80 PASS; appldnld.apple.com.edgesuite.net:80 PASS; itunes.com:80 PASS; itunes.apple.com:443 PASS; updates-http.cdn-apple.com:80 PASS; updates.cdn-apple.com:443 PASS; 
MHC (5.0.2): 2026-10-19 04:44:07 - [NOTICE]          Check Apple Certificate Validation …
MHC (5.0.2): 2026-10-19 04:44:11 - [INFO]            Apple Certificate Validation: certs.apple.com:80 PASS; certs.apple.com:443 PASS; crl.apple.com:80 PASS; crl.entrust.net:80 PASS; crl3.digicert.com:80 PASS; crl4.digicert.com:80 PASS; ocsp.apple.com:80 PASS; ocsp.digicert.cn:80 PASS; ocsp.digicert.com:80 PASS; ocsp.entrust.net:80 PASS; ocsp2.apple.com:443 PASS; valid.apple.com:443 PASS; 
MHC (5.0.2): 2026-10-19 04:44:13 - [NOTICE]          Check Apple Identity and Content Services …
MHC (5.0.2): 2026-10-19 04:44:17 - [INFO]            Apple Identity and Content Services: appleid.apple.com:443 PASS; appleid.cdn-apple.com:443 PASS; idmsa.apple.com:443 PASS; gsa.apple.com:443 PASS; app-site-association.cdn-apple.com:443 PASS; app-site-association.networking.apple:443 PASS; audiocontentdownload.apple.com:80 PASS; audiocontentdownload.apple.com:443 PASS; devimages-cdn.apple.com:80 PASS; devimages-cdn.apple.com:443 PASS; download.developer.apple.com:80 PASS; download.developer.apple.com:443 PASS; playgrounds-assets-cdn.apple.com:443 PASS; playgrounds-cdn.apple.com:443 PASS; sylvan.apple.com:80 PASS; sylvan.apple.com:443 PASS; 
MHC (5.0.2): 2026-10-19 04:44:18 - [NOTICE]          Check Jamf Hosts …
MHC (5.0.2): 2026-10-19 04:44:27 - [INFO]            Jamf Hosts: jamf.com:443 PASS; test.jamfcloud.com:443 PASS; account.jamf.com:443 PASS; idpcs.jamf.com:443 PASS; account-cdn.jamf.com:443 PASS; cdn.mfe.jamf.io:443 PASS; api.apigw.jamf.com:443 PASS; us.apigw.jamf.com:443 PASS; eu.apigw.jamf.com:443 PASS; apac.apigw.jamf.com:443 PASS; appinstallers-packages.services.jamfcloud.com:443 PASS; registration.cloudconnector.gov.services.jamfcloud.com:443 PASS; registration.cloudconnector.services.jamfcloud.com:443 PASS; ics.services.jamfcloud.com:443 PASS; csa.services.jamfcloud.com:443 PASS; jcds.apne1.inf.jamf.one:443 PASS; jcds.apse2.inf.jamf.one:443 PASS; jcds.euw2.inf.jamf.one:443 PASS; jcds.euc1.inf.jamf.one:443 PASS; jcds.use1.inf.jamf.one:443 PASS; packages.soup.services.jamfcloud.com:443 PASS; www.jamfroutines.com:443 PASS; icon-staging-production-use1-ics-application.s3.amazonaws.com:443 PASS; clientstream.launchdarkly.com:443 PASS; mobile.launchdarkly.com:443 PASS; app.launchdarkly.com:443 PASS; nom.telemetrydeck.com:443 PASS; 
MHC (5.0.2): 2026-10-19 04:44:29 - [NOTICE]          Checking App Auto-Patch last run …
MHC (5.0.2): 2026-10-19 04:44:31 - [INFO]            App Auto-Patch last run: Today
MHC (5.0.2): 2026-10-19 04:44:32 - [NOTICE]          Check Homebrew Status …
MHC (5.0.2): 2026-10-19 04:44:35 - [INFO]            Homebrew Status: Not installed
MHC (5.0.2): 2026-10-19 04:44:36 - [NOTICE]          Check Electron Corner Mask …
MHC (5.0.2): 2026-10-19 04:44:39 - [INFO]            Electron Corner Mask: No Electron-based apps detected.
MHC (5.0.2): 2026-10-19 04:44:40 - [NOTICE]          Internal Check: /Applications/Microsoft Teams.app …
MHC (5.0.2): 2026-10-19 04:44:43 - [INFO]            Microsoft Teams installed
MHC (5.0.2): 2026-10-19 04:44:46 - [NOTICE]          External Check: /Applications/PrivilegeManagement.app …
MHC (5.0.2): 2026-10-19 04:44:55 - [INFO]            PrivilegeManagement running
MHC (5.0.2): 2026-10-19 04:44:56 - [NOTICE]          External Check: /Applications/Cisco/Cisco Secure Client.app …
MHC (5.0.2): 2026-10-19 04:45:04 - [INFO]            Cisco Secure Client running
MHC (5.0.2): 2026-10-19 04:45:05 - [NOTICE]          External Check: /Applications/Falcon.app …
MHC (5.0.2): 2026-10-19 04:45:14 - [INFO]            Falcon running
MHC (5.0.2): 2026-10-19 04:45:15 - [NOTICE]          External Check: /Applications/GlobalProtect.app …
MHC (5.0.2): 2026-10-19 04:45:23 - [INFO]            GlobalProtect running
MHC (5.0.2): 2026-10-19 04:45:25 - [NOTICE]          Check Wi-Fi Signal …
MHC (5.0.2): 2026-10-19 04:45:28 - [INFO]            Wi-Fi Signal: Excellent (-35 dBm)
MHC (5.0.2): 2026-10-19 04:45:29 - [NOTICE]          Check Network Quality …
MHC (5.0.2): 2026-10-19 04:45:29 - [INFO]            Using cached Network Quality Test
MHC (5.0.2): 2026-10-19 04:45:30 - [INFO]            Download: 526.44 Mbps, Responsiveness: 996.0095825195312; 
MHC (5.0.2): 2026-10-19 04:45:31 - [NOTICE]          Update Computer Inventory …
MHC (5.0.2): 2026-10-19 04:45:31 - [NOTICE]          Including '-endUsername' in 'jamf recon' (source: Platform SSOe; value: danksnelson)
MHC (5.0.2): 2026-10-19 04:46:08 - [INFO]            Update Computer Inventory: Completed "jamf recon -endUsername danksnelson"
MHC (5.0.2): 2026-10-19 04:46:10 - [QUIT]            Exiting …
MHC (5.0.2): 2026-10-19 04:46:10 - [NOTICE]          User: Dan K. Snelson (dan) [502]; Security Mode: Full; DEP-allowed MDM Control: Enabled; Activation Lock: Disabled; Bootstrap Token supported on server: YES; Bootstrap Token escrowed to server: YES; Location Services: Enabled; SSH: On; Microsoft OneDrive Sync Date: Not Configured; Time Machine Backup Date: Not configured; Battery Cycle Count: 15; Rosetta-required apps: None detected; Wi-Fi: NO SIGNAL; VPN: Connected 10.254.97.89; Network Time Server: time.apple.com
MHC (5.0.2): 2026-10-19 04:46:10 - [NOTICE]          Jamf Pro Computer ID: ; Site: 
MHC (5.0.2): 2026-10-19 04:46:11 - [ERROR]           Available Updates; AirDrop
MHC (5.0.2): 2026-10-19 04:46:11 - [NOTICE]          Generating Splunk JSON report …
MHC (5.0.2): 2026-10-19 04:46:11 - [NOTICE]          Splunk Reporting: local report written to /var/tmp/MacHealthCheck-Report.json
MHC (5.0.2): 2026-10-19 04:46:11 - [NOTICE]          Splunk Reporting: test mode enabled; skipping Splunk HEC transmission.
MHC (5.0.2): 2026-10-19 04:46:13 - [NOTICE]          Inspect Summary: wrote /var/tmp/MacHealthCheck-Inspect-Compliance.plist.
MHC (5.0.2): 2026-10-19 04:46:13 - [NOTICE]          Inspect Summary: wrote /var/tmp/MacHealthCheck-Inspect-Config.json.
MHC (5.0.2): 2026-10-19 04:46:13 - [NOTICE]          Inspect Summary: launched detached Preset 6 summary (PID 32917; log /var/tmp/MacHealthCheck-Inspect-Summary.log).
MHC (5.0.2): 2026-10-19 04:46:14 - [NOTICE]          Inspect Summary: detached Preset 6 summary launched; retaining the existing completion countdown on the main dialog.
MHC (5.0.2): 2026-10-19 04:47:12 - [NOTICE]          Total Elapsed Time: 0h:5m:1s
MHC (5.0.2): 2026-10-19 04:47:12 - [QUIT]            Good manners don’t cost nothing, do they, eh?
  1. Wait for all checks to complete, then review the client-side report:
  1. Remediate one or more findings (optional), then re-execute the Mac-Health-Check.zsh script
zsh Mac-Health-Check.zsh
  1. Observe the second run, which depends on the results of the first:
root@XDT8675309 Mac-Health-Check-main # zsh Mac-Health-Check.zsh 
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      Created specified scriptLog: /var/log/org.churchofjesuschrist.log
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      ###
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      # Mac Health Check (5.0.1)
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      # https://snelson.us/mhc
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      #
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      # Operation Mode: Self Service
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      ###
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      Initiating …
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      Dan K. Snelson MacBook Air (M2, 2022) (S/N XDT8675309)
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      Dan K. Snelson (dan) [502]
MHC (5.0.1): 2026-10-19 04:34:29 - [PRE-FLIGHT]      jq found; using jq for JSON validation and formatting.
MHC (5.0.1): 2026-10-19 04:34:29 - [NOTICE]          Client-Side Cache: installing client-side script at /Library/Management/org.churchofjesuschrist/MHC.zsh
MHC (5.0.1): 2026-10-19 04:34:29 - [INFO]            Client-Side Cache: generated LaunchDaemon plist validated at /Library/LaunchDaemons/org.churchofjesuschrist.MHC.plist
MHC (5.0.1): 2026-10-19 04:34:29 - [NOTICE]          Client-Side Cache: installed client-side script and LaunchDaemon org.churchofjesuschrist.MHC.
MHC (5.0.1): 2026-10-19 04:34:30 - [PRE-FLIGHT]      swiftDialog version 3.1.0.4994 found; proceeding …
MHC (5.0.1): 2026-10-19 04:34:30 - [PRE-FLIGHT]      Forcible-quit for all other running dialogs …
MHC (5.0.1): 2026-10-19 04:34:30 - [INFO]            The 'Dialog' process isn’t running.
MHC (5.0.1): 2026-10-19 04:34:30 - [PRE-FLIGHT]      Complete
MHC (5.0.1): 2026-10-19 04:34:30 - [NOTICE]          Inspect Summary Replay: launching cached Preset 6 summary from the last 900 seconds.
MHC (5.0.1): 2026-10-19 04:34:30 - [NOTICE]          Inspect Summary: launched detached Preset 6 summary (PID 24098; log /var/tmp/MacHealthCheck-Inspect-Summary.log).
MHC (5.0.1): 2026-10-19 04:34:30 - [QUIT]            Replayed cached inspect summary.
Observe the cached report is immediately displayed
2. Customize Variables

Customize variables for your environment

  1. Review and adjust the Global Variables and Script Parameters as required for your environment
    • scriptLog (i.e., the location of your client-side logs)
    • operationMode (i.e., defaults to Self Service; use Debug, Development or Test while testing, and Self Service or Silent in production)
    • webhookURL (i.e., Microsoft Teams or Slack Webhook URL; beginning in 5.0.0, deploy it — along with any Splunk HEC token — in the root-only /Library/Management/org.churchofjesuschrist/MacHealthCheck-Secrets.plist and leave Parameter 5 blank)
####################################################################################################
#
# Global Variables
#
####################################################################################################

# `/usr/local/bin` is intentionally excluded: Homebrew can make it user-writable, and this script runs as root
# (swiftDialog, Jamf and `jq` are called through the root-owned absolute paths resolved below)
export PATH=/usr/bin:/bin:/usr/sbin:/sbin

function isTrustedRootPath() {

    local candidatePath="${1}"
    local resolvedPath=""
    local pathComponent=""
    local pathComponentMode=""

    [[ -n "${candidatePath}" ]] && [[ -e "${candidatePath}" ]] || return 1
    resolvedPath="${candidatePath:A}"
    [[ -f "${resolvedPath}" ]] || return 1

    # The resolved file and every parent directory must be root-owned and not group- or world-writable
    # (a sticky directory such as `/private/var/tmp` is accepted because other users cannot replace root's entries;
    # `%Mp%Lp` keeps the sticky bit, which `%Lp` alone drops)
    pathComponent="${resolvedPath}"
    while [[ -n "${pathComponent}" ]]; do
        [[ "$( stat -f %u "${pathComponent}" 2>/dev/null )" == "0" ]] || return 1
        pathComponentMode="$( stat -f %Mp%Lp "${pathComponent}" 2>/dev/null )"
        [[ "${pathComponentMode}" == <-> ]] || return 1
        if (( ( 8#${pathComponentMode} & 8#022 ) != 0 )); then
            [[ -d "${pathComponent}" ]] && (( ( 8#${pathComponentMode} & 8#1000 ) != 0 )) || return 1
        fi
        [[ "${pathComponent}" == "/" ]] && break
        pathComponent="${pathComponent:h}"
    done

    return 0

}

# jq: prefer the macOS-bundled binary (macOS 15+); otherwise accept only a root-owned install
jqBinary=""
for jqCandidate in "/usr/bin/jq" "/usr/local/bin/jq" "/opt/homebrew/bin/jq"; do
    if [[ -x "${jqCandidate}" ]] && isTrustedRootPath "${jqCandidate}"; then
        jqBinary="${jqCandidate}"
        break
    fi
done
unset jqCandidate
if [[ -n "${jqBinary}" ]] && [[ "${jqBinary}" != "/usr/bin/jq" ]]; then
    function jq() { "${jqBinary}" "$@"; }
fi

# Script Version
scriptVersion="5.0.2"

# Client-side Log
scriptLog="/var/log/org.churchofjesuschrist.log"

# Load is-at-least for version comparison
autoload -Uz is-at-least

# Minimum Required Version of swiftDialog
swiftDialogMinimumRequiredVersion="3.1.1.4997"

# Force locale to English (so `date` does not error on localization formatting)
LANG="en_us_88591"

# Elapsed Time
SECONDS="0"



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Script Parameters
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# Parameter 4: Operation Mode [ Debug | Development | Self Service | Silent | Test ]
operationMode="${4:-"Self Service"}"

# Parameter 5: Microsoft Teams or Slack Webhook URL [ Leave blank to disable (default) | https://microsoftTeams.webhook.com/URL | https://hooks.slack.com/services/URL ]
webhookURL="${5:-""}"
  1. Set your preferred Organization Variables, some of which include:
    • organizationBrandingBannerURL (i.e., the URL of your banner)
    • organizationOverlayiconURL (i.e., the URL of your Self Service branding icon)
    • organizationDefaultsDomain (i.e., for External Checks)
    • organizationColorScheme (i.e., your organization’s corporate colors) 
    • previousMinorOS (i.e., the number of previous minor OS versions which can pass the OS health check; thanks, @robjschroeder!)
    • allowedMinimumFreeDiskPercentage (i.e., the allowed minimum percentage of free disk space)
    • allowedMaximumDirectoryPercentage (i.e., the allowed maximum percentage of disk space for user directories such as Desktop, Downloads and Trash)
    • networkQualityTestMaximumAge (i.e., frequency with which the time-intensive Network Quality Test should be executed)
    • allowedUptimeMinutes (i.e., the allowed number of minutes since the last reboot)
    • excessiveUptimeAlertStyle (i.e., should excessive uptime result in a “warning” or “error”?)
    • vpnClientVendor (i.e., your organization’s VPN client: none, paloalto, cisco or tailscale)
    • memoryPressureLookbackDays / memoryPressureRequiredAdverseDays (i.e., the number of days of Memory Pressure history to review, and the number of distinct days with yellow or red pressure required for a warning)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Organization Variables
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# Script Human-readable Name
humanReadableScriptName="Mac Health Check"

# Organization's Script Name
organizationScriptName="MHC"

# Organization's Reverse Domain Name Notation (i.e., com.company.division; used for plist domains)
reverseDomainNameNotation="org.churchofjesuschrist"

# Client-side Deployment
# Organization's Directory (i.e., where client-side scripts reside)
organizationDirectory="/Library/Management/${reverseDomainNameNotation}"
clientSideScriptPath="${organizationDirectory}/${organizationScriptName}.zsh"
memoryPressureHistoryPath="${organizationDirectory}/MacHealthCheck-MemoryPressure-History.jsonl"

# LaunchDaemon Name & Path
launchDaemonLabel="${reverseDomainNameNotation}.${organizationScriptName}"
launchDaemonPath="/Library/LaunchDaemons/${launchDaemonLabel}.plist"
clientSideSkipChecks="false"
clientSideMaximumCacheAgeSeconds="129600"
currentScriptPath="${0:A}"
forceFreshRunTriggerFilePath="/var/tmp/MacHealthCheck-Force-Fresh-Run"
forceFreshRunDetected="false"
forceFreshRunSource="not_requested"

function isTrustedForceFreshRunTrigger() {

    # Honor only a root-owned regular file; any local user can create files in world-writable `/var/tmp`
    [[ -f "${forceFreshRunTriggerFilePath}" ]] && [[ ! -L "${forceFreshRunTriggerFilePath}" ]] \
        && [[ "$( stat -f %u "${forceFreshRunTriggerFilePath}" 2>/dev/null )" == "0" ]]

}

function removeUntrustedForceFreshRunTrigger() {

    if { [[ -e "${forceFreshRunTriggerFilePath}" ]] || [[ -L "${forceFreshRunTriggerFilePath}" ]]; } \
        && ! isTrustedForceFreshRunTrigger; then
        [[ $(id -u) -eq 0 ]] && rm -f -- "${forceFreshRunTriggerFilePath}" 2>/dev/null
        return 0
    fi

    return 1

}

# Per-run, root-owned temporary directory for downloaded icons and other transient files
# (`mktemp -d` creates a unique directory that local users cannot pre-plant or redirect)
runtimeTemporaryDirectory="$( mktemp -d "/var/tmp/${organizationScriptName}.XXXXXX" 2>/dev/null )"
if [[ -z "${runtimeTemporaryDirectory}" ]] || [[ ! -d "${runtimeTemporaryDirectory}" ]]; then
    echo "Error: Unable to create a per-run temporary directory; exiting."
    exit 1
fi
chmod 755 "${runtimeTemporaryDirectory}" 2>/dev/null
trap 'rm -rf -- "${runtimeTemporaryDirectory}"' EXIT

# Optional root-only reporting secrets file (keeps the Splunk HEC token and webhook URL out of the process list)
# Keys: `splunkHECToken`, `webhookURL`; must be a root-owned, `600` regular file inside `organizationDirectory`
reportingSecretsPath="${organizationDirectory}/MacHealthCheck-Secrets.plist"
splunkHECTokenSource="not configured"
webhookURLSource="not configured"
reportingSecretsFileStatus="missing"

# Allow Parameters 5 and 8 to supply reporting secrets [ true | false (default) ]
# (Legacy opt-in only; parameter values remain visible to local users in the process list)
allowParameterSecrets="false"

function refreshReportingSecretFlags() {

    webhookConfigured="false"
    webhookService="teams"
    [[ -n "${webhookURL}" ]] && webhookConfigured="true"
    [[ "${webhookURL}" == *"slack"* ]] && webhookService="slack"
    splunkHECTokenConfigured="false"
    [[ -n "${splunkHECToken}" ]] && splunkHECTokenConfigured="true"

}

function loadReportingSecrets() {

    local secretsFileMode=""
    local secretsDirectoryMode=""
    local secretValue=""

    # Keep secret values out of `set -x` output
    setopt localoptions noxtrace

    [[ "${splunkHECTokenConfigured}" == "true" ]] && splunkHECTokenSource="Parameter 8"
    [[ "${webhookConfigured}" == "true" ]] && webhookURLSource="Parameter 5"

    if [[ ! -e "${reportingSecretsPath}" ]] && [[ ! -L "${reportingSecretsPath}" ]]; then
        return 0
    fi

    secretsFileMode="$( stat -f %Lp "${reportingSecretsPath}" 2>/dev/null )"
    secretsDirectoryMode="$( stat -f %Lp "${organizationDirectory}" 2>/dev/null )"
    if [[ -L "${reportingSecretsPath}" ]] || [[ ! -f "${reportingSecretsPath}" ]] \
        || [[ "$( stat -f %u "${reportingSecretsPath}" 2>/dev/null )" != "0" ]] \
        || [[ "${secretsFileMode}" != <-> ]] || (( ( 8#${secretsFileMode} & 8#077 ) != 0 )) \
        || [[ -L "${organizationDirectory}" ]] || [[ "$( stat -f %u "${organizationDirectory}" 2>/dev/null )" != "0" ]] \
        || [[ "${secretsDirectoryMode}" != <-> ]] || (( ( 8#${secretsDirectoryMode} & 8#022 ) != 0 )); then
        reportingSecretsFileStatus="untrusted"
        return 1
    fi

    reportingSecretsFileStatus="trusted"

    secretValue="$( /usr/libexec/PlistBuddy -c "Print :splunkHECToken" "${reportingSecretsPath}" 2>/dev/null )"
    if [[ -n "${secretValue}" ]]; then
        [[ "${splunkHECTokenSource}" == "Parameter 8" ]] && splunkHECTokenSource="secrets file (Parameter 8 ignored)" || splunkHECTokenSource="secrets file"
        splunkHECToken="${secretValue}"
    fi

    secretValue="$( /usr/libexec/PlistBuddy -c "Print :webhookURL" "${reportingSecretsPath}" 2>/dev/null )"
    if [[ -n "${secretValue}" ]]; then
        [[ "${webhookURLSource}" == "Parameter 5" ]] && webhookURLSource="secrets file (Parameter 5 ignored)" || webhookURLSource="secrets file"
        webhookURL="${secretValue}"
    fi

    # Refresh the secret-free configuration flags
    refreshReportingSecretFlags

    return 0

}

function enforceReportingSecretsSource() {

    # Keep secret values out of `set -x` output
    setopt localoptions noxtrace

    [[ "${allowParameterSecrets}" == "true" ]] && return 0

    # Fail closed: discard reporting secrets supplied only through script parameters
    if [[ "${splunkHECTokenSource}" == "Parameter 8" ]]; then
        splunkHECToken=""
        splunkHECTokenSource="Parameter 8 (rejected)"
    fi

    if [[ "${webhookURLSource}" == "Parameter 5" ]]; then
        webhookURL=""
        webhookURLSource="Parameter 5 (rejected)"
    fi

    refreshReportingSecretFlags

}

loadReportingSecrets
enforceReportingSecretsSource

# Splunk and JSON reporting defaults
# (Persistent root-written state lives in the root-owned `organizationDirectory`, never in world-writable `/var/tmp`)
splunkJSONReportPath="${organizationDirectory}/MacHealthCheck-Report.json"
splunkJSONReportLockDirectory="${organizationDirectory}/MacHealthCheck-Report.lock"
cachedReportJSON=""
cachedReportModificationEpoch="0"
cachedReportAgeSeconds="0"
cachedReportValidationStatus="not_checked"

function isProductionReportOperationMode() {

    case "${1}" in
        "Self Service" | "Silent" ) return 0 ;;
        * ) return 1 ;;
    esac

}

function validateCachedSplunkReport() {

    local cachedReportPath="${1:-${splunkJSONReportPath}}"

    cachedReportJSON=""
    cachedReportModificationEpoch="0"
    cachedReportAgeSeconds="0"
    cachedReportValidationStatus="missing"

    if [[ ! -f "${cachedReportPath}" ]] && [[ ! -L "${cachedReportPath}" ]]; then
        return 1
    fi

    # Only trust a root-owned regular file (never a symlink or a file a local user could have planted)
    if [[ -L "${cachedReportPath}" ]] || [[ ! -f "${cachedReportPath}" ]] \
        || [[ "$( stat -f %u "${cachedReportPath}" 2>/dev/null )" != "0" ]]; then
        cachedReportValidationStatus="untrusted_owner"
        return 1
    fi

    cachedReportModificationEpoch=$( stat -f %m "${cachedReportPath}" 2>/dev/null )
    if [[ "${cachedReportModificationEpoch}" != <-> ]] || (( cachedReportModificationEpoch <= 0 )); then
        cachedReportValidationStatus="invalid_mtime"
        return 1
    fi

    cachedReportJSON="$( < "${cachedReportPath}" )"
    if ! printf '%s' "${cachedReportJSON}" | jq -e . >/dev/null 2>&1; then
        cachedReportValidationStatus="invalid_json"
        return 1
    fi

    # Never upload a report produced by a non-production mode (e.g., `Test` marks every check successful)
    if ! isProductionReportOperationMode "$( printf '%s' "${cachedReportJSON}" | jq -r '.metadata.operationMode // empty' 2>/dev/null )"; then
        cachedReportValidationStatus="non_production_mode"
        return 1
    fi

    local cachedReportRunScope=""
    local cachedReportFullRunEpoch=""

    cachedReportRunScope="$( printf '%s' "${cachedReportJSON}" | jq -r '.metadata.runScope // "legacy"' 2>/dev/null )"
    if [[ "${cachedReportRunScope}" == "targeted" ]]; then
        cachedReportFullRunEpoch="$( printf '%s' "${cachedReportJSON}" | jq -r '.metadata.fullRunTimestampEpoch // empty' 2>/dev/null )"
        if [[ "${cachedReportFullRunEpoch}" != <-> ]] || (( cachedReportFullRunEpoch <= 0 )); then
            cachedReportValidationStatus="invalid_full_run_timestamp"
            return 1
        fi
        cachedReportAgeSeconds=$(( $( date +%s ) - cachedReportFullRunEpoch ))
    else
        cachedReportAgeSeconds=$(( $( date +%s ) - cachedReportModificationEpoch ))
    fi

    if (( cachedReportAgeSeconds < 0 || cachedReportAgeSeconds >= clientSideMaximumCacheAgeSeconds )); then
        cachedReportValidationStatus="stale"
        return 1
    fi

    cachedReportValidationStatus="valid"
    return 0

}

splunkOperationModeRequested="${splunkOperationMode}"
splunkOperationModeUnrecognized="false"

case "${splunkOperationMode:l}" in
    "off" )
        splunkOperationMode="off"
        ;;
    "test" )
        splunkOperationMode="test"
        ;;
    "production" )
        splunkOperationMode="production"
        ;;
    * )
        # Fail safe: an unrecognized value (e.g., a typo) must never enable production reporting
        splunkOperationModeUnrecognized="true"
        splunkOperationMode="test"
        ;;
esac

if [[ "${operationMode}" == "Silent" ]] && [[ "${splunkOperationMode}" == "production" ]]; then
    suppressNonSplunkConsoleLogging="true"
    if { : >> "${scriptLog}" } 2>/dev/null; then
        exec 2>> "${scriptLog}"
    fi
else
    suppressNonSplunkConsoleLogging="false"
fi

function clientSideEarlyLog() {

    local messageText="${1}"

    messageText="${messageText//$'\r'/ }"
    messageText="${messageText//$'\n'/; }"
    local logEntry="${organizationScriptName} (${scriptVersion}): $( date +%Y-%m-%d\ %H:%M:%S ) - [NOTICE]          Client-Side Cache: ${messageText}"

    printf '%s\n' "${logEntry}" >> "${scriptLog}" 2>/dev/null

    if [[ "${suppressNonSplunkConsoleLogging}" != "true" ]]; then
        printf '%s\n' "Client-Side Cache: ${messageText}"
    fi

}

# Reporting-first `Silent` cannot succeed without an HEC token; exit before slow discovery so a rejected
# Parameter 8 value spends as little time as possible in the process list
if [[ "${operationMode}" == "Silent" ]] && [[ "${splunkOperationMode}" == "production" ]] \
    && [[ "${splunkHECTokenSource}" == "Parameter 8 (rejected)" ]] && [[ "${splunkHECTokenConfigured}" != "true" ]]; then
    printf '%s\n' "${organizationScriptName} (${scriptVersion}): $( date +%Y-%m-%d\ %H:%M:%S ) - [ERROR]           Splunk Reporting: rejected Splunk HEC token supplied through Parameter 8; store it in ${reportingSecretsPath} (root:wheel, mode 600) and clear Parameters 5 and 8. Exiting before health checks." >> "${scriptLog}" 2>/dev/null
    printf '%s\n' "Splunk Reporting: rejected Splunk HEC token supplied through Parameter 8; store it in ${reportingSecretsPath} and clear Parameters 5 and 8. Exiting before health checks."
    exit 1
fi

# Client-Side Cache version check
if [[ "${operationMode}" == "Silent" ]] && [[ "${splunkOperationMode}" == "production" ]]; then

    if removeUntrustedForceFreshRunTrigger; then
        clientSideEarlyLog "Ignored untrusted Force Fresh Run trigger at ${forceFreshRunTriggerFilePath} (must be a root-owned regular file)."
    fi

    if isTrustedForceFreshRunTrigger || [[ "${forceFreshRun:l}" == "true" ]]; then

        forceFreshRunDetected="true"

        if isTrustedForceFreshRunTrigger && [[ "${forceFreshRun:l}" == "true" ]]; then
            forceFreshRunSource="trigger file and Parameter 11"
        elif isTrustedForceFreshRunTrigger; then
            forceFreshRunSource="trigger file"
        else
            forceFreshRunSource="Parameter 11"
        fi

        clientSideSkipChecks="false"
        clientSideEarlyLog "FORCE FRESH RUN triggered via ${forceFreshRunSource} — bypassing cache and forcing complete health check run."

        if isTrustedForceFreshRunTrigger; then
            rm -f "${forceFreshRunTriggerFilePath}"
        fi

        if [[ -f "${splunkJSONReportPath}" ]]; then
            rm -f "${splunkJSONReportPath}"
            clientSideEarlyLog "Removed cached Splunk report at ${splunkJSONReportPath} before forced run."
        fi

    elif [[ "${currentScriptPath}" == "${clientSideScriptPath}" ]]; then

        clientSideEarlyLog "Running from client-side script path; skipping cached-upload shortcut."

    elif [[ -f "${clientSideScriptPath}" ]]; then

        clientVersion=$( grep -m1 '^scriptVersion=' "${clientSideScriptPath}" 2>/dev/null | awk -F'"' '{print $2}' )

        if [[ "${clientVersion}" == "${scriptVersion}" ]]; then

            if validateCachedSplunkReport "${splunkJSONReportPath}"; then
                clientSideSkipChecks="true"
                clientSideEarlyLog "Client-side script version matches (${scriptVersion}); cached report is valid and ${cachedReportAgeSeconds}s old. Skipping health checks."
            else
                case "${cachedReportValidationStatus}" in
                    "missing" )
                        clientSideEarlyLog "Client-side script version matches (${scriptVersion}) but no cached report exists. Falling back to full health check."
                        ;;
                    "invalid_json" )
                        clientSideEarlyLog "Cached report exists but is invalid JSON. Falling back to full health check."
                        ;;
                    "stale" )
                        clientSideEarlyLog "Cached report is stale (${cachedReportAgeSeconds}s old; maximum ${clientSideMaximumCacheAgeSeconds}s). Falling back to full health check."
                        ;;
                    * )
                        clientSideEarlyLog "Cached report could not be validated (${cachedReportValidationStatus}). Falling back to full health check."
                        ;;
                esac
            fi

        else

            clientSideEarlyLog "Version mismatch (client=${clientVersion:-not found}, server=${scriptVersion}). Running full health check."

        fi

    else

        clientSideEarlyLog "Client-side script not found at ${clientSideScriptPath}. Running full health check."

    fi

fi

# Organization's Self Service Marketing Name 
organizationSelfServiceMarketingName="Workforce App Store"

# Organization's Boilerplate Compliance Message 
organizationBoilerplateComplianceMessage="Meets organizational standards"

# Organization's Branding Banner URL
organizationBrandingBannerURL="https://img.freepik.com/free-photo/black-wall-texture_1194-5564.jpg" # [Image by rawpixel.com on Freepik](https://www.freepik.com/author/rawpixel-com)

# Organization's Overlayicon URL
organizationOverlayiconURL="/System/Library/CoreServices/Apple Diagnostics.app"

# Enable Dock integration in non-Silent modes [ true | false ]
enableDockIntegration="true"

# Organization's Dock Icon URL / Path [ default | file://path | /local/path | https://... ]
dockIcon="https://usw2.ics.services.jamfcloud.com/icon/hash_08f287b1d7a9da36b733c0784031a4943bef3b82a2981eb937ab2f5b2bd55e91"

# Organization's Defaults Domain for External Checks
organizationDefaultsDomain="org.churchofjesuschrist.external"

# Organization's Color Scheme
if [[ $( defaults read "/Users/$(stat -f %Su /dev/console)/Library/Preferences/.GlobalPreferences.plist" AppleInterfaceStyle 2>/dev/null ) == "Dark" ]]; then
    # Dark Mode
    organizationColorScheme="weight=semibold,colour1=#D1D5DC,colour2=#F5F5F5"
else
    # Light Mode
    organizationColorScheme="weight=semibold,colour1=#18181B,colour2=#4D4D56"
fi

# Status Colors
statusColorSuccess="#65C466"
statusColorFail="#EB4C46"
statusColorError="#F5BE0A"

# Organization's Kerberos Realm (leave blank to disable check)
kerberosRealm=""

# Organization's Firewall Type [ socketfilterfw | pf ]
organizationFirewall="socketfilterfw"

# Organization's VPN client type [ none | paloalto | cisco | tailscale ]
vpnClientVendor="paloalto"

# Organization's VPN data type [ basic | extended ]
vpnClientDataType="extended"

# "Anticipation" Duration (in seconds)
if [[ "${operationMode}" == "Silent" ]]; then
    anticipationDuration="0"
else
    anticipationDuration="2"
fi

# How many previous minor OS versions will be marked as compliant
previousMinorOS="2"

# Allowed minimum percentage of free disk space
allowedMinimumFreeDiskPercentage="10"

# Memory pressure history and pattern defaults
memoryPressureHistoryRetentionDays="14"
memoryPressureLookbackDays="7"
memoryPressureRequiredAdverseDays="2"

# Allowed maximum percentage of disk space for user directories (i.e., Desktop, Downloads, Trash)
allowedMaximumDirectoryPercentage="5"

# Network Quality Test Maximum Age
# Leverages `date -v-`; One of either y, m, w, d, H, M or S
# must be used to specify which part of the date is to be adjusted
networkQualityTestMaximumAge="4H"

# SOFA Cache Maximum Age
# Leverages `date -v-`; One of either y, m, w, d, H, M or S
# must be used to specify which part of the date is to be adjusted
sofaCacheMaximumAge="1d"

# Allowed number of uptime minutes
# - 1 day = 24 hours × 60 minutes/hour = 1,440 minutes
# - 7 days, multiply: 7 × 1,440 minutes = 10,080 minutes
# - 30 days, multiply: 30 × 1,440 minutes = 43,200 minutes
# Use maxUptimeMinutes="" to turn the max uptime check off if desired.
allowedUptimeMinutes="10080"
maxUptimeMinutes="43200"

# Should excessive uptime result in a "warning" or "error" ?
# Setting this to error will disable the max uptime check above
excessiveUptimeAlertStyle="warning"

# Completion Timer (in seconds)
completionTimer="60"
  1. Adjust the various IT Support-related variables for your environment
    • Dynamic supportLabel1 / supportValue1 through supportLabel6 / supportValue6
    • Empty Label / Value pairs are skipped automatically
    • Legacy fallback still works when all dynamic pairs are empty:
      • Telephone (supportTeamPhone)
      • Email (supportTeamEmail)
      • Website (supportTeamWebsite)
      • Knowledge Base Article (supportKBURL)
    • Info button target now uses the first URL-like dynamic support value; if none is found, it falls back to legacy Knowledge Base values
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# IT Support Variables
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

supportTeamName="IT Support"
supportTeamPhone="+1 (801) 555-1212"
supportTeamEmail="rescue@domain.org"
supportTeamWebsite="https://support.domain.org"
supportTeamHyperlink="[${supportTeamWebsite}](${supportTeamWebsite})"
supportKB="KB8675309"
infobuttonaction="https://servicenow.domain.org/support?id=kb_article_view&sysparm_article=${supportKB}"
supportKBURL="[${supportKB}](${infobuttonaction})"
infobuttontext="${supportKB}"

# Optional dynamic IT support label/value pairs
# Leave a supportLabel blank (or its matching supportValue blank) to hide that line.
supportLabel1="Telephone"
supportValue1="${supportTeamPhone}"
supportLabel2="Email"
supportValue2="${supportTeamEmail}"
supportLabel3="Website"
supportValue3="${supportTeamWebsite}"
supportLabel4="Knowledge Base Article"
supportValue4="${supportKBURL}"
supportLabel5=""
supportValue5=""
supportLabel6=""
supportValue6=""
3. Customize Health Checks

Mac Health Check includes MDM-specific pairs of List Items and Health Checks

MDM-specific List Items determine what is displayed to the end-user, while matching individual Health Checks control which functions are executed. (See: List Items & Checks.)

🎉 New in version 5.0.0, the AI-agnostic Mac Health Check Selector skill asks which MDM you use, presents a categorized checklist and — after you confirm — writes a validated, MDM-specific, date-stamped copy of the script (plus a sidecar .md recording your selection) to the git-ignored Artifacts/ directory; Mac-Health-Check.zsh itself is never modified.

List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Main Dialog Window
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

mainDialogJSON='
{
    "commandfile" : "'"${dialogCommandFile}"'",
    "bannerimage" : "'"${organizationBrandingBannerURL}"'",
    "bannertext" : "'"${humanReadableScriptName} (${scriptVersion})"'",
    "title" : "'"${humanReadableScriptName} (${scriptVersion})"'",
    "titlefont" : "shadow=true, size=36, colour=#FFFDF4",
    "ontop" : true,
    "moveable" : true,
    "windowbuttons" : "min",
    "quitkey" : "k",
    "icon" : "'"${icon}"'",
    "overlayicon" : "'"${overlayicon}"'",
    "message" : "none",
    "iconsize" : "198",
    "infobox" : "**User:** '"{userfullname}"'<br><br>**Computer Model:** '"{computermodel}"'<br><br>**Serial Number:** '"{serialnumber}"'<br><br>**System Memory:** '"${systemMemory}"'<br><br>**System Storage:** '"${systemStorage}"' ",
    "infobuttontext" : "'"${infobuttontext}"'",
    "infobuttonaction" : "'"${infobuttonaction}"'",
    "button1text" : "Wait",
    "button1disabled" : "true",
    "helpmessage" : "'"${helpmessage}"'",
    "helpimage" : "'"${helpimage}"'",
    "position" : "center",
    "progress" :  "'"${progressSteps}"'",
    "progresstext" : "Please wait …",
    "height" : "750",
    "width" : "975",
    "messagefont" : "size=14"
}
'

# Validate mainDialogJSON is valid JSON
if ! validateJson "${mainDialogJSON}"; then
  echo "Error: mainDialogJSON is invalid JSON"
  echo "$mainDialogJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Addigy MDM List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

addigyMdmListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "App Auto-Patch", "subtitle" : "Keep your apps up-to-date to ensure their security and performance", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Password Hint", "subtitle" : "Ensure no password hint is set for better security", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Profile", "subtitle" : "The presence of the '${mdmVendor}' MDM profile helps ensure your Mac is enrolled", "icon" : "SF=20.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=21.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=22.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=23.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=24.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=25.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=26.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=27.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Microsoft Teams", "subtitle" : "The hub for teamwork in Microsoft 365.", "icon" : "SF=28.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=30.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=33.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'
# Validate addigyMdmListitemJSON is valid JSON
if ! validateJson "${addigyMdmListitemJSON}"; then
  echo "Error: addigyMdmListitemJSON is invalid JSON"
  echo "$addigyMdmListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Filewave MDM List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

filewaveMdmListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "App Auto-Patch", "subtitle" : "Keep your apps up-to-date to ensure their security and performance", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Password Hint", "subtitle" : "Ensure no password hint is set for better security", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Profile", "subtitle" : "The presence of the '${mdmVendor}' MDM profile helps ensure your Mac is enrolled", "icon" : "SF=20.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=21.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=22.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=23.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=24.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=25.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=26.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=27.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=28.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=30.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'
# Validate filewaveMdmListitemJSON is valid JSON
if ! validateJson "${filewaveMdmListitemJSON}"; then
  echo "Error: filewaveMdmListitemJSON is invalid JSON"
  echo "$filewaveMdmListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Fleet MDM List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

fleetMdmListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "App Auto-Patch", "subtitle" : "Keep your apps up-to-date to ensure their security and performance", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Password Hint", "subtitle" : "Ensure no password hint is set for better security", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Profile", "subtitle" : "The presence of the '${mdmVendor}' MDM profile helps ensure your Mac is enrolled", "icon" : "SF=20.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=21.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=22.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=23.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=24.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=25.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=26.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=27.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Fleet Desktop", "subtitle" : "Visibility into the security posture of your Mac.", "icon" : "SF=28.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=30.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=33.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'
# Validate fleetMdmListitemJSON is valid JSON
if ! validateJson "${fleetMdmListitemJSON}"; then
  echo "Error: fleetMdmListitemJSON is invalid JSON"
  echo "$fleetMdmListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Kandji MDM List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

kandjiMdmListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=18.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=19.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=20.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=21.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=22.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Microsoft Teams", "subtitle" : "The hub for teamwork in Microsoft 365.", "icon" : "SF=23.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Microsoft One Drive", "subtitle" : "Microsoft cloud storage for your important files.", "icon" : "SF=24.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Microsoft Outlook", "subtitle" : "Email and Calendar from Microsoft.", "icon" : "SF=25.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Company Portal", "subtitle" : "Required for Platform Single Sign-On.", "icon" : "SF=26.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Zoom", "subtitle" : "Web Conferencing Tool.", "icon" : "SF=27.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Cortex", "subtitle" : "Cortex Security Software.", "icon" : "SF=28.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},    
    {"title" : "Netskope", "subtitle" : "Netskope Connection Software.", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},        
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=30.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'
# Validate kandjiMdmListitemJSON is valid JSON
if ! validateJson "${kandjiMdmListitemJSON}"; then
  echo "Error: kandjiMdmListitemJSON is invalid JSON"
  echo "$kandjiMdmListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Jamf Pro List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

jamfProListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Profile", "subtitle" : "The presence of the '${mdmVendor}' MDM profile helps ensure your Mac is enrolled", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Entra ID Registration", "subtitle" : "Checks Microsoft Entra registration for current user context", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=20.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=21.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Jamf Pro Check-In", "subtitle" : "Your Mac should check-in with the Jamf Pro MDM server multiple times each day", "icon" : "SF=22.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Jamf Pro Inventory", "subtitle" : "Your Mac should submit its inventory to the Jamf Pro MDM server daily", "icon" : "SF=23.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Clock Skew", "subtitle" : "Checks local clock offset against time.apple.com before Jamf Pro inventory submission", "icon" : "SF=24.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=25.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=26.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=27.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=28.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=29.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Jamf Hosts","subtitle":"Test connectivity to Jamf Pro cloud and on-prem endpoints","icon":"SF=30.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "App Auto-Patch", "subtitle" : "Keep your apps up-to-date to ensure their security and performance", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=33.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Microsoft Teams", "subtitle" : "The hub for teamwork in Microsoft 365.", "icon" : "SF=34.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "BeyondTrust Privilege Management", "subtitle" : "Privilege Management for Mac pairs powerful least-privilege management and application control", "icon" : "SF=35.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Cisco Umbrella", "subtitle" : "Cisco Umbrella combines multiple security functions so you can extend data protection anywhere.", "icon" : "SF=36.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "CrowdStrike Falcon", "subtitle" : "Technology, intelligence, and expertise come together in CrowdStrike Falcon to deliver security that works.", "icon" : "SF=37.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Palo Alto GlobalProtect", "subtitle" : "Virtual Private Network (VPN) connection to Church headquarters", "icon" : "SF=38.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=39.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=40.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=41.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Computer Inventory", "subtitle" : "The listing of your Mac’s apps and settings", "icon" : "SF=42.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'

# Validate jamfProListitemJSON is valid JSON
if ! validateJson "${jamfProListitemJSON}"; then
  echo "Error: jamfProListitemJSON is invalid JSON"
  echo "$jamfProListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# JumpCloud MDM List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

jumpcloudMdmListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "App Auto-Patch", "subtitle" : "Keep your apps up-to-date to ensure their security and performance", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Password Hint", "subtitle" : "Ensure no password hint is set for better security", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Profile", "subtitle" : "The presence of the '${mdmVendor}' MDM profile helps ensure your Mac is enrolled", "icon" : "SF=20.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=21.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=22.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=23.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=24.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=25.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=26.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=27.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Microsoft Teams", "subtitle" : "The hub for teamwork in Microsoft 365.", "icon" : "SF=28.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=30.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=33.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'

# Validate jumpcloudMdmListitemJSON is valid JSON
if ! validateJson "${jumpcloudMdmListitemJSON}"; then
  echo "Error: jumpcloudMdmListitemJSON is invalid JSON"
  echo "$jumpcloudMdmListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Microsoft Intune MDM List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

microsoftMdmListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "App Auto-Patch", "subtitle" : "Keep your apps up-to-date to ensure their security and performance", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Password Hint", "subtitle" : "Ensure no password hint is set for better security", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Profile", "subtitle" : "The presence of the '${mdmVendor}' MDM profile helps ensure your Mac is enrolled", "icon" : "SF=20.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=21.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=22.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=23.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=24.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=25.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=26.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=27.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Microsoft Company Portal", "subtitle" : "Securely access and manage corporate apps, resources, and devices via Intune.", "icon" : "SF=28.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=30.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=33.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'

# Validate microsoftMdmListitemJSON is valid JSON
if ! validateJson "${microsoftMdmListitemJSON}"; then
  echo "Error: microsoftMdmListitemJSON is invalid JSON"
  echo "$microsoftMdmListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Mosyle List Items (thanks, @precursorca and @bigdoodr!)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

mosyleListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "App Auto-Patch", "subtitle" : "Keep your apps up-to-date to ensure their security and performance", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Password Hint", "subtitle" : "Ensure no password hint is set for better security", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Profile", "subtitle" : "The presence of the '${mdmVendor}' MDM profile helps ensure your Mac is enrolled", "icon" : "SF=20.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' MDM Certificate Expiration", "subtitle" : "Validate the expiration date of the '${mdmVendor}' MDM certificate", "icon" : "SF=21.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=22.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Mosyle Check-In", "subtitle" : "Your Mac should check-in with the Mosyle MDM server multiple times each day", "icon" : "SF=23.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.4},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=24.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=25.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=26.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=27.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=28.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "'${mdmVendor}' Self-Service", "subtitle" : "Your one-stop shop for all things '${mdmVendor}'.", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=30.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=31.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=32.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=33.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=34.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'

# Validate mosyleListitemJSON is valid JSON
if ! validateJson "${mosyleListitemJSON}"; then
  echo "Error: mosyleListitemJSON is invalid JSON"
  echo "$mosyleListitemJSON"
  exit 1
fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Generic MDM List Items
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

genericMdmListitemJSON='
[
    {"title" : "macOS Version", "subtitle" : "Organizational standards are the current and immediately previous versions of macOS", "icon" : "SF=01.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Available Updates", "subtitle" : "Keep your Mac up-to-date to ensure its security and performance", "icon" : "SF=02.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "System Integrity Protection", "subtitle" : "System Integrity Protection (SIP) in macOS protects the entire system by preventing the execution of unauthorized code.", "icon" : "SF=03.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Signed System Volume", "subtitle" : "Signed System Volume (SSV) ensures macOS is booted from a signed, cryptographically protected volume.", "icon" : "SF=04.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Firewall", "subtitle" : "The built-in macOS firewall helps protect your Mac from unauthorized access.", "icon" : "SF=05.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "FileVault Encryption", "subtitle" : "FileVault is built-in to macOS and provides full-disk encryption to help prevent unauthorized access to your Mac", "icon" : "SF=06.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Gatekeeper / XProtect", "subtitle" : "Prevents the execution of Apple-identified malware and adware.", "icon" : "SF=07.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Touch ID", "subtitle" : "Touch ID provides secure biometric authentication for unlock your Mac and authorize third-party apps.", "icon" : "SF=08.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "VPN Client", "subtitle" : "Your Mac should have the proper VPN client installed and usable", "icon" : "SF=09.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Last Reboot", "subtitle" : "Restart your Mac regularly — at least once a week — can help resolve many common issues", "icon" : "SF=10.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Free Disk Space", "subtitle" : "Checks for the amount of free disk space on your Mac’s boot volume", "icon" : "SF=11.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Desktop Size and Item Count", "subtitle" : "Checks the size and item count of the Desktop", "icon" : "SF=12.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Downloads Size and Item Count", "subtitle" : "Checks the size and item count of the Downloads folder", "icon" : "SF=13.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Trash Size and Item Count", "subtitle" : "Checks the size and item count of the Trash", "icon" : "SF=14.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Password Hint", "subtitle" : "Ensure no password hint is set for better security", "icon" : "SF=15.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirDrop", "subtitle" : "Ensure AirDrop is not set to Everyone for security", "icon" : "SF=16.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "AirPlay Receiver", "subtitle" : "Ensure AirPlay Receiver is disabled when not needed", "icon" : "SF=17.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Bluetooth Sharing", "subtitle" : "Ensure Bluetooth Sharing is disabled when not needed", "icon" : "SF=18.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification service", "subtitle" : "Validate communication between Apple, '${mdmVendor}' and your Mac", "icon" : "SF=19.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Push Notification Hosts","subtitle":"Test connectivity to Apple Push Notification hosts","icon":"SF=20.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Device Management","subtitle":"Test connectivity to Apple device enrollment and MDM services","icon":"SF=21.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Software and Carrier Updates","subtitle":"Test connectivity to Apple software update endpoints","icon":"SF=22.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Certificate Validation","subtitle":"Test connectivity to Apple certificate and OCSP services","icon":"SF=23.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Apple Identity and Content Services","subtitle":"Test connectivity to Apple Identity and Content services","icon":"SF=24.circle,'"${organizationColorScheme}"'", "status":"pending","statustext":"Pending …", "iconalpha" : 0.5},
    {"title" : "Homebrew Status", "subtitle" : "If installed, compares the latest Homebrew release and any outdated packages", "icon" : "SF=25.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Electron Corner Mask", "subtitle" : "Detects susceptible Electron apps that may cause GPU slowdowns on macOS 26 Tahoe", "icon" : "SF=26.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Wi-Fi Strength", "subtitle" : "Checks current Wi-Fi signal strength and gives a simple quality rating.", "icon" : "SF=27.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Memory Pressure", "subtitle" : "Reviews memory pressure across recent days", "icon" : "SF=28.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5},
    {"title" : "Network Quality Test", "subtitle" : "Various networking-related tests of your Mac’s Internet connection", "icon" : "SF=29.circle,'"${organizationColorScheme}"'", "status" : "pending", "statustext" : "Pending …", "iconalpha" : 0.5}
]
'

# Validate genericMdmListitemJSON is valid JSON
if ! validateJson "${genericMdmListitemJSON}"; then
  echo "Error: genericMdmListitemJSON is invalid JSON"
  echo "$genericMdmListitemJSON"
  exit 1
fi
Health Checks
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Generate Health Checks based on Operation Mode and MDM Vendor (where "n" represents the listitem order)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

if [[ "${operationMode}" == "Development" ]]; then
    
    # Operation Mode: Development
    notice "Operation Mode is ${operationMode}; using ${operationMode}-specific Health Check."
    dialogUpdate "title: ${humanReadableScriptName} (${scriptVersion})<br>Operation Mode: ${operationMode}"
    # set -x
    checkClockSkew "0"
    checkMemoryPressure "1"
    checkAPNs "2"
    # set +x

else

    notice "Operation Mode is ${operationMode}; using MDM-specific Health Checks."

    if [[ "${operationMode}" != "Test" ]]; then

        # Operation Mode: Debug
        if [[ "${operationMode}" == "Debug" ]]; then
            dialogUpdate "title: ${humanReadableScriptName} (${scriptVersion})<br>Operation Mode: ${operationMode}"
        fi

        # Operation Mode: Self Service 
        case ${mdmVendor} in

            "Addigy" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkAppAutoPatch
                runConfiguredHealthCheck "3" checkSIP
                runConfiguredHealthCheck "4" checkSSV
                runConfiguredHealthCheck "5" checkFirewall
                runConfiguredHealthCheck "6" checkFileVault
                runConfiguredHealthCheck "7" checkGatekeeperXProtect
                runConfiguredHealthCheck "8" checkTouchID
                runConfiguredHealthCheck "9" checkVPN
                runConfiguredHealthCheck "10" checkUptime
                runConfiguredHealthCheck "11" checkFreeDiskSpace
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "14" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "15" checkPasswordHint
                runConfiguredHealthCheck "16" checkAirDropSettings
                runConfiguredHealthCheck "17" checkAirPlayReceiver
                runConfiguredHealthCheck "18" checkBluetoothSharing
                runConfiguredHealthCheck "19" checkMdmProfile
                runConfiguredHealthCheck "20" checkMdmCertificateExpiration
                runConfiguredHealthCheck "21" checkAPNs
                runConfiguredHealthCheck "22" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "23" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "24" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "25" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "26" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "27" checkInternal "/Applications/Microsoft Teams.app" "/Applications/Microsoft Teams.app" "Microsoft Teams"
                runConfiguredHealthCheck "28" checkHomebrewStatus
                runConfiguredHealthCheck "29" checkElectronCornerMask
                runConfiguredHealthCheck "30" checkWiFiStrength
                runConfiguredHealthCheck "31" checkMemoryPressure
                runConfiguredHealthCheck "32" checkNetworkQuality
                ;;

            "Filewave" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkAppAutoPatch
                runConfiguredHealthCheck "3" checkSIP
                runConfiguredHealthCheck "4" checkSSV
                runConfiguredHealthCheck "5" checkFirewall
                runConfiguredHealthCheck "6" checkFileVault
                runConfiguredHealthCheck "7" checkGatekeeperXProtect
                runConfiguredHealthCheck "8" checkTouchID
                runConfiguredHealthCheck "9" checkVPN
                runConfiguredHealthCheck "10" checkUptime
                runConfiguredHealthCheck "11" checkFreeDiskSpace
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "14" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "15" checkPasswordHint
                runConfiguredHealthCheck "16" checkAirDropSettings
                runConfiguredHealthCheck "17" checkAirPlayReceiver
                runConfiguredHealthCheck "18" checkBluetoothSharing
                runConfiguredHealthCheck "19" checkMdmProfile
                runConfiguredHealthCheck "20" checkMdmCertificateExpiration
                runConfiguredHealthCheck "21" checkAPNs
                runConfiguredHealthCheck "22" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "23" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "24" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "25" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "26" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "27" checkHomebrewStatus
                runConfiguredHealthCheck "28" checkElectronCornerMask
                runConfiguredHealthCheck "29" checkWiFiStrength
                runConfiguredHealthCheck "30" checkMemoryPressure
                runConfiguredHealthCheck "31" checkNetworkQuality
                ;;

            "Fleet" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkAppAutoPatch
                runConfiguredHealthCheck "3" checkSIP
                runConfiguredHealthCheck "4" checkSSV
                runConfiguredHealthCheck "5" checkFirewall
                runConfiguredHealthCheck "6" checkFileVault
                runConfiguredHealthCheck "7" checkGatekeeperXProtect
                runConfiguredHealthCheck "8" checkTouchID
                runConfiguredHealthCheck "9" checkVPN
                runConfiguredHealthCheck "10" checkUptime
                runConfiguredHealthCheck "11" checkFreeDiskSpace
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "14" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "15" checkPasswordHint
                runConfiguredHealthCheck "16" checkAirDropSettings
                runConfiguredHealthCheck "17" checkAirPlayReceiver
                runConfiguredHealthCheck "18" checkBluetoothSharing
                runConfiguredHealthCheck "19" checkMdmProfile
                runConfiguredHealthCheck "20" checkMdmCertificateExpiration
                runConfiguredHealthCheck "21" checkAPNs
                runConfiguredHealthCheck "22" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "23" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "24" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "25" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "26" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "27" checkInternal "/opt/orbit/bin/desktop/macos/stable/Fleet Desktop.app" "/opt/orbit/bin/desktop/macos/stable/Fleet Desktop.app" "Fleet Desktop"
                runConfiguredHealthCheck "28" checkHomebrewStatus
                runConfiguredHealthCheck "29" checkElectronCornerMask
                runConfiguredHealthCheck "30" checkWiFiStrength
                runConfiguredHealthCheck "31" checkMemoryPressure
                runConfiguredHealthCheck "32" checkNetworkQuality
                ;;

            "Jamf Pro" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkSIP
                runConfiguredHealthCheck "3" checkSSV
                runConfiguredHealthCheck "4" checkFirewall
                runConfiguredHealthCheck "5" checkFileVault
                runConfiguredHealthCheck "6" checkGatekeeperXProtect
                runConfiguredHealthCheck "7" checkTouchID
                runConfiguredHealthCheck "8" checkAirDropSettings
                runConfiguredHealthCheck "9" checkAirPlayReceiver
                runConfiguredHealthCheck "10" checkBluetoothSharing
                runConfiguredHealthCheck "11" checkVPN
                runConfiguredHealthCheck "12" checkUptime
                runConfiguredHealthCheck "13" checkFreeDiskSpace
                runConfiguredHealthCheck "14" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "15" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "16" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "17" checkMdmProfile
                runConfiguredHealthCheck "18" checkEntraIDRegistration
                runConfiguredHealthCheck "19" checkMdmCertificateExpiration
                runConfiguredHealthCheck "20" checkAPNs
                runConfiguredHealthCheck "21" checkJamfProCheckIn
                runConfiguredHealthCheck "22" checkJamfProInventory
                runConfiguredHealthCheck "23" checkClockSkew
                runConfiguredHealthCheck "24" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "25" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "26" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "27" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "28" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "29" checkNetworkHosts "Jamf Hosts"                            "${jamfHosts[@]}"
                runConfiguredHealthCheck "30" checkAppAutoPatch
                runConfiguredHealthCheck "31" checkHomebrewStatus
                runConfiguredHealthCheck "32" checkElectronCornerMask
                runConfiguredHealthCheck "33" checkInternal "/Applications/Microsoft Teams.app" "/Applications/Microsoft Teams.app" "Microsoft Teams"
                runConfiguredHealthCheck "34" checkExternalJamfPro "symvBeyondTrustPMfM"        "/Applications/PrivilegeManagement.app"
                runConfiguredHealthCheck "35" checkExternalJamfPro "symvCiscoUmbrella"          "/Applications/Cisco/Cisco Secure Client.app"
                runConfiguredHealthCheck "36" checkExternalJamfPro "symvCrowdStrikeFalcon"      "/Applications/Falcon.app"
                runConfiguredHealthCheck "37" checkExternalJamfPro "symvGlobalProtect"          "/Applications/GlobalProtect.app"
                runConfiguredHealthCheck "38" checkWiFiStrength
                runConfiguredHealthCheck "39" checkMemoryPressure
                runConfiguredHealthCheck "40" checkNetworkQuality
                runConfiguredHealthCheck "41" updateComputerInventory
                ;;

            "JumpCloud" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkAppAutoPatch
                runConfiguredHealthCheck "3" checkSIP
                runConfiguredHealthCheck "4" checkSSV
                runConfiguredHealthCheck "5" checkFirewall
                runConfiguredHealthCheck "6" checkFileVault
                runConfiguredHealthCheck "7" checkGatekeeperXProtect
                runConfiguredHealthCheck "8" checkTouchID
                runConfiguredHealthCheck "9" checkVPN
                runConfiguredHealthCheck "10" checkUptime
                runConfiguredHealthCheck "11" checkFreeDiskSpace
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "14" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "15" checkPasswordHint
                runConfiguredHealthCheck "16" checkAirDropSettings
                runConfiguredHealthCheck "17" checkAirPlayReceiver
                runConfiguredHealthCheck "18" checkBluetoothSharing
                runConfiguredHealthCheck "19" checkMdmProfile
                runConfiguredHealthCheck "20" checkMdmCertificateExpiration
                runConfiguredHealthCheck "21" checkAPNs
                runConfiguredHealthCheck "22" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "23" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "24" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "25" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "26" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "27" checkInternal "/Applications/Microsoft Teams.app" "/Applications/Microsoft Teams.app" "Microsoft Teams"
                runConfiguredHealthCheck "28" checkHomebrewStatus
                runConfiguredHealthCheck "29" checkElectronCornerMask
                runConfiguredHealthCheck "30" checkWiFiStrength
                runConfiguredHealthCheck "31" checkMemoryPressure
                runConfiguredHealthCheck "32" checkNetworkQuality
                ;;

            "Kandji" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkSIP
                runConfiguredHealthCheck "3" checkSSV
                runConfiguredHealthCheck "4" checkFirewall
                runConfiguredHealthCheck "5" checkFileVault
                runConfiguredHealthCheck "6" checkGatekeeperXProtect
                runConfiguredHealthCheck "7" checkTouchID
                runConfiguredHealthCheck "8" checkVPN
                runConfiguredHealthCheck "9" checkUptime
                runConfiguredHealthCheck "10" checkFreeDiskSpace
                runConfiguredHealthCheck "11" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Downloads" "arrow.down.circle.fill" "Downloads"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "14" checkBluetoothSharing
                runConfiguredHealthCheck "15" checkMdmCertificateExpiration
                runConfiguredHealthCheck "16" checkAPNs
                runConfiguredHealthCheck "17" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "18" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "19" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "20" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "21" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "22" checkInternal "/Applications/Microsoft Teams.app" "/Applications/Microsoft Teams.app" "Microsoft Teams"
                runConfiguredHealthCheck "23" checkInternal "/Applications/OneDrive.app" "/Applications/OneDrive.app" "Microsoft One Drive"
                runConfiguredHealthCheck "24" checkInternal "/Applications/Microsoft Outlook.app" "/Applications/Microsoft Outlook.app" "Microsoft Outlook"
                runConfiguredHealthCheck "25" checkInternal "/Applications/Company Portal.app" "/Applications/Company Portal.app" "Company Portal"
                runConfiguredHealthCheck "26" checkInternal "/Applications/zoom.us.app" "/Applications/zoom.us.app" "Zoom"
                runConfiguredHealthCheck "27" checkInternal "/Applications/Cortex XDR.app" "/Applications/Cortex XDR.app" "Cortex"
                runConfiguredHealthCheck "28" checkInternal "/Applications/Netskope Client.app" "/Applications/Netskope Client.app" "Netskope"
                runConfiguredHealthCheck "29" checkWiFiStrength
                runConfiguredHealthCheck "30" checkMemoryPressure
                runConfiguredHealthCheck "31" checkNetworkQuality
                ;;

            "Microsoft Intune" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkAppAutoPatch
                runConfiguredHealthCheck "3" checkSIP
                runConfiguredHealthCheck "4" checkSSV
                runConfiguredHealthCheck "5" checkFirewall
                runConfiguredHealthCheck "6" checkFileVault
                runConfiguredHealthCheck "7" checkGatekeeperXProtect
                runConfiguredHealthCheck "8" checkTouchID
                runConfiguredHealthCheck "9" checkVPN
                runConfiguredHealthCheck "10" checkUptime
                runConfiguredHealthCheck "11" checkFreeDiskSpace
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "14" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "15" checkPasswordHint
                runConfiguredHealthCheck "16" checkAirDropSettings
                runConfiguredHealthCheck "17" checkAirPlayReceiver
                runConfiguredHealthCheck "18" checkBluetoothSharing
                runConfiguredHealthCheck "19" checkMdmProfile
                runConfiguredHealthCheck "20" checkMdmCertificateExpiration
                runConfiguredHealthCheck "21" checkAPNs
                runConfiguredHealthCheck "22" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "23" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "24" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "25" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "26" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "27" checkInternal "/Applications/Company Portal.app" "/Applications/Company Portal.app" "Microsoft Company Portal"
                runConfiguredHealthCheck "28" checkHomebrewStatus
                runConfiguredHealthCheck "29" checkElectronCornerMask
                runConfiguredHealthCheck "30" checkWiFiStrength
                runConfiguredHealthCheck "31" checkMemoryPressure
                runConfiguredHealthCheck "32" checkNetworkQuality
                ;;

            "Mosyle" )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkAppAutoPatch
                runConfiguredHealthCheck "3" checkSIP
                runConfiguredHealthCheck "4" checkSSV
                runConfiguredHealthCheck "5" checkFirewall
                runConfiguredHealthCheck "6" checkFileVault
                runConfiguredHealthCheck "7" checkGatekeeperXProtect
                runConfiguredHealthCheck "8" checkTouchID
                runConfiguredHealthCheck "9" checkVPN
                runConfiguredHealthCheck "10" checkUptime
                runConfiguredHealthCheck "11" checkFreeDiskSpace
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "14" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "15" checkPasswordHint
                runConfiguredHealthCheck "16" checkAirDropSettings
                runConfiguredHealthCheck "17" checkAirPlayReceiver
                runConfiguredHealthCheck "18" checkBluetoothSharing
                runConfiguredHealthCheck "19" checkMdmProfile
                runConfiguredHealthCheck "20" checkMdmCertificateExpiration
                runConfiguredHealthCheck "21" checkAPNs
                runConfiguredHealthCheck "22" checkMosyleCheckIn
                runConfiguredHealthCheck "23" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "24" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "25" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "26" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "27" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "28" checkInternal "/Applications/Self-Service.app" "/Applications/Self-Service.app" "Self-Service"
                runConfiguredHealthCheck "29" checkHomebrewStatus
                runConfiguredHealthCheck "30" checkElectronCornerMask
                runConfiguredHealthCheck "31" checkWiFiStrength
                runConfiguredHealthCheck "32" checkMemoryPressure
                runConfiguredHealthCheck "33" checkNetworkQuality
                ;;

            * )
                runConfiguredHealthCheck "0" checkOS
                runConfiguredHealthCheck "1" checkAvailableSoftwareUpdates
                runConfiguredHealthCheck "2" checkSIP
                runConfiguredHealthCheck "3" checkSSV
                runConfiguredHealthCheck "4" checkFirewall
                runConfiguredHealthCheck "5" checkFileVault
                runConfiguredHealthCheck "6" checkGatekeeperXProtect
                runConfiguredHealthCheck "7" checkTouchID
                runConfiguredHealthCheck "8" checkVPN
                runConfiguredHealthCheck "9" checkUptime
                runConfiguredHealthCheck "10" checkFreeDiskSpace
                runConfiguredHealthCheck "11" checkUserDirectorySizeItems "Desktop" "desktopcomputer.and.macbook" "Desktop"
                runConfiguredHealthCheck "12" checkUserDirectorySizeItems "Downloads" "folder.fill.badge.plus" "Downloads"
                runConfiguredHealthCheck "13" checkUserDirectorySizeItems ".Trash" "trash.fill" "Trash"
                runConfiguredHealthCheck "14" checkPasswordHint
                runConfiguredHealthCheck "15" checkAirDropSettings
                runConfiguredHealthCheck "16" checkAirPlayReceiver
                runConfiguredHealthCheck "17" checkBluetoothSharing
                runConfiguredHealthCheck "18" checkAPNs
                runConfiguredHealthCheck "19" checkNetworkHosts "Apple Push Notification Hosts"         "${pushHosts[@]}"
                runConfiguredHealthCheck "20" checkNetworkHosts "Apple Device Management"               "${deviceMgmtHosts[@]}"
                runConfiguredHealthCheck "21" checkNetworkHosts "Apple Software and Carrier Updates"    "${updateHosts[@]}"
                runConfiguredHealthCheck "22" checkNetworkHosts "Apple Certificate Validation"          "${certHosts[@]}"
                runConfiguredHealthCheck "23" checkNetworkHosts "Apple Identity and Content Services"   "${idAssocHosts[@]}"
                runConfiguredHealthCheck "24" checkHomebrewStatus
                runConfiguredHealthCheck "25" checkElectronCornerMask
                runConfiguredHealthCheck "26" checkWiFiStrength
                runConfiguredHealthCheck "27" checkMemoryPressure
                runConfiguredHealthCheck "28" checkNetworkQuality
                ;;
        
        esac

        dialogUpdate "icon: ${icon}"
        dialogUpdate "progresstext: Final Analysis …"

        sleep "${anticipationDuration}"

    else

        # Operation Mode: Test
        dialogUpdate "title: ${humanReadableScriptName} (${scriptVersion})<br>Operation Mode: ${operationMode}"

        for (( i=0; i<listitemLength; i++ )); do
            notice "[Operation Mode: ${operationMode}] Check ${i} …"
            dialogUpdate "icon: SF=$(printf "%02d" $(($i+1))).square,${organizationColorScheme}"
            dialogUpdate "listitem: index: ${i}, icon: SF=$(printf "%02d" $(($i+1))).circle.fill $(echo "${organizationColorScheme}" | tr ',' ' '), iconalpha: 1, status: wait, statustext: Checking …"
            dialogUpdate "progress: increment"
            dialogUpdate "progresstext: [Operation Mode: ${operationMode}] • Item No. ${i} …"
            # sleep "${anticipationDuration}"
            dialogUpdate "listitem: index: ${i}, icon: SF=$(printf "%02d" $(($i+1))).circle.fill weight=semibold colour=${statusColorSuccess}, iconalpha: 0.9, subtitle: ${organizationBoilerplateComplianceMessage}, status: success, statustext: ${operationMode}"
        done

        dialogUpdate "icon: ${icon}"
        dialogUpdate "progresstext: Final Analysis …"

        sleep "${anticipationDuration}"

    fi

fi



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Quit Script
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

quitScript

Support

Community-based, best-effort support is available on the Mac Admins Slack (free, registration required) #mac-health-check Channel, or you can open an issue on GitHub.

Posted in macOS, Scripts, swiftDialog, Tips & Tricks

Related Posts

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.