From 8bbd49acf4e923442d773cdfba7034af44b4fe42 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 9 Jan 2023 20:31:14 +0100 Subject: [PATCH] Modify /version to match the new /etc/pihole/versions file format Signed-off-by: DL6ER --- src/api/docs/content/specs/version.yaml | 127 +++++++++++++++++------- src/api/version.c | 118 ++++++++++++++++------ src/files.c | 30 ++++++ src/files.h | 2 + 4 files changed, 210 insertions(+), 67 deletions(-) diff --git a/src/api/docs/content/specs/version.yaml b/src/api/docs/content/specs/version.yaml index fd9d1ccf..1bdac546 100644 --- a/src/api/docs/content/specs/version.yaml +++ b/src/api/docs/content/specs/version.yaml @@ -21,40 +21,97 @@ components: version: type: object properties: - web: + version: type: object properties: - branch: - type: string - description: web branch - example: "master" - tag: - type: string - description: web tag - example: "v6.0" - core: - type: object - properties: - branch: - type: string - description: core branch - example: "master" - tag: - type: string - description: core tag - example: "v6.0" - ftl: - type: object - properties: - branch: - type: string - description: FTL branch - example: "master" - tag: - type: string - description: FTL tag - example: "v6.0" - date: - type: string - description: FTL build time - example: "2021-05-12 21:04:55 +0200" + core: + type: object + properties: + local: + type: object + properties: + branch: + type: string + description: Local Pi-hole Core branch + example: "development" + version: + type: string + description: Local Pi-hole Core version + example: "v6.1" + hash: + type: string + description: Local Pi-hole Core hash + example: "955e36a9" + remote: + type: object + properties: + version: + type: string + description: Remote (Github) Pi-hole Core version + example: "v6.1" + hash: + type: string + description: Remote (Github) Pi-hole Core hash + example: "955e36a9" + web: + type: object + properties: + local: + type: object + properties: + branch: + type: string + description: Local Pi-hole Web branch + example: "devel" + version: + type: string + description: Local Pi-hole Web version + example: "v6.1" + hash: + type: string + description: Local Pi-hole Web hash + example: "f69f7e88" + remote: + type: object + properties: + version: + type: string + description: Remote (Github) Pi-hole Web version + example: "v6.1" + hash: + type: string + description: Remote (Github) Pi-hole Web hash + example: "f69f7e88" + ftl: + type: object + properties: + local: + type: object + properties: + branch: + type: string + description: Local Pi-hole FTL branch + example: "development" + version: + type: string + description: Local Pi-hole FTL version + example: "v6.1" + hash: + type: string + description: Local Pi-hole FTL hash + example: "64441ed6-dirty" + date: + type: string + description: Build time of your local Pi-hole FTL + example: "2023-01-09 20:25:24 +0100" + remote: + type: object + properties: + version: + type: string + description: Remote (Github) Pi-hole FTL version + example: "v6.1" + hash: + type: string + description: Remote (Github) Pi-hole FTL hash + example: "64441ed6" \ No newline at end of file diff --git a/src/api/version.c b/src/api/version.c index e7664564..0b514181 100644 --- a/src/api/version.c +++ b/src/api/version.c @@ -8,52 +8,106 @@ * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ -#include "../FTL.h" -#include "../webserver/http-common.h" -#include "../webserver/json_macros.h" +#include "FTL.h" +#include "webserver/http-common.h" +#include "webserver/json_macros.h" #include "api.h" // get_FTL_version() -#include "../log.h" -#include "../version.h" +#include "log.h" +#include "version.h" +// prase_line() +#include "files.h" + +#define VERSIONS_FILE "/etc/pihole/versions" int api_version(struct ftl_conn *api) { - cJSON *json = JSON_NEW_OBJECT(); + char *line = NULL; + size_t len = 0; + ssize_t read; + char *key, *value; + cJSON *core_local = JSON_NEW_OBJECT(); + cJSON *web_local = JSON_NEW_OBJECT(); + cJSON *ftl_local = JSON_NEW_OBJECT(); + cJSON *core_remote = JSON_NEW_OBJECT(); + cJSON *web_remote = JSON_NEW_OBJECT(); + cJSON *ftl_remote = JSON_NEW_OBJECT(); - FILE* file; - char coreversion[256] = "N/A", webversion[256] = "N/A"; - if((file = fopen("/etc/pihole/localversions", "r")) != NULL) + FILE *fp = fopen(VERSIONS_FILE, "r"); + if(!fp) + return send_json_error(api, 500, + "internal_error", + "Failed to read " VERSIONS_FILE, + NULL); + + // Loop over KEY=VALUE parts in the versions file + while((read = getline(&line, &len, fp)) != -1) { - igr(fscanf(file, "%255s %255s", coreversion, webversion)); - fclose(file); - } - char corebranch[256] = "N/A", webbranch[256] = "N/A"; - if((file = fopen("/etc/pihole/localbranches", "r")) != NULL) - { - igr(fscanf(file, "%255s %255s", corebranch, webbranch)); - fclose(file); + if (parse_line(line, &key, &value)) + continue; + + if(strcmp(key, "CORE_BRANCH") == 0) + JSON_COPY_STR_TO_OBJECT(core_local, "branch", value); + else if(strcmp(key, "WEB_BRANCH") == 0) + JSON_COPY_STR_TO_OBJECT(web_local, "branch", value); + // Added below from the running FTL binary itself + //else if(strcmp(key, "FTL_BRANCH") == 0) + // JSON_COPY_STR_TO_OBJECT(ftl_local, "branch", value); + else if(strcmp(key, "CORE_VERSION") == 0) + JSON_COPY_STR_TO_OBJECT(core_local, "version", value); + else if(strcmp(key, "WEB_VERSION") == 0) + JSON_COPY_STR_TO_OBJECT(web_local, "version", value); + // Added below from the running FTL binary itself + //else if(strcmp(key, "FTL_VERSION") == 0) + // JSON_COPY_STR_TO_OBJECT(ftl_local, "version", value); + else if(strcmp(key, "GITHUB_CORE_VERSION") == 0) + JSON_COPY_STR_TO_OBJECT(core_remote, "version", value); + else if(strcmp(key, "GITHUB_WEB_VERSION") == 0) + JSON_COPY_STR_TO_OBJECT(web_remote, "version", value); + else if(strcmp(key, "GITHUB_FTL_VERSION") == 0) + JSON_COPY_STR_TO_OBJECT(ftl_remote, "version", value); + else if(strcmp(key, "CORE_HASH") == 0) + JSON_COPY_STR_TO_OBJECT(core_local, "hash", value); + else if(strcmp(key, "WEB_HASH") == 0) + JSON_COPY_STR_TO_OBJECT(web_local, "hash", value); + else if(strcmp(key, "FTL_HASH") == 0) + JSON_COPY_STR_TO_OBJECT(ftl_local, "hash", value); + else if(strcmp(key, "GITHUB_CORE_HASH") == 0) + JSON_COPY_STR_TO_OBJECT(core_remote, "hash", value); + else if(strcmp(key, "GITHUB_WEB_HASH") == 0) + JSON_COPY_STR_TO_OBJECT(web_remote, "hash", value); + else if(strcmp(key, "GITHUB_FTL_HASH") == 0) + JSON_COPY_STR_TO_OBJECT(ftl_remote, "hash", value); } - // Build web object - cJSON *web = JSON_NEW_OBJECT(); - JSON_REF_STR_IN_OBJECT(web, "branch", webbranch); - JSON_REF_STR_IN_OBJECT(web, "tag", webversion); - JSON_ADD_ITEM_TO_OBJECT(json, "web", web); + // Free allocated memory and release file pointer + free(line); + fclose(fp); + + // Add remaining properties to ftl object + JSON_REF_STR_IN_OBJECT(ftl_local, "branch", GIT_BRANCH); + JSON_REF_STR_IN_OBJECT(ftl_local, "version", get_FTL_version()); + JSON_REF_STR_IN_OBJECT(ftl_local, "date", GIT_DATE); + + cJSON *version = JSON_NEW_OBJECT(); - // Build core object cJSON *core = JSON_NEW_OBJECT(); - JSON_REF_STR_IN_OBJECT(core, "branch", corebranch); - JSON_REF_STR_IN_OBJECT(core, "tag", coreversion); - JSON_ADD_ITEM_TO_OBJECT(json, "core", core); + JSON_ADD_ITEM_TO_OBJECT(core, "local", core_local); + JSON_ADD_ITEM_TO_OBJECT(core, "remote", core_remote); + JSON_ADD_ITEM_TO_OBJECT(version, "core", core); + + cJSON *web = JSON_NEW_OBJECT(); + JSON_ADD_ITEM_TO_OBJECT(web, "local", web_local); + JSON_ADD_ITEM_TO_OBJECT(web, "remote", web_remote); + JSON_ADD_ITEM_TO_OBJECT(version, "web", web); - // Build ftl object cJSON *ftl = JSON_NEW_OBJECT(); - JSON_REF_STR_IN_OBJECT(ftl, "branch", GIT_BRANCH); - const char *version = get_FTL_version(); - JSON_REF_STR_IN_OBJECT(ftl, "tag", version); - JSON_REF_STR_IN_OBJECT(ftl, "date", GIT_DATE); - JSON_ADD_ITEM_TO_OBJECT(json, "ftl", ftl); + JSON_ADD_ITEM_TO_OBJECT(ftl, "local", ftl_local); + JSON_ADD_ITEM_TO_OBJECT(ftl, "remote", ftl_remote); + JSON_ADD_ITEM_TO_OBJECT(version, "ftl", ftl); // Send reply + cJSON *json = JSON_NEW_OBJECT(); + JSON_ADD_ITEM_TO_OBJECT(json, "version", version); JSON_SEND_OBJECT(json); } \ No newline at end of file diff --git a/src/files.c b/src/files.c index 17920845..c4fc1edb 100644 --- a/src/files.c +++ b/src/files.c @@ -217,3 +217,33 @@ int get_filepath_usage(const char *file, char buffer[64]) // Get percentage of disk usage at this path return get_path_usage(path, buffer); } + +// Credits: https://stackoverflow.com/a/55410469 +static char *trim(char *str) +{ + char *start = str; + char *end = str + strlen(str); + + while(*start && isspace(*start)) + start++; + + while(end > start && isspace(*(end - 1))) + end--; + + *end = '\0'; + return start; +} + +// Credits: https://stackoverflow.com/a/55410469 +int parse_line(char *line, char **key, char **value) +{ + char *ptr = strchr(line, '='); + if (ptr == NULL) + return -1; + + *ptr++ = '\0'; + *key = trim(line); + *value = trim(ptr); + + return 0; +} \ No newline at end of file diff --git a/src/files.h b/src/files.h index 51fe1323..65f58bf6 100644 --- a/src/files.h +++ b/src/files.h @@ -19,4 +19,6 @@ void ls_dir(const char* path); int get_path_usage(const char *path, char buffer[64]); int get_filepath_usage(const char *file, char buffer[64]); +int parse_line(char *line, char **key, char **value); + #endif //FILE_H