-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHomeDirReaper.sh
executable file
·74 lines (58 loc) · 2.21 KB
/
HomeDirReaper.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/sh
# This script is to be called by the HomeDirReaper launchagent.
# Default declarations, overwritten by /etc/homedir.defaults; this is just here
# to provide some sane values in case the defaults file doesn't exist.
MAXHOMELIFE="8 hours ago"
MAXDISKUSAGE="85"
. /etc/homedir.defaults
remove_user() {
# Remove a user's home directory and caches.
OLD_USER="${1}"
USER_FOLDER=$(/usr/local/izzy/tools/home-directory-for-user ${OLD_USER})
# Ensure they haven't locked anything in their home folder, then delete it.
logger -is "Removing home folder ${USER_FOLDER}..."
chflags -R noschg,nouchg "${USER_FOLDER}"
rm -rf "${USER_FOLDER}"
# Cycle through folders looking for what they might own, deleting it.
logger -is Removing caches for user ${OLD_USER}...
for cachedir in /private/var/folders \
/private/var/tmp \
/private/tmp \
/Library/Caches
do
find "${cachedir}" -user "${OLD_USER}" -delete
done
# finally, delete the account info
dscl . delete "/Users/${OLD_USER}"
}
update_disk_usage() {
# Sets the variable 'diskusage' to the percent of the disk currently used.
diskusage=$(df / | sed '/Filesystem/d' | awk '{ print $5 }' | sed 's/%//')
}
# PHASE ONE
# Delete each folder in /Users that's older than the maximum time.
for possibleUser in $(/usr/local/izzy/tools/list-local-users --skip-admins); do
userDir=$(/usr/local/izzy/tools/home-directory-for-user ${possibleUser})
if [[ $(find "$userDir" -maxdepth 0 -not -newermt "${MAXHOMELIFE}" -print) ]]; then
remove_user $possibleUser
fi
done
# PHASE TWO
# If disk usage is above pre-set limit, delete a random user directory. Rinse and
# repeat.
update_disk_usage
if [[ ${diskusage} -gt ${MAXDISKUSAGE} ]]; then
logger -is "Disk usage (${diskusage}\%) exceeds limit of ${MAXDISKUSAGE}\%."
logger -is "Deleting user directories to make space..."
while [[ ${diskusage} -gt ${MAXDISKUSAGE} ]]; do
rando=$(/usr/local/izzy/tools/list-local-users --skip-admins | head -n 1)
if [[ "x${rando}" == "x" ]]; then
logger -is "Giving up!"
exit 0
fi
remove_user ${rando}
update_disk_usage
done
else
logger -is "Disk usage does not exceed maximum."
fi