Skip to content

Script Examples

Simone Martorelli edited this page Mar 25, 2021 · 7 revisions

While the Mac@IBM Notifications app can be run without administrative permissions, any framework that executes scripts outside of the user context will require that you capture and impersonate that user to display the popup.

Below are two script examples of a Pop-up Dialog box that can be run either locally or through an MDM script delivery framework like Jamf. The additional examples that follow are intended to be executed locally for testing purposes.

Pop-up Dialog box (1 or 2 Buttons)

Shell

#!/bin/bash

# Required for executing a popup to the user space via an MDM depoloyment
CURRENTUSER=$(ls -l /dev/console | awk '{print $3}')

# Mac@IBM Notifications binary paths
NA_PATH="/Applications/Mac@IBM Notifications.app/Contents/MacOS/Mac@IBM Notifications"

# Variables for the popup notification for ease of customization
WINDOWTYPE="popup"
BAR_TITLE="My Organization's Notification"
TITLE="Enter App Specific Title Here"
TIMEOUT="" # leave empty for no notification time
BUTTON_1="OK"
BUTTON_2="Cancel"
SUBTITLE="Enter popup information here. \n\nThis can be whatever you want."

### FUNCTIONS ###

prompt_user() {
    # This will call the Mac@IBM Notification Agent
    # USAGE: prompt_user "1" for two buttons, otherwise just the function for one
    if [[ "${#1}" -ge 1 ]]; then
        sec_button=("-secondary_button_label" "${BUTTON_2}")
    fi

    button=$(sudo -u "${CURRENTUSER}" \
        "${NA_PATH}" \
        -type "${WINDOWTYPE}" \
        -bar_title "${BAR_TITLE}" \
        -title "${TITLE}" \
        -subtitle "${SUBTITLE}" \
        -timeout "${TIMEOUT}" \
        -main_button_label "${BUTTON_1}" \
        "${sec_button[@]}" \
        -always_on_top)

    echo "$?"
}

### END FUNCTIONS ###

# Example 1 button prompt
RESPONSE=$(prompt_user)
echo "$RESPONSE"

# Example 2 button prompt
RESPONSE=$(prompt_user "1")
echo "$RESPONSE"

Python

#!/usr/bin/env python2.7

# Put the rest of your python libraries below this list if required
import subprocess
from SystemConfiguration import SCDynamicStoreCopyConsoleUser

# Mac@IBM Notifications binary paths
NA_PATH = '/Applications/Mac@IBM Notifications.app/Contents/MacOS/Mac@IBM Notifications'

# Variables for the popup notification for ease of customization
WINDOWTYPE = 'popup'
BAR_TITLE = "My Organization's Notification"
TITLE = 'Enter App Specific Title Here'
TIMEOUT = '' # leave empty for no notification time
BUTTON_1 = 'OK'
BUTTON_2 = 'Cancel'
SUBTITLE = 'Enter popup information here. \n\nThis can be whatever you want.'

'''### FUNCTIONS ###'''

def get_user():
    '''Gets the logged in username'''
    username = (SCDynamicStoreCopyConsoleUser(None, None, None) or [None])[0]
    username = ('' if username in [u'loginwindow', None, u''] else username)
    if not username:
        username = 'Error: unable to get username'
    return username

def prompt_user(two_button):
    '''This will call the Mac@IBM Notification Agent
       USAGE: prompt_user('1') for two buttons, otherwise just prompt_user('') for one'''
    nota = ['sudo', '-u', CURRENTUSER, NA_PATH,
                '-type', WINDOWTYPE,
                '-bar_title', BAR_TITLE,
                '-title', TITLE,
                '-subtitle', SUBTITLE,
                '-timeout', TIMEOUT,
                '-main_button_label', BUTTON_1,
                '-always_on_top']

    if two_button <> '':
        sec_button = ['-secondary_button_label', BUTTON_2]
        temp_list = nota[:len(nota) - 1] + sec_button + nota[len(nota) - 1:]
        nota = temp_list

    proc = subprocess.Popen(nota, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    proc.communicate()[0]
    return proc.returncode

'''### END FUNCTIONS ###'''


if __name__ == "__main__":
    # Needs to be executed prior to generating popups to gather local username
    CURRENTUSER = get_user()

    if CURRENTUSER == 'Error: unable to get username':
        print CURRENTUSER
        sys.exit(1)

    # Example 1 button prompt
    BUT_RESP = prompt_user('')
    print BUT_RESP

    # Example 2 button prompt
    BUT_RESP = prompt_user('1')
    print BUT_RESP

Custom Pop-up Dialog Box with Embedded Picture

Shell

#!/bin/bash
# Deploy an encoded jpg within the script to be used within a dialog popup

# Mac@IBM Notifications binary paths
NA_PATH="/Applications/Mac@IBM Notifications.app/Contents/MacOS/Mac@IBM Notifications"

# Variables for the popup notification for ease of customization
WINDOWTYPE="popup"
BAR_TITLE="My Organization's Notification"
TITLE="Enter App Specific Title Here"
TIMEOUT="" # leave empty for no notification time
BUTTON_1="OK"
BUTTON_2="Cancel"
SUBTITLE="Enter popup information here. \n\nThis can be whatever you want."

# Base64 encoded picture, can be replaced with a static location in -accessory_view_payload
# The benefit here is that a custom picture can be distributed with a script without requiring a separate
# payload to deliver it if it is not accessible via network path
PU_PIC="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AAMAAAACZmYAAwAAAAJmZgAAAAIzMzQAAAAAAjMzNAAAAAACMzM0AP/AABEIAR8BLQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2wBDABwcHBwcHDAcHDBEMDAwRFxEREREXHRcXFxcXHSMdHR0dHR0jIyMjIyMjIyoqKioqKjExMTExNzc3Nzc3Nzc3Nz/2wBDASIkJDg0OGA0NGDmnICc5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ub/3QAEABP/2gAMAwEAAhEDEQA/AMOiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9DDooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Rw6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoqdYHYZJoa3YDIwanmRp7Kdr2IKKKKozCiiigAooooAKKKKAP//Sw6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAFFWbdAwLGqtXLc/KfrUz2NqCTnqTkqoy1Irq43CoZIS7ZzxUyIEGBWOh3JyctdircKFfI71Xqadgz8dqhreOx59W3NoFFFFMzCiiigAooooA//08OiiigAooooAKKKKAQoBJwKCCDg0+P/AFi/WnT8SGlfWxaj7vMQ0UUUyAooooAKKKKACiiigAoopQCelA0r7CUUUUCCiiigAooooAKKKKACno5jORTKKGhxbWqLouEPJGDUTzkjCiq9FTyI1debVgoooqjEKKKKACiiigAooooA/9TDooooAKKKKACiiigCSL/WCnXH+spsf+sFPuP9ZUP4jZfw36kFFFFWYhRRRQAUUUUAFFFFABVq26saq1aturfhUSNqPxld/vn602nyffb60yqWxnJasKKKKZIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//1cOiiigAooooAKKKKAHKcMDVi5HIb1qr05q5J88QNRLdG8PgcSnRRRVmAUUUUAFFFFABRRRQAVbtup/CqlWbbjP4VEtjah8ZFIMO1R1NOMSmoapbET3YUUUUyAooooAKKKKACiiigAoqaGMSE7uwqIjBIHalcpwaVxKKKKZIUUUUAFFFFABRRRQB/9bDooooAKKKKACiiigAq5F80RFU6sW5+YrUz2ubUH71iueOKKklG2Qio6a1RlJWbQUUUUxBRRRQAUUUUAFT25+fb6ioKfGdrg0pbF03aSZLcD5gfWq9XbgZTPof0qlSgaV42mFFFFUYBRRRQAUUUUAFFFFAFq26tVd/vN9as238X4VXf77fU1C+JnRP+GhlFFFWc4UUUUAFFFFABRRRQB//18OiiigAooooAKKKKACpIzhxUdTQAF/mpS2Lh8SJZomd8rUf2eSrpOMkmoTcIOnNZKTex2TpQTvJkH2eSk8iQVL9pHpR9p9qq8jJxpdyLyZKTyX9Kl+0+1H2k+lF5By0u5F5L+lHkv6GpftJ9KT7QfQUXkJxpERicc4NR8jkdqsG4YjAwKrk5/GrV3uZSUF8Jogb4xnuKzqu27ZQj0qvMu2Qiojo7G1b3oqRFRRRWhyhRRRQAUUUUAFFFFAFu1/i+tV5Pvt9as23f61Wk++frUL4mdE/4aGUUUVZzhRRRQAUUUUAFFFFAH//0MOiiigAooooAKKKKACjntRQKBouxHzIiD1qmRg1Ytm5K1FKNrkVnHRm89YKRHRRRWhzhRRRQAUUUUAFFFFAFi2OH2+tOuR0aoIztcGrkwzGfbms38R10/eptFCiiitDkCiiigAooooAKKKKALlt0b61Wk++as23RvrVaT75rNfEzpn/AA0MooorQ5gooooAKKKKACiiigD/0cOiiigAooooAKKKKACiiigCSI7XBqW5HzA1XBwc1cl+aMGoejOiGsGilRRRVnOFFFFABRRRQAUUUUAFaXDp9RWbV+E5jHtWc0dWGerRRNJUkow5FR1aehzyVmwooopkhRRRQAUd6KKALlt90/Wq8v8ArDVi2+6frVeX/WNWa+JnVU/hIjooorQ5QooooAKKKKACiiigD//Sw6KKKACiiigAooooAKKKKACry/ND+FUau25ypBqJnRh92il2opWGCR70lUmYS3sFFFFMQUUUUAFFFFABV23+5+NUquW/3D9aipsdGH+Mhn/1hqGprj/WmoaqOxlU+JhRRRTICiiigAooooAuW/3DVeX/AFjVZt/uGq0v+sas18TOqf8ACRHRRRWhyhRRRQAUUUUAFFFFAH//08OiiigAooooAKKKKACiiigAqzbH5iKrVNAcSVMtjWi7SQkww5qKrFwPnzVenHYVRWkwooopmYUUUUAFFFFABVu2PDD3qpVi3PzEetRLY2oO00NuP9aahqe4/wBYagqo7E1PiYUUUUzMKKKKACiiigC7b/cNVpf9Y1WLb7h+tV5v9Y1Zx+JnVP8AhIjooorQ5QooooAKKKKACiiigD//1MOiiigAooooAKKKKACiiigAqSLhwajpQcEGk9hxdmmWLjqKrVNNIJCCB0qGlHY0qu8m0FFFFUZBRRRQAUUUUAFORijbhTaKBp2d0PkcyNuNMooo2Bu+rCiiigQUUUUAFFFFAFy3+4frUE3+tJpYpfLG0jIqNm3MTUJe8dE5p00htFFFWc4UUUUAFFFFABRRRQB//9XDooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Ww6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/18OiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9DDooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z"

IMAGE="data:image/jpeg;base64,${PU_PIC}"


# Draw the pop-up with custom embedded picture
RESPONSE=$("${NA_PATH}" \
    -type "${WINDOWTYPE}" \
    -bar_title "${BAR_TITLE}" \
    -title "${TITLE}" \
    -subtitle "${SUBTITLE}" \
    -timeout "${TIMEOUT}" \
    -main_button_label "${BUTTON_1}" \
    -secondary_button_label "${BUTTON_2}" \
    -accessory_view_type "image" \
    -accessory_view_payload "$IMAGE" \
    -always_on_top)


Progress Bar with Cancel button

Shell


#!/bin/bash

RAND_QUOTE=("Making Things Faster" "Adding Sparkles" "Reticulating Splines" "Thowing Wrenches" \
"rm -rf'ing Directories" "Lorem Ipsumming" "Agitating Employees" "Eating Doughnuts")
PIPE_NAME="pbnota"
COUNTER=0

# FIFO creation and setup process for updating the progress bar
find /private/tmp -name "$PIPE_NAME" -delete
mkfifo /private/tmp/${PIPE_NAME}
exec 3<> /private/tmp/${PIPE_NAME}

# Mac@IBM Notifications Progress Bar configuration
"/Applications/Mac@IBM Notifications.app/Contents/MacOS/Mac@IBM Notifications" \
-type "popup" \
-title "Test Progress Bar" \
-subtitle "You should see some progress here" \
-accessory_view_type "progressbar" \
-accessory_view_payload "/percent 0 /user_interruption_allowed True" \
-main_button_label "OK" < /private/tmp/${PIPE_NAME} &

PB_PS=$(pgrep "Mac@IBM Notifications")
echo "$PB_PS"

# In this example we are doing a 5 digit increment up to 100 and updating the progress bar messages with a
# random selection from our quote array defined above. In real world usage your update commands would run
# in the until block and update your progress percentage and description accordingly.
until [[ "$COUNTER" -ge 100 ]]; do
    if [[ $(pgrep -q "Mac@IBM Notifications"; echo $?) -ne 0 ]]; then
        # Cancel initiated, roll back changes and break the until loop here
        CANCEL=1
        echo "Rolling back"
        break
    fi
    COUNTER=$((COUNTER + 5))
    QUOTE_NBR=$(jot -r 1 0 7)
    echo -n "/percent $COUNTER /top_message ${RAND_QUOTE[$QUOTE_NBR]} /bottom_message ${COUNTER}% completed" >&3
    sleep 1
done

wait "$PB_PS"

# Clean up the progress bar after completion or early exit
exec 3>&-
find /private/tmp -name ${PIPE_NAME} -delete

if [[ "$CANCEL" -eq 1 ]]; then
    echo "Progress bar terminated early"
else
    echo "Progress bar completed successfully"
fi
Clone this wiki locally