mindsellers
72 subscribers
25 photos
8 files
32 links
Практики из жизни Linux-админа. Asterisk, Bash, Python и черная магия.

Сайт http://mindsellers.ru
Группа VK https://vk.com/mindsellers
ТыТруба https://www.youtube.com/channel/UC7LUJgzIUL4VGiOWctoa0fw
По всяким вопросам обращаться @alex_dmit
Download Telegram
Telegram-бот "Попингуй"

У многих админов, в том числе и у нас, используется система мониторинга Zabbix с прикрученным к ней телеграм-ботом, который всякие ворнинги постоянно кидает в группу. Но бывает так, что падает агент заббикса, или происходит ложное срабатывание, ну и так далее. В итоге приходится ночью вскакивать с кровати, бежать к компу, ломиться на рабочий комп по удаленке - и все это ради того, чтобы просто пропинговать ресурс и убедиться в том, что он жив. Вот и решил я написать свой бот на Python, который будет болтаться на сервере в локальной сети и по заявкам пользователей пинговать что надо.
Сначала добавляем себе супер-бота @BotFather, создаем через него своего бота и получаем токен, который надо будет указать в скрипте, затем переходим к разработке.

Сам скрипт выкладывать в канал смысла не вижу, его можно посмотреть по ссылкам ниже. Кроме стандартной работы с библиотекой telebot, интерес в скрипте представляет механизм авторизации. Используя библиотеку shelve, мы будем хранить в файле эдакую базу данных "ключ: значение". В качестве ключа у нас будет слово users, а в качестве значения - множество ID наших клиентов. При запуске скрипта мы читаем из базы идентификаторы в множество(если, конечно, там уже есть нужный ключ. Если его нет, то множество останется пустым):
db=shelve.open('/admin/teleusers.db')
allowed=set()
try:
allowed=db["users"]
except:
pass

Если пользователь отправит нам пароль, то мы внесем его в множество allowed и положим обновленное множество в базу:
if message.text == password:
print message.from_user.id
allowed.add(message.from_user.id)
db["users"]=allowed
bot.send_message(message.chat.id, 'Вы добавлены в список пользователей бота. Теперь можете писать адрес, который надо пропинговать')

При каждом запросе проверяем, "наш человек или посторонний". Если наш, то запускаем пинг и возвращаем результат. Если пинг завершится неуспешно, то выводим сообщение о недоступности ресурса.
if user in allowed:
bot.send_message(message.chat.id, 'Пингую, подождите')
else:
bot.send_message(message.chat.id, 'Пока не скажешь пароль, ничего не получишь!')


Для того, чтобы не заморачиваться с демонизацией скрипта, но при этом быть уверенным в его работе, воспользуемся systemctl - создадим файл сервиса /etc/systemd/system/telegrambot.service
[Unit]
Description=MyTelegramBot
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python /admin/telegrambot.py
Restart=always

[Install]
WantedBy=multi-user.target


Перечитаем список демонов и запустим нашего

sudo systemctl daemon-reload
sudo systemctl enable telegrambot.service
sudo systemctl start telegrambot.service


Все, можно пробовать подключаться.
Код можно посмотреть в wiki и в vk

http://pubwiki.mindsellers.ru/index.php/Telegram-%D0%91%D0%BE%D1%82_%22%D0%BF%D0%BE%D0%BF%D0%B8%D0%BD%D0%B3%D1%83%D0%B9%22

https://vk.com/@mindsellers-telegram-bot-popingui

#python #linux #bash #telegram
Отправка сообщения из Python в комнату в Jabber

В связи с тотальной блокировкой телеграма, возникло желание всей корпоративной группой перейти на использование своего кошерного Jabber-сервера, тем более что он уже есть. Быстренько разобрались с настройкой комнаты, но возник вопрос: как всех массово уведомлять о каком-либо проишествии. Конечно, можно просто отправить сообщение по списку пользователей, но мне показалось удобнее слать сообщение один раз - в приватную комнату. Из этой задачи и родился следующий скрипт:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import xmpp,sys

xmpp_jid = 'bot@domain.ru'
xmpp_pwd = 'password'
room = 'it@conference.domain.ru'
msg = sys.argv[1]

#Получаем в качестве аргумента сообщение

jid = xmpp.protocol.JID(xmpp_jid)
client = xmpp.Client(jid.getDomain(),debug=[])
client.connect()
client.auth(jid.getNode(),str(xmpp_pwd),resource='xmpppy')
#Авторизуемся
client.sendInitPresence(requestRoster=0)
client.send(xmpp.Presence(to='{0}/{1}'.format(room, jid)))
#Заходим в комнату
message=xmpp.Message(room, '\n'+msg)
#Формируем сообщение
message.setAttr('type', 'groupchat')
#Устанавливаем тип сообщения - групповой чат
client.send(message)
#Отправляем сообщение и отключаемся
client.disconnect()


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

#python #jabber #telegram #дуроввернистену
Бесплатный полностью шифрованный мессенджер, или новое - хорошо забытое старое

В связи с бесконечными попытками заблокировать телеграм, а также резким обострением паранойи, мы в компании перевели(ну, вернее, продублировали) все сервисы, завязанные на телегу в корпоративном жаббере. И тут у меня возник вопрос: как обстоят дела в жаббере с шифрованием. Небольшой гуглеж показал, что все сервера и клиенты на текущий момент имеют поддержку ssl-шифрования, что уже неплохо. Однако, все сообщения дешифруются на серверах. И если для корпоративного сегмента это даже хорошо - вроде никто не читает наши послания, но все они аккуратно логируются на сервере, то для личного использования, особенно если рассматривается обмен сообщениями через публичный сервер, такая история крайне нежелательна.

Но решение есть, и оно очень простое.

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

Вопрос-ответ: Один собеседник задает вопрос, второй присылает верный ответ.
Общий секретный ключ: По сути, в начале шифрованного диалога оба собеседника вводят заранее согласованный пароль
Ручной: При встрече можно просто посмотреть ключи друг у друга в клиентах, и убедиться, что ключ действительно принадлежит Васе, а не агенту ЦРУ
Мне лично импонирует второй способ.

Теперь о клиентах и серверах.

Каждый желающий может поднять свой сервер jabber без регистрации и смс, сделать его полностью закрытым, запретить на нем регистрироваться и только вручную добавлять пользователей. Я это уже сделал, так что милости прошу за логинами. Но я прекрасно понимаю, что это, во-первых, не удобно, во-вторых, не слишком надежно, а в-третьих, пока РосКомПозор не протянул свои грязные лапы к жабберу, не имеет особого смысла, так как есть куча публичных, бесплатных серверов. Я рекомендую использовать один из самых старых и надежных — jabber.ru. Регистрация занимает 1 минуту, никакой номер телефона вводить не требуется.

Далее нужно будет поставить клиент. Под Win и Linux есть прекрасная софтина Pidgin, к ней еще потребуется поставить плагин OTR. Под огрызки можно использовать встроенный мессенджер, а под Android установить приложение Xabber.

Вот все необходимые ссылки:

Pidgin https://pidgin.im/
OTR плагин https://otr.cypherpunks.ca/
Xabber https://play.google.com/store/apps/details?id=com.xabber.android&hl=ru
Jabber.Ru http://jabber.ru

Найти меня вы сможете по имени sys_vampire@jabber.ru. Добавляйтесь, и попробуем с вами шифрованные чаты!

#telegram #jabber
VPN за 10 секунд для системных администраторов

Итак, интернет в РФ планомерно превращается в тыкву, и если для телеграма есть прокси, для сайтиков - анонимайзеры и VPN, то как быть в случае, если с удаленного сервера станет недоступно что-то важное? Например, я вот не смог плагины для OpenFire скачать на днях. Поднимать vpn-клиент на сервере и на горячую настраивать маршрутизацию - и долго, и страшно. И вообще не наш путь. Есть ж ssh!

Для решения задачи по туннелированию всего или части трафика через сервера в странах, где у власти адекватные люди, прекрасно подходит утиллита sshuttle. Рассмотрим ее установку, параметры и возможности

apt install sshuttle
sshuttle -r login@domain.xx 0/0 #заворачиваем весь трафик в ssh-туннель, кроме dns-запросов
sshuttle --dns -r login@domain.xx 0/0 #заворачиваем весь трафик, в том числе dns
sshuttle -r login@domain.xx 11.22.33.44/26 #заворачиваем только определенную сеть
sshuttle -r login@domain.xx 0/0 -x 10.0.0.0/8 #заворачиваем все, кроме указанной подсети


Обратите внимание, что для запуска sshuttle потребуются права sudo!

Естественно, можно использовать этот замечательный инструмент и для обеспечения временного доступа в локальную сеть предприятия(ну или квартиры, если у вас проброшен ssh и белый айпишник) удаленно, особенно в том случае, когда vpn-сервера нет, а делать его лень.

P.S. Знаю, что для многих sshuttle - давно известный инструмент, но я почему-то про него не знал, и думаю, что кому-то это знание будет так же полезно, как и мне.

#onestringscript #linux #bash #vpn #proxy #telegram
Уведомление в telegram из zabbix

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

Телеграм предоставляет аж 2 разных API - для ботов и для клиентов. Про реализацию бота я уже писал, так что сейчас рассмотрим реализацию клиента. Для начала, нужно пойти на сайт телеграма, получить id и токен доступа к API client. После этого можно перейти к скрипту.

Для реализации доступа к API client существует прекрасная библиотека под названием Telethon, так что начнем с ее установки:

pip3 install telethon


Обратите внимание: либа реализована только под python3.x!

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

client.send_message(alex_dmit, 'Привет!')


Однако слать сообщения в личку каждому из заинтересованных - не наш метод, нам нужно слать уведомления в чат. К сожалению, примера для отправки сообщений в группу я не нашел, но поковырявшись в самой библиотеке обнаружил метод: нужно по ссылке для приглашения в чат получить его идентификатор, а уже после слать сообщение. Рассмотрим весь скрипт:
#!/usr/bin/python3
# -*- coding: utf-8 -*-

from telethon import TelegramClient
import sys
api_id = 242424
api_hash = '8d79f63dfsfsfsdfsfsdfs'#параметры подключения
phone_number = '+79063448810' # номер телефона


client = TelegramClient('/usr/lib/zabbix/alertscripts/%sessionname%', api_id, api_hash)
client.connect()
if not client.is_user_authorized():
client.send_code_request(phone_number)
client.sign_in(phone_number, input('Enter the code: '))
print(sys.argv[1])
destination_group_invite_link='https://t.me/joinchat/Dk3ZYRWFRXXXXXXXXpI7ADaQ'
entity=client.get_entity(destination_group_invite_link)
client.send_message(entity=entity, message=sys.argv[1:])



Как несложно понять, destination_group_invite_link нужно скормить ссылку-приглашение в группу. При первом запуске скрипт запросит код подтверждения, который будет выслан на любое другое устройство, с которого в этот момент авторизован пользователь. После этого по указанному адресу(в нашем случае /usr/lib/zabbix/alertscripts/) будет создан файл сессии, и пока мы его не удалим, скрипт будет работать без запросов подтверждения.

Отправлять в чат мы будем все, что получили в качестве аргументов: sys.argv[1:]

Дадим права на запуск, и проверим работоспособность скрипта:

chmod +x ./send.py
./send.py 'Тестовое сообщение'


Переходим к настройке заббикса. Все, описанное ниже, имеет отношение к версии 3.4, но насколько мне известно, и в 2.х и в 4.х все делается примерно так же.

Для начала, нужно зайти в Настройка->Действия и включить дефолтное действие Report problems to Zabbix administrators. Затем, в Администрирование->Способы оповещения добавим новый способ под названием telegram. Тип оповещения "скрипт", параметры оповещения {ALERT.SUBJECT} и {ALERT.MESSAGE}.

Остается только перейти в настройки своей учетной записи и включить способ уведомлений telegram.

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

#zabbix #linux #python #telegram #telethon
Отправка уведомлений в телеграм с помощью простейшего бота

Итак, рассмотрим простого бота, предназначенного для отправки уведомлений в каналы telegram.

Заметка ценности не представляет, и в первую очередь нужна мне, чтобы в следующий раз в попыхах не вспоминать, как заставить telebot работать с socks

В первую очередь, нужно бота создать, делается это с помощью служебного бота @BotFather, который даст нам token нашего бота. Затем, создадим канал, добавим туда нашего бота по имени в качестве администратора. Внимание! Канал нужно создать публичным. Используя любую машину, где есть доступ к телеграму, получим id нашего канала:

curl https://api.telegram.org/bot<токен>/getChat?chat_id=@<название канала>

В выхлопе будет json, содержащий id. После этого канал можно сделать приватным, id у него уже не изменится.

Поставим все необходимое
apt install python3-pip
pip3 install setuptools
pip3 install pytelegrambotapi
pip3 install requests[socks]

requests[socks] нам будет необходим для того, чтобы наш бот умел работать через socks-прокси. Код поражает своей элементарностью:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import telebot
from telebot import apihelper
try:
id,message=sys.argv[1:]
except:
print('Необходимо 2 аргумента - id и сообщение')
exit(1)


apihelper.proxy={'https':'socks5h://proxyuser@proxypass@domain.ltd:port'}
token = '10300000:AAGRVSSSSSSSSSSSSS'
bot=telebot.TeleBot(token)
bot.send_message(id, message)

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


UDP для любителей однострочников на баше:



curl -x socks5h://proxyuser:proxypass@proxydomain.ltd:[proxyport] "https://api.telegram.org/bot103000000:XXXXXXXXXXXXX/sendMessage?chat_id=[id]&text=[sometext] "


#python #telegram #onestringscript #bash
Уведомления о новых задачах redmine в telegram


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

Поэтому, не будем использовать плагины, но воспользуемся питоном. Для начала, создадим в redmine пользователя с админскими правами(да, можно и без них, но с ними веселее), допустим, bot, а также в Настройках включим API. После этого приступаем к питоно-коду. Чуть ранее я писал о том, как легко отсылать уведомления в телегу через бота, читайте выше. Не буду повторяться, но приведу листинг чуть модернизированного скрипта
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import telebot
from telebot import apihelper

def messagesend(id, message):
apihelper.proxy={'https':'socks5h://proxy-user:proxy-pass@domain.ltd:[port]'}
token = '1037455712:XXXXXXXXXXXXXXX'
bot=telebot.TeleBot(token)
bot.send_message(id, message)


if __name__=='__main__':
try:
id,message=sys.argv[1:]
except:
print('Необходимо 2 аргумента - id и сообщение')
exit(1)
messagesend(id,message)
Всего-то я вынес отправку в функцию и написал классический
 __name__=='__main__'
: для тестирования.

Теперь поставим очень удобную и простую либу:
pip3 install python-redmine
и напишем элементарный скрипт. Отметим, что скрипт выше называется у меня
telegram_send.py
и лежит в одном каталоге с нижеследующим.

#!/usr/bin/python3

from redminelib import Redmine
from telegram_send import messagesend
redmine = Redmine('https://redmine.domain.ltd/', username='bot', password='BOTPASS')

CHATID='-100XXXXXXXXXXXX'

count=0
for issue in redmine.issue.filter(status_id=1): #status_id==1 Обычно соответствует новой задаче
#но вы можете воспользоваться отладочными строками ниже для определения своего id


# Строчки ниже могут пригодиться для отладки и проверки скрипта
# print(str(issue.id)+' '+str(issue))
# print(str(issue.status.id)+' '+str(issue.status))
# print(getattr(issue, 'assigned_to', None))
if getattr(issue, 'assigned_to', None)==None: #проверяем, что задача никому не назначена
count+=1 #считаем неназначенные
message=message+str(issue)+' в проекте '+str(issue.project)+': http://redmine.domain.ltd/issues/'+str(issue.id)+'\n'


if count>=1:
message='Новых неназначенных задач '+str(count)+'. Вы можете посмотреть их список ниже: \n'
print(message)
messagesend(CHATID, message)

Написанному скрипту даем права на исполнение и запихиваем в cron по вкусу.

В результате получаем следующее: как только скрипт запускается, он находит все задачи с
status_id==1
, что по дефолту соответствует новой задаче, и пробегая по всем задачам, обнаруживает те, у кого нет исполнителя:
getattr(issue, 'assigned_to', None)
. Если вам необходимо посмотреть вообще все задачи, то начало цикла примет вид
for issue in  redmine.issue.all():
и он переберет все задачи в принципе. Полезно попробовать так сделать, используя закомментированные выше print. Относительно полный список методов, функций и объектов либы можно найти на сайте ее разработчиков, который элементарно гуглится.

И как всегда, скрипты и текст в более удобном виде доступны у меня в вики - pubwiki.mindsellers.ru
#python #redmine #telegram