From d62d91395fa2cc800c61399a77e8fdb375f639cf Mon Sep 17 00:00:00 2001 From: Mikhail Novosyolov Date: Wed, 1 Sep 2021 14:39:37 +0300 Subject: [PATCH] Describe architecture in README --- Makefile | 3 ++ README.md | 76 +++++++++++++++++++++++++++++++++++++++- cups-backend-copy-raw.sh | 31 +++++++++------- 3 files changed, 97 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index f76a32c..672a189 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ install: mkdir -p $(DESTDIR)/usr/lib/cups/backends install -m0700 cups-backend-copy-raw.sh /usr/lib/cups/backends/bbb-copy-raw + + mkdir -p $(DESTDIR)/usr/local/bigbluebutton/core/scripts/post_archive + install -m0755 post-archive_cups-bbb-copy-raw.rb $(DESTDIR)/usr/local/bigbluebutton/core/scripts/post_archive/20-cups-bbb-copy-raw.rb diff --git a/README.md b/README.md index 0681c1a..44bede6 100644 --- a/README.md +++ b/README.md @@ -22,4 +22,78 @@ CUPS многим известен как сервер печати в UNIX-по Вместо принтера у нас обработчик записей, вместо задания печати ­— исходники записи. -CUPS имеет встроенный функционал, так сказать, кластеризации: может сам распределять задания печати между свободными принтерами, чем мы воспользуемся для распределения заданий обрбаотки записей между несколькими серверами. +CUPS имеет встроенный функционал, так сказать, кластеризации: может сам распределять задания печати между свободными принтерами, чем мы воспользуемся для распределения заданий обработки записей между несколькими серверами. + +Разделяем весь BigBlueButton на следующие сущности: + +1. Модуль проведения вебинаров +1. Модуль конвертирования записей +1. Модуль хранения записей + +Количество каждой сущности может машстабироваться горизонтально. + +Существует и работает центральный сервер CUPS, а также запущен CUPS на каждом модуле. + +Инструменты масштабирования и балансировки нагрузки: + +1. По одному принтеру на поток выполнения задачи (пока принтер занят, занят и поток) +1. Возможность включения и выключения принтера в CUPS + +В веб-интерфейсе центрального CUPS видна картина в целом. + +### Процесс обработки + +#### На сервере печати + +##### Для сбора исходников записей + +1. Создается класс (группа) принтеров для сбора исходников записей +1. Сетевой принтер с обработчика записей добавляется в этот центральный CUPS (`ipps://ip-адрес-обработчика-записей:631/printer-name`) + +##### Для конвертирования записей + +(пока не реализовано) + +1. Каждый принтер типа `bbb-build-recording` (по одному принтеру с каждого обработчика записей) добавляется в этот центральный CUPS (`ipps://ip-адрес-обработчика-записей:631/printer-name`) + +##### Для отправки записей в хранилище + +(пока не реализовано) + +1. Каждый принтер типа `bbb-store` (по одному принтеру с каждого обработчика записей) добавляется в этот центральный CUPS (`ipps://ip-адрес-обработчика-записей:631/printer-name`) + +#### На сервере проведения вебинаров: + +1. Установлен CUPS, добавлен принтер с сервера печати, корень класса принтеров +1. Завершился вебинар +1. BigBlueButton собрал артефакты записи в `/var/bigbluebutton/recording/raw/$meeting_id` +1. BigBlueButton запускает скрипты в `/usr/local/bigbluebutton/core/scripts/post_archive`, в т.ч. наш `20-cups-bbb-copy-raw.rb` (`post-archive_cups-bbb-copy-raw.rb`) +1. Этот скрипт запаковывает каталог `/var/bigbluebutton/recording/raw/$meeting_id` в tar-архив и отправляет на "печать" в CUPS на принтер типа `bbb-copy-raw` (сервер CUPS, с которого "расшарен" принтер, может находиться в другом месте физически и с точки зрения сети, будет выполнена передача потока по сети, а сам сервер передаст полученное задание печати на непосредственно обработчик записи, на котором тоже запущен CUPS) + +#### На обработчике записей + +##### Прием исходников записей + +1. Установлен CUPS +1. Бекенд CUPS `cups-backend-copy-raw.sh` устанавливается в `/usr/lib/cups/backends/bbb-copy-raw`, с правами 0700, чтобы CUPS запускал его от пользователя `root`, а не `lp` +1. Создан принтер типа `bbb-copy-raw` (и добавлен на центральном сервере печати в класс/группу), PPD raw queue, URI принтера имеет вид `bbb-copy-raw://local/var/bigbluebutton/recording/raw`, что означает, что полученные исходники записей будут складываться в `/var/bigbluebutton/recording/raw` +1. CUPS получает задание печати с центрального сервера CUPS +1. Принтер распаковывает tar-архив в нужную директорию, тем самым копируя его содержимое + +##### Обработка записей + +(пока не реализовано) + +1. Бекенд CUPS `cups-backend-build-recording.sh` устанавливается в `/usr/lib/cups/backends/bbb-build-recording`, с правами 0700, чтобы CUPS запускал его от пользователя `root`, а не `lp` +1. Создан принтер(-ы) типа `bbb-build-recording` (и добавлен на центральном сервере печати). Один поток обрбаотки записей — один принтер. +1. На центральный CUPS отправляется задание сборки записи (передать достаточно только ID записи в теле или названии задания), но в качестве принтера указывается принтер типа `bbb-build-recording` с этого узла, что позволяет и запустить задание сборки здесь же, и отразить его в центральном сервере +1. Изнутри CUPS-бекенда `bbb-build-recording` запускается конвертирование записи, задание считается выполненным только по окончанию конвертирования + +##### Отправка записей в хранилище + +(пока не реализовано) + +1. Бекенд CUPS `cups-backend-store.sh` устанавливается в `/usr/lib/cups/backends/bbb-store`, с правами 0700, чтобы CUPS запускал его от пользователя `root`, а не `lp` +1. Создан принтер типа `bbb-store` (и добавлен на центральном сервере печати) +1. На центральный CUPS отправляется задание архивации записи (передать достаточно только ID записи в теле или названии задания), но в качестве принтера указывается принтер типа `bbb-record` с этого узла, что позволяет и запустить задание сборки здесь же, и отразить его в центральном сервере +1. Изнутри CUPS-бекенда `bbb-record` выполняется перемещение результата сборки записи (`/var/bigbluebutton/published/presentation/$meeting_id`) на сервер, хранящий записи, через `mv`/`cp`/`rsync && rm`. Задание печати считается выполненным по окончанию перемещения. diff --git a/cups-backend-copy-raw.sh b/cups-backend-copy-raw.sh index ced4886..d7618d5 100755 --- a/cups-backend-copy-raw.sh +++ b/cups-backend-copy-raw.sh @@ -83,8 +83,6 @@ fi # Examples of valid URIs: # - local/srv/container2/raw # it means copy from /var/bigbluebutton/recording/raw/$meeting_id to /srv/container2/raw/$meeting_id -# - ssh/port/user@host/remote_path (has not been tested and used!) -# it means rsync -av -e "ssh -p $port" /var/bigbluebutton/recording/raw/$meeting_id user@host:/remote_path/ DEVICE_URI="$(echo "$DEVICE_URI" | sed -e 's,^bbb-copy-raw://,,' -e 's,^bbb-copy-raw:/,,')" case "$DEVICE_URI" in local/* ) @@ -98,17 +96,26 @@ case "$DEVICE_URI" in fi mkdir -p "$target_dir"/"$jobtitle" dd if="$input" | tar -C "$target_dir"/"$jobtitle" xf - + echo > "$target_dir"/"$jobtitle"/.cups.copied_raw + chown -R bigbluebutton:bigbluebutton "$target_dir"/"$jobtitle" + # TODO: rebuild recordings via CUPS instead of bbb worker in ruby + #if [ "$target_dir" = /var/bigbluebutton/recording/raw ]; then + # bbb-record --rebuild "$jobtitle" + #fi ;; - ssh/* ) - ssh_port="$(echo "$DEVICE_URI" | awk -F '/' '{print $2}')" - ssh_userhost="$(echo "$DEVICE_URI" | awk -F '/' '{print $3}')" - # ssh/port/user@host/remote_path/dir1/dir2 -> remote_path/dir1/dir2 - # https://stackoverflow.com/a/49130247 - ssh_remote_path="$(echo "$DEVICE_URI" | awk -F '/' '{for(i=4; i<=NF; ++i) printf "%s/", $i;}')" - # TODO: run as sudo -u ssh ... - ssh -p "$ssh_port" "$ssh_userhost" mkdir -p "$ssh_remote_path"/"$jobtitle" - dd if="$input" | ssh -p "$ssh_port" "$ssh_userhost" tar -C "$ssh_remote_path"/"$jobtitle" xf - - ;; +# XXX ssh probably makes no sense here, comment it for now +# ssh can make sense if we use ionotify on directory where new recordings appear and run building task +# but we run CUPS on every wndpoint, so ssh seems to not make any sense +# ssh/* ) +# ssh_port="$(echo "$DEVICE_URI" | awk -F '/' '{print $2}')" +# ssh_userhost="$(echo "$DEVICE_URI" | awk -F '/' '{print $3}')" +# # ssh/port/user@host/remote_path/dir1/dir2 -> remote_path/dir1/dir2 +# # https://stackoverflow.com/a/49130247 +# ssh_remote_path="$(echo "$DEVICE_URI" | awk -F '/' '{for(i=4; i<=NF; ++i) printf "%s/", $i;}')" +# # TODO: run as sudo -u ssh ... +# ssh -p "$ssh_port" "$ssh_userhost" mkdir -p "$ssh_remote_path"/"$jobtitle" +# dd if="$input" | ssh -p "$ssh_port" "$ssh_userhost" tar -C "$ssh_remote_path"/"$jobtitle" xf - +# ;; * ) echo CRIT: Device URI is not supported! 1>&1 exit "$CUPS_BACKEND_FAILED"