async def _handle_update_request(self, web_request: WebRequest ) -> str: await self.initialized_lock.wait() if await self._check_klippy_printing(): raise self.server.error("Update Refused: Klippy is printing") app: str = web_request.get_endpoint().split("/")[-1] if app == "client": app = web_request.get('name') if self.cmd_helper.is_app_updating(app): return f"Object {app} is currently being updated" updater = self.updaters.get(app, None) if updater is None: raise self.server.error(f"Updater {app} not available", 404) async with self.cmd_request_lock: self.cmd_helper.set_update_info(app, id(web_request)) try: if not await self._check_need_reinstall(app): await updater.update() except Exception as e: self.cmd_helper.notify_update_response( f"Error updating {app}") self.cmd_helper.notify_update_response( str(e), is_complete=True) raise finally: self.cmd_helper.clear_update_info() return "ok"
async def _request_standard(self, web_request: WebRequest) -> Any: rpc_method = web_request.get_endpoint() args = web_request.get_args() # Create a base klippy request base_request = KlippyRequest(rpc_method, args) self.pending_requests[base_request.id] = base_request self.event_loop.register_callback(self._write_request, base_request) return await base_request.wait()
async def _handle_machine_request(self, web_request: WebRequest) -> str: ep = web_request.get_endpoint() if ep == "/machine/shutdown": await self.shutdown_machine() elif ep == "/machine/reboot": await self.reboot_machine() else: raise self.server.error("Unsupported machine request") return "ok"
async def _request_standard(self, web_request: WebRequest) -> Any: rpc_method = web_request.get_endpoint() args = web_request.get_args() # Create a base klippy request base_request = BaseRequest(rpc_method, args) self.pending_requests[base_request.id] = base_request self.ioloop.spawn_callback(self.klippy_connection.send_request, base_request) return await base_request.wait()
async def make_request(self, web_request: WebRequest) -> Any: rpc_method = web_request.get_endpoint() if rpc_method == "objects/subscribe": return await self._request_subscripton(web_request) else: if rpc_method == "gcode/script": script = web_request.get_str('script', "") data_store: DataStore = self.lookup_component('data_store') data_store.store_gcode_command(script) return await self._request_standard(web_request)
async def _handle_machine_request(self, web_request: WebRequest) -> str: ep = web_request.get_endpoint() if self.inside_container: raise self.server.error( f"Cannot {ep.split('/')[-1]} from within a " f"{self.virt_id} container") if ep == "/machine/shutdown": await self.shutdown_machine() elif ep == "/machine/reboot": await self.reboot_machine() else: raise self.server.error("Unsupported machine request") return "ok"
async def request(self, web_request: WebRequest) -> Any: if not self.is_connected(): raise ServerError("Klippy Host not connected", 503) rpc_method = web_request.get_endpoint() if rpc_method == "objects/subscribe": return await self._request_subscripton(web_request) else: if rpc_method == "gcode/script": script = web_request.get_str('script', "") if script: self.server.send_event( "klippy_connection:gcode_received", script) return await self._request_standard(web_request)
async def _handle_machine_request(self, web_request: WebRequest) -> str: ep = web_request.get_endpoint() if self.inside_container: virt_id = self.system_info['virtualization'].get('virt_id', "none") raise self.server.error( f"Cannot {ep.split('/')[-1]} from within a " f"{virt_id} container") if ep == "/machine/shutdown": await self.sys_provider.shutdown() elif ep == "/machine/reboot": await self.sys_provider.reboot() else: raise self.server.error("Unsupported machine request") return "ok"
async def _handle_batch_wled_request( self: WLED, web_request: WebRequest) -> Dict[str, Any]: args = web_request.get_args() ep = web_request.get_endpoint() if not args: raise self.server.error("No arguments provided") requested_strips = {k: self.strips.get(k, None) for k in args} result = {} req = ep.split("/")[-1] for name, strip in requested_strips.items(): if strip is not None: result[name] = await self._process_request(strip, req, -1) else: result[name] = {"error": "strip_not_found"} return result
async def _handle_batch_power_request( self, web_request: WebRequest) -> Dict[str, Any]: args = web_request.get_args() ep = web_request.get_endpoint() if not args: raise self.server.error("No arguments provided") requested_devs = {k: self.devices.get(k, None) for k in args} result = {} req = ep.split("/")[-1] for name, device in requested_devs.items(): if device is not None: result[name] = await self._process_request(device, req) else: result[name] = "device_not_found" return result
async def _handle_service_request(self, web_request: WebRequest) -> str: name: str = web_request.get('service') action = web_request.get_endpoint().split('/')[-1] if name == "moonraker": if action != "restart": raise self.server.error( f"Service action '{action}' not available for moonraker") event_loop = self.server.get_event_loop() event_loop.register_callback(self.do_service_action, action, name) elif self.sys_provider.is_service_available(name): await self.do_service_action(action, name) else: if name in ALLOWED_SERVICES: raise self.server.error(f"Service '{name}' not installed") raise self.server.error(f"Service '{name}' not allowed") return "ok"
async def _handle_service_request(self, web_request: WebRequest) -> str: name: str = web_request.get('service') action = web_request.get_endpoint().split('/')[-1] if name == "moonraker": if action != "restart": raise self.server.error( f"Service action '{action}' not available for moonraker") IOLoop.current().spawn_callback(self.do_service_action, action, name) elif name in self.available_services: await self.do_service_action(action, name) else: if name in ALLOWED_SERVICES and \ name not in self.available_services: raise self.server.error(f"Service '{name}' not installed") raise self.server.error(f"Service '{name}' not allowed") return "ok"