Скрипт для rclone (выгрузка файлов по определенному сценарию)
Добрый день. ЕСЛИ ВОПРОСЫ - ЗАДАВАЙТЕ
Нужно написать скрипт для выгрузки файлов в облака по сценарию.
- https://rclone.org/commands/ - перечень доступных команд.
- На чем писать - на ваше усмотрение (python. bash предпочтительнее).
- Запускаться будет по Cron. Нужно реализовать функцию, чтобы скрипт понимал, что прошлая сессия еще работает (чтобы параллельно не выгружать одно и тоже).
- Должно быть просто подвязать любое облако в дальнейшем, например, Mega, OneDrive, Google Drive, Sia и пр. Принцип выгрузки одинаковый везде: rclone copy source:sourcepath dest:destpath. Облака подключаются в файле конфигурации, а потом в команде заменяются пути dest:destpath.
- Нужно выявлять новые файлы в директории $GetFromFolder, потом перемещать в $MoveFolder (для защиты от перезаписи или внесения изменений), после выгружать, после удалять.
- Выявление новых файлов: нужно выявлять и перемещать для выгрузки все файлы, кроме самого нового, поскольку программа (которая создает файлы) в самый новый файл пишет на протяжении определенного времени. И когда появляется еще один, значит прошлый можно забирать на выгрузку.
Либо можно определять, что файл более не используется ничем для записи, добавив переменную $TimeWithoutChanges и если файл не изменялся (размер) в течение указанного времени, то считаем файл завершенным и готовым к выгрузке.
- Переменная $MaxCloudLimit позволяет задавать максимальный лимит облака. Он может быть меньше реального. Нужно записывать все выгруженные файлы и их размеры. Если лимит превышен, то удалять самое старое, чтобы хватило места на новую выгрузку. Команда rclone lsl позволяет выгрузить из облака список файлов и их размеры. Не на всех облаках работает, поэтому, вероятно, лучше записывать в файл все загрузки.
- Если скрипт завис (вероятно писать в файл время старта и когда время будет больше $FreezeTime, принудительно убивать процесс). Выполнять проверку нужно в начале работы (то есть если скрипт завис, то он не сможет сам ничего сделать, поэтому определять должна новая сессия, запущенная по cron). Можно добавить .lock файл с датой и временем запуска.
- Перед тем, как удалить локально файл и завершить работу, необходимо обязательно проверить наличие файла в облаке, например, через rclone lsl.
- Если файл загружен успешно, но в директории он не оказался (мало ли глюк), то $MoveIfNotFoundAfterUpload = yes/no
Если yes, то $MoveIfNotFoundTo перемещаем этот файл, а не удаляем, сообщаем на почту.
- Если облако сломалось, не подключается и пр. - уведомление на почту, а дальше $CrashedCloudSkip=yes/no
- Отправлять уведомления:
-- об ошибках (письмо: UploadError/мойтекст,написанныйвручную/названиеоблака/время)
-- если сессия висит долго (завис скрипт) (письмо: Freezed/мойтекст,написанныйвручную/названиеоблака/Time)
-- если долго нет новых файлов ($LongTimeWithoutNewFIles), нужно на случай, если вдруг сломалось что-то в скрипте, который создает файлы (письмо: NoNewFiles/мойтекст,написанныйвручную/названиеоблака/Time)
-- об успехах (письмо: SuccessUpload/мойтекст,написанныйвручную/названиеоблака/Time)
- Переменные в скрипте:
-- GetFromFolder=путь до папки, которую нужно мониторить;
-- MoveFolder=путь до папки, в которую перемещается файл для работы
-- TimeWithoutChanges=время, спустя которое считать файл готовым к выгрузке
-- CopyTo1=например, OneDrive:folder
-- CopyTo2=например, Mega:folder
-- CopyTo3=например, GoogleDrive:folder
-- CopytoN=*.
-- MaxCloudLimit=максимальный размер облака (переменная должна быть каждая у своего облака, например CopyTo1=Google Drive + MaxCloudLimit = 500Gb, а CopyTo2=OneDrive + MaxCloudLimit=100Gb и т.д.)
-- Email=почта для уведомлений об ошибках
-- FreezeTime=время, после которого считать скрипт зависшим
-- LongTimeWithoutNewFIles=время, после которого уведомить, если нет новых файлов
-- MoveIfNotFoundAfterUpload=yes/no
-- MoveIfNotFoundTo=директория, куда переместить
-- CrashedCloudSkip = yes-пропустить сломанное облако, no-завершить работу скрипта.
Если вы все дочитали до этого момента и не робот, пишите "я не бот" в начале ответа.
-
ставка скрыта заказчиком
-
нужно создать нормальную админку. просто скрипт не подойдет