From f0e7bbe358264b380684226fd098d5ecae5dd413 Mon Sep 17 00:00:00 2001 From: Kelvin Ly Date: Tue, 18 Mar 2025 22:21:45 -0400 Subject: [PATCH] Switch to using libssh2 from someone who knows how to properly configure it --- .gitmodules | 3 - shroom-controller/.gitignore | 2 + .../components/libssh2/CMakeLists.txt | 10 -- shroom-controller/components/libssh2/libssh2 | 1 - shroom-controller/dependencies.lock | 18 ++++ shroom-controller/main/CMakeLists.txt | 3 +- shroom-controller/main/idf_component.yml | 17 ++++ shroom-controller/main/main.c | 97 +++++++++++++++++-- shroom-controller/sdkconfig | 7 ++ 9 files changed, 133 insertions(+), 25 deletions(-) delete mode 100644 shroom-controller/components/libssh2/CMakeLists.txt delete mode 160000 shroom-controller/components/libssh2/libssh2 create mode 100644 shroom-controller/dependencies.lock create mode 100644 shroom-controller/main/idf_component.yml diff --git a/.gitmodules b/.gitmodules index be4fa79..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "shroom-controller/components/libssh2/libssh2"] - path = shroom-controller/components/libssh2/libssh2 - url = https://github.com/libssh2/libssh2 diff --git a/shroom-controller/.gitignore b/shroom-controller/.gitignore index 567609b..eee61db 100644 --- a/shroom-controller/.gitignore +++ b/shroom-controller/.gitignore @@ -1 +1,3 @@ +.cache/ build/ +managed_components/ diff --git a/shroom-controller/components/libssh2/CMakeLists.txt b/shroom-controller/components/libssh2/CMakeLists.txt deleted file mode 100644 index 9651504..0000000 --- a/shroom-controller/components/libssh2/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -idf_component_register( - SRC_DIRS "libssh2/src" # "libssh2/src/threads" "libssh2/src/external" - INCLUDE_DIRS "libssh2/include" - PRIV_INCLUDE_DIRS "libssh2/src" - REQUIRES "mbedtls" -) - - -# _3DS is used to have libssh2 provide its own iovec; it doesn't seem to trigger any other behavior for now -target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-error=format -Wno-error=char-subscripts -DLIBSSH2_MBEDTLS -DHAVE_SYS_SOCKET_H) diff --git a/shroom-controller/components/libssh2/libssh2 b/shroom-controller/components/libssh2/libssh2 deleted file mode 160000 index a312b43..0000000 --- a/shroom-controller/components/libssh2/libssh2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a312b43325e3383c865a87bb1d26cb52e3292641 diff --git a/shroom-controller/dependencies.lock b/shroom-controller/dependencies.lock new file mode 100644 index 0000000..9540ae2 --- /dev/null +++ b/shroom-controller/dependencies.lock @@ -0,0 +1,18 @@ +dependencies: + idf: + source: + type: idf + version: 5.4.0 + skuodi/libssh2_esp: + component_hash: a65c753c7388cf47299765dc8c8a22dccdc53d1e72a2fb0cf361c1f800067a63 + dependencies: [] + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.0 +direct_dependencies: +- idf +- skuodi/libssh2_esp +manifest_hash: d8b4209272b4e81a14bbef159a9fa99da51e39fb3a9a5dd92295f22e4eb5cf79 +target: esp32 +version: 2.0.0 diff --git a/shroom-controller/main/CMakeLists.txt b/shroom-controller/main/CMakeLists.txt index d4d870b..4331c28 100644 --- a/shroom-controller/main/CMakeLists.txt +++ b/shroom-controller/main/CMakeLists.txt @@ -5,7 +5,8 @@ idf_component_register( esp_driver_gpio esp_wifi nvs_flash - libssh2 + libssh2_esp + ) # TODO maybe add the commands to generate these? diff --git a/shroom-controller/main/idf_component.yml b/shroom-controller/main/idf_component.yml new file mode 100644 index 0000000..94b25eb --- /dev/null +++ b/shroom-controller/main/idf_component.yml @@ -0,0 +1,17 @@ +## IDF Component Manager Manifest File +dependencies: + ## Required IDF version + idf: + version: '>=4.1.0' + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true + skuodi/libssh2_esp: ^1.0.0 diff --git a/shroom-controller/main/main.c b/shroom-controller/main/main.c index fae92ad..0dc06d0 100644 --- a/shroom-controller/main/main.c +++ b/shroom-controller/main/main.c @@ -38,6 +38,8 @@ static void event_handler(void* arg, esp_event_base_t event_base, if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { esp_wifi_connect(); } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + // TODO is this correct? + xEventGroupClearBits(s_wifi_event_group, WIFI_CONNECTED_BIT); if (s_retry_num < 5) { esp_wifi_connect(); s_retry_num++; @@ -90,6 +92,9 @@ void main_task(void* args) { bool connect_success = false; libssh2_socket_t sock = LIBSSH2_INVALID_SOCKET; + LIBSSH2_SESSION* session = 0; + LIBSSH2_CHANNEL* channel = 0; + for (struct addrinfo* rp = results; rp; rp = rp->ai_next) { ESP_LOGI(TAG, "creating socket fam %d type %d proto %d", rp->ai_family, rp->ai_socktype, rp->ai_protocol); sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); @@ -117,35 +122,107 @@ void main_task(void* args) { ESP_LOGI(TAG, "connection established, creating SSH session..."); - LIBSSH2_SESSION* session = libssh2_session_init(); + session = libssh2_session_init(); if (!session) { ESP_LOGE(TAG, "could not create libssh2 session"); - // TODO error out + break; } - libssh2_trace(session, -0); + //libssh2_session_set_read_timeout(session, 20); + + libssh2_trace(session, -1); libssh2_session_handshake(session, sock); const char* fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); const char username[] = "shrooms"; - extern char* _binary_shrooms_key_start; - extern size_t _binary_shrooms_key_size; - extern char* _binary_shrooms_key_pub_start; - extern size_t _binary_shrooms_key_pub_size; + extern char _binary_shrooms_key_start[]; + extern char _binary_shrooms_key_end[]; + size_t shrooms_key_size = _binary_shrooms_key_end - _binary_shrooms_key_start; + extern char _binary_shrooms_key_pub_start[]; + extern char _binary_shrooms_key_pub_end[]; + size_t shrooms_key_pub_size = _binary_shrooms_key_pub_end - _binary_shrooms_key_pub_start; + ESP_LOGI(TAG, "pub key %p %p %d key %p %p %d", + _binary_shrooms_key_pub_start, + _binary_shrooms_key_pub_end, + shrooms_key_pub_size, + _binary_shrooms_key_start, + _binary_shrooms_key_end, + shrooms_key_size + ); rc = libssh2_userauth_publickey_frommemory( session, username, sizeof(username) - 1, _binary_shrooms_key_pub_start, - _binary_shrooms_key_pub_size, + shrooms_key_pub_size, _binary_shrooms_key_start, - _binary_shrooms_key_size, + shrooms_key_size, NULL); - // TODO the rest of it + if (rc) { + ESP_LOGE(TAG, "could not authenticate, err %d", rc); + break; + } + + ESP_LOGE(TAG, "authenticated, opening channel..."); + channel = libssh2_channel_open_session(session); + if (!channel) { + ESP_LOGE(TAG, "unable to open channel"); + break; + } + + rc = libssh2_channel_request_pty(channel, "vanilla"); + if (rc) { + ESP_LOGE(TAG, "unable to request pty %d", rc); + break; + } + + ESP_LOGE(TAG, "executing command..."); + rc = libssh2_channel_exec(channel, "./runtest.sh"); + if (rc) { + ESP_LOGE(TAG, "could not open channel"); + } + //libssh2_session_set_timeout(session, 20); + + ESP_LOGE(TAG, "waiting for results..."); + while (!libssh2_channel_eof(channel)) { + ESP_LOGE(TAG, "waiting for read loop"); + char tmp[256]; + ssize_t rlen = libssh2_channel_read(channel, tmp, sizeof(tmp) - 1); + if (rlen < 0) { + ESP_LOGE(TAG, "received err %d", rlen); + continue; + } + + tmp[rlen] = 0; + + ESP_LOGI(TAG, "received %s", tmp); + } + + ESP_LOGI(TAG, "ssh exiting"); + //rc = libssh2_channel_get_get_exit_status(channel); + + //cleanup: + if (libssh2_channel_close(channel)) { + ESP_LOGE(TAG, "could not close channel"); + } + if (channel) { + libssh2_channel_free(channel); + } + channel = 0; + + if (session) { + libssh2_session_disconnect(session, "normal shutdown"); + libssh2_session_free(session); + } + + if (sock != LIBSSH2_INVALID_SOCKET) { + shutdown(sock, 2); + LIBSSH2_SOCKET_CLOSE(sock); + } break; } diff --git a/shroom-controller/sdkconfig b/shroom-controller/sdkconfig index c837ab3..b967c00 100644 --- a/shroom-controller/sdkconfig +++ b/shroom-controller/sdkconfig @@ -1866,6 +1866,13 @@ CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y # CONFIG_WIFI_PROV_STA_FAST_SCAN is not set # end of Wi-Fi Provisioning Manager + +# +# libssh2 +# +CONFIG_LIBSSH2_CRYPTO_ENGINE_MBEDTLS=y +CONFIG_LIBSSH2_DEBUG_ENABLE=y +# end of libssh2 # end of Component config # CONFIG_IDF_EXPERIMENTAL_FEATURES is not set