diff --git a/daemon/analytics.c b/daemon/analytics.c index 89091a4878..4501a46a50 100644 --- a/daemon/analytics.c +++ b/daemon/analytics.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "common.h" +#include "buildinfo.h" struct analytics_data analytics_data; extern void analytics_exporting_connectors (BUFFER *b); @@ -359,47 +360,23 @@ void analytics_alarms_notifications(void) buffer_free(b); } -char *get_value_from_key(char *buffer, char *key) -{ - char *s = NULL, *t = NULL; - s = t = buffer + strlen(key) + 2; - if (s) { - while (*s == '\'') - s++; - while (*++t != '\0'); - while (--t > s && *t == '\'') - *t = '\0'; - } - return s; -} - -/* - * Checks for the existence of .install_type file and reads it - */ void analytics_get_install_type(void) { - char *install_type_filename; - analytics_set_data_str(&analytics_data.netdata_install_type, ""); - analytics_set_data_str(&analytics_data.netdata_prebuilt_distro, ""); + struct install_type_info t = get_install_type(); - int install_type_filename_len = (strlen(netdata_configured_user_config_dir) + strlen(".install-type") + 3); - install_type_filename = mallocz(sizeof(char) * install_type_filename_len); - snprintfz(install_type_filename, install_type_filename_len - 1, "%s/%s", netdata_configured_user_config_dir, ".install-type"); - - FILE *fp = fopen(install_type_filename, "r"); - if (fp) { - char *s, buf[256 + 1]; - size_t len = 0; - - while ((s = fgets_trim_len(buf, 256, fp, &len))) { - if (!strncmp(buf, "INSTALL_TYPE='", 14)) - analytics_set_data_str(&analytics_data.netdata_install_type, (char *)get_value_from_key(buf, "INSTALL_TYPE")); - else if (!strncmp(buf, "PREBUILT_DISTRO='", 17)) - analytics_set_data_str(&analytics_data.netdata_prebuilt_distro, (char *)get_value_from_key(buf, "PREBUILT_DISTRO")); - } - fclose(fp); + if (t.install_type == NULL) { + analytics_set_data_str(&analytics_data.netdata_install_type, "unknown"); + } else { + analytics_set_data_str(&analytics_data.netdata_install_type, t.install_type); } - freez(install_type_filename); + + if (t.prebuilt_distro != NULL) { + analytics_set_data_str(&analytics_data.netdata_prebuilt_distro, t.prebuilt_distro); + } + + freez(t.prebuilt_arch); + freez(t.prebuilt_distro); + freez(t.install_type); } /* diff --git a/daemon/buildinfo.c b/daemon/buildinfo.c index 6566537696..b64a78f29c 100644 --- a/daemon/buildinfo.c +++ b/daemon/buildinfo.c @@ -3,6 +3,7 @@ #include <stdio.h> #include "./config.h" #include "common.h" +#include "buildinfo.h" // Optional features @@ -207,9 +208,71 @@ #define FEAT_YES_NO(x) ((x) ? "YES" : "NO") + +char *get_value_from_key(char *buffer, char *key) { + char *s = NULL, *t = NULL; + s = t = buffer + strlen(key) + 2; + if (s) { + while (*s == '\'') + s++; + while (*++t != '\0'); + while (--t > s && *t == '\'') + *t = '\0'; + } + return s; +} + +struct install_type_info get_install_type() { + char *install_type_filename; + struct install_type_info ret = {.install_type = NULL, .prebuilt_arch = NULL, .prebuilt_distro = NULL}; + + int install_type_filename_len = (strlen(netdata_configured_user_config_dir) + strlen(".install-type") + 3); + install_type_filename = mallocz(sizeof(char) * install_type_filename_len); + snprintfz(install_type_filename, install_type_filename_len - 1, "%s/%s", netdata_configured_user_config_dir, ".install-type"); + + FILE *fp = fopen(install_type_filename, "r"); + if (fp) { + char *s, buf[256 + 1]; + size_t len = 0; + + while ((s = fgets_trim_len(buf, 256, fp, &len))) { + if (!strncmp(buf, "INSTALL_TYPE='", 14)) + ret.install_type = strdupz((char *)get_value_from_key(buf, "INSTALL_TYPE")); + else if (!strncmp(buf, "PREBUILT_ARCH='", 15)) + ret.prebuilt_arch = strdupz((char *)get_value_from_key(buf, "PREBUILT_ARCH")); + else if (!strncmp(buf, "PREBUILT_DISTRO='", 17)) + ret.prebuilt_distro = strdupz((char *)get_value_from_key(buf, "PREBUILT_DISTRO")); + } + fclose(fp); + } + freez(install_type_filename); + + return ret; +} + void print_build_info(void) { + struct install_type_info t = get_install_type(); + printf("Configure options: %s\n", CONFIGURE_COMMAND); + if (t.install_type == NULL) { + printf("Install type: unknown\n"); + } else { + printf("Install type: %s\n", t.install_type); + } + + if (t.prebuilt_arch != NULL) { + printf(" Binary architecture: %s\n", t.prebuilt_arch); + } + + if (t.prebuilt_distro != NULL) { + printf(" Packaging distro: %s\n", t.prebuilt_distro); + } + + freez(t.install_type); + freez(t.prebuilt_arch); + freez(t.prebuilt_distro); + printf("Features:\n"); printf(" dbengine: %s\n", FEAT_YES_NO(FEAT_DBENGINE)); printf(" Native HTTPS: %s\n", FEAT_YES_NO(FEAT_NATIVE_HTTPS)); @@ -250,7 +313,6 @@ void print_build_info(void) { printf(" Prometheus Remote Write: %s\n", FEAT_YES_NO(FEAT_REMOTE_WRITE)); }; - #define FEAT_JSON_BOOL(x) ((x) ? "true" : "false") // This intentionally does not use JSON-C so it works even if JSON-C is not present // This is used for anonymous statistics reporting, so it intentionally diff --git a/daemon/buildinfo.h b/daemon/buildinfo.h index 05e5efb5af..e2a31c94aa 100644 --- a/daemon/buildinfo.h +++ b/daemon/buildinfo.h @@ -3,8 +3,18 @@ #ifndef NETDATA_BUILDINFO_H #define NETDATA_BUILDINFO_H 1 +struct install_type_info { + char *install_type; + char *prebuilt_arch; + char *prebuilt_distro; +}; + extern void print_build_info(void); extern void print_build_info_json(void); +extern char *get_value_from_key(char *buffer, char *key); + +extern struct install_type_info get_install_type(); + #endif // NETDATA_BUILDINFO_H