From: SangYoun Kwak Date: Thu, 7 Mar 2024 02:11:38 +0000 (+0900) Subject: Modify plugin to use update-control-server.conf X-Git-Tag: accepted/tizen/unified/20240318.071413~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=855d89d0937edd90fa4c57a9a360914a35cfaf53;p=platform%2Fcore%2Fsystem%2Fplugin%2Fupdate-control-generic.git Modify plugin to use update-control-server.conf Previously, informations like download url and file name to download are defined by this plugin. Since update-control-server.conf(created by the script make-update-control-config.sh) provides download url(with file name) and account(user id, api key), there is no need to make url and file name in the plugin. Below is an example of update-control-server.conf: > [BART] > delta_url= > user_id= > api_key= Change-Id: Ib02467370776c8ef095ed755b4e38f09c3535ba2 Signed-off-by: SangYoun Kwak --- diff --git a/src/plugin.c b/src/plugin.c index d402fdc..e343dfa 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "http_util.h" #include "plugin.h" @@ -34,22 +35,11 @@ #undef EXPORT #define EXPORT __attribute__ ((visibility("default"))) -/* Assumed format for file below: - user_id - api_key -*/ -#define BART_CREDS_FILE_PATH "/etc/bart" -#define TIZEN_BUILD_CONFIG_PATH "/etc/tizen-build.conf" +#define UPDATE_CONTROL_SERVER_CONFIG "/opt/usr/update-control-server.conf" /* This dir will be used to store delta */ #define DELTA_DIR "/opt/usr/data/fota/" - -#define BART_BASE_URL "https://bart.sec.samsung.net/artifactory/tizen-system-upgrade-tools-generic-local/tests/" - -#define STR_SIZE 250 - -/* overkill */ -#define URL_SIZE 7 * STR_SIZE +#define FIRMWARE_FILE_NAME "delta.tar.gz" /* Update dbus */ #define UPDATE_BUS_NAME "org.tizen.system.update" @@ -57,33 +47,23 @@ #define UPDATE_INTERFACE_NAME UPDATE_BUS_NAME".Update" #define UPDATE_METHOD "do_update" -#define FIRMWARE_FILE_NAME "delta.tar.gz" - -/* For now it is the only type */ -#define DELTA_TYPE_DEFAULT "all" - #ifdef DEBUG_MODE #define DEBUG_FLAG "/opt/etc/.debugupdate" #endif -static struct _bart_account { +#define STR_SIZE 250 +#define URL_SIZE 7 * STR_SIZE + +static struct _server_account { char api_key[STR_SIZE]; char user_id[STR_SIZE]; -} *bart_account; +} *server_account; static struct _update_info { char package_uri[URL_SIZE]; int updatable; } *update_info; -static struct _device_info { - char device_type[STR_SIZE]; - char model_name[STR_SIZE]; - char arch[STR_SIZE]; - char build_release_name[STR_SIZE]; - char build_date[STR_SIZE]; -} *device_info; - static alarm_id_t reserved_update_alarm_id = -1; static bool package_downloaded = false; @@ -95,207 +75,6 @@ static alarm_id_t polling_alarm_id = -1; static bool debug_mode = false; #endif -static int read_one_line(char *buff, FILE *fp) -{ - char *line = NULL; - size_t n = 0; - ssize_t read = getline(&line, &n, fp); - if (read < 0) { - _E("getline() failed"); - - if (line) - free(line); - - return SYSCOMMON_UPDATE_CONTROL_ERROR_SYSTEM_ERROR; - } - - strncpy(buff, line, STR_SIZE); - buff[strcspn(buff, "\n")] = '\0'; - - free(line); - return SYSCOMMON_UPDATE_CONTROL_ERROR_NONE; -} - -static int get_bart_account_creds(void) -{ - _I("Get BART account credentials from etc file"); - - FILE *fp = fopen(BART_CREDS_FILE_PATH, "r"); - retvm_if(!fp, SYSCOMMON_UPDATE_CONTROL_ERROR_SYSTEM_ERROR, "Failed to open %s", BART_CREDS_FILE_PATH); - - int ret; - ret = read_one_line(bart_account->user_id, fp); - if (ret < 0) { - _E("Failed to read user_id"); - goto exit; - } - - ret = read_one_line(bart_account->api_key, fp); - if (ret < 0) { - _E("Failed to read api_key"); - goto exit; - } - - ret = SYSCOMMON_UPDATE_CONTROL_ERROR_NONE; - _D("BART credentials -> API key: [%s], User ID: [%s]", - bart_account->api_key, bart_account->user_id); - -exit: - fclose(fp); - return ret; -} - -static void strncpy_guard_truncate(char *dest, char *src, size_t n) -{ - memcpy(dest, src, n); - dest[n - 1] = '\0'; -} - -static int get_platform_string(char *dest, const char *name) -{ - char *info = NULL; - retvm_if((system_info_get_platform_string(name, &info) != 0), - SYSCOMMON_UPDATE_CONTROL_ERROR_KEY_NOT_FOUND, "Failed to get platform string at key: %s", name); - - strncpy_guard_truncate(dest, info, STR_SIZE); - - free(info); - return SYSCOMMON_UPDATE_CONTROL_ERROR_NONE; -} - -static void change_slash_to_floor(char* str) -{ - size_t off = strcspn(str, "/"); - if (off < strlen(str)) - str[off] = '_'; -} - -static int get_strings_from_file(FILE *fp, off_t file_size) -{ - const char *arch_key = "TZ_BUILD_ARCH"; - const char *build_date_key = "TZ_BUILD_DATE"; - const char *build_release_name_key = "TZ_BUILD_RELEASE_NAME"; - const int keys_count = 3; - - const char *separators = " =\n\""; - - char *read_buf = (char *)malloc(file_size + 1); - retvm_if(!read_buf, SYSCOMMON_UPDATE_CONTROL_ERROR_OUT_OF_MEMORY, "Not enough memory"); - - int ret = SYSCOMMON_UPDATE_CONTROL_ERROR_NONE; - if (fread(read_buf, 1, file_size, fp) != file_size) { - _E("Reading config file failed"); - ret = SYSCOMMON_UPDATE_CONTROL_ERROR_SYSTEM_ERROR; - goto cleanup; - } - read_buf[file_size] = '\0'; - - int loop_iter = 0, keys_processed = 0; - char *read_word = strtok(read_buf, separators); - - while (read_word) { - if (keys_processed == keys_count) break; - - loop_iter++; - if (loop_iter % 2 == 1) { - if ((strcmp(read_word, arch_key) == 0) || (strcmp(read_word, build_date_key) == 0) - || (strcmp(read_word, build_release_name_key) == 0)) { - char* key = strdup(read_word); - char* value = strtok(NULL, separators); - - if (!key) { - _E("Failed to strdup for read_word"); - ret = SYSCOMMON_UPDATE_CONTROL_ERROR_OUT_OF_MEMORY; - goto cleanup; - } - - if (strcmp(key, arch_key) == 0) { - strncpy_guard_truncate(device_info->arch, value, STR_SIZE); - } - else if (strcmp(key, build_date_key) == 0) { - strncpy_guard_truncate(device_info->build_date, value, STR_SIZE); - } - else if (strcmp(key, build_release_name_key)) { - // There is a floor in BART so we need to add it - change_slash_to_floor(value); - strncpy_guard_truncate(device_info->build_release_name, value, STR_SIZE); - } - - loop_iter++; - keys_processed++; - free(key); - } - } - - read_word = strtok(NULL, separators); - } - - if (keys_processed != keys_count) { - _E("Unexpected parsing error"); - ret = SYSCOMMON_UPDATE_CONTROL_ERROR_SYSTEM_ERROR; - } - -cleanup: - if (read_buf) - free(read_buf); - - return ret; -} - -static int get_device_info(void) -{ - _I("Getting device into"); - - int ret = SYSCOMMON_UPDATE_CONTROL_ERROR_NONE; - - ret = get_platform_string(device_info->device_type, "http://tizen.org/system/device_type"); - retvm_if(ret != SYSCOMMON_UPDATE_CONTROL_ERROR_NONE, ret, "Failed to get device_type"); - - ret = get_platform_string(device_info->model_name, "http://tizen.org/system/model_name"); - retvm_if(ret != SYSCOMMON_UPDATE_CONTROL_ERROR_NONE, ret, "Failed to get model_name"); - - FILE *fp = fopen(TIZEN_BUILD_CONFIG_PATH, "r"); - retvm_if(!fp, SYSCOMMON_UPDATE_CONTROL_ERROR_NONE, "Failed to open %s", TIZEN_BUILD_CONFIG_PATH); - - fseek(fp, 0, SEEK_END); - off_t file_size = ftello(fp); - if (file_size == -1) { - _E("File size check error"); - ret = SYSCOMMON_UPDATE_CONTROL_ERROR_SYSTEM_ERROR; - goto cleanup; - } - fseek(fp, 0 , SEEK_SET); - - ret = get_strings_from_file(fp, file_size); - if (ret != SYSCOMMON_UPDATE_CONTROL_ERROR_NONE) { - _E("Failed to parse device info form config file: [%s]", TIZEN_BUILD_CONFIG_PATH); - goto cleanup; - } - - _D("Device info -> device_type: %s, model_name: %s, arch: %s, build_date: %s", - device_info->device_type, device_info->model_name, device_info->arch, device_info->build_date); - -cleanup: - fclose(fp); - return ret; -} - -static void build_package_url(void) -{ - /* URL template: - "BASE_URL//--------@latest.tar.gz" - */ - snprintf(update_info->package_uri, URL_SIZE, "%s%s/%s--%s--%s--%s--%s@latest.tar.gz", - BART_BASE_URL, device_info->build_release_name, device_info->device_type, - device_info->model_name, DELTA_TYPE_DEFAULT, device_info->arch, device_info->build_date); - - _D("Package URL -> %s", update_info->package_uri); -} - -/* - These are implemented much lower in this file. - Placed here for readability. - */ static int update_control_check_new_version(void); static int update_control_download_package(void); static int update_control_do_update(void); @@ -463,17 +242,37 @@ exit: static void init_internal_data(void) { - bart_account->user_id[0] = '\0'; - bart_account->api_key[0] = '\0'; + server_account->user_id[0] = '\0'; + server_account->api_key[0] = '\0'; update_info->package_uri[0] = '\0'; update_info->updatable = 0; +} + +static int update_server_config_parser_cb(struct parse_result *result, void *user_data) +{ + if (strncmp(result->section, "BART", sizeof("BART")) != 0) + return 0; - device_info->device_type[0] = '\0'; - device_info->model_name[0] = '\0'; - device_info->arch[0] = '\0'; - device_info->build_release_name[0] = '\0'; - device_info->build_date[0] = '\0'; + if (strncmp(result->name, "delta_url", sizeof("delta_url")) == 0) { + strncpy(update_info->package_uri, result->value, URL_SIZE); + update_info->package_uri[URL_SIZE - 1] = '\0'; + return 0; + } + + if (strncmp(result->name, "user_id", sizeof("user_id")) == 0) { + strncpy(server_account->user_id, result->value, STR_SIZE); + server_account->user_id[STR_SIZE - 1] = '\0'; + return 0; + } + + if (strncmp(result->name, "api_key", sizeof("api_key")) == 0) { + strncpy(server_account->api_key, result->value, STR_SIZE); + server_account->api_key[STR_SIZE - 1] = '\0'; + return 0; + } + + return 0; } static int update_control_initialize(void) @@ -490,12 +289,11 @@ static int update_control_initialize(void) #endif int ret = SYSCOMMON_UPDATE_CONTROL_ERROR_NONE; - bart_account = NULL; + server_account = NULL; update_info = NULL; - device_info = NULL; - bart_account = (struct _bart_account *)malloc(sizeof(*bart_account)); - if (!bart_account) { + server_account = (struct _server_account *)malloc(sizeof(*server_account)); + if (!server_account) { _E("Failed to malloc"); ret = SYSCOMMON_UPDATE_CONTROL_ERROR_OUT_OF_MEMORY; goto exit_error; @@ -508,31 +306,15 @@ static int update_control_initialize(void) goto exit_error; } - device_info = (struct _device_info *)malloc(sizeof(*device_info)); - if (!device_info) { - _E("Failed to malloc"); - ret = SYSCOMMON_UPDATE_CONTROL_ERROR_OUT_OF_MEMORY; - goto exit_error; - } - init_internal_data(); - ret = get_bart_account_creds(); - if (ret != SYSCOMMON_UPDATE_CONTROL_ERROR_NONE) { - _E("Failed to read file with BART account credentials"); - ret = SYSCOMMON_UPDATE_CONTROL_ERROR_SYSTEM_ERROR; - goto exit_error; - } - - ret = get_device_info(); - if (ret != SYSCOMMON_UPDATE_CONTROL_ERROR_NONE) { - _E("Failed to get device info"); + ret = config_parse(UPDATE_CONTROL_SERVER_CONFIG, update_server_config_parser_cb, NULL); + if (ret < 0) { + _E("Failed to parse %s", UPDATE_CONTROL_SERVER_CONFIG); ret = SYSCOMMON_UPDATE_CONTROL_ERROR_SYSTEM_ERROR; goto exit_error; } - build_package_url(); - init_update_alarm(); #ifdef SET_POLLING @@ -542,12 +324,10 @@ static int update_control_initialize(void) return SYSCOMMON_UPDATE_CONTROL_ERROR_NONE; exit_error: - if (bart_account) - free(bart_account); + if (server_account) + free(server_account); if (update_info) free(update_info); - if (device_info) - free(device_info); return ret; } @@ -566,8 +346,7 @@ static int update_control_deinitialize(void) int ret; free(update_info); - free(bart_account); - free(device_info); + free(server_account); if (reserved_update_alarm_id != -1) { if ((ret = alarmmgr_remove_alarm(reserved_update_alarm_id)) < 0) @@ -605,8 +384,8 @@ static int update_control_check_new_version(void) int exists; retvm_if( - http_util_check_remote_file_exists(update_info->package_uri, bart_account->user_id, - bart_account->api_key, &exists) != 0, + http_util_check_remote_file_exists(update_info->package_uri, server_account->user_id, + server_account->api_key, &exists) != 0, SYSCOMMON_UPDATE_CONTROL_ERROR_CONNECTION_REFUSED, "Failed to check if latest delta for this device exists on remote server (URL: %s)", update_info->package_uri @@ -656,7 +435,7 @@ static int update_control_download_package(void) _I("Download url[%s] download path[%s]", update_info->package_uri, download_path); ret = http_util_download_file((const char *)update_info->package_uri, (const char *)download_path, - (const char *)bart_account->user_id, (const char *)bart_account->api_key); + (const char *)server_account->user_id, (const char *)server_account->api_key); if (ret < 0) { _E("Failed to download firmware[%d]", ret); ret = SYSCOMMON_UPDATE_CONTROL_ERROR_CONNECTION_REFUSED;