From c3bd7d2d5ffef4812155243771aa14a81ea6ad3a Mon Sep 17 00:00:00 2001 From: ij Date: Sat, 18 Nov 2023 21:18:16 +0100 Subject: [PATCH] Some more changes, added subroutine to create config --- cleanup-mastodon-users.sh | 105 +++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 42 deletions(-) diff --git a/cleanup-mastodon-users.sh b/cleanup-mastodon-users.sh index 6582f76..16a7a55 100644 --- a/cleanup-mastodon-users.sh +++ b/cleanup-mastodon-users.sh @@ -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 <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 "==================================="