Система уведомлений из консоли в Телеграм

habr.png

На прошлой работе часто были ситуации, когда есть требовательная задача, которая выполняется долго, но желательно быстро отреагировать по окончанию, что делать? Конечно, написать программу…

Первая версия просто использовала notify-send, но время показало некоторое неудобство процесса. Поскольку операции были очень требовательные к машине, то машина становилась на этот момент неюзабельной и хотелось отойти и выпить кофе. Но вернуться, когда процесс завершится. Поэтому появилась идея программы, которая чейнится в консольный пайплайн или оборачивает как sudo программу и по окончании присылает тебе нотификацию в чатик. Таким образом, ты увидишь нотификацию как на десктопе, так и на телефоне.

Для тех кто не хочет читать, а хочется попробовать. (Linux only)


  1. Регистрируемся у бота и получаем токен командой /config
  2. Качаем клиент
  3. Запускаем!
    wget https://ice2heart.com/snitch
    chmod +x snitch
    SNITCH_USER_ID= ./snitch sleep 10
    


Сервер

Идея была простая, нам нужен простой сервер, который примет сообщение и перешлет его пользователю.

И так как мне не хотелось заморачиваться с регистрацией, хранением и управлением учетных записей, я решил сделать как мне казалось просто (и сейчас кажется, но я не уверен, что это хорошо).

Используя бота, человек получает уникальный uuid v4, с которым потом и ходит на сервер. Авторизация на стороне чат клиента, я же храню только пару uuid-внутренний айди.

Поэтому взяв node.js в качестве сервера и добавив немного koa, nedb, node-telegram-bot-api, я собрал серверную часть, архитектура изначально подразумевала больше gateway в чаты, но не было кейсов и поэтому остался один телеграмм.

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

Сервер получился простой, но достаточный для работы.

Поэтому получился вот такой несложный docker-compose файлик, также нам необходим ключ для бота, который мы положим в .env файлик, чтобы не сохранять наши ключи в github, что не есть хорошо.

Так что для запуска нам необходимы docker, docker-compose и ключик для телегам бота, чтобы получить свой, вам придется обратиться к botfather.
После этого docker-compose up и наш сервер готов к работе.


Клиент

Для клиента я решил взять go по простой причине того, что он собирается в 1 бинарный файл, который потом легко можно распространять.

Основных идей по поводу клиента было две.


  1. Встраиваемся в пайплайн, собираем лог (не реализовано), по закрытию пайплайна отправляем сообщение.
  2. Оборачиваем приложение, например sudo, по завершению отправляем лог и сообщение с кодом возврата.

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

В итоге установка становится максимально простой.


  1. Качаем бинарник
  2. Прописываем в PATH
  3. Прописываем SNITCH_USER_ID переменную в конфигурацию шелла с вашим uuid
  4. Готово, вы великолепны!

Теперь можно запускать долгие команды в виде snitch make и по окончании мы получим сообщение о том, что приложение завершилось и даже будем знать, удачно или не очень.

Для сборки я сделал маленький скрипт, который назвал просто r. Он соберет go приложение и пропустит его через upx. И на выходе получаем красивый статически слинкованный бинарник.

Исходный код вы можете найти вот тут

И когда все готово, можно обратиться к боту с командой /config
И он создаст запись о нашем пользователе и вернет uuid.
Также всегда можно удалится из базы, для этого есть команда /delete

Таким образом, мы получили достаточно простое, но эффективное приложение, которое уведомит нас о завершившимся задании, легко и непринужденно, даже когда мы пьём кофе.

© Habrahabr.ru