From cab6a30615a337a03d88c424be28d8ee23d5cc83 Mon Sep 17 00:00:00 2001 From: Joel Guittet Date: Tue, 18 Jul 2023 00:16:35 +0200 Subject: [PATCH] tests: add troubleshoot add-on --- .github/workflows/build_tests.sh | 12 ++--- .github/workflows/ci.yml | 9 +++- tests/CMakeLists.txt | 6 +++ tests/src/main.c | 86 ++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_tests.sh b/.github/workflows/build_tests.sh index b927e3b..5598291 100755 --- a/.github/workflows/build_tests.sh +++ b/.github/workflows/build_tests.sh @@ -29,19 +29,19 @@ mkdir build cd build # Build ESP-IDF use case -cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="freertos" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=ON -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON +cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="freertos" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=ON -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON -DCONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT=ON make -j$(nproc) -cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="freertos" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=OFF -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON +cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="esp-idf" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="freertos" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=OFF -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON -DCONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT=ON make -j$(nproc) # Build Zephyr use case -cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=ON -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON +cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=ON -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON -DCONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT=ON make -j$(nproc) -cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=OFF -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON +cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="zephyr" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=OFF -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON -DCONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT=ON make -j$(nproc) # Build Posix use case -cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="curl" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=ON -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON +cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="curl" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=ON -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON -DCONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT=ON make -j$(nproc) -cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="curl" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=OFF -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON +cmake .. -G "Unix Makefiles" -DCONFIG_MENDER_MCU_CLIENT_BOARD_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_NET_TYPE="curl" -DCONFIG_MENDER_MCU_CLIENT_RTOS_TYPE="posix" -DCONFIG_MENDER_MCU_CLIENT_TLS_TYPE="mbedtls" -DCONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE=ON -DCONFIG_MENDER_CLIENT_CONFIGURE_STORAGE=OFF -DCONFIG_MENDER_CLIENT_ADD_ON_INVENTORY=ON -DCONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT=ON make -j$(nproc) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 258233e..d2a6d0c 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,14 @@ jobs: - name: Install libcurl run: | wget -q -O - https://github.com/curl/curl/archive/refs/tags/curl-8_1_2.tar.gz | tar xz - cd curl-curl-8_1_2 && autoreconf -fi && ./configure --with-openssl && make && sudo make install + cd curl-curl-8_1_2 && autoreconf -fi && ./configure --with-openssl --enable-websockets && make -j$(nproc) && sudo make install + - name: Install msgpack-c + run: | + wget -q -O - https://github.com/msgpack/msgpack-c/archive/refs/tags/c-6.0.0.tar.gz | tar xz + cd msgpack-c-c-6.0.0 && cmake . -DMSGPACK_BUILD_TESTS=OFF -DMSGPACK_BUILD_EXAMPLES=OFF && make -j$(nproc) && sudo make install + - name: Refresh the dynamic linker cache + run: | + sudo ldconfig - name: Run build-wrapper run: | build-wrapper-linux-x86-64 --out-dir bw_output ./.github/workflows/build_tests.sh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a9bb980..748f076 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -90,6 +90,9 @@ if(CONFIG_MENDER_CLIENT_ADD_ON_INVENTORY) add_compile_definitions(CONFIG_MENDER_CLIENT_INVENTORY_REFRESH_INTERVAL=${CONFIG_MENDER_CLIENT_INVENTORY_REFRESH_INTERVAL}) endif() endif() +if(CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT) + add_compile_definitions(CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT) +endif() # Add definitions depending of the target if(CONFIG_MENDER_MCU_CLIENT_BOARD_TYPE MATCHES "zephyr") @@ -127,6 +130,9 @@ include("${CMAKE_CURRENT_LIST_DIR}/../CMakeLists.txt") # Link the executable with the mender-mcu-library target_link_libraries(${APP_EXECUTABLE_NAME} mender-mcu-client pthread) +if(CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT) + target_link_libraries(${APP_EXECUTABLE_NAME} msgpack-c) +endif() if(CONFIG_MENDER_MCU_CLIENT_NET_TYPE MATCHES "curl") target_link_libraries(${APP_EXECUTABLE_NAME} curl) endif() diff --git a/tests/src/main.c b/tests/src/main.c index a25f186..29f4ca7 100644 --- a/tests/src/main.c +++ b/tests/src/main.c @@ -34,6 +34,7 @@ #include "mender-inventory.h" #include "mender-log.h" #include "mender-ota.h" +#include "mender-troubleshoot.h" /** * @brief Mender client options @@ -72,6 +73,12 @@ authentication_success_cb(void) { return ret; } #endif /* CONFIG_MENDER_CLIENT_ADD_ON_INVENTORY */ +#ifdef CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT + if (MENDER_OK != (ret = mender_troubleshoot_activate())) { + mender_log_error("Unable to activate troubleshoot add-on"); + return ret; + } +#endif /* CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT */ /* Validate the image if it is still pending */ /* Note it is possible to do multiple diagnosic tests before validating the image */ @@ -161,6 +168,70 @@ config_updated_cb(mender_keystore_t *configuration) { #endif /* CONFIG_MENDER_CLIENT_CONFIGURE_STORAGE */ #endif /* CONFIG_MENDER_CLIENT_ADD_ON_CONFIGURE */ +#ifdef CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT + +/** + * @brief Shell connected callback + * @param terminal_height Terminal height + * @param terminal_width Terminal width + * @return MENDER_OK if the function succeeds, error code otherwise + */ +static mender_err_t +shell_connected_cb(uint16_t terminal_height, uint16_t terminal_width) { + + /* Just print terminal size */ + mender_log_info("Shell connected with height=%d and width=%d", terminal_height, terminal_width); + + return MENDER_OK; +} + +/** + * @brief Shell resized callback + * @param terminal_height Terminal height + * @param terminal_width Terminal width + * @return MENDER_OK if the function succeeds, error code otherwise + */ +static mender_err_t +shell_resized_cb(uint16_t terminal_height, uint16_t terminal_width) { + + /* Just print terminal size */ + mender_log_info("Shell resized with height=%d and width=%d", terminal_height, terminal_width); + + return MENDER_OK; +} + +/** + * @brief Shell data callback + * @param body Shell data received + * @return MENDER_OK if the function succeeds, error code otherwise + */ +static mender_err_t +shell_data_cb(char *body) { + + /* Specific treatement in case carriage return is received */ + if (!strcmp(body, "\r")) { + return mender_troubleshoot_shell_print("\r\n"); + } + + /* Just send back the data received */ + return mender_troubleshoot_shell_print(body); +} + +/** + * @brief Shell disconnected callback + * @return MENDER_OK if the function succeeds, error code otherwise + */ +static mender_err_t +shell_disconnected_cb(void) { + + /* Just print disconnected */ + mender_log_info("Shell disconnected"); + + return MENDER_OK; +} + +#endif /* CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT */ + /** * @brief Signal handler * @param signo Signal number @@ -296,13 +367,28 @@ main(int argc, char **argv) { mender_inventory_config_t mender_inventory_config = { .refresh_interval_s = 0 }; mender_inventory_init(&mender_inventory_config); #endif /* CONFIG_MENDER_CLIENT_ADD_ON_INVENTORY */ +#ifdef CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT + mender_troubleshoot_config_t mender_troubleshoot_config = { .poll_interval_ms = 0, .healthcheck_interval_ms = 0 }; + mender_troubleshoot_callbacks_t mender_troubleshoot_callbacks = { + .shell_connected = shell_connected_cb, .shell_resized = shell_resized_cb, .shell_data = shell_data_cb, .shell_disconnected = shell_disconnected_cb + }; + mender_troubleshoot_init(&mender_troubleshoot_config, &mender_troubleshoot_callbacks); +#endif /* CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT */ /* Wait for mender-mcu-client events */ pthread_mutex_lock(&mender_client_events_mutex); pthread_cond_wait(&mender_client_events_cond, &mender_client_events_mutex); pthread_mutex_unlock(&mender_client_events_mutex); + /* Deactivate mender add-ons */ +#ifdef CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT + mender_troubleshoot_deactivate(); +#endif /* CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT */ + /* Release mender add-ons */ +#ifdef CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT + mender_troubleshoot_exit(); +#endif /* CONFIG_MENDER_CLIENT_ADD_ON_TROUBLESHOOT */ #ifdef CONFIG_MENDER_CLIENT_ADD_ON_INVENTORY mender_inventory_exit(); #endif /* CONFIG_MENDER_CLIENT_ADD_ON_INVENTORY */