XMPP-эхо-бот
Знаете ли вы такую ситуацию: вам действительно нужен эхо-бот XMPP, но у вас нет доступа к инструментам высокого уровня, таким как Python, для его написания? Все, что у вас есть, это openssl, bash, dig, stdbuf и sed? Тогда этот инструмент для вас.
Это эхо-бот XMPP, написанный (в основном) на sed. Bash используется для настройки предварительной аутентификации (поиск записей DNS, установка TLS через openssl s_client
). sed обрабатывает поток XML и осуществляет все взаимодействие с сервером на уровне XMPP. Да, это своего рода анализ XML в sed.
Протестировано для работы с Prosody 0.9.
Использование
./echoz.sh пароль пользователя@домена
Поддерживаемые функции
- Неофициальные сообщения
- XEP-0092 (версия программного обеспечения)
- XEP-0199 (Пинг XMPP)
Отзывы
- Это безумие, я еще не разбил его! — Мэтью Уайлд
- Я напуган. До обретения сознания всего два шага. — Георг Лукас
- Я одновременно потрясен и в восторге. вау — Лэнс
- Благодаря Echoz.sed мы смогли сократить затраты на сервер XMPP Echo на 90 % по сравнению с нашим предыдущим решением на базе TeX. — Леон
- Несмотря на простоту и ограниченность, sed является достаточно мощным для большого количества целей. — Википедия
- о боже мой, это действительно работает — Тест
Детали реализации
- Мы используем
tr
для преобразования >
в n
— поскольку sed основан на строке (или NUL), другого способа анализа XML XMPP (который обычно никогда не содержит символов новой строки) с помощью sed не существует. - TLS обрабатывается вне sed по тем же причинам. И сохранить здравомыслие (некоторые люди могут задаться вопросом, осталось ли у меня еще хоть немного здравомыслия).
- Аналогично, поиск SRV и составление данных аутентификации полностью выполняются в bash. Это также означает, что поддерживается только аутентификация PLAIN SASL - SCRAM требует такого уровня интерактивности, которого было бы чрезвычайно сложно достичь в sed (хотя и не невозможно; нам «просто» нужно будет реализовать base64 и sha1-hmac в sed).
- Поскольку XMPP — это протокол, в котором клиент говорит первым, нам нужно передать некоторый начальный ввод, чтобы он мог сгенерировать «строку» вывода (заголовок потока). Мы делаем это с помощью bash и используем эту возможность, чтобы передать некоторую конфигурацию программе sed (а именно JID и строку аутентификации).
Рекомендации по проектированию
- Мы рассматривали возможность использования
xml2
для преобразования потока XML в события; однако оказывается, что 2xm[
не любит сброс потока. Кроме того, использование подхода tr
позволяет нам обнаруживать конец элементов, что полезно для различных целей.