diff --git a/docs/custom-cli.md b/docs/custom-cli.md index 3b574cea..8150e0de 100644 --- a/docs/custom-cli.md +++ b/docs/custom-cli.md @@ -123,7 +123,7 @@ Notes: - the panel still uses the repeater admin password for access - commands run with the same care as if you typed them into the repeater CLI directly - this is intended for local admin use on a trusted network -- `start ota` releases the local HTTP redirect listener on port `80` so the OTA HTTP listener can take over without stopping the rest of the repeater services +- `start ota` releases the local HTTP redirect listener on port `80` so the OTA HTTP listener can take over without stopping the rest of the repeater services, regardless of whether the command is run from the web panel, serial CLI, or a remote companion/app CLI session ## Companion WiFi Rescue Commands diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index cf0ede95..a615f00f 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -2056,6 +2056,9 @@ void MyMesh::clearStats() { } void MyMesh::prepareForOTAStart() { +#if defined(ESP_PLATFORM) && WITH_WEB_PANEL + web.prepareForOTAStart(); +#endif } void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply) { diff --git a/src/helpers/web/WebPanelServer.cpp b/src/helpers/web/WebPanelServer.cpp index 39dc3996..5b397bd9 100644 --- a/src/helpers/web/WebPanelServer.cpp +++ b/src/helpers/web/WebPanelServer.cpp @@ -2816,11 +2816,6 @@ esp_err_t WebPanelServer::handleCommand(httpd_req_t* req) { ctx->self->noteActivity(); memset(reply, 0, kWebReplyBufferSize); - if (strcmp(command, "start ota") == 0) { - // OTA serves its own HTTP listener on port 80, so release the - // web-panel redirect listener first or it will keep owning that port. - ctx->self->stopRedirectServer(); - } ctx->self->_runner->runWebCommand(command, reply, kWebReplyBufferSize); httpd_resp_set_type(req, "text/plain; charset=utf-8"); httpd_resp_set_hdr(req, "Cache-Control", "no-store"); @@ -2937,6 +2932,9 @@ bool WebPanelServer::start() { void WebPanelServer::stop() { } +void WebPanelServer::stopRedirectServer() { +} + bool WebPanelServer::isRunning() const { return false; } diff --git a/src/helpers/web/WebPanelServer.h b/src/helpers/web/WebPanelServer.h index ba63808e..7c76ed08 100644 --- a/src/helpers/web/WebPanelServer.h +++ b/src/helpers/web/WebPanelServer.h @@ -41,6 +41,7 @@ public: void setCommandRunner(WebPanelCommandRunner* runner); bool start(); void stop(); + void stopRedirectServer(); bool isRunning() const; bool hasSessionToken() const; bool shouldAutoLock(unsigned long now_ms) const; @@ -71,7 +72,6 @@ private: void refreshToken(); bool isAuthorized(httpd_req_t* req) const; void noteActivity(); - void stopRedirectServer(); #else WebPanelCommandRunner* _runner; #endif diff --git a/src/helpers/web/WebService.cpp b/src/helpers/web/WebService.cpp index 1420526d..2f588d11 100644 --- a/src/helpers/web/WebService.cpp +++ b/src/helpers/web/WebService.cpp @@ -26,6 +26,13 @@ void WebService::suspendForOTA() { #endif } +void WebService::prepareForOTAStart() { +#if defined(ESP_PLATFORM) && WITH_WEB_PANEL + _suspended_for_ota = true; + _panel.stopRedirectServer(); +#endif +} + void WebService::loop() { #if defined(ESP_PLATFORM) && WITH_WEB_PANEL ensureWebServer(); @@ -91,10 +98,16 @@ void WebService::formatWebStatusReply(char* reply, size_t reply_size) const { #if defined(ESP_PLATFORM) && WITH_WEB_PANEL void WebService::ensureWebServer() { - if (_suspended_for_ota || _runner == nullptr || _prefs.web_enabled == 0 || _network == nullptr || !_network->isWifiConnected()) { + if (_runner == nullptr || _prefs.web_enabled == 0 || _network == nullptr || !_network->isWifiConnected()) { _panel.stop(); return; } + if (_suspended_for_ota) { + if (_panel.isRunning()) { + _panel.stopRedirectServer(); + } + return; + } if (_panel.isRunning()) { return; } diff --git a/src/helpers/web/WebService.h b/src/helpers/web/WebService.h index 4275b890..be6aa43e 100644 --- a/src/helpers/web/WebService.h +++ b/src/helpers/web/WebService.h @@ -15,6 +15,7 @@ public: void end(); void loop(); void suspendForOTA(); + void prepareForOTAStart(); void setCommandRunner(WebPanelCommandRunner* runner); void setNetworkStateProvider(NetworkStateProvider* network) { _network = network; }