Use argos_watchdog 57/87957/9
authorKyungwook Tak <k.tak@samsung.com>
Fri, 23 Sep 2016 05:55:26 +0000 (14:55 +0900)
committerKyungwook Tak <k.tak@samsung.com>
Fri, 23 Sep 2016 06:43:50 +0000 (15:43 +0900)
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>
CMakeLists.txt
packaging/key-manager.spec
src/CMakeLists.txt
src/manager/service/glib-logic.cpp
src/manager/service/glib-logic.h
systemd/central-key-manager.service.in

index d15650f..1ade756 100644 (file)
@@ -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")
index b6af62a..c6089de 100644 (file)
@@ -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}
 
index 4851987..6168961 100644 (file)
@@ -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)
 
index 471ce8c..b64cb14 100644 (file)
 #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");
index 7cadbfe..feba079 100644 (file)
@@ -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,
index c03c723..201bcb9 100644 (file)
@@ -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