From 93b31c0f4e6f09502a1976764f36d42fc24a5135 Mon Sep 17 00:00:00 2001 From: Anjali Nijhara Date: Fri, 16 Jun 2023 16:59:05 +0530 Subject: [PATCH] Add new dbus methods fo modifying NTP Server Change-Id: Ib6151577ba3c32b034dc03c8b76029f5b1c3fb82 --- CMakeLists.txt | 2 +- include/netdbus.h | 3 + include/network-clock.h | 8 + interfaces/netconfig-iface-clock.xml | 10 ++ .../etc/dbus-1/system.d/net-config-robot.conf | 3 + resources/etc/dbus-1/system.d/net-config.conf | 3 + src/dbus/netdbus.c | 13 ++ src/main.c | 2 + src/network-clock.c | 150 +++++++++++------- 9 files changed, 135 insertions(+), 59 deletions(-) create mode 100644 interfaces/netconfig-iface-clock.xml diff --git a/CMakeLists.txt b/CMakeLists.txt index 45a66fb..43de6e9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/include/netdbus.h b/include/netdbus.h index ed2175b..2cad73c 100755 --- a/include/netdbus.h +++ b/include/netdbus.h @@ -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); diff --git a/include/network-clock.h b/include/network-clock.h index e1ef985..2f5e9a5 100755 --- a/include/network-clock.h +++ b/include/network-clock.h @@ -24,6 +24,14 @@ extern "C" { #endif +#include +#include +#include + +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 index 0000000..77685a8 --- /dev/null +++ b/interfaces/netconfig-iface-clock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/etc/dbus-1/system.d/net-config-robot.conf b/resources/etc/dbus-1/system.d/net-config-robot.conf index da297ca..ce8e986 100755 --- a/resources/etc/dbus-1/system.d/net-config-robot.conf +++ b/resources/etc/dbus-1/system.d/net-config-robot.conf @@ -119,5 +119,8 @@ + + + diff --git a/resources/etc/dbus-1/system.d/net-config.conf b/resources/etc/dbus-1/system.d/net-config.conf index bb7b99c..f815a38 100755 --- a/resources/etc/dbus-1/system.d/net-config.conf +++ b/resources/etc/dbus-1/system.d/net-config.conf @@ -121,5 +121,8 @@ + + + diff --git a/src/dbus/netdbus.c b/src/dbus/netdbus.c index 3136ddb..6ca7316 100755 --- a/src/dbus/netdbus.c +++ b/src/dbus/netdbus.c @@ -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, diff --git a/src/main.c b/src/main.c index f1832c7..3fe3d3b 100755 --- a/src/main.c +++ b/src/main.c @@ -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[]) diff --git a/src/network-clock.c b/src/network-clock.c index 59551c4..e4227c3 100755 --- a/src/network-clock.c +++ b/src/network-clock.c @@ -27,29 +27,14 @@ #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); } -- 2.34.1