From 9d6bcd408243bc8f9a77f1e4848d9cd6ee524fa0 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Wed, 16 Sep 2020 15:33:28 +0900 Subject: [PATCH 01/16] Fix shared data migration script chsmack should by done recursively. Add missing chsmack command. Change-Id: I359312df9e4647c11a264120b9d7899f6a9ee92e Signed-off-by: Sangyoon Jang --- data/updates/upgrade_to_30005.sh.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/updates/upgrade_to_30005.sh.in b/data/updates/upgrade_to_30005.sh.in index 6226536..79d2d3a 100644 --- a/data/updates/upgrade_to_30005.sh.in +++ b/data/updates/upgrade_to_30005.sh.in @@ -48,7 +48,7 @@ function migrate_shared_dir() { chown $USERNAME:users $TZ_SYS_HOME/$USERNAME/$APPS_RW/$SHARED_TMP_DIR/$package mv $TZ_SYS_HOME/$USERNAME/$APPS_RW/$package/shared/data $TZ_SYS_HOME/$USERNAME/$APPS_RW/$SHARED_DIR/$package/ - chsmack -a $USER_APP_SHARED_LABEL $TZ_SYS_HOME/$USERNAME/$APPS_RW/$SHARED_DIR/$package/data + chsmack -r -a $USER_APP_SHARED_LABEL $TZ_SYS_HOME/$USERNAME/$APPS_RW/$SHARED_DIR/$package/data cd $TZ_SYS_HOME/$USERNAME/$APPS_RW/$package/shared/ ln -s ../../$SHARED_DIR/$package/data data @@ -128,6 +128,7 @@ function migrate_user_pkg() { chown $user_name:users $root_shared_path/$SHARED_DIR/$package mv $pkg_path/shared/data $root_shared_path/$SHARED_DIR/$package/ + chsmack -r -a $USER_APP_SHARED_LABEL $root_shared_path/$SHARED_DIR/$package/data cd $pkg_path/shared/ ln -s ../../$SHARED_DIR/$package/data data -- 2.7.4 From 0335667170e6c140306a7d8567ef1fe88c340d74 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Wed, 16 Sep 2020 16:07:24 +0900 Subject: [PATCH 02/16] Remove incorrectly created shared data directory /opt/usr/globalapps/{pkgid}/shared/data should not be exist. Change-Id: I72342fd32a3d5d972b51c80231351f8c27623253 Signed-off-by: Sangyoon Jang --- data/updates/upgrade_to_30005.sh.in | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/data/updates/upgrade_to_30005.sh.in b/data/updates/upgrade_to_30005.sh.in index 79d2d3a..287510f 100644 --- a/data/updates/upgrade_to_30005.sh.in +++ b/data/updates/upgrade_to_30005.sh.in @@ -154,8 +154,21 @@ function migrate_user_pkg_shareddata() { done } +# There are a bug when updating package, shared/data directories are created +# under /opt/usr/globalapps/{pkgid}. This causes smack denial error when +# uninstalling package after upgrade. +function remove_shareddata() { + echo "#remove shareddata" + for shared in `find $TZ_SYS_RW_APP -mindepth 2 -maxdepth 2 -name shared` + do + find $shared -mindepth 1 -maxdepth 1 -name data -exec rmdir {} \; + done +} + rm -f $DB_RESULT_FILE +remove_shareddata + migrate_skel_shared_dir create_user_shared_dir -- 2.7.4 From 63f4771366b8069978b1eeedbf8ee630ff28b844 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Wed, 16 Sep 2020 17:22:23 +0900 Subject: [PATCH 03/16] Remove directory using rm -r rmdir can be fail if there are files under shared/data. Change-Id: If6a67d4a1c019ebc0c034fbaad4c33f813d95a5e Signed-off-by: Sangyoon Jang --- data/updates/upgrade_to_30005.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/updates/upgrade_to_30005.sh.in b/data/updates/upgrade_to_30005.sh.in index 287510f..dd71348 100644 --- a/data/updates/upgrade_to_30005.sh.in +++ b/data/updates/upgrade_to_30005.sh.in @@ -161,7 +161,7 @@ function remove_shareddata() { echo "#remove shareddata" for shared in `find $TZ_SYS_RW_APP -mindepth 2 -maxdepth 2 -name shared` do - find $shared -mindepth 1 -maxdepth 1 -name data -exec rmdir {} \; + find $shared -mindepth 1 -maxdepth 1 -name data -exec rm -r {} \; done } -- 2.7.4 From b7cd36bf46417f7b7160952acb78e358e3255aa4 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Wed, 23 Sep 2020 17:51:54 +0900 Subject: [PATCH 04/16] Add parameters for further usage This will allows other modules to install packages at different timing. Change-Id: I8989921f0e056879c38ed41a801a8ede30731442 Signed-off-by: Junghyun Yeon --- src/install_preload_pkg/install_preload_pkg.c | 119 ++++++++++++++++++++++---- 1 file changed, 104 insertions(+), 15 deletions(-) diff --git a/src/install_preload_pkg/install_preload_pkg.c b/src/install_preload_pkg/install_preload_pkg.c index 71e5542..a514170 100644 --- a/src/install_preload_pkg/install_preload_pkg.c +++ b/src/install_preload_pkg/install_preload_pkg.c @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -59,6 +60,20 @@ #define WGT_RW_DIR tzplatform_mkpath(TZ_SYS_RO_APP, ".preload-rw-wgt") #define ALL_PRELOAD_RW_PKG_LIST "/opt/usr/share/.all_preload_rw_list" +#define PKG_TYPE_STRING_LEN_MAX 128 + +#define OPTVAL_SKIP_CHECK_REFERENCE 1000 +#define OPTVAL_PATH 1001 +#define OPTVAL_PRELOAD 1002 +#define OPTVAL_PRELOAD_RW 1003 +#define OPTVAL_PKG_TYPE 1004 + +typedef enum install_type_e { + INSTALL_TYPE_UNDEFINED = 0, + INSTALL_TYPE_PRELOAD = 1, + INSTALL_TYPE_PRELOAD_RW = 2 +} install_type; + struct pkginfo { char *pkgid; char *version; @@ -229,36 +244,110 @@ static int _is_authorized(uid_t uid) int main(int argc, char *argv[]) { + int opt_idx = 0; + int c = -1; + char pkg_path[PATH_MAX]; + char pkg_type[PKG_TYPE_STRING_LEN_MAX]; char err_msg[BUFSZE]; + char *backend_cmd; int handle = -1; int ret; bool skip_check_reference = false; + bool is_default = true; + bool default_operation = false; + install_type op_type = INSTALL_TYPE_UNDEFINED; + const char *short_options = ""; + const struct option long_options[] = { + {"skip-check-reference", 0, NULL, OPTVAL_SKIP_CHECK_REFERENCE}, + {"path", 1, NULL, OPTVAL_PATH}, + {"preload", 0, NULL, OPTVAL_PRELOAD}, + {"preload-rw", 0, NULL, OPTVAL_PRELOAD_RW}, + {"type", 1, NULL, OPTVAL_PKG_TYPE}, + {0, 0, 0, 0} /* sentinel */ + }; + if (!_is_authorized(getuid())) { _E("You are not an authorized user!"); return -1; } - if (argc > 1 && !strcmp(argv[1], "--skip-check-reference")) - skip_check_reference = true; + while (1) { + c = getopt_long(argc, argv, short_options, long_options, + &opt_idx); + if (c == -1) + break; /* Parse end */ + switch (c) { + case OPTVAL_PATH: + is_default = false; + if (optarg) + snprintf(pkg_path, sizeof(pkg_path), + "%s", optarg); + break; + case OPTVAL_SKIP_CHECK_REFERENCE: + skip_check_reference = true; + break; + case OPTVAL_PKG_TYPE: + is_default = false; + if (optarg) + snprintf(pkg_type, sizeof(pkg_type), + "%s", optarg); + if (strcmp(pkg_type, "tpk") != 0 && + strcmp(pkg_type, "wgt") != 0) { + _E("Wrong pkg type: [%s]", pkg_type); + return -1; + } + break; + case OPTVAL_PRELOAD: + is_default = false; + op_type = INSTALL_TYPE_PRELOAD; + break; + case OPTVAL_PRELOAD_RW: + is_default = false; + op_type = INSTALL_TYPE_PRELOAD_RW; + break; + default: + _E("Unidentified input: (%d)", c); + break; + } + } - if (_install_preload_pkg(TPK_BACKEND_CMD, TPK_DIR, true, - skip_check_reference) < 0) - goto error; + if (is_default) { + if (_install_preload_pkg(TPK_BACKEND_CMD, TPK_DIR, true, + skip_check_reference) < 0) + goto error; - if (_install_preload_pkg(WGT_BACKEND_CMD, WGT_DIR, true, - skip_check_reference) < 0) - goto error; + if (_install_preload_pkg(WGT_BACKEND_CMD, WGT_DIR, true, + skip_check_reference) < 0) + goto error; - if (_install_preload_pkg(TPK_BACKEND_CMD, TPK_RW_DIR, false, - skip_check_reference) < 0) - goto error; + if (_install_preload_pkg(TPK_BACKEND_CMD, TPK_RW_DIR, false, + skip_check_reference) < 0) + goto error; - if (_install_preload_pkg(WGT_BACKEND_CMD, WGT_RW_DIR, false, - skip_check_reference) < 0) - goto error; + if (_install_preload_pkg(WGT_BACKEND_CMD, WGT_RW_DIR, false, + skip_check_reference) < 0) + goto error; - return 0; + return 0; + } + + if (op_type == INSTALL_TYPE_UNDEFINED || + strlen(pkg_path) == 0 || + strlen(pkg_type) == 0) { + _E("Invalid argument"); + return -1; + } + + if (strcmp(pkg_type, "tpk") == 0) + backend_cmd = TPK_BACKEND_CMD; + else + backend_cmd = WGT_BACKEND_CMD; + + if (_install_preload_pkg(backend_cmd, pkg_path, + (op_type == INSTALL_TYPE_PRELOAD) ? true : false, + skip_check_reference) < 0) + goto error; error: handle = open("/tmp/.preload_install_error", -- 2.7.4 From 9f6d9ee94e61aaa479f8b629a58648b049b45b97 Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Thu, 24 Sep 2020 13:51:52 +0900 Subject: [PATCH 05/16] Backup databases before running pkg_upgrade If pkg_upgrade forced terminated before it finished and then rerun pkgmgr database will contain the result of previous work it can cause errors when upgrading so pkg_upgrade needs to backup the pkgmgr database before running and remove the backup files after all is done Change-Id: Ifbcc46071609df01829089beb93f942ce9283831 Signed-off-by: Ilho Kim --- CMakeLists.txt | 1 + packaging/pkgmgr-tool.spec | 1 + src/pkg_upgrade/CMakeLists.txt | 1 + src/pkg_upgrade/pkg_upgrade.c | 242 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 245 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 35b9ef7..6b4891e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ PKG_CHECK_MODULES(TZPLATFORM_DEPS REQUIRED libtzplatform-config) PKG_CHECK_MODULES(AUL_DEPS REQUIRED aul) PKG_CHECK_MODULES(STORAGE_DEPS REQUIRED storage) PKG_CHECK_MODULES(SQLITE_DEPS REQUIRED sqlite3) +PKG_CHECK_MODULES(SMACK_DEPS REQUIRED libsmack) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wl,-zdefs -pie" ) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index c3ae576..ad79f58 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -18,6 +18,7 @@ BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(bundle) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(iniparser) +BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(xdgmime) BuildRequires: pkgconfig(pkgmgr) diff --git a/src/pkg_upgrade/CMakeLists.txt b/src/pkg_upgrade/CMakeLists.txt index acad83c..6688c88 100644 --- a/src/pkg_upgrade/CMakeLists.txt +++ b/src/pkg_upgrade/CMakeLists.txt @@ -15,6 +15,7 @@ APPLY_PKG_CONFIG(${TARGET_PKG_UPGRADE} PUBLIC PKGMGR_PARSER_DEPS STORAGE_DEPS TZPLATFORM_DEPS + SMACK_DEPS ) # Install diff --git a/src/pkg_upgrade/pkg_upgrade.c b/src/pkg_upgrade/pkg_upgrade.c index 0b0277d..f2274d8 100644 --- a/src/pkg_upgrade/pkg_upgrade.c +++ b/src/pkg_upgrade/pkg_upgrade.c @@ -19,11 +19,13 @@ #define _GNU_SOURCE +#include #include #include #include #include #include +#include #include #include #include @@ -33,6 +35,7 @@ #include #include #include +#include #include #include @@ -58,8 +61,15 @@ tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ "pkgmgr/fota/.all_preload_rw_list") #define DBPATH tzplatform_mkpath(TZ_SYS_DB, "/.pkgmgr_parser.db") +#define JOURNAL_DBPATH tzplatform_mkpath(TZ_SYS_DB, \ + "/.pkgmgr_parser.db-journal") +#define CERT_DBPATH tzplatform_mkpath(TZ_SYS_DB, "/.pkgmgr_cert.db") +#define JOURNAL_CERT_DBPATH tzplatform_mkpath(TZ_SYS_DB, \ + "/.pkgmgr_cert.db-journal") #define OPT_ZIP_FILE "/usr/system/RestoreDir/opt.zip" #define ALL_PRELOAD_RW_PKG_LIST "/opt/usr/share/.all_preload_rw_list" +#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) +#define APPFW_USER "app_fw" struct pkginfo { char *pkgid; @@ -1497,11 +1507,242 @@ static int __fill_preload_rw_table(GHashTable *preload_rw_table) return 0; } +#define DB_LABEL "User::Home" +#define SET_SMACK_LABEL(x) \ +do { \ + if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \ + _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \ + else \ + _LOG("chsmack -a %s %s", DB_LABEL, x); \ +} while (0) + +static int __set_db_permission(const char *path) +{ + int fd; + struct stat sb; + mode_t mode; + uid_t uid; + struct passwd pwd; + struct passwd *result; + char buf[BUF_SIZE]; + int ret; + + ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + if (ret == 0) + _LOGE("no such user: %s", APPFW_USER); + else + _LOGE("getpwnam_r failed: %d", errno); + return -1; + } + uid = pwd.pw_uid; + + ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + if (ret == 0) + _LOGE("no such user: %d", uid); + else + _LOGE("getpwuid_r failed: %d", errno); + return -1; + } + fd = open(path, O_RDONLY); + if (fd == -1) { + _LOGE("open %s failed: %d", path, errno); + return -1; + } + ret = fstat(fd, &sb); + if (ret == -1) { + _LOGE("stat %s failed: %d", path, errno); + close(fd); + return -1; + } + if (S_ISLNK(sb.st_mode)) { + _LOGE("%s is symlink!", path); + close(fd); + return -1; + } + ret = fchown(fd, uid, pwd.pw_gid); + if (ret == -1) { + _LOGE("fchown %s failed: %d", path, errno); + close(fd); + return -1; + } + + mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; + if (strstr(path, CERT_DBPATH)) + mode |= S_IWOTH; + ret = fchmod(fd, mode); + if (ret == -1) { + _LOGE("fchmod %s failed: %d", path, errno); + close(fd); + return -1; + } + fsync(fd); + close(fd); + SET_SMACK_LABEL(path); + + return 0; +} + +static int __check_and_restore_backup(const char *origin_path) { + char backup_path[BUF_SIZE]; + char buf[BUF_SIZE]; + snprintf(backup_path, BUF_SIZE, "%s.bck", origin_path); + + if (access(backup_path, F_OK)) + return 0; + + if (access(origin_path, F_OK) == 0) { + if (remove(origin_path)) { + _LOG("cannot remove path(%s) : %s\n", origin_path, + strerror_r(errno, buf, sizeof(buf))); + return -1; + } + } + + if (rename(backup_path, origin_path)) { + _LOG("fail to rename %s to %s : %s\n", backup_path, origin_path, + strerror_r(errno, buf, sizeof(buf))); + return -1; + } + + return 0; +} + +static int __check_and_restore_backup_dbs() { + if (__check_and_restore_backup(DBPATH)) + return -1; + + if (__check_and_restore_backup(JOURNAL_DBPATH)) + return -1; + + if (__check_and_restore_backup(CERT_DBPATH)) + return -1; + + if (__check_and_restore_backup(JOURNAL_CERT_DBPATH)) + return -1; + + return 0; +} + +static int __backup_file(const char *src_path, const char *dest_path) +{ + int ret = 0; + int rc; + FILE *src = NULL; + FILE *dest = NULL; + char temp_buf[8192] = {'\0', }; + size_t size_of_char = sizeof(char); + size_t size_of_temp_buf = sizeof(temp_buf); + + retvm_if(src_path == NULL || dest_path == NULL, + -1, "Invalid parameters"); + + retvm_if(access(src_path, F_OK) != 0, -1, + "File(%s) is not exist", src_path); + + retvm_if(access(dest_path, F_OK) == 0, -1, + "File(%s) is already exist", dest_path); + + retvm_if(rename(src_path, dest_path) != 0, -1, + "Fail to move file %s to %s", src_path, dest_path); + + src = fopen(dest_path, "r"); + tryvm_if(src == NULL, ret = -1, "Failed to open : %s\n", dest_path); + + dest = fopen(src_path, "w"); + tryvm_if(dest == NULL, ret = -1, "Failed to open : %s\n", src_path); + + while (!feof(src)) { + rc = fread(temp_buf, size_of_char, size_of_temp_buf, src); + fwrite(temp_buf, size_of_char, rc, dest); + } + + fsync(fileno(dest)); + +catch: + if (src) + fclose(src); + + if (dest) + fclose(dest); + + return ret; +} + +static int __make_backup_dbs() { + int ret = 0; + char parser_db_bck[BUF_SIZE]; + char parser_db_journal_bck[BUF_SIZE]; + char cert_db_bck[BUF_SIZE]; + char cert_db_journal_bck[BUF_SIZE]; + + snprintf(parser_db_bck, BUF_SIZE, "%s.bck", DBPATH); + snprintf(parser_db_journal_bck, BUF_SIZE, "%s.bck", JOURNAL_DBPATH); + snprintf(cert_db_bck, BUF_SIZE, "%s.bck", CERT_DBPATH); + snprintf(cert_db_journal_bck, BUF_SIZE, "%s.bck", JOURNAL_CERT_DBPATH); + + tryvm_if(__backup_file(DBPATH, parser_db_bck) == -1, + ret = -1, "Fail to backup [%s] to [%s]\n", + DBPATH, parser_db_bck); + tryvm_if(__set_db_permission(DBPATH) == -1, + ret = -1, "Fail to set db permission\n"); + + tryvm_if(__backup_file(JOURNAL_DBPATH, parser_db_journal_bck) == -1, + ret = -1, "Fail to backup [%s] to [%s]\n", + JOURNAL_DBPATH, parser_db_journal_bck); + tryvm_if(__set_db_permission(JOURNAL_DBPATH) == -1, + ret = -1, "Fail to set db permission\n"); + + tryvm_if(__backup_file(CERT_DBPATH, cert_db_bck) == -1, + ret = -1, "Fail to backup [%s] to [%s]\n", + CERT_DBPATH, cert_db_bck); + tryvm_if(__set_db_permission(CERT_DBPATH) == -1, + ret = -1, "Fail to set db permission\n"); + + tryvm_if(__backup_file(JOURNAL_CERT_DBPATH, cert_db_journal_bck) == -1, + ret = -1, "Fail to backup [%s] to [%s]\n", + JOURNAL_CERT_DBPATH, cert_db_journal_bck); + tryvm_if(__set_db_permission(JOURNAL_CERT_DBPATH) == -1, + ret = -1, "Fail to set db permission\n"); + + return 0; + +catch: + remove(parser_db_bck); + remove(parser_db_journal_bck); + remove(cert_db_bck); + remove(cert_db_journal_bck); + + return ret; +} + +static void __remove_backup_path(const char *origin_path) { + char backup_path[BUF_SIZE]; + snprintf(backup_path, BUF_SIZE, "%s.bck", origin_path); + + if (remove(backup_path)) + _LOG("cannot remove backup file(%s): %d", backup_path, errno); +} + +static void __remove_backup_dbs() { + __remove_backup_path(DBPATH); + __remove_backup_path(JOURNAL_DBPATH); + __remove_backup_path(CERT_DBPATH); + __remove_backup_path(JOURNAL_CERT_DBPATH); +} + int main(int argc, char *argv[]) { GHashTable *preload_rw_table; int ret = 0; + ret = __check_and_restore_backup_dbs(); + retvm_if(ret < 0, -1, "__check_and_restore_backup_dbs is failed.\n"); + + ret = __make_backup_dbs(); + retvm_if(ret < 0, -1, "__make_backup_dbs is failed.\n"); + /* check pkgmgr-fota dir, if it is not, then exit */ ret = __check_pkgmgr_fota_dir(); retvm_if(ret < 0, -1, "__check_pkgmgr_fota_dir is failed.\n"); @@ -1561,5 +1802,6 @@ int main(int argc, char *argv[]) } __make_preload_rw_list(preload_rw_table); g_hash_table_destroy(preload_rw_table); + __remove_backup_dbs(); return EXIT_SUCCESS; } -- 2.7.4 From 028a8a030b8a14f7d378fbc1a6b795531089d0d3 Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Fri, 25 Sep 2020 17:03:28 +0900 Subject: [PATCH 06/16] Remove unused variable Change-Id: I9c3b182f66800c4b4f7cc09a29cb1bb4176ecce7 Signed-off-by: Ilho Kim --- src/install_preload_pkg/install_preload_pkg.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/install_preload_pkg/install_preload_pkg.c b/src/install_preload_pkg/install_preload_pkg.c index a514170..a99ab60 100644 --- a/src/install_preload_pkg/install_preload_pkg.c +++ b/src/install_preload_pkg/install_preload_pkg.c @@ -254,7 +254,6 @@ int main(int argc, char *argv[]) int ret; bool skip_check_reference = false; bool is_default = true; - bool default_operation = false; install_type op_type = INSTALL_TYPE_UNDEFINED; const char *short_options = ""; const struct option long_options[] = { -- 2.7.4 From ea86992ddb52be9a3b9987a7ce225a49c952fe5d Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Tue, 29 Sep 2020 10:42:55 +0900 Subject: [PATCH 07/16] Minor refactor in pkgmgr_upgrade.c - Remove duplicated code - Insert blank line for clarity Change-Id: Ie9778d1329e418d03741948c893ce2a070f2c4fe Signed-off-by: Ilho Kim --- src/pkg_upgrade/pkg_upgrade.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/pkg_upgrade/pkg_upgrade.c b/src/pkg_upgrade/pkg_upgrade.c index f2274d8..679f14e 100644 --- a/src/pkg_upgrade/pkg_upgrade.c +++ b/src/pkg_upgrade/pkg_upgrade.c @@ -1670,6 +1670,16 @@ catch: return ret; } +static int __backup_db(const char *src_path, const char *dest_path) { + if (__backup_file(src_path, dest_path) != 0) + return -1; + + if (__set_db_permission(src_path) != 0) + return -1; + + return 0; +} + static int __make_backup_dbs() { int ret = 0; char parser_db_bck[BUF_SIZE]; @@ -1682,29 +1692,21 @@ static int __make_backup_dbs() { snprintf(cert_db_bck, BUF_SIZE, "%s.bck", CERT_DBPATH); snprintf(cert_db_journal_bck, BUF_SIZE, "%s.bck", JOURNAL_CERT_DBPATH); - tryvm_if(__backup_file(DBPATH, parser_db_bck) == -1, + tryvm_if(__backup_db(DBPATH, parser_db_bck) == -1, ret = -1, "Fail to backup [%s] to [%s]\n", DBPATH, parser_db_bck); - tryvm_if(__set_db_permission(DBPATH) == -1, - ret = -1, "Fail to set db permission\n"); - tryvm_if(__backup_file(JOURNAL_DBPATH, parser_db_journal_bck) == -1, + tryvm_if(__backup_db(JOURNAL_DBPATH, parser_db_journal_bck) == -1, ret = -1, "Fail to backup [%s] to [%s]\n", JOURNAL_DBPATH, parser_db_journal_bck); - tryvm_if(__set_db_permission(JOURNAL_DBPATH) == -1, - ret = -1, "Fail to set db permission\n"); - tryvm_if(__backup_file(CERT_DBPATH, cert_db_bck) == -1, + tryvm_if(__backup_db(CERT_DBPATH, cert_db_bck) == -1, ret = -1, "Fail to backup [%s] to [%s]\n", CERT_DBPATH, cert_db_bck); - tryvm_if(__set_db_permission(CERT_DBPATH) == -1, - ret = -1, "Fail to set db permission\n"); - tryvm_if(__backup_file(JOURNAL_CERT_DBPATH, cert_db_journal_bck) == -1, + tryvm_if(__backup_db(JOURNAL_CERT_DBPATH, cert_db_journal_bck) == -1, ret = -1, "Fail to backup [%s] to [%s]\n", JOURNAL_CERT_DBPATH, cert_db_journal_bck); - tryvm_if(__set_db_permission(JOURNAL_CERT_DBPATH) == -1, - ret = -1, "Fail to set db permission\n"); return 0; @@ -1719,6 +1721,7 @@ catch: static void __remove_backup_path(const char *origin_path) { char backup_path[BUF_SIZE]; + snprintf(backup_path, BUF_SIZE, "%s.bck", origin_path); if (remove(backup_path)) @@ -1803,5 +1806,6 @@ int main(int argc, char *argv[]) __make_preload_rw_list(preload_rw_table); g_hash_table_destroy(preload_rw_table); __remove_backup_dbs(); + return EXIT_SUCCESS; } -- 2.7.4 From 6b60116a79f13ee72332aa81ed8bc7a8c8d5d5df Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Tue, 6 Oct 2020 08:35:21 +0900 Subject: [PATCH 08/16] Fix pkginfo tool - Prints component-based application info Change-Id: Ie71b5f278aa0a4b3095c1d89345bb1d823a0c514 Signed-off-by: Hwankyu Jhun --- src/pkginfo/pkg_info.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/pkginfo/pkg_info.c b/src/pkginfo/pkg_info.c index 42acf57..f7c3846 100644 --- a/src/pkginfo/pkg_info.c +++ b/src/pkginfo/pkg_info.c @@ -1474,6 +1474,9 @@ int app_func(const pkgmgrinfo_appinfo_h handle, void *user_data) printf("Autorestart: %d \n", autorestart); } + if (component == PMINFO_COMPONENT_BASED_APP) + printf("component: componentbasedapp\n"); + if (data) printf("user_data : %s\n\n", data); @@ -1536,6 +1539,11 @@ static int __pkg_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data) ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_WATCH_APP, app_func, (void *)test_data, uid_info->uid); if (ret < 0) printf("pkgmgr_get_info_app() failed\n"); + + printf("**List of Component-based-Apps**\n"); + ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_COMPONENT_BASED_APP, app_func, (void *)test_data, uid_info->uid); + if (ret < 0) + printf("pkgmgr_get_info_app() failed\n"); } else { printf("**List of Ui-Apps**\n"); ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_UI_APP, app_func, (void *)test_data); @@ -1556,6 +1564,11 @@ static int __pkg_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data) ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_WATCH_APP, app_func, (void *)test_data); if (ret < 0) printf("pkgmgr_get_info_app() failed\n"); + + printf("**List of Component-based-Apps**\n"); + ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_COMPONENT_BASED_APP, app_func, (void *)test_data); + if (ret < 0) + printf("pkgmgr_get_info_app() failed\n"); } printf("---------------------------------------\n"); -- 2.7.4 From 46ba776c66f54ebf4572c8623e522714e72f5162 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Tue, 6 Oct 2020 08:55:34 +0900 Subject: [PATCH 09/16] Release version 0.6.6 Changes: - Fix shared data migration script - Remove incorrectly created shared data directory - Remove directory using rm -r - Add parameters for further usage - Backup databases before running pkg_upgrade - Remove unused variable - Minor refactor in pkgmgr_upgrade.c - Fix pkginfo tool Change-Id: I3c119df76cf4b14738b805d1327a3542c4224bcc Signed-off-by: Hwankyu Jhun --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index ad79f58..a202008 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.6.5 +Version: 0.6.6 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From 70f40c25e6185194aa7010da2a3ac33b2151d52f Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Wed, 4 Nov 2020 15:29:02 +0900 Subject: [PATCH 10/16] Fix backup file process Make a flag before backup file. Change-Id: I040c371b9d5af2e93a7cea94decab7c96a9e7138 Signed-off-by: Sangyoon Jang --- src/pkg_upgrade/pkg_upgrade.c | 75 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/src/pkg_upgrade/pkg_upgrade.c b/src/pkg_upgrade/pkg_upgrade.c index 679f14e..96d628f 100644 --- a/src/pkg_upgrade/pkg_upgrade.c +++ b/src/pkg_upgrade/pkg_upgrade.c @@ -1584,12 +1584,54 @@ static int __set_db_permission(const char *path) return 0; } +static int __create_backup_flag(const char *path) +{ + int fd; + char temp_buf[8192] = {'\0', }; + + snprintf(temp_buf, sizeof(temp_buf), "%s.bck.flag", path); + + fd = open(temp_buf, O_CREAT | O_WRONLY, 0644); + if (fd == -1) { + _LOG("failed to create flag file %s, %d", temp_buf, errno); + return -1; + } + close(fd); + + return 0; +} + +static int __check_backup_flag(const char *path) +{ + char temp_buf[8192] = {'\0', }; + + snprintf(temp_buf, sizeof(temp_buf), "%s.bck.flag", path); + if (access(temp_buf, F_OK) != 0) + return -1; + + return 0; +} + +static int __remove_backup_flag(const char *path) +{ + char temp_buf[8192] = {'\0', }; + + snprintf(temp_buf, sizeof(temp_buf), "%s.bck.flag", path); + if (remove(temp_buf)) { + _LOG("cannot remove flag file(%s): %d", temp_buf, errno); + return -1; + } + + return 0; +} + static int __check_and_restore_backup(const char *origin_path) { char backup_path[BUF_SIZE]; char buf[BUF_SIZE]; snprintf(backup_path, BUF_SIZE, "%s.bck", origin_path); - if (access(backup_path, F_OK)) + // if backup flag exists, it means the previous backup process aborted. + if (access(backup_path, F_OK) && __check_backup_flag(origin_path)) return 0; if (access(origin_path, F_OK) == 0) { @@ -1641,17 +1683,26 @@ static int __backup_file(const char *src_path, const char *dest_path) retvm_if(access(src_path, F_OK) != 0, -1, "File(%s) is not exist", src_path); - retvm_if(access(dest_path, F_OK) == 0, -1, - "File(%s) is already exist", dest_path); - - retvm_if(rename(src_path, dest_path) != 0, -1, - "Fail to move file %s to %s", src_path, dest_path); + // if backup flag exists, it means the previous backup process aborted. + if (__check_backup_flag(src_path)) { + if (access(dest_path, F_OK) == 0) { + if (remove(dest_path)) + _LOG("Failed to remove uncompleted backup file " + "%s: %d", dest_path, errno); + return -1; + } + } else { + if (__create_backup_flag(src_path)) { + _LOG("failed to create backup flag"); + return -1; + } + } - src = fopen(dest_path, "r"); - tryvm_if(src == NULL, ret = -1, "Failed to open : %s\n", dest_path); + src = fopen(src_path, "r"); + tryvm_if(src == NULL, ret = -1, "Failed to open : %s\n", src_path); - dest = fopen(src_path, "w"); - tryvm_if(dest == NULL, ret = -1, "Failed to open : %s\n", src_path); + dest = fopen(dest_path, "w"); + tryvm_if(dest == NULL, ret = -1, "Failed to open : %s\n", dest_path); while (!feof(src)) { rc = fread(temp_buf, size_of_char, size_of_temp_buf, src); @@ -1667,6 +1718,8 @@ catch: if (dest) fclose(dest); + __remove_backup_flag(src_path); + return ret; } @@ -1674,7 +1727,7 @@ static int __backup_db(const char *src_path, const char *dest_path) { if (__backup_file(src_path, dest_path) != 0) return -1; - if (__set_db_permission(src_path) != 0) + if (__set_db_permission(dest_path) != 0) return -1; return 0; -- 2.7.4 From 5c5a8cbc8fc38a65288da7e2127e1c205d12d79a Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Fri, 6 Nov 2020 10:51:10 +0900 Subject: [PATCH 11/16] Release version 0.6.7 Changes: - Fix backup file process Change-Id: Icd2daa16015c3c6ba9d18d3e94c45532d984e59d Signed-off-by: Junghyun Yeon --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index a202008..2de3736 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.6.6 +Version: 0.6.7 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From 86d37b3d886ae2908d11e421da57b4a07466c419 Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Fri, 6 Nov 2020 10:50:35 +0900 Subject: [PATCH 12/16] Refactor pkg_upgrade tool - Redesigned - Changed language (c to c++) Change-Id: I726102f2d84ddda80046d07a40e01ba7c55dff70 Signed-off-by: Junghoon Park --- CMakeLists.txt | 7 + packaging/pkgmgr-tool.spec | 55 +- src/install_preload_pkg/install_preload_pkg.c | 4 +- src/pkg_upgrade/CMakeLists.txt | 13 +- src/pkg_upgrade/include/backend_invoker.hh | 43 + src/pkg_upgrade/include/common_type.hh | 80 + src/pkg_upgrade/include/file_logbackend.hh | 49 + src/pkg_upgrade/include/logging.hh | 192 ++ src/pkg_upgrade/include/pkg_finder.hh | 65 + src/pkg_upgrade/include/pkg_upgrade.h | 118 -- src/pkg_upgrade/include/pkg_upgrader.hh | 54 + src/pkg_upgrade/include/pkg_upgrader_factory.hh | 44 + src/pkg_upgrade/include/ro2rw_upgrader.hh | 44 + src/pkg_upgrade/include/rw2ro_upgrader.hh | 38 + src/pkg_upgrade/include/rw_upgrader.hh | 33 + src/pkg_upgrade/include/simple_upgrader.hh | 33 + src/pkg_upgrade/include/upgrader.hh | 62 + src/pkg_upgrade/pkg_upgrade.c | 1864 -------------------- src/pkg_upgrade/src/backend_invoker.cc | 117 ++ src/pkg_upgrade/src/file_logbackend.cc | 113 ++ src/pkg_upgrade/src/logging.cc | 36 + src/pkg_upgrade/src/main.cc | 28 + src/pkg_upgrade/src/pkg_finder.cc | 380 ++++ src/pkg_upgrade/src/pkg_upgrader.cc | 75 + src/pkg_upgrade/src/pkg_upgrader_factory.cc | 107 ++ src/pkg_upgrade/src/ro2rw_upgrader.cc | 103 ++ src/pkg_upgrade/src/rw2ro_upgrader.cc | 46 + src/pkg_upgrade/src/simple_upgrader.cc | 32 + src/pkg_upgrade/src/upgrader.cc | 387 ++++ tests/CMakeLists.txt | 1 + tests/mock/mock_hook.h | 42 + tests/mock/module_mock.h | 25 + tests/mock/os_mock.cc | 40 + tests/mock/os_mock.h | 38 + tests/mock/pkgmgr_info_mock.cc | 62 + tests/mock/pkgmgr_info_mock.h | 43 + tests/mock/test_fixture.cc | 21 + tests/mock/test_fixture.h | 53 + tests/unit_tests/CMakeLists.txt | 45 + tests/unit_tests/data/db/.pkgmgr_cert.db | Bin 0 -> 53248 bytes tests/unit_tests/data/db/.pkgmgr_cert.db-journal | Bin 0 -> 49760 bytes tests/unit_tests/data/db/.pkgmgr_parser.db | Bin 0 -> 602112 bytes tests/unit_tests/data/db/.pkgmgr_parser.db-journal | Bin 0 -> 119528 bytes tests/unit_tests/data/db_bck/.pkgmgr_cert.db | Bin 0 -> 53248 bytes .../unit_tests/data/db_bck/.pkgmgr_cert.db-journal | Bin 0 -> 49760 bytes .../data/db_bck/.pkgmgr_cert.db-journal.bck | Bin 0 -> 49760 bytes tests/unit_tests/data/db_bck/.pkgmgr_cert.db.bck | Bin 0 -> 53248 bytes tests/unit_tests/data/db_bck/.pkgmgr_parser.db | Bin 0 -> 602112 bytes .../data/db_bck/.pkgmgr_parser.db-journal | Bin 0 -> 119528 bytes .../data/db_bck/.pkgmgr_parser.db-journal.bck | Bin 0 -> 119528 bytes tests/unit_tests/data/db_bck/.pkgmgr_parser.db.bck | Bin 0 -> 602112 bytes tests/unit_tests/data/packages/org.tizen.alarm.xml | 193 ++ .../data/packages/org.tizen.app-selector.xml | 13 + .../data/packages/org.tizen.bluetooth.xml | 20 + tests/unit_tests/data/rw/list.txt | 2 + tests/unit_tests/src/test_main.cc | 37 + tests/unit_tests/src/test_pkg_upgrader.cc | 216 +++ 57 files changed, 3080 insertions(+), 1993 deletions(-) mode change 100644 => 100755 src/pkg_upgrade/CMakeLists.txt create mode 100644 src/pkg_upgrade/include/backend_invoker.hh create mode 100644 src/pkg_upgrade/include/common_type.hh create mode 100644 src/pkg_upgrade/include/file_logbackend.hh create mode 100644 src/pkg_upgrade/include/logging.hh create mode 100644 src/pkg_upgrade/include/pkg_finder.hh delete mode 100644 src/pkg_upgrade/include/pkg_upgrade.h create mode 100644 src/pkg_upgrade/include/pkg_upgrader.hh create mode 100644 src/pkg_upgrade/include/pkg_upgrader_factory.hh create mode 100644 src/pkg_upgrade/include/ro2rw_upgrader.hh create mode 100644 src/pkg_upgrade/include/rw2ro_upgrader.hh create mode 100644 src/pkg_upgrade/include/rw_upgrader.hh create mode 100644 src/pkg_upgrade/include/simple_upgrader.hh create mode 100644 src/pkg_upgrade/include/upgrader.hh delete mode 100644 src/pkg_upgrade/pkg_upgrade.c create mode 100644 src/pkg_upgrade/src/backend_invoker.cc create mode 100644 src/pkg_upgrade/src/file_logbackend.cc create mode 100644 src/pkg_upgrade/src/logging.cc create mode 100644 src/pkg_upgrade/src/main.cc create mode 100644 src/pkg_upgrade/src/pkg_finder.cc create mode 100644 src/pkg_upgrade/src/pkg_upgrader.cc create mode 100644 src/pkg_upgrade/src/pkg_upgrader_factory.cc create mode 100644 src/pkg_upgrade/src/ro2rw_upgrader.cc create mode 100644 src/pkg_upgrade/src/rw2ro_upgrader.cc create mode 100644 src/pkg_upgrade/src/simple_upgrader.cc create mode 100644 src/pkg_upgrade/src/upgrader.cc create mode 100644 tests/CMakeLists.txt create mode 100644 tests/mock/mock_hook.h create mode 100644 tests/mock/module_mock.h create mode 100644 tests/mock/os_mock.cc create mode 100644 tests/mock/os_mock.h create mode 100644 tests/mock/pkgmgr_info_mock.cc create mode 100644 tests/mock/pkgmgr_info_mock.h create mode 100644 tests/mock/test_fixture.cc create mode 100644 tests/mock/test_fixture.h create mode 100644 tests/unit_tests/CMakeLists.txt create mode 100644 tests/unit_tests/data/db/.pkgmgr_cert.db create mode 100644 tests/unit_tests/data/db/.pkgmgr_cert.db-journal create mode 100644 tests/unit_tests/data/db/.pkgmgr_parser.db create mode 100644 tests/unit_tests/data/db/.pkgmgr_parser.db-journal create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_cert.db create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_cert.db-journal create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_cert.db-journal.bck create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_cert.db.bck create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_parser.db create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_parser.db-journal create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_parser.db-journal.bck create mode 100644 tests/unit_tests/data/db_bck/.pkgmgr_parser.db.bck create mode 100644 tests/unit_tests/data/packages/org.tizen.alarm.xml create mode 100644 tests/unit_tests/data/packages/org.tizen.app-selector.xml create mode 100644 tests/unit_tests/data/packages/org.tizen.bluetooth.xml create mode 100644 tests/unit_tests/data/rw/list.txt create mode 100644 tests/unit_tests/src/test_main.cc create mode 100644 tests/unit_tests/src/test_pkg_upgrader.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b4891e..c0181bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,13 @@ SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE") SET(CMAKE_C_FLAGS_RELEASE "-O2 -fPIE") ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(tests) + +IF(NOT DEFINED MINIMUM_BUILD) +ENABLE_TESTING() +SET(PKGMGR_TOOL_UNIT_TESTS pkgmgr-tool_unittests) +ADD_TEST(NAME ${PKGMGR_TOOL_UNIT_TESTS} COMMAND ${PKGMGR_TOOL_UNIT_TESTS}) +ENDIF(NOT DEFINED MINIMUM_BUILD) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/mime.wac.xml DESTINATION /usr/share/mime/packages/) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/mime.tpk.xml DESTINATION /usr/share/mime/packages/) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 2de3736..a5677cf 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -26,26 +26,71 @@ BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgconfig(aul) BuildRequires: pkgconfig(storage) BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(gmock) BuildRequires: pkgmgr-info-parser-devel BuildRequires: pkgmgr-info-parser BuildRequires: fdupes +%if 0%{?gcov:1} +BuildRequires: lcov +BuildRequires: zip +%endif Requires(posttrans): /usr/bin/pkg_initdb %description Packager Manager Tool for packaging +%package -n pkgmgr-tool_unittests +Summary: GTest for pkgmgr-tool +Group: Development/Libraries +Requires: %{name} + +%description -n pkgmgr-tool_unittests +GTest for pkgmgr-tool + +%if 0%{?gcov:1} +%package gcov +Summary: pkgmgr-tool API(gcov) +Group: System/API + +%description gcov +gcov objects of an pkgmgr-tool +%endif + %prep %setup -q cp %{SOURCE1001} . %build -%cmake . +%if 0%{?gcov:1} +export CFLAGS+=" -fprofile-arcs -ftest-coverage" +export CXXFLAGS+=" -fprofile-arcs -ftest-coverage" +export FFLAGS+=" -fprofile-arcs -ftest-coverage" +export LDFLAGS+=" -lgcov" +%endif +%cmake . %__make %{?_smp_mflags} +%if 0%{?gcov:1} +mkdir -p gcov-obj +find . -name '*.gcno' -exec cp '{}' gcov-obj ';' +%endif + +%check +ctest -V +%if 0%{?gcov:1} +lcov -c --ignore-errors graph --no-external -q -d . -o pkgmgr-tool.info +genhtml pkgmgr-tool.info -o pkgmgr-tool.out +zip -r pkgmgr-tool.zip pkgmgr-tool.out +install -m 0644 pkgmgr-tool.zip %{buildroot}%{_datadir}/gcov/pkgmgr-tool.zip +%endif %install %make_install mkdir -p %{buildroot}%{_sysconfdir}/opt/upgrade +%if 0%{?gcov:1} +mkdir -p %{buildroot}%{_datadir}/gcov/obj +install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj +%endif %fdupes %{buildroot} @@ -82,3 +127,11 @@ update-mime-database %{_datadir}/mime %attr(0700,root,root) %{_sysconfdir}/opt/upgrade/pkgmgr.patch.sh %attr(0700,root,root) /usr/share/fixed_multiuser/scripts/pkgmgr-clear-skel.sh %attr(0700,root,root) %{_sysconfdir}/package-manager/pkgmgr-label-initial-image.sh + +%files -n pkgmgr-tool_unittests +%{_bindir}/pkgmgr-tool_unittests +%{_datadir}/pkgmgr-tool_unittests/* +%if 0%{?gcov:1} +%files gcov +%{_datadir}/gcov/* +%endif diff --git a/src/install_preload_pkg/install_preload_pkg.c b/src/install_preload_pkg/install_preload_pkg.c index a99ab60..ab2396a 100644 --- a/src/install_preload_pkg/install_preload_pkg.c +++ b/src/install_preload_pkg/install_preload_pkg.c @@ -110,8 +110,8 @@ static void __make_preload_rw_list(GList *pkg_list) info = (struct pkginfo *)pkg_list->data; _D("Add [%s][%s][%s] to preload-rw list", info->pkgid, info->version, info->type); - snprintf(pkg_info, BUFSZE, "package=\"%s\"\tversion=\"%s\"\t" - "type=\"%s\":\n", + snprintf(pkg_info, BUFSZE, "\"package=%s\":\"version=%s\":" + "\"type=%s\":\"removable=true\"\n", info->pkgid, info->version, info->type); fwrite(pkg_info, 1, strlen(pkg_info), file); } diff --git a/src/pkg_upgrade/CMakeLists.txt b/src/pkg_upgrade/CMakeLists.txt old mode 100644 new mode 100755 index 6688c88..21fe1ac --- a/src/pkg_upgrade/CMakeLists.txt +++ b/src/pkg_upgrade/CMakeLists.txt @@ -1,22 +1,19 @@ # Target - sources -SET(SRCS - pkg_upgrade.c -) +AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) # Target - definition ADD_EXECUTABLE(${TARGET_PKG_UPGRADE} ${SRCS}) # Dependency APPLY_PKG_CONFIG(${TARGET_PKG_UPGRADE} PUBLIC - INIPARSER_DEPS - SQLITE_DEPS PKGMGR_INFO_DEPS - PKGMGR_DEPS PKGMGR_PARSER_DEPS - STORAGE_DEPS TZPLATFORM_DEPS SMACK_DEPS + DLOG_DEPS ) # Install -INSTALL(TARGETS ${TARGET_PKG_UPGRADE} DESTINATION bin) \ No newline at end of file +INSTALL(TARGETS ${TARGET_PKG_UPGRADE} DESTINATION bin) + diff --git a/src/pkg_upgrade/include/backend_invoker.hh b/src/pkg_upgrade/include/backend_invoker.hh new file mode 100644 index 0000000..aca83ac --- /dev/null +++ b/src/pkg_upgrade/include/backend_invoker.hh @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BACKEND_INVOKER_H_ +#define BACKEND_INVOKER_H_ + +#include +#include + +#include "common_type.hh" + +namespace common_fota { + +class BackendInvoker { + public: + BackendInvoker(std::string pkgid, PkgType type, PkgLocation loc, + PkgOperation op, bool removable); + BackendInvoker() {} + + int Run() const; + + static int XSystem(const char *argv[]); + + private: + std::list parameters_; +}; + +} // common_fota + +#endif // BACKEND_INVOKER_H_ diff --git a/src/pkg_upgrade/include/common_type.hh b/src/pkg_upgrade/include/common_type.hh new file mode 100644 index 0000000..2e657e1 --- /dev/null +++ b/src/pkg_upgrade/include/common_type.hh @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMON_TYPE_H_ +#define COMMON_TYPE_H_ + +#include +#include + +namespace common_fota { + +enum class PkgType { + TPK, + WGT, + UNKNOWN +}; + +enum class PkgLocation { + RO, + RW, + UNKNOWN +}; + +enum class PkgOperation { + INSTALL, + UPDATE, + UNINSTALL, + UNINSTALL_KEEP_RW_DATA, + COMPLEX +}; + +class PkgContext { + public: + PkgContext(std::string id, std::string version, std::string type, + bool read_only, bool removable = false) + : id_(std::move(id)), version_(std::move(version)), + type_(std::move(type)), read_only_(read_only), removable_(removable) { + if (read_only) + removable_ = false; + } + + const std::string& GetId() const { return id_; } + const std::string& GetVersion() const { return version_; } + PkgType GetType() const { + if (type_ == "wgt" ) + return PkgType::WGT; + return PkgType::TPK; + } + PkgLocation GetLocation() const { + if (read_only_) + return PkgLocation::RO; + return PkgLocation::RW; + } + bool IsReadOnly() const { return read_only_; } + bool IsRemovable() const { return removable_; } + + private: + std::string id_; + std::string version_; + std::string type_; + bool read_only_; + bool removable_; +}; + +} // common_fota + +#endif // COMMON_TYPE_H_ diff --git a/src/pkg_upgrade/include/file_logbackend.hh b/src/pkg_upgrade/include/file_logbackend.hh new file mode 100644 index 0000000..0c23b6e --- /dev/null +++ b/src/pkg_upgrade/include/file_logbackend.hh @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FILE_LOGBACKEND_H_ +#define FILE_LOGBACKEND_H_ + +#include +#include +#include + +#include "logging.hh" + +namespace utils { + +class FileLogBackend : public ILogBackend { + public: + FileLogBackend(std::string file_name, int rotation_size, int max_rotation); + void WriteLog(LogLevel level, const std::string& tag, + const std::string& logstr) override; + void WriteLogToFile(); + + private: + bool Rotate(); + int GetFileSize(const std::string& file_name); + std::string GetTimeStamp(); + std::string GetPid(); + + std::string file_name_; + int rotation_size_; + int max_rotation_; + std::unique_ptr log_stream_; +}; + +} // namespace utils + +#endif // FILE_LOGBACKEND_H_ diff --git a/src/pkg_upgrade/include/logging.hh b/src/pkg_upgrade/include/logging.hh new file mode 100644 index 0000000..6ed63bc --- /dev/null +++ b/src/pkg_upgrade/include/logging.hh @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LOGGING_H_ +#define LOGGING_H_ + +#include + +#ifndef PROJECT_TAG +#define PROJECT_TAG "" +#endif + +#ifdef LOG +#undef LOG +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef __FILENAME__ +#define __FILENAME__ \ + (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#endif + +namespace utils { + +enum class LogLevel { + LOG_ERROR, + LOG_WARNING, + LOG_INFO, + LOG_DEBUG, +}; + +log_priority LogLevelToPriority(LogLevel level); + +template struct LogTag; +template<> struct LogTag { + static constexpr const char* value = "\033[1;31m| ERROR |\033[0m"; +}; +template<> struct LogTag { + static constexpr const char* value = "\033[1;33m| WARNING |\033[0m"; +}; +template<> struct LogTag { + static constexpr const char* value = "\033[1;32m| INFO |\033[0m"; +}; +template<> struct LogTag { + static constexpr const char* value = "\033[0m| DEBUG |\033[0m"; +}; + +template > +class StringStream : private std::basic_ostringstream { + public: + using std::basic_ostringstream::str; + + template + StringStream& operator<<(const T& value) { + static_cast &>(*this) << value; + return *this; + } +}; + +// Interface class for logging backends. The custom LogBackend which wants +// log using LOG() macro should be implement following interface. +class ILogBackend { + public: + virtual void WriteLog(LogLevel level, const std::string& tag, + const std::string& logstr) = 0; +}; + +class DLogBackend : public ILogBackend { + public: + void WriteLog(LogLevel level, const std::string& tag, + const std::string& logstr) override { + dlog_print(LogLevelToPriority(level), tag.c_str(), "%s", + Escape(logstr).c_str()); + } + + private: + // Since LogCatcher passes input to dlog_print(), the input which contains + // format string(such as %d, %n) can cause unexpected result. + // This is simple function to escape '%'. + // NOTE: Is there any gorgeous way instead of this? + std::string Escape(const std::string& str) const { + std::string escaped = std::string(str); + size_t start_pos = 0; + std::string from = "%"; + std::string to = "%%"; + while ((start_pos = escaped.find(from, start_pos)) != std::string::npos) { + escaped.replace(start_pos, from.length(), to); + start_pos += to.length(); + } + return escaped; + } +}; + +class LogCore { + public: + // Do not call this function at destructor of global object + static LogCore& GetCore() { + static LogCore core; + return core; + } + + void AddLogBackend(std::shared_ptr backend) { + backend_list_.emplace_back(backend); + } + + void Log(LogLevel level, const std::string& tag, const std::string& log) { + for (auto backend : backend_list_) + backend->WriteLog(level, tag, log); + } + + private: + LogCore() { + // add default dlog backend + AddLogBackend(std::shared_ptr(new DLogBackend())); + } + ~LogCore() = default; + LogCore(const LogCore&) = delete; + LogCore& operator=(const LogCore&) = delete; + + std::vector> backend_list_; +}; + +class LogCatcher { + public: + LogCatcher(LogLevel level, const char* tag) + : level_(level), tag_(tag) { } + + void operator&(const StringStream& str) const { + LogCore::GetCore().Log(level_, tag_, str.str()); + } + + private: + LogLevel level_; + std::string tag_; +}; + +} // namespace utils + + +inline static const constexpr char* __tag_for_logging() { + return ""; +} + +inline static const constexpr char* __tag_for_project() { + return PROJECT_TAG; +} + +// To be defined in class namespace if user want different log tag for given +// scope +#define SCOPE_LOG_TAG(TAG) \ + inline static const constexpr char* __tag_for_logging() { \ + return #TAG; \ + } \ + +// Simple logging macro of following usage: +// LOG(LEVEL) << object_1 << object_2 << object_n; +// where: +// LEVEL = ERROR | WARNING | INFO | DEBUG +#define LOG(LEVEL) \ + ::utils::LogCatcher( \ + ::utils::LogLevel::LOG_ ## LEVEL, __tag_for_project()) \ + & ::utils::StringStream() \ + << std::string(::utils::LogTag<::utils::LogLevel::LOG_ ## LEVEL>::value) \ + << " " << std::setw(25) << std::left << __tag_for_logging() \ + << " : " << std::setw(36) \ + << (std::string(__FILENAME__) + ":" + std::to_string(__LINE__)).c_str() \ + << std::setw(0) << " : " \ + +#endif // LOGGING_H_ diff --git a/src/pkg_upgrade/include/pkg_finder.hh b/src/pkg_upgrade/include/pkg_finder.hh new file mode 100644 index 0000000..5259c3b --- /dev/null +++ b/src/pkg_upgrade/include/pkg_finder.hh @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PKG_FINDER_H_ +#define PKG_FINDER_H_ + +#include +#include +#include + +#include +#include + +#include "common_type.hh" + +namespace common_fota { + +class PkgFinder { + public: + PkgFinder(); + ~PkgFinder(); + int Find(); + const std::list& GetOldPkgs() { return old_pkgs_; } + const std::list& GetNewPkgs() { return new_pkgs_; } + void SetManifestDir(std::string dir); + void SetPreloadRwListPath(std::string path); + + private: + static int PkgidListCb(const pkgmgrinfo_pkginfo_h handle, void* user_data); + int FindPreloadPkgidFromDb(bool read_only = true); + int FindPreloadPkgidFromXml(const std::string& xml_directory); + int FindPreloadPkgidFromFile(); + std::string GetValidManifest(std::string manifest); + std::string FindInfoFromXml(const std::string& manifest, + const std::string& find_info); + int MoveToChildElement(xmlTextReaderPtr reader, int depth); + void AddRwPkgInfoFromFile(const char* info_str); + std::string GetToken(const char* pBuf, const char* pKey); + void StrTrim(char *input); + int UnzipFileOnlyToPath(const char* dest_path, const char* unzip_to); + + private: + std::list old_pkgs_; + std::list new_pkgs_; + bool read_only_ = true; + std::string manifest_dir_; + std::string preload_rw_list_path_; +}; + +} // common_fota + +#endif // PKG_FINDER_H_ diff --git a/src/pkg_upgrade/include/pkg_upgrade.h b/src/pkg_upgrade/include/pkg_upgrade.h deleted file mode 100644 index de1e8de..0000000 --- a/src/pkg_upgrade/include/pkg_upgrade.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef PKG_FOTA_H_ -#define PKG_FOTA_H_ - - -#define TOKEN_TYPE_STR "type=" -#define TOKEN_PKGID_STR "package=" -#define TOKEN_VERSION_STR "version=" -#define TOKEN_OPERATION_STR "op=" -#define TOKEN_REMOVE_STR "removable=" -#define TOKEN_UPDATE_STR "update=" - -#define SEPERATOR_END '"' -#define SEPERATOR_MID ':' - - -#define ASCII(s) (const char *)s -#define XMLCHAR(s) (const xmlChar *)s - -#define BUF_SIZE 1024 -#define DIRECTORY_PERMISSION_755 0755 -#define FOTA_RESULT_FILE tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ - "pkgmgr/fota/result.txt") - -#ifndef FREE_AND_NULL -#define FREE_AND_NULL(ptr) do { \ - if (ptr) { \ - free((void *)ptr); \ - ptr = NULL; \ - } \ -} while (0) -#endif - -#ifndef FREE_AND_STRDUP -#define FREE_AND_STRDUP(from, to) do { \ - if (to) free((void *)to); \ - if (from) to = strdup(from); \ -} while (0) -#endif - -#define _LOGE(fmt, arg...) do { \ - int fd = 0;\ - FILE* file = NULL;\ - file = fopen(FOTA_RESULT_FILE, "a");\ - if (file == NULL) break;\ - fprintf(file, "[PKG_FOTA][%5d][err] "fmt"", getpid(), ##arg); \ - fflush(file);\ - fd = fileno(file);\ - fsync(fd);\ - fclose(file);\ - fprintf(stderr, "[PKG_FOTA][%5d][err] "fmt"", getpid(), ##arg); \ -} while (0) - -#define retvm_if(expr, val, fmt, arg...) do { \ - if (expr) { \ - _LOGE("(%s)"fmt, #expr, ##arg); \ - return (val); \ - } \ -} while (0) - -#define err_if(expr, fmt, arg...) do { \ - if (expr) { \ - _LOGE("(%s)"fmt, #expr, ##arg); \ - } \ -} while (0) - -#define tryvm_if(expr, val, fmt, arg...) do { \ - if (expr) { \ - _LOGE("(%s)"fmt, #expr, ##arg); \ - val; \ - goto catch; \ - } \ -} while (0) - -typedef enum { - PKG_IS_NOT_EXIST = 0, - PKG_IS_SAME, - PKG_IS_UPDATED, - PKG_IS_INSERTED, - PKG_IS_OLD -} COMPARE_RESULT; - -typedef enum { - PKG_NEED_NOTHING = 0, - PKG_NEED_INSTALL, - PKG_NEED_UNINSTALL, - PKG_NEED_ROUPDATE, - PKG_NEED_UPDATE_TO_RW, - PKG_NEED_RWUNINSTALL, - PKG_NEED_UPDATE_TO_RO, - PKG_NEED_RO_DBREMOVE, - PKG_NEED_RO_UNINSTALL_KEEPRWDATA, - PKG_NEED_PRELOADRW_INSTALL -} UPGRADE_OPRATION; - -enum rpm_request_type { - INSTALL_REQ, - UNINSTALL_REQ, - UPGRADE_REQ -}; - -#endif /* PKG_FOTA_H_ */ diff --git a/src/pkg_upgrade/include/pkg_upgrader.hh b/src/pkg_upgrade/include/pkg_upgrader.hh new file mode 100644 index 0000000..96f446d --- /dev/null +++ b/src/pkg_upgrade/include/pkg_upgrader.hh @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PKG_UPGRADER_H_ +#define PKG_UPGRADER_H_ + +#include + +#include "backend_invoker.hh" +#include "common_type.hh" + +namespace common_fota { + +class PkgUpgrader { + public: + PkgUpgrader(const PkgContext& context, PkgOperation pkg_op); + PkgUpgrader(std::string id); + virtual ~PkgUpgrader() = default; + + PkgType GetType() const; + PkgLocation GetLocation() const; + PkgOperation GetOperation() const; + std::string GetId() const; + std::string GetVersion() const; + const BackendInvoker& GetBackendInvoker() const; + int CompareVersion(const PkgUpgrader& pkg) const; + + virtual bool Upgrade() = 0; + + private: + PkgType type_; + PkgLocation loc_; + PkgOperation op_; + std::string id_; + std::string version_; + BackendInvoker backend_; +}; + +} // namespace common_fota + +#endif // PKG_UPGRADER_H_ diff --git a/src/pkg_upgrade/include/pkg_upgrader_factory.hh b/src/pkg_upgrade/include/pkg_upgrader_factory.hh new file mode 100644 index 0000000..580a3fa --- /dev/null +++ b/src/pkg_upgrade/include/pkg_upgrader_factory.hh @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PKG_UPGRADER_FACTORY_H_ +#define PKG_UPGRADER_FACTORY_H_ + +#include +#include +#include + +#include "pkg_finder.hh" +#include "pkg_upgrader.hh" +#include "common_type.hh" + +namespace common_fota { + +class PkgUpgraderFactory { + public: + std::list> MakeList(PkgFinder* finder); + + private: + std::list> Merge( + const std::list& old_pkgs, + const std::list& new_pkgs); + const PkgContext* FindPkgById(const std::list& pkgs, + std::string id); +}; + +} // common_fota + +#endif // PKG_UPGRADER_FACTORY_H_ diff --git a/src/pkg_upgrade/include/ro2rw_upgrader.hh b/src/pkg_upgrade/include/ro2rw_upgrader.hh new file mode 100644 index 0000000..8a30a85 --- /dev/null +++ b/src/pkg_upgrade/include/ro2rw_upgrader.hh @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RO2RW_UPGRADER_H_ +#define RO2RW_UPGRADER_H_ + +#include "pkg_upgrader.hh" + +namespace common_fota { + +class Ro2RwUpgrader : public PkgUpgrader { + public: + Ro2RwUpgrader(std::unique_ptr old_pkg, + std::unique_ptr new_pkg); + virtual ~Ro2RwUpgrader() = default; + bool Upgrade() override; + + private: + int UnzipFiles(const char* dest_path); + int UnzipXml(const std::string& pkgid); + int UnzipData(const std::string& pkgid, const std::string& dest); + int UnzipPkgFromZip(const std::string& pkgid); + + private: + std::unique_ptr old_pkg_; + std::unique_ptr new_pkg_; +}; + +} // common_fota + +#endif // RO2RW_UPGRADER_H_ diff --git a/src/pkg_upgrade/include/rw2ro_upgrader.hh b/src/pkg_upgrade/include/rw2ro_upgrader.hh new file mode 100644 index 0000000..1fb0d01 --- /dev/null +++ b/src/pkg_upgrade/include/rw2ro_upgrader.hh @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RW2RO_UPGRADER_H_ +#define RW2RO_UPGRADER_H_ + +#include "pkg_upgrader.hh" + +namespace common_fota { + +class Rw2RoUpgrader : public PkgUpgrader { + public: + Rw2RoUpgrader(std::unique_ptr old_pkg, + std::unique_ptr new_pkg); + virtual ~Rw2RoUpgrader() = default; + bool Upgrade() override; + + private: + std::unique_ptr old_pkg_; + std::unique_ptr new_pkg_; +}; + +} // common_fota + +#endif // RW2RO_UPGRADER_H_ diff --git a/src/pkg_upgrade/include/rw_upgrader.hh b/src/pkg_upgrade/include/rw_upgrader.hh new file mode 100644 index 0000000..b2a03bc --- /dev/null +++ b/src/pkg_upgrade/include/rw_upgrader.hh @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RW_UPGRADER_H_ +#define RW_UPGRADER_H_ + +#include "ro2rw_upgrader.hh" + +namespace common_fota { + +class RwUpgrader : public Ro2RwUpgrader { + public: + RwUpgrader(std::unique_ptr new_pkg) + : Ro2RwUpgrader(nullptr, std::move(new_pkg)) {} + virtual ~RwUpgrader() = default; +}; + +} // common_fota + +#endif // RW_UPGRADER_H_ diff --git a/src/pkg_upgrade/include/simple_upgrader.hh b/src/pkg_upgrade/include/simple_upgrader.hh new file mode 100644 index 0000000..0d12388 --- /dev/null +++ b/src/pkg_upgrade/include/simple_upgrader.hh @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SIMPLE_UPGRADER_H_ +#define SIMPLE_UPGRADER_H_ + +#include "pkg_upgrader.hh" +#include "pkg_finder.hh" + +namespace common_fota { + +class SimpleUpgrader : public PkgUpgrader { + public: + SimpleUpgrader(const PkgContext& context, PkgOperation pkg_op); + bool Upgrade() override; +}; + +} // common_fota + +#endif // SIMPLE_UPGRADER_H_ \ No newline at end of file diff --git a/src/pkg_upgrade/include/upgrader.hh b/src/pkg_upgrade/include/upgrader.hh new file mode 100644 index 0000000..f4eeb51 --- /dev/null +++ b/src/pkg_upgrade/include/upgrader.hh @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UPGRADER_H_ +#define UPGRADER_H_ + +#include +#include + +#include "file_logbackend.hh" +#include "pkg_finder.hh" +#include "pkg_upgrader.hh" + +namespace common_fota { + +class Upgrader { + public: + Upgrader(); + bool Process(PkgFinder* finder); + const std::list>& GetSuccessList() const; + const std::list>& GetFailureList() const; + void SetDbPath(const std::string& path); + + private: + int CheckAndRestoreBackupDbs(); + int CheckAndRestoreBackup(const std::string& origin_path); + int BackupDb(const std::string& src_path, const std::string& dest_path); + int MakeBackupDbs(); + void RemoveBackupPath(const std::string& origin_path); + void RemoveBackupDbs(); + int SetDbPermission(const std::string& path); + int BackupFile(const std::string& src_path, const std::string& dest_path); + int CreateBackupFlag(const std::string& path); + int CheckBackupFlag(const std::string& path); + int RemoveBackupFlag(const std::string& path); + + private: + std::shared_ptr logger_; + std::list> success_list_; + std::list> failure_list_; + std::string parser_db_; + std::string parser_db_journal_; + std::string cert_db_; + std::string cert_db_journal_; +}; + +} // common_fota + +#endif // UPGRADER_H_ diff --git a/src/pkg_upgrade/pkg_upgrade.c b/src/pkg_upgrade/pkg_upgrade.c deleted file mode 100644 index 96d628f..0000000 --- a/src/pkg_upgrade/pkg_upgrade.c +++ /dev/null @@ -1,1864 +0,0 @@ -/* - * pkg-fota - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include "include/pkg_upgrade.h" - -#include - -#define USR_MANIFEST_DIRECTORY tzplatform_getenv(TZ_SYS_RO_PACKAGES) -#define OPT_USR_MANIFEST_DIRECTORY tzplatform_getenv(TZ_SYS_RW_PACKAGES) -#define RW_PKG_DIRECTORY tzplatform_getenv(TZ_SYS_RW_APP) -#define SKEL_DIRECTORY tzplatform_mkpath(TZ_SYS_ETC, "skel/apps_rw") - -#define PKGMGR_FOTA_PATH tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ - "pkgmgr/fota") -#define PKGID_LIST_FROM_DB_FILE tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ - "pkgmgr/fota/pkgid_list_from_db.txt") -#define PKGID_LIST_FROM_XML_FILE \ - tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ - "pkgmgr/fota/pkgid_list_from_xml.txt") -#define PRELOAD_RW_PKG_LIST \ - tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ - "pkgmgr/fota/.all_preload_rw_list") -#define DBPATH tzplatform_mkpath(TZ_SYS_DB, "/.pkgmgr_parser.db") -#define JOURNAL_DBPATH tzplatform_mkpath(TZ_SYS_DB, \ - "/.pkgmgr_parser.db-journal") -#define CERT_DBPATH tzplatform_mkpath(TZ_SYS_DB, "/.pkgmgr_cert.db") -#define JOURNAL_CERT_DBPATH tzplatform_mkpath(TZ_SYS_DB, \ - "/.pkgmgr_cert.db-journal") -#define OPT_ZIP_FILE "/usr/system/RestoreDir/opt.zip" -#define ALL_PRELOAD_RW_PKG_LIST "/opt/usr/share/.all_preload_rw_list" -#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) -#define APPFW_USER "app_fw" - -struct pkginfo { - char *pkgid; - char *version; - char *type; -}; - -static char *unzip_path[BUF_SIZE] = { - "opt/usr/globalapps", - "opt/etc/skel/apps_rw", - NULL -}; - -static void __free_pkginfo(gpointer data) -{ - struct pkginfo *info = (struct pkginfo *)data; - free(info->pkgid); - free(info->version); - free(info->type); - free(info); -} - -float __get_elapsed_time() -{ - static long start_time = 0; - long endtime = 0; - struct timeval tv; - - if (start_time == 0) { - gettimeofday(&tv, NULL); - start_time = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - } - - gettimeofday(&tv, NULL); - endtime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - - return (endtime - start_time)/1000.0; -} - -#define _LOG(fmt, arg...) do { \ - int fd = 0; \ - FILE *file = NULL; \ - file = fopen(FOTA_RESULT_FILE, "a"); \ - if (file == NULL) break; \ - fprintf(file, "[PKG_FOTA][%5d][%10.3fs] "fmt"", getpid(), \ - __get_elapsed_time(), ##arg); \ - fflush(file); \ - fd = fileno(file); \ - fsync(fd); \ - fclose(file); \ - fprintf(stderr, "[PKG_FOTA][%5d][%10.3fs] "fmt"", getpid(), \ - __get_elapsed_time(), ##arg); \ -} while (0) - -int remove_directory(const char *path) -{ - DIR *dir; - struct dirent *entry; - size_t path_len = strlen(path); - int ret = 0; - int iterate_ret; - char buf[BUF_SIZE] = {0}; - size_t len; - struct stat statbuf; - - dir = opendir(path); - if (!dir) - return -1; - - while (!ret && (entry = readdir(dir))) { - iterate_ret = -1; - - if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) - continue; - - len = path_len + strlen(entry->d_name) + 2; - snprintf(buf, len, "%s/%s", path, entry->d_name); - - if (!stat(buf, &statbuf)) { - if (S_ISDIR(statbuf.st_mode)) - iterate_ret = remove_directory(buf); - else - iterate_ret = unlink(buf); - } - ret = iterate_ret; - } - - closedir(dir); - if (!ret) - ret = rmdir(path); - - return ret; -} - -static void __iter_cb(gpointer key, gpointer value, gpointer user_data) -{ - - FILE *file; - char *pkgid; - char *version; - char *type; - char pkg_info[BUF_SIZE]; - pkgmgrinfo_pkginfo_h info; - - if (user_data == NULL || key == NULL) - return; - - file = user_data; - pkgid = key; - - if (pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &info)) { - _LOGE("failed to get pkginfo of %s\n", pkgid); - return; - } - - if (pkgmgrinfo_pkginfo_get_version(info, &version)) { - pkgmgrinfo_pkginfo_destroy_pkginfo(info); - return; - } - - if (pkgmgrinfo_pkginfo_get_type(info, &type)) { - pkgmgrinfo_pkginfo_destroy_pkginfo(info); - return; - } - - snprintf(pkg_info, BUF_SIZE, - "package=\"%s\"\tversion=\"%s\"\ttype=\"%s\":\n", - pkgid, version, type); - fwrite(pkg_info, 1, strlen(pkg_info), file); - pkgmgrinfo_pkginfo_destroy_pkginfo(info); -} - -static void __make_preload_rw_list(GHashTable *preload_rw_table) -{ - if (preload_rw_table == NULL) { - _LOG("preload_rw_table is null\n"); - return; - } - FILE *file = NULL; - - char buf[BUF_SIZE]; - char tmp_path[BUF_SIZE]; - snprintf(tmp_path, BUF_SIZE, "%s.tmp", ALL_PRELOAD_RW_PKG_LIST); - - if (rename(ALL_PRELOAD_RW_PKG_LIST, tmp_path)) { - if (errno != ENOENT) - _LOG("can not backup preload rw pkg list: %d", errno); - } - - file = fopen(ALL_PRELOAD_RW_PKG_LIST, "w"); - if (file == NULL) { - _LOG("can not open [%s]: %s\n", ALL_PRELOAD_RW_PKG_LIST, - strerror_r(errno, buf, sizeof(buf))); - return; - } - g_hash_table_foreach(preload_rw_table, __iter_cb, file); - fsync(fileno(file)); - fclose(file); - if (remove(tmp_path)) - _LOG("cannot remove backup file(%s): %d", tmp_path, errno); -} - -static int __is_dir(const char *dirname) -{ - struct stat stFileInfo; - - retvm_if(dirname == NULL, -1, "dirname == NULL\n"); - retvm_if(stat(dirname, &stFileInfo) < 0, -1, - "stFileInfo is not enough\n"); - - if (S_ISDIR(stFileInfo.st_mode)) - return 0; - return -1; -} - -static int __xsystem(const char *argv[]) -{ - int status = 0; - pid_t pid; - pid = fork(); - switch (pid) { - case -1: - perror("fork failed"); - return -1; - case 0: - /* child */ - execvp(argv[0], (char *const *)argv); - _exit(-1); - default: - /* parent */ - break; - } - if (waitpid(pid, &status, 0) == -1) { - perror("waitpid failed"); - return -1; - } - if (WIFSIGNALED(status)) { - perror("signal"); - return -1; - } - if (!WIFEXITED(status)) { - /* shouldn't happen */ - perror("should not happen"); - return -1; - } - return WEXITSTATUS(status); -} - -static int __check_pkgmgr_fota_dir() -{ - int ret = 0; - - if (__is_dir(PKGMGR_FOTA_PATH) < 0) { - const char *mkdir_argv[] = { "/bin/mkdir", - "-p", PKGMGR_FOTA_PATH, NULL }; - ret = __xsystem(mkdir_argv); - retvm_if(ret != 0, -1, "mkdir_argv error [%d]\n", ret); - } - - return 0; -} - -static int __remove_pkgid_list() -{ - int ret = 0; - - if (access(FOTA_RESULT_FILE, R_OK) == 0) { - ret = remove(FOTA_RESULT_FILE); - err_if(ret < 0, "remove[%s] failed", FOTA_RESULT_FILE); - } - - if (access(PKGID_LIST_FROM_DB_FILE, R_OK) == 0) { - ret = remove(PKGID_LIST_FROM_DB_FILE); - err_if(ret < 0, "remove[%s] failed", PKGID_LIST_FROM_DB_FILE); - } - - if (access(PKGID_LIST_FROM_XML_FILE, R_OK) == 0) { - ret = remove(PKGID_LIST_FROM_XML_FILE); - err_if(ret < 0, "remove[%s] failed", PKGID_LIST_FROM_XML_FILE); - } - - return 0; -} - -static int __make_pkgid_list(const char *file_path, char *pkgid, - char *version, char *type, bool is_update) -{ - FILE *fp; - - if (NULL == pkgid) - return 0; - - fp = fopen(file_path, "a+"); - if (NULL == fp) - return -1; - - fprintf(fp, "%s\"%s\" %s\"%s\" %s\"%s\" %s\"%s\":\n", - TOKEN_PKGID_STR, pkgid, - TOKEN_VERSION_STR, version, - TOKEN_TYPE_STR, type, - TOKEN_UPDATE_STR, (is_update) ? "true" : "false"); - - fclose(fp); - - return 0; -} - -static int __insert_preload_rw_table(GHashTable *preload_rw_table, - const char *pkgid, const char *version, const char *type) -{ - struct pkginfo *info; - char *package; - - info = calloc(1, sizeof(struct pkginfo)); - if (info == NULL) { - _LOGE("out of memory"); - return -1; - } - - info->pkgid = strdup(pkgid); - if (info->pkgid == NULL) { - _LOGE("out of memory"); - __free_pkginfo((struct pkginfo *)info); - return -1; - } - - info->version = strdup(version); - if (info->version == NULL) { - _LOGE("out of memory"); - __free_pkginfo((struct pkginfo *)info); - return -1; - } - - info->type = strdup(type); - if (info->type == NULL) { - _LOGE("out of memory"); - __free_pkginfo((struct pkginfo *)info); - return -1; - } - - package = strdup(pkgid); - if (package == NULL) { - _LOGE("out of memory"); - __free_pkginfo((struct pkginfo *)info); - return -1; - } - - g_hash_table_insert(preload_rw_table, package, info); - return 0; -} - -static int __delete_preload_rw_table(GHashTable *preload_rw_table, - const char *pkgid) -{ - gboolean removed; - removed = g_hash_table_remove(preload_rw_table, pkgid); - return removed ? 0 : -1; -} - -static int __pkgid_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data) -{ - int ret = -1; - char *pkgid = NULL; - char *version = NULL; - char *type = NULL; - bool is_update = false; - - ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); - err_if(ret < 0, "pkgmgrinfo_pkginfo_get_pkgid failed"); - - ret = pkgmgrinfo_pkginfo_get_version(handle, &version); - err_if(ret < 0, "pkgmgrinfo_pkginfo_get_version failed"); - - ret = pkgmgrinfo_pkginfo_get_type(handle, &type); - err_if(ret < 0, "pkgmgrinfo_pkginfo_get_type failed"); - - ret = pkgmgrinfo_pkginfo_is_update(handle, &is_update); - err_if(ret < 0, "pkgmgrinfo_pkginfo_is_update failed"); - - ret = __make_pkgid_list((char *)user_data, pkgid, - version, type, is_update); - return ret; -} - -static int __preload_rw_pkgid_list_cb(const pkgmgrinfo_pkginfo_h handle, - void *user_data) -{ - int ret; - char *pkgid; - char *version; - char *type; - GHashTable *preload_rw_table = (GHashTable *)user_data; - - ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); - if (ret < 0) { - _LOGE("pkgmgrinfo_pkginfo_get_pkgid failed\n"); - return -1; - } - - ret = pkgmgrinfo_pkginfo_get_version(handle, &version); - if (ret < 0) { - _LOGE("pkgmgrinfo_pkginfo_get_version failed\n"); - return -1; - } - - ret = pkgmgrinfo_pkginfo_get_type(handle, &type); - if (ret < 0) { - _LOGE("pkgmgrinfo_pkginfo_get_type failed\n"); - return -1; - } - - ret = __insert_preload_rw_table(preload_rw_table, pkgid, version, type); - if (ret < 0) { - _LOGE("__insert_preload_rw_table failed\n"); - return -1; - } - - return 0; -} - -static void __str_trim(char *input) -{ - char *trim_str = input; - - if (input == NULL) - return; - - while (*input != 0) { - if (!isspace(*input)) { - *trim_str = *input; - trim_str++; - } - input++; - } - - *trim_str = 0; - return; -} - -static char *__getvalue(const char *pBuf, const char *pKey, int depth) -{ - const char *p = NULL; - const char *pStart = NULL; - const char *pEnd = NULL; - - p = strstr(pBuf, pKey); - if (p == NULL) - return NULL; - - pStart = p + strlen(pKey) + depth; - pEnd = strchr(pStart, SEPERATOR_END); - if (pEnd == NULL) { - pEnd = strchr(pStart, SEPERATOR_MID); - if (pEnd == NULL) - return NULL; - } - - size_t len = pEnd - pStart; - if (len <= 0) - return NULL; - - char *pRes = (char *)malloc(len + 1); - if (pRes == NULL) { - _LOG("malloc failed.\n"); - return NULL; - } - strncpy(pRes, pStart, len); - pRes[len] = 0; - - return pRes; -} - -static int __compare_pkgid(char *file_path, char *fota_pkgid, - char *fota_version, bool *is_updated) -{ - retvm_if(file_path == NULL, -1, "file_path is null.\n"); - retvm_if(fota_pkgid == NULL, -1, "fota_pkgid is null.\n"); - retvm_if(fota_version == NULL, -1, "fota_version is null.\n"); - - int ret = PKG_IS_NOT_EXIST; - FILE *fp = NULL; - char buf[BUF_SIZE] = {0}; - char *pkgid = NULL; - char *version = NULL; - char *update = NULL; - int compare = PMINFO_VERSION_SAME; - - fp = fopen(file_path, "r"); - retvm_if(fp == NULL, -1, "Fail get : %s\n", file_path); - - while (fgets(buf, BUF_SIZE, fp) != NULL) { - __str_trim(buf); - - pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); - if (pkgid == NULL) { - _LOG("pkgid is null\n"); - continue; - } - - version = __getvalue(buf, TOKEN_VERSION_STR, 1); - if (version == NULL) { - FREE_AND_NULL(pkgid); - _LOG("compare_data is null\n"); - continue; - } - - update = __getvalue(buf, TOKEN_UPDATE_STR, 1); - if (update == NULL) { - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - _LOG("compare_data is null\n"); - continue; - } - if (!strncmp(update, "true", strlen("true"))) - *is_updated = true; - else - *is_updated = false; - - if (strcmp(pkgid, fota_pkgid) == 0) { - ret = pkgmgrinfo_compare_package_version(version, - fota_version, &compare); - if (compare == PMINFO_VERSION_NEW) { - _LOG("pkgid = %s, db version = %s, new package" - " version = %s\n", pkgid, version, - fota_version); - _LOG("pkg is updated, need to upgrade\n"); - - ret = PKG_IS_UPDATED; - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(update); - break; - } else if (compare == PMINFO_VERSION_OLD) { - ret = PKG_IS_OLD; - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(update); - break; - } - - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(update); - ret = PKG_IS_SAME; - break; - } - - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(update); - memset(buf, 0x00, BUF_SIZE); - } - - if (fp != NULL) - fclose(fp); - - return ret; -} - -static bool __check_deleted_pkg(GHashTable *preload_rw_table, - const char *fota_pkgid) -{ - if (g_hash_table_contains(preload_rw_table, fota_pkgid)) - return true; - return false; -} - -char *__manifest_to_package(const char *manifest) -{ - char *package; - - if (manifest == NULL) - return NULL; - - package = strdup(manifest); - if (package == NULL) - return NULL; - - if (!strstr(package, ".xml")) { - _LOG("%s is not a manifest file \n", manifest); - free(package); - return NULL; - } - - return package; -} - -static void __send_args_to_backend(const char *pkgid, const char *pkgtype, - int operation) -{ - int ret = 0; - - long starttime; - long endtime; - struct timeval tv; - gettimeofday(&tv, NULL); - starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - char *query; - char backend_cmd[BUF_SIZE]; - const char *new_pkgtype; - const char tpk_pkgtype[] = "tpk"; - - const char *preload_rw[] = { backend_cmd, "-y", pkgid, - "--preload-rw", NULL }; - const char *install_ro[] = { backend_cmd, "-y", pkgid, - "--preload", "--partial-rw", NULL }; - const char *uninstall_ro[] = { backend_cmd, "-d", pkgid, - "--preload", "--force-remove", - "--partial-rw", NULL }; - const char *uninstall_ro_keeprwdata[] = { backend_cmd, "-d", pkgid, - "--preload", "--force-remove", - "--keep-rwdata", NULL }; - const char *uninstall_ro_update[] = { backend_cmd, "-d", - pkgid, "--keep-rwdata", NULL }; - const char *db_cmd[] = {"/usr/bin/sqlite3", - NULL, NULL, NULL}; - - if (operation == PKG_NEED_NOTHING) - return; - - if (!strcmp(pkgtype, "rpm")) - new_pkgtype = tpk_pkgtype; - else - new_pkgtype = pkgtype; - - snprintf(backend_cmd, sizeof(backend_cmd), "/usr/bin/%s-backend", - new_pkgtype); - - switch (operation) { - case PKG_NEED_INSTALL: - case PKG_NEED_ROUPDATE: - ret = __xsystem(install_ro); - break; - case PKG_NEED_UNINSTALL: - ret = __xsystem(uninstall_ro); - break; - case PKG_NEED_UPDATE_TO_RW: - query = sqlite3_mprintf( - "UPDATE package_info SET " \ - "package_preload='false', " \ - "package_system='false' "\ - "WHERE package=%Q", pkgid); - db_cmd[1] = strdup(DBPATH); - db_cmd[2] = query; - ret = __xsystem(db_cmd); - FREE_AND_NULL(db_cmd[1]); - sqlite3_free(query); - break; - case PKG_NEED_RWUNINSTALL: - case PKG_NEED_UPDATE_TO_RO: - ret = __xsystem(uninstall_ro_update); - break; - case PKG_NEED_RO_DBREMOVE: - query = sqlite3_mprintf( - "PRAGMA foreign_keys=on; " \ - "DELETE FROM package_info " \ - "WHERE package=%Q", pkgid); - db_cmd[1] = strdup(DBPATH); - db_cmd[2] = query; - ret = __xsystem(db_cmd); - FREE_AND_NULL(db_cmd[1]); - sqlite3_free(query); - break; - case PKG_NEED_PRELOADRW_INSTALL: - ret = __xsystem(preload_rw); - break; - case PKG_NEED_RO_UNINSTALL_KEEPRWDATA: - ret = __xsystem(uninstall_ro_keeprwdata); - break; - } - - gettimeofday(&tv, NULL); - endtime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - - _LOG("result[%ld ms, %d] \t Pkgid[%s] \n", - (endtime - starttime), ret, pkgid); -} - -int __child_element(xmlTextReaderPtr reader, int depth) -{ - int ret = xmlTextReaderRead(reader); - int cur = xmlTextReaderDepth(reader); - while (ret == 1) { - switch (xmlTextReaderNodeType(reader)) { - case XML_READER_TYPE_ELEMENT: - if (cur == depth + 1) - return 1; - break; - case XML_READER_TYPE_TEXT: - /*text is handled by each function separately*/ - if (cur == depth + 1) - return 0; - break; - case XML_READER_TYPE_END_ELEMENT: - if (cur == depth) - return 0; - break; - default: - if (cur <= depth) - return 0; - break; - } - - ret = xmlTextReaderRead(reader); - cur = xmlTextReaderDepth(reader); - } - return ret; -} - -char *__find_info_from_xml(const char *manifest, const char *find_info) -{ - retvm_if(manifest == NULL, NULL, "manifest is null.\n"); - retvm_if(find_info == NULL, NULL, "find_info is null.\n"); - - const xmlChar *node; - xmlTextReaderPtr reader; - char *info_val = NULL; - xmlChar *tmp = NULL; - - reader = xmlReaderForFile(manifest, NULL, 0); - - if (reader) { - if (__child_element(reader, -1)) { - node = xmlTextReaderConstName(reader); - if (!node) { - printf("xmlTextReaderConstName value is NULL\n"); - goto end; - } - - if (!strcmp(ASCII(node), "manifest")) { - tmp = xmlTextReaderGetAttribute(reader, - XMLCHAR(find_info)); - if (tmp) { - FREE_AND_STRDUP(ASCII(tmp), info_val); - if (info_val == NULL) - printf("Malloc Failed\n"); - FREE_AND_NULL(tmp); - } - } else { - printf("Manifest Node is not found\n"); - } - } - } else { - printf("xmlReaderForFile value is NULL\n"); - } - -end: - if (reader) - xmlFreeTextReader(reader); - - return info_val; -} - -static int __find_preload_pkgid_from_xml(const char *file_path, - const char *xml_directory) -{ - retvm_if(file_path == NULL, -1, "file_path is NULL.\n"); - retvm_if(xml_directory == NULL, -1, "xml_directory is NULL.\n"); - - int ret = 0; - char buf[BUF_SIZE] = {0}; - DIR *dir; - struct dirent *entry = NULL; - - dir = opendir(xml_directory); - if (!dir) { - if (strerror_r(errno, buf, sizeof(buf)) == 0) - _LOG("Failed to access the [%s] because %s\n", - xml_directory, buf); - return -1; - } - - while ((entry = readdir(dir)) != NULL) { - char *manifest = NULL; - char *pkgid = NULL; - char *version = NULL; - char *type = NULL; - - if (entry->d_name[0] == '.') continue; - - manifest = __manifest_to_package(entry->d_name); - if (!manifest) { - _LOG("Failed to convert file to xml[%s]\n", - entry->d_name); - continue; - } - - snprintf(buf, sizeof(buf), "%s/%s", xml_directory, manifest); - - /*Get the package name from manifest file*/ - pkgid = __find_info_from_xml(buf, "package"); - if (pkgid == NULL) { - FREE_AND_NULL(manifest); - continue; - } - - version = __find_info_from_xml(buf, "version"); - if (version == NULL) - version = strdup("0.0.1"); - - type = __find_info_from_xml(buf, "type"); - if (type == NULL) - type = strdup("tpk"); - - ret = __make_pkgid_list((char *)file_path, pkgid, - version, type, false); - if (ret < 0) - _LOG("Make file Fail : %s => %s, %s\n", - buf, pkgid, version); - - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(manifest); - FREE_AND_NULL(type); - } - - closedir(dir); - - return 0; -} - -static int __find_preload_pkgid_from_db(const char *file_path) -{ - retvm_if(file_path == NULL, -1, "file_path is NULL.\n"); - - int ret = 0; - pkgmgrinfo_pkginfo_filter_h handle = NULL; - - ret = pkgmgrinfo_pkginfo_filter_create(&handle); - retvm_if(ret != PMINFO_R_OK, -1, - "pkginfo filter handle create failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, - PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, 1); - tryvm_if(ret < 0, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool" - "(PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD) failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, - PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM, 1); - tryvm_if(ret < 0, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool" - "(PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM) failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, - __pkgid_list_cb, (void *)file_path); - err_if(ret < 0, - "pkgmgrinfo_pkginfo_filter_foreach_pkginfo() failed\n"); - -catch: - pkgmgrinfo_pkginfo_filter_destroy(handle); - return ret; -} - -static int __find_preload_rw_pkgid_from_db(GHashTable *preload_rw_table) -{ - int ret; - pkgmgrinfo_pkginfo_filter_h handle; - - ret = pkgmgrinfo_pkginfo_filter_create(&handle); - retvm_if(ret != PMINFO_R_OK, -1, - "pkginfo filter handle create failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, - PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, 1); - tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool" - "(PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD) failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, - PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE, 1); - tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool" - "(PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE) failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, - PMINFO_PKGINFO_PROP_PACKAGE_READONLY, 0); - tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool" - "(PMINFO_PKGINFO_PROP_PACKAGE_READONLY) failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, - PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM, 0); - tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool" - "(PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM) failed\n"); - - ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, - __preload_rw_pkgid_list_cb, (void *)preload_rw_table); - err_if(ret != PMINFO_R_OK, - "pkgmgrinfo_pkginfo_filter_foreach_pkginfo() failed\n"); - - ret = 0; -catch: - pkgmgrinfo_pkginfo_filter_destroy(handle); - return ret; -} - -static int __find_matched_pkgid_from_list(const char *source_file, - const char *target_file) -{ - retvm_if(source_file == NULL, -1, "source_file is NULL.\n"); - retvm_if(target_file == NULL, -1, "target_file is NULL.\n"); - - FILE *fp = NULL; - char buf[BUF_SIZE] = {0}; - char *pkgid = NULL; - char *version = NULL; - char *pkgtype = NULL; - - int same_pkg_cnt = 0; - int update_pkg_cnt = 0; - int insert_pkg_cnt = 0; - int total_pkg_cnt = 0; - - int compare_result = 0; - int operation; - - bool db_update; - - fp = fopen(source_file, "r"); - retvm_if(fp == NULL, -1, "Fail get : %s\n", source_file); - - _LOG("Searching...... inserted or Updated package \n"); - - while (fgets(buf, BUF_SIZE, fp) != NULL) { - __str_trim(buf); - - pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); - if (pkgid == NULL) - continue; - - version = __getvalue(buf, TOKEN_VERSION_STR, 1); - if (version == NULL) { - free(pkgid); - continue; - } - pkgtype = __getvalue(buf, TOKEN_TYPE_STR, 1); - if (pkgtype == NULL) { - free(version); - free(pkgid); - continue; - } - - operation = PKG_NEED_NOTHING; - compare_result = __compare_pkgid((char *)target_file, pkgid, - version, &db_update); - if (compare_result == PKG_IS_NOT_EXIST) { - _LOG("pkgid[%s] is installed, Start install\n", pkgid); - operation = PKG_NEED_INSTALL; - insert_pkg_cnt++; - } else if (compare_result == PKG_IS_SAME) { - if (db_update) { - operation = PKG_NEED_RWUNINSTALL; - update_pkg_cnt++; - } else { - operation = PKG_NEED_NOTHING; - same_pkg_cnt++; - } - } else if (compare_result == PKG_IS_UPDATED) { - if (db_update) { - operation = PKG_NEED_UPDATE_TO_RO; - } else { - operation = PKG_NEED_ROUPDATE; - } - update_pkg_cnt++; - } - - total_pkg_cnt++; - __send_args_to_backend(pkgid, pkgtype, operation); - - memset(buf, 0x00, BUF_SIZE); - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(pkgtype); - } - - _LOG("-------------------------------------------------------\n"); - _LOG("[Total pkg=%d, same pkg=%d, updated pkg=%d, " - "inserted package=%d]\n", - total_pkg_cnt, same_pkg_cnt, update_pkg_cnt, insert_pkg_cnt); - _LOG("-------------------------------------------------------\n"); - - if (fp != NULL) - fclose(fp); - - return 0; -} - -static bool __find_pkgid_from_rw_list(const char *pkgid) -{ - if (pkgid == NULL) - return false; - - bool ret = false; - FILE *fp = NULL; - char buf[BUF_SIZE] = {0}; - char *preload_rw_pkgid = NULL; - - fp = fopen(PRELOAD_RW_PKG_LIST, "r"); - retvm_if(fp == NULL, -1, "Failed to open : %s\n", PRELOAD_RW_PKG_LIST); - - while (fgets(buf, BUF_SIZE, fp) != NULL) { - __str_trim(buf); - - preload_rw_pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); - if (preload_rw_pkgid == NULL) { - _LOG("Failed to get pkgidstring[%s]\n", buf); - continue; - } - - if (strcmp(pkgid, preload_rw_pkgid) == 0) { - _LOG("pkgid[%s] is converted to preload rw pkg\n", pkgid); - FREE_AND_NULL(preload_rw_pkgid); - ret = true; - break; - } - FREE_AND_NULL(preload_rw_pkgid); - } - - fclose(fp); - return ret; -} - -static int __unzip_file_only_to_path(char *dest_path, char *unzip_to) -{ - const char *unzip_argv[] = { "/usr/bin/unzip", "-joXqq", - OPT_ZIP_FILE, dest_path, "-d", unzip_to, NULL }; - int ret = __xsystem(unzip_argv); - - return ret; -} - -static int __unzip_files(char *dest_path) -{ - const char *unzip_argv[] = { "/usr/bin/unzip", "-oXqq", - OPT_ZIP_FILE, dest_path, "-d", "/", NULL }; - int ret = __xsystem(unzip_argv); - - return ret; -} - -static int __install_preload_rw(const char *pkgid, const char *version, - const char *pkgtype, GHashTable *preload_rw_table) -{ - if (pkgid == NULL || version == NULL || pkgtype == NULL) - return -1; - - int index; - int ret; - char buf[BUF_SIZE] = {0}; - - /* copy modified manifest */ - snprintf(buf, BUF_SIZE, "%s/%s.xml", - (tzplatform_getenv(TZ_SYS_RW_PACKAGES) + 1), pkgid); - ret = __unzip_files(buf); - if (ret != 0) { - _LOG("Failed to unzip file from backup[%s]\n", buf); - return ret; - } - - /* copy stored signature */ - snprintf(buf, BUF_SIZE, "%s/signatures/%s.txt", - (tzplatform_getenv(TZ_SYS_SHARE) + 1), pkgid); - ret = __unzip_files(buf); - if (ret != 0) { - _LOG("Failed to unzip file from backup[%s]\n", buf); - return ret; - } - - /* copy RO and RW components */ - for (index = 0; index < BUF_SIZE; index++) { - if (unzip_path[index] == NULL) - break; - - snprintf(buf, BUF_SIZE, "%s/%s/*", unzip_path[index], pkgid); - ret = __unzip_files(buf); - if (ret != 0) { - _LOG("Failed to unzip file from backup[%s]\n", buf); - return ret; - } - } - - ret = __insert_preload_rw_table(preload_rw_table, pkgid, version, - pkgtype); - retvm_if(ret < 0, -1, "__insert_preload_rw_table fail\n"); - - __send_args_to_backend(pkgid, pkgtype, PKG_NEED_PRELOADRW_INSTALL); - return ret; -} - -static void __convert_preload_to_rw(const char *pkgid, const char *version, - const char *pkgtype, GHashTable *preload_rw_table) -{ - if (pkgid == NULL || version == NULL || pkgtype == NULL) - return; - char buf[BUF_SIZE] = {0}; - int ret; - - snprintf(buf, BUF_SIZE, "%s/skel/apps_rw/%s", - tzplatform_getenv(TZ_SYS_ETC), pkgid); - - __send_args_to_backend(pkgid, pkgtype, PKG_NEED_RO_UNINSTALL_KEEPRWDATA); - ret = remove_directory(buf); - if (ret != 0) - _LOG("Failed to remove directory[%s]\n", buf); - - ret = __install_preload_rw(pkgid, version, pkgtype, preload_rw_table); - if (ret != 0) { - _LOG("Failed install preload rw pkg[%s]\n", pkgid); - return; - } -} - -static int __find_deleted_pkgid_from_list(const char *source_file, - const char *target_file, GHashTable *preload_rw_table) -{ - retvm_if(source_file == NULL, -1, "source_file is NULL.\n"); - retvm_if(target_file == NULL, -1, "target_file is NULL.\n"); - - FILE *fp = NULL; - char buf[BUF_SIZE] = {0}; - char *pkgid; - char *version; - char *pkgtype = NULL; - char *update = NULL; - bool is_preload_rw_pkg; - bool xml_update; - int deleted_pkg_cnt = 0; - int modified_pkg_cnt = 0; - int total_pkg_cnt = 0; - int compare_result = 0; - - fp = fopen(source_file, "r"); - retvm_if(fp == NULL, -1, "Fail get : %s\n", source_file); - - _LOG("Searching...... deleted package \n"); - - while (fgets(buf, BUF_SIZE, fp) != NULL) { - __str_trim(buf); - - pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); - version = __getvalue(buf, TOKEN_VERSION_STR, 1); - pkgtype = __getvalue(buf, TOKEN_TYPE_STR, 1); - if (pkgid == NULL || version == NULL || pkgtype == NULL) { - _LOG("Failed to get pkg info from string[%s]\n", buf); - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(pkgtype); - continue; - } - - compare_result = __compare_pkgid((char *)target_file, pkgid, - version, &xml_update); - if (compare_result == PKG_IS_NOT_EXIST) { - update = __getvalue(buf, TOKEN_UPDATE_STR, 1); - if (update == NULL) { - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(pkgtype); - continue; - } - - is_preload_rw_pkg = __find_pkgid_from_rw_list(pkgid); - - if (!strncmp(update, "false", strlen("false"))) { - if (is_preload_rw_pkg) { - __convert_preload_to_rw(pkgid, version, - pkgtype, - preload_rw_table); - modified_pkg_cnt++; - } else { - __send_args_to_backend(pkgid, pkgtype, - PKG_NEED_UNINSTALL); - deleted_pkg_cnt++; - } - } else { - __send_args_to_backend(pkgid, pkgtype, - PKG_NEED_UPDATE_TO_RW); - modified_pkg_cnt++; - if (is_preload_rw_pkg) { - __send_args_to_backend(pkgid, pkgtype, - PKG_NEED_RWUNINSTALL); - __install_preload_rw(pkgid, version, - pkgtype, - preload_rw_table); - } - } - } - total_pkg_cnt++; - - memset(buf, 0x00, BUF_SIZE); - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(pkgtype); - FREE_AND_NULL(update); - } - - _LOG("-------------------------------------------------------\n"); - _LOG("[Total pkg=%d, deleted package=%d, modified package=%d]\n", - total_pkg_cnt, deleted_pkg_cnt, modified_pkg_cnt); - _LOG("-------------------------------------------------------\n"); - - if (fp != NULL) - fclose(fp); - - return 0; - -} - -static int __get_pkgid_list_from_db_and_xml() -{ - _LOG("=======================================================\n"); - _LOG("RO preload package fota\n"); - _LOG("=======================================================\n"); - - int ret = 0; - char updated_preload_rw_list[BUF_SIZE]; - - /*get pkg info on pkgmgr db, it means old version */ - ret = __find_preload_pkgid_from_db(PKGID_LIST_FROM_DB_FILE); - retvm_if(ret < 0, -1, "__find_preload_pkgid_from_db fail.\n"); - - _LOG("Make pkgid list from db success!! \n"); - - /*get pkg info on xml, it means new version */ - ret = __find_preload_pkgid_from_xml(PKGID_LIST_FROM_XML_FILE, - USR_MANIFEST_DIRECTORY); - retvm_if(ret < 0, -1, "__find_preload_pkgid_from_xml fail.\n"); - - _LOG("Make pkgid list from xml success!! \n"); - - - /*get preload rw pkg info on xml from opt.zip, it means new version */ - snprintf(updated_preload_rw_list, sizeof(updated_preload_rw_list), "%s", - ALL_PRELOAD_RW_PKG_LIST); - ret = __unzip_file_only_to_path(updated_preload_rw_list + 1, - (char *)PKGMGR_FOTA_PATH); - if (ret != 0) { - _LOG("Failed to unzip file from backup[%s]\n", - updated_preload_rw_list); - return ret; - } - - _LOG("Make rw pkgid list from xml success!! \n"); - - return 0; -} - -static int __process_ro_fota(GHashTable *preload_rw_table) -{ - int ret; - long starttime; - long endtime; - struct timeval tv; - - xmlInitParser(); - - gettimeofday(&tv, NULL); - starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - - /* find deleted pkgid */ - ret = __find_deleted_pkgid_from_list(PKGID_LIST_FROM_DB_FILE, - PKGID_LIST_FROM_XML_FILE, preload_rw_table); - err_if(ret < 0, "__find_deleted_pkgid_from_list fail.\n"); - - /* find updated, inserted pkgid */ - ret = __find_matched_pkgid_from_list(PKGID_LIST_FROM_XML_FILE, - PKGID_LIST_FROM_DB_FILE); - err_if(ret < 0, "__find_matched_pkgid_from_list fail.\n"); - - gettimeofday(&tv, NULL); - endtime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - - _LOG("=======================================================\n"); - _LOG("End RO process[time : %ld ms]\n", endtime - starttime); - _LOG("=======================================================\n"); - - xmlCleanupParser(); - - return 0; -} - -static void __remove_pkg_directories(const char *pkgid) -{ - int i; - int ret; - char buf[BUF_SIZE]; - const char *base_dirs[] = { - OPT_USR_MANIFEST_DIRECTORY, - RW_PKG_DIRECTORY, - SKEL_DIRECTORY, - NULL - }; - - for (i = 0; base_dirs[i] != NULL; i++) { - ret = snprintf(buf, sizeof(buf), "%s/%s", base_dirs[i], pkgid); - if (ret < 0 || ret > sizeof(buf)) { - printf("snprintf fail\n"); - continue; - } - if (!access(buf, F_OK)) { - if (remove_directory(buf)) - _LOGE("failed to remove directory: %s", buf); - } - } -} - -static int __process_rw_fota(GHashTable *preload_rw_table) -{ - FILE *fp = NULL; - char buf[BUF_SIZE] = {0}; - int ret = -1; - char *pkgid = NULL; - char *list_version = NULL; - char *db_stored_version = NULL; - char *pkgtype = NULL; - char *version = NULL; - pkgmgrinfo_pkginfo_h handle = NULL; - int compare = PMINFO_VERSION_SAME; - long total_time = 0; - - long starttime; - long endtime; - struct timeval tv; - bool is_deleted_pkg; - - _LOG("=======================================================\n"); - _LOG("RW preload package fota\n"); - _LOG("=======================================================\n"); - - fp = fopen(PRELOAD_RW_PKG_LIST, "r"); - retvm_if(fp == NULL, -1, "Fail get : %s\n", PRELOAD_RW_PKG_LIST); - - while (fgets(buf, BUF_SIZE, fp) != NULL) { - __str_trim(buf); - - gettimeofday(&tv, NULL); - starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - - pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); - if (pkgid == NULL) - continue; - - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); - if (ret == PMINFO_R_OK) { - list_version = __getvalue(buf, TOKEN_VERSION_STR, 1); - if (list_version == NULL) { - FREE_AND_NULL(pkgid); - continue; - } - ret = pkgmgrinfo_pkginfo_get_version(handle, &db_stored_version); - ret = pkgmgrinfo_compare_package_version(db_stored_version, - list_version, &compare); - if (ret != PMINFO_R_OK) { - _LOG("can not compare pkg version[%s]\n", pkgid); - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - handle = NULL; - FREE_AND_NULL(pkgid); - FREE_AND_NULL(list_version); - continue; - } - - if (compare != PMINFO_VERSION_NEW) { - /* package version is not update on FOTA. */ - _LOG("pkgid[%s] is not updated\n", pkgid); - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - handle = NULL; - FREE_AND_NULL(pkgid); - FREE_AND_NULL(list_version); - continue; - } - - _LOG("pkgid[%s] is updated, need to upgrade " - "from version [%s] to [%s]\n", - pkgid, db_stored_version, list_version); - } else { - is_deleted_pkg = __check_deleted_pkg(preload_rw_table, pkgid); - if (is_deleted_pkg) { - _LOG("pkgid[%s] is deleted pkg\n", pkgid); - __delete_preload_rw_table(preload_rw_table, - pkgid); - /* maybe there are pkg directories which are - * extracted from opt.zip by FOTA - */ - __remove_pkg_directories(pkgid); - FREE_AND_NULL(pkgid); - continue; - } - _LOG("pkgid[%s] is new\n", pkgid); - } - - version = __getvalue(buf, TOKEN_VERSION_STR, 1); - pkgtype = __getvalue(buf, TOKEN_TYPE_STR, 1); - __install_preload_rw(pkgid, version, pkgtype, preload_rw_table); - - FREE_AND_NULL(pkgid); - FREE_AND_NULL(pkgtype); - FREE_AND_NULL(version); - - if (handle) - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - - gettimeofday(&tv, NULL); - endtime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - total_time += (int)(endtime - starttime); - _LOG("finish request [time : %d ms]\n", - (int)(endtime - starttime)); - } - fclose(fp); - - return 0; -} - -static int __check_tmp_all_preload_rw_pkg_list() -{ - char buf[BUF_SIZE]; - char tmp_path[BUF_SIZE]; - snprintf(tmp_path, BUF_SIZE, "%s.tmp", ALL_PRELOAD_RW_PKG_LIST); - if (access(tmp_path, F_OK) == 0) { - if (rename(tmp_path, ALL_PRELOAD_RW_PKG_LIST)) { - _LOG("rename tmp all preload rw pkg list fail : %s\n", - strerror_r(errno, buf, sizeof(buf))); - return -1; - } - } - return 0; -} - -static int __fill_preload_rw_table(GHashTable *preload_rw_table) -{ - FILE *fp; - char buf[BUF_SIZE]; - char *pkgid; - char *version; - char *type; - - fp = fopen(ALL_PRELOAD_RW_PKG_LIST, "r"); - retvm_if(fp == NULL, -1, "Fail get : %s\n", ALL_PRELOAD_RW_PKG_LIST); - - while (fgets(buf, BUF_SIZE, fp) != NULL) { - __str_trim(buf); - - pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); - if (pkgid == NULL) { - _LOG("pkgid is null\n"); - continue; - } - - version = __getvalue(buf, TOKEN_VERSION_STR, 1); - if (version == NULL) { - _LOG("version is null\n"); - version = strdup(""); - if (version == NULL) { - _LOGE("out of memory\n"); - FREE_AND_NULL(pkgid); - continue; - } - } - - type = __getvalue(buf, TOKEN_TYPE_STR, 1); - if (type == NULL) { - _LOG("type is null\n"); - type = strdup(""); - if (type == NULL) { - _LOGE("out of memory\n"); - FREE_AND_NULL(version); - FREE_AND_NULL(pkgid); - continue; - } - } - - __insert_preload_rw_table(preload_rw_table, pkgid, version, - type); - FREE_AND_NULL(pkgid); - FREE_AND_NULL(version); - FREE_AND_NULL(type); - } - fclose(fp); - - return 0; -} - -#define DB_LABEL "User::Home" -#define SET_SMACK_LABEL(x) \ -do { \ - if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \ - _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \ - else \ - _LOG("chsmack -a %s %s", DB_LABEL, x); \ -} while (0) - -static int __set_db_permission(const char *path) -{ - int fd; - struct stat sb; - mode_t mode; - uid_t uid; - struct passwd pwd; - struct passwd *result; - char buf[BUF_SIZE]; - int ret; - - ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result); - if (result == NULL) { - if (ret == 0) - _LOGE("no such user: %s", APPFW_USER); - else - _LOGE("getpwnam_r failed: %d", errno); - return -1; - } - uid = pwd.pw_uid; - - ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result); - if (result == NULL) { - if (ret == 0) - _LOGE("no such user: %d", uid); - else - _LOGE("getpwuid_r failed: %d", errno); - return -1; - } - fd = open(path, O_RDONLY); - if (fd == -1) { - _LOGE("open %s failed: %d", path, errno); - return -1; - } - ret = fstat(fd, &sb); - if (ret == -1) { - _LOGE("stat %s failed: %d", path, errno); - close(fd); - return -1; - } - if (S_ISLNK(sb.st_mode)) { - _LOGE("%s is symlink!", path); - close(fd); - return -1; - } - ret = fchown(fd, uid, pwd.pw_gid); - if (ret == -1) { - _LOGE("fchown %s failed: %d", path, errno); - close(fd); - return -1; - } - - mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; - if (strstr(path, CERT_DBPATH)) - mode |= S_IWOTH; - ret = fchmod(fd, mode); - if (ret == -1) { - _LOGE("fchmod %s failed: %d", path, errno); - close(fd); - return -1; - } - fsync(fd); - close(fd); - SET_SMACK_LABEL(path); - - return 0; -} - -static int __create_backup_flag(const char *path) -{ - int fd; - char temp_buf[8192] = {'\0', }; - - snprintf(temp_buf, sizeof(temp_buf), "%s.bck.flag", path); - - fd = open(temp_buf, O_CREAT | O_WRONLY, 0644); - if (fd == -1) { - _LOG("failed to create flag file %s, %d", temp_buf, errno); - return -1; - } - close(fd); - - return 0; -} - -static int __check_backup_flag(const char *path) -{ - char temp_buf[8192] = {'\0', }; - - snprintf(temp_buf, sizeof(temp_buf), "%s.bck.flag", path); - if (access(temp_buf, F_OK) != 0) - return -1; - - return 0; -} - -static int __remove_backup_flag(const char *path) -{ - char temp_buf[8192] = {'\0', }; - - snprintf(temp_buf, sizeof(temp_buf), "%s.bck.flag", path); - if (remove(temp_buf)) { - _LOG("cannot remove flag file(%s): %d", temp_buf, errno); - return -1; - } - - return 0; -} - -static int __check_and_restore_backup(const char *origin_path) { - char backup_path[BUF_SIZE]; - char buf[BUF_SIZE]; - snprintf(backup_path, BUF_SIZE, "%s.bck", origin_path); - - // if backup flag exists, it means the previous backup process aborted. - if (access(backup_path, F_OK) && __check_backup_flag(origin_path)) - return 0; - - if (access(origin_path, F_OK) == 0) { - if (remove(origin_path)) { - _LOG("cannot remove path(%s) : %s\n", origin_path, - strerror_r(errno, buf, sizeof(buf))); - return -1; - } - } - - if (rename(backup_path, origin_path)) { - _LOG("fail to rename %s to %s : %s\n", backup_path, origin_path, - strerror_r(errno, buf, sizeof(buf))); - return -1; - } - - return 0; -} - -static int __check_and_restore_backup_dbs() { - if (__check_and_restore_backup(DBPATH)) - return -1; - - if (__check_and_restore_backup(JOURNAL_DBPATH)) - return -1; - - if (__check_and_restore_backup(CERT_DBPATH)) - return -1; - - if (__check_and_restore_backup(JOURNAL_CERT_DBPATH)) - return -1; - - return 0; -} - -static int __backup_file(const char *src_path, const char *dest_path) -{ - int ret = 0; - int rc; - FILE *src = NULL; - FILE *dest = NULL; - char temp_buf[8192] = {'\0', }; - size_t size_of_char = sizeof(char); - size_t size_of_temp_buf = sizeof(temp_buf); - - retvm_if(src_path == NULL || dest_path == NULL, - -1, "Invalid parameters"); - - retvm_if(access(src_path, F_OK) != 0, -1, - "File(%s) is not exist", src_path); - - // if backup flag exists, it means the previous backup process aborted. - if (__check_backup_flag(src_path)) { - if (access(dest_path, F_OK) == 0) { - if (remove(dest_path)) - _LOG("Failed to remove uncompleted backup file " - "%s: %d", dest_path, errno); - return -1; - } - } else { - if (__create_backup_flag(src_path)) { - _LOG("failed to create backup flag"); - return -1; - } - } - - src = fopen(src_path, "r"); - tryvm_if(src == NULL, ret = -1, "Failed to open : %s\n", src_path); - - dest = fopen(dest_path, "w"); - tryvm_if(dest == NULL, ret = -1, "Failed to open : %s\n", dest_path); - - while (!feof(src)) { - rc = fread(temp_buf, size_of_char, size_of_temp_buf, src); - fwrite(temp_buf, size_of_char, rc, dest); - } - - fsync(fileno(dest)); - -catch: - if (src) - fclose(src); - - if (dest) - fclose(dest); - - __remove_backup_flag(src_path); - - return ret; -} - -static int __backup_db(const char *src_path, const char *dest_path) { - if (__backup_file(src_path, dest_path) != 0) - return -1; - - if (__set_db_permission(dest_path) != 0) - return -1; - - return 0; -} - -static int __make_backup_dbs() { - int ret = 0; - char parser_db_bck[BUF_SIZE]; - char parser_db_journal_bck[BUF_SIZE]; - char cert_db_bck[BUF_SIZE]; - char cert_db_journal_bck[BUF_SIZE]; - - snprintf(parser_db_bck, BUF_SIZE, "%s.bck", DBPATH); - snprintf(parser_db_journal_bck, BUF_SIZE, "%s.bck", JOURNAL_DBPATH); - snprintf(cert_db_bck, BUF_SIZE, "%s.bck", CERT_DBPATH); - snprintf(cert_db_journal_bck, BUF_SIZE, "%s.bck", JOURNAL_CERT_DBPATH); - - tryvm_if(__backup_db(DBPATH, parser_db_bck) == -1, - ret = -1, "Fail to backup [%s] to [%s]\n", - DBPATH, parser_db_bck); - - tryvm_if(__backup_db(JOURNAL_DBPATH, parser_db_journal_bck) == -1, - ret = -1, "Fail to backup [%s] to [%s]\n", - JOURNAL_DBPATH, parser_db_journal_bck); - - tryvm_if(__backup_db(CERT_DBPATH, cert_db_bck) == -1, - ret = -1, "Fail to backup [%s] to [%s]\n", - CERT_DBPATH, cert_db_bck); - - tryvm_if(__backup_db(JOURNAL_CERT_DBPATH, cert_db_journal_bck) == -1, - ret = -1, "Fail to backup [%s] to [%s]\n", - JOURNAL_CERT_DBPATH, cert_db_journal_bck); - - return 0; - -catch: - remove(parser_db_bck); - remove(parser_db_journal_bck); - remove(cert_db_bck); - remove(cert_db_journal_bck); - - return ret; -} - -static void __remove_backup_path(const char *origin_path) { - char backup_path[BUF_SIZE]; - - snprintf(backup_path, BUF_SIZE, "%s.bck", origin_path); - - if (remove(backup_path)) - _LOG("cannot remove backup file(%s): %d", backup_path, errno); -} - -static void __remove_backup_dbs() { - __remove_backup_path(DBPATH); - __remove_backup_path(JOURNAL_DBPATH); - __remove_backup_path(CERT_DBPATH); - __remove_backup_path(JOURNAL_CERT_DBPATH); -} - -int main(int argc, char *argv[]) -{ - GHashTable *preload_rw_table; - int ret = 0; - - ret = __check_and_restore_backup_dbs(); - retvm_if(ret < 0, -1, "__check_and_restore_backup_dbs is failed.\n"); - - ret = __make_backup_dbs(); - retvm_if(ret < 0, -1, "__make_backup_dbs is failed.\n"); - - /* check pkgmgr-fota dir, if it is not, then exit */ - ret = __check_pkgmgr_fota_dir(); - retvm_if(ret < 0, -1, "__check_pkgmgr_fota_dir is failed.\n"); - - /* clean pkgid list file */ - ret = __remove_pkgid_list(); - err_if(ret < 0, "remove[%s] failed\n", FOTA_RESULT_FILE); - - /* get pkgid from orginal pkgmgr db */ - ret = __get_pkgid_list_from_db_and_xml(); - retvm_if(ret < 0, -1, "__get_pkgid_list_from_db_and_xml is failed.\n"); - - //__get_pkginfo_from_opt(); - - ret = __check_tmp_all_preload_rw_pkg_list(); - retvm_if(ret < 0, -1, - "__check_tmp_all_preload_rw_pkg_list is failed.\n"); - - preload_rw_table = g_hash_table_new_full( - g_str_hash, g_str_equal, free, __free_pkginfo); - if (__fill_preload_rw_table(preload_rw_table) < 0) { - ret = __find_preload_rw_pkgid_from_db(preload_rw_table); - retvm_if(ret < 0, -1, "__find_preload_rw_pkgid_from_db is failed\n"); - } - - if (argc == 1) { - ret = __process_ro_fota(preload_rw_table); - if (ret < 0) { - g_hash_table_destroy(preload_rw_table); - _LOGE("__process_ro_fota is failed.\n"); - return EXIT_FAILURE; - } - ret = __process_rw_fota(preload_rw_table); - if (ret < 0) { - g_hash_table_destroy(preload_rw_table); - _LOGE("__process_rw_fota is failed.\n"); - return EXIT_FAILURE; - } - } else { - if (strcmp(argv[1], "-rof") == 0) { - ret = __process_ro_fota(preload_rw_table); - if (ret < 0) { - g_hash_table_destroy(preload_rw_table); - _LOGE("__process_ro_fota is failed.\n"); - return EXIT_FAILURE; - } - } else if (strcmp(argv[1], "-rwf") == 0) { - ret = __process_rw_fota(preload_rw_table); - if (ret < 0) { - g_hash_table_destroy(preload_rw_table); - _LOGE("__process_rw_fota is failed.\n"); - return EXIT_FAILURE; - } - } else { - fprintf(stderr, "not supported operand\n"); - } - } - __make_preload_rw_list(preload_rw_table); - g_hash_table_destroy(preload_rw_table); - __remove_backup_dbs(); - - return EXIT_SUCCESS; -} diff --git a/src/pkg_upgrade/src/backend_invoker.cc b/src/pkg_upgrade/src/backend_invoker.cc new file mode 100644 index 0000000..d5db0f1 --- /dev/null +++ b/src/pkg_upgrade/src/backend_invoker.cc @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + +#include "backend_invoker.hh" +#include "logging.hh" + +namespace common_fota { + +BackendInvoker::BackendInvoker(std::string pkgid, PkgType type, PkgLocation loc, + PkgOperation op, bool removable) { + if (type == PkgType::WGT) { + parameters_.push_back("/usr/bin/wgt-backend"); + } else { + parameters_.push_back("/usr/bin/tpk-backend"); + } + + if (op == PkgOperation::INSTALL || op == PkgOperation::UPDATE) { + parameters_.push_back("-y"); + parameters_.push_back(std::move(pkgid)); + if (loc == PkgLocation::RO) { + parameters_.push_back("--preload"); + parameters_.push_back("--partial-rw"); + } else { + if (!removable) + parameters_.push_back("--no-remove"); + parameters_.push_back("--preload-rw"); + } + parameters_.push_back("--skip-check-reference"); + } else if (op == PkgOperation::UNINSTALL) { + parameters_.push_back("-d"); + parameters_.push_back(std::move(pkgid)); + if (loc == PkgLocation::RO) + parameters_.push_back("--preload"); + parameters_.push_back("--force-remove"); + parameters_.push_back("--partial-rw"); + } else if (op == PkgOperation::UNINSTALL_KEEP_RW_DATA) { + parameters_.push_back("-d"); + parameters_.push_back(std::move(pkgid)); + if (loc == PkgLocation::RO) + parameters_.push_back("--preload"); + parameters_.push_back("--force-remove"); + parameters_.push_back("--keep-rwdata"); + } +} + +int BackendInvoker::Run() const { + const char* param[parameters_.size() + 1] = { nullptr, }; + + int i = 0; + for (auto& str : parameters_) { + param[i++] = str.c_str(); + } + + return XSystem(param); +} + +int BackendInvoker::XSystem(const char *argv[]) { + int status = 0; + pid_t pid; + + std::string cmd; + for (int i = 0; argv[i] != nullptr; i++) { + cmd += argv[i]; + cmd += " "; + } + LOG(DEBUG) << "Cmd: " << cmd; + + pid = fork(); + switch (pid) { + case -1: + LOG(ERROR) << "fork failed "; + return -1; + case 0: + /* child */ + execvp(argv[0], (char *const *)argv); + _exit(-1); + default: + /* parent */ + break; + } + if (waitpid(pid, &status, 0) == -1) { + LOG(ERROR) << "waitpid failed"; + return -1; + } + if (WIFSIGNALED(status)) { + LOG(ERROR) << "signal"; + return -1; + } + if (!WIFEXITED(status)) { + LOG(ERROR) << "should not happen"; + return -1; + } + + return WEXITSTATUS(status); +} + +} // namespace common_fota \ No newline at end of file diff --git a/src/pkg_upgrade/src/file_logbackend.cc b/src/pkg_upgrade/src/file_logbackend.cc new file mode 100644 index 0000000..48c41dd --- /dev/null +++ b/src/pkg_upgrade/src/file_logbackend.cc @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "logging.hh" +#include "file_logbackend.hh" + + +namespace utils { + +FileLogBackend::FileLogBackend(std::string file_name, int rotation_size, + int max_rotation) + : file_name_(std::move(file_name)), rotation_size_(rotation_size), + max_rotation_(max_rotation), log_stream_( + std::unique_ptr(new std::ostringstream())) { +} + + +void FileLogBackend::WriteLog(LogLevel level, const std::string& /* tag */, + const std::string& logstr) { + if (level != LogLevel::LOG_DEBUG) + *log_stream_ << GetTimeStamp() << GetPid() << logstr << std::endl; +} + +void FileLogBackend::WriteLogToFile() { + if (file_name_.empty()) + return; + + int size = GetFileSize(file_name_); + if (size > rotation_size_) + if (!Rotate()) + return; + + std::ofstream ofs(file_name_.c_str(), std::ios::app); + ofs << log_stream_->str(); + ofs.close(); + + // clean the log stream + log_stream_->str(""); + log_stream_->clear(); +} + +bool FileLogBackend::Rotate() { + for (int i = max_rotation_; i > 0; i--) { + std::string old_log = file_name_ + "." + std::to_string(i); + // the oldest log will be removed + if (i == max_rotation_) { + if (std::remove(old_log.c_str()) != 0) + return false; + } else { + std::string new_log = file_name_ + "." + std::to_string(i + 1); + if (std::rename(old_log.c_str(), new_log.c_str()) != 0) + return false; + } + } + std::string new_log = file_name_ + ".1"; + if (std::rename(file_name_.c_str(), new_log.c_str()) != 0) + return false; + + return true; +} + +int FileLogBackend::GetFileSize(const std::string& file_name) { + struct stat sb; + int ret = stat(file_name.c_str(), &sb); + return ret == 0 ? sb.st_size : -1; +} + +std::string FileLogBackend::GetTimeStamp() { + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + + time_t seconds = ts.tv_sec; + struct tm gmt; + if (!gmtime_r(&seconds, &gmt)) + return "|"; + int32_t miliseconds = ts.tv_nsec / 1000000; + + char buf[32]; + strftime(buf, sizeof(buf), "%Y%m%d.%H%M%S", &gmt); + char timestamp[64]; + snprintf(timestamp, sizeof(timestamp), "%s.%03dUTC|", buf, miliseconds); + + return timestamp; +} + +std::string FileLogBackend::GetPid() { + return std::to_string(getpid()) + "|"; +} + +} // namespace utils diff --git a/src/pkg_upgrade/src/logging.cc b/src/pkg_upgrade/src/logging.cc new file mode 100644 index 0000000..6da958c --- /dev/null +++ b/src/pkg_upgrade/src/logging.cc @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "logging.hh" + +namespace utils { + +log_priority LogLevelToPriority(LogLevel level) { + switch (level) { + case LogLevel::LOG_ERROR: + return log_priority::DLOG_ERROR; + case LogLevel::LOG_WARNING: + return log_priority::DLOG_WARN; + case LogLevel::LOG_INFO: + return log_priority::DLOG_INFO; + case LogLevel::LOG_DEBUG: + return log_priority::DLOG_DEBUG; + default: + return log_priority::DLOG_UNKNOWN; + } +} + +} // namespace utils diff --git a/src/pkg_upgrade/src/main.cc b/src/pkg_upgrade/src/main.cc new file mode 100644 index 0000000..9d2eea2 --- /dev/null +++ b/src/pkg_upgrade/src/main.cc @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "pkg_finder.hh" +#include "upgrader.hh" + +int main(int argc, char *argv[]) { + common_fota::PkgFinder finder; + common_fota::Upgrader upgrader; + + if (!upgrader.Process(&finder)) + return -1; + + return 0; +} diff --git a/src/pkg_upgrade/src/pkg_finder.cc b/src/pkg_upgrade/src/pkg_finder.cc new file mode 100644 index 0000000..923378a --- /dev/null +++ b/src/pkg_upgrade/src/pkg_finder.cc @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include +#include + +#include + +#include "logging.hh" +#include "pkg_finder.hh" +#include "backend_invoker.hh" + +#define ASCII(s) reinterpret_cast(s) +#define XMLCHAR(s) reinterpret_cast(s) +#define USR_MANIFEST_DIRECTORY tzplatform_getenv(TZ_SYS_RO_PACKAGES) +#define PRELOAD_RW_LIST_FILE \ + tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ + "pkgmgr/fota/.all_preload_rw_list") +#define ALL_PRELOAD_RW_PKG_LIST "opt/usr/share/.all_preload_rw_list" +#define PKGMGR_FOTA_PATH tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ + "pkgmgr/fota") + + +using namespace std; + +namespace { +constexpr char kOptZipFile[] = "/usr/system/RestoreDir/opt.zip"; +constexpr int kBufSize = 1024; +constexpr char kSeperatorEnd = '"'; +constexpr char kSeperatorMid = ':'; +constexpr char kTokenTypeStr[] = "type="; +constexpr char kTokenPkgidStr[] = "package="; +constexpr char kTokenVersionStr[] = "version="; +constexpr char kTokenRemoveStr[] = "removable="; +} // namespace + +namespace common_fota { + +PkgFinder::PkgFinder() { + xmlInitParser(); + manifest_dir_ = USR_MANIFEST_DIRECTORY; + preload_rw_list_path_ = PRELOAD_RW_LIST_FILE; + if (access(kOptZipFile, F_OK) != 0) + return; + + int ret = UnzipFileOnlyToPath(ALL_PRELOAD_RW_PKG_LIST, PKGMGR_FOTA_PATH); + if (ret != 0) { + LOG(ERROR) << "Failed to unzip file from backup"; + return; + } +} + +PkgFinder::~PkgFinder() { + xmlCleanupParser(); +} + +int PkgFinder::UnzipFileOnlyToPath(const char* dest_path, const char* unzip_to) { + const char* unzip_argv[] = { "/usr/bin/unzip", "-joXqq", + kOptZipFile, dest_path, "-d", unzip_to, nullptr }; + return BackendInvoker::XSystem(unzip_argv); +} + +int PkgFinder::Find() { + if (FindPreloadPkgidFromDb(true) != 0) { + LOG(ERROR) << "FindPreloadPkgidFromDb(true) failed"; + return -1; + } + + if (FindPreloadPkgidFromDb(false) != 0) { + LOG(ERROR) << "FindPreloadPkgidFromDb(false) failed"; + return -1; + } + + if (FindPreloadPkgidFromXml(manifest_dir_) != 0) { + LOG(ERROR) << "FindPreloadPkgidFromXml(" << manifest_dir_ << ") failed"; + return -1; + } + + if (FindPreloadPkgidFromFile() != 0) { + LOG(ERROR) << "FindPreloadPkgidFromFile failed"; + return -1; + } + + return 0; +} + +void PkgFinder::SetManifestDir(std::string dir) { + manifest_dir_ = std::move(dir); +} + +void PkgFinder::SetPreloadRwListPath(std::string path) { + preload_rw_list_path_ = std::move(path); +} + +int PkgFinder::PkgidListCb(const pkgmgrinfo_pkginfo_h handle, void* user_data) { + char* pkgid = nullptr; + int ret = -1; + ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); + if (ret < 0) + return 0; + + char* version = nullptr; + ret = pkgmgrinfo_pkginfo_get_version(handle, &version); + if (ret < 0) + return 0; + + char* type = nullptr; + ret = pkgmgrinfo_pkginfo_get_type(handle, &type); + if (ret < 0) + return 0; + + PkgFinder* finder = static_cast(user_data); + finder->old_pkgs_.emplace_back(pkgid, version, type, finder->read_only_); + return 0; +} + +int PkgFinder::FindPreloadPkgidFromDb(bool read_only) { + int ret = 0; + pkgmgrinfo_pkginfo_filter_h handle = nullptr; + + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret != PMINFO_R_OK) { + LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_create failed " << ret; + return -1; + } + + ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, + PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, 1); + if (ret != PMINFO_R_OK) { + LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_add_bool failed " << ret; + return -1; + } + + ret = pkgmgrinfo_pkginfo_filter_add_bool(handle, + PMINFO_PKGINFO_PROP_PACKAGE_READONLY, read_only ? 1 : 0); + if (ret != PMINFO_R_OK) { + LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_add_bool failed " << ret; + return -1; + } + + read_only_ = read_only; + ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, + PkgidListCb, this); + if (ret != PMINFO_R_OK) { + LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_foreach_pkginfo failed " << ret; + return -1; + } + + ret = pkgmgrinfo_pkginfo_filter_destroy(handle); + if (ret != PMINFO_R_OK) { + LOG(ERROR) << "pkgmgrinfo_pkginfo_filter_destroy failed " << ret; + return -1; + } + + return 0; +} + +int PkgFinder::FindPreloadPkgidFromXml( + const string& xml_directory) { + DIR* dir; + struct dirent* entry = nullptr; + + dir = opendir(xml_directory.c_str()); + if (!dir) { + LOG(ERROR) << "opendir(" << xml_directory << ") failed "; + return -1; + } + + while ((entry = readdir(dir)) != nullptr) { + if (entry->d_name[0] == '.') continue; + + string manifest = GetValidManifest(entry->d_name); + if (manifest.empty()) { + continue; + } + + string buf = xml_directory + "/" + manifest; + string pkgid = FindInfoFromXml(buf, "package"); + string version = FindInfoFromXml(buf, "version"); + + if (version.empty()) + version = "0.0.1"; + + string type = FindInfoFromXml(buf, "type"); + if (type.empty()) + type = "tpk"; + + new_pkgs_.emplace_back(pkgid, version, type, true); + } + + closedir(dir); + + return 0; +} + +string PkgFinder::GetValidManifest(string manifest) { + size_t found = manifest.rfind(".xml"); + if (found == string::npos) + return ""; + + return manifest; +} + +string PkgFinder::FindInfoFromXml(const string& manifest, + const string& find_info) { + const xmlChar* node; + xmlTextReaderPtr reader; + string info_val; + xmlChar* tmp = nullptr; + + reader = xmlReaderForFile(manifest.c_str(), nullptr, 0); + + if (reader) { + if (MoveToChildElement(reader, -1)) { + node = xmlTextReaderConstName(reader); + if (!node) { + LOG(ERROR) << "xmlTextReaderConstName value is NULL"; + goto end; + } + + if (!strcmp(ASCII(node), "manifest")) { + tmp = xmlTextReaderGetAttribute(reader, + XMLCHAR(find_info.c_str())); + if (tmp) { + info_val = ASCII(tmp); + free(tmp); + tmp = nullptr; + } + } else { + LOG(ERROR) << "Manifest Node is not found"; + } + } + } else { + LOG(ERROR) << "xmlReaderForFile value is NULL"; + } + +end: + if (reader) + xmlFreeTextReader(reader); + + return info_val; +} + +int PkgFinder::MoveToChildElement(xmlTextReaderPtr reader, + int depth) { + int ret = xmlTextReaderRead(reader); + int cur = xmlTextReaderDepth(reader); + while (ret == 1) { + switch (xmlTextReaderNodeType(reader)) { + case XML_READER_TYPE_ELEMENT: + if (cur == depth + 1) + return 1; + break; + case XML_READER_TYPE_TEXT: + if (cur == depth + 1) + return 0; + break; + case XML_READER_TYPE_END_ELEMENT: + if (cur == depth) + return 0; + break; + default: + if (cur <= depth) + return 0; + break; + } + + ret = xmlTextReaderRead(reader); + cur = xmlTextReaderDepth(reader); + } + return ret; +} + +int PkgFinder::FindPreloadPkgidFromFile() { + char buf[kBufSize] = {0}; + FILE *fp = nullptr; + + fp = fopen(preload_rw_list_path_.c_str(), "r"); + if (fp == nullptr) { + LOG(INFO) << "no preload rw list file"; + return 0; + } + + while (fgets(buf, kBufSize, fp) != NULL) { + StrTrim(buf); + AddRwPkgInfoFromFile(buf); + } + + fclose(fp); + return 0; +} + +void PkgFinder::AddRwPkgInfoFromFile(const char* info_str) { + if (info_str == nullptr) + return; + + string pkgid = GetToken(info_str, kTokenPkgidStr); + string version = GetToken(info_str, kTokenVersionStr); + string type = GetToken(info_str, kTokenTypeStr); + string removable = GetToken(info_str, kTokenRemoveStr); + + transform(type.begin(), type.end(), type.begin(), + [](unsigned char c) { + return tolower(c); + }); + + transform(removable.begin(), removable.end(), removable.begin(), + [](unsigned char c) { + return tolower(c); + }); + + if (removable == "false") + new_pkgs_.emplace_back(pkgid, version, type, false, false); + else + new_pkgs_.emplace_back(pkgid, version, type, false, true); +} + +string PkgFinder::GetToken(const char* pBuf, const char* pKey) { + const char *p = nullptr; + const char *pStart = nullptr; + const char *pEnd = nullptr; + + p = strstr(pBuf, pKey); + if (p == nullptr) + return ""; + + pStart = p + strlen(pKey); + pEnd = strchr(pStart, kSeperatorEnd); + if (pEnd == nullptr) { + pEnd = strchr(pStart, kSeperatorMid); + if (pEnd == nullptr) + return ""; + } + + size_t len = pEnd - pStart; + if (len <= 0) + return ""; + + string res(pStart, len); + + return res; +} + +void PkgFinder::StrTrim(char *input) { + char *trim_str = input; + + if (input == nullptr) + return; + + while (*input != 0) { + if (!isspace(*input)) { + *trim_str = *input; + trim_str++; + } + input++; + } + + *trim_str = 0; + return; +} + +} // common_fota \ No newline at end of file diff --git a/src/pkg_upgrade/src/pkg_upgrader.cc b/src/pkg_upgrade/src/pkg_upgrader.cc new file mode 100644 index 0000000..2987e93 --- /dev/null +++ b/src/pkg_upgrade/src/pkg_upgrader.cc @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "pkg_upgrader.hh" + +namespace common_fota { + +PkgUpgrader::PkgUpgrader(const PkgContext& context, PkgOperation pkg_op) + : type_(context.GetType()), loc_(context.GetLocation()), op_(pkg_op), + id_(context.GetId()), version_(context.GetVersion()), + backend_(context.GetId(), context.GetType(), context.GetLocation(), + pkg_op, context.IsRemovable()) { +} + +PkgUpgrader::PkgUpgrader(std::string id) + : type_(PkgType::UNKNOWN), loc_(PkgLocation::UNKNOWN), + op_(PkgOperation::COMPLEX), id_(std::move(id)) { +} + +PkgType PkgUpgrader::GetType() const { + return type_; +} + +PkgLocation PkgUpgrader::GetLocation() const { + return loc_; +} + +PkgOperation PkgUpgrader::GetOperation() const { + return op_; +} + +std::string PkgUpgrader::GetId() const { + return id_; +} + +std::string PkgUpgrader::GetVersion() const { + return version_; +} + +const BackendInvoker& PkgUpgrader::GetBackendInvoker() const { + return backend_; +} + +int PkgUpgrader::CompareVersion(const PkgUpgrader& pkg) const { + pkgmgrinfo_version_compare_type compare = PMINFO_VERSION_OLD; + int ret = pkgmgrinfo_compare_package_version(version_.c_str(), + pkg.GetVersion().c_str(), &compare); + if (ret != 0) + return -1; + + if (compare == PMINFO_VERSION_NEW) + return -1; + else if (compare == PMINFO_VERSION_OLD) + return 1; + + return 0; +} + + +} // common_fota \ No newline at end of file diff --git a/src/pkg_upgrade/src/pkg_upgrader_factory.cc b/src/pkg_upgrade/src/pkg_upgrader_factory.cc new file mode 100644 index 0000000..0c8848e --- /dev/null +++ b/src/pkg_upgrade/src/pkg_upgrader_factory.cc @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "logging.hh" +#include "pkg_upgrader_factory.hh" +#include "ro2rw_upgrader.hh" +#include "rw2ro_upgrader.hh" +#include "rw_upgrader.hh" +#include "simple_upgrader.hh" + +using namespace std; + +namespace common_fota { + +list> PkgUpgraderFactory::MakeList(PkgFinder* finder) { + if (finder->Find() != 0) { + LOG(ERROR) << "PkgFinder::Find() failed"; + return {}; + } + return Merge(finder->GetOldPkgs(), finder->GetNewPkgs()); +} + +list> PkgUpgraderFactory::Merge( + const list& old_pkgs, const list& new_pkgs) { + list> pkgs; + + for (auto& new_pkg : new_pkgs) { + const auto* old_pkg = FindPkgById(old_pkgs, new_pkg.GetId()); + if (old_pkg != nullptr) { + // UPDATE + if (old_pkg->IsReadOnly() && new_pkg.IsReadOnly()) { + // RO to RO + pkgs.emplace_back(new SimpleUpgrader(new_pkg, PkgOperation::UPDATE)); + } else if (!old_pkg->IsReadOnly() && !new_pkg.IsReadOnly()) { + // RW to RW + pkgs.emplace_back(new RwUpgrader( + unique_ptr(new SimpleUpgrader(new_pkg, + PkgOperation::UPDATE)))); + } else if (!old_pkg->IsReadOnly() && new_pkg.IsReadOnly()) { + // RW to RO + pkgs.emplace_back(new Rw2RoUpgrader( + unique_ptr(new SimpleUpgrader(*old_pkg, + PkgOperation::UNINSTALL_KEEP_RW_DATA)), + unique_ptr(new SimpleUpgrader(new_pkg, + PkgOperation::INSTALL)) + )); + } else if (old_pkg->IsReadOnly() && !new_pkg.IsReadOnly()) { + // RO to RW + pkgs.emplace_back(new Ro2RwUpgrader( + unique_ptr(new SimpleUpgrader(*old_pkg, + PkgOperation::UNINSTALL_KEEP_RW_DATA)), + unique_ptr(new SimpleUpgrader(new_pkg, + PkgOperation::INSTALL)) + )); + } + } else { + // INSTALL + if (new_pkg.IsReadOnly()) { + // RO + pkgs.emplace_back(new SimpleUpgrader(new_pkg, PkgOperation::INSTALL)); + } else { + // RW + pkgs.emplace_back(new RwUpgrader( + unique_ptr(new SimpleUpgrader(new_pkg, + PkgOperation::INSTALL)))); + } + } + } + + for (auto& old_pkg : old_pkgs) { + const auto* new_pkg = FindPkgById(new_pkgs, old_pkg.GetId()); + if (new_pkg == nullptr) { + // UNINSTALL + if (old_pkg.IsReadOnly()) { + pkgs.emplace_back(new SimpleUpgrader(old_pkg, + PkgOperation::UNINSTALL)); + } + } + } + + return pkgs; +} + +const PkgContext* PkgUpgraderFactory::FindPkgById( + const list& pkgs, string id) { + for (auto& pkg : pkgs) { + if (pkg.GetId() == id) + return &pkg; + } + + return nullptr; +} + +} // common_fota \ No newline at end of file diff --git a/src/pkg_upgrade/src/ro2rw_upgrader.cc b/src/pkg_upgrade/src/ro2rw_upgrader.cc new file mode 100644 index 0000000..192ad67 --- /dev/null +++ b/src/pkg_upgrade/src/ro2rw_upgrader.cc @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "logging.hh" +#include "ro2rw_upgrader.hh" + +namespace { +constexpr char kOptZipFile[] = "/usr/system/RestoreDir/opt.zip"; +} // namespace + +namespace common_fota { + +Ro2RwUpgrader::Ro2RwUpgrader(std::unique_ptr old_pkg, + std::unique_ptr new_pkg) + : PkgUpgrader(new_pkg->GetId()), old_pkg_(std::move(old_pkg)), + new_pkg_(std::move(new_pkg)) { +} + +bool Ro2RwUpgrader::Upgrade() { + if (old_pkg_.get() != nullptr) { + if (!old_pkg_->Upgrade()) { + LOG(ERROR) << "old_pkg_->Upgrade() failed"; + return false; + } + } + + if (UnzipPkgFromZip(new_pkg_->GetId().c_str()) != 0) { + LOG(ERROR) << "UnzipPkgFromZip(" << new_pkg_->GetId() << ") failed"; + return false; + } + + if (new_pkg_.get() != nullptr) { + if (!new_pkg_->Upgrade()) { + LOG(ERROR) << "new_pkg_->Upgrade() failed"; + return false; + } + } + + return true; +} + +int Ro2RwUpgrader::UnzipFiles(const char* dest_path) { + const char* unzip_argv[] = { "/usr/bin/unzip", "-oXqq", kOptZipFile, + dest_path, "-d", "/", nullptr }; + int ret = BackendInvoker::XSystem(unzip_argv); + + return ret; +} + +int Ro2RwUpgrader::UnzipXml(const std::string& pkgid) { + std::string path = "opt/share/packages/" + pkgid + ".xml"; + int ret = UnzipFiles(path.c_str()); + + return ret; +} + +int Ro2RwUpgrader::UnzipData(const std::string& pkgid, const std::string& dest) { + std::string path = dest + pkgid + "/*"; + int ret = UnzipFiles(path.c_str()); + if (ret != 0) + return -1; + + return 0; +} + +int Ro2RwUpgrader::UnzipPkgFromZip(const std::string& pkgid) { + int ret = -1; + + ret = UnzipXml(pkgid); + if (ret != 0) { + LOG(ERROR) << "UnzipXml(" << pkgid << ") failed"; + return ret; + } + + ret = UnzipData(pkgid, "opt/usr/globalapps/"); + if (ret != 0) { + LOG(ERROR) << "UnzipData(" << pkgid << ") failed"; + return ret; + } + + ret = UnzipData(pkgid, "opt/etc/skel/apps_rw/"); + if (ret != 0) { + LOG(ERROR) << "UnzipData(" << pkgid << ") failed"; + return ret; + } + + return 0; +} + +} // common_fota \ No newline at end of file diff --git a/src/pkg_upgrade/src/rw2ro_upgrader.cc b/src/pkg_upgrade/src/rw2ro_upgrader.cc new file mode 100644 index 0000000..b1f200a --- /dev/null +++ b/src/pkg_upgrade/src/rw2ro_upgrader.cc @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "logging.hh" +#include "rw2ro_upgrader.hh" + +namespace common_fota { + +Rw2RoUpgrader::Rw2RoUpgrader(std::unique_ptr old_pkg, + std::unique_ptr new_pkg) + : PkgUpgrader(new_pkg->GetId()), old_pkg_(std::move(old_pkg)), + new_pkg_(std::move(new_pkg)) { +} + +bool Rw2RoUpgrader::Upgrade() { + if (new_pkg_->CompareVersion(*old_pkg_) >= 0) { + if (!old_pkg_->Upgrade()) { + LOG(ERROR) << "old_pkg_->Upgrade() failed"; + return false; + } + + if (!new_pkg_->Upgrade()) { + LOG(ERROR) << "new_pkg_->Upgrade() failed"; + return false; + } + } else { + LOG(DEBUG) << "new_pkg version < old_pkg version"; + } + + return true; +} + +} // common_fota \ No newline at end of file diff --git a/src/pkg_upgrade/src/simple_upgrader.cc b/src/pkg_upgrade/src/simple_upgrader.cc new file mode 100644 index 0000000..5ee0ef2 --- /dev/null +++ b/src/pkg_upgrade/src/simple_upgrader.cc @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "simple_upgrader.hh" + +namespace common_fota { + +SimpleUpgrader::SimpleUpgrader(const PkgContext& context, + PkgOperation pkg_op) + : PkgUpgrader(context, pkg_op) { +} + +bool SimpleUpgrader::Upgrade() { + if (GetBackendInvoker().Run() == 0) + return true; + return false; +} + +} // common_fota \ No newline at end of file diff --git a/src/pkg_upgrade/src/upgrader.cc b/src/pkg_upgrade/src/upgrader.cc new file mode 100644 index 0000000..9e83b98 --- /dev/null +++ b/src/pkg_upgrade/src/upgrader.cc @@ -0,0 +1,387 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "logging.hh" +#include "pkg_upgrader_factory.hh" +#include "upgrader.hh" + +using namespace std; + +namespace { +constexpr char kLogFileName[] = "/var/log/appfw/app-installers/fota.log"; +constexpr int kLogRotationSize = 1024 * 1024; // 1MB +constexpr int kLogMaximumRotation = 3; +constexpr int kBufSize = 1024; +constexpr char kDbLabel[] = "User::Home"; +constexpr char kAppfwUser[] = "app_fw"; + +class File { + public: + File(const string& path) { + fd_ = open(path.c_str(), O_RDONLY); + } + + File(const string& path, int flags, mode_t mode) { + fd_ = open(path.c_str(), flags, mode); + } + + ~File() { + if (fd_ != -1) + close(fd_); + } + + int GetFd() const { + return fd_; + } + + int FStat(struct stat* statbuf) { + return fstat(fd_, statbuf); + } + + int FChOwn(uid_t owner, gid_t group) { + return fchown(fd_, owner, group); + } + + int FChMod(mode_t mode) { + return fchmod(fd_, mode); + } + + int FSync() { + return fsync(fd_); + } + + private: + int fd_ = -1; +}; + +} + +namespace common_fota { + +Upgrader::Upgrader() { + logger_ = shared_ptr(new utils::FileLogBackend( + ::kLogFileName, ::kLogRotationSize, ::kLogMaximumRotation)); + ::utils::LogCore::GetCore().AddLogBackend(logger_); + string path = tzplatform_getenv(TZ_SYS_DB); + SetDbPath(path); +} + +void Upgrader::SetDbPath(const string& path) { + parser_db_ = path + "/.pkgmgr_parser.db"; + parser_db_journal_ = path + "/.pkgmgr_parser.db-journal"; + cert_db_ = path + "/.pkgmgr_cert.db"; + cert_db_journal_ = path + "/.pkgmgr_cert.db-journal"; +} + +bool Upgrader::Process(PkgFinder* finder) { + if (CheckAndRestoreBackupDbs() != 0) { + LOG(ERROR) << "CheckAndRestoreBackupDbs failed"; + return false; + } + + if (MakeBackupDbs() != 0) { + LOG(ERROR) << "MakeBackupDbs failed"; + return false; + } + + PkgUpgraderFactory factory; + auto list = factory.MakeList(finder); + + for(auto& pkg : list) { + if(pkg->Upgrade()) { + LOG(DEBUG) << "upgrade success (" << pkg->GetId() << ")"; + success_list_.push_back(move(pkg)); + } else { + LOG(ERROR) << "upgrade failed (" << pkg->GetId() << ")"; + failure_list_.push_back(move(pkg)); + } + } + + RemoveBackupDbs(); + + logger_->WriteLog(::utils::LogLevel::LOG_INFO, "", "Upgrade Done"); + logger_->WriteLogToFile(); + return true; +} + +const list>& Upgrader::GetSuccessList() const { + return success_list_; +} + +const list>& Upgrader::GetFailureList() const { + return failure_list_; +} + +int Upgrader::CheckAndRestoreBackupDbs() { + if (CheckAndRestoreBackup(parser_db_)) + return -1; + + if (CheckAndRestoreBackup(parser_db_journal_)) + return -1; + + if (CheckAndRestoreBackup(cert_db_)) + return -1; + + if (CheckAndRestoreBackup(cert_db_journal_)) + return -1; + + return 0; +} + +int Upgrader::CheckAndRestoreBackup(const string& origin_path) { + string backup_path = origin_path + ".bck"; + + // if backup flag exists, it means the previous backup process aborted. + if (access(backup_path.c_str(), F_OK) && CheckBackupFlag(origin_path)) + return 0; + + if (access(origin_path.c_str(), F_OK) == 0) { + if (remove(origin_path.c_str())) { + LOG(ERROR) << "cannot remove path(" << origin_path << " : " << errno; + return -1; + } + } + + if (rename(backup_path.c_str(), origin_path.c_str())) { + LOG(ERROR) << "fail to rename " << backup_path << " to " << + origin_path << errno; + return -1; + } + + return 0; +} + +int Upgrader::SetDbPermission(const string& path) { + struct stat sb; + struct passwd pwd; + struct passwd *result; + char buf[kBufSize]; + + int ret = getpwnam_r(kAppfwUser, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + LOG(ERROR) << "getpwnam_r failed: " << errno; + return -1; + } + uid_t uid = pwd.pw_uid; + + ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + LOG(ERROR) << "getpwuid_r failed: " << errno; + return -1; + } + + ::File file(path); + + if (file.GetFd() == -1) { + LOG(ERROR) << "open(" << path << "failed: " << errno; + return -1; + } + + ret = file.FStat(&sb); + if (ret == -1) { + LOG(ERROR) << "stat " << path << "failed: " << errno; + return -1; + } + if (S_ISLNK(sb.st_mode)) { + LOG(ERROR) << path << " is symlink!"; + return -1; + } + ret = file.FChOwn(uid, pwd.pw_gid); + if (ret == -1) { + LOG(ERROR) << "fchown " << path << " failed: " << errno; + return -1; + } + + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; + if (path.find(cert_db_) != string::npos) + mode |= S_IWOTH; + ret = file.FChMod(mode); + if (ret == -1) { + LOG(ERROR) << "fchmod " << path << " failed: " << errno; + return -1; + } + file.FSync(); + if (smack_setlabel(path.c_str(), kDbLabel, SMACK_LABEL_ACCESS)) + LOG(ERROR) << "failed chsmack -a " << kDbLabel << " " << path; + + return 0; +} + +int Upgrader::CreateBackupFlag(const string& path) { + string flag = path + ".bck.flag"; + + ::File file(flag, O_CREAT | O_WRONLY, 0644); + if (file.GetFd() == -1) { + LOG(ERROR) << "failed to create flag file " << flag << ", " << errno; + return -1; + } + + return 0; +} + +int Upgrader::CheckBackupFlag(const string& path) { + string flag = path + ".bck.flag"; + + if (access(flag.c_str(), F_OK) != 0) + return -1; + + return 0; +} + +int Upgrader::RemoveBackupFlag(const string& path) { + string flag = path + ".bck.flag"; + + if (remove(flag.c_str())) { + LOG(ERROR) << "cannot remove flag file(" << flag << ") " << errno; + return -1; + } + + return 0; +} + +int Upgrader::BackupFile(const string& src_path, const string& dest_path) { + char temp_buf[8192] = {'\0', }; + size_t size_of_char = sizeof(char); + size_t size_of_temp_buf = sizeof(temp_buf); + + if (access(src_path.c_str(), F_OK) != 0) { + LOG(ERROR) << "File(" << src_path << ") is not exist"; + return -1; + } + + // if backup flag exists, it means the previous backup process aborted. + if (CheckBackupFlag(src_path)) { + if (access(dest_path.c_str(), F_OK) == 0) { + if (remove(dest_path.c_str())) { + LOG(ERROR) << "Failed to remove uncompleted backup file " << + dest_path << " : " << errno; + return -1; + } + } + } else { + if (CreateBackupFlag(src_path)) { + LOG(ERROR) << "failed to create backup flag"; + return -1; + } + } + + FILE* src = fopen(src_path.c_str(), "r"); + unique_ptr src_auto(src, fclose); + if (src == nullptr) { + LOG(ERROR) << "Failed to open : " << src_path; + return -1; + } + + FILE* dest = fopen(dest_path.c_str(), "w"); + unique_ptr dest_auto(dest, fclose); + if (dest == nullptr) { + LOG(ERROR) << "Failed to open : " << dest_path; + return -1; + } + + while (!feof(src)) { + int rc = fread(temp_buf, size_of_char, size_of_temp_buf, src); + fwrite(temp_buf, size_of_char, rc, dest); + } + + fsync(fileno(dest)); + RemoveBackupFlag(src_path); + + return 0; +} + +int Upgrader::BackupDb(const string& src_path, const string& dest_path) { + if (BackupFile(src_path, dest_path) != 0) + return -1; + + if (SetDbPermission(dest_path) != 0) + return -1; + + return 0; +} + +int Upgrader::MakeBackupDbs() { + string parser_db_bck = parser_db_ + ".bck"; + string parser_db_journal_bck = parser_db_journal_ + ".bck"; + string cert_db_bck = cert_db_ + ".bck"; + string cert_db_journal_bck = cert_db_journal_ + ".bck"; + + if (BackupDb(parser_db_, parser_db_bck) == -1 ) { + LOG(ERROR) << "Fail to backup [" << parser_db_ << "] to [" << parser_db_bck << + "]"; + goto CATCH; + } + + if (BackupDb(parser_db_journal_, parser_db_journal_bck) == -1) { + LOG(ERROR) << "Fail to backup [" << parser_db_journal_ << "] to [" << + parser_db_journal_bck << "]"; + goto CATCH; + } + + if (BackupDb(cert_db_, cert_db_bck) == -1) { + LOG(ERROR) << "Fail to backup [" << cert_db_ << "] to [" << + cert_db_bck << "]"; + goto CATCH; + } + + if (BackupDb(cert_db_journal_, cert_db_journal_bck) == -1) { + LOG(ERROR) << "Fail to backup [" << cert_db_journal_ << "] to [" << + cert_db_journal_bck << "]"; + goto CATCH; + } + + return 0; + +CATCH: + remove(parser_db_bck.c_str()); + remove(parser_db_journal_bck.c_str()); + remove(cert_db_bck.c_str()); + remove(cert_db_journal_bck.c_str()); + + return -1; +} + +void Upgrader::RemoveBackupPath(const string& origin_path) { + string backup_path = origin_path + ".bck"; + + if (remove(origin_path.c_str())) + LOG(ERROR) << "cannot remove backup file(" << backup_path << ") " << errno; +} + +void Upgrader::RemoveBackupDbs() { + RemoveBackupPath(parser_db_); + RemoveBackupPath(parser_db_journal_); + RemoveBackupPath(cert_db_); + RemoveBackupPath(cert_db_journal_); +} + +} // common_fota diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..c90fac8 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1 @@ +ADD_SUBDIRECTORY(unit_tests) diff --git a/tests/mock/mock_hook.h b/tests/mock/mock_hook.h new file mode 100644 index 0000000..79831d7 --- /dev/null +++ b/tests/mock/mock_hook.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MOCK_MOCK_HOOK_H_ +#define MOCK_MOCK_HOOK_H_ + +#define MOCK_HOOK_P0(MOCK_CLASS, f) \ + TestFixture::GetMock().f() +#define MOCK_HOOK_P1(MOCK_CLASS, f, p1) \ + TestFixture::GetMock().f(p1) +#define MOCK_HOOK_P2(MOCK_CLASS, f, p1, p2) \ + TestFixture::GetMock().f(p1, p2) +#define MOCK_HOOK_P3(MOCK_CLASS, f, p1, p2, p3) \ + TestFixture::GetMock().f(p1, p2, p3) +#define MOCK_HOOK_P4(MOCK_CLASS, f, p1, p2, p3, p4) \ + TestFixture::GetMock().f(p1, p2, p3, p4) +#define MOCK_HOOK_P5(MOCK_CLASS, f, p1, p2, p3, p4, p5) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5) +#define MOCK_HOOK_P6(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5, p6) +#define MOCK_HOOK_P7(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5, p6, p7) +#define MOCK_HOOK_P8(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7, p8) \ + TestFixture::GetMock().f(p1, p2, p3, p4, p5, p6, p7, p8) +#define MOCK_HOOK_P10(MOCK_CLASS, f, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) \ + TestFixture::GetMock().f( \ + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) + +#endif // MOCK_MOCK_HOOK_H_ diff --git a/tests/mock/module_mock.h b/tests/mock/module_mock.h new file mode 100644 index 0000000..0934014 --- /dev/null +++ b/tests/mock/module_mock.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MOCK_MODULE_MOCK_H_ +#define MOCK_MODULE_MOCK_H_ + +class ModuleMock { + public: + virtual ~ModuleMock() {} +}; + +#endif // MOCK_MODULE_MOCK_H_ diff --git a/tests/mock/os_mock.cc b/tests/mock/os_mock.cc new file mode 100644 index 0000000..009f4ed --- /dev/null +++ b/tests/mock/os_mock.cc @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "os_mock.h" +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" pid_t fork(void) { + return MOCK_HOOK_P0(OsMock, fork); +} + +extern "C" pid_t waitpid(pid_t pid, int *status, int options) { + return MOCK_HOOK_P3(OsMock, waitpid, pid, status, options); +} + +extern "C" int fchown(int fd, uid_t owner, gid_t group) { + return MOCK_HOOK_P3(OsMock, fchown, fd, owner, group); +} + +extern "C" int fchmod(int fd, mode_t mode) { + return MOCK_HOOK_P2(OsMock, fchmod, fd, mode); +} + +extern "C" int smack_setlabel(const char *path, const char* label, + enum smack_label_type type) { + return MOCK_HOOK_P3(OsMock, smack_setlabel, path, label, type); +} \ No newline at end of file diff --git a/tests/mock/os_mock.h b/tests/mock/os_mock.h new file mode 100644 index 0000000..64970b3 --- /dev/null +++ b/tests/mock/os_mock.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MOCK_OS_MOCK_H_ +#define MOCK_OS_MOCK_H_ + +#include +#include +#include +#include + +#include "module_mock.h" + +class OsMock : public virtual ModuleMock { + public: + virtual ~OsMock() {} + + MOCK_METHOD0(fork, pid_t()); + MOCK_METHOD3(waitpid, pid_t(pid_t, int*, int)); + MOCK_METHOD3(fchown, int(int, uid_t, gid_t)); + MOCK_METHOD2(fchmod, int(int, mode_t)); + MOCK_METHOD3(smack_setlabel, int(const char*, const char*, smack_label_type)); +}; + +#endif // MOCK_OS_MOCK_H_ diff --git a/tests/mock/pkgmgr_info_mock.cc b/tests/mock/pkgmgr_info_mock.cc new file mode 100644 index 0000000..2e0896b --- /dev/null +++ b/tests/mock/pkgmgr_info_mock.cc @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "pkgmgr_info_mock.h" +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" int pkgmgrinfo_pkginfo_filter_create( + pkgmgrinfo_pkginfo_filter_h *handle) { + return MOCK_HOOK_P1(PkgMgrInfoMock, pkgmgrinfo_pkginfo_filter_create, handle); +} + +extern "C" int pkgmgrinfo_pkginfo_filter_destroy( + pkgmgrinfo_pkginfo_filter_h handle) { + return MOCK_HOOK_P1(PkgMgrInfoMock, pkgmgrinfo_pkginfo_filter_destroy, + handle); +} + +extern "C" int pkgmgrinfo_pkginfo_filter_add_bool( + pkgmgrinfo_pkginfo_filter_h handle, + const char *property, const bool value) { + return MOCK_HOOK_P3(PkgMgrInfoMock, pkgmgrinfo_pkginfo_filter_add_bool, + handle, property, value); +} + +extern "C" int pkgmgrinfo_pkginfo_filter_foreach_pkginfo( + pkgmgrinfo_pkginfo_filter_h handle, + pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) { + return MOCK_HOOK_P3(PkgMgrInfoMock, pkgmgrinfo_pkginfo_filter_foreach_pkginfo, + handle, pkg_cb, user_data); +} + +extern "C" int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, + char **pkgid) { + return MOCK_HOOK_P2(PkgMgrInfoMock, pkgmgrinfo_pkginfo_get_pkgid, + handle, pkgid); +} + +extern "C" int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, + char **type) { + return MOCK_HOOK_P2(PkgMgrInfoMock, pkgmgrinfo_pkginfo_get_type, + handle, type); +} + +extern "C" int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, + char **version) { + return MOCK_HOOK_P2(PkgMgrInfoMock, pkgmgrinfo_pkginfo_get_version, + handle, version); +} \ No newline at end of file diff --git a/tests/mock/pkgmgr_info_mock.h b/tests/mock/pkgmgr_info_mock.h new file mode 100644 index 0000000..2c4e47b --- /dev/null +++ b/tests/mock/pkgmgr_info_mock.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MOCK_PKGMGR_INFO_MOCK_H_ +#define MOCK_PKGMGR_INFO_MOCK_H_ + +#include +#include +#include + +#include "module_mock.h" + +class PkgMgrInfoMock : public virtual ModuleMock { + public: + virtual ~PkgMgrInfoMock() {} + + MOCK_METHOD1(pkgmgrinfo_pkginfo_filter_create, + int(pkgmgrinfo_pkginfo_filter_h*)); + MOCK_METHOD1(pkgmgrinfo_pkginfo_filter_destroy, + int(pkgmgrinfo_pkginfo_filter_h)); + MOCK_METHOD3(pkgmgrinfo_pkginfo_filter_add_bool, + int(pkgmgrinfo_pkginfo_filter_h, const char*, const bool)); + MOCK_METHOD3(pkgmgrinfo_pkginfo_filter_foreach_pkginfo, + int(pkgmgrinfo_pkginfo_filter_h, pkgmgrinfo_pkg_list_cb, void*)); + MOCK_METHOD2(pkgmgrinfo_pkginfo_get_pkgid, int(pkgmgrinfo_pkginfo_h, char**)); + MOCK_METHOD2(pkgmgrinfo_pkginfo_get_type, int(pkgmgrinfo_pkginfo_h, char**)); + MOCK_METHOD2(pkgmgrinfo_pkginfo_get_version, int(pkgmgrinfo_pkginfo_h, char**)); +}; + +#endif // MOCK_PKGMGR_INFO_MOCK_H_ diff --git a/tests/mock/test_fixture.cc b/tests/mock/test_fixture.cc new file mode 100644 index 0000000..27f5666 --- /dev/null +++ b/tests/mock/test_fixture.cc @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "test_fixture.h" + +#include + +std::unique_ptr TestFixture::mock_; diff --git a/tests/mock/test_fixture.h b/tests/mock/test_fixture.h new file mode 100644 index 0000000..db223f1 --- /dev/null +++ b/tests/mock/test_fixture.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MOCK_TEST_FIXTURE_H_ +#define MOCK_TEST_FIXTURE_H_ + +#include + +#include +#include +#include +#include + +#include "module_mock.h" + +class TestFixture : public ::testing::Test { + public: + explicit TestFixture(std::unique_ptr&& mock) { + mock_ = std::move(mock); + } + virtual ~TestFixture() { + mock_.reset(); + } + + virtual void SetUp() {} + virtual void TearDown() {} + + template + static T& GetMock() { + auto ptr = dynamic_cast(mock_.get()); + if (!ptr) + throw std::invalid_argument("The test does not provide mock of \"" + + std::string(typeid(T).name()) + "\""); + return *ptr; + } + + static std::unique_ptr mock_; +}; + +#endif // MOCK_TEST_FIXTURE_H_ diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt new file mode 100644 index 0000000..b946e29 --- /dev/null +++ b/tests/unit_tests/CMakeLists.txt @@ -0,0 +1,45 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +PROJECT(pkgmgr-tool_unittests C CXX) + +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(pkgmgr-tool_unittests REQUIRED + dlog + gmock + pkgmgr-parser + pkgmgr-info + libtzplatform-config + libsmack +) + +FOREACH(flag ${pkgmgr-tool_unittests_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Werror -fPIE") + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -std=c++14") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_CXX_FLAGS_RELEASE "-O2") + +ADD_DEFINITIONS("-DDB_PATH=\"${DB_PATH}\"") + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../src/pkg_upgrade/include) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../mock) + +AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SOURCES) +AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../../src/pkg_upgrade/src LIB_SOURCES) +LIST(REMOVE_ITEM LIB_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../../src/pkg_upgrade/src/main.cc) +AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../mock MOCK_SOURCES) + +ADD_EXECUTABLE(${PROJECT_NAME} + ${SOURCES} + ${MOCK_SOURCES} + ${LIB_SOURCES} +) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${EXTRA_CFLAGS}") +TARGET_LINK_LIBRARIES(${PROJECT_NAME} + ${pkgmgr-tool_unittests_LDFLAGS} +) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION /usr/bin/) +INSTALL(DIRECTORY data/ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/data) \ No newline at end of file diff --git a/tests/unit_tests/data/db/.pkgmgr_cert.db b/tests/unit_tests/data/db/.pkgmgr_cert.db new file mode 100644 index 0000000000000000000000000000000000000000..86d5ef2cb61cacf6383a6387057781c7add6bf16 GIT binary patch literal 53248 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 literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db/.pkgmgr_parser.db b/tests/unit_tests/data/db/.pkgmgr_parser.db new file mode 100644 index 0000000000000000000000000000000000000000..95bb9645727b8d87cf3d214fd9e0feb9f342dea8 GIT binary patch literal 602112 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 z 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 baVDiG*0peitU@v0J0>L<4s~gv5Gno(N_Z(> literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db/.pkgmgr_parser.db-journal b/tests/unit_tests/data/db/.pkgmgr_parser.db-journal new file mode 100644 index 0000000000000000000000000000000000000000..b20e4d319df8fdaaf482ee098b2108a5c47e9a33 GIT binary patch literal 119528 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 literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db_bck/.pkgmgr_cert.db b/tests/unit_tests/data/db_bck/.pkgmgr_cert.db new file mode 100644 index 0000000000000000000000000000000000000000..86d5ef2cb61cacf6383a6387057781c7add6bf16 GIT binary patch literal 53248 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 literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db_bck/.pkgmgr_cert.db-journal.bck b/tests/unit_tests/data/db_bck/.pkgmgr_cert.db-journal.bck new file mode 100644 index 0000000000000000000000000000000000000000..a79929d72ae22096ab51e4fa9b515e3107b7ab1f GIT binary patch literal 49760 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 literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db_bck/.pkgmgr_cert.db.bck b/tests/unit_tests/data/db_bck/.pkgmgr_cert.db.bck new file mode 100644 index 0000000000000000000000000000000000000000..86d5ef2cb61cacf6383a6387057781c7add6bf16 GIT binary patch literal 53248 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 z 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 baVDiG*0peitU@v0J0>L<4s~gv5Gno(N_Z(> literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db_bck/.pkgmgr_parser.db-journal b/tests/unit_tests/data/db_bck/.pkgmgr_parser.db-journal new file mode 100644 index 0000000000000000000000000000000000000000..b20e4d319df8fdaaf482ee098b2108a5c47e9a33 GIT binary patch literal 119528 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 literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db_bck/.pkgmgr_parser.db-journal.bck b/tests/unit_tests/data/db_bck/.pkgmgr_parser.db-journal.bck new file mode 100644 index 0000000000000000000000000000000000000000..b20e4d319df8fdaaf482ee098b2108a5c47e9a33 GIT binary patch literal 119528 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 literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/db_bck/.pkgmgr_parser.db.bck b/tests/unit_tests/data/db_bck/.pkgmgr_parser.db.bck new file mode 100644 index 0000000000000000000000000000000000000000..95bb9645727b8d87cf3d214fd9e0feb9f342dea8 GIT binary patch literal 602112 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 z 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 baVDiG*0peitU@v0J0>L<4s~gv5Gno(N_Z(> literal 0 HcmV?d00001 diff --git a/tests/unit_tests/data/packages/org.tizen.alarm.xml b/tests/unit_tests/data/packages/org.tizen.alarm.xml new file mode 100644 index 0000000..39e4cad --- /dev/null +++ b/tests/unit_tests/data/packages/org.tizen.alarm.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.tizen.alarm.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.tizen.alarm.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.tizen.alarm.png + + + http://tizen.org/privilege/haptic + http://tizen.org/privilege/datasharing + http://tizen.org/privilege/display + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/alarm.get + http://tizen.org/privilege/alarm.set + + + + org.tizen.alarm.png + + + + + org.tizen.alarm.png + 2x2 + + diff --git a/tests/unit_tests/data/packages/org.tizen.app-selector.xml b/tests/unit_tests/data/packages/org.tizen.app-selector.xml new file mode 100644 index 0000000..314cff5 --- /dev/null +++ b/tests/unit_tests/data/packages/org.tizen.app-selector.xml @@ -0,0 +1,13 @@ + + + + Application Selection Popup + + + + + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/mediastorage + http://tizen.org/privilege/externalstorage + + diff --git a/tests/unit_tests/data/packages/org.tizen.bluetooth.xml b/tests/unit_tests/data/packages/org.tizen.bluetooth.xml new file mode 100644 index 0000000..b3f618e --- /dev/null +++ b/tests/unit_tests/data/packages/org.tizen.bluetooth.xml @@ -0,0 +1,20 @@ + + + + Insung Cho + W bluetooth + + + + + + + + + + + + http://tizen.org/privilege/bluetooth + http://tizen.org/privilege/bluetooth.admin + + diff --git a/tests/unit_tests/data/rw/list.txt b/tests/unit_tests/data/rw/list.txt new file mode 100644 index 0000000..eaba1da --- /dev/null +++ b/tests/unit_tests/data/rw/list.txt @@ -0,0 +1,2 @@ +"package=org.tizen.new_rw":"version=1.2.0":"type=tpk":"removable=false" +"package=org.test.pkg2":"version=1.2.0":"type=wgt":"removable=true" diff --git a/tests/unit_tests/src/test_main.cc b/tests/unit_tests/src/test_main.cc new file mode 100644 index 0000000..c2eb730 --- /dev/null +++ b/tests/unit_tests/src/test_main.cc @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +int main(int argc, char** argv) { + int ret = -1; + + try { + testing::InitGoogleTest(&argc, argv); + } catch(...) { + std::cout << "Exception occurred" << std::endl; + } + + try { + ret = RUN_ALL_TESTS(); + } catch (const ::testing::internal::GoogleTestFailureException& e) { + ret = -1; + std::cout << "GoogleTestFailureException was thrown:" << e.what() << std::endl; + } + + return ret; +} diff --git a/tests/unit_tests/src/test_pkg_upgrader.cc b/tests/unit_tests/src/test_pkg_upgrader.cc new file mode 100644 index 0000000..1a13125 --- /dev/null +++ b/tests/unit_tests/src/test_pkg_upgrader.cc @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include + +#include "pkgmgr_info_mock.h" +#include "os_mock.h" +#include "test_fixture.h" +#include "pkg_finder.hh" +#include "pkg_upgrader_factory.hh" +#include "upgrader.hh" + +using ::testing::_; +using ::testing::DoAll; +using ::testing::Invoke; +using ::testing::Return; +using ::testing::SetArgPointee; +using ::testing::InvokeArgument; +using ::testing::SaveArg; + +using namespace common_fota; + +class Mocks : public ::testing::NiceMock, + public ::testing::NiceMock {}; + +class PkgFinderTest : public TestFixture { + public: + PkgFinderTest() : TestFixture(std::make_unique()) {} + virtual ~PkgFinderTest() {} + + virtual void SetUp() { + static int k; + pkgmgrinfo_pkginfo_filter_h dummy_filter = (pkgmgrinfo_pkginfo_filter_h)&k; + + EXPECT_CALL(GetMock(), pkgmgrinfo_pkginfo_filter_create(_)) + .WillRepeatedly(DoAll(SetArgPointee<0>(dummy_filter), Return(0))); + EXPECT_CALL(GetMock(), + pkgmgrinfo_pkginfo_filter_add_bool(_, _, _)) + .WillRepeatedly(Return(0)); + + EXPECT_CALL(GetMock(), + pkgmgrinfo_pkginfo_filter_foreach_pkginfo(_, _, _)) + .WillOnce( + Invoke([](pkgmgrinfo_pkginfo_filter_h handle, + pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) -> int { + pkg_cb(nullptr, user_data); + pkg_cb(nullptr, user_data); + pkg_cb(nullptr, user_data); + return 0; + }) + ) + .WillOnce(Invoke([](pkgmgrinfo_pkginfo_filter_h handle, + pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) -> int { + pkg_cb(nullptr, user_data); + return 0; + })); + + const char* old_ro_pkgid[] = { + "org.test.pkg1", + "org.test.pkg2", + "org.tizen.app-selector" + }; + + const char* old_ro_pkg_type[] = { + "tpk", + "wgt", + "tpk" + }; + + const char* old_ro_pkg_version[] = { + "1.0.0", + "1.2.0", + "0.1.0" + }; + + const char* old_rw_pkgid[] = { + "org.tizen.alarm" + }; + + const char* old_rw_pkg_type[] = { + "tpk" + }; + + const char* old_rw_pkg_version[] = { + "1.5.0", + }; + + EXPECT_CALL(GetMock(), + pkgmgrinfo_pkginfo_get_pkgid(_,_)) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkgid[0])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkgid[1])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkgid[2])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_rw_pkgid[0])), Return(0))); + EXPECT_CALL(GetMock(), + pkgmgrinfo_pkginfo_get_type(_,_)) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_type[0])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_type[1])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_type[2])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_rw_pkg_type[0])), Return(0))); + EXPECT_CALL(GetMock(), + pkgmgrinfo_pkginfo_get_version(_,_)) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_version[0])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_version[1])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_version[2])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_rw_pkg_version[0])), Return(0))); + + EXPECT_CALL(GetMock(), pkgmgrinfo_pkginfo_filter_destroy(_)) + .WillRepeatedly(Return(0)); + + finder_.SetManifestDir("./tests/unit_tests/data/packages/"); + finder_.SetPreloadRwListPath("./tests/unit_tests/data/rw/list.txt"); + } + + virtual void TearDown() { + } + + PkgFinder finder_; +}; + +TEST_F(PkgFinderTest, PkgFinder) { + finder_.Find(); + + EXPECT_EQ(finder_.GetOldPkgs().size(), 4); + EXPECT_EQ(finder_.GetNewPkgs().size(), 5); +} + +TEST_F(PkgFinderTest, PkgUpgraderFactory) { + PkgUpgraderFactory factory; + auto list = factory.MakeList(&finder_); + + EXPECT_EQ(list.size(), 6); +} + +class PkgUpgraderTest : public PkgFinderTest { + public: + PkgUpgraderTest() {} + virtual ~PkgUpgraderTest() {} + + void SetUp() override { + PkgFinderTest::SetUp(); + EXPECT_CALL(GetMock(), fork()) + .WillRepeatedly(Return(1)); + EXPECT_CALL(GetMock(), waitpid(_, _, _)) + .WillRepeatedly(DoAll(SetArgPointee<1>(0), Return(1))); + EXPECT_CALL(GetMock(), fchown(_, _, _)) + .WillRepeatedly(Return(0)); + EXPECT_CALL(GetMock(), fchmod(_, _)) + .WillRepeatedly(Return(0)); + EXPECT_CALL(GetMock(), smack_setlabel(_, _, _)) + .WillRepeatedly(Return(0)); + } + + void TearDown() override { + PkgFinderTest::TearDown(); + } +}; + +TEST_F(PkgUpgraderTest, Upgrader) { + Upgrader upgrader; + + upgrader.SetDbPath("./tests/unit_tests/data/db"); + ASSERT_TRUE(upgrader.Process(&finder_)); + + const auto& success = upgrader.GetSuccessList(); + const auto& failure = upgrader.GetFailureList(); + + EXPECT_EQ(success.size(), 6); + EXPECT_EQ(failure.size(), 0); +} + +TEST_F(PkgUpgraderTest, Upgrader_db_bck) { + Upgrader upgrader; + + upgrader.SetDbPath("./tests/unit_tests/data/db_bck"); + EXPECT_TRUE(upgrader.Process(&finder_)); +} + +class PkgUpgraderTestForInvalidDbPath : public TestFixture { + public: + PkgUpgraderTestForInvalidDbPath() : TestFixture(std::make_unique()) {} + virtual ~PkgUpgraderTestForInvalidDbPath() {} + + virtual void SetUp() { + finder_.SetManifestDir("./tests/unit_tests/data/packages/"); + finder_.SetPreloadRwListPath("./tests/unit_tests/data/rw/list.txt"); + } + + virtual void TearDown() { + } + + PkgFinder finder_; +}; + +TEST_F(PkgUpgraderTestForInvalidDbPath, Upgrader_invalid_db) { + Upgrader upgrader; + + upgrader.SetDbPath("./tests/unit_tests/data/invalid_path"); + EXPECT_FALSE(upgrader.Process(&finder_)); +} -- 2.7.4 From 05888a28148f8e3e44775a16f10ed1cda23e12ce Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 23 Nov 2020 16:42:42 +0900 Subject: [PATCH 13/16] Release version 0.7.0 Changes: - Refactor pkg_upgrade tool Change-Id: I537bff49e7fe418e27b56aee98c9325e89d1eaaf Signed-off-by: Junghyun Yeon --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index a5677cf..c189e1c 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.6.7 +Version: 0.7.0 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From 297266783f4ce92f874451194a1248b3ae715cd3 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 23 Nov 2020 18:59:52 +0900 Subject: [PATCH 14/16] Fix minor coding rules Change-Id: Icd145f54daa5c8790369ec66845cf4270b100a0c Signed-off-by: Junghyun Yeon --- src/pkg_upgrade/src/backend_invoker.cc | 2 +- src/pkg_upgrade/src/pkg_finder.cc | 15 ++++++----- src/pkg_upgrade/src/pkg_upgrader.cc | 2 +- src/pkg_upgrade/src/pkg_upgrader_factory.cc | 8 +++--- src/pkg_upgrade/src/ro2rw_upgrader.cc | 5 ++-- src/pkg_upgrade/src/rw2ro_upgrader.cc | 2 +- src/pkg_upgrade/src/simple_upgrader.cc | 2 +- src/pkg_upgrade/src/upgrader.cc | 14 +++++----- tests/mock/mock_hook.h | 6 ++--- tests/mock/module_mock.h | 6 ++--- tests/mock/os_mock.cc | 2 +- tests/mock/os_mock.h | 6 ++--- tests/mock/pkgmgr_info_mock.cc | 2 +- tests/mock/pkgmgr_info_mock.h | 12 +++++---- tests/mock/test_fixture.h | 6 ++--- tests/unit_tests/src/test_main.cc | 3 ++- tests/unit_tests/src/test_pkg_upgrader.cc | 42 ++++++++++++++++++----------- 17 files changed, 75 insertions(+), 60 deletions(-) diff --git a/src/pkg_upgrade/src/backend_invoker.cc b/src/pkg_upgrade/src/backend_invoker.cc index d5db0f1..e5b6ea9 100644 --- a/src/pkg_upgrade/src/backend_invoker.cc +++ b/src/pkg_upgrade/src/backend_invoker.cc @@ -114,4 +114,4 @@ int BackendInvoker::XSystem(const char *argv[]) { return WEXITSTATUS(status); } -} // namespace common_fota \ No newline at end of file +} // namespace common_fota diff --git a/src/pkg_upgrade/src/pkg_finder.cc b/src/pkg_upgrade/src/pkg_finder.cc index 923378a..eded528 100644 --- a/src/pkg_upgrade/src/pkg_finder.cc +++ b/src/pkg_upgrade/src/pkg_finder.cc @@ -14,23 +14,23 @@ * limitations under the License. */ +#include "pkg_finder.hh" + #include #include #include -#include +#include +#include #include #include -#include - #include "logging.hh" -#include "pkg_finder.hh" #include "backend_invoker.hh" #define ASCII(s) reinterpret_cast(s) #define XMLCHAR(s) reinterpret_cast(s) -#define USR_MANIFEST_DIRECTORY tzplatform_getenv(TZ_SYS_RO_PACKAGES) +#define USR_MANIFEST_DIRECTORY tzplatform_getenv(TZ_SYS_RO_PACKAGES) #define PRELOAD_RW_LIST_FILE \ tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ "pkgmgr/fota/.all_preload_rw_list") @@ -72,7 +72,8 @@ PkgFinder::~PkgFinder() { xmlCleanupParser(); } -int PkgFinder::UnzipFileOnlyToPath(const char* dest_path, const char* unzip_to) { +int PkgFinder::UnzipFileOnlyToPath(const char* dest_path, + const char* unzip_to) { const char* unzip_argv[] = { "/usr/bin/unzip", "-joXqq", kOptZipFile, dest_path, "-d", unzip_to, nullptr }; return BackendInvoker::XSystem(unzip_argv); @@ -377,4 +378,4 @@ void PkgFinder::StrTrim(char *input) { return; } -} // common_fota \ No newline at end of file +} // namespace common_fota diff --git a/src/pkg_upgrade/src/pkg_upgrader.cc b/src/pkg_upgrade/src/pkg_upgrader.cc index 2987e93..f2216c8 100644 --- a/src/pkg_upgrade/src/pkg_upgrader.cc +++ b/src/pkg_upgrade/src/pkg_upgrader.cc @@ -72,4 +72,4 @@ int PkgUpgrader::CompareVersion(const PkgUpgrader& pkg) const { } -} // common_fota \ No newline at end of file +} // namespace common_fota diff --git a/src/pkg_upgrade/src/pkg_upgrader_factory.cc b/src/pkg_upgrade/src/pkg_upgrader_factory.cc index 0c8848e..baabfb6 100644 --- a/src/pkg_upgrade/src/pkg_upgrader_factory.cc +++ b/src/pkg_upgrade/src/pkg_upgrader_factory.cc @@ -55,16 +55,14 @@ list> PkgUpgraderFactory::Merge( unique_ptr(new SimpleUpgrader(*old_pkg, PkgOperation::UNINSTALL_KEEP_RW_DATA)), unique_ptr(new SimpleUpgrader(new_pkg, - PkgOperation::INSTALL)) - )); + PkgOperation::INSTALL)))); } else if (old_pkg->IsReadOnly() && !new_pkg.IsReadOnly()) { // RO to RW pkgs.emplace_back(new Ro2RwUpgrader( unique_ptr(new SimpleUpgrader(*old_pkg, PkgOperation::UNINSTALL_KEEP_RW_DATA)), unique_ptr(new SimpleUpgrader(new_pkg, - PkgOperation::INSTALL)) - )); + PkgOperation::INSTALL)))); } } else { // INSTALL @@ -104,4 +102,4 @@ const PkgContext* PkgUpgraderFactory::FindPkgById( return nullptr; } -} // common_fota \ No newline at end of file +} // namespace common_fota diff --git a/src/pkg_upgrade/src/ro2rw_upgrader.cc b/src/pkg_upgrade/src/ro2rw_upgrader.cc index 192ad67..4f36cf8 100644 --- a/src/pkg_upgrade/src/ro2rw_upgrader.cc +++ b/src/pkg_upgrade/src/ro2rw_upgrader.cc @@ -67,7 +67,8 @@ int Ro2RwUpgrader::UnzipXml(const std::string& pkgid) { return ret; } -int Ro2RwUpgrader::UnzipData(const std::string& pkgid, const std::string& dest) { +int Ro2RwUpgrader::UnzipData(const std::string& pkgid, + const std::string& dest) { std::string path = dest + pkgid + "/*"; int ret = UnzipFiles(path.c_str()); if (ret != 0) @@ -100,4 +101,4 @@ int Ro2RwUpgrader::UnzipPkgFromZip(const std::string& pkgid) { return 0; } -} // common_fota \ No newline at end of file +} // namespace common_fota diff --git a/src/pkg_upgrade/src/rw2ro_upgrader.cc b/src/pkg_upgrade/src/rw2ro_upgrader.cc index b1f200a..51fde37 100644 --- a/src/pkg_upgrade/src/rw2ro_upgrader.cc +++ b/src/pkg_upgrade/src/rw2ro_upgrader.cc @@ -43,4 +43,4 @@ bool Rw2RoUpgrader::Upgrade() { return true; } -} // common_fota \ No newline at end of file +} // namespace common_fota diff --git a/src/pkg_upgrade/src/simple_upgrader.cc b/src/pkg_upgrade/src/simple_upgrader.cc index 5ee0ef2..60285d3 100644 --- a/src/pkg_upgrade/src/simple_upgrader.cc +++ b/src/pkg_upgrade/src/simple_upgrader.cc @@ -29,4 +29,4 @@ bool SimpleUpgrader::Upgrade() { return false; } -} // common_fota \ No newline at end of file +} // namespace common_fota diff --git a/src/pkg_upgrade/src/upgrader.cc b/src/pkg_upgrade/src/upgrader.cc index 9e83b98..acbe832 100644 --- a/src/pkg_upgrade/src/upgrader.cc +++ b/src/pkg_upgrade/src/upgrader.cc @@ -83,7 +83,7 @@ class File { int fd_ = -1; }; -} +} // namespace namespace common_fota { @@ -116,8 +116,8 @@ bool Upgrader::Process(PkgFinder* finder) { PkgUpgraderFactory factory; auto list = factory.MakeList(finder); - for(auto& pkg : list) { - if(pkg->Upgrade()) { + for (auto& pkg : list) { + if (pkg->Upgrade()) { LOG(DEBUG) << "upgrade success (" << pkg->GetId() << ")"; success_list_.push_back(move(pkg)); } else { @@ -335,9 +335,9 @@ int Upgrader::MakeBackupDbs() { string cert_db_bck = cert_db_ + ".bck"; string cert_db_journal_bck = cert_db_journal_ + ".bck"; - if (BackupDb(parser_db_, parser_db_bck) == -1 ) { - LOG(ERROR) << "Fail to backup [" << parser_db_ << "] to [" << parser_db_bck << - "]"; + if (BackupDb(parser_db_, parser_db_bck) == -1) { + LOG(ERROR) << "Fail to backup [" << parser_db_ << + "] to [" << parser_db_bck << "]"; goto CATCH; } @@ -384,4 +384,4 @@ void Upgrader::RemoveBackupDbs() { RemoveBackupPath(cert_db_journal_); } -} // common_fota +} // namespace common_fota diff --git a/tests/mock/mock_hook.h b/tests/mock/mock_hook.h index 79831d7..843f77d 100644 --- a/tests/mock/mock_hook.h +++ b/tests/mock/mock_hook.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef MOCK_MOCK_HOOK_H_ -#define MOCK_MOCK_HOOK_H_ +#ifndef TESTS_MOCK_MOCK_HOOK_H_ +#define TESTS_MOCK_MOCK_HOOK_H_ #define MOCK_HOOK_P0(MOCK_CLASS, f) \ TestFixture::GetMock().f() @@ -39,4 +39,4 @@ TestFixture::GetMock().f( \ p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) -#endif // MOCK_MOCK_HOOK_H_ +#endif // TESTS_MOCK_MOCK_HOOK_H_ diff --git a/tests/mock/module_mock.h b/tests/mock/module_mock.h index 0934014..ba72d76 100644 --- a/tests/mock/module_mock.h +++ b/tests/mock/module_mock.h @@ -14,12 +14,12 @@ * limitations under the License. */ -#ifndef MOCK_MODULE_MOCK_H_ -#define MOCK_MODULE_MOCK_H_ +#ifndef TESTS_MOCK_MODULE_MOCK_H_ +#define TESTS_MOCK_MODULE_MOCK_H_ class ModuleMock { public: virtual ~ModuleMock() {} }; -#endif // MOCK_MODULE_MOCK_H_ +#endif // TESTS_MOCK_MODULE_MOCK_H_ diff --git a/tests/mock/os_mock.cc b/tests/mock/os_mock.cc index 009f4ed..4596274 100644 --- a/tests/mock/os_mock.cc +++ b/tests/mock/os_mock.cc @@ -37,4 +37,4 @@ extern "C" int fchmod(int fd, mode_t mode) { extern "C" int smack_setlabel(const char *path, const char* label, enum smack_label_type type) { return MOCK_HOOK_P3(OsMock, smack_setlabel, path, label, type); -} \ No newline at end of file +} diff --git a/tests/mock/os_mock.h b/tests/mock/os_mock.h index 64970b3..865213c 100644 --- a/tests/mock/os_mock.h +++ b/tests/mock/os_mock.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef MOCK_OS_MOCK_H_ -#define MOCK_OS_MOCK_H_ +#ifndef TESTS_MOCK_OS_MOCK_H_ +#define TESTS_MOCK_OS_MOCK_H_ #include #include @@ -35,4 +35,4 @@ class OsMock : public virtual ModuleMock { MOCK_METHOD3(smack_setlabel, int(const char*, const char*, smack_label_type)); }; -#endif // MOCK_OS_MOCK_H_ +#endif // TESTS_MOCK_OS_MOCK_H_ diff --git a/tests/mock/pkgmgr_info_mock.cc b/tests/mock/pkgmgr_info_mock.cc index 2e0896b..3ed9a7a 100644 --- a/tests/mock/pkgmgr_info_mock.cc +++ b/tests/mock/pkgmgr_info_mock.cc @@ -59,4 +59,4 @@ extern "C" int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version) { return MOCK_HOOK_P2(PkgMgrInfoMock, pkgmgrinfo_pkginfo_get_version, handle, version); -} \ No newline at end of file +} diff --git a/tests/mock/pkgmgr_info_mock.h b/tests/mock/pkgmgr_info_mock.h index 2c4e47b..64f145e 100644 --- a/tests/mock/pkgmgr_info_mock.h +++ b/tests/mock/pkgmgr_info_mock.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef MOCK_PKGMGR_INFO_MOCK_H_ -#define MOCK_PKGMGR_INFO_MOCK_H_ +#ifndef TESTS_MOCK_PKGMGR_INFO_MOCK_H_ +#define TESTS_MOCK_PKGMGR_INFO_MOCK_H_ #include #include @@ -35,9 +35,11 @@ class PkgMgrInfoMock : public virtual ModuleMock { int(pkgmgrinfo_pkginfo_filter_h, const char*, const bool)); MOCK_METHOD3(pkgmgrinfo_pkginfo_filter_foreach_pkginfo, int(pkgmgrinfo_pkginfo_filter_h, pkgmgrinfo_pkg_list_cb, void*)); - MOCK_METHOD2(pkgmgrinfo_pkginfo_get_pkgid, int(pkgmgrinfo_pkginfo_h, char**)); + MOCK_METHOD2(pkgmgrinfo_pkginfo_get_pkgid, + int(pkgmgrinfo_pkginfo_h, char**)); MOCK_METHOD2(pkgmgrinfo_pkginfo_get_type, int(pkgmgrinfo_pkginfo_h, char**)); - MOCK_METHOD2(pkgmgrinfo_pkginfo_get_version, int(pkgmgrinfo_pkginfo_h, char**)); + MOCK_METHOD2(pkgmgrinfo_pkginfo_get_version, + int(pkgmgrinfo_pkginfo_h, char**)); }; -#endif // MOCK_PKGMGR_INFO_MOCK_H_ +#endif // TESTS_MOCK_PKGMGR_INFO_MOCK_H_ diff --git a/tests/mock/test_fixture.h b/tests/mock/test_fixture.h index db223f1..106f6a7 100644 --- a/tests/mock/test_fixture.h +++ b/tests/mock/test_fixture.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef MOCK_TEST_FIXTURE_H_ -#define MOCK_TEST_FIXTURE_H_ +#ifndef TESTS_MOCK_TEST_FIXTURE_H_ +#define TESTS_MOCK_TEST_FIXTURE_H_ #include @@ -50,4 +50,4 @@ class TestFixture : public ::testing::Test { static std::unique_ptr mock_; }; -#endif // MOCK_TEST_FIXTURE_H_ +#endif // TESTS_MOCK_TEST_FIXTURE_H_ diff --git a/tests/unit_tests/src/test_main.cc b/tests/unit_tests/src/test_main.cc index c2eb730..5a9f91d 100644 --- a/tests/unit_tests/src/test_main.cc +++ b/tests/unit_tests/src/test_main.cc @@ -30,7 +30,8 @@ int main(int argc, char** argv) { ret = RUN_ALL_TESTS(); } catch (const ::testing::internal::GoogleTestFailureException& e) { ret = -1; - std::cout << "GoogleTestFailureException was thrown:" << e.what() << std::endl; + std::cout << "GoogleTestFailureException was thrown:" + << e.what() << std::endl; } return ret; diff --git a/tests/unit_tests/src/test_pkg_upgrader.cc b/tests/unit_tests/src/test_pkg_upgrader.cc index 1a13125..43f40c3 100644 --- a/tests/unit_tests/src/test_pkg_upgrader.cc +++ b/tests/unit_tests/src/test_pkg_upgrader.cc @@ -103,23 +103,35 @@ class PkgFinderTest : public TestFixture { }; EXPECT_CALL(GetMock(), - pkgmgrinfo_pkginfo_get_pkgid(_,_)) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkgid[0])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkgid[1])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkgid[2])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_rw_pkgid[0])), Return(0))); + pkgmgrinfo_pkginfo_get_pkgid(_, _)) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkgid[0])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkgid[1])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkgid[2])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_rw_pkgid[0])), Return(0))); EXPECT_CALL(GetMock(), - pkgmgrinfo_pkginfo_get_type(_,_)) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_type[0])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_type[1])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_type[2])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_rw_pkg_type[0])), Return(0))); + pkgmgrinfo_pkginfo_get_type(_, _)) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkg_type[0])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkg_type[1])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkg_type[2])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_rw_pkg_type[0])), Return(0))); EXPECT_CALL(GetMock(), - pkgmgrinfo_pkginfo_get_version(_,_)) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_version[0])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_version[1])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_ro_pkg_version[2])), Return(0))) - .WillOnce(DoAll(SetArgPointee<1>(const_cast(old_rw_pkg_version[0])), Return(0))); + pkgmgrinfo_pkginfo_get_version(_, _)) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkg_version[0])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkg_version[1])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_ro_pkg_version[2])), Return(0))) + .WillOnce(DoAll(SetArgPointee<1>( + const_cast(old_rw_pkg_version[0])), Return(0))); EXPECT_CALL(GetMock(), pkgmgrinfo_pkginfo_filter_destroy(_)) .WillRepeatedly(Return(0)); -- 2.7.4 From 16c32c5e715e084ee62201373cbc6a777347647b Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Fri, 27 Nov 2020 15:14:32 +0900 Subject: [PATCH 15/16] Add compiler, linker flags for c++ tools Change-Id: Iee455a1b331c18b856dedea45e60a8954ee11a9e Signed-off-by: Junghyun Yeon --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c0181bb..30c4b41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,9 +41,12 @@ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wl,-zdefs -pie" ) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall -Werror") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Werror -ffunction-sections -fdata-sections -fmerge-all-constants -fPIE") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE") SET(CMAKE_C_FLAGS_RELEASE "-O2 -fPIE") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed,--gc-sections -pie") + ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(tests) -- 2.7.4 From dfdcbc219ce29d6ba7fc0adc33d84a557ad22e73 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Tue, 1 Dec 2020 09:18:43 +0900 Subject: [PATCH 16/16] Release version 0.7.1 Changes: - Fix minor coding rules - Add compiler, linker flags for c++ tools Change-Id: Idd89b044f47dfd49e52687e1165eabfa1891cee5 Signed-off-by: Junghyun Yeon --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index c189e1c..c535a37 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.7.0 +Version: 0.7.1 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4