Add new dbus methods fo modifying NTP Server 43/294543/2
authorAnjali Nijhara <a.nijhara@samsung.com>
Fri, 16 Jun 2023 11:29:05 +0000 (16:59 +0530)
committerAnjali Nijhara <a.nijhara@samsung.com>
Wed, 21 Jun 2023 09:09:00 +0000 (14:39 +0530)
Change-Id: Ib6151577ba3c32b034dc03c8b76029f5b1c3fb82

CMakeLists.txt
include/netdbus.h
include/network-clock.h
interfaces/netconfig-iface-clock.xml [new file with mode: 0644]
resources/etc/dbus-1/system.d/net-config-robot.conf
resources/etc/dbus-1/system.d/net-config.conf
src/dbus/netdbus.c
src/main.c
src/network-clock.c

index 45a66fb..43de6e9 100755 (executable)
@@ -130,7 +130,7 @@ ADD_CUSTOM_COMMAND(
                        --generate-c-code generated-code
                        --c-generate-object-manager
                        --generate-docbook generated-code-docs
-                       ${INTERFACES}/netconfig-iface-network-state.xml ${INTERFACES}/netconfig-iface-network-statistics.xml ${INTERFACES}/netconfig-iface-wifi.xml ${INTERFACES}/netconfig-iface-vpnsvc.xml ${INTERFACES}/netconfig-iface-mptcp.xml ${INTERFACES}/netconfig-iface-ethernet.xml
+                       ${INTERFACES}/netconfig-iface-network-state.xml ${INTERFACES}/netconfig-iface-network-statistics.xml ${INTERFACES}/netconfig-iface-wifi.xml ${INTERFACES}/netconfig-iface-vpnsvc.xml ${INTERFACES}/netconfig-iface-mptcp.xml ${INTERFACES}/netconfig-iface-ethernet.xml ${INTERFACES}/netconfig-iface-clock.xml
                        COMMENT "Generating GDBus .c/.h")
 
 ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS} ${CMAKE_SOURCE_DIR}/generated-code.c)
index ed2175b..2cad73c 100755 (executable)
@@ -68,6 +68,8 @@ extern "C" {
 #define NETCONFIG_MPTCP_INTERFACE      "net.netconfig.mptcp"
 #define NETCONFIG_ETHERNET_PATH                "/net/netconfig/ethernet"
 #define NETCONFIG_ETHERNET_INTERFACE   "net.netconfig.ethernet"
+#define NETCONFIG_CLOCK_PATH         "/net/netconfig/clock"
+#define NETCONFIG_CLOCK_INTERFACE    "net.netconfig.clock"
 
 #define CONTAINER_FILE "/run/systemd/container"
 #define DBUS_HOST_SYSTEM_BUS_ADDRESS "unix:path=/run/host/dbus/system_bus_socket"
@@ -88,6 +90,7 @@ GDBusObjectManagerServer      *netdbus_get_statistics_manager(void);
 GDBusObjectManagerServer       *netdbus_get_vpn_manager(void);
 GDBusObjectManagerServer       *netdbus_get_mptcp_manager(void);
 GDBusObjectManagerServer       *netdbus_get_ethernet_manager(void);
+GDBusObjectManagerServer        *netdbus_get_clock_manager(void);
 
 GDBusConnection                                *netdbus_get_connection(void);
 GCancellable                           *netdbus_get_cancellable(void);
index e1ef985..2f5e9a5 100755 (executable)
 extern "C" {
 #endif
 
+#include <glib.h>
+#include <gio/gio.h>
+#include <glib-object.h>
+
+void clock_object_create_and_init(void);
+void clock_object_deinit(void);
+Clock *get_clock_object(void);
+
 void netconfig_clock_init(void);
 void netconfig_clock_deinit(void);
 
diff --git a/interfaces/netconfig-iface-clock.xml b/interfaces/netconfig-iface-clock.xml
new file mode 100644 (file)
index 0000000..77685a8
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node name="/net/netconfig/clock">
+        <interface name="net.netconfig.clock">
+                <method name="SetNtpServer">
+                        <arg type="s" name="ntp_server" direction="in"/>
+                </method>
+                <method name="UnsetNtpServer">
+                </method>
+        </interface>
+</node>
index da297ca..ce8e986 100755 (executable)
 
                <allow send_destination="net.netconfig" send_interface="net.netconfig.ethernet" send_member="EnableEap" />
                <allow send_destination="net.netconfig" send_interface="net.netconfig.ethernet" send_member="SetEapConfig" />
+
+               <allow send_destination="net.netconfig" send_interface="net.netconfig.clock" send_member="SetNtpServer" />
+               <allow send_destination="net.netconfig" send_interface="net.netconfig.clock" send_member="UnsetNtpServer" />
        </policy>
 </busconfig>
index bb7b99c..f815a38 100755 (executable)
 
                <check send_destination="net.netconfig" send_interface="net.netconfig.ethernet" send_member="EnableEap" privilege="http://tizen.org/privilege/network.set" />
                <check send_destination="net.netconfig" send_interface="net.netconfig.ethernet" send_member="SetEapConfig" privilege="http://tizen.org/privilege/network.profile" />
+
+               <check send_destination="net.netconfig" send_interface="net.netconfig.clock" send_member="SetNtpServer" privilege="http://tizen.org/privilege/network.set" />
+               <check send_destination="net.netconfig" send_interface="net.netconfig.clock" send_member="UnsetNtpServer" privilege="http://tizen.org/privilege/network.set" />
        </policy>
 </busconfig>
index 3136ddb..6ca7316 100755 (executable)
@@ -44,6 +44,8 @@ static GDBusObjectManagerServer *manager_server_statistics = NULL;
 static GDBusObjectManagerServer *manager_server_vpn = NULL;
 static GDBusObjectManagerServer *manager_server_mptcp = NULL;
 static GDBusObjectManagerServer *manager_server_ethernet = NULL;
+static GDBusObjectManagerServer *manager_server_clock = NULL;
+
 static guint owner_id = 0;
 static got_name_cb g_callback = NULL;
 
@@ -85,6 +87,11 @@ GDBusObjectManagerServer *netdbus_get_ethernet_manager(void)
        return manager_server_ethernet;
 }
 
+GDBusObjectManagerServer *netdbus_get_clock_manager(void)
+{
+       return manager_server_clock;
+}
+
 GDBusConnection *netdbus_get_connection(void)
 {
        return gconn_data.connection;
@@ -361,6 +368,12 @@ int setup_gdbus(got_name_cb cb)
                exit(1);
        }
 
+       manager_server_clock = g_dbus_object_manager_server_new(NETCONFIG_CLOCK_PATH);
+       if (manager_server_clock == NULL) {
+               ERR("Manager server for NETCONFIG_CLOCK_PATH not created.");
+               exit(1);
+       }
+
        owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, NETCONFIG_SERVICE,
                                                          G_BUS_NAME_OWNER_FLAGS_NONE,
                                                          _got_bus_cb, _got_name_cb, _lost_name_cb,
index f1832c7..3fe3d3b 100755 (executable)
@@ -70,6 +70,7 @@ void _got_name_cb(void)
        vpnsvc_create_and_init();
        mptcp_object_create_and_init();
        ethernet_object_create_and_init();
+       clock_object_create_and_init();
 
        register_gdbus_signal();
        connman_register_agent();
@@ -87,6 +88,7 @@ static void _objects_deinit(void)
        vpnsvc_destroy_deinit();
        mptcp_object_deinit();
        ethernet_object_deinit();
+       clock_object_deinit();
 }
 
 int main(int argc, char *argv[])
index 59551c4..e4227c3 100755 (executable)
 
 #define NTP_SERVER     "pool.ntp.org"
 #define CONNMAN_GLOBAL_SETTING "/var/lib/connman/settings"
+#define TIME_UPDATE_CONFIG_AUTO                "auto"
+#define TIME_UPDATE_CONFIG_MANUAL      "manual"
 
-static void __netconfig_clock_clear_timeserver(void)
-{
-       GKeyFile *keyfile = NULL;
-
-       keyfile = netconfig_keyfile_load(CONNMAN_GLOBAL_SETTING);
-
-       if (keyfile == NULL)
-               return;
+static Clock *clock_object = NULL;
 
-       g_key_file_remove_key(keyfile, "global", "Timeservers", NULL);
-
-       netconfig_keyfile_save(keyfile, CONNMAN_GLOBAL_SETTING);
-       g_key_file_free(keyfile);
-}
-
-static gboolean __netconfig_clock_clear_timeserver_timer(gpointer data)
+Clock *get_clock_object(void)
 {
-       INFO("Clear NTP server");
-
-       __netconfig_clock_clear_timeserver();
-
-       return FALSE;
+       return clock_object;
 }
 
 static void __netconfig_clock_set_timeserver(const char *server)
@@ -103,41 +88,21 @@ static void __netconfig_clock_unset_timeserver(void)
        return;
 }
 
-static void __netconfig_set_timeserver(void)
+static void __netconfig_clock_set_time_update_policy(const char *time_update_method)
 {
-       int nitz_updated = 0;
-
-       netconfig_vconf_get_int(VCONFKEY_TELEPHONY_NITZ_EVENT_GMT, &nitz_updated);
-
-       if (nitz_updated != 0)
-               return;
-
-       __netconfig_clock_set_timeserver((const char *)NTP_SERVER);
-}
+       GVariant* reply = NULL;
 
-static void __network_changed_cb(keynode_t *node, void *user_data)
-{
-       int status = VCONFKEY_NETWORK_OFF;
-       gboolean automatic_time_update = 0;
+       reply = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
+                       CONNMAN_MANAGER_PATH, CONNMAN_CLOCK_INTERFACE,
+                       "SetProperty", g_variant_new("(sv)", "TimeUpdates",
+                       g_variant_new_string(time_update_method)));
 
-       if (node != NULL)
-               status = vconf_keynode_get_int(node);
+       if (reply == NULL)
+               ERR("Failed to set Time Update Policy");
        else
-               netconfig_vconf_get_int(VCONFKEY_NETWORK_STATUS, &status);
-
-       if (status == VCONFKEY_NETWORK_OFF)
-               return;
-
-       netconfig_vconf_get_bool(
-                       VCONFKEY_SETAPPL_STATE_AUTOMATIC_TIME_UPDATE_BOOL,
-                       &automatic_time_update);
-
-       if (automatic_time_update == FALSE) {
-               INFO("Automatic time update is not set (%d)", automatic_time_update);
-               return;
-       }
+               g_variant_unref(reply);
 
-       __netconfig_set_timeserver();
+       return;
 }
 
 static void __automatic_time_update_changed_cb(keynode_t *node, void *user_data)
@@ -152,7 +117,7 @@ static void __automatic_time_update_changed_cb(keynode_t *node, void *user_data)
 
        if (automatic_time_update == FALSE) {
                INFO("Automatic time update is changed to 'FALSE'");
-               __netconfig_clock_unset_timeserver();
+               __netconfig_clock_set_time_update_policy((const char *)TIME_UPDATE_CONFIG_MANUAL);
                return;
        }
 
@@ -163,7 +128,7 @@ static void __automatic_time_update_changed_cb(keynode_t *node, void *user_data)
                return;
         }
 
-       __netconfig_set_timeserver();
+       __netconfig_clock_set_time_update_policy((const char *)TIME_UPDATE_CONFIG_AUTO);
 }
 
 static void __nitz_event_cb(keynode_t *node, void *user_data)
@@ -177,7 +142,7 @@ static void __nitz_event_cb(keynode_t *node, void *user_data)
 
        if (nitz_updated != 0) {
                INFO("Time is updated by NITZ");
-               __netconfig_clock_unset_timeserver();
+               __netconfig_clock_set_time_update_policy((const char *)TIME_UPDATE_CONFIG_MANUAL);
                return;
        }
 }
@@ -191,13 +156,13 @@ void netconfig_clock_init(void)
                        __automatic_time_update_changed_cb, NULL);
        vconf_notify_key_changed(VCONFKEY_TELEPHONY_NITZ_EVENT_GMT,
                        __nitz_event_cb, NULL);
-       vconf_notify_key_changed(VCONFKEY_NETWORK_STATUS,
-                       __network_changed_cb, NULL);
 
        netconfig_vconf_get_bool(VCONFKEY_SETAPPL_STATE_AUTOMATIC_TIME_UPDATE_BOOL, &automatic_time_update);
 
        if (automatic_time_update == FALSE)
-               __netconfig_clock_clear_timeserver_timer(NULL);
+               __netconfig_clock_set_time_update_policy((const char *)TIME_UPDATE_CONFIG_MANUAL);
+       else
+               __netconfig_clock_set_time_update_policy((const char *)TIME_UPDATE_CONFIG_AUTO);
 }
 
 void netconfig_clock_deinit(void)
@@ -206,6 +171,75 @@ void netconfig_clock_deinit(void)
                        __automatic_time_update_changed_cb);
        vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NITZ_EVENT_GMT,
                        __nitz_event_cb);
-       vconf_ignore_key_changed(VCONFKEY_NETWORK_STATUS,
-                       __network_changed_cb);
+}
+
+gboolean handle_set_ntp_server(Clock *object, GDBusMethodInvocation *invocation,
+                               const gchar *server)
+{
+       if(server == NULL) {
+               netconfig_error_dbus_method_return(invocation,
+                               NETCONFIG_ERROR_INTERNAL, "SetNtpServer Failed");
+               return TRUE;
+       }
+
+       __netconfig_clock_set_timeserver(server);
+
+       DBG("NTP Server:%s set successfully",server);
+
+       clock_complete_set_ntp_server(object, invocation);
+
+       return TRUE;
+}
+
+gboolean handle_unset_ntp_server(Clock *object, GDBusMethodInvocation *invocation)
+{
+       __netconfig_clock_unset_timeserver();
+
+       DBG("NTP Server unset successfully");
+
+       clock_complete_unset_ntp_server(object, invocation);
+
+       return TRUE;
+}
+
+/*****************************
+ * Initializations Functions *
+ ****************************/
+void clock_object_create_and_init(void)
+{
+       DBG("Create clock object.");
+       GDBusInterfaceSkeleton *interface_clock = NULL;
+       GDBusConnection *connection = NULL;
+       GDBusObjectManagerServer *server = netdbus_get_clock_manager();
+       if (server == NULL)
+               return;
+
+       connection = netdbus_get_connection();
+       g_dbus_object_manager_server_set_connection(server, connection);
+
+       /* Interface */
+       clock_object = clock_skeleton_new();
+       interface_clock = G_DBUS_INTERFACE_SKELETON(clock_object);
+
+       /* Set NTP Server */
+       g_signal_connect(clock_object, "handle-set-ntp-server",
+                       G_CALLBACK(handle_set_ntp_server), NULL);
+
+       /* Unset NTP Server */
+       g_signal_connect(clock_object, "handle-unset-ntp-server",
+                       G_CALLBACK(handle_unset_ntp_server), NULL);
+
+       if (!g_dbus_interface_skeleton_export(interface_clock, connection,
+                       NETCONFIG_CLOCK_PATH, NULL)) {
+               ERR("Export NETCONFIG_CLOCK_PATH for clock failed");
+       }
+
+       return;
+}
+
+void clock_object_deinit(void)
+{
+       DBG("Deinit clock object.");
+
+       g_object_unref(clock_object);
 }