Тема из мультфильма «Новогодняя сказка», 1972 г., композитор Оскар Фельцман.
В тростниках просохли кочки,
Зацвели каштаны в Тусе,
Плачет розовая дочка
Благородного Фердуси:
«Больше куклы мне не снятся,
Женихи густой толпою
У дверей моих теснятся,
Как бараны к водопою.
Вы, надеюсь, мне дадите
Одного назвать желанным.
Уважаемый родитель!
Как дела с моим приданым?»
Отвечает пылкой дочке
Добродетельный Фердуси:
«На деревьях взбухли почки.
В облаках курлычут гуси.
В вашем сердце полной чашей
Ходит паводок весенний,
Но, увы: к несчастью, ваши
Справедливы опасенья.
В нашей бочке — мерка риса,
Да и то еще едва ли.
Мы куда бедней, чем крыса,
Что живет у нас в подвале.
Но уймите, дочь, досаду,
Не горюйте слишком рано:
Завтра утром я засяду
За сказания Ирана,
За богов и за героев,
За сраженья и победы
И, старания утроив,
Их окончу до обеда,
Чтобы вился стих чудесный
Легким золотом по черни,
Чтобы шах прекрасной песней
Насладился в час вечерний.
Шах прочтет и караваном
Круглых войлочных верблюдов
Нам пришлет цветные ткани
И серебряные блюда,
Шелк и бисерные нити,
И мускат с имбирем пряным,
И тогда, кого хотите,
Назовете вы желанным».
В тростниках размокли кочки,
Отцвели каштаны в Тусе,
И опять стучится дочка
К благодушному Фердуси:
«Третий месяц вы не спите
За своим занятьем странным.
Уважаемый родитель!
Как дела с моим приданым?
Поглядевши, как пылает
Огонек у вас ночами,
Все соседи пожимают
Угловатыми плечами».
Отвечает пылкой дочке
Рассудительный Фердуси:
«На деревьях мерзнут почки,
В облаках умолкли гуси,
Труд — глубокая криница,
Зачерпнул я влаги мало,
И алмазов на страницах
Лишь немного заблистало.
Не волнуйтесь, подождите,
Год я буду неустанным,
И тогда, кого хотите,
Назовете вы желанным».
Через год просохли кочки,
Зацвели каштаны в Тусе,
И опять стучится дочка
К терпеливому Фердуси:
«Где же бисерные нити
И мускат с имбирем пряным?
Уважаемый родитель!
Как дела с моим приданым?
Женихов толпа устала
Ожиданием томиться.
Иль опять алмазов мало
Заблистало на страницах?»
Отвечает гневной дочке
Опечаленный Фердуси:
«Поглядите в эти строчки,
Я за труд взялся не труся,
Но должны еще чудесней
Быть завязки приключений,
Чтобы шах прекрасной песней
Насладился в час вечерний.
Не волнуйтесь, подождите,
Разве каплет над Ираном?
Будет день, кого хотите,
Назовете вы желанным».
Баня старая закрылась,
И открылся новый рынок.
На макушке засветилась
Тюбетейка из сединок.
Чуть ползет перо поэта
И поскрипывает тише.
Чередой проходят лета,
Дочка ждет, Фердуси пишет.
В тростниках размокли кочки,
Отцвели каштаны в Тусе.
Вновь стучится злая дочка
К одряхлелому Фердуси:
«Жизнь прошла, а вы сидите
Над писаньем окаянным.
Уважаемый родитель!
Как дела с моим приданым?
Вы, как заяц, поседели,
Стали злым и желтоносым,
Вы над песней просидели
Двадцать зим и двадцать весен.
Двадцать раз любили гуси,
Двадцать раз взбухали почки.
Вы оставили, Фердуси,
В старых девах вашу дочку».
«Будут груши, будут фиги,
И халаты, и рубахи.
Я вчера окончил книгу
И с купцом отправил к шаху.
Холм песчаный не остынет
За дорожным поворотом —
Тридцать странников пустыни
Подойдут к моим воротам».
Посреди придворных близких
Шах сидел в своем серале.
С ним лежали одалиски,
И скопцы ему играли.
Шах глядел, как пляшут триста
Юных дев, и бровью двигал.
Переписанную чисто
Звездочет приносит книгу:
«Шаху прислан дар поэтом,
Стихотворцем поседелым…»
Шах сказал: «Но разве это —
Государственное дело?
Я пришел к моим невестам,
Я сижу в моем гареме.
Тут читать совсем не место
И писать совсем не время.
Я потом прочту записки,
Небольшая в том утрата».
Улыбнулись одалиски,
Захихикали кастраты.
В тростниках просохли кочки,
Зацвели каштаны в Тусе.
Кличет сгорбленную дочку
Добродетельный Фердуси:
«Сослужите службу ныне
Старику, что видит худо:
Не идут ли по долине
Тридцать войлочных верблюдов?»
«Не бегут к дороге дети,
Колокольцы не бренчали,
В поле только легкий ветер
Разметает прах песчаный».
На деревьях мерзнут почки,
В облаках умолкли гуси,
И опять взывает к дочке
Опечаленный Фердуси:
«Я сквозь бельма, старец древний,
Вижу мир, как рыба в тине.
Не стоят ли у деревни
Тридцать странников пустыни?»
«Не бегут к дороге дети,
Колокольцы не бренчали.
В поле только легкий ветер
Разметает прах песчаный».
Вот посол, пестро одетый,
Все дворы обходит в Тусе:
«Где живет звезда поэтов —
Ослепительный Фердуси?
Вьется стих его чудесный
Легким золотом по черни,
Падишах прекрасной песней
Насладился в час вечерний.
Шах в дворце своем — и ныне
Он прислал певцу оттуда
Тридцать странников пустыни,
Тридцать войлочных верблюдов,
Ткани солнечного цвета,
Полосатые бурнусы…
Где живет звезда поэтов —
Ослепительный Фердуси?»
Стон верблюдов горбоносых
У ворот восточных где-то,
А из западных выносят
Тело старого поэта.
Бормоча и приседая,
Как рассохшаяся бочка,
Караван встречать — седая —
На крыльцо выходит дочка:
«Ах, медлительные люди!
Вы немножко опоздали.
Мой отец носить не будет
Ни халатов, ни сандалий.
Если шитые иголкой
Платья нашивал он прежде,
То теперь он носит только
Деревянные одежды.
Если раньше в жажде горькой
Из ручья черпал рукою,
То теперь он любит только
Воду вечного покоя.
Мой жених крылами чертит
Страшный след на поле бранном.
Джинна близкой-близкой смерти
Я зову моим желанным.
Он просить за мной не будет
Ни халатов, ни сандалий…
Ах, медлительные люди!
Вы немножко опоздали».
Встал над Тусом вечер синий,
И гуськом идут оттуда
Тридцать странников пустыни,
Тридцать войлочных верблюдов.
Дмитрий Кедрин, 1935 г.
Сетевое хранилище, история которого началась в марте 2018 года, продолжает свою работу. После пересадки в новый корпус в начале 2020-го никаких событий, связанных с ним, не происходило, за исключением замены вышедшей из строя флешки, на которой стояла система, на 120 ГБ SSD Gigabyte GP-GSTF в августе того же года.
На днях я обнаружил, что вышел OpenMediaVault версии 6 — надо обновиться, чтобы не отставать от прогресса и заодно разнообразить своё существование.
Обновление прошло безо всяких проблем, интерфейс стал более крупным, что, видимо, связано с увеличением средней диагонали и разрешения мониторов. Вообще, симпатично.

После ужина обновил систему на своём сервере-неттопе, а потом решил ещё разик поковырять давно висевшее предупреждение в Nextcloud:
The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If not, this is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud. Further information can be found in the documentation.
Сначала я попробовал добавить в параметр trusted_proxies конфигурации Nextcloud не имя контейнера реверс-прокси, а приватный диапазон IP, используемый Докером — 172.16.0.0/12; так много где советуют сделать, но это ничего не дало. В конце концов, проблема решилась заданием того же имени контейнера, но не единым параметром, а первым элементом массива, а также установкой ожидаемого заголовка пересылки.
docker exec -uwww-data nc-php php /var/www/html/cloud/occ config:system:set forwarded_for_headers 0 --value="X-Forwarded-For"
docker exec -uwww-data nc-php php /var/www/html/cloud/occ config:system:set trusted_proxies 0 --value="reverse-proxy"
Наконец-то:

Ободрённый успехом, я решил обновить контейнер с PHP 7.4 на PHP 8.0. Он у меня самосборный — это Alpine c последующей установкой необходимых пакетов и настройкой с помощью командной строки. Я поменял пакеты в Dockerfile на соответствующую версию и поправил пути, пересобрал контейнер, и вроде как заработало, но перестали выполняться команды, вызывающие php, подобные приведённым выше, и остановился cron, выполняющий фоновые задания. Ошибка была такая:
OCI runtime exec failed: exec failed: unable to start container process: exec: ″php″: executable file not found in $PATH: unknown
Полез внутрь контейнера. Команда php8 выполняется, а php — нет. Оказалось, что в дистрибутиве Alpine для php8 не готовы пакеты, поэтому символическая ссылка автоматически при установке не прописывается. Речь об этом шла год назад, не знаю, та же причина сейчас или нет, но результат всё равно один. Добавил ещё одну строчку в Dockerfile, после чего всё заработало:
ln -sf /usr/bin/php8 /usr/bin/php

Заодно напишу про упомянутый в прошлом тексте выпуск сертификатов Let’s Encrypt для HAProxy. Всё получилось и отлично работает. У Certbot есть каталог /etc/letsencrypt/renewal-hooks/deploy, и если туда положить скрипт, то он будет выполняться после каждого успешного перевыпуска сертификата. В данном случае нужно слепить полную цепочку сертификатов и закрытый ключ в одно целое, положив результат в каталог сертификатов HAProxy:
#!/bin/bash
cat $RENEWED_LINEAGE/{fullchain.pem,privkey.pem} > /etc/ssl/certs/haproxy/$(basename $RENEWED_LINEAGE).pem
# --deploy-hook DEPLOY_HOOK
#    Command to be run in a shell once for each
#    successfully issued certificate. For this command, the
#    shell variable $RENEWED_LINEAGE will point to the
#    config live subdirectory (for example,
#    "/etc/letsencrypt/live/example.com") containing the
#    new certificates and keys; the shell variable
#    $RENEWED_DOMAINS will contain a space-delimited list
#    of renewed certificate domains (for example,
#    "example.com www.example.com") (default: None)
Чтобы сертификат подхватился, HAProxy должен перечитать конфигурацию. Можно, конечно, добавить строку и в скрипт, приведённый выше, но если сертификатов выпускается сразу штук десять, то столько раз дёргать реверс-прокси за несколько секунд вряд ли хорошая идея. Поэтому я сделал отдельный скрипт, который ищет сертификаты с датой изменения меньше суток, и если они есть, перечитывает конфигурацию:
#!/bin/bash
if [[ $(find /etc/ssl/certs/haproxy/* -mtime -1) ]]
then
systemctl reload haproxy.service
fi
В cron нужно добавить запуск этого скрипта раз в сутки, например, в 3 часа ночи:
echo -e "\n# Reload HAProxy if there are new certs\n0 3\t* * *\troot\t/scripts/haproxy-reload-if-new-certs.sh" >> /etc/crontab
Ну, с праздничком всех причастных и сочувствующих, спокойной ночи.
Берём «железный» linux-сервер, например, Ubuntu 22.04 LTS, на котором есть порты USB, вставляем туда ключ HASP, широко использующийся для аппаратной защиты программ типа 1С или цифровой подписи. Проверяем, определился ли он в системе:

Определился, прекрасно. Теперь ставим usbip.
# Установка (usbip входит в стандартный набор утилит)
apt install linux-tools-common linux-tools-generic
# Вкл модуль ядра для сервера:
modprobe usbip-host
echo "usbip-host" >> /etc/modules
# Вкл службу
usbipd -D
# Проверить версию
usbip version # usbip (usbip-utils 2.0)
Выводим список локальных устройств usbip и предоставляем нужное устройство в общий доступ.

Теперь нужно настраивать клиента, в данном случае на Windows 11, работающей в виртуальной среде Hyper-V, где, как известно, USB с хоста пробросить в виртуалку нельзя (и это правильно). Предварительно на клиентской машине необходимо установить драйвер usbip, а для этого импортировать сертификат, идущий в комплекте, и отключать цифровую подпись драйверов. Это можно сделать из меню восстановления при загрузке, так как команда bcdedit /set TESTSIGNING ON в современных системах Windows уже не действует.
Итак, драйвер установлен, теперь можно посмотреть, какие устройства доступны на удалённом сервере, и подключить нужное.

Работает! Наш ключ определился как три устройства Sentinel (после установки драйверов HASP). Ниже виден ранее установленный usbip.

Чтобы отключить устройство от клиента, нужно знать порт usbip, на котором оно сидит.

Всё функционирует корректно. Флешка и внешний привод DVD-RW тоже успешно подключаются, а вот веб-камеру мне пробросить на Windows не удалось.
Конечно, применимость этой технологии в промышленной среде под вопросом, прежде всего из-за возни с неподписанными драйверами и отключения механизма проверки подписи для Windows-клиента (Upd: автор подписал драйвер, теперь всё гораздо проще). Как будут себя вести клиенты, если сервер перезагрузится? А если убрать устройство на сервере без отключения на клиенте - как восстанавливать работу, не повиснет ли система? Вопросами автоматической привязки и подключения устройств на сервере и клиентах я также пока не занимался, хотя и знаю, что это возможно. Ещё одной особенностью, которую необходимо учитывать, является невозможность ограничения доступа к USB-устройству, опубликованному на сервере; по всей видимости, нужно будет это делать с помощью межсетевого экрана.
Тем не менее, технология интересная и потенциально полезная, нужно только как-то грамотно подобрать железо для сервера ключей - а им может быть что угодно, хоть Raspberry Pi - и получше оттестировать её.

