Форум сайта python.su
0
#!/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()
Отредактировано befree (Июнь 21, 2018 09:44:02)
Офлайн
0
#!/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()
Офлайн
294
заведите словарь вида {host:bool} куда заносите статус доступен-True, недоступен False, при следующем проходе сравнивайте текущее значение с прошлым, если отличаються то бот чтото отправляет и обновляет словарь, если одинаковы то молчит.
Ну или если False то отправляет в любом случае, а если True то отправляет только если предыдущее значение False. это уж как вы сами решите.
[code python][/code]
Отредактировано PEHDOM (Июнь 21, 2018 22:34:09)
Офлайн
0
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()
Офлайн
294
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)
Офлайн
0
PEHDOMping возвращает None если не доступен и float если доступен.
#!/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)
Офлайн
294
befreeну так не в цикле же перебора хостов, поставтее ее в конце while True:
если вдруг отвалился, то собщить об этом раз в 15 мин… для этого и нужен time.sleep
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 мин.
[code python][/code]
Отредактировано PEHDOM (Июль 5, 2018 15:08:59)
Офлайн