diff --git a/MDM/swiftdialog_example.sh b/MDM/swiftdialog_example.sh new file mode 100755 index 0000000..33088d2 --- /dev/null +++ b/MDM/swiftdialog_example.sh @@ -0,0 +1,278 @@ +#!/bin/zsh + +# runs through a list of Installomator items +# and displays status using Swift Dialog +# +# dependencies: +# - Swift Dialog: https://github.com/bartreardon/swiftDialog +# - Installomator: https://github.com/Installomator/Installomator +# this script will install both if they are not yet present + +export PATH=/usr/bin:/bin:/usr/sbin:/sbin + +# MARK: Variables + +# set to 1 to not require root and not actually do any changes +# set to 0 for production +DEBUG=1 + +# the delay to simulate an install in DEBUG mode +fakeInstallDelay=5 + +# list of Installomator labels + +items=( + "firefoxpkg|Firefox" + "googlechromepkg|Google Chrome" + ) + +# MARK: Constants + +scriptDir=$(dirname ${0:A}) +repoDir=$(dirname $scriptDir) + +if [[ $DEBUG -eq 1 ]]; then + installomator="$repoDir/utils/assemble.sh" +else + installomator="/usr/local/Installomator/Installomator.sh" +fi + +dialog="/usr/local/bin/dialog" + + +if [[ DEBUG -eq 0 ]]; then + dialog_command_file="/var/tmp/dialog.log" +else + dialog_command_file="$HOME/dialog.log" +fi + + +# MARK: Functions + +dialogUpdate() { + # $1: dialog command + local dcommand=$1 + + if [[ -n $dialog_command_file ]]; then + echo "$dcommand" >> $dialog_command_file + echo "Dialog: $dcommand" + fi +} + +dialogActivate() { + osascript -e 'tell app "Dialog" to activate' +} + +progressUpdate() { + # $1: progress text (optional) + local text=$1 + progressindex=$((progressindex + 1)) + dialogUpdate "progress: $progressindex" + echo $progressindex > $progressIndexPath + if [[ -n $text ]]; then + dialogUpdate "progresstext: $text" + fi +} + +startItem() { + local description=$1 + + echo "Starting Item: $description" + echo $description > $currentItemPath + dialogUpdate "listitem: $description: wait" + progressUpdate $description +} + +completeItem() { + local description=$1 + local itemStatus=$2 + + dialogUpdate "listitem: $description: $itemStatus" + echo "$description: $itemStatus" >> $completedItemsPath + echo "completed item $description: $itemStatus" +} + +installomator() { + # $1: label + # $2: description + local label=$1 + local description=$2 + + startItem $description + + $installomator $label \ + DIALOG_PROGRESS=main \ + DIALOG_CMD_FILE=$dialog_command_file \ + DEBUG=$DEBUG + +# if [[ $DEBUG -eq 0 ]]; then +# $installomator $label DIALOG_PROGRESS=yes DIALOG_CMD_FILE=$dialog_command_file +# else +# echo "DEBUG enabled, this would be 'Installomator $label'" +# for ((c=0; c<$fakeInstallDelay; c++ )); do +# p=$((c * 100 / fakeInstallDelay)) +# dialogUpdate "progress: $p" +# sleep 1 +# done +# fi + + completeItem $description "success" +} + +cleanupAndExit() { + # kill caffeinate process + if [[ -n $caffeinatePID ]]; then + echo "killing caffeinate..." + kill $caffeinatePID + fi + + # kill dialog process +# if [[ -n $dialogPID ]]; then +# dialogUpdate "quit:" +# kill $dialogPID +# fi + + # clean up tmp dir + if [[ -n $tmpDir && -d $tmpDir ]]; then + echo "removing tmpDir $tmpDir" + rm -rf $tmpDir + fi + + # remove dialog command file + if [[ -e $dialog_command_file ]]; then + rm $dialog_command_file + fi + + # remove completed Items file + if [[ -e $completedItemsPath ]]; then + rm $completedItemsPath + fi +} + +checkInstallomator() { + if [[ ! -e $installomator ]]; then + echo "Installomator not found at path $installomator. Installing" + + installomatorPkg="$tmpDir/Installomator.pkg" + + # download Installomator pkg + if ! downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/Installomator/Installomator/releases/latest" \ + | awk -F '"' "/browser_download_url/ && /pkg\"/ { print \$4; exit }"); then + echo "could not get Installomator download url" + exit 96 + fi + + echo "downloading Installomator from $downloadURL" + if ! curl --fail --silent -L --show-error "$downloadURL" -o $installomatorPkg; then + echo "could not download Installomator" + exit 95 + fi + + echo "verifying Installomator" + # verify pkg + if ! spctlout=$(spctl -a -vv -t install "$installomatorPkg" 2>&1 ); then + echo "Error verifying $installomatorPkg" + exit 94 + fi + teamID=$(echo $spctlout | awk -F '(' '/origin=/ {print $2 }' | tr -d '()' ) + if [ "JME5BW3F3R" != "$teamID" ]; then + echo "Team IDs do not match!" + exit 93 + fi + # Install pkg + + echo "Installing Installomator" + if [[ DEBUG -eq 0 ]]; then + installer -pkg $installomatorPkg -tgt / -verbose + + # check if Installomator is correctly installed + if [[ ! -x $installomator ]]; then + echo "failed to install Installomator" + exit 92 + fi + else + echo "DEBUG enabled, skipping Installomator install" + fi + else + # update installomator + installomator installomator + fi +} + + +# MARK: sanity checks + +# check minimal macOS requirement +if [[ $(sw_vers -buildVersion ) < "20" ]]; then + echo "This script requires at least macOS 11 Big Sur." + exit 98 +fi + +# check we are running as root +if [[ $DEBUG -eq 0 && $(id -u) -ne 0 ]]; then + echo "This script should be run as root" + exit 97 +fi + + +# MARK: Setup + + +# No sleeping +caffeinate -dimsu & caffeinatePID=$! + +# trap exit for cleanup +trap cleanupAndExit EXIT + +# get a temp +tmpDir=$(mktemp -d) + +completedItemsPath=$tmpDir/completedItems.txt +currentItemPath=$tmpDir/currentItem.txt +progressIndexPath=$tmpDir/progressIndexPath.txt + +# setup first list +itemCount=${#items} +progressCount=$((item + 2)) +progressindex=0 + +listitems=( "--listitem" "Configure Tools" ) + +for item in $items; do + label=$(cut -d '|' -f 1 <<< $item) + description=$(cut -d '|' -f 2 <<< $item) + listitems+=( "--listitem" ${description} ) +done + +# download and install Installomator +startItem "Configure Tools" +checkInstallomator + +# download and install Swift Dialog +echo "installing Swift Dialog" +installomator swiftdialog + +# display first screen +$dialog --title "Configuring your Mac" \ + --icon "SF=gear" \ + --message "Setting up some more things..." \ + --progress 100 \ + "${listitems[@]}" \ + --button1disabled \ + --big \ + --ontop \ + --liststyle compact \ + --messagefont size=16 \ + --commandfile $dialog_command_file & dialogPID=$! +sleep 0.1 +dialogActivate + +completeItem "Configure Tools" "success" + +for item in $items; do + label=$(cut -d '|' -f 1 <<< $item) + description=$(cut -d '|' -f 2 <<< $item) + installomator $label $description +done + +dialogUpdate "quit:"