Найти - Пользователи
Полная версия: Ping bot для сервера
Начало » Python для новичков » Ping bot для сервера
1 2
Borovkovich
Доброго дня. Пытаюсь сбрать чат-бот в телеге для пинга сервера во внутренней сети. Вроде всё правильно прописал, код начинает работать. При запуске в телегу приходит сразу сообщение, которое я пишу “192.168.67.227 не работает”. При попытке отрубить от сети и включить обратно ничего не происходит. Сообщения не присылаются. Подскажите плиз, куда копнуть
 #----------------------------------------------------
import os
import requests
import time
#-------------------------
hostname = ['192.168.67.227']
time_pause = 10
#-------------------------
def SendMsgToTelegramChanel(msg):
    token="Мой токен"
    chat_id = 'мой чат id'
    params = {'chat_id': chat_id,'text': msg}
    response = requests.get('https://api.telegram.org/bot'+token+'/sendMessage', params=params)
def IsHostAlive(host):
    ret = os.system('ping -c 2 {} > /dev/null'.format(host))
    if ret == 0:
        return True
    return False
while True:
    for i in range(len(hostname)):
        file_signal = hostname[i] +'_down'
        if IsHostAlive(hostname[i]):
            if os.path.isfile(file_signal):
               os.remove(file_signal)
               SendMsgToTelegramChanel(hostname[i] + ' работает')
               #print(hostname + ' is up!')
        else:
            if not os.path.isfile(file_signal):
                open(file_signal,'tw').close()
                SendMsgToTelegramChanel(hostname[i] + ' не работает')
                #print(hostname + ' is down!')
    time.sleep(time_pause)
#------------------------------------------------
py.user.next
Borovkovich
Пытаюсь сбрать чат-бот в телеге для пинга сервера во внутренней сети.
Ты знаешь, что такое внутренняя сеть? Если ты запустишь это в Telegram, запрос будет относиться к внутренней сети Telegram.
ZerG
py.user.next
С чего бы это? Где будет запущен исполняемый код - там и будет сеть
К сети Телеги ты точно не получишь доступ


2Borovkovich
Если заменить отправку в телегу обычным принтом - выводит данные?

если в отправку в телегу передать обычный текст - отправляет?
py.user.next
ZerG
Где будет запущен исполняемый код - там и будет сеть
Чтобы бот работал, его надо будет запускать на хостинге. Даже если у него хостинг свой собственный, это надо двухкомпонентную систему делать. В боте просто не должно быть этой внутренней сети.

Про Telegram я имел в виду вот это - что бот на хостинге когда запустится, он будет на хостинге искать внутреннюю сеть, а не у него где-то там.
ZerG
py.user.next
Да почему же на хостинге то? Ну вот у человека локалка - какая-то мини-фирма! У него есть там полюбому сервера которые не выключаются или даже если он дома то скажем какой нить RaspberryPi
Что мешает запустить бота на балалайке дома или в оффисе на сервере?
py.user.next
ZerG
Да почему же на хостинге то?
Если ты пишешь бота так, что его нельзя поставить на хостинг, то его нельзя поставить на хостинг. Что в этом хорошего?

ZerG
если он дома то скажем какой нить RaspberryPi
А если его выключить, то бот что будет делать в Telegram? Он даже /help не сможет вывести, ведь он же не на хостинге.

Так что бот должен быть отвязан от этих сетей и стоять хоть где. При этом команда, данная боту, должна посылать запрос на программную часть, которая стоит на каком-то компьютере где-то, имеющем доступ к сетям 192.168.*.* и имеющем внешний IP-адрес, с которым и будет взаимодействовать бот с хостинга или откуда-то ещё. А если из бота начать соединяться с сетью 192.168.*.*, то этот бот и сможет только на одном компьютере стоять и только на том, который доступ к этим внутренним сетям имеет.
ZerG
Абсолютно верно
Если мы говорим о боте общего назначения то разумеется держать его на хостинге самый верный вариант для обеспечения отказоустойчивости

Но если мы говорим о внутренних сетях то это явно не бот для общего пользования
К примеру есть предприятие и мы хотим отслеживать состояние сервисов - использовать Телегу для таких задач очень удобно - и тут стоит рассматривать команду пинг только как пример;

На предприятиях пусть и минисерверная с упсами и инетом 24/7
Вот он там и живет - а если уж там все сломалось - то нерабочий бот это тот же показатель алярма

Ну и на конец = даже если бот на хостинге? Ну запусти на нем же WireGuard и получи доступ в свои внутренние сети; Да хоть проброс порта на роутере сделай

Ну а если предприятие больше чем три калеки с ноутами - то как я сказал выше нет никаких проблем поднять в сети виртуалку и повесить на нее бота, забикс итд
py.user.next
ZerG
Если мы говорим о боте общего назначения то разумеется держать его на хостинге самый верный вариант для обеспечения отказоустойчивости
Там даже не в отказоустойчивости дело. Бот - это функция. Поэтому не должно в одной функции быть всё. Мы же не программисты на Basic'е. Опросник внутренней сети - это функция. Поэтом функция-бот запускает функцию-опросник.

Вот так оно выглядит
  
>>> def bot():
...     result = pinger()
...     if result:
...         return 'ping ok'
...     else:
...         return 'ping fail'
... 
>>> def pinger():
...     host = '192.168.0.1'
...     if ping_host(host):
...         return True
...     else:
...         return False
... 
>>> def ping_host(host):
...     return True
... 
>>> bot()
'ping ok'
>>>
Как видишь, bot() ничего не знает о том, как происходит опрос в pinger(). Это инкапсуляция. А pinger() ничего не знает о том, как именно опрашивается узел в ping_host(). Это инкапсуляция.

Ты же предлагаешь вот такое
  
>>> def bot():
...     host = '192.168.0.1'
...     result = True
...     if result:
...         return 'ping ok'
...     else:
...         return 'ping fail'
... 
>>> bot()
'ping ok'
>>>
Но если адрес изменится, бот сразу сломается весь, потому что он привязан к этому адресу исходному.

А теперь представь, что после создания бота и его работы тебе говорят “к нам присоединились ещё две сети, нужно их опрашивать тоже”.

Я делаю что
  
def bot():
    result = all((pinger1(), pinger2(), pinger3()))
    if result:
        return 'ping ok'
    else:
        return 'ping fail'

  
def pinger1():
    host = '192.168.0.1'
    if ping_host(host):
        return True
    else:
        return False
 
def pinger2():
    host = '192.168.0.2'
    if ping_host(host):
        return True
    else:
        return False
 
def pinger3():
    host = '192.168.0.3'
    if ping_host(host):
        return True
    else:
        return False

А ты что делаешь? Монолит на сто строк? У меня бот меняется минимально. А потом на каждой сети своя шарманка заводится, хоть с одной подсетью, хоть с десятью. Бот просто спрашивает у каждой такой штуки “ты как? видишь что-нибудь?” и они ему отвечают “я вижу один узел!”, “я вижу десять узлов!”, “я вижу сто узлов!”. И бот тогда говорит “всё пропинговалось, хозяин”. При этом что там пинговалось и сколько, зависит от этих отдельных частей, которые бот просто опрашивает по-простому.
py.user.next
ZerG
Но если мы говорим о внутренних сетях то это явно не бот для общего пользования
Этот бот может много функций иметь. Одна из них - опрос сетей каких-то. А другая - заказать кофе в офис в автоматическом режиме. Собрать всех на митинг. Позвать эникейщика в отдел такой-то.

Ты же зациклился на этих десяти строчках. Мол если строчек десять, то это и есть хорошо. Это хорошо тогда, когда ты ничего не делаешь особого. Но когда ты строишь систему, которая умеет делать дохрена всего, надо наплевать на количество строчек и сконцентрироваться на количестве функций, на количестве фич, на том, какие поведения у этой системы будут в наличии.
ZerG
ЭЭЭ я совершенно не понял откудова ты взял монолит и 10-1000 строк, я мимо этого магазина даже в гугле не проходил(акелла промахнулся)

У меня отдельный класс на бота и логика обработки задач
Бот же в конечном итоге используется как принт/лог типа

 from bot import send_mess
...
some checkers actions
send_mess(message, group, file, e.t.c)

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

Топик же не я создавал
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB