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

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


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


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


    1. Регистрируемся у бота и получаем токен командой /config
    2. Качаем клиент
    3. Запускаем!
      wget https://ice2heart.com/snitch
      chmod +x snitch
      SNITCH_USER_ID=<here_is_your_uuid> ./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


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

    Поделиться публикацией

    Похожие публикации

    Комментарии 8
      0
      Неплохо!
        0
        Может быть кому пригодиться, команды из телеграм-бота в shell на сервер.
          +1
          Я может чего-то не понимаю, но зачем всё это городить, когда надо лишь отправить один GET-запрос и сообщение в телеграм отправится?
            –2
            Я хотел сделать проще. Ну да, можно обойтись одним баш скриптом. Просто оиригнальная идея была в том, что сервер может посылать собщения не только в телеграм, а например в слак или на почту тоже.
              +1
              Слак — также один GET запрос, в почту — одна команда типа 'echo finished | mail vasyan@mail.ru'.
            +4

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

              0

              Поддержу комментарий majere выше, непонятно зачем такой огород. У меня уведомления в телеграм посылает скрипт на Python из 20 строк. Сервер ведь уже есть (на котором крутится API телеграма), к чему тут лишняя прослойка?

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

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое