Здравствуйте, коллеги!

Новый год подкрадывается всё ближе, а это значит, что нам снова пора собраться вместе для того чтобы хорошо провести время!

Для тех кто еще не знаком с новогодним хабрачатом, расскажу немного про него. Это несколько чатов на разных платформах, объединенных мостом. Боты в каждой из платформ пересылают сообщения из остальных и получается, что все как-бы находятся в одном чате, при этом не покидая любимой платформы. В этом чате мы традиционно встречаем Новый год уже четвертый раз (в прошлом году только в одном SSH-чате было больше сотни человек).

В центре внимания, конечно, SSH-чат, который работает только несколько дней до нового года и несколько после. В этом году разные люди также подняли чаты в XMPP (Jabber), Телеграме и IRC. Также традиционно есть чат-бот tars, который может вывести ёлку и поздравить с новым годом. В прошлые года таких ботов делали несколько человек (кто-то даже на баше).

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

Настраиваем SSH-чат

SSH-чат обычно открывает @podivilov, для этого используется кастомный SSH сервер, написанный на go. Устанавливается и настраивается он довольно просто. Для начала можно освободить стандартный порт SSH, чтобы при заходе в наш чат не вводить порт. В ubuntu server, например, это делается так. В файле /etc/ssh/sshd_config находим строку Port 22 и меняем число на нужный порт. После этого перезапускаем ssh демон sudo systemctl restart sshd и стандартный порт свободен (убедитесь, что фаерфол пропустит вас по новому порту).

Скачивается бинарник под нужную платформу из релизов на github. Можно положить его, например, в /usr/bin. Далее пишем простой скрипт, который будет перезапускать сервер, в случае падения. (Этот вариант не очень хорош, советую делать так, как в этой статье)

Скрипт для запуска сервера start.sh
#!/bin/bash

while :
do

/usr/bin/ssh-chat --admin=/root/.config/ssh-chat/admins --bind=0.0.0.0:22 --log /root/ssh-chat.log --motd=/root/.config/ssh-chat/motd

sleep 1

done

Давайте разберем параметры запуска

  • admin путь до файла со списком публичных ключей администраторов (у них стандартный набор возможностей: кик, бан и прочее)

  • bind айпи и порт, на котором сервер будет транслировать

  • log путь до файла с логами чата

  • motd путь до файла с сообщением дня (message of the day), которое будет показываться при каждом заходе в чат

Теперь мы можем запустить этот скрипт любым удобным способом (в сессии tmux/screen, через systemctl и т.д.) и чат готов. Вводим ssh nickname@habr2021.podivilov.ru и попадаем в наш чат. Для списка комманд нужно ввести /help, а для выхода /exit или Ctrl+D.

Настраиваем мост между чатами

Мост уже который год хостит @mrDoctorWho, для этого используется matterbridge, который кстати тоже написан на go. Его установка и настройка, как ни странно происходит точно так же. Скачиваем бинарник из релизов на github и кладем его, куда нам надо. Далее пишем конфигурационный файл и скрипт старта. Как-то так выглядит конфиг от @mrDoctorWho:

Файл конфигурации matterbridge.toml
[xmpp.myxmpp]
Server="helldev.net:5222"
#Jid your userid
Jid=""
Password=""
Muc="conference.helldev.net"
Nick="bridge"
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "


[sshchat.mychat]
Server="habr2021.podivilov.ru:22"
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "

[telegram.mytelegram]
Token=""
RemoteNickFormat="[{PROTOCOL}] `<{NICK}>` "
MessageFormat="Markdown"

[general]
MediaDownloadPath="/var/www/"
MediaServerDownload="https://helldev.net/"


[[gateway]]
name="gateway1"
enable=true


[[gateway.inout]]
account="telegram.mytelegram"
channel="-1001200239638"

[[gateway.inout]]
account="sshchat.mychat"
channel="sshchat"

[[gateway.inout]]
account="xmpp.myxmpp"
channel="ny"

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

А вот скрипт запуска, который почти ничем не отличается от скрипта для SSH-чата:

Скипт для запуска моста start.sh
#!/bin/bash

while :
do

/usr/bin/matterbridge -conf /root/.config/matterbridge/matterbridge.toml

sleep 1

done

После старта этого скрипта мы имеем полностью работающий мост между всеми нашими чатами.

Создание чат бота

Чат-бот, который гуляет по чатам уже который год подряд, называется tars. Бот поздравляет с Новым годом, выводит новогоднюю ёлку ASCII-артом и имеет несколько других команд, в зависимости от того, кто его делал. Первая версия была запущена три года назад, к сожалению не помню кем. Бот был написан на bash-скрипте с использованием screen.

Свою версию я писал на JavaScript с использованием только стандартных библиотек. С его исходным кодом можно ознакомиться здесь. Если вкратце, он вызвает процесс командной строки с помощью модуля child_process (в зависимости от операционной системы, используются либо bash.exe, либо bash). Далее он открывает ssh сессию может писать либо читать прямо из нее. Кроме этого, код довольно заурядный, с его последней версией вы можете ознакомиться на гитхабе.

Как попасть в чаты

Выбирайте любой понравившийся и присоединяйтесь. С наступающим Новым Годом!