#!/bin/bash

#==============================================================
#   It is recommended to test the script on a local machine for its purpose and effects.
#   ManageEngine Endpoint Central will not be responsible for any
#   damage/loss to the data/setup based on the behavior of the script.
#   Description - Script to Clean temp files, .DS_Store and Trash for all users
#   Parameters  -
#   Remarks     -
#   Configuration Type - COMPUTER
#==============================================================

clean_folder() {
    local target="$1"
    [ -L "$target" ] && return
    if [ -d "$target" ]; then
        # Regular files and folders
        rm -rf "${target:?}/"* 2>/dev/null
        # Hidden files and folders
        rm -rf "${target:?}"/.[!.]* 2>/dev/null
        rm -rf "${target:?}"/..?*   2>/dev/null
    fi
}

delete_ds_store() {
    local target="$1"
    if [ -d "$target" ]; then
        find "$target" -type f -name ".DS_Store" -delete 2>/dev/null
    fi
}

# USER PROFILE LOOP
ALL_USERS=$(dscl . -list /Users NFSHomeDirectory 2>/dev/null | \
            awk '$2 ~ /^\/Users\// {print $1}')

for name in $ALL_USERS; do

    case "$name" in
        root|daemon|nobody|Shared|Guest) continue ;;
        _*) continue ;;
    esac

    UID_VAL=$(dscl . -read /Users/"$name" UniqueID 2>/dev/null | awk '{print $2}')

    if [ -z "$UID_VAL" ] || [ "$UID_VAL" -lt 501 ]; then
        continue
    fi

    USER_HOME=$(dscl . -read /Users/"$name" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
    USER_HOME="${USER_HOME:-/Users/$name}"

    [ -d "$USER_HOME" ] || continue

    USER_UID="$UID_VAL"

    # USER LIBRARY CACHES
    clean_folder "$USER_HOME/Library/Caches"

    # CLEAN COOKIES
    clean_folder "$USER_HOME/Library/Cookies"

    # CLEAN TRASH — BOOT VOLUME
    if [ -d "$USER_HOME/.Trash" ]; then
        rm -rf "${USER_HOME:?}/.Trash/"* 2>/dev/null
        rm -rf "${USER_HOME:?}/.Trash/".[!.]* 2>/dev/null
        rm -rf "${USER_HOME:?}/.Trash/"...?* 2>/dev/null
    fi

    # CLEAN TRASH — EXTERNAL VOLUMES
    for vol in /Volumes/*/; do
        [ -d "$vol" ] || continue
        TRASHES_PATH="${vol}.Trashes/${USER_UID}"
        if [ -d "$TRASHES_PATH" ]; then
            rm -rf "${TRASHES_PATH:?}/"* 2>/dev/null
            rm -rf "${TRASHES_PATH:?}"/.[!.]* 2>/dev/null
        fi
    done

    # DELETE .DS_STORE FILES
    delete_ds_store "$USER_HOME"

done

# Recycle bin cleanup by Finder
osascript -e 'tell application "Finder" to empty trash'
echo "Using Finder to empty the Bin."

# SYSTEM SESSION TEMP
if [ -d "/private/var/folders" ]; then
    find /private/var/folders -mindepth 4 \
        -type f -mtime +7 -delete 2>/dev/null

    find /private/var/folders -mindepth 3 \
        -type d -empty -delete 2>/dev/null
fi
echo "Session Temp Cleanup Completed."

echo "Disk Cleanup Completed."
