From 00ae4001e76238ba04de6fe69f9d9815caa59a11 Mon Sep 17 00:00:00 2001 From: Mike Hansen Date: Wed, 22 Jan 2025 19:49:46 -0500 Subject: [PATCH] [OLS-563] Add version to ols-ucentral-client Add version to ols-ucentral-client Augment the build to pull the schema version file from the ols-ucentral-schema repo (if present) based on commit id of schema used as baseline for this client version. Use both it and the version to provide the version information in the connect message. Signed-off-by: Mike Hansen --- Dockerfile | 7 +- Makefile | 7 ++ src/docker/Dockerfile | 2 + .../platform/example-platform/Makefile | 4 + .../platform/example-platform/plat-example.c | 44 ++++++++- .../platform/example-platform/plat-revision.h | 14 +++ src/ucentral-client/proto.c | 94 +++++++++++++++---- src/ucentral-client/ucentral-client.c | 2 + src/ucentral-client/ucentral.h | 2 + version.json | 5 + 10 files changed, 160 insertions(+), 21 deletions(-) create mode 100644 src/ucentral-client/platform/example-platform/plat-revision.h create mode 100644 version.json diff --git a/Dockerfile b/Dockerfile index 4447d58..f444edc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ LABEL Description="Ucentral client (Build) environment" ARG HOME /root ARG EXTERNAL_LIBS ${HOME}/ucentral-external-libs - +ARG SCHEMA_COMMITID adeeb0457b7060d192e4180f96eca60d562d1d15 SHELL ["/bin/bash", "-c"] RUN apt-get update -q -y && apt-get -q -y --no-install-recommends install \ @@ -30,6 +30,7 @@ RUN git clone https://github.com/DaveGamble/cJSON.git ${HOME}/ucentral-external- RUN git clone https://libwebsockets.org/repo/libwebsockets ${HOME}/ucentral-external-libs/libwebsockets/ RUN git clone --recurse-submodules -b v1.50.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc ${HOME}/ucentral-external-libs/grpc/ RUN git clone --recursive --branch v7.1.4 https://github.com/zhaojh329/rtty.git ${HOME}/ucentral-external-libs/rtty/ +RUN git clone https://github.com/Telecominfraproject/ols-ucentral-schema.git ${HOME}/ucentral-external-libs/ols-ucentral-schema/ # The following libs should be prebuilt in docker-build-env img to speed-up # recompilation of only the ucentral-client itself @@ -62,3 +63,7 @@ RUN cd ${HOME}/ucentral-external-libs/rtty/ && \ cd build && \ cmake .. && \ make -j4 + +RUN cd ${HOME}/ucentral-external-libs/ols-ucentral-schema/ && \ + git checkout ${SCHEMA_COMMITID} + diff --git a/Makefile b/Makefile index cb2e240..e81131b 100644 --- a/Makefile +++ b/Makefile @@ -50,8 +50,13 @@ build-ucentral-app: run-host-env @echo Running ucentralclient docker-build-env container to build ucentral-client...; docker exec -t ${CONTAINER_NAME} /root/ols-nos/docker-build-client.sh docker cp ${CONTAINER_NAME}:/root/deliverables/ src/docker/ + # copy the schema version, if it is there + docker cp ${CONTAINER_NAME}:/root/ucentral-external-libs/ols-ucentral-schema/schema.json src/docker/ || true docker container stop ${CONTAINER_NAME} > /dev/null 2>&1 || true; docker container rm ${CONTAINER_NAME} > /dev/null 2>&1 || true; + if [ -f version.json ]; then + cp version.json src/docker/ + fi build-ucentral-docker-img: build-ucentral-app pushd src @@ -91,6 +96,8 @@ clean: rm -rf src/docker/deliverables || true; rm -rf src/docker/lib* || true; rm -rf src/docker/ucentral-client || true; + rm -rf src/docker/version.json || true; + rm -rf src/docker/schema.json || true; rm -rf src/debian/ucentral-client.substvars 2>/dev/null || true; rm -rf src/debian/shasta-ucentral-client.debhelper.log 2>/dev/null || true; rm -rf src/debian/.debhelper src/debian/ucentral-client 2>/dev/null || true; diff --git a/src/docker/Dockerfile b/src/docker/Dockerfile index dc900c2..43cb1b1 100644 --- a/src/docker/Dockerfile +++ b/src/docker/Dockerfile @@ -21,6 +21,8 @@ COPY /ucentral-client /usr/local/bin/ucentral-client COPY /rtty /usr/local/bin/ COPY /lib* /usr/local/lib/ +COPY /version.jso[n] /etc/ +COPY /schema.jso[n] /etc/ RUN ldconfig RUN ls -l /usr/local/bin/ucentral-client diff --git a/src/ucentral-client/platform/example-platform/Makefile b/src/ucentral-client/platform/example-platform/Makefile index 918797b..843b6af 100644 --- a/src/ucentral-client/platform/example-platform/Makefile +++ b/src/ucentral-client/platform/example-platform/Makefile @@ -2,4 +2,8 @@ plat.a: plat-example.o ar crs $@ $^ %.o: %.c +ifdef PLATFORM_REVISION + gcc -c -o $@ ${CFLAGS} -I ./ -I ../../include -D PLATFORM_REVISION='"$(PLATFORM_REVISION)"' $^ +else gcc -c -o $@ ${CFLAGS} -I ./ -I ../../include $^ +endif diff --git a/src/ucentral-client/platform/example-platform/plat-example.c b/src/ucentral-client/platform/example-platform/plat-example.c index 6f6494c..ef00332 100644 --- a/src/ucentral-client/platform/example-platform/plat-example.c +++ b/src/ucentral-client/platform/example-platform/plat-example.c @@ -2,6 +2,7 @@ #include #include +#include #define UNUSED_PARAM(param) (void)((param)) @@ -12,7 +13,11 @@ int plat_init(void) int plat_info_get(struct plat_platform_info *info) { - UNUSED_PARAM(info); + *info = (struct plat_platform_info){0}; + snprintf(info->platform, sizeof info->platform, "%s", "Example Platform" ); + snprintf(info->hwsku, sizeof info->hwsku, "%s", "example-platform-sku"); + snprintf(info->mac, sizeof info->mac, "%s", "24:fe:9a:0f:48:f0"); + return 0; } @@ -156,10 +161,45 @@ int plat_port_num_get(uint16_t *num_of_active_ports) UNUSED_PARAM(num_of_active_ports); return 0; } - +int plat_revision_get(char *str, size_t str_max_len) +{ + snprintf(str, str_max_len, PLATFORM_REVISION); + return 0; +} +int plat_reboot_cause_get(struct plat_reboot_cause *cause) +{ + UNUSED_PARAM(cause); + return 0; +} +int plat_event_subscribe(const struct plat_event_callbacks *cbs) +{ + UNUSED_PARAM(cbs); + return 0; +} +void plat_event_unsubscribe(void) +{ + return; +} + int plat_running_img_name_get(char *str, size_t str_max_len) { UNUSED_PARAM(str_max_len); UNUSED_PARAM(str); return 0; } +int plat_metrics_save(const struct plat_metrics_cfg *cfg) +{ + UNUSED_PARAM(cfg); + return 0; +} +int plat_metrics_restore(struct plat_metrics_cfg *cfg) +{ + UNUSED_PARAM(cfg); + return 0; +} +int plat_run_script(struct plat_run_script *p) +{ + UNUSED_PARAM(p); + return 0; +} + diff --git a/src/ucentral-client/platform/example-platform/plat-revision.h b/src/ucentral-client/platform/example-platform/plat-revision.h new file mode 100644 index 0000000..f57445e --- /dev/null +++ b/src/ucentral-client/platform/example-platform/plat-revision.h @@ -0,0 +1,14 @@ +#ifndef _PLAT_REVISION +#define _PLAT_REVISION + +#define XSTR(x) STR(x) +#define STR(x) #x + +#define PLATFORM_REL_NUM 3.2.0 +#define PLATFORM_BUILD_NUM 5 + +#ifndef PLATFORM_REVISION +#define PLATFORM_REVISION "Rel " XSTR(PLATFORM_REL_NUM) " build " XSTR(PLATFORM_BUILD_NUM) +#endif + +#endif diff --git a/src/ucentral-client/proto.c b/src/ucentral-client/proto.c index 8c92d1c..3604788 100644 --- a/src/ucentral-client/proto.c +++ b/src/ucentral-client/proto.c @@ -406,17 +406,46 @@ err: proto_destroy_blob(&blob); } -void -connect_send(void) -{ +static cJSON *readJsonFile(const char *filename) { + + FILE *file = fopen(filename, "r"); + + if (!file) { + fprintf(stderr, "Error opening file: %s\n", filename); + return NULL; + } + + cJSON *ret; + + // Get the file size + fseek(file, 0, SEEK_END); + long fileSize = ftell(file); + fseek(file, 0, SEEK_SET); + + // Read the entire file into a buffer + char *buffer = (char *)malloc(fileSize + 1); + fread(buffer, 1, fileSize, file); + buffer[fileSize] = '\0'; // Null-terminate the string + + // Close the file + fclose(file); + + ret = cJSON_Parse(buffer); + + return ret; +} + +void connect_send(void) { /* WIP: TMP hardcode; to be removed*/ unsigned mac[6]; struct plat_platform_info pinfo = {0}; - struct plat_metrics_cfg restore_metrics = { 0 }; + struct plat_metrics_cfg restore_metrics = {0}; struct blob blob = {0}; uint64_t uuid_buf; /* fixed storage size */ cJSON *params; cJSON *cap; + cJSON *ver; + int ret; blob.obj = proto_new_blob("connect"); @@ -446,7 +475,6 @@ connect_send(void) if (password) { if (!cJSON_AddStringToObject(params, "password", password)) goto err; - memset(password, 0, strlen(password)); free(password); password = NULL; @@ -456,30 +484,60 @@ connect_send(void) if (!cap) goto err; + ver = cJSON_AddObjectToObject(cap, "version"); + if (!ver) + goto err; + if (plat_info_get(&pinfo)) { UC_LOG_CRIT("failed to get platform info"); - } else { - if (!cJSON_AddStringToObject(cap, "compatible", pinfo.hwsku)) - goto err; - - if (!cJSON_AddStringToObject(cap, "model", pinfo.platform)) - goto err; } + if (!cJSON_AddStringToObject(cap, "serial", client.serial)) + goto err; + + if (!cJSON_AddStringToObject(cap, "firmware", client.firmware)) + goto err; + + cJSON *client_version_json = readJsonFile(client.ols_client_version_file); + if (!client_version_json) + goto err; + if (!cJSON_AddItemToObject(ver, "switch", client_version_json)) + goto err; + else + UC_LOG_DBG("client version added to connect.capabilities.version"); + + cJSON *schema_version_json = readJsonFile(client.ols_schema_version_file); + if (!schema_version_json) { + UC_LOG_DBG("No schema version present."); + } + else { + if (!cJSON_AddItemToObject(ver, "schema", schema_version_json)) + goto err; + else + UC_LOG_DBG("schema version added to connect.capabilities.version"); + } + + if (!cJSON_AddStringToObject(cap, "compatible", pinfo.hwsku)) + goto err; + + if (!cJSON_AddStringToObject(cap, "model", pinfo.platform)) + goto err; + if (!cJSON_AddStringToObject(cap, "platform", "switch")) goto err; if (client.serial && - sscanf(client.serial, "%2x%2x%2x%2x%2x%2x", - &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + sscanf(client.serial, "%2x%2x%2x%2x%2x%2x", + &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { char label_mac[32]; snprintf(label_mac, sizeof label_mac, - "%02x:%02x:%02x:%02x:%02x:%02x", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + "%02x:%02x:%02x:%02x:%02x:%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); if (!cJSON_AddStringToObject(cap, "label_macaddr", label_mac)) { goto err; } - } else { + } + else { UC_LOG_DBG("failed to parse serial as label_macaddr"); } @@ -490,11 +548,11 @@ connect_send(void) if (ucentral_metrics.state.enabled) plat_state_poll(state_send, - ucentral_metrics.state.interval); + ucentral_metrics.state.interval); if (ucentral_metrics.healthcheck.enabled) plat_health_poll(health_send, - ucentral_metrics.healthcheck.interval); + ucentral_metrics.healthcheck.interval); } UC_LOG_DBG("xmit connect\n"); diff --git a/src/ucentral-client/ucentral-client.c b/src/ucentral-client/ucentral-client.c index 31eab15..b36d683 100644 --- a/src/ucentral-client/ucentral-client.c +++ b/src/ucentral-client/ucentral-client.c @@ -67,6 +67,8 @@ lws_protocols protocols[] = { struct client_config client = { .redirector_file = "/tmp/ucentral-redirector.json", .redirector_file_dbg = "/tmp/firstcontact.hdr", + .ols_schema_version_file = "/etc/schema.json", + .ols_client_version_file = "/etc/version.json", .server = NULL, .port = 15002, .path = "/", diff --git a/src/ucentral-client/ucentral.h b/src/ucentral-client/ucentral.h index e78e61b..88b4f23 100644 --- a/src/ucentral-client/ucentral.h +++ b/src/ucentral-client/ucentral.h @@ -41,6 +41,8 @@ extern "C" { struct client_config { const char *redirector_file; const char *redirector_file_dbg; + const char *ols_client_version_file; + const char *ols_schema_version_file; const char *server; int16_t port; const char *path; diff --git a/version.json b/version.json new file mode 100644 index 0000000..308f0c7 --- /dev/null +++ b/version.json @@ -0,0 +1,5 @@ +{ + "major": 3, + "minor": 2, + "patch": 7 +}