summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyungwook Tak <k.tak@samsung.com>2016-09-23 14:55:26 +0900
committerKyungwook Tak <k.tak@samsung.com>2016-09-23 15:43:50 +0900
commit6ec381a3d133c278b6a33c104c195bbe9375570f (patch)
tree88e36a0f10dd1b13e2ffa60ff3777911f8046ac4
parente6a9ed48e9b66a72a94ea9ca8a7e1f8833368a09 (diff)
downloadkey-manager-6ec381a3d133c278b6a33c104c195bbe9375570f.tar.gz
key-manager-6ec381a3d133c278b6a33c104c195bbe9375570f.tar.bz2
key-manager-6ec381a3d133c278b6a33c104c195bbe9375570f.zip
Use argos_watchdog
argos watchdog is watchdog lib which has systemd backend on platform and backend can be reimplemented by product developer argos watchdog provides per-process watchdog registration (systemd allows per-thread but it's not guaranteed by other backends for now) This feature is on discussion with multiple product divisions so it would be easily enabled/disabled by build feature in compile time Change-Id: Idb28caa52f3d20a2e0030c84852ad101fdbb6623 Signed-off-by: Kyungwook Tak <k.tak@samsung.com>
-rw-r--r--CMakeLists.txt8
-rw-r--r--packaging/key-manager.spec17
-rw-r--r--src/CMakeLists.txt7
-rw-r--r--src/manager/service/glib-logic.cpp34
-rw-r--r--src/manager/service/glib-logic.h4
-rw-r--r--systemd/central-key-manager.service.in1
6 files changed, 68 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d15650f3..1ade7565 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -67,6 +67,14 @@ ADD_DEFINITIONS("-DCA_CERTS_DIR=\"${CA_CERTS_DIR}\"")
ADD_DEFINITIONS("-DSYSTEMD_ENV_FILE=\"${SYSTEMD_ENV_FILE}\"")
ADD_DEFINITIONS("-DUPGRADE_DATA_DIR=\"${UPGRADE_DATA_DIR}\"")
+IF (DEFINED WATCHDOG_ENABLED)
+ MESSAGE("WATCHDOG ENABELD!")
+ ADD_DEFINITIONS("-DWATCHDOG_ENABLED")
+ ADD_DEFINITIONS("-DWATCHDOG_TIMEOUT_SEC=${WATCHDOG_TIMEOUT_SEC}")
+ ADD_DEFINITIONS("-DWATCHDOG_NOTIFY_SEC=${WATCHDOG_NOTIFY_SEC}")
+ SET(WATCHDOG_DECLARE "NotifyAccess=main")
+ENDIF (DEFINED WATCHDOG_ENABLED)
+
IF (CMAKE_BUILD_TYPE MATCHES "DEBUG")
ADD_DEFINITIONS("-DTIZEN_DEBUG_ENABLE")
ADD_DEFINITIONS("-DBUILD_TYPE_DEBUG")
diff --git a/packaging/key-manager.spec b/packaging/key-manager.spec
index b6af62a8..c6089ded 100644
--- a/packaging/key-manager.spec
+++ b/packaging/key-manager.spec
@@ -1,3 +1,7 @@
+%global watchdog_enabled 1
+%global watchdog_timeout_sec 60
+%global watchdog_notify_sec 20
+
Name: key-manager
Summary: Central Key Manager and utilities
Version: 0.1.23
@@ -25,6 +29,9 @@ BuildRequires: pkgconfig(cynara-creds-socket)
BuildRequires: pkgconfig(libtzplatform-config)
BuildRequires: pkgconfig(glib-2.0)
BuildRequires: pkgconfig(pkgmgr)
+%if 0%{?watchdog_enabled}
+BuildRequires: pkgconfig(argos_watchdog)
+%endif
BuildRequires: boost-devel
BuildRequires: ca-certificates-devel
#Requires(pre): tizen-platform-config-tools
@@ -124,7 +131,6 @@ cp -a %{SOURCE1004} .
export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
%endif
-
export LDFLAGS+="-Wl,--rpath=%{_libdir},-Bsymbolic-functions "
%cmake . -DVERSION=%{version} \
@@ -147,8 +153,13 @@ export LDFLAGS+="-Wl,--rpath=%{_libdir},-Bsymbolic-functions "
-DINITIAL_VALUES_DIR=%{initial_values_dir} \
-DDB_TEST_DIR=%{db_test_dir} \
-DCA_CERTS_DIR=%{ca_certs_dir} \
- -DUPGRADE_SCRIPT_DIR=%{upgrade_script_dir} \
- -DUPGRADE_DATA_DIR=%{upgrade_data_dir}
+%if 0%{?watchdog_enabled}
+ -DWATCHDOG_ENABLED=%{watchdog_enabled} \
+ -DWATCHDOG_TIMEOUT_SEC=%{watchdog_timeout_sec} \
+ -DWATCHDOG_NOTIFY_SEC=%{watchdog_notify_sec} \
+%endif
+ -DUPGRADE_DATA_DIR=%{upgrade_data_dir} \
+ -DUPGRADE_SCRIPT_DIR=%{upgrade_script_dir}
make %{?jobs:-j%jobs}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4851987a..6168961b 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,3 +1,9 @@
+IF (DEFINED WATCHDOG_ENABLED)
+SET(EXTRA_KM_DEPS argos_watchdog)
+ELSE (DEFINED WATCHDOG_ENABLED)
+SET(EXTRA_KM_DEPS)
+ENDIF (DEFINED WATCHDOG_ENABLED)
+
PKG_CHECK_MODULES(KEY_MANAGER_DEP
REQUIRED
dlog
@@ -13,6 +19,7 @@ PKG_CHECK_MODULES(KEY_MANAGER_DEP
cynara-client-async
cynara-creds-socket
pkgmgr
+ ${EXTRA_KM_DEPS}
)
FIND_PACKAGE(Threads REQUIRED)
diff --git a/src/manager/service/glib-logic.cpp b/src/manager/service/glib-logic.cpp
index 471ce8ce..b64cb14e 100644
--- a/src/manager/service/glib-logic.cpp
+++ b/src/manager/service/glib-logic.cpp
@@ -31,6 +31,10 @@
#include <dpl/log/log.h>
#include <glib-logic.h>
+#ifdef WATCHDOG_ENABLED
+#include <argos.h>
+#endif
+
namespace {
struct PkgmgrEvent {
PkgmgrEvent(uid_t _uid, const char *_pkgid)
@@ -98,11 +102,41 @@ void GLIBLogic::LoopStart()
return;
}
+#ifdef WATCHDOG_ENABLED
+ int ret = aw_register(WATCHDOG_TIMEOUT_SEC);
+ if (ret != 0) {
+ LogError("Failed to aw_register. ret(errno): " << ret);
+ } else {
+ LogInfo("aw_register success! watchdog registered.");
+ if (g_timeout_add_seconds(WATCHDOG_NOTIFY_SEC, watchdogMsgSender, nullptr) <= 0) {
+ LogError("Failed to add source for watchdog notify timer. "
+ "let's disable registered watchdog.");
+
+ ret = aw_control(AW_OP_DISABLE, nullptr);
+ if (ret != 0)
+ LogError("Failed to disable registerd watchdog...");
+ }
+ }
+#endif
+
LogDebug("Starting g_main_loop");
g_main_loop_run(m_gMainLoop);
LogDebug("...g_main_loop ended");
}
+#ifdef WATCHDOG_ENABLED
+gboolean GLIBLogic::watchdogMsgSender(gpointer /*data*/)
+{
+ int ret = aw_notify();
+ if (ret != 0)
+ LogError("Failed to aw_notify. ret(errno): " << ret);
+ else
+ LogInfo("aw_notify success!");
+
+ return TRUE;
+}
+#endif
+
void GLIBLogic::LoopStop()
{
LogDebug("Closing g_main_loop");
diff --git a/src/manager/service/glib-logic.h b/src/manager/service/glib-logic.h
index 7cadbfeb..feba079c 100644
--- a/src/manager/service/glib-logic.h
+++ b/src/manager/service/glib-logic.h
@@ -51,6 +51,10 @@ protected:
const void *pmsg,
void *data);
+#ifdef WATCHDOG_ENABLED
+ static gboolean watchdogMsgSender(gpointer data);
+#endif
+
int packageEventCallback(
uid_t uid,
int reqid,
diff --git a/systemd/central-key-manager.service.in b/systemd/central-key-manager.service.in
index c03c723f..201bcb98 100644
--- a/systemd/central-key-manager.service.in
+++ b/systemd/central-key-manager.service.in
@@ -14,6 +14,7 @@ Sockets=central-key-manager-api-ocsp.socket
Sockets=central-key-manager-api-encryption.socket
EnvironmentFile=-@SYSTEMD_ENV_FILE@
RuntimeDirectory=@SERVICE_NAME@
+@WATCHDOG_DECLARE@
[Install]
WantedBy=multi-user.target