#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;
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);
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)
#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;
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
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;
}
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)
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
_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;