webhooks: Add client_info parameter to "info" webhook
Allow clients to send their version info to klipper and arrange for that info to be logged. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
2bb6b0f58f
commit
b6a25393d3
|
@ -39,6 +39,9 @@ class QueueListener(logging.handlers.TimedRotatingFileHandler):
|
||||||
self.bg_queue.put_nowait(None)
|
self.bg_queue.put_nowait(None)
|
||||||
self.bg_thread.join()
|
self.bg_thread.join()
|
||||||
def set_rollover_info(self, name, info):
|
def set_rollover_info(self, name, info):
|
||||||
|
if info is None:
|
||||||
|
self.rollover_info.pop(name, None)
|
||||||
|
return
|
||||||
self.rollover_info[name] = info
|
self.rollover_info[name] = info
|
||||||
def clear_rollover_info(self):
|
def clear_rollover_info(self):
|
||||||
self.rollover_info.clear()
|
self.rollover_info.clear()
|
||||||
|
|
|
@ -61,7 +61,8 @@ class WebRequest:
|
||||||
value = self.params.get(item, default)
|
value = self.params.get(item, default)
|
||||||
if value is Sentinel:
|
if value is Sentinel:
|
||||||
raise WebRequestError("Missing Argument [%s]" % (item,))
|
raise WebRequestError("Missing Argument [%s]" % (item,))
|
||||||
if types is not None and type(value) not in types:
|
if (types is not None and type(value) not in types
|
||||||
|
and item in self.params):
|
||||||
raise WebRequestError("Invalid Argument Type [%s]" % (item,))
|
raise WebRequestError("Invalid Argument Type [%s]" % (item,))
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -168,19 +169,30 @@ class ClientConnection:
|
||||||
self.sock.fileno(), self.process_received)
|
self.sock.fileno(), self.process_received)
|
||||||
self.partial_data = self.send_buffer = ""
|
self.partial_data = self.send_buffer = ""
|
||||||
self.is_sending_data = False
|
self.is_sending_data = False
|
||||||
logging.info(
|
self.set_client_info("?", "New connection")
|
||||||
"webhooks: New connection established")
|
|
||||||
|
def set_client_info(self, client_info, state_msg=None):
|
||||||
|
if state_msg is None:
|
||||||
|
state_msg = "Client info %s" % (repr(client_info),)
|
||||||
|
logging.info("webhooks client %s: %s", self.uid, state_msg)
|
||||||
|
log_id = "webhooks %s" % (self.uid,)
|
||||||
|
if client_info is None:
|
||||||
|
self.printer.set_rollover_info(log_id, None, log=False)
|
||||||
|
return
|
||||||
|
rollover_msg = "webhooks client %s: %s" % (self.uid, repr(client_info))
|
||||||
|
self.printer.set_rollover_info(log_id, rollover_msg, log=False)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self.fd_handle is not None:
|
if self.fd_handle is None:
|
||||||
logging.info("webhooks: Client connection closed")
|
return
|
||||||
self.reactor.unregister_fd(self.fd_handle)
|
self.set_client_info(None, "Disconnected")
|
||||||
self.fd_handle = None
|
self.reactor.unregister_fd(self.fd_handle)
|
||||||
try:
|
self.fd_handle = None
|
||||||
self.sock.close()
|
try:
|
||||||
except socket.error:
|
self.sock.close()
|
||||||
pass
|
except socket.error:
|
||||||
self.server.pop_client(self.uid)
|
pass
|
||||||
|
self.server.pop_client(self.uid)
|
||||||
|
|
||||||
def is_closed(self):
|
def is_closed(self):
|
||||||
return self.fd_handle is None
|
return self.fd_handle is None
|
||||||
|
@ -276,9 +288,12 @@ class WebHooks:
|
||||||
web_request.send({'endpoints': self._endpoints.keys()})
|
web_request.send({'endpoints': self._endpoints.keys()})
|
||||||
|
|
||||||
def _handle_info_request(self, web_request):
|
def _handle_info_request(self, web_request):
|
||||||
|
client_info = web_request.get_dict('client_info', None)
|
||||||
|
if client_info is not None:
|
||||||
|
web_request.get_client_connection().set_client_info(client_info)
|
||||||
state_message, state = self.printer.get_state_message()
|
state_message, state = self.printer.get_state_message()
|
||||||
klipper_path = os.path.normpath(os.path.join(
|
src_path = os.path.dirname(__file__)
|
||||||
os.path.dirname(__file__), ".."))
|
klipper_path = os.path.normpath(os.path.join(src_path, ".."))
|
||||||
response = {'state': state, 'state_message': state_message,
|
response = {'state': state, 'state_message': state_message,
|
||||||
'hostname': socket.gethostname(),
|
'hostname': socket.gethostname(),
|
||||||
'klipper_path': klipper_path, 'python_path': sys.executable}
|
'klipper_path': klipper_path, 'python_path': sys.executable}
|
||||||
|
|
Loading…
Reference in New Issue