четверг, 24 мая 2018 г.

Доступ к контенту на Диске Яндекс на временной основе

На Диске Яндекс (Яндекс Диск) файлы и папки можно предоставлять в доступ. При этом предоставленная информация будет находиться в доступе до тех пор, пока не будет владельцем удалена (её содержание или ссылка на контент).

У меня, в частности, возникла необходимость предоставлять данную информацию на временной основе. То есть через определённое время она должна быть удалена в автоматическом режиме без участия пользователя.

Для чего это было сделано? Во-первых, у меня есть респондент, который до сих пор так и не научился скачивать файлы с файлообменных ресурсов. Удивительно, но встречаются и такие люди. Во-вторых, – в силу использования Диском Яндекс так называемой дедупликации файлов, при наличии где-то на диске такого же контента, который мной запланирован к размещению, данный контент будет "загружен" практически моментально, что имеет несомненный плюс при размещении файлов большого объёма.

Вариант решения этой задачи заключается в создании заданий, выполнение которых происходит по расписанию.

Примечание. Если Ваш компьютер не работает ежедневно в течение одного и того же времени, а запускается от случая к случаю, то изложенное далее Вам вряд ли подходит.

В Linux и Windows задача решается различными способами и описывается отдельно для каждой из систем.


Практические шаги в Linux

1. Создаётся каталог, предназначенный для хранения временного контента. К нему устанавливается доступ либо в режиме предоставления в доступ конкретному пользователю (пользователям), либо путём создания веб-ссылки.

2. Назначается задание на удаление содержащегося в каталоге временного контента.

Для файлового менеджера Thunar может быть использовано удаление по расписанию командой правого контекстного меню.

Для других графических окружений может быть создано пользовательское задание, в процессе выполнения которого запускается исполняемый файл, осуществляющий удаление выбранного контента. Примерами содержания такого файла является:

#!/bin/bash
rm /home/user/DiskYandex/Temp/file.mp4
exit

#!/bin/bash
rm -R /home/user/DiskYandex/Temp/folder4
exit

#!/bin/bash
rm /home/user/DiskYandex/Temp/file.mp4
rm -R /home/user/DiskYandex/Temp/folder4
exit

При удалении файлов (каталогов) с именами, содержащими пробелы, пути к ним заключаются в одинарные или двойные кавычки, например:

#!/bin/bash
rm '/home/user/DiskYandex/Temp/Моё видео.mp4'
exit

#!/bin/bash
rm '/home/user/DiskYandex/Temp/Моя папка'
exit

Примечание. Если у Вас демон синхронизации запускается в процессе старта системы и работает постоянно, то в чтении пункта 3 нет необходимости.

3. Создаётся пользовательское задание, в процессе выполнения которого запускается исполняемый файл, осуществляющий запуск демона синхронизации Диска Яндекс и его последующую остановку. При этом процесс происходит в фоновом режиме без отображения на экране монитора. Примером содержания такого файла является:

#!/bin/bash
yandex-disk start
sleep 180
yandex-disk stop
exit

Команда sleep 180 устанавливает количество секунд (180), в течение которых будет выполняться работа демона синхронизации до его остановки по команде yandex-disk stop. Величина в 3 минуты (180 секунд) выбрана из соображений того, что за это время процесс Яндекс Диска гарантировано пересчитает имеющиеся данные даже в случаях кратковременного пропадания соединения. Такие случае наблюдались при запуске Яндекс Диска с индикатором, когда в поле состояния высвечивалась надпись "Нет связи". Однако не позднее 1-2 минут соединение восстанавливалось.  
Команда exit остановит выполнение исполняемого файла, после чего соответствующий ему процесс будет автоматически удалён из системы.

Если для своих задач Вы используете несколько учётных записей Яндекс Диска, то перед запуском демона синхронизации необходимо удалить текущие настройки и записать необходимые, то есть того пользователя, под именем которого будет производиться синхронизация с Диском Яндекс. Пример содержания такого файла на моей системе:

#!/bin/bash
rm -R /home/cemea/.config/yandex-disk
cp -R /home/cemea/Tools/configs/Yandex/03/yandex-disk /home/cemea/.config
yandex-disk start
sleep 180
yandex-disk stop && exit

4. После этого останется только необходимость периодического удаления потерявших актуальность строк в файле пользовательских заданий. Для редактирования своего файла пользовательских заданий cron выполните команду crontab -e

Операции можно полностью автоматизировать. Как это сделать читайте после описания практических шагов в Windows или перейдите по ссылке.


Практические шаги в Windows

1. Создаётся папка, предназначенная для хранения временного контента. К данной папке устанавливается доступ либо в режиме предоставления в доступ конкретному пользователю (пользователям), либо путём создания веб-ссылки.

2. По причине того, что в Windows мне так и не удалось организовать независимую работу клиента Яндекс Диска для разных учётных записей, то единственным способом является удаление временного контента через планировщик Windows.

Для этого можно создавать файлы bat, которые и будут запускаться по расписанию. Примеры таких файлов bat приведены ниже.

Для удаления файла:

@echo off
del C:\Users\spinner\YandexDisk\video.mp4 /q
timeout /t 1 /nobreak
exit

Для удаления папки:

@echo off
rd "C:\Users\spinner\YandexDisk\Shared\Folder" /s /q
timeout /t 1 /nobreak
exit

При использовании имён, содержащих пробелы, используются кавычки:

@echo off
del "C:\Users\spinner\YandexDisk\Shared\Моё видео.mp4" /q
timeout /t 1 /nobreak
exit

@echo off
rd "C:\Users\spinner\YandexDisk\Shared\Моя папка" /s /q
timeout /t 1 /nobreak
exit

Команды timeout /t 1 /nobreak и exit соответствуют "заснуть на 1 секунду" и "завершить работу файла bat". Хотя можно обойтись и без timeout /t 1 /nobreak.


Полная автоматизация в Linux

Следует отметить, что описанная выше реализация лично для меня представилась не совсем удобной. Так, после назначения задания на удаление через Thunar требовалось вызывать на редактирование файл пользовательских заданий cron и добавлять кратковременный запуск демона Диска Яндекс.

Во-первых, когда на временный доступ назначается много контента, то внесение изменений в пользовательское задание cron (добавление данных и удаление данных, потерявших актуальность) превращается в деятельность "процесс ради процесса". А во-вторых, – как быть в случае, если синхронизация с Диском Яндекс не запущена (запускается вручную) или производится с использованием независимых учётных записей (несколько Дисков Яндекс на компьютере)?

1. Автоматизация процесса удаления данных.

Для автоматизации процесса потребуется много поработать с клавиатурой. Хотя это и "тоскливо", но утешением будет служить то, что это будет сделано только 1 раз.

Эта задача решается просто. В каталоге временных данных создаются каталоги, соответствующие числу месяца, до которого предоставляемые в доступ данные будут доступны. Например, 01, 05, 14, 28, 31. В эти каталоги заранее записываются данные и в дальнейшем синхронизируются с соответствующими папками облака Диска Яндекс.

Для осуществления операции удаления пишется 31 исполняемый файл задания. Примеры:

#!/bin/bash
trash=~/Yandex/Shared/01
if [ -d $trash ]
then
rm -rdf ~/Yandex/Shared/01
else
sleep 1
fi
sleep 5 && exit

#!/bin/bash
trash=~/Yandex/Shared/14
if [ -d $trash ]
then
rm -rdf ~/Yandex/Shared/14
else
sleep 1
fi
sleep 5 && exit

Пояснения:

~/Yandex/Shared/14 – путь к проверяемому каталогу Диска Яндекс. Сам проверяемый каталог 14 расположен в каталоге временных данных Shared, предоставленный в общий доступ. Знак ~/ соответствует расположению "в домашнем каталоге пользователя".

Проверяется наличие указанного выше каталога на диске. Если он существует, то производится его удаление вместе со всем содержимым (файлы и вложенные каталоги) без необходимости подтверждения, даже и в том случае, если сам каталог не содержит никаких данных.

Если такого каталога не существует, то задание "засыпает" на 1 секунду (sleep 1), после чего будет инициирован процесс завершения работы задания.

В каталог с номером  помещаются те данные, которые должны быть удалены тем числом месяца, которое совпадает с номером каталога.

Если данные представляются из себя контент очень большого объёма, то имеет смысл сначала его синхронизировать с другим каталогом, а уже затем перекладывать в выбранный каталог. Это объясняется тем, чтобы избежать недоразумений, если Вы уведомите о наличии контента, а сам контент не успеет синхронизироваться с Диском Яндекс.

2. Создание исполняемого файла, осуществляющего запуск демона синхронизации Диска Яндекс и его последующую остановку (см. п.3 выше). Если у Вас демон синхронизации запускается в процессе старта системы и работает постоянно, то в создании файла нет необходимости.

3. Внесение заданий в cron.

Здесь тоже придётся поработать, но сделать только 1 раз.

Создать задание на запуск демона Яндекс Диска для каждой даты.
Создать задание на запуск процедуры удаления файла для каждой даты.

Например, 14 и 31 числа каждого месяца в 22:24 запускается демон Яндекс Диска, а в 22:25 производится удаление соответствующего каталога.

24 22 14 * * /home/cemea/Tools/configs/Yandex/demon.sh
25 22 14 * * /home/cemea/Tools/configs/Delete/del14
24 22 31 * * /home/cemea/Tools/configs/Yandex/demon.sh
25 22 31 * * /home/cemea/Tools/configs/Delete/del31

Если применяется синхронизация с Яндекс Диском для нескольких учётных записей, то дополнительно создаётся задание на проверку наличия запущенного Диска.Яндекс (demoncheck.sh). Если он запущен, то выдаётся команда на его остановку (yandex-disk stop). Проверка планируется за 1 минуту до запуcка синхронизации под необходимой учётной записью. Например:

23 22 14 * * /home/cemea/Tools/configs/Yandex/demoncheck.sh
24 22 14 * * /home/cemea/Tools/configs/Yandex/demon.sh
25 22 14 * * /home/cemea/Tools/configs/Delete/del14
23 22 31 * * /home/cemea/Tools/configs/Yandex/demoncheck.sh
24 22 31 * * /home/cemea/Tools/configs/Yandex/demon.sh
25 22 31 * * /home/cemea/Tools/configs/Delete/del31

Задание проверки наличия запущенного демона Диска Яндекс.

#!/bin/bash
yd=/tmp/yandex-disk-*
if [ -d $yd ]; then
yandex-disk stop
else
sleep 1
fi && exit

Пояснения.

В процессе работы демона Диска Яндекс в каталоге /temp в наличии имеется каталог с длинным именем yandex-disk-...

В частности, для различных учётных записей у меня создавались каталоги:

yandex-disk-24adc70426bc...
yandex-disk-7b990dc3d61d...
yandex-disk-e0b822b1c9f6...




При остановке демона Диска Яндекс такие каталоги автоматически удалялись системой.

Задание проверяет существование в каталоге /temp каталога, в имени которого присутствует yandex-disk- . Если такой каталог существует, будет выдана команда остановки демона Диска Яндекс. Если такой каталог отсутствует, то задание на 1 секунду "заснёт", а потом будет осуществлено завершение его работы.


Комментариев нет:

Отправить комментарий