From b5f438e09db8150927588d3f1a4bee6ca578351b Mon Sep 17 00:00:00 2001 From: Tealk Date: Wed, 25 Oct 2023 15:46:46 +0200 Subject: [PATCH] add some improvements Signed-off-by: Tealk --- cleanup-mastodon-users.sh | 134 +++++++++++++++++++------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/cleanup-mastodon-users.sh b/cleanup-mastodon-users.sh index 665151c..75dc990 100644 --- a/cleanup-mastodon-users.sh +++ b/cleanup-mastodon-users.sh @@ -4,22 +4,26 @@ # 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" # all accounts below 6 months inactivity are safe, start notifiying them when >6 months -UPPERLIMIT="7 months" # inactive accounts older than 7 months will be deactivated -DELDELIMIT="1 year" # all accounts not used within a year will get deleted +readonly LOWERLIMIT="6 months" # all accounts below 6 months inactivity are safe, start notifiying them when >6 months +readonly UPPERLIMIT="7 months" # inactive accounts older than 7 months will be deactivated +readonly DELDELIMIT="1 year" # all accounts not used within a year will get deleted +readonly LIVE_PATH="${MASTO_PATH}" # Path to live data from mastodon +readonly TOOTCTL="bin/tootctl" -TOOTCTL="~/live/bin/tootctl" +cd "${LIVE_PATH}" || exit + +# shellcheck source=/dev/null +source "${LIVE_PATH}/.env.production" + +run_tootctl() { + "${TOOTCTL}" "$@" +} set -f # set the following variables accordingly to your site -# the admin will get a notification mail in BCC - -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 admin will get a notification mail in BCC # 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 @@ -27,9 +31,7 @@ mastodonpath="/home/mastodon/live" #DB_PASS= site="Nerdculture.de" -siteurl="https://nerdculture.de/" -siteadmin="ij@bluespice.org" -sitefrom="no-reply@nerdculture.de" +#siteadmin="ij@bluespice.org" protectedusers="ij kirschwipfel xmppcompliance order kirschwipfeltest" sqlprotectedusers="'ij', 'kirschwipfel', 'xmppcompliance', 'order', 'kirschwipfeltest'" limit_delete=2 @@ -61,85 +63,85 @@ 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 +# 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 () { - ( cat <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 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"," ) + 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 + for s in ${protectedusers} ; do if [ "${s}" = "${username}" ]; then pcheck=1 fi @@ -187,20 +189,20 @@ case ${mode} in if [ ${pcheck} -eq 0 ]; then echo "Delete unconfirmed user ${username}" if [ "${mode}" = "hotrun" ]; then - ${mastodonpath}/bin/tootctl accounts delete "${username}" + run_tootctl accounts delete "${username}" elif [ "${mode}" = "dryrun" ]; then echo "${username}: skipped because of dryrun." fi fi fi done - #for u in $( ${mastodonpath}/bin/console user list active -c 10000 | grep -v '.*---.*' | sed 's/|/;/g' | tr -s "\ " | sed 's/^;\ //g' | sed 's/\ ;\ /;/g' | sed 's/\ /_/g' | tail -n +2 | grep -i -v -E ${protected} ); do + #for u in $( ${LIVE_PATH}/bin/console user list active -c 10000 | grep -v '.*---.*' | sed 's/|/;/g' | tr -s "\ " | sed 's/^;\ //g' | sed 's/\ ;\ /;/g' | sed 's/\ /_/g' | tail -n +2 | grep -i -v -E ${protected} ); do for mode2 in $(echo "warn disable"); do #echo "mode2: $mode2" case ${mode2} in "warn") #echo "in warn" - SQLSTATE="current_sign_in_at between now()-'${UPPERLIMIT}'::interval and now()-'${LOWERLIMIT}'::interval" + SQLSTATE="current_sign_in_at between now()-'${UPPERLIMIT}'::interval and now()-'${LOWERLIMIT}'::interval" ;; "disable") #echo "in disable" @@ -212,7 +214,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 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}') @@ -233,13 +235,13 @@ case ${mode} in "disable") # 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. + # 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}" - ${mastodonpath}/bin/tootctl accounts modify "${username}" --disable + #run_tootctl accounts delete "${username}" + run_tootctl accounts modify "${username}" --disable #notifyUserDeletion notifyUserDisable #echo "deleted." @@ -260,7 +262,6 @@ esac ENDDATE=$(date +"%d.%m.%Y %H:%M:%S") - echo "===================================" echo "Starting time : ${STARTDATE}" echo "Ending time : ${ENDDATE}" @@ -268,4 +269,3 @@ echo "Notified Users: $num_notified" echo "Disabled Users: $num_disabled" echo "Deleted Users : $num_deleted" echo "===================================" -