#!/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)"