06-23-2022 04:41 PM - edited 07-15-2022 12:43 PM
A while back I posted very excitedly about an update to the du binary:
https://community.jamf.com/t5/jamf-pro/gnu-new-du-binary-option-in-macos-12-monterey/td-p/252266
I forgot to post that I actually used it for something...
We pushed Druva into production earlier this year for all clients (macOS & Windows). uses Druva internally & in my opinion it is the gold standard for cloud backup: https://www.druva.com
Before doing so, however, we wanted to figure out how much data lived in everyone's home folder & the sub-folders, so, of course I made a multi-line Jamf Pro extension attribute...
#!/bin/sh
# macOS version check
if [ "$(/usr/bin/sw_vers -productVersion | /usr/bin/awk -F '.' '{print $1}')" -ge 12 ]
then
byteblk='--si'
else
byteblk='-h'
fi
# collect home folder size (collects size of dot files but excludes from display)
crntusr="$(/usr/bin/stat -f %Su /dev/console)"
dscldir="$(/usr/bin/dscl -plist . read /Users/"$crntusr" NFSHomeDirectory)"
homedir="$(/usr/libexec/PlistBuddy -c "print dsAttrTypeStandard\:NFSHomeDirectory:0" /dev/stdin <<< "$dscldir")"
homesiz="$(/usr/bin/du -d 1 "$byteblk" "$homedir" | /usr/bin/awk '!/\/\./{print}' | /usr/bin/sort -k 2)"
echo "<result>$homesiz</result>"
(ps. Why was this necessary? Because "Home Folder Size" in Settings > Computer Management - Management Framework > Inventory Collection is about as useless as betting against the Harlem Globetrotters...)
The output in Jamf looks like this:
I then used the Jamf API & a little shell fu to calculate totals (there was some additional screwing around with bc & in spreadsheets after this 😐 :
#!/bin/zsh
# set -x
# trap read debug
apiuser=''
apipswd=''
jamfurl=''
eastrng=''
echo 'Username,Users,Applications,Desktop,Documents,Downloads,Library,Movies,Music,Pictures,Public' > ~/Desktop/sizes.csv
jamfids()
{
apidata=$(/usr/bin/curl -sS -X GET -H 'accept: application/xml' -u "$apiuser:$apipswd" "$jamfurl/$1")
arrsize=$(echo "$apidata" | /usr/bin/xmllint --xpath "//size/text()" -)
for ((i=0;i<=$arrsize;i++)) { echo "$apidata" | /usr/bin/xmllint --xpath "concat(//$2[$i]/id/text(),' ')" - ; }
}
/bin/sleep 1
arr=($(jamfids computers computer))
for i in "${arr[@]}"
do
szdat=$(/usr/bin/curl -Ss -X GET -H 'Accept: application/json' -u "$apiuser:$apipswd" "$jamfurl/computers/id/$i" | /opt/homebrew/bin/jq ".[] | .extension_attributes[] | select(.name == \"$eastrng\") | .value" | /usr/bin/sed 's/"//g')
/bin/sleep 1
if [ -z "$szdat" ]
then
unset szdat
continue
else
usrnm=$(/usr/bin/curl -Ss -X GET -H 'Accept: application/json' -u "$apiuser:$apipswd" "$jamfurl/computers/id/$i" | /opt/homebrew/bin/jq '.computer.general.name' | /usr/bin/sed 's/"//g')
/bin/sleep 1
users=$(echo "$szdat" | /usr/bin/sed -n '1p' | /usr/bin/awk '{print $1}')
appls=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Applications$/{print \$1}")
dsktp=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Desktop$/{print \$1}")
dcmnt=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Documents$/{print \$1}")
dwnld=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Downloads$/{print \$1}")
libry=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Library$/{print \$1}")
movie=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Movies$/{print \$1}")
music=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Music$/{print \$1}")
pctrs=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Pictures$/{print \$1}")
publc=$(echo "$szdat" | /usr/bin/awk "/\/Users\/.*\/Public$/{print \$1}")
echo "$usrnm,$users,$appls,$dsktp,$dcmnt,$dwnld,$libry,$movie,$music,$pctrs,$publc" >> ~/Desktop/sizes.csv
unset szdat usrnm users appls dsktp dcmnt dwnld libry movie music pctrs publc
fi
done
Sample of .csv output:
Enjoy!
Posted on 06-24-2022 08:01 AM
Very nice, Thank you!
Posted on 06-27-2022 06:21 AM
Cracking, @brockwalters and thank you for sharing. I presume --si is for system international (units) then?