# MARK: check minimal macOS requirement autoload is-at-least installedOSversion=$(sw_vers -productVersion) if ! is-at-least 10.14 $installedOSversion; then printlog "Installomator requires at least macOS 10.14 Mojave." ERROR exit 98 fi # MARK: argument parsing if [[ $# -eq 0 ]]; then if [[ -z $label ]]; then # check if label is set inside script printlog "no label provided, printing labels" REQ grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort #grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort exit 0 fi elif [[ $1 == "/" ]]; then # jamf uses sends '/' as the first argument printlog "shifting arguments for Jamf" REQ shift 3 fi while [[ -n $1 ]]; do if [[ $1 =~ ".*\=.*" ]]; then # if an argument contains an = character, send it to eval printlog "setting variable from argument $1" INFO eval $1 else # assume it's a label label=$1 fi # shift to next argument shift 1 done # lowercase the label label=${label:l} # separate check for 'version' in order to print plain version number without any other information if [[ $label == "version" ]]; then echo "$VERSION" exit 0 fi # MARK: Logging log_location="/private/var/log/Installomator.log" # Check if we're in debug mode, if so then set logging to DEBUG, otherwise default to INFO # if no log level is specified. if [[ $DEBUG -ne 0 ]]; then LOGGING=DEBUG elif [[ -z $LOGGING ]]; then LOGGING=INFO datadogLoggingLevel=INFO fi # Associate logging levels with a numerical value so that we are able to identify what # should be removed. For example if the LOGGING=ERROR only printlog statements with the # level REQ and ERROR will be displayed. LOGGING=DEBUG will show all printlog statements. # If a printlog statement has no level set it's automatically assigned INFO. declare -A levels=(DEBUG 0 INFO 1 WARN 2 ERROR 3 REQ 4) # If we are able to detect an MDM URL (Jamf Pro) or another identifier for a customer/instance we grab it here, this is useful if we're centrally logging multiple MDM instances. if [[ -f /Library/Preferences/com.jamfsoftware.jamf.plist ]]; then mdmURL=$(defaults read /Library/Preferences/com.jamfsoftware.jamf.plist jss_url) elif [[ -n "$MDMProfileName" ]]; then mdmURL=$(sudo profiles show | grep -A3 "$MDMProfileName" | sed -n -e 's/^.*organization: //p') else mdmURL="Unknown" fi # Generate a session key for this run, this is useful to idenify streams when we're centrally logging. SESSION=$RANDOM # Mark: START printlog "################## Start Installomator v. $VERSION, date $VERSIONDATE" REQ printlog "################## Version: $VERSION" INFO printlog "################## Date: $VERSIONDATE" INFO printlog "################## $label" INFO # Check for DEBUG mode if [[ $DEBUG -gt 0 ]]; then printlog "DEBUG mode $DEBUG enabled." DEBUG fi # How we get version number from app if [[ -z $versionKey ]]; then versionKey="CFBundleShortVersionString" fi # get current user currentUser=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }') # MARK: check for root if [[ "$(whoami)" != "root" && "$DEBUG" -eq 0 ]]; then # not running as root cleanupAndExit 6 "not running as root, exiting" ERROR fi # check Swift Dialog presence and version DIALOG_CMD="/usr/local/bin/dialog" if [[ ! -x $DIALOG_CMD ]]; then # Swift Dialog is not installed, clear cmd file variable to ignore printlog "SwiftDialog is not installed, clear cmd file var" DIALOG_CMD_FILE="" fi # MARK: labels in case statement case $label in longversion) # print the script version printlog "Installomater: version $VERSION ($VERSIONDATE)" REQ exit 0 ;; valuesfromarguments) if [[ -z $name ]]; then printlog "need to provide 'name'" ERROR exit 1 fi if [[ -z $type ]]; then printlog "need to provide 'type'" ERROR exit 1 fi if [[ -z $downloadURL ]]; then printlog "need to provide 'downloadURL'" ERROR exit 1 fi if [[ -z $expectedTeamID ]]; then printlog "need to provide 'expectedTeamID'" ERROR exit 1 fi ;; # label descriptions start here