Create cleanup-mastodon-users.sh

Initial commit
This commit is contained in:
ingoj 2021-08-05 10:14:46 +02:00
parent 1fba63067a
commit dbe001ec88

164
cleanup-mastodon-users.sh Executable file
View File

@ -0,0 +1,164 @@
#!/bin/sh
# LOWERLIMIT="'6 months'" or "'24 weeks'"
# UPPERLIMIT="'7 months'" or "'28 weeks'"
# this defines the range of inactivity where users get notified
# before the account will be deleted when UPPERLIMIT is surpassed.
LOWERLIMIT="6 months"
UPPERLIMIT="7 months"
TOOTCTL="~/live/bin/tootctl"
set -f
# get some settings from the Mastodon config and write it to another file, so that we can source it and make use of it
grep -e ^"DB_" -e ^"LOCAL_DOMAIN" /home/mastodon/live/.env.production > /home/mastodon/bin/cleanup-mastodon-users.conf
. /home/mastodon/bin/cleanup-mastodon-users.conf
# the following lines should be moved to a config file, eg. /usr/local/etc/cleanup_friendica.conf
mastodonpath="/home/mastodon/live"
#DB_HOST=127.0.0.1
#DB_PORT=6432
#DB_NAME=mastodon
#DB_USER=mastodon
#DB_PASS=
site="<SITETITEL>"
siteurl="<SITEURL>"
siteadmin="<ADMINMAIL"
sitefrom="no-reply@<SITEDOMAIN>"
protectedusers="<space seperated list of protected accounts, eg: user1 user2>"
sqlprotectedusers="<same, but with delimiters for SQL, eg:'user1', 'user2'>"
case $1 in
"--dry-run")
mode="dryrun"
;;
"--dowhatimean")
mode="hotrun"
;;
*)
echo "Usage: "
echo " --dry-run \t: make a dry-run, no deletion will be done, no mails are sent."
echo " --dowhatimean \t: add this option if you really want to delete users."
exit 0
;;
esac
#. /usr/local/etc/cleanup_friendica.conf
# make a list to be used for grep -E
protected=$(echo $protectedusers | sed 's/\"//g' | sed 's/\ /\\\|/g')
echo $protected
cd ${mastodonpath} || exit 0
# notify the user that s/he needs to re-login after 6 months to prevent account deletion
notifyUser () {
( cat <<EOF
Dear ${dispname},
you have registered your account on ${siteurl} at ${registered} and last time you logged in was at ${lastlogin}.
If you want to continue to keep your Mastodon account on ${SITE} then please log in at least every 6 months via web browser to keep your account alive. Otherwise we assume that you don't want to use it anymore and will cancel your account 7 months after your last login.
You can access your profile at ${profileurl} or you can cancel your account on your own when logged in at ${siteurl}removeme - however we would like to see you become an active user again and contribute to the Fediverse, but of course it's up to you.
Sincerely,
your ${site} admins
EOF
) | sed 's/_/\ /g' | /usr/bin/mail -s "The Fediverse misses you, ${username}!" -r "${sitefrom}" -- "${usermail}"
# add '-b "$siteadmin"' before the "--" above to receive BCC mails
}
# notify user that the account has been deleted because of inactivity
notifyUserDeletion () {
( cat <<EOF
Dear ${dispname},
you have registered your accoutn on ${siteurl} at ${registered} and last time you logged in was at ${lastlogin}.
Since you haven't reacted to the previous mails and didn't login again, your account including all your data has now been deleted.
Sincerely,
your ${site} admins
EOF
) | sed 's/_/\ /g' | /usr/bin/mail -s "Your account ${username} on ${site} has been deleted!" -r "${sitefrom}" -- "${usermail}"
# add '-b "$siteadmin"' before the "--" above to receive BCC mails
}
for line in $(psql -U ${DB_USER} -w -h ${DB_HOST} -p ${DB_PORT} -t ${DB_NAME} -c "select concat(username||','||email) from accounts a, users u where domain is null and a.id=u.account_id and last_sign_in_at is null and u.created_at < now()-'2 weeks'::interval and username not in (${sqlprotectedusers})"| tr -d " "); do
#echo ${line}
username=$(echo ${line} | cut -f1 -d"," )
mail=$(echo ${line} | cut -f2 -d"," )
# if username is a protected user do nothing, else delete user
if [ -n "${protectedusers}" ]; then
pcheck=0
for s in $(echo ${protectedusers}) ; do
if [ "${s}" = "${username}" ]; then
pcheck=1
fi
done
if [ ${pcheck} -eq 0 ]; then
echo "Delete unconfirmed user ${username}"
if [ "${mode}" = "hotrun" ]; then
${mastodonpath}/bin/tootctl accounts delete "${username}"
elif [ "${mode}" = "dryrun" ]; then
echo "${username}: skipped because of dryrun."
fi
fi
fi
done
# find & notify users that didn't logged in >6 months and send mail to log in again
for mode2 in $(echo "warn delete"); do
#echo "mode2: $mode2"
case ${mode2} in
"warn")
#echo "in warn"
SQLSTATE="last_sign_in_at between now()-'${UPPERLIMIT}'::interval and now()-'${LOWERLIMIT}'::interval"
;;
"delete")
#echo "in delete"
SQLSTATE="last_sign_in_at < now()-'${UPPERLIMIT}'::interval"
;;
esac
#echo "SQL: $SQLSTATE"
for u in $( psql -U ${DB_USER} -w -h ${DB_HOST} -p ${DB_PORT} -t ${DB_NAME} -c "select concat(username||';'||display_name||';'||email||';'||to_char(a.created_at, 'YYYY-MM-DD')||';'||to_char(last_sign_in_at,'YYYY-MM-DD')) from accounts a, users u where domain is null and a.id=u.account_id and ${SQLSTATE} and username not in ($sqlprotectedusers) order by last_sign_in_at" | tr -d " " ); do
#echo ${u}
username=$(echo "${u}" | awk -F ";" '{print $1}')
dispname=$(echo "${u}" | awk -F ";" '{print $2}')
profileurl="https://nerdculture.de/@${username}"
usermail=$(echo "${u}" | awk -F ";" '{print $3}')
registered=$(echo "${u}" | awk -F ";" '{print $4}')
lastlogin=$(echo "${u}" | awk -F ";" '{print $5}')
case ${mode2} in
"warn")
if [ "${mode}" = "hotrun" ]; then
#echo -n "hotrun "
notifyUser
elif [ "${mode}" = "dryrun" ]; then
echo "Check ${username}: notify skipped because of dryrun."
fi
;;
"delete")
# delete account when last login is older than 7 months and send mail about deletion
# you should copy & paste the text from 6 months for the first runs of this script
# and later change the text to a notification that the account has been deleted.
# if username is a protected user do nothing, else delete user
echo -n "${username} : "
if [ "${mode}" = "hotrun" ]; then
#echo -n "hotrun "
${mastodonpath}/bin/tootctl accounts delete "${username}"
notifyUserDeletion
#echo "deleted."
elif [ "${mode}" = "dryrun" ]; then
echo "skipped because of dryrun."
fi
;;
esac
done
done