#!/bin/bash function getLDAPAttr() { ### Get an LDAP attribute # param: filter # param attribute filter="${1}" attribute="${2}" ldapsearch -x "${filter}" "${attribute}" | grep -E "^${attribute}: " | sed "s/${attribute}: //" } # Clear cleanup files ldif="/root/cleanup.ldif" >"${ldif}" bash="/root/cleanup.bash" echo "#!/bin/bash" > "${bash}" # Attributes basedn=`getLDAPAttr '(cn=root)' dn | sed 's/cn=root,//'` pwdMaxAge=`getLDAPAttr '(&(cn=default)(objectClass=pwdPolicy))' pwdMaxAge` warning=`getLDAPAttr '(&(cn=default)(objectClass=pwdPolicy))' pwdExpireWarning` pwdWarnAge=$(( $pwdMaxAge - $warning )) unset EXPIRED EXPIRING OK PENDING ### Check all users for user in `ldapsearch -x -b "ou=People,$basedn" uid | grep -E ^uid:\ | sed 's/^uid: //'`; do # Pull changed stats lastChanged=`/usr/sbin/ldapsearch -x "(uid=$user)" + | grep pwdChangedTime | cut -f 2 -d ' '` # created=`/usr/sbin/ldapsearch -x "(uid=$user)" + | grep createTimestamp | cut -f 2 -d ' '` # email=`/usr/sbin/ldapsearch -x "(uid=$user)" | grep mail | cut -f 2 -d ' '` # If user has PENDING changed, report if [ -z "$lastChanged" ]; then if [ -z "${PENDING}" ]; then PENDING="${user}" else PENDING="${PENDING},${user}" fi else delta="$(( `date +%s` - `date -d $(echo $lastChanged | head -c 8) +%s`))" # Report if user is expired if [ $delta -gt $pwdMaxAge ]; then if [ -z "${EXPIRED}" ]; then EXPIRED="${user}" else EXPIRED="${EXPIRED},${user}" fi printf "dn: uid=${user},ou=People,${basedn}\nchangetype: delete\n\n" >> "${ldif}" printf "rm -Rf `getent passwd "${user}" | cut -f 6 -d ':'`\n" >> "${bash}" # Report if the user is expiring and needs to update their password. elif [ $delta -gt $pwdWarnAge ] && [ $delta -le $pwdMaxAge ]; then if [ -z "${EXPIRING}" ]; then EXPIRING="${user}" else EXPIRING="${EXPIRING},${user}" fi # Record the user account is OK. else if [ -z "${OK}" ]; then OK="${user}" else OK="${OK},${user}" fi fi fi done ### Results # Should always have OK users in the tree. echo "OK: ${OK}" # Report when there are users that have not changed their password. # This may be normal, such as for new user accounts, and may not drive action. if [ -n "$PENDING" ]; then echo "PENDING: ${PENDING}" fi # Report when users are expiring -- give them several notices to fix it. if [ -n "${EXPIRING}" ]; then echo "EXPIRING: ${EXPIRING}" ravensend -c "#tech" -m "The following users are expiring: ${EXPIRING}" fi # Report users that have expired. These users should be contacted or removed. if [ -n "${EXPIRED}" ]; then echo "EXPIRED: ${EXPIRED}" echo "Expired users can be cleaned up with ${ldif} and ${bash}" ravensend -c "#sharingan" -m 'Users have expired and need attention.' fi