Необходимо разработать приложение командной строки (CLI) для управления альбомами, фотографиями в облачном хранилище Yandex Object Storage, для формирования и публикации веб-страниц фотоархива.
1. Наименование программы
Программа должна называться cloudphoto.
2. Функциональные требования
Программа cloudphoto должна выполнять следующие команды:
-
upload— отправка фотографий в облачное хранилище. -
download— загрузка фотографий из облачного хранилища. -
list— вывод списка альбомов и фотографий в облачном хранилище. -
delete— удаление альбомов и фотографий в облачном хранилище. -
mksite— формирование и публикация веб-страниц фотоархива. -
init— инициализация программы.
Команды могут иметь опции.
cloudphoto COMMAND [OPTION]...
2.1. Отправка фотографий в облачное хранилище
Для отправки фотографий в облачное хранилище используется команда upload.
Синтаксис команды upload
cloudphoto upload --album ALBUM [--path PHOTOS_DIR]
Требования для реализации команды upload
-
Если опция
--pathне задана, то программаcloudphotoдолжна в качествеPHOTOS_DIRиспользовать текущий каталог. -
Если в облачном хранилище существует альбом с именем
ALBUM, то программаcloudphotoдолжна отправить все фотографии из каталога с именемPHOTOS_DIR(без обхода вложенных подкаталогов) в облачное хранилище и привязать их к альбому с именемALBUM. -
Если в облачном хранилище нет альбома с именем
ALBUM, то программаcloudphotoдолжна создать в облачном хранилище альбом с именемALBUM, а так же отправить все фотографии из каталогаPHOTOS_DIR(без обхода вложенных подкаталогов) в облачное хранилище и привязать их к альбому с именемALBUM. -
Программа
cloudphotoдолжна для каждой фотографии сохранить в облачном хранилище имя отправляемого файла с учётом регистра символов (далее — исходное имя файла). -
Если в облачном хранилище в альбоме с именем
ALBUMсуществует фотография, у которой исходное имя файла совпадает с именем отправляемого файла, то программаcloudphotoдолжна заменить фотографию в облачном хранилище на отправляемую фотографию. -
Ели при отправке фотографии в облачное хранилище произошла ошибка любого характера, то программа
cloudphotoдолжна вывести предупреждение и продолжить отправку других файлов. -
Если каталог с именем
PHOTOS_DIRне доступен, то программаcloudphotoдолжна завершиться с ошибкой. -
Если в каталоге с именем
PHOTOS_DIRнет фотографий, то программаcloudphotoдолжна завершиться с ошибкой.
2.2. Загрузка фотографий из облачного хранилища
Для загрузки фотографий из облачного хранилища используется команда download.
Синтаксис команды download
cloudphoto download --album ALBUM [--path PHOTOS_DIR]
Требования для реализации команды download
-
Если опция
--pathне задана, то программаcloudphotoдолжна в качествеPHOTOS_DIRиспользовать текущий каталог. -
Программа
cloudphotoдолжна загрузить из облачного хранилища все фотографии из альбома с именемALBUMи сохранить их в каталог с именемPHOTOS_DIR. -
При сохранении фотографий программа
cloudphotoдолжна задать имя для сохраняемого файла такое же как исходное имя файла загружаемой фотографии. -
Если при сохранении фотографии в каталоге
PHOTOS_DIRсуществует файл таким же именем как исходное имя файла у фотографии, то программаcloudphotoдолжна заменить существующей файл на фотографию их облачного хранилища. -
Если каталог с именем
PHOTOS_DIRне доступен для сохранения файлов, то программаcloudphotoдолжна завершиться с ошибкой. -
Если в облачном хранилище нет альбома с именем
ALBUM, то программаcloudphotoдолжна завершиться с ошибкой.
2.3. Просмотр списка альбомов и фотографий в альбоме
Для просмотра списка альбомов и фотографий в облачном хранилище используется команда list.
Синтаксис команды list
cloudphoto list [--album ALBUM]
Требования для реализации команды list
-
Если не указана опция
--album, то программаcloudphotoдолжна вывести наименование всех альбомов в облачном хранилище. Каждое имя альбома должно выводиться на отдельной строке. -
Если задана опция
--album, то программаcloudphotoдолжна вывести имена исходных файлов всех фотографий в альбоме с именемALBUM. Каждое исходное имя файла должно выводиться на отдельной строке. -
Если не указана опция
--albumи в облачном хранилище нет альбомом, то программаcloudphotoдолжна завершиться с ошибкой. -
Если задана опция
--albumи в облачном хранилище нет альбома с именемALBUM, то программаcloudphotoдолжна завершиться с ошибкой. -
Если задана опция
--albumи в альбоме с именемALBUMнет фотографий, то программаcloudphotoдолжна завершиться с ошибкой.
2.4. Удаление альбомов и фотографий
Для удаления альбомов и фотографий в облачном хранилище используется команда delete.
Синтаксис команды delete
cloudphoto delete --album ALBUM [--photo PHOTO]
Требования для реализации команды delete
-
Если не указана опция
--photo, то программаcloudphotoдолжна удалить в облачном хранилище все фотографии из альбома с именемALBUMи удалить альбом с именемALBUM. -
Если не указана опция
--photoи в облачном хранилище в альбоме с именемALBUMнет фотографий, то программаcloudphotoдолжна удалить альбом с именемALBUM. -
Если задана опция
--photo, то программаcloudphotoдолжна удалить в облачном хранилище в альбоме с именемALBUMфотографию с исходным именемPHOTO. -
Если в облачном хранилище нет альбома
ALBUM, то программаcloudphotoдолжна завершиться с ошибкой. -
Если задана опция
--photoи в облачном хранилище в альбоме с именемALBUMнет фотографии с исходным именемPHOTO, то программаcloudphotoдолжна завершиться с ошибкой.
2.5. Генерация и публикация веб-страниц фотоархива
Синтаксис команды mksite
cloudphoto mksite
Требования для реализации команды mksite
-
Программа
cloudphotoдолжна настроить для бакета публичный доступ на чтение объектов и добавить настройку хостинга статического сайта со следующими значениями параметров:-
для параметра Главная страница сайта значение
index.html, -
для параметра Страница ошибки значение
error.html.
-
-
Программа
cloudphotoдолжна временно пронумеровать альбомы натуральными числами от 1 до числа равного количеству альбомов, далее для каждого альбома сформировать HTML документ по шаблону "Шаблон HTML документа "Страница альбома"" и сохранить его в облачном хранилище в объекте с уникальным ключомalbum{N}.html, где вместо{N}вставить временный номер альбома. Если в облачном хранилище существует объект с ключомalbum{N}.html, то программаcloudphotoдолжна заменить его новым. -
Программа
cloudphotoдолжна сформировать HTML документ по шаблону "Шаблон HTML документа "Индексная страница"" и сохранить его в облачном хранилище с ключомindex.html. Если в облачном хранилище существует объект с ключомindex.html, то программаcloudphotoдолжна заменить его новым. -
Программа
cloudphotoдолжна сформировать HTML документ по шаблону "Шаблон HTML документа "Страница ошибки"" и сохранить его в облачном хранилище с ключомerror.html. Если в облачном хранилище существует объект с ключомerror.html, то программаcloudphotoдолжна заменить его новым. -
Программа
cloudphotoдолжна вывести ссылкуhttps://bucket_name.website.yandexcloud.net/, гдеbucket_name, должен быть заменён на название бакета, которое указано в конфигурационном файле.
2.6. Инициализация программы
Для формирования файла настроек и создания бакета используется команда init.
Синтаксис команды init
cloudphoto init
Требования для реализации команды init
-
Программа
cloudphotoдолжна в интерактивном режиме запросить у пользователя значение параметров:aws_access_key_id,aws_secret_access_key,bucketи сохранить их в конфигурационном файле. -
Если в облачном хранилище нет бакета с именем, которое указано в конфигурационном файле, то программа
cloudphotoдолжна создать в облачном хранилище бакет с именем, которое указано в конфигурационном файле.
3. Дополнительные требования
3.1. Требования к исполнению
-
Программа
cloudphotoдолжна запускаться в Unix подобных операционных системах, включая подсистему WSL2 в Windows и дополнительные требования к программеcloudphotoописаны с учётом этой особенности. -
При запуске программа
cloudphotoдолжна проверить наличие конфигурационного файла и заполненность всех параметров, кроме запуска с командойinit, и если конфигурационный файл не доступен или в нём заполнены не все параметры, то программаcloudphotoдолжна завершиться с ошибкой. -
Если не корректно заданы опции у команды или указана не действительная команда, то программа
cloudphotoдолжна завершиться с ошибкой. -
Программа
cloudphotoдолжна данные выводить на стандартный поток вывода (stdout), а сообщения об ошибках и предупреждения выводить на стандартный поток для ошибок (stderr). -
Программа
cloudphotoдолжна данные от пользователя считывать со стандартного потока ввода (stdin). -
При завершении без ошибок программа
cloudphotoдолжна завершаться с код возврата (exit status) равным 0. -
При завершении с ошибками программа
cloudphotoдолжна завершаться с код возврата (exit status) равным 1.
3.2. Требования к настройкам
-
Конфигурационный файл программы
cloudphotoдолжен находиться в домашнем каталоге пользователя по пути.config/cloudphoto/cloudphotorc. -
Формат конфигурационного файла должен соответствовать шаблону "Формат конфигурационного файла (ini-файл)".
-
Программа
cloudphotoне должна зависеть от других конфигурационных файлов и от специальных переменных окружения.
3.3. Требование к файлам с фотографиями
Для данного задания файл с фотографией — это файл, имя которого в независимости от регистра оканчивается на:
-
.jpg -
.jpeg
3.4. Требования к организации облачного хранилища
Все альбомы, фотографии, веб-страницы должны храниться в одном бакете, который указан в настройках программы cloudphoto.
3.5. Требования к регистрам символов
Везде где есть сравнение текстовых строк, такое сравнение должно выполняться с учётом регистра символов, если не указано иное сравнение.
4. Шаблоны
Шаблон HTML документа "Индексная страница"
<!doctype html>
<html>
<head>
<title>Фотоархив</title>
</head>
<body>
<h1>Фотоархив</h1>
<ul>(1)
<li><a href="album1.html">Имя альбома 1</a></li>
<li><a href="album2.html">Имя альбома 2</a></li>
<li><a href="...">...</a></li>
<li><a href="album{N}.html">Имя альбома N</a></li>
</ul>
</body
| 1 | В списке нужно перечислить все ссылки на страницы альбомом и указать имена альбомов. |
Шаблон HTML документа "Страница альбома"
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/galleria/1.6.1/themes/classic/galleria.classic.min.css" />
<style>
.galleria{ width: 960px; height: 540px; background: #000 }
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/galleria/1.6.1/galleria.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/galleria/1.6.1/themes/classic/galleria.classic.min.js"></script>
</head>
<body>
<div class="galleria">(1)
<img src="URL_на_фотографию_1_в_альбоме" data-title="Имя_исходного_файла_фотографии_1">
<img src="URL_на_фотографию_2_в_альбоме" data-title="Имя_исходного_файла_фотографии_2">
<img src="..." data-title="...">
<img src="URL_на_фотографию_N_в_альбоме" data-title="Имя_исходного_файла_фотографии_N">
</div>
<p>Вернуться на <a href="index.html">главную страницу</a> фотоархива</p>
<script>
(function() {
Galleria.run('.galleria');
}());
</script>
</body>
</html>
| 1 | В блоке нужно сформировать тег img для каждой фотографии в альбоме с указанием ссылки на фотографию и имени исходного файла фотографии. |
Шаблон HTML документа "Страница ошибки"
<!doctype html>
<html>
<head>
<title>Фотоархив</title>
</head>
<body>
<h1>Ошибка</h1>
<p>Ошибка при доступе к фотоархиву. Вернитесь на <a href="index.html">главную страницу</a> фотоархива.</p>
</body>
</html>
Формат конфигурационного файла (ini-файл)
[DEFAULT]
bucket = INPUT_BUCKET_NAME (1)
aws_access_key_id = INPUT_AWS_ACCESS_KEY_ID (2)
aws_secret_access_key = INPUT_AWS_SECRET_ACCESS_KEY (3)
region = ru-central1 (4)
endpoint_url = https://storage.yandexcloud.net (5)
| 1 | При инициализации INPUT_BUCKET_NAME заменяется на название бакета, которое ввёл пользователь. |
| 2 | При инициализации INPUT_AWS_ACCESS_KEY_ID заменяется на идентификатор секретного статического ключа, который ввёл пользователь. |
| 3 | При инициализации INPUT_AWS_SECRET_ACCESS_KEY заменяется на секретный статичный ключа, которое ввёл пользователь. |
| 4 | Строка не меняется. |
| 5 | Строка не меняется. |