Опубликовать и использовать сервис фотобудки

LinuxBeginner
Практиковаться сейчас

Введение

Посетителям Maple Yard нужен небольшой предварительный просмотр фотографий или полный альбом фотобудки. Фотосерверы уже работают, но посетителям не должна требоваться распечатка IP-адреса и порта. Вы опубликуете два именованных сервиса, обнаружите их с клиентов и сохраните соответствующие коллекции изображений, не нарушая работу справочной стойки.

Вы должны распознавать IPv4-адреса, имена узлов, порты, пути и роли терминалов, а также иметь опыт выполнения полных команд скачивания по HTTP. Рекомендуется предыдущий проект по сети мероприятия. Опыт администрирования DNS, работы с XML или программирования не требуется. Оценка в 60 минут включает чтение и обычные ошибки; это оценка автора, а не время, измеренное на новичках.

Publisher, Client и New Client — изолированные сетевые узлы Linux в одной подготовленной LAN, использующие общее ядро. Photo Shelf показывает скачанные файлы. Работа посвящена mDNS и DNS-SD в локальном канале связи, а не публичному DNS, обнаружению через маршрутизаторы, автоматической авторизации или совместимости со всеми физическими устройствами и браузерами. Примеры изображений — оригинальные синтетические иллюстрированные карточки, а не фотографии реальных участников.

Обнаружить работающий сервис

На этом шаге вы воспользуетесь работающей справочной службой, прежде чем что-либо публиковать. Начните в Client. Его терминал открывается в /home/labex/project/photo-network/client; этот каталог и оболочка отделены от других вкладок. pwd выводит текущий каталог:

pwd

Многоадресный DNS (mDNS) позволяет соседним устройствам обмениваться сведениями об именах в одном локальном канале связи. Здесь пакеты используют многоадресный IPv4-адрес 224.0.0.251 и UDP-порт 5353. Суффикс .local относится к этому механизму локального обнаружения; не добавляйте его в hosts-файл платформы и не считайте публичной DNS-зоной.

Обнаружение сервисов на основе DNS (DNS-SD) описывает именованные экземпляры сервисов. Тип сервиса показывает, что ищет клиент: _http._tcp означает HTTP поверх TCP. Имя экземпляра, например Information Desk, обозначает один предлагаемый сервис. Имя целевого узла указывает, какой узел его предоставляет. Порт выбирает слушающее приложение, а метаданные path — ресурс внутри него. Найти имя — лишь начало использования сервиса.

avahi-browse просит штатный демон Avahi обнаружить сервисы. -r разрешает каждый экземпляр в параметры подключения, -t завершает программу после обхода, -p выводит поля через точку с запятой, а -k сохраняет исходные имена типов сервисов вместо их удобных переводов:

avahi-browse -rtpk _http._tcp

Ожидается разрешённая строка, начинающаяся с = и содержащая следующие поля:

=;eth0;IPv4;Information\032Desk;_http._tcp;local;desk.local;10.93.0.10;8080;"path=/welcome/index.json"

Avahi также может выводить строки + для недавно замеченных экземпляров. В машиночитаемом выводе \032 обозначает пробел. Читайте разрешённую строку в порядке: экземпляр, тип, домен, имя целевого узла, адрес, порт и метаданные TXT. Порядок строк и экранирование могут различаться. Штатный демон получает эти записи через данную LAN; заранее подготовленного списка обнаружения нет.

Используйте предоставленный клиент photo-get, чтобы сохранить коллекцию по имени экземпляра. Кавычки сохраняют имя с пробелами как один аргумент. Второй аргумент — выходная папка в рабочем пространстве этого терминала:

photo-get "Information Desk" desk

photo-get снова выполняет реальное обнаружение Avahi, разрешает именно этот экземпляр, выводит точку подключения, получает объявленный JSON-индекс и каждый перечисленный PNG, декодирует все изображения и затем сохраняет полученные байты. Он не берёт IP, порт или путь из плана станций. Индекс содержит имена файлов изображений; это соглашение приложений этих сервисов, а не универсальный формат DNS-SD. Ожидайте Saved 1 real images в папке desk.

Переключитесь в Photo Shelf и выберите Client. Обновите сохранённые файлы. Должна появиться карточка Welcome to Maple Yard. Просмотрщик читает только файлы в рабочем пространстве этого клиента; он ничего не получает с сервера и не дополняет отсутствующие картинки. Ссылка Download image возвращает тот же сохранённый файл.

Сохранённая карточка справочной службы в Photo Shelf

Выбор Client обозначает это рабочее пространство. Карточка справочной службы — работающий образец, который нужно сохранить при добавлении фотобудки.

Если результат пуст, проверьте точный тип сервиса и то, что вы находитесь в Client, затем повторите поиск. Daemon not running означает, что клиент обнаружения не может связаться со своим подготовленным демоном; это не то же самое, что пустой результат. Если photo-get не разрешает имя, сравните написание и кавычки с разрешённой строкой. Отказ в подключении означает, что адрес найден, но на этом порту ничто не принимает соединение. HTTP 404 означает, что сервер достигнут, но путь ресурса отсутствует. Ошибка JSON или декодирования изображения указывает на неподходящее содержимое. Не подменяйте решение этих проблем записью hosts или вручную скопированной картинкой.

Опубликовать фотобудку по полному шаблону

На этом шаге вы объявите существующий сервер предварительного просмотра. Переключитесь в Publisher. Его терминал открывается в /home/labex/project/photo-network/services. cat выводит текстовый файл; ../ означает родительский каталог:

cat ../stations.tsv

Этот бизнес-план описывает реальные подготовленные слушающие сервисы. Photo Booth Preview находится на publisher.local, использует порт 8081 и ресурс /preview/index.json. Полный альбом использует другой слушающий сервис и ресурс. Справочная служба находится на другом узле и должна остаться неизменной.

Прочитайте незавершённое определение предварительного просмотра:

cat preview.service

Файл .service здесь использует XML: открывающие и закрывающие теги окружают каждое значение. service-group содержит отображаемое name; его элемент service задаёт type, port и txt-record. Публикация определения не создаёт веб-сервер, коллекцию или разрешение доступа. Эти приложения уже работают.

Следующий here-document записывает небольшой файл целиком. > заменяет прежнее содержимое. Заключённый в кавычки 'XML' сохраняет буквальный текст; завершающий XML должен стоять один в начале строки. Скопируйте весь блок:

cat > preview.service <<'XML'
<?xml version="1.0" standalone="no"?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name>Photo Booth Preview</name>
  <service>
    <type>_http._tcp</type>
    <port>8081</port>
    <txt-record>path=/preview/index.json</txt-record>
  </service>
</service-group>
XML

Прочитайте сохранённое определение:

cat preview.service

Команда курса photo-load разбирает оба редактируемых XML-файла, прежде чем попросить только демон Avahi узла Publisher перечитать их. Она не перезапускает справочную службу или бизнес-серверы:

photo-load

Ожидайте Reload requested for the photo publisher. Подождите несколько секунд, пока завершатся проверка имени и регистрация. Успешный разбор подтверждает структуру XML, но не правильность объявленного порта или пути. Если закрывающий тег отсутствует, photo-load сообщает имя файла и ошибку разбора, не отправляя запрос перечитывания. Прочитайте файл, восстановите полный блок и снова выполните photo-load. Сбрасывать среду не нужно.

Переключитесь в Client и повторите поиск:

avahi-browse -rtpk _http._tcp

Найдите Photo Booth Preview, его цель publisher.local, порт 8081 и /preview/index.json. Сохраните и декодируйте реальную коллекцию:

photo-get "Photo Booth Preview" preview

Ожидается одно изображение предварительного просмотра. В Photo Shelf выберите Client, обновите страницу и рассмотрите новую карточку рядом с существующей карточкой справочной службы. Появление сервиса в списке без правильного изображения всё ещё означает незавершённую работу.

Различить два сервиса

На этом шаге вы опубликуете полный альбом на том же узле и различите два экземпляра. Переключитесь в Publisher. Оба используют _http._tcp и publisher.local, но альбом использует порт 8082 и /album/index.json. Его три изображения отличаются от предварительного просмотра с одной картинкой.

Запишите отдельное определение с уже изученным синтаксисом here-document:

cat > album.service <<'XML'
<?xml version="1.0" standalone="no"?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name>Photo Booth Full Album</name>
  <service>
    <type>_http._tcp</type>
    <port>8082</port>
    <txt-record>path=/album/index.json</txt-record>
  </service>
</service-group>
XML
photo-load

Переключитесь в Client. Выполните поиск и прочитайте каждую разрешённую строку отдельно:

avahi-browse -rtpk _http._tcp

Имена двух экземпляров должны различаться. Общее имя узла не означает общий порт или ресурс. Скачайте альбом в отдельную папку, сохранив предварительный просмотр:

photo-get "Photo Booth Full Album" album

Ожидайте три декодированных PNG и Saved 3 real images. В Photo Shelf выберите Client и обновите страницу. Альбом и предварительный просмотр должны показывать собственные сохранённые файлы.

Теперь потренируйтесь распознавать неверный ресурс, не изменяя и не удаляя правильные коллекции. Намеренно отсутствующее имя экземпляра должно вызвать ошибку до скачивания:

photo-get "Photo Booth Missing" missing

Ожидайте Download stopped: Expected one resolved instance и ненулевой код завершения. Это намеренный сбой. Восстановите результат, снова использовав фактическое разрешённое имя альбома:

photo-get "Photo Booth Full Album" album

Если объявлен неправильный порт или путь, сравните разрешённую строку экземпляра с stations.tsv. Исправьте только соответствующий файл .service в Publisher с помощью приведённого полного блока, выполните photo-load, затем повторите поиск и скачивание в Client. Неправильный порт может отклонить соединение; неправильный путь может вернуть HTTP 404; доступная, но другая коллекция может успешно декодироваться и всё равно быть неверным бизнес-результатом. Проверяйте название коллекции и имена файлов, а не только нулевой код завершения.

Avahi объявляет изменения и снятие публикаций. Пока обновление распространяется, клиент может кратковременно хранить старые записи. После загрузки подождите несколько секунд и повторите поиск; не продолжайте использовать скопированные старые точки подключения. На следующем шаге проверка выполняется с независимого клиентского демона и рабочего пространства.

Использовать результат с другого клиента

На этом шаге вы используете другую сетевую идентичность и независимый демон Avahi. Переключитесь в New Client. Он начинает работу в /home/labex/project/photo-network/new-client; по умолчанию переменные оболочки и сохранённые коллекции первого клиента ему не передаются. Открытие вкладки не сбрасывает публикующий узел и не создаёт объявления.

Выполните поиск с этого клиента, а не копируйте строки первого:

avahi-browse -rtpk _http._tcp

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

photo-get "Photo Booth Preview" preview
photo-get "Photo Booth Full Album" album
photo-get "Information Desk" desk

Ожидаются одно изображение предварительного просмотра, три изображения альбома и одна карточка справочной службы. Каждый вызов снова разрешает именованный экземпляр и выводит фактически использованную точку подключения. Эти команды не настраивают обнаружение по статическому IP.

Переключитесь в Photo Shelf, выберите New Client и обновите страницу. Рассмотрите каждое изображение и название коллекции. Нажмите Download image на карточке сохранённого изображения: скачанный файл должен совпадать с показанной сохранённой карточкой. Просмотрщик не копирует незаметно работу первого клиента и не восполняет отсутствующие файлы. Переключайтесь между Client и New Client, чтобы видеть их отдельные коллекции.

Все три коллекции сохранены на независимом клиенте

Найдите выбор New Client, три карточки альбома, карточку справочной службы и отдельную карточку предварительного просмотра. Каждая ссылка Download image относится к действительно сохранённому файлу.

Если коллекция отсутствует, вернитесь в New Client, проверьте текущее объявление и повторите её скачивание. Если сохранённого PNG нет или он не читается, просмотрщик сообщает об этом, а не заменяет его. Сначала исправьте публикацию или соединение, затем повторите photo-get для получения полной исходной коллекции. Скачивание успешно только после получения и декодирования полного индекса и всех изображений.

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

Резюме

Вы просмотрели штатные записи mDNS/DNS-SD, отличили имена экземпляров от имён узлов и опубликовали два HTTP-сервиса с разными портами и метаданными пути. По каждому реальному результату обнаружения вы скачали декодируемые изображения, повторили процесс с независимого клиента и сохранили доступность справочной службы. Строка обнаружения и успешное соединение — разные свидетельства; правильное сохранённое содержимое завершает результат.