mirror of
https://codeberg.org/Windfluechter/cleanup-mastodon-users.sh.git
synced 2026-02-19 15:37:51 +00:00
Compare commits
2 Commits
246212c8e1
...
c31c0ab0e5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c31c0ab0e5 | ||
|
|
c3bd7d2d5f |
@@ -8,6 +8,7 @@ The script does two things:
|
||||
# Installation
|
||||
* save the script in home directory of Mastodon (eg. ~/bin, not under /root, maybe /usr/local/bin)
|
||||
* make the script executable (e.g. `chown mastodon:mastodon bin/cleanup-mastodon-users.sh && chmod u+rx bin/cleanup-mastodon-users.sh)`
|
||||
* create a config file at `$HOME/.cleanup-mastodon-users.conf` by calling the script with `--init` argument and edit the file to fit your needs
|
||||
* create a crontab to execute the script, e.g.: `20 8 * * 4 /home/mastodon/bin/cleanup-mastodon-users.sh --dowhatimean` to execute the script every week. In the example it is executed every Thursday (4th day of week) at 8:20 in the morning.
|
||||
* for the first runs you should set `UPPERLIMIT` to a high number and keep the deleting of the user commented out (`${mastodonpath}/bin/tootctl accounts delete "${username}"`). After the first few runs you can reduce `UPPERLIMIT` to a lower setting and repeat this until you reached the final value. You shouldn't have too many weeks between `LOWERLIMIT` and `UPPERLIMIT`. Sensible values might be 6 and 7 months or 12 and 13 months or so.
|
||||
* change the variables at the begin of the script to your site settings.
|
||||
@@ -15,6 +16,7 @@ The script does two things:
|
||||
# Usage
|
||||
```
|
||||
Usage:
|
||||
--init : create bin/cleanup-mastodon-users.sh/.cleanup-mastodon-users.conf config file.
|
||||
--dry-run : make a dry-run, no deletion will be done, no mails are sent.
|
||||
--cron : delete deactivated users in a regularly cron run step by step to avoid mass flooding.
|
||||
--dowhatimean : add this option if you really want to delete users.
|
||||
|
||||
@@ -2,9 +2,8 @@
|
||||
|
||||
set -f
|
||||
|
||||
if [ -f ${HOME}/.cleanup-mastodon-users.conf ]; then
|
||||
. ${HOME}/.cleanup-mastodon-users.conf
|
||||
else
|
||||
# create a default config when started with --init
|
||||
initConfig() {
|
||||
(
|
||||
cat <<EOF
|
||||
LOWERLIMIT="6 months" # all accounts below 6 months inactivity are safe, start notifiying them when >6 months
|
||||
@@ -19,25 +18,59 @@ SQLPROTECTEDUSERS="'user', 'foo', 'bar', 'baz'"
|
||||
LIMIT_DELETE="2"
|
||||
|
||||
EOF
|
||||
) > ${HOME}/.cleanup-mastodon-users.conf
|
||||
sleep 1
|
||||
. ${HOME}/.cleanup-mastodon-users.conf
|
||||
fi
|
||||
) > "${HOME}"/.cleanup-mastodon-users.conf
|
||||
echo "✅ - Configuration file created. You can now edit "${HOME}"/.cleanup-mastodon-users.conf"
|
||||
}
|
||||
|
||||
#LOWERLIMIT="${LOWERLIMIT:-'6 months'}" # all accounts below 6 months inactivity are safe, start notifiying them when >6 months
|
||||
#UPPERLIMIT="${UPPERLIMIT:-'7 months'}" # inactive accounts older than 7 months will be deactivated
|
||||
#DELDELIMIT="${DELDELIMIT:-'1 year'}" # all accounts not used within a year will get deleted
|
||||
#LIVE_PATH="${LIVE_PATH:-${HOME}/live/}" # Path to live data from mastodon
|
||||
#TOOTCTL="${TOOTCTL:-${HOME}/bin/tootctl}"
|
||||
#SITE="${SITE:-$LOCAL_DOMAIN}"
|
||||
#SITEADMIN="${SITEADMIN:-root@localhost}"
|
||||
#LIMIT_DELETE="${LIMIT_DELETE:-2}"
|
||||
|
||||
case $1 in
|
||||
"--init")
|
||||
initConfig
|
||||
exit 0
|
||||
;;
|
||||
"--dry-run")
|
||||
mode="dryrun"
|
||||
;;
|
||||
"--cron")
|
||||
mode="cron"
|
||||
;;
|
||||
"--dowhatimean")
|
||||
mode="hotrun"
|
||||
;;
|
||||
*)
|
||||
echo "Usage: "
|
||||
echo "--init \t \t: create $0/.cleanup-mastodon-users.conf config file."
|
||||
echo " --dry-run \t: make a dry-run, no deletion will be done, no mails are sent."
|
||||
echo " --cron \t: delete deactivated users in a regularly cron run step by step to avoid mass flooding."
|
||||
echo " --dowhatimean \t: add this option if you really want to delete users."
|
||||
echo ""
|
||||
if [ ! -f "${HOME}"/.cleanup-mastodon-users.conf ]; then
|
||||
echo "❌ - No configuration file found!"
|
||||
echo "Please start with \"$0 --init\" to create config files"
|
||||
echo "and edit the file \"${HOME}/.cleanup-mastodon-users.conf\" to your needs."
|
||||
exit 0
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
. "${HOME}"/.cleanup-mastodon-users.conf
|
||||
|
||||
LOWERLIMIT="${LOWERLIMIT:-'6 months'}" # all accounts below 6 months inactivity are safe, start notifiying them when >6 months
|
||||
UPPERLIMIT="${UPPERLIMIT:-'7 months'}" # inactive accounts older than 7 months will be deactivated
|
||||
DELDELIMIT="${DELDELIMIT:-'1 year'}" # all accounts not used within a year will get deleted
|
||||
LIVE_PATH="${LIVE_PATH:-${HOME}/live/}" # Path to live data from mastodon
|
||||
TOOTCTL="${TOOTCTL:-${HOME}/bin/tootctl}"
|
||||
SITE="${SITE:-$LOCAL_DOMAIN}"
|
||||
SITEADMIN="${SITEADMIN:-root@localhost}"
|
||||
LIMIT_DELETE="${LIMIT_DELETE:-2}"
|
||||
|
||||
|
||||
cd "${LIVE_PATH}" || exit
|
||||
|
||||
# shellcheck source=/dev/null
|
||||
source "${LIVE_PATH}/.env.production"
|
||||
. "${LIVE_PATH}/.env.production" 2>/dev/null
|
||||
|
||||
run_tootctl() {
|
||||
"${TOOTCTL}" "$@"
|
||||
@@ -50,29 +83,11 @@ num_deleted=0
|
||||
|
||||
STARTDATE=$(date +"%d.%m.%Y %H:%M:%S")
|
||||
|
||||
case $1 in
|
||||
"--dry-run")
|
||||
mode="dryrun"
|
||||
;;
|
||||
"--cron")
|
||||
mode="cron"
|
||||
;;
|
||||
"--dowhatimean")
|
||||
mode="hotrun"
|
||||
;;
|
||||
*)
|
||||
echo "Usage: "
|
||||
echo " --dry-run \t: make a dry-run, no deletion will be done, no mails are sent."
|
||||
echo " --cron \t: delete deactivated users in a regularly cron run step by step to avoid mass flooding."
|
||||
echo " --dowhatimean \t: add this option if you really want to delete users."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
# make a list to be used for grep -E
|
||||
PROTECTED=$(echo "$PROTECTEDUSERS" | sed 's/\"//g' | sed 's/\ /\\\|/g')
|
||||
#echo $PROTECTED
|
||||
|
||||
|
||||
# notify the user that s/he needs to re-login after 6 months to prevent account deletion
|
||||
notifyUser() {
|
||||
(
|
||||
@@ -139,10 +154,13 @@ EOF
|
||||
# select a.id, username, email, current_sign_in_at from accounts a, users u where domain is null and a.id=u.account_id and current_sign_in_at <'2019-01-01'
|
||||
|
||||
case ${mode} in
|
||||
"init")
|
||||
initConfig
|
||||
;;
|
||||
"cron")
|
||||
# get the total number of deactivated accounts
|
||||
# the intention is that you can better judge how often you need to invoke the cron option
|
||||
# or by increasing the limit_delete variable
|
||||
# or by increasing the LIMIT_DELETE variable
|
||||
# the backlog queue shouldn't pile up but also not run empty to fast to reduce the load
|
||||
num_deactivated_overgrace=$(psql -U "${DB_USER}" -w -h "${DB_HOST}" -p "${DB_PORT}" -t "${DB_NAME}" -c "select count(username) from accounts a, users u where disabled is true and a.id=u.account_id and current_sign_in_at < now()-'${DELDELIMIT}'::interval and username not in ($SQLPROTECTEDUSERS)" | tr -d " " )
|
||||
num_deactivated_total=$(psql -U "${DB_USER}" -w -h "${DB_HOST}" -p "${DB_PORT}" -t "${DB_NAME}" -c "select count(username) from accounts a, users u where disabled is true and a.id=u.account_id and username not in ($SQLPROTECTEDUSERS)" | tr -d " " )
|
||||
@@ -153,9 +171,9 @@ case ${mode} in
|
||||
echo "==================================="
|
||||
echo "Total deactivated accounts: ${num_deactivated_total}"
|
||||
echo "Number deactivated accounts over grace: ${num_deactivated_overgrace}"
|
||||
echo "Deleting this many accounts: ${limit_delete}"
|
||||
echo "Deleting this many accounts: ${LIMIT_DELETE}"
|
||||
echo "==================================="
|
||||
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(current_sign_in_at,'YYYY-MM-DD')) from accounts a, users u where disabled is true and a.id=u.account_id and current_sign_in_at < now()-'${DELDELIMIT}'::interval and username not in ($SQLPROTECTEDUSERS) order by current_sign_in_at limit ${limit_delete}" | tr -d " " ); do
|
||||
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(current_sign_in_at,'YYYY-MM-DD')) from accounts a, users u where disabled is true and a.id=u.account_id and current_sign_in_at < now()-'${DELDELIMIT}'::interval and username not in ($SQLPROTECTEDUSERS) order by current_sign_in_at limit ${LIMIT_DELETE}" | tr -d " " ); do
|
||||
#echo ${u}
|
||||
username=$(echo "${u}" | awk -F ";" '{print $1}')
|
||||
dispname=$(echo "${u}" | awk -F ";" '{print $2}')
|
||||
@@ -180,7 +198,7 @@ case ${mode} in
|
||||
*)
|
||||
# find & notify users that didn't logged in >6 months and send mail to log in again#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 current_sign_in_at is null and u.created_at < now()-'2 weeks'::interval" | tr -d " "
|
||||
#for username in $(psql -U ${DB_USER} -w -h ${DB_HOST} -p ${DB_PORT} -t ${DB_NAME} -c "select a.id, username, email, current_sign_in_at from accounts a, users u where domain is null and a.id=u.account_id and current_sign_in_at <'2019-01-01'" )
|
||||
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 current_sign_in_at is null and u.created_at < now()-'2 weeks'::interval and username not in (${SQLPROTECTEDUSERS})"| tr -d " "); do
|
||||
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 disabled is false and a.id=u.account_id and current_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"," )
|
||||
@@ -212,7 +230,8 @@ case ${mode} in
|
||||
;;
|
||||
"disable")
|
||||
#echo "in disable"
|
||||
SQLSTATE="current_sign_in_at < now()-'${UPPERLIMIT}'::interval"
|
||||
#SQLSTATE="current_sign_in_at < now()-'${UPPERLIMIT}'::interval"
|
||||
SQLSTATE="current_sign_in_at between now()-'${UPPERLIMIT}'::interval and now()-'${UPPERLIMIT}'::interval-'1 week'::interval"
|
||||
;;
|
||||
#"delete")
|
||||
# #echo "in delete"
|
||||
@@ -220,7 +239,7 @@ case ${mode} in
|
||||
# ;;
|
||||
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(current_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 current_sign_in_at" | tr -d " " ); do
|
||||
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(current_sign_in_at,'YYYY-MM-DD')) from accounts a, users u where domain is null and a.id=u.account_id and ${SQLSTATE} and disabled is false and username not in ($SQLPROTECTEDUSERS) order by current_sign_in_at" | tr -d " " ); do
|
||||
#echo ${u}
|
||||
username=$(echo "${u}" | awk -F ";" '{print $1}')
|
||||
dispname=$(echo "${u}" | awk -F ";" '{print $2}')
|
||||
@@ -255,6 +274,7 @@ case ${mode} in
|
||||
echo "will be disabled, but is skipped because of dryrun."
|
||||
fi
|
||||
num_disabled=$((num_disabled+1))
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
RND=$(date +%s)
|
||||
@@ -263,6 +283,7 @@ case ${mode} in
|
||||
sleep ${sec}.${ms}
|
||||
done
|
||||
done
|
||||
num_deactivated_total=$(psql -U "${DB_USER}" -w -h "${DB_HOST}" -p "${DB_PORT}" -t "${DB_NAME}" -c "select count(username) from accounts a, users u where disabled is true and a.id=u.account_id and username not in ($SQLPROTECTEDUSERS)" | tr -d " " )
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -273,5 +294,5 @@ echo "Starting time : ${STARTDATE}"
|
||||
echo "Ending time : ${ENDDATE}"
|
||||
echo "Notified Users: $num_notified"
|
||||
echo "Disabled Users: $num_disabled"
|
||||
echo "Deleted Users : $num_deleted"
|
||||
echo "Deleted Users : $num_deactivated_total"
|
||||
echo "==================================="
|
||||
|
||||
Reference in New Issue
Block a user