Skip to main content

Hey Guys,

no real Question but i saw some similar posts and questions or request for something like "$sbuject_title" ..

I want to share my solution for this scenario and perhaps some of you has an idea to optimize it:
User got new mac and wants to transfer all Static Groups from the old to the new mac.
I provide this script as policy in Self Service:

#!/bin/zsh



#region - Prerequisites
################################################################################################################################################################################################
## Create tmp location
# Define the path for the temporary folder
TMP_DIR="/Users/Shared/tmp"

# Check if the folder already exists
if [ -d "$TMP_DIR" ]; then
echo "The folder $TMP_DIR already exists."
else
# Create the folder
mkdir -p "$TMP_DIR"

# Check if the creation was successful
if [ $? -eq 0 ]; then
echo "The temporary folder has been successfully created at $TMP_DIR."

# Set permissions (optional)
chmod 755 "$TMP_DIR"
echo "Permissions have been set to 755."
else
echo "Error: The folder could not be created."
exit 1
fi
fi

# Variable for tmp files
txt_tmp=/Users/Shared/tmp/inventory_details.txt
txt_tmp2=/Users/Shared/tmp/static_groups.txt
GROUP_ID_FILE=/Users/Shared/tmp/static_groups_ID.txt


# API login
bearerToken=""
url=<X>
client_id="X"
client_secret="X"

# Create Token
token=$(curl --location --request POST "$url/api/oauth/token" \\
--header "Content-Type: application/x-www-form-urlencoded" \\
--data-urlencode "client_id=$client_id" \\
--data-urlencode "grant_type=client_credentials" \\
--data-urlencode "client_name=Test" \\
--data-urlencode "client_secret=$client_secret")


# Catch Token
bearerToken=$(echo "$token" | plutil -extract access_token raw -)

#endregion################################################################################################################################################################################################


#region - Getting Static Groups from old MacBook
################################################################################################################################################################################################

# Get the serial number using Dialog
read -r -d '' applescriptCode <<'EOF'
set dialogText to text returned of (display dialog "Bitte trage die alte MacBook-Seriennummer ein." default answer "no input")
return dialogText
EOF

serial_number=$(osascript -e "$applescriptCode");

# Prepend "MC-" to the serial number
computerName="MC-$serial_number"

# Get Jamf Computer ID from Serial Number
deviceID=$(curl -s -H "Accept: text/xml" -H "Authorization: Bearer ${bearerToken}" ${url}/JSSResource/computers/name/"$computerName" | xmllint --xpath '/computer/general/id/text()' -)

# Inventory Collection from Computer
inventory_details=$(curl -s -H "Accept: application/json" -H "Authorization: Bearer ${bearerToken}" "${url}/api/v1/computers-inventory-detail/$deviceID" -X GET)
echo "$inventory_details" >> $txt_tmp

# Use grep to delete everything except 2 Lines with: "smartGroup" : false
grep -B 2 '"smartGroup" : false' $txt_tmp > $txt_tmp2

# cutting only Group IDs and writing into txt file
awk -F'"' '/"groupId" 😕 {print $4}' $txt_tmp2 > $GROUP_ID_FILE
#endregion################################################################################################################################################################################################


#region - Put new MacBook into Static Groups
################################################################################################################################################################################################

## Function to add computer to a static group
add_to_group() {

xml_data="<computer_group>
<id>$group_id</id>
<computer_additions>
<computer>
<id>$computer_id</id>
</computer>
</computer_additions>
</computer_group>"

response=$(curl -s -w "%{http_code}" -o /dev/null \\
-X PUT \\
-H "Authorization: Bearer $bearerToken" \\
-H "Content-Type: application/xml" \\
-d "$xml_data" \\
"$url/JSSResource/computergroups/id/$group_id")

if [ "$response" = "201" ]; then
echo "Successfully added computer $computer_id to group $group_id"
else
echo "Failed to add computer $computer_id to group $group_id. HTTP response: $response"
fi
}

## Details new MacBook

# Get new MacBook-Name
read -r -d '' applescriptCode <<'EOF'
set dialogText to text returned of (display dialog "Bitte trage die neue MacBook-Seriennummer ein." default answer "no input")
return dialogText
EOF

serialNumber_new=$(osascript -e "$applescriptCode");
computerName_new="MC-$serialNumber_new"

# Get Jamf Computer ID from Serial Number
computer_id=$(curl -s -H "Accept: text/xml" -H "Authorization: Bearer ${bearerToken}" ${url}/JSSResource/computers/name/"$computerName_new" | xmllint --xpath '/computer/general/id/text()' -)

# Check if the group ID file exists
if [ ! -f "$GROUP_ID_FILE" ]; then
echo "Error: Group ID file not found at $GROUP_ID_FILE"
exit 1
fi

# Read group IDs from the file and add computer to each group
while IFS= read -r group_id || [[ -n "$group_id" ]]; do
# Trim whitespace
group_id=$(echo "$group_id" | tr -d '[:space:]')

if [[ -n "$group_id" ]]; then
echo "Adding computer $computer_id to group $group_id"
add_to_group "$computer_id" "$group_id"
fi
done < "$GROUP_ID_FILE"

echo "Software Gruppen wurden auf neuem MacBook $computerName_new übertragen"
#endregion################################################################################################################################################################################################




#region - cleanup tmp files and folder
################################################################################################################################################################################################
# rm $txt_tmp
# rm $txt_tmp2
# rm /Users/Shared/tmp
#endregion################################################################################################################################################################################################

Next Step is build a lovely Swift Dialog UI to glow it up!
If you have some Input feel free to share it! 

Be the first to reply!

Reply