Skip to main content
Question

SwiftDialog Script to view / email logs


Forum|alt.badge.img+9

Created a simple log viewer that the end users can run and optionally email log contents.  Nothing fancy, but might come in handy...

#!/bin/zsh # # Log Viewer # # Created by: Scott Kendall # Created on: 01/29/25 # Last Modified: 01/29/25 # # Expected Parmaters # # Parm #4 - Full Path of Log to view # Parm #5 - Window Title # Parm #6 - Length of log to display or email (tail -n) ###################################################################################################### # # Gobal "Common" variables (do not change these!) # ###################################################################################################### export PATH=/usr/bin:/bin:/usr/sbin:/sbin LOGGED_IN_USER=$( scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ && ! /loginwindow/ { print $3 }' ) USER_DIR=$( dscl . -read /Users/${LOGGED_IN_USER} NFSHomeDirectory | awk '{ print $2 }' ) OS_PLATFORM=$(/usr/bin/uname -p) [[ "$OS_PLATFORM" == 'i386' ]] && HWtype="SPHardwareDataType.0.cpu_type" || HWtype="SPHardwareDataType.0.chip_type" SYSTEM_PROFILER_BLOB=$( /usr/sbin/system_profiler -json 'SPHardwareDataType') MAC_SERIAL_NUMBER=$( echo $SYSTEM_PROFILER_BLOB | /usr/bin/plutil -extract 'SPHardwareDataType.0.serial_number' 'raw' -) MAC_CPU=$( echo $SYSTEM_PROFILER_BLOB | /usr/bin/plutil -extract "${HWtype}" 'raw' -) MAC_HADWARE_CLASS=$( echo $SYSTEM_PROFILER_BLOB | /usr/bin/plutil -extract 'SPHardwareDataType.0.machine_name' 'raw' -) MAC_RAM=$( echo $SYSTEM_PROFILER_BLOB | /usr/bin/plutil -extract 'SPHardwareDataType.0.physical_memory' 'raw' -) FREE_DISK_SPACE=$(($( /usr/sbin/diskutil info / | /usr/bin/grep "Free Space" | /usr/bin/awk '{print $6}' | /usr/bin/cut -c 2- ) / 1024 / 1024 / 1024 )) MACOS_VERSION=$( sw_vers -productVersion | xargs) SW_DIALOG="/usr/local/bin/dialog" # # Set default vales if not passed # LOG_TO_VIEW=${4:-"/var/log/system.log"} LOG_WINDOW_TITLE=${5:-"System Log"} LOG_LENGTH=${6:-100} ################################################### # # App Specfic variables (Feel free to change these) # ################################################### SUPPORT_DIR="<your support directory>" LOG_DIR="${SUPPORT_DIR}/logs" LOG_FILE="${LOG_DIR}/AppDelete.log" LOG_STAMP=$(echo $(/bin/date +%Y%m%d)) SD_BANNER_IMAGE="${SUPPORT_DIR}/SupportFiles/GE_SD_BannerImage.png" ICON_FILES="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/" MAIL_ICON="${ICON_FILES}InternetLocation.icns" OVERLAY_ICON="${ICON_FILES}AllMyFiles.icns" TMP_FILE_STORAGE=$(mktemp /var/tmp/ClearBrowserCache.XXXXX) BANNER_TEXT_PADDING=" " SD_INFO_BOX_MSG="" SD_WINDOW_TITLE="${BANNER_TEXT_PADDING}View ${LOG_WINDOW_TITLE}" # Swift Dialog version requirements [[ -e "${SW_DIALOG}" ]] && SD_VERSION=$( ${SW_DIALOG} --version) || SD_VERSION="0.0.0" MIN_SD_REQUIRED_VERSION="2.3.3" DIALOG_INSTALL_POLICY="install_SwiftDialog" SUPPORT_FILE_INSTALL_POLICY="install_SymFiles" #################################################################################################### # # Functions # #################################################################################################### function create_log_directory () { # Ensure that the log directory and the log files exist. If they # do not then create them and set the permissions. # # RETURN: None # If the log directory doesnt exist - create it and set the permissions [[ ! -d "${LOG_DIR}" ]] && /bin/mkdir -p "${LOG_DIR}" /bin/chmod 755 "${LOG_DIR}" # If the log file does not exist - create it and set the permissions [[ ! -f "${LOG_FILE}" ]] && /usr/bin/touch "${LOG_FILE}" /bin/chmod 644 "${LOG_FILE}" } function logMe () { # Basic two pronged logging function that will log like this: # # 20231204 12:00:00: Some message here # # This function logs both to STDOUT/STDERR and a file # The log file is set by the $LOG_FILE variable. # # RETURN: None echo "${1}" 1>&2 echo "$(/bin/date '+%Y-%m-%d %H:%M:%S'): ${1}" | tee -a "${LOG_FILE}" } function check_swift_dialog_install () { # Check to make sure that Swift Dialog is installed and functioning correctly # Will install process if missing or corrupted # # RETURN: None logMe "Ensuring that swiftDialog version is installed..." if [[ ! -x "${SW_DIALOG}" ]]; then logMe "Swift Dialog is missing or corrupted - Installing from JAMF" install_swift_dialog SD_VERSION=$( ${SW_DIALOG} --version) fi if ! is-at-least "${MIN_SD_REQUIRED_VERSION}" "${SD_VERSION}"; then logMe "Swift Dialog is outdated - Installing version '${MIN_SD_REQUIRED_VERSION}' from JAMF..." install_swift_dialog else logMe "Swift Dialog is currently running: ${SD_VERSION}" fi } function install_swift_dialog () { # Install Swift dialog From JAMF # PARMS Expected: DIALOG_INSTALL_POLICY - policy trigger from JAMF # # RETURN: None /usr/local/bin/jamf policy -trigger ${DIALOG_INSTALL_POLICY} } function check_support_files () { [[ -x "${SD_BANNER_IMAGE}" ]] && /usr/local/bin/jamf policy -trigger ${SUPPORT_FILE_INSTALL_POLICY} } function create_infobox_message() { ################################ # # Swift Dialog InfoBox message construct # ################################ SD_INFO_BOX_MSG="## System Info ##\\n" SD_INFO_BOX_MSG+="${MAC_CPU}<br>" SD_INFO_BOX_MSG+="${MAC_SERIAL_NUMBER}<br>" SD_INFO_BOX_MSG+="${MAC_RAM} RAM<br>" SD_INFO_BOX_MSG+="${FREE_DISK_SPACE}GB Available<br>" SD_INFO_BOX_MSG+="macOS ${MACOS_VERSION}<br>" } function import_log_contents () { tail -${LOG_LENGTH} "${LOG_TO_VIEW}" > "${TMP_FILE_STORAGE}" tempmsg="" while IFS= read -r item; do tempmsg+="$item<br>" done < "${TMP_FILE_STORAGE}" } function mail_logs () { MainDialogBody="${SW_DIALOG} \\ --message 'The contents of the log file have been put on the clipboard. Once the new message is composed, be sure to paste the log (Option-V or Edit > Paste) into the body of the mail message.' \\ --messagefont 'size=16' \\ --ontop \\ --icon '${MAIL_ICON}' \\ --bannerimage '${SD_BANNER_IMAGE}' \\ --bannertitle '${SD_WINDOW_TITLE}' \\ --quitkey 0 \\ --json \\ --textfield 'Email Address:',value='<username>@companyname.com' \\ --button1text 'Send' \\ --button2text 'Cancel'" output=$(eval "${MainDialogBody}" 2>/dev/null ) buttonpress=$? [[ ${buttonpress} -eq 2 ]] && return 0 cat ${TMP_FILE_STORAGE} | pbcopy email_address=$(echo $output | awk '{print $NF}'| grep @ | xargs ) # Use outlook to send the email message /usr/bin/open -b com.microsoft.outlook 'mailto:'${email_address}'?subject='${LOG_WINDOW_TITLE}' from '${MAC_SERIAL_NUMBER} } function welcomemsg () { MainDialogBody="${SW_DIALOG} \\ --message '${tempmsg}' \\ --messagefont 'size=12' \\ --ontop \\ --icon '${OVERLAY_ICON}' \\ --bannerimage '${SD_BANNER_IMAGE}' \\ --bannertitle '${SD_WINDOW_TITLE}' \\ --infobox '${SD_INFO_BOX_MSG}' \\ --width 1120 \\ --height 600 \\ --quitkey 0 \\ --json \\ --button1text 'OK' \\ --button2text 'Send via Email'" # Show the dialog screen and allow the user to choose eval "${MainDialogBody}" 2>/dev/null buttonpress=$? [[ ${buttonpress} -eq 0 ]] && return 0 mail_logs } function cleanup_and_exit () { [[ -f ${JSON_OPTIONS} ]] && /bin/rm -rf ${JSON_OPTIONS} [[ -f ${TMP_FILE_STORAGE} ]] && /bin/rm -rf ${TMP_FILE_STORAGE} [[ -f ${DIALOG_COMMAND_FILE} ]] && /bin/rm -rf ${DIALOG_COMMAND_FILE} exit 0 } autoload 'is-at-least' declare email_address check_swift_dialog_install create_infobox_message check_support_files import_log_contents welcomemsg cleanup_and_exit

 

Allows for parameter passing into the script so you can setup as many log captures as you want. Screenshot of system script options:

0 replies

Be the first to reply!

Reply


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings