Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 21, 2018 09:26:51

befree
Зарегистрирован: 2018-06-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Телеграм бот

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import telebot
import config
from ping3 import ping
import time
import Hosts
bot = telebot.TeleBot(config.token)
response_host = ''
def not_available():
    cnt = 0
    while True:
            for host in Hosts.host:
                response_host = ping(host, )
                if response_host == None:
                    bot.send_message(config.chat_id, f"{host} ,— хост не доступен")
                    cnt -= 1
                    time.sleep(3)
                    print('недоступен')
                if response_host != None and cnt != 2:
                    bot.send_message(config.chat_id, f"{host} ,— хост доступен")
                    cnt += 1
                    print(cnt)
                    print('доступен')
                    time.sleep(3)
                else:
                    pass
def main_program():
    not_available()
if __name__ == "__main__":
    main_program()
Добрый день, добрые люди)
Так, дело в том что у меня мало опыта. Вообще я системный администратор. Программа должна работать так: если не пингуется сервер, то телеграм бот отправляет это в мой телеграм- что сервак лёг. Затем если он сам поднялся по какой то причине, отправить один раз! Ну если авария, то сервер может упасть ещё раз, и я хочу что бы он резолвился раз в 15 мин- это просто реализовать с помощью библиотеки тайм/
Блин, только не получается у меня написать код так, что бы отсылалось поднятие сервера один раз, по тому и пишу сюда, вдруг тут есть люди умнее меня) и подскажут как реализовать мой мини проект. В дальнейшем я и смтп приделаю, что бы письма слал…
гуглил много, читал - не могу придумать как…(

Отредактировано befree (Июнь 21, 2018 09:44:02)

Офлайн

#2 Июнь 21, 2018 12:24:31

befree
Зарегистрирован: 2018-06-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Телеграм бот

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import telebot
import config
from ping3 import ping
import time
import Hosts
bot = telebot.TeleBot(config.token)
response_host = ''
def not_available():
    cnt = 0
    cnt2 = len(Hosts.host)
    print(cnt2)
    print(type(cnt2))
    hostbot = ""
    while True:
            for host in Hosts.host:
                response_host = ping(host, )
                if response_host == None:
                    cnt2 = len(Hosts.host)
                    bot.send_message(config.chat_id, f"{host} ,— хост не доступен")
                    hostbot = f"{host}"
                    print(hostbot)
                    time.sleep(10)
                    print('недоступен')
                if response_host != None and hostbot != response_host and cnt2 != 0:
                    cnt2 = cnt2 - 1
                    bot.send_message(config.chat_id, f"{host} ,— хост доступен")
                    print(f"{host}{cnt2}")
                    print('доступен')
                    time.sleep(3)
def main_program():
    not_available()
if __name__ == "__main__":
    main_program()

удалось победить отправку 1 раз но, когда какой-то хост стает не доступен, переменная cnt2 = len(Hosts.host) опять стает больше нуля. и опять постоянная отправка что хост доступен.
Помогите разобраться

Офлайн

#3 Июнь 21, 2018 22:32:18

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Телеграм бот

заведите словарь вида {host:bool} куда заносите статус доступен-True, недоступен False, при следующем проходе сравнивайте текущее значение с прошлым, если отличаються то бот чтото отправляет и обновляет словарь, если одинаковы то молчит.
Ну или если False то отправляет в любом случае, а если True то отправляет только если предыдущее значение False. это уж как вы сами решите.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 21, 2018 22:34:09)

Офлайн

#4 Июнь 25, 2018 13:16:59

befree
Зарегистрирован: 2018-06-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Телеграм бот

PEHDOM
заведите словарь вида {host:bool} куда заносите статус доступен-True, недоступен False, при следующем проходе сравнивайте текущее значение с прошлым, если отличаються то бот чтото отправляет и обновляет словарь, если одинаковы то молчит.Ну или если False то отправляет в любом случае, а если True то отправляет только если предыдущее значение False. это уж как вы сами решите.
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import telebot
import config
from ping3 import ping
import time
import Hosts
bot = telebot.TeleBot(config.token)
def not_available():
    for host in Hosts.host:
        response_host = ping(host, )
        time.sleep(5)
        status_dict = {host: ''}
        if response_host == None:
            status_dict[host] = False
        if response_host != None:
            status_dict[host] = True
            print(status_dict)
        if status_dict[host] == False:
            bot.send_message(config.chat_id, f"{host} ,— хост не доступен")
        if status_dict[host] == True:
            temp_dict = status_dict
            print(status_dict)
            for i in status_dict:
                if status_dict[i] == temp_dict[i]:
                    pass
                    bot.send_message(config.chat_id, f"{host} ,— хост доступен")
def main_program():
    while True:
        not_available()
if __name__ == "__main__":
    main_program()

блин, не понимаю. вроде сравнил, а она и дальше продолжает слать

Офлайн

#5 Июнь 25, 2018 20:30:27

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Телеграм бот

befree
блин, не понимаю. вроде сравнил, а она и дальше продолжает слать
это потому что вы вы каждый раз создаете новый словарь, поскольку гоняете процедуру в цикле, а нужно цикл внутрь процедуры загнать, или подавать словарь уже в процедуру снаружи если хотите иметь возможность единоразового опроса. плюс сначала присваеваете а потом сравниваете , а нужно наоборот:
 ....
def not_available():
    status_dict = {} # словарь должен быть один и тот же на протяжении работы всего цикла
    while True:
        for host in Hosts.host: # перебирвем хосты
        response_host = ping(host, )
        time.sleep(5) # ХЗ зачем это, программа и так не пойдет дальше пока пинг не отработает.
        if response_host == None: #Это нужно потому что словарь при отсутсвии ключа тоже выдаст None, да и вобще ХЗ что там пинг возвращает :)
            response_host = False
        else:
            response_host = True   
        if response_host != status_dict.get('host'):# Если "текущий" статус отличаеться от "предыдущего"
            if response_host == True:
                #Хост  доступен или это первый опрос и такого хоста нет еще в словаре
                # вставить сюда нужный код отправки сообщения через бот, почту, СМС или голубем
            
            else:
                #Хост недоступен или это первый опрос  и такого хоста нет еще в словаре
                # вставить сюда нужный код  отправки сообщения через бот, почту, СМС или голубем
            status_dict['host'] = response_host #обновляем словарь 
Както так, надеюсь суть вы уловите и уже сделаете как вам нужно..





==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 25, 2018 20:49:28)

Офлайн

#6 Июль 4, 2018 13:55:57

befree
Зарегистрирован: 2018-06-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Телеграм бот

PEHDOM
ping возвращает None если не доступен и float если доступен.
тот же эфект (

логика должна быть такая, если хост поднялся он должен один раз сообщить об этом и все.
и опрашивать хосты- если вдруг отвалился, то собщить об этом раз в 15 мин… для этого и нужен time.sleep


 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import telebot
import config
from ping3 import ping
import time
import Hosts
bot = telebot.TeleBot(config.token)
def not_available():
    status_dict = {}  # словарь должен быть один и тот же на протяжении работы всего цикла
    while True:
        for host in Hosts.host:  # перебирвем хосты
            response_host = ping(host, )
            time.sleep(5)  # ХЗ зачем это, программа и так не пойдет дальше пока пинг не отработает.
            if response_host == None:  # Это нужно потому что словарь при отсутсвии ключа тоже выдаст None, да и вобще ХЗ что там пинг возвращает :)
                response_host = False
            else:
                response_host = True
            if response_host != status_dict.get('host'):  # Если "текущий" статус отличаеться от "предыдущего"
                if response_host == True:
                    bot.send_message(config.chat_id, f"{host} ,— хост доступен")
                # Хост  доступен или это первый опрос и такого хоста нет еще в словаре
                # вставить сюда нужный код отправки сообщения через бот, почту, СМС или голубем
                else:
                    bot.send_message(config.chat_id, f"{host} ,— хост не доступен")
                # Хост недоступен или это первый опрос  и такого хоста нет еще в словаре
                # вставить сюда нужный код  отправки сообщения через бот, почту, СМС или голубем
                status_dict['host'] = response_host  # обновляем словарь
def main_program():
    while True:
        not_available()
if __name__ == "__main__":
    main_program()

Спасибо, за вашу отзывчивость- очень благодарен.

Отредактировано befree (Июль 4, 2018 13:56:30)

Офлайн

#7 Июль 5, 2018 15:07:36

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Телеграм бот

befree
если вдруг отвалился, то собщить об этом раз в 15 мин… для этого и нужен time.sleep
ну так не в цикле же перебора хостов, поставтее ее в конце while True:
while True: в def main_program(): лишнее оно и так будет крутиться вечно в not_available()
befree
если вдруг отвалился, то собщить об этом раз в 15 мин
тоесть он должен каждые 15 минут сообщать что хост недоступен? тогда нужно чутка поменять логику программы:
  ....
def not_available():
    status_dict = {} # словарь должен быть один и тот же на протяжении работы всего цикла
    while True:
        for host in Hosts.host: # перебирвем хосты
        response_host = ping(host, )
        if response_host == None: #Это нужно потому что словарь при отсутсвии ключа тоже выдаст None
            # Хост недоступен
            response_host = False
            if response_host != status_dict.get('host'):
                # Хост только упал или это первый опрос
                # вставить сюда нужный код  отправки сообщения через бот, почту, СМС или голубем
                ...
                status_dict['host'] = response_host #обновляем словарь
            else:
                # Хост упал "давно" и все еще лежит
                # вставить сюда нужный код  отправки сообщения через бот, почту, СМС или голубем
        else:
            # Хост доступен
            response_host = True
            if response_host != status_dict.get('host'):
                #  отправляем сообщение только если ранее он был недоступен или это первый опрос
                # вставить сюда нужный код отправки сообщения через бот, почту, СМС или голубем
                ...
                status_dict['host'] = response_host #обновляем словарь
        time.sleep(900) # сбюда вствить  нужную задержку между опросами, 900 сек = 15 мин.

Или он должен опрашивать чаще, а сообщать раз в 15 минут?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 5, 2018 15:08:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version