А зачем гуи типа клиент-сервер на питоне?
Я не точно объяснил. Сам GUI конечно на HTML5 но находится он на сервере удалённом. На локальном компе находится процесс написаный на питоне который собирает данные с afserver, формирует правильный вид и отправляет на основной сервер по WS. У него вообще нет интерфейса. На удалённой сервер такие данные отправляют несколько ферм и там отображается общая статистика, почти без возможности управления кроме базовых вкл\выкл.
Если нет монитора на python то я готов сделать свой, только мне бы понять принцип действия. Это сервер который просто ждет входящие сообщения на конкретный порт, или соединение по WebSocket или TCP, или запросы на свервер с какойто периодичностью с указанием id монитора?
Как именно соединяется он с сервером и получает обновления если говорить о принципе работы?
Я пошерстил исходники и нашел таку функцию
https://github.com/CGRU/cgru/blob/f7d94 ... er.js#L311
В которой ясно видно что идет запрос на сервер раз в 1 сек. При этом отправляется такой JSON
Код: Выделить всё
{get: {type: "monitors", ids: [1], mode: "events"}}
Ок, значит сервер для нас собирает изменения и возвращает по запросу. Остается только периодически спршивать обновления. Тогда нам надо зарегистрировать свой монитор.
Следуя примеру отсюда
https://github.com/CGRU/cgru/blob/maste ... ister.json отправляем запрос на сервер.
Код: Выделить всё
cmd = af.Cmd()
cmd.data = {'user_name': "paul", 'host_name': "hostname", 'engine': "python"}
cmd.action = 'monitor'
r = cmd._sendRequest()
И из полученного результата
Код: Выделить всё
{
"monitor": {
"address": {
"family": 4,
"ip": "127.0.0.1",
"port": 0
},
"engine": "python",
"events": [],
"id": 2,
"name": "paul@hostname",
"priority": 99,
"time_activity": 0,
"time_launch": 1512490576,
"time_register": 1512490576,
"time_update": 1512490576,
"uid": -1,
"user_name": "paul"
}
}
получаем id своего монитора — 2
Теперь остаётся спрашивать сервер про обновления каждые N времени.
https://github.com/CGRU/cgru/blob/maste ... evets.json
Код: Выделить всё
{"get":{"type":"monitors","ids":[2],"mode":"events"}}
Если на сервер чтото поменялось то при следующем запросе мы получаем что-то вроде такого
После чего можем сделать обычный запрос информации о джобах
И получаем обновки.
Надеюсь я всё написал хотя бы близко к действительности. Но возникает два вопроса:
1. Почему при запросе об изменениях:
{"get":{"type":"monitors","ids":[2],"mode":"events"}}
я получаю всегда только такое:
{u'monitor': {u'id': 0}}
Определённо что-то не то сделал. Во вкладке MONITORS наротив моего зарегистрированного монитора можно видеть такие данные
EVTs: jobs_add, jobs_change, jobs_del
2. Помимо примера
monitor_register.json есть еще несколько:
monitor_renders.json
monitor_tasks.json
monitor_message.json
monitor_jobs.json
monitor_announce.json
Могу предположить что они добавляют дополнительные эвенты, например сообщают об изменениях тасков или хостов.
Судя по сообщениям в консоли вотча при открытии тасков мы отправляем на сервер такой запрос
https://github.com/CGRU/cgru/blob/maste ... tasks.json,
и тогда нам будут сообщать об изменениях в тасках. А когда окно закрывается status меняется на unsubscribe.
Аналогично подписываемся и на другие события. На соклько верно я описал?