#!/bin/bash
# Suppression des stockages externes obsolètes

ROOT_DIR=/var/www/html/nextcloud
CLEANING_LOG_TAG=nextcloud-mount-cleanup # tag pour la journalisation (journalctl -ft nextcloud-mount-cleanup)
EXECUTION_TIMEOUT=1800 # permettre l’interruption de la procédure entre deux itérations si le délai au commencement de l’une d’elle est dépassé.
BATCH_SIZE=1000 # nombre d’enregistrements par lot de suppression

# Récupérer les identifiants de configurations de montages externes
external_mount_defs="$(CreoleRun "sudo -u www-data php ${ROOT_DIR}/occ files_external:list --output json" web)"
external_mount_ids="$(echo $external_mount_defs | jq -r '. |
	map(select(.mount_point == "\/Envole")) |
		map(select((.applicable_users | length > 0) or
		(.applicable_groups | length > 0) or
		(.authentication_type != "password::userprovided") or
		(.storage != "\\OCA\\Files_External\\Lib\\Storage\\SMB"))) |
		[ .[].mount_id ] | join(" ")')"
systemd-cat -t $CLEANING_LOG_TAG echo "Cleaning mounts $external_mount_ids"

declare -a external_mounts=( )
# Récupérer le identifiants de stockage correspondant
for elem in $external_mount_ids
do
    external_storage_ids="$(CreoleRun "mysql --defaults-file=/etc/mysql/debian.cnf -N -e \"SELECT storage_id FROM oc_mounts WHERE mount_id = $elem;\" nextcloud" web)"
    external_mounts[$elem]=$(echo $external_storage_ids)
done

# Reset execution timer
SECONDS=0

if [ "${#external_mounts[@]}" -ne 0 ]
then
    # Création de la procédure MySQL
    CreoleRun "mysql --defaults-file=/etc/mysql/debian.cnf --delimiter=\"//\" -e \"DROP PROCEDURE IF EXISTS batch_delete//CREATE PROCEDURE batch_delete(IN external_storage_id INT, IN external_mount_id INT) BEGIN DECLARE rowcount INT DEFAULT 1;WHILE rowcount > 0 DO DELETE FROM oc_filecache WHERE storage = external_storage_id LIMIT $BATCH_SIZE; SET rowcount = (SELECT row_count()); SELECT CONCAT(COUNT(*), ' remaining records for mount id ', external_mount_id) FROM oc_filecache WHERE storage = external_storage_id; DO sleep(1); END WHILE;end//\" nextcloud" mysql


    for external_mount in ${!external_mounts[@]}
    do
        if [ $EXECUTION_TIMEOUT -le 0 ] || [ $SECONDS -lt $EXECUTION_TIMEOUT ]
        then
            for external_storage_id in ${external_mounts[${external_mount}]}
            do
                # Suppression des enregistrements dans la table de cache
                systemd-cat -t $CLEANING_LOG_TAG stdbuf -o0 CreoleRun "mysql --defaults-file=/etc/mysql/debian.cnf -N --batch -e \"CALL batch_delete($external_storage_id, $external_mount);\" nextcloud" mysql
            done
            # Lancement de la procédure de suppression par nextcloud
            systemd-cat -t $CLEANING_LOG_TAG CreoleRun "sudo -u www-data php ${ROOT_DIR}/occ files_external:delete -y $external_mount" web
        else
            break
        fi
    done
fi

# Récupérer à nouveau les identifiants de configurations de montages externes
external_mount_defs="$(CreoleRun "sudo -u www-data php ${ROOT_DIR}/occ files_external:list --output json" web)"
external_mount_ids="$(echo $external_mount_defs | jq -r '. |
	map(select(.mount_point == "\/Envole")) |
		map(select((.applicable_users | length > 0) or
		(.applicable_groups | length > 0) or
		(.authentication_type != "password::userprovided") or
		(.storage != "\\OCA\\Files_External\\Lib\\Storage\\SMB"))) |
		[ .[].mount_id ] | join(" ")')"
if [ -z "${external_mount_ids}" ]
then
    systemd-cat -t $CLEANING_LOG_TAG echo "Cleanup finished"
else
    systemd-cat -t $CLEANING_LOG_TAG echo "Remaining storages after partial cleanup: ${external_mount_ids}"
fi

exit 0
