synapse-cleaner/synapse-cleaner.sh

97 lines
3.4 KiB
Bash

#!/bin/bash
## author : Dryusdan
## date : 17/06/2020
## description : A Synapse cleaner
## usage : ./synapse-cleaner.sh PARTIAL|FULL
## Import ####################################
source utils/strictmode
source utils/log
source utils/config
#######################################################
CURLBIN="/usr/bin/env curl"
function purge_img {
${CURLBIN} -X POST "${HS_URL}${API_URL}purge_media_cache?before_ts=$(($(date --date="1 month ago" +%s%N)/1000000))&access_token=${ACCESS_TOKEN}"
}
function get_room {
info "Get total room"
total_room=$(${CURLBIN} -s --header "Authorization: Bearer ${ACCESS_TOKEN}" "${HS_URL}${API_URL}rooms?limit=1" | jq --raw-output ".total_rooms")
info "Get ${total_room} rooms"
${CURLBIN} -s --header "Authorization: Bearer ${ACCESS_TOKEN}" "${HS_URL}${API_URL}rooms?limit=${total_room}" > "/tmp/${CLEAN_FOLDER}/roomlist.json"
}
function get_purge {
jq --raw-output '.rooms[] | select(.joined_local_members == 0) | .room_id' < "/tmp/${CLEAN_FOLDER}/roomlist.json" > "/tmp/${CLEAN_FOLDER}/to_purge.txt"
}
function get_id {
jq --raw-output '.rooms[] | .room_id' < "/tmp/${CLEAN_FOLDER}/roomlist.json" > "/tmp/${CLEAN_FOLDER}/roomids.txt"
}
info "Starting at $(date)"
info "Create /tmp/${CLEAN_FOLDER}"
mkdir -p "/tmp/${CLEAN_FOLDER}"
purge_img
get_room
get_purge
info "Pruning empty room"
for room_id in $(cat "/tmp/${CLEAN_FOLDER}/to_purge.txt")
do
info "Pruning ${room_id}"
curl -X POST -d '{"room_id": "'${room_id}'"}' "${HS_URL}${API_URL}purge_room?access_token=${ACCESS_TOKEN}"
sleep 1
done
info "clean /tmp/${CLEAN_FOLDER}"
rm -rf "/tmp/${CLEAN_FOLDER}"/*
get_room
get_id
info "Start purging"
for room_id in $(cat "/tmp/${CLEAN_FOLDER}/roomids.txt")
do
info "Purge ${room_id}"
purge_id=$(curl -s -X POST -d '{"purge_up_to_ts":'$(($(date --date="1 month ago" +%s%N)/1000000))', "delete_local_events": true}' "${HS_URL}${API_URL}purge_history/${room_id}?access_token=${ACCESS_TOKEN}" | jq --raw-output '.purge_id')
info "Get state of ${purge_id}"
sleep 2
purge_state=$(/usr/bin/curl -s -X GET "${HS_URL}${API_URL}purge_history_status/${purge_id}?access_token=${ACCESS_TOKEN}" | jq --raw-output '.status')
warning "Purge ${room_id} (${purge_id}) is ${purge_state}"
while [ "${purge_state}" == "active" ]
do
sleep 2
purge_state=$(/usr/bin/curl -s -X GET "${HS_URL}${API_URL}/purge_history_status/${purge_id}?access_token=${ACCESS_TOKEN}" | jq --raw-output '.status')
done
warning "Purge ${room_id} (${purge_id}) is ${purge_state}"
done
if [ ${1} == "FULL" ]
then
get_id
info "Compress states"
for room_id in $(cat "/tmp/${CLEAN_FOLDER}/roomids.txt")
do
info "Get state compression for ${room_id}"
${SYNAPSE_COMPRESS_STATE_PATH} -t -o "/tmp/${CLEAN_FOLDER}/state-compressor.sql" -p "host=${HOST} user=${USER} password=${PASSWORD} dbname=${DBNAME}" -r "${room_id}"
info "Import state compression"
cat "/tmp/${CLEAN_FOLDER}/state-compressor.sql"
PGPASSWORD=${PASSWORD} psql -h "${HOST}" -U "${USER}" "${DBNAME}" < "/tmp/${CLEAN_FOLDER}/state-compressor.sql"
info "Ending, remove file"
rm -f "/tmp/${CLEAN_FOLDER}/state-compressor.sql"
info "Finish remove"
done
info "Cleaning"
rm -rf "/tmp/${CLEAN_FOLDER}"
PGPASSWORD=${PASSWORD} psql -h "${HOST}" -U "${USER}" "${DBNAME}" -c "REINDEX DATABASE ${DBNAME};"
PGPASSWORD=${PASSWORD} psql -h "${HOST}" -U "${USER}" "${DBNAME}" -c "VACUUM FULL VERBOSE;"
fi
info "Ending at $(date)"