Add pkg db recovery tool 90/119590/6
authorJunghyun Yeon <jungh.yeon@samsung.com>
Fri, 17 Mar 2017 12:03:58 +0000 (21:03 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Fri, 17 Mar 2017 14:28:59 +0000 (23:28 +0900)
- In case of db corruption due to unknown reason,
restoration of db is needed.
- This service will be executed after boot-up and
check integrity check of pkg parser and cert db

Change-Id: I30a56b8a2464f07608d534572c77656ce1029f38
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
CMakeLists.txt
packaging/pkgmgr-info.spec
tool/CMakeLists.txt [new file with mode: 0644]
tool/pkg-db-recovery.c [new file with mode: 0644]
tool/pkg-db-recovery.service [new file with mode: 0644]

index e9b7cdb..3cfdce9 100644 (file)
@@ -36,6 +36,7 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
 
 ################## ## build comm libraries
 ADD_SUBDIRECTORY(parser)
+ADD_SUBDIRECTORY(tool)
 
 ## build pkgmgr-info library
 AUX_SOURCE_DIRECTORY(src SRCS)
index 6fc9784..d6da9b9 100644 (file)
@@ -51,13 +51,17 @@ MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
 %cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER} \
                -DTIZEN_MAJOR_VER=%{tizen_version_major} \
                -DTIZEN_MINOR_VER=%{tizen_version_minor} \
-               -DTIZEN_PATCH_VER=%{tizen_version_patch}
+               -DTIZEN_PATCH_VER=%{tizen_version_patch} \
+               -DUNITDIR=%{_unitdir}
 
 %__make %{?jobs:-j%jobs}
 
 %install
 %make_install
 
+mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants
+ln -sf ../pkg-db-recovery.service %{buildroot}%{_unitdir}/multi-user.target.wants/pkg-db-recovery.service
+
 mkdir -p %{buildroot}/usr/share/license
 cp LICENSE %{buildroot}/usr/share/license/%{name}
 cp LICENSE %{buildroot}/usr/share/license/%{name}-parser
@@ -76,6 +80,9 @@ cp LICENSE %{buildroot}/usr/share/license/%{name}-parser
 %defattr(-,root,root,-)
 %{_libdir}/libpkgmgr-info.so.*
 /usr/share/license/%{name}
+%{_bindir}/pkg-db-recovery
+%{_unitdir}/pkg-db-recovery.service
+%{_unitdir}/multi-user.target.wants/pkg-db-recovery.service
 
 %files devel
 %manifest %{name}.manifest
diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7207860
--- /dev/null
@@ -0,0 +1,27 @@
+### Description
+# Recovery tool for pkg db corruption
+# By Junghyun Yeon <jungh.yeon@samsung.com>
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
+
+### Get required CFLAGS, LDFLAGS from pkg-config
+SET(PKG_DB_RECOVERY pkg-db-recovery)
+include(FindPkgConfig)
+pkg_check_modules(TOOL_DEPS REQUIRED sqlite3 libtzplatform-config)
+
+FOREACH(FLAG ${TOOL_DEPS_CFLAGS})
+       SET(${CMAKE_C_FLAGS} "${CMAKE_C_FLAGS} ${FLAG}")
+ENDFOREACH()
+
+## Additional flag
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -fPIE")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+
+### Build
+ADD_EXECUTABLE(${PKG_DB_RECOVERY} ${CMAKE_CURRENT_SOURCE_DIR}/${PKG_DB_RECOVERY}.c)
+TARGET_LINK_LIBRARIES(${PKG_DB_RECOVERY} ${TOOL_DEPS_LDFLAGS} "-pie")
+
+## Install
+INSTALL(TARGETS ${PKG_DB_RECOVERY} DESTINATION bin)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PKG_DB_RECOVERY}.service DESTINATION ${UNITDIR})
diff --git a/tool/pkg-db-recovery.c b/tool/pkg-db-recovery.c
new file mode 100644 (file)
index 0000000..715d48a
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Junghyun Yeon <jungh.yeon@samsung.com>,
+ * Jongmyeong Ko <jongmyeong.ko@samsung.com>, Sangyoon Jang <s89.jang@samsung.com>
+ *
+ * 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 <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <sqlite3.h>
+#include <tzplatform_config.h>
+
+#define REGULAR_USER 5000
+#define MAX_QUERY_LEN  4096
+
+#define PKGMGR_PARSER_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db")
+#define PKGMGR_CERT_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db")
+
+static int __rollback_db(sqlite3 *db, const char *table_name)
+{
+       static const char rollback_query_raw[] =
+                       "SELECT COUNT(*) FROM %s WHERE 1=0";
+       int ret;
+       sqlite3_stmt *stmt = NULL;
+       char query[MAX_QUERY_LEN] = { '\0' };
+
+       sqlite3_snprintf(MAX_QUERY_LEN, query, rollback_query_raw, table_name);
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (ret != SQLITE_OK) {
+               printf("Failed to recover db : %s\n", sqlite3_errmsg(db));
+               return -1;
+       }
+       sqlite3_finalize(stmt);
+       return 0;
+}
+
+static int __check_and_rollback_db(const char *db_path, const char *table_name)
+{
+       int ret = -1;
+       sqlite3 *db;
+
+       ret = sqlite3_open_v2(db_path, &db,
+                       SQLITE_OPEN_READWRITE, NULL);
+       if (ret != SQLITE_OK) {
+               printf("Failed to open db\n");
+               return -1;
+       }
+
+       ret = __rollback_db(db, table_name);
+       if (ret != 0)
+               printf("Failed to rollback db\n");
+
+       sqlite3_close(db);
+       return ret;
+}
+
+static void _check_db()
+{
+       int ret;
+
+       ret = __check_and_rollback_db(PKGMGR_PARSER_DB_FILE, "package_info");
+       if (ret != 0)
+               printf("Failed to check and rollback parser db\n");
+
+       ret = __check_and_rollback_db(PKGMGR_CERT_DB_FILE, "package_cert_info");
+       if (ret != 0)
+               printf("Failed to check and rollback cert db\n");
+}
+
+
+int main(int argc, char *argv[])
+{
+       if ((int)getuid() > REGULAR_USER) {
+               printf("This cmd is not allowed for regular user\n");
+               return -1;
+       }
+
+       _check_db();
+
+       return 0;
+}
diff --git a/tool/pkg-db-recovery.service b/tool/pkg-db-recovery.service
new file mode 100644 (file)
index 0000000..ab0d87b
--- /dev/null
@@ -0,0 +1,16 @@
+[Unit]
+Description=Package DB Recovery Service
+DefaultDependencies=false
+Requires=tizen-system-env.service
+After=tizen-system-env.service
+Before=ac.service
+
+[Service]
+User=app_fw
+Group=app_fw
+SmackProcessLabel=System
+ExecStart=/usr/bin/pkg-db-recovery
+
+[Install]
+WantedBy=multi-user.target
+