Форум сайта python.su
Приветствую, столкнулся со следующим вопросом - есть необходимость каждые n минут парсить json api и мониторить состояние хостов. В случае их активности\неактивности выводить соответствующее сообщение. С парсигном разобрался, а вот с правильным выводом сообщений возникли проблемы. Сообщения нужно выводить единожды в случае изменения состояния, а не при каждом прогоне цикла. И если для одного хоста у меня получилось это реализовать, то для перебора нескольких, моих знаний не хватило. Был бы весьма благодарен за помощь в решении вопроса.
import json import urllib.request import time hostnameList = ['host1','host2','host3'] while True: for host in hostnameList: apidata = urllib.request.urlopen("http://localhost/jsonapi").read().decode('utf8') alive_status = json.loads(apidata)["hosts"][(host)]["alive"] if alive_status == True: print (str(host) + ' is alive. ') else: print (str(host) + ' is dead') time.sleep(10)
if alive_status == True: if aliveMessageStatus == False: print ('alive') aliveMessageStatus = True deadMessageStatus = False if alive_status == False: if deadMessageStatus == False: print ('dead') deadMessageStatus = True aliveMessageStatus = False
Отредактировано threediceceelo (Янв. 14, 2017 12:42:52)
Офлайн
threediceceeloВот общий шаблон
Сообщения нужно выводить единожды в случае изменения состояния, а не при каждом прогоне цикла.
state = 'start' while True: if state == 'start': do1() state = 'continue' elif state == 'continue': res = do2() if res = 1: state == 'condition': elif state == 'condition': res = do3() if res = 1: state = 'continue' else: state = 'exit' elif state == 'exit': break
Отредактировано py.user.next (Янв. 14, 2017 13:15:10)
Офлайн
py.user.next, спасибо. Не уверен до конца ли я правильно понял конструкцию и возможно это делается совсем иначе, но что получилось работает, но для одного хоста. Как это прикрутить для мониторинга нескольких пока не понял. А точнее не понято как привязать aliveMessageSent = False и deadMessageSent = False к каждому из хостов.
import json import urllib.request import time aliveMessageSent = False deadMessageSent = False while True: apidata = urllib.request.urlopen("http://localhost/jsonapi").read().decode('utf8') alive_status = json.loads(apidata)["hosts"]['host1']["alive"] if alive_status == True: if aliveMessageSent == True: state = 'wait' else: print ('Host is alive.') aliveMessageSent = True deadMessageSent = False elif alive_status == False: if deadMessageSent == True: state = 'wait' else: print ('Host is dead.') deadMessageSent = True aliveMessageSent = False elif state == 'wait': time.sleep(20)
Отредактировано threediceceelo (Янв. 15, 2017 11:56:46)
Офлайн
threediceceeloНе, иди на вики и читай до понимания
Не уверен до конца ли я правильно понял конструкцию
threediceceeloКак раз для этого и используются разные состояния конечного автомата. В одном он будет помнить, что что-то изменилось, а в другом - нет. И для этого тебе не хватит флажка. Вот эти флажки, если они и нужны, то они должны проверяться внутри текущего состояния конечного автомата. А вот состояния у него ты уже вводишь такие что “автомат что-то заметил”, “автомат ничего не заметил”, “автомат что-то понял”, “автомат закончил что-то делать и вернулся к прежнему состоянию”. Если у флажка может быть два состояния (true/false) и ты по ним можешь делать одно или другое, то у конечного автомата могут быть тысячи состояний (true/false/true1/false1/true2/false2 и так далее) и в каждом он что-то понимает определённое. Поэтому флажков твоих тут не хватает, а одного конечного автомата хватит на всё и даже больше.
Сообщения нужно выводить единожды в случае изменения состояния, а не при каждом прогоне цикла.
Отредактировано py.user.next (Янв. 15, 2017 14:04:59)
Офлайн