Modify plugin to use update-control-server.conf 85/307485/1
authorSangYoun Kwak <sy.kwak@samsung.com>
Thu, 7 Mar 2024 02:11:38 +0000 (11:11 +0900)
committerSangYoun Kwak <sy.kwak@samsung.com>
Mon, 11 Mar 2024 04:52:58 +0000 (13:52 +0900)
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=<url for delta download>
> user_id=<user id to authenticate delta url>
> api_key=<api key corresponds to the user id above>

Change-Id: Ib02467370776c8ef095ed755b4e38f09c3535ba2
Signed-off-by: SangYoun Kwak <sy.kwak@samsung.com>
src/plugin.c

index d402fdc4745f971e857afd2903b7f034963c07ae..e343dfa5b383e03afacf20dc8870682291dbf99e 100644 (file)
@@ -24,6 +24,7 @@
 #include <alarm.h>
 #include <hal/device/hal-board.h>
 #include <system_info.h>
+#include <libsyscommon/ini-parser.h>
 
 #include "http_util.h"
 #include "plugin.h"
 #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"
 #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/<build_release_name>/<device_type>--<model_name>--<delta_type>--<tz_build_arch>--<tz_build_date>@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;