Huntress Agent (Install) - MAC
Summary
This task will first check if Huntress is installed. If it is not, the script will attempt to install the agent and log the result for MAC machines.
Note: Huntress Agent requires macOS 13.0.0 or later.
Create Script
- Go to
Automation>Tasks - At the top-right corner, click on the
Adddropdown menu and selectScript Editor
Task Details:
- Name: Huntress Agent (Install) - MAC
- Description: This task will check if Huntress is installed. If not, it will attempt to install the agent and log the result for MAC machines.
- Category: Custom
Script
Row 1 Function: Set Pre-defined Variable
-
Select
Set Pre-Defined VariableFunction
-
Select
Custom Field -
Input
acctKeyas Variable name -
Select
Huntress Acct_Keyor (Huntress Account Key) custom field from the dropdown -
Click
Save
Row 2 Function: Set Pre-defined Variable
-
Select
Set Pre-Defined VariableFunction
-
Select
Custom Field -
Input
orgKeyas Variable name -
Select
Huntress Org_Keycustom field from the dropdown -
Click
Save
Row 3 Function: Set Pre-defined Variable
-
Select
Set Pre-Defined VariableFunction
-
Select
Custom Field -
Input
tagsas Variable name -
Select
Huntress Tagcustom field from the dropdown -
Click
Save
Row 4 Function: Script Log
Input the following:
The script will detect the Huntress Agent and if the agent is not found then it will install the agent.
acct_key : @acctKey@
org_key: @orgKey@
Tags: @tags@
Attempting to download the file using acct_key from the huntress website as below:
https://huntress.io/script/darwin/@acctKey@, and once downloaded the agent will be attempted to install.
Row 5 Function: Bash Script
Paste the following PowerShell script and set the expected script execution time to 900 seconds. Set this step to Continue on Failure
#!/bin/bash
# Variables
organization_key="@orgKey@"
tags="@tags@"
account_key="@acctKey@"
install_script="/tmp/HuntressMacInstall.sh"
# Clean up any old installer scripts.
if [ -f "$install_script" ]
then
echo "Installer file present in /tmp; deleting."
rm -f "$install_script"
fi
# Write the Huntress installation script
# Usually downloaded from "https://huntress.io/script/darwin/$account_key"
# Writing it instead because downloaded file is not running the download command silently
# CW RMM script fails if the curl command returns any output
cat >"$install_script"<<'EOF'
#!/bin/bash
declare account_key
declare organization_key
declare tags
declare api_url
declare eetee_url
declare allow_http=false
declare verbose=0
declare interactive=1
declare install_system_extension=0
declare -a ARGS
declare portal_url="https://huntress.io"
declare package_file=
ARGS=()
usage() {
cat <<USAGE
Usage: $0 [options...] --account_key <account_key> --organization_key <organization_key>
-a, --account_key <account_key> The account key to use for this agent install
-o, --organization_key <organization_key> The org key to use for this agent install
-t, --tags <tags> A comma-separated list of agent tags
-v, --verbose Print info during install
--batch_only Do not prompt the user for missing info
--install_system_extension Install system extension (will prompt user to approve)
-h, --help Print this message
USAGE
}
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-a|--account_key)
account_key="$2"
shift
shift
;;
--batch_only)
interactive=0
shift
;;
-o|--organization_key)
organization_key="$2"
shift
shift
;;
-t|--tags)
tags="$2"
shift
shift
;;
--install_system_extension)
install_system_extension=1
shift
;;
-v|--verbose)
verbose=1
shift
;;
-h|--help)
usage
exit
;;
# these are more or less hidden options. Only used for debugging
-f|--package-file)
package_file="$2"
shift
shift
;;
-p|--portal_url|--portal-url)
portal_url="$2"
shift
shift
;;
-u|--api_url|--api-url)
api_url="$2"
allow_http=true
shift
shift
;;
--eetee_url|--eetee-url)
eetee_url="$2"
allow_http=true
shift
shift
;;
*)
ARGS+=($1)
shift
;;
esac
done
set -- "${ARGS[@]}"
# ask the user for the account key if not passed in and we are
# "interactive" (see --batch_only)
if [[ -z $account_key && $interactive -eq 1 ]]
then
echo -n "Account Key: "
read account_key
fi
# ask the user for the organization key if not passed in and we are
# "interactive" (see --batch_only)
if [[ -z $organization_key && $interactive -eq 1 ]]
then
echo -n "Organization Key: "
read organization_key
fi
# account key and organization key are required
if [[ -z $account_key || -z $organization_key ]]
then
echo Error: --account_key and --organization_key are both required
echo
usage
exit 1
fi
declare installer_config="/tmp/hagent.yaml"
[[ $verbose -eq 1 ]] && echo creating "$installer_config"...
# create the hagent.yaml file used by the postinstall script to build
# the AgentConfig.plist file
cat >"$installer_config" <<CONFIG
account_key: $account_key
organization_key: $organization_key
api_url: $api_url
allow_http: $allow_http
install_system_extension: $install_system_extension
tags: $tags
CONFIG
if [ -n "$eetee_url" ]; then
echo "eetee_url: $eetee_url" >>"$installer_config"
fi
huntress_pkg=/tmp/HuntressAgent.pkg
if [ -n "$package_file" ]; then
if [ -f "$package_file" ]; then
cp -f "$package_file" "$huntress_pkg"
else
echo "$package_file" was not found
exit 1
fi
else
# download the HuntressAgent.pkg file from S3
status_code=$(curl -f -L -o "$huntress_pkg" -w %{http_code} "$portal_url/download/darwin/$account_key" --silent)
if [ $? != 0 ]; then
if [ "$status_code" = "400" ]; then
echo "Account Key not valid."
elif [ "$status_code" = "404" ]; then
echo "File not found on S3."
elif [ "$status_code" = "409" ]; then
echo "The macOS Beta has not been enabled for this account."
fi
exit 1
elif ! [ -f "$huntress_pkg" ]; then
echo "File download failed."
exit 1
fi
fi
[[ $verbose -eq 1 ]] && echo running the installer...
# run the install
installer -pkg "$huntress_pkg" -target / || echo "Installation failed."
[[ $verbose -eq 1 ]] && echo cleaning up...
rm "$installer_config"
rm "$huntress_pkg"
EOF
if [ ! -f "$install_script" ]
then
echo "Failed to download the installer script."
exit 1
else
echo "Downloaded the installer script."
fi
# Execute the installation script
chmod +x "$install_script"
if [ -z "$tags" ]
then
/bin/bash "$install_script" --account_key "$account_key" --organization_key "$organization_key" --verbose
else
/bin/bash "$install_script" --account_key "$account_key" --organization_key "$organization_key" -tags "$tags" -verbose
fi
# Revalidate if Huntress is installed
if [ -d "/Applications/Huntress.app" ]
then
echo "Huntress agent is installed successfully."
exit 0
else
echo "Failed to install Huntress."
exit 1
fi

Step 6 Function: Script Log
- Add a new row by clicking the
Add Rowbutton - Search and select the
Script Logfunction. - Input the following:
%Output%
Step 7 Logic: If/Then
- Add a new
If/Thenlogic from theAdd Logicdropdown menu.
Row 7a Condition: Output Contains
- Type
Huntress agent is installedin the Value box.
Row 7b Function: Set Custom Field
-
Add a new row in the
IfSection by clicking theAdd Rowbutton -
Search and select the
Set Custom Fieldfunction.
-
Search and select the
Huntress Deploy_ResultCustom Field. -
Type
Successfully Installedin theValuebox and click the Save button.
Row 7c Function: Script Exit
-
Add a new row in the
IfSection by clicking theAdd Rowbutton -
Search and select the
Script Exitfunction. -
Leave the value blank to allow the script to exit on success.
Step 8 Function: Script Exit
- Add a new row after the
If/ThenSection by clicking theAdd Rowbutton - Search and select the
Script Logfunction. - Input the following:
Huntress Agent failed to install. Refer to the logs: %Output%
Completed Script

Script Deployment
This task must be scheduled on Deploy Huntress - MAC, the group for auto-deployment. The script can also be run manually if required.
- Go to
Automations>Tasks. - Search for
Huntress Agent (Install) - MAC. - Then click on Schedule and select the Target:

Select the group "Deploy Huntress - MAC" and save the selection.

Once selected, click on Run to schedule the script as per requirement.
Output
- Script log