applied dbus auto activation
authorsaerome.kim <saerome.kim@samsung.com>
Thu, 21 Feb 2019 11:40:58 +0000 (20:40 +0900)
committer김새롬/Tizen Platform Lab(SR)/Staff Engineer/삼성전자 <saerome.kim@samsung.com>
Fri, 22 Feb 2019 00:41:36 +0000 (09:41 +0900)
- implement dbus auto activation by sdding '/net/uamd/enabler'
interface. Currentl, multi-client is not considered.
- disable VD_REQ to avoid guild error.

Signed-off-by: saerome.kim <saerome.kim@samsung.com>
include/ua-api.h
packaging/net.uamd.service [new file with mode: 0644]
packaging/ua-manager.conf
packaging/ua-manager.service
packaging/ua-manager.spec
ua-api/include/ua-request-sender.h
ua-api/src/ua-api.c
ua-api/src/ua-request-sender.c [changed mode: 0644->0755]
ua-daemon/src/ua-manager-main.c
ua-daemon/src/ua-manager-request-handler.c
ua-plugins/CMakeLists.txt

index 9a8dc04..2a0f1db 100644 (file)
@@ -73,6 +73,7 @@ typedef enum {
 #define FOREACH_ERROR(ERROR) \
        ERROR(UAM_ERROR_NONE, TIZEN_ERROR_NONE) \
        ERROR(UAM_ERROR_INVALID_PARAM, TIZEN_ERROR_INVALID_PARAMETER) \
+       ERROR(UAM_ERROR_PERMISSION_DENIED,TIZEN_ERROR_PERMISSION_DENIED) \
        ERROR(UAM_ERROR_TIMEOUT, TIZEN_ERROR_TIMED_OUT) \
        ERROR(UAM_ERROR_NOW_IN_PROGRESS, TIZEN_ERROR_NOW_IN_PROGRESS) \
        ERROR(UAM_ERROR_NOT_SUPPORTED, TIZEN_ERROR_NOT_SUPPORTED) \
diff --git a/packaging/net.uamd.service b/packaging/net.uamd.service
new file mode 100644 (file)
index 0000000..246cce1
--- /dev/null
@@ -0,0 +1,7 @@
+[D-BUS Service]
+Name=net.uamd.enabler
+
+Exec=/bin/false
+User=network_fw
+Group=network_fw
+SystemdService=ua-manager.service
index d318174..5dea756 100644 (file)
@@ -2,11 +2,23 @@
  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
 
 <busconfig>
-        <policy user="network_fw">
-                <allow own="net.uamd"/>
-        </policy>
+    <policy user="root">
+            <allow own="net.uamd"/>
+                       <allow own="net.uamd.enabler"/>
+                       <allow send_destination="net.uamd"/>
+                       <allow send_destination="net.uamd.enabler"/>
+                       <allow receive_sender="net.uamd"/>
+    </policy>
+    <policy user="network_fw">
+            <allow own="net.uamd"/>
+                       <allow own="net.uamd.enabler"/>
+                       <allow send_destination="net.uamd"/>
+                       <allow send_destination="net.uamd.enabler"/>
+                       <allow receive_sender="net.uamd"/>
+    </policy>
        <policy context="default">
                <deny own="net.uamd"/>
+               <deny own="net.uamd.enabler"/>
                <allow send_destination="net.uamd"/>
        </policy>
 </busconfig>
index ac2a29b..ee5ed23 100644 (file)
@@ -1,18 +1,14 @@
 [Unit]
 Description=User Awareness Frwk Manager
-After=dbus.socket dbus.service
 Requires=dbus.socket
+After=dbus.socket
 
 [Service]
-SmackProcessLabel=System
 Type=dbus
-BusName=net.uamd
 User=network_fw
 Group=network_fw
+BusName=net.uamd.enabler
+SmackProcessLabel=System
+ExecStart=/usr/bin/ua-manager
 Capabilities=cap_net_admin,cap_net_raw,cap_sys_rawio=eip
 SecureBits=keep-caps
-ExecStart=/usr/bin/ua-manager
-KillMode=process
-
-[Install]
-WantedBy=multi-user.target
index c5414aa..fc61351 100644 (file)
@@ -4,6 +4,9 @@ Version:    0.0.1
 Release:    1
 License:    Apache-2.0
 Source0:    %{name}-%{version}.tar.gz
+Source1:       ua-manager.conf
+Source2:       net.uamd.service
+Source3:       ua-manager.service
 Source1001: ua-manager.manifest
 
 %define database_full_path /opt/usr/dbspace/.ua-manager-data.db
@@ -17,11 +20,8 @@ BuildRequires:  pkgconfig(gio-unix-2.0)
 BuildRequires:  pkgconfig(libtzplatform-config)
 BuildRequires:  pkgconfig(sqlite3)
 BuildRequires:  pkgconfig(json-c)
-
-%if 0%{?vd_req:1}
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(deviced)
-%endif
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 
@@ -45,6 +45,9 @@ This package contains User Awareness plugin interfaces.
 
 %prep
 %setup -q
+cp -a %{SOURCE1} .
+cp -a %{SOURCE2} .
+cp -a %{SOURCE3} .
 cp %{SOURCE1001} .
 
 %build
@@ -72,12 +75,12 @@ rm %{buildroot}/usr/share/ua_db.sql
 mkdir -p %{buildroot}/opt/usr/data/ua
 install -m 0644 config/uam-config.json %{buildroot}%{config_file_path}/uam-config.json
 
-mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants
-install -m 0644 packaging/ua-manager.service %{buildroot}%{_unitdir}/ua-manager.service
-ln -s ../ua-manager.service %{buildroot}%{_unitdir}/multi-user.target.wants/ua-manager.service
-
-mkdir -p %{buildroot}/etc/dbus-1/system.d/
-cp -af %{_builddir}/%{name}-%{version}/packaging/ua-manager.conf %{buildroot}/etc/dbus-1/system.d/
+mkdir -p %{buildroot}%{_sysconfdir}/dbus-1/system.d
+cp ua-manager.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/ua-manager.conf
+mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services/
+cp net.uamd.service %{buildroot}%{_datadir}/dbus-1/system-services/net.uamd.service
+mkdir -p %{buildroot}%{_unitdir}
+cp ua-manager.service %{buildroot}%{_unitdir}/ua-manager.service
 
 %post -p /sbin/ldconfig
 
@@ -89,11 +92,9 @@ cp -af %{_builddir}/%{name}-%{version}/packaging/ua-manager.conf %{buildroot}/et
 %defattr(-, root, root)
 %attr(644,-,-) %{_libdir}/libua-api.so.*
 %attr(755,network_fw,network_fw) %{_bindir}/ua-manager
-%{_sysconfdir}/dbus-1/system.d/ua-manager.conf
-%{_unitdir}/multi-user.target.wants/ua-manager.service
-%{_unitdir}/ua-manager.service
-%{_datadir}/dbus-1/system-services/net.uamd.service
-%attr(644,root,root) %{_sysconfdir}/dbus-1/system.d/ua-manager.conf
+%config %{_sysconfdir}/dbus-1/system.d/ua-manager.conf
+%attr(644,root,root) %{_datadir}/dbus-1/system-services/*
+%attr(644,root,root) %{_unitdir}/ua-manager.service
 %{config_file_path}/uam-config.json
 %config %attr(660, network_fw, network_fw) %{database_full_path}
 %config %attr(660, network_fw, network_fw) %{database_full_path}-journal
@@ -107,8 +108,6 @@ cp -af %{_builddir}/%{name}-%{version}/packaging/ua-manager.conf %{buildroot}/et
 %files plugins
 %defattr(-, root, root)
 %{_includedir}/ua-manager/ua-plugin.h
-%if 0%{?vd_req:1}
 %{_includedir}/ua-manager/ua-power-plugin.h
-%endif
 %{_libdir}/pkgconfig/ua-plugins.pc
 
index 6aa7b0f..9b8cf81 100644 (file)
@@ -30,6 +30,8 @@ extern "C" {
 
 void _uam_gdbuam_deinit_proxy(void);
 
+int _uam_sync_enable(int enable);
+
 int _uam_sync_request(
                int req_func, GArray *in_param1,
                GArray *in_param2, GArray *in_param3,
index b2c935d..74ddaf5 100644 (file)
@@ -38,6 +38,11 @@ UAM_EXPORT_API int _uam_init(uam_event_callback cb, void *user_data)
        FUNC_ENTRY;
        int ret;
 
+       ret = _uam_sync_enable(TRUE);
+       if (UAM_ERROR_NONE != ret) {
+               return ret;
+       }
+
        ret = _uam_register_event_handler(cb, user_data);
        if (UAM_ERROR_NONE == ret) {
                cb_info.callback = cb;
@@ -53,6 +58,11 @@ UAM_EXPORT_API int _uam_deinit(void)
        FUNC_ENTRY;
        int ret;
 
+       ret = _uam_sync_enable(FALSE);
+       if (UAM_ERROR_NONE != ret) {
+               return ret;
+       }
+
        ret = _uam_unregister_event_handler();
 
        FUNC_EXIT;
old mode 100644 (file)
new mode 100755 (executable)
index bf6fa3b..8d42040
@@ -115,6 +115,48 @@ static void __uam_fill_garray_from_variant(GVariant *var, GArray *param)
        FUNC_EXIT;
 }
 
+int _uam_sync_enable(int enable)
+{
+       FUNC_ENTRY;
+
+       gint timeout = 10000;
+       int result = UAM_ERROR_NONE;
+
+       GError *error = NULL;
+       GVariant *variant = NULL;
+       GDBusConnection *conn = NULL;
+
+       conn = _uam_get_gdbuam_conn();
+       retv_if(NULL == conn, UAM_ERROR_INTERNAL);
+
+       variant = g_dbus_connection_call_sync(conn,
+                       UAM_DBUS_NAME".enabler",
+                       UAM_DAEMON_PATH"/enabler",
+                       UAM_DBUS_NAME".enabler",
+                       "enable",
+                       g_variant_new("(i)", enable), NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       timeout, NULL, &error);
+       if (variant) {
+               g_variant_get(variant, "(i)", &result);
+               UAM_DBG("%s status [0x%x] %s",
+                       (enable) ? "enable" : "disable", result,
+                       _uam_error_to_str(result));
+               g_variant_unref(variant);
+       } else if (error) {
+               UAM_ERR("D-Bus API failure: errCode[%x], message[%s]",
+                                       error->code, error->message);
+               if (strstr(error->message, "AccessDenied"))
+                       result = UAM_ERROR_PERMISSION_DENIED;
+               else
+                       result = UAM_ERROR_INTERNAL;
+               g_error_free(error);
+               return result ;
+       }
+
+       return result;
+}
+
 int _uam_sync_request(
                int req_func,
                GArray *in_param1,
index 7fe8429..6df08e9 100644 (file)
@@ -24,7 +24,7 @@
 #include "ua-manager-common.h"
 #include "ua-plugin-manager.h"
 
-static GMainLoop *main_loop;
+GMainLoop *main_loop;
 static gboolean is_initialized = FALSE;
 
 static void __uam_signal_handler(
index 928f197..01082c9 100644 (file)
 #include "ua-manager-common.h"
 #include "ua-manager-core.h"
 
+extern GMainLoop *main_loop;
+
 /* For maintaining Application Sync API call requests */
 GSList *request_list = NULL;
 
 static GDBusConnection *uam_manager_conn;
 static guint g_dbus_object_id = 0;
 static guint owner_id = 0;
+static guint g_dbus_enabler_object_id = 0;
+static guint enabler_dbus_id = 0;
 static guint owner_sig_id = 0;
 
+static const gchar uam_enabler_introspection_xml[] =
+"<node name='/net/uamd'>"
+"      <interface name='net.uamd.enabler'>"
+"              <method name='enable'>"
+"              <arg type='i' name='enable' direction='in' />"
+"              <arg type='i' name='result' direction='out' />"
+"              </method>"
+"      </interface>"
+"</node>";
+
+
 static const gchar uam_manager_introspection_xml[] =
 "<node name='/net/uamd'>"
 "      <interface name='net.uamd'>"
@@ -556,6 +571,50 @@ static const GDBusInterfaceVTable uam_method_table = {
        {0}
 };
 
+static void __uam_enabler_method(
+               GDBusConnection *connection,
+               const gchar *sender,
+               const gchar *object_path,
+               const gchar *interface_name,
+               const gchar *method_name,
+               GVariant *parameters,
+               GDBusMethodInvocation *invocation,
+               gpointer user_data)
+{
+       FUNC_ENTRY;
+       int enable = FALSE;
+       int result = UAM_ERROR_NONE;
+
+       UAM_DBG("Method[%s] Path[%s] Interface[%s]",
+                       method_name, object_path, interface_name);
+
+       if (0 == g_strcmp0(method_name, "enable")) {
+               g_variant_get(parameters, "(i)", &enable);
+               if (TRUE == enable) {
+                       /* To-Do : We should add user to list
+                        * and Enabler ua-manager */
+                       UAM_DBG("Enable ua-manager");
+               } else {
+                       /* To-Do : If only one user is activated,
+                        * we should terminite daemon */
+                       UAM_DBG("Disable ua-manager");
+                       g_main_loop_quit(main_loop);
+               }
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", result));
+       }
+       FUNC_EXIT;
+       return;
+}
+
+
+static const GDBusInterfaceVTable uam_enaber_method_table = {
+       __uam_enabler_method,
+       NULL,
+       NULL,
+       {0}
+};
+
 static GDBusNodeInfo *__uam_manager_create_method_node_info(
                const gchar *introspection_data)
 {
@@ -578,6 +637,25 @@ static GDBusNodeInfo *__uam_manager_create_method_node_info(
        return node_info;
 }
 
+static int __uam_enabler_register_object(
+               GDBusConnection *conn, GDBusNodeInfo *node_info)
+{
+       FUNC_ENTRY;
+       GError *error = NULL;
+
+       retv_if(NULL == node_info, UAM_ERROR_INTERNAL);
+
+       g_dbus_enabler_object_id = g_dbus_connection_register_object(conn,
+                       UAM_DAEMON_PATH"/enabler",
+                       node_info->interfaces[0],
+                       &uam_enaber_method_table,
+                       NULL, NULL, &error);
+       retv_if(0 == g_dbus_enabler_object_id, UAM_ERROR_INTERNAL);
+
+       FUNC_EXIT;
+       return UAM_ERROR_NONE;
+}
+
 static int __uam_manager_register_object(
                GDBusConnection *conn, GDBusNodeInfo *node_info)
 {
@@ -607,6 +685,12 @@ static int __uam_manager_unregister_object(GDBusConnection *conn)
                g_dbus_object_id = 0;
        }
 
+       if (g_dbus_enabler_object_id > 0) {
+               g_dbus_connection_unregister_object(
+                               conn, g_dbus_enabler_object_id);
+               g_dbus_enabler_object_id = 0;
+       }
+
        FUNC_EXIT;
        return UAM_ERROR_NONE;
 }
@@ -679,6 +763,9 @@ static void __uam_manager_bus_acquired_cb(
                GDBusConnection *connection, const gchar *name, gpointer user_data)
 {
        FUNC_ENTRY;
+
+       UAM_INFO("DBus %s bus acquired", name);
+
        GDBusNodeInfo *node_info = NULL;
 
        UAM_INFO("DBus bus acquired");
@@ -700,16 +787,34 @@ static void __uam_manager_bus_acquired_cb(
 
        UAM_DBG("owner_sig_id: [%d]", owner_sig_id);
        uam_manager_conn = connection;
+
        FUNC_EXIT;
 }
 
+static void __uam_enabler_bus_acquired(
+               GDBusConnection *connection, const gchar *name, gpointer user_data)
+{
+       GDBusNodeInfo *node_info = NULL;
+
+       UAM_INFO("DBus bus acquired");
+
+       ret_if(connection == NULL);
+
+       node_info = __uam_manager_create_method_node_info(
+                       uam_enabler_introspection_xml);
+       ret_if(node_info == NULL);
+
+       __uam_enabler_register_object(connection, node_info);
+       g_dbus_node_info_unref(node_info);
+}
+
 int _uam_manager_register(void)
 {
        FUNC_ENTRY;
 
        owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
                        UAM_DBUS_NAME,
-                       G_BUS_NAME_OWNER_FLAGS_NONE,
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
                        __uam_manager_bus_acquired_cb,
                        __uam_manager_name_acquired_cb,
                        __uam_manager_name_lost_cb,
@@ -718,6 +823,17 @@ int _uam_manager_register(void)
 
        UAM_DBG("owner_id is [%d]", owner_id);
 
+       /* Get D-Bus owner to activate mesh service daemon */
+       enabler_dbus_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
+                       UAM_DBUS_NAME".enabler",
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE,
+                       __uam_enabler_bus_acquired,
+                       NULL,
+                       NULL,
+                       NULL, NULL);
+
+       retv_if(0 == enabler_dbus_id, UAM_ERROR_INTERNAL);
+
        FUNC_EXIT;
        return UAM_ERROR_NONE;
 }
@@ -741,9 +857,14 @@ void _uam_manager_unregister(void)
                }
 
                if (owner_id > 0) {
-                       //g_bus_unown_name(owner_id);
+                       g_bus_unown_name(owner_id);
                        owner_id = 0;
                }
+
+               if (enabler_dbus_id > 0) {
+                       g_bus_unown_name(enabler_dbus_id);
+                       enabler_dbus_id = 0;
+               }
        }
 
        FUNC_EXIT;
index ad88012..5474290 100644 (file)
@@ -5,12 +5,9 @@ SET(LIB_PKGCONFIG_DIR "${LIB_PATH}/pkgconfig")
 
 SET(HEADERS
        ua-plugin.h
+       ua-power-plugin.h
        )
 
-IF("$ENV{CFLAGS}" MATCHES "-DVD_REQ")
-       LIST(APPEND HEADERS ua-power-plugin.h)
-ENDIF()
-
 FOREACH(hfile ${HEADERS})
        INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/${hfile} DESTINATION include/ua-manager)
 ENDFOREACH(hfile)