{"id":1315,"date":"2022-12-09T15:45:11","date_gmt":"2022-12-09T20:45:11","guid":{"rendered":"https:\/\/www.brunerd.com\/blog\/?p=1315"},"modified":"2022-12-09T15:45:13","modified_gmt":"2022-12-09T20:45:13","slug":"determining-eligible-macos-versions-via-script","status":"publish","type":"post","link":"https:\/\/www.brunerd.com\/blog\/2022\/12\/09\/determining-eligible-macos-versions-via-script\/","title":{"rendered":"Determining eligible macOS versions via script"},"content":{"rendered":"\n<p>Every year Mac admins wonder which Macs will make the cut for the new MacOS. While it&#8217;s <a rel=\"noreferrer noopener\" href=\"https:\/\/support.apple.com\/HT213264\" target=\"_blank\">no mystery<\/a> which models those are, if you&#8217;ve got Jamf you&#8217;ll be wondering how to best scope to those Macs so you can perhaps offer the upgrade in Self Service or alert the user to request a new Mac! One way to scope a Smart Group is with the <strong>Model Identifier<\/strong> criteria and the regex operator, like <a rel=\"noreferrer noopener\" href=\"https:\/\/community.jamf.com\/t5\/jamf-pro\/macos-ventura-hardware-compatibility-regex\/td-p\/267461\" target=\"_blank\">this one<\/a> (I even chipped in!). It doesn&#8217;t require an inventory and results are near instant. Before I was any good at regex though, I took another route and made an Extension Attribute <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/macOSCompatibility.sh\" target=\"_blank\">macOSCompatibility.sh<\/a>, where the Mac reports back to Jamf. (It <em>also<\/em> has a CSV output mode for nerdy <a rel=\"noreferrer noopener\" href=\"https:\/\/www.brunerd.com\/blog\/2021\/01\/27\/macos-compatibility-fun\/\" data-type=\"post\" data-id=\"932\" target=\"_blank\">fun<\/a>!) Both methods however require manual upkeep and are now somewhat complicated by Apple&#8217;s new use of the very generic <code>Mac<em>xx,xx<\/em><\/code> model identifier which doesn&#8217;t seem to follow the usual model name and number scheme of major version and minor form factor variants (on <em>purpose<\/em> me-thinks!). Let&#8217;s look at some new methods that <em>don&#8217;t<\/em> require future upkeep.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using softwareupdate &#8211;list-full-installers<\/h3>\n\n\n\n<p>macOS Big Sur (11) introduced a new command <code>softwareupdate<\/code> <code>--list-full-installers<\/code> which shows all eligible installers available for download by the Mac running that command. The funny thing about this is that even though it is a Big Sur or newer feature, if the hardware is old enough, like a 2017, it offer versions all the way back to 10.13 High Sierra! Monterey added build numbers to the output and it can be easily reduced to just versions with <code>awk<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>softwareupdate --list-full-installers | awk -F 'Version: |, Size' '\/Title:\/{print $2}'<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/swu-list_full_installers-2017.png\"><img decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/swu-list_full_installers-2017-886x1024.png\" alt=\"\" class=\"wp-image-1330\" width=\"-220\" height=\"-254\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/swu-list_full_installers-2017-886x1024.png 886w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/swu-list_full_installers-2017-260x300.png 260w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/swu-list_full_installers-2017-768x887.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/swu-list_full_installers-2017.png 1068w\" sizes=\"(max-width: 886px) 100vw, 886px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>This one-liner can be made into a simple function. I&#8217;ve added a <code>uniq<\/code> at the end for case where two differing builds have the same version, like 10.15.7. Here&#8217;s that function in a script with a little version check: <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Scripts\/getSupportedMacOSVersions_ASLS.sh\" target=\"_blank\"><\/a><a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Scripts\/getSupportedMacOSVersions_SWU.sh\">getSupportedMacOSVersions_SWU.sh<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>#!\/bin\/sh\n: &lt;&lt;-LICENSE_BLOCK\ngetSupportedMacOSVersions_SWU - Copyright (c) 2022 Joel Bruner\nLicensed under the MIT License\nLICENSE_BLOCK\n\nfunction getSupportedMacOSVersions_SWU()( \n#getSupportedMacOSVersions_SWU - uses softwareupdate to determine compatible macOS versions for the Mac host that runs this\n\tif &#91; \"$(sw_vers -productVersion | cut -d. -f1)\" -lt 11 ]; then echo \"Error: macOS 11+ required\" &gt;&amp;2; return 1; fi\n\t#get full installers and strip out all other columns\n\tsoftwareupdate --list-full-installers 2&gt;\/dev\/null | awk -F 'Version: |, Size' '\/Title:\/{print $2}' | uniq\n)\n\ngetSupportedMacOSVersions_SWU \n<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getAvailableMacOS-2ways.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getAvailableMacOS-2ways.png\" alt=\"\" class=\"wp-image-1322\" width=\"590\" height=\"114\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getAvailableMacOS-2ways.png 870w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getAvailableMacOS-2ways-300x58.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getAvailableMacOS-2ways-768x148.png 768w\" sizes=\"auto, (max-width: 590px) 100vw, 590px\" \/><\/a><figcaption class=\"wp-element-caption\">Output from Apple Silicon will <em>never<\/em> include 10.x versions<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Software Update (SWU) Based Extension Attribute for Jamf<\/h3>\n\n\n\n<p>The possible inclusion of 10.x versions in the output complicates things a bit. In ye olden OS X days, the &#8220;minor version&#8221; (after the first period) acted more like the <em>major<\/em> versions of today! Still it can be done, and we will output any macOS 10.x versions, as if they are major versions like macOS 11, 12, 13, etc. Here&#8217;s <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/getSupportedMacOSVersions-SWU-EA.sh\">getSupportedMacOSVersions-SWU-EA.sh<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>#!\/bin\/sh\n: &lt;&lt;-LICENSE_BLOCK\ngetSupportedMacOSVersions-SWU-EA (Extension Attribute) - Copyright (c) 2022 Joel Bruner\nLicensed under the MIT License\nLICENSE_BLOCK\n\nfunction getSupportedMacOSVersions_SWU()( \n#getSupportedMacOSVersions_SWU - uses softwareupdate to determine compatible macOS versions for the Mac host that runs this\n\t#&#91; \"$(sw_vers -productVersion | cut -d. -f1)\" -lt 11 ] &amp;&amp; return 1\n\tif &#91; \"$(sw_vers -productVersion | cut -d. -f1)\" -lt 11 ]; then echo \"Error: macOS 11+ required\" &gt;&amp;2; return 1; fi\n\t#get full installers and strip out all other columns\n\tsoftwareupdate --list-full-installers 2&gt;\/dev\/null | awk -F 'Version: |, Size' '\/Title:\/{print $2}'\n)\n\n#get our version\nall_versions=$(getSupportedMacOSVersions_SWU)\n\n#depending on the model (2020 and under) we might still get some 10.x versions \nif grep -q ^10 &lt;&lt;&lt; \"${all_versions}\" ; then versions_10=$(awk -F. '\/^10\/{print $1\".\"$2}' &lt;&lt;&lt; \"${all_versions}\")$'\\n'; fi\n#all the other major versions\nversion_others=$(awk -F. '\/^1&#91;^0]\/{print $1}' &lt;&lt;&lt; \"${all_versions}\")\n\n#echo without double quotes to convert newlines to spaces\necho \"&lt;result&gt;\"$(sort -V &lt;&lt;&lt; \"${versions_10}${version_others}\" | uniq)\"&lt;\/result&gt;\"\n<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/SWU-EA-2017.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/SWU-EA-2017.jpg\" alt=\"\" class=\"wp-image-1332\" width=\"397\" height=\"76\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/SWU-EA-2017.jpg 558w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/SWU-EA-2017-300x57.jpg 300w\" sizes=\"auto, (max-width: 397px) 100vw, 397px\" \/><\/a><figcaption class=\"wp-element-caption\">The venerable 2017 MacBook Pro has quite a span<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Now if you wanted to make a Jamf Smart Group for those that could run macOS <code><strong>13<\/strong><\/code> you <em>wouldn&#8217;t<\/em> want to match 10.13 by accident. You <em>could<\/em> comment out the line in the script that matches versions beginning with <code>^10<\/code> or you could enclose everything in double quotes for the <code>echo<\/code> on the last line, so the newlines remained <em>or<\/em> you could use <strong>regex<\/strong> to match <code>([^.]|^)13<\/code> that is: <em>not<\/em> <code>.13<\/code> or if the hardware is so new <code>^13<\/code> is at the very beginning of the string. As 10.x capable hardware fades away such regex sorcery shouldn&#8217;t be needed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using the Apple Software Lookup Service<\/h3>\n\n\n\n<p>&#8220;What&#8217;s the <a rel=\"noreferrer noopener\" href=\"https:\/\/gdmf.apple.com\/v2\/pmv\" target=\"_blank\">Apple Software Lookup Service<\/a>?!&#8221;, you may be asking? I myself asked the <em>same<\/em> question! It&#8217;s a highly available JSON file that MDM servers can reference. If <code>softwareupdate<\/code> is acting up or hanging (and it&#8217;s been known to do so!), you have all you need in this JSON file to do a little sanity checking of <code>softwareupdate<\/code> too if you&#8217;d like. The <a href=\"https:\/\/gdmf.apple.com\/v2\/pmv\">URL<\/a> is found in the <a href=\"https:\/\/developer.apple.com\/business\/documentation\/MDM-Protocol-Reference.pdf\">Apple MDM Protocol Reference<\/a> and it contains versions, models and their compatibility. <\/p>\n\n\n\n<p>This method has <em>far fewer<\/em> patch and point versions than the <code>softwareupdate<\/code> method above and the OSes <strong>start<\/strong> with Big Sur (11). No 10.x versions are in the ASLS. There are two &#8220;sets&#8221; in ASLS, <code>PublicAssetSets<\/code>, which has only the <em>newest<\/em> release of each major version and <code>AssetSets<\/code> which has additional point releases (use the <code>-a<\/code> option for this one). <code>plutil<\/code> has quirky (IMO) rules for what it will and will not output as <code>json<\/code> but the <code>raw<\/code> output type can get around. It was introduced in Monterey and it can also be used to count array members, it&#8217;s goofy but manageable. Richard Purves has an article on that <a rel=\"noreferrer noopener\" href=\"https:\/\/richard-purves.com\/2021\/12\/10\/plutil-json-parsing-for-fun-and-profit\/\" target=\"_blank\">here<\/a>. The code is generously commented, so I won&#8217;t expound upon it too much more, here&#8217;s <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Scripts\/getSupportedMacOSVersions_ASLS.sh\">getSupportedMacOSVersions_ASLS.sh<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>#!\/bin\/sh\n: &lt;&lt;-LICENSE_BLOCK\ngetSupportedMacOSVersions_ASLS - Copyright (c) 2022 Joel Bruner\nLicensed under the MIT License...\nLICENSE_BLOCK\n\nfunction getSupportedMacOSVersions_ASLS()( \n#getSupportMacOSVersions - uses Apple Software Lookup Service to determine compatible macOS versions for the Mac host that runs this\n#  Options:\n#  &#91;-a] - to see \"all\" versions including prior point releases, otherwise only newest of each major version shown\n\n\tif &#91; \"${1}\" = \"-a\" ]; then\n\t\tsetName=\"AssetSets\"\n\telse\n\t\tsetName=\"PublicAssetSets\"\n\tfi\n\n\t#get Device ID for Apple Silicon or Board ID for Intel\n\tcase \"$(arch)\" in\n\t\t\"arm64\")\n\t\t\t#NOTE: Output on ARM is Device ID (J314cAP) but on Intel output is Model ID (MacBookPro14,3)\n\t\t\tmyID=$(ioreg -arc IOPlatformExpertDevice -d 1 | plutil -extract 0.IORegistryEntryName raw -o - -)\n\t\t;;\n\t\t\"i386\")\n\t\t\t#Intel only, Board ID (Mac-551B86E5744E2388)\n\t\t\tmyID=$(ioreg -arc IOPlatformExpertDevice -d 1 | plutil -extract 0.board-id raw -o - - | base64 -D)\n\t\t;;\n\tesac\t\n\n\t#get JSON data from \"Apple Software Lookup Service\" - https:\/\/developer.apple.com\/business\/documentation\/MDM-Protocol-Reference.pdf\n\tJSONData=$(curl -s https:\/\/gdmf.apple.com\/v2\/pmv)\n\n\t#get macOS array count\n\tarrayCount=$(plutil -extract \"${setName}.macOS\" raw -o - \/dev\/stdin &lt;&lt;&lt; \"${JSONData}\")\n\n\t#look for our device\/board ID in each array member and add to list if found\n\tfor ((i=0; i&lt;arrayCount; i++)); do\n\t\t#if found by grep in JSON (this is sufficient)\n\t\tif grep -q \\\"${myID}\\\" &lt;&lt;&lt; \"$(plutil -extract \"${setName}.macOS.${i}.SupportedDevices\" json -o - \/dev\/stdin &lt;&lt;&lt; \"${JSONData}\")\"; then\n\t\t\t#add macOS version to the list\n\t\t\tsupportedVersions+=\"${newline}$(plutil -extract \"${setName}.macOS.${i}.ProductVersion\" raw -o - \/dev\/stdin &lt;&lt;&lt; \"${JSONData}\")\"\n\t\t\t#only set for the next entry, so no trailing newlines\n\t\t\tnewline=$'\\n'\n\t\tfi\n\tdone\n\n\t#echo out the results sorted in descending order (newest on top)\n\tsort -rV &lt;&lt;&lt; \"${supportedVersions}\"\n)\n\n#pass possible \"-a\" argument\ngetSupportedMacOSVersions_ASLS \"$@\"<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/asls-list-2ways.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/asls-list-2ways.png\" alt=\"\" class=\"wp-image-1318\" width=\"270\" height=\"199\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/asls-list-2ways.png 496w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/asls-list-2ways-300x221.png 300w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/a><figcaption class=\"wp-element-caption\">PublicAssetSets (top) vs. AssetSets (bottom)<\/figcaption><\/figure>\n<\/div>\n\n\n<p>The fact that this method <em>requires<\/em> Monterey for the <code>plutil<\/code> stuff didn&#8217;t agree with me, so I made a version that uses my JSON power tool (jpt) so it will work on all earlier OSes too. It&#8217;s a tad large (88k) but still runs quite fast:  <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Scripts\/getSupportedMacOSVersions_ASLS-legacy.sh\" target=\"_blank\">getSupportedMacOSVersions_ASLS-legacy.sh<\/a><\/p>\n\n\n\n<p>Just as with the <code>softwareupdate<\/code> based function, the same can be done to reduce the output to only major versions and since it is v11 and up, a simple <code>cut<\/code> will do!<\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>#major versions only, descending, line delimited\ngetSupportedMacOSVersions_ASLS | cut -d. -f1 | uniq\n\n#major versions only ascending\necho $(getSupportedMacOSVersions_ASLS | cut -d. -f1 | sort -n | uniq)<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions_ASLS-massaged.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions_ASLS-massaged.png\" alt=\"\" class=\"wp-image-1335\" width=\"504\" height=\"98\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions_ASLS-massaged.png 866w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions_ASLS-massaged-300x59.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions_ASLS-massaged-768x151.png 768w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">ASLS Based Extension Attribute<\/h3>\n\n\n\n<p>The Apple Software Lookup Service (ASLS) JSON file itself doesn&#8217;t care what version of macOS a client is on, but the methods in <code>plutil<\/code> to work with JSON aren&#8217;t available until Monterey. So here&#8217;s the ASLS based Extension Attribute a couple ways: <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/getSupportedMacOSVersions-ASLS-EA.sh\">getSupportedMacOSVersions-ASLS-EA.sh<\/a> and <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/getSupportedMacOSVersions-ASLS-legacy-EA.sh\">getSupportedMacOSVersions-ASLS-legacy-EA.sh<\/a> both get the job done.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions-ASLS-EAs.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions-ASLS-EAs.png\" alt=\"\" class=\"wp-image-1336\" width=\"341\" height=\"68\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions-ASLS-EAs.png 584w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/getSupportedMacOSVersions-ASLS-EAs-300x60.png 300w\" sizes=\"auto, (max-width: 341px) 100vw, 341px\" \/><\/a><figcaption class=\"wp-element-caption\">Same. Same.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Bonus Methods for Determining Board ID and Device ID<\/h3>\n\n\n\n<p>The ASLS method requires either the Board ID or the Device ID and in a way that worked across all macOS versions and hardware architectures. I&#8217;ve updated <a rel=\"noreferrer noopener\" href=\"https:\/\/gist.github.com\/brunerd\/0e2aae5266ad518767bf9bbc6b24ae61\" target=\"_blank\">my gist<\/a> for that (although gists are a worse junk drawer than a bunch of scripts in a repo if only because it&#8217;s hard to get an overall listing) and here&#8217;s a few callouts for what I came up with<\/p>\n\n\n\n<pre class=\"wp-block-code language-bash\"><code>#DeviceID - ARM, UNIVERSAL - uses xmllint --xpath\nmyDeviceID=$(ioreg -arc IOPlatformExpertDevice -d 1 | plutil -extract 0.IORegistryEntryName xml1 -o - - | xmllint --xpath '\/plist\/string\/text()' - 2>\/dev\/null)\n#DeviceID - ARM, macOS 12+ only, uses plutil raw output\nmyDeviceID=$(ioreg -arc IOPlatformExpertDevice -d 1 | plutil -extract 0.IORegistryEntryName raw -o - -)\n#NOTE: Different output depending on platform! \n# ARM gets the Device ID - J314cAP\n# Intel gets the Model ID - MacBookPro14,3\n\n#Board ID - Intel ONLY, Mac-551B86E5744E2388\n#Intel, UNIVERSAL - uses xmllint --xpath\nmyBoardID=$(ioreg -arc IOPlatformExpertDevice -d 1 | plutil -extract 0.board-id xml1 -o - - | xmllint --xpath '\/plist\/data\/text()' - | base64 -D)\n#Intel, macOS 12+ only - uses plutil raw output \nmyBoardID=$(ioreg -arc IOPlatformExpertDevice -d 1 | plutil -extract 0.board-id raw -o - - | base64 -D)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping Up<\/h2>\n\n\n\n<p>This was all really an excuse to play around with the Apple Software Lookup Service JSON file, what can I say! And not just to plug <code><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/brunerd\/jpt\" target=\"_blank\">jpt<\/a><\/code> either! It was fun to use the new <code>plutil<\/code> raw type too (is fun the right word?) and &#8220;live off the land&#8221;. Be aware that the newest macOS version only appears once it&#8217;s <em>publicly released<\/em>, so keep that in mind when scoping. You can still keep scoping in Jamf via <a rel=\"noreferrer noopener\" href=\"https:\/\/community.jamf.com\/t5\/jamf-pro\/macos-ventura-hardware-compatibility-regex\/td-p\/267461\" target=\"_blank\">Model Identifier Regex<\/a> or by <a href=\"https:\/\/www.brunerd.com\/blog\/2021\/01\/27\/macos-compatibility-fun\/\" data-type=\"post\" data-id=\"932\">my older extension attribute<\/a> just keep in mind you&#8217;ll need to update them yearly. Whereas, these newer EAs based on either softwareupate (<a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/getSupportedMacOSVersions-SWU-EA.sh\">getSupportedMacOSVersions-SWU-EA.sh<\/a>) or ASLS (<a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/getSupportedMacOSVersions-ASLS-EA.sh\">getSupportedMacOSVersions-ASLS-EA.sh<\/a>, <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/getSupportedMacOSVersions-ASLS-legacy-EA.sh\">getSupportedMacOSVersions-ASLS-legacy-EA.sh)<\/a> should take care of themselves into the future. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every year Mac admins wonder which Macs will make the cut for the new MacOS. While it&#8217;s no mystery which models those are, if you&#8217;ve got Jamf you&#8217;ll be wondering how to best scope to those Macs so you can perhaps offer the upgrade in Self Service or alert the user to request a new [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1332,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,19,46,37,51,4,12],"tags":[20,47,30,34,25,24],"class_list":["post-1315","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apple","category-bash","category-jamf","category-jpt","category-json","category-os-x","category-scripting","tag-bash","tag-jamf","tag-jpt","tag-json","tag-macos","tag-shell"],"_links":{"self":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/comments?post=1315"}],"version-history":[{"count":18,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1315\/revisions"}],"predecessor-version":[{"id":1343,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1315\/revisions\/1343"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/media\/1332"}],"wp:attachment":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/media?parent=1315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/categories?post=1315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/tags?post=1315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}