The branch, master has been updated via fc28a74 ctdb-daemon: Remove ctdb_event_helper via 69b1ae3 ctdb-daemon: Switch to using event daemon via bcd7444 ctdb-daemon: Add functions to talk to event daemon via 21cac65 ctdb-daemon: Refactor check for valid events during recovery via c9a0f30 ctdb-protocol: Deprecate eventscript controls via 9272cd4 ctdb-protocol: Drop marshaling for eventscript controls via 3c74c05 ctdb-client: Drop client code for eventscript controls via def5f4b ctdb-daemon: Drop implementation of eventscript controls via b2d1cea ctdb-tool: Drop disablescript, enablescript and eventscript commands via a652b5c ctdb-tool: Add new command "event" to ctdb tool via ca0894e ctdb-tests: Add tests for event daemon via 9cbdb40 ctdb-tool: Add helper for talking to event daemon via b678dfb ctdb-client: Add client api for eventd communication via 950110f ctdb-eventd: Add event script handling daemon via 7e8ccef ctdb-protocol: Add marshalling for eventd protocol via c0c3433 ctdb-protocol: Add data types for eventd communication via 7ae530c ctdb-common: Add sock_daemon abstraction via 75a25d1 ctdb-common: Add generic socket I/O via f0ba41e ctdb-common: Add run_proc abstraction via 4d3c19d ctdb-protocol: Add marshalling for int32_t via a6ee085 ctdb-protocol: Fix marshalling of string with length via b2b8f1e ctdb-tool: Improve error reporting if helper execution fails via 590acdc ctdb-tool: Allow passing multiple command-line arguments to helper from f09f5ae selftest: make sure we always export KRB5CCNAME
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit fc28a74254d0263f02d008dcd2e2e6c9d03ccea3 Author: Amitay Isaacs <ami...@gmail.com> Date: Sun Sep 18 00:24:47 2016 +1000 ctdb-daemon: Remove ctdb_event_helper Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Sun Dec 18 18:10:50 CET 2016 on sn-devel-144 commit 69b1ae34231f20d45bff5bdd50c0a2adfc87f90b Author: Amitay Isaacs <ami...@gmail.com> Date: Fri Sep 16 20:06:07 2016 +1000 ctdb-daemon: Switch to using event daemon Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit bcd7444c57447983f571cbbe3ceed7d5558040e9 Author: Amitay Isaacs <ami...@gmail.com> Date: Sat Aug 27 17:26:28 2016 +1000 ctdb-daemon: Add functions to talk to event daemon Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 21cac65b67b2f9880586404f6492260541f05e30 Author: Amitay Isaacs <ami...@gmail.com> Date: Fri Sep 16 18:44:37 2016 +1000 ctdb-daemon: Refactor check for valid events during recovery Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit c9a0f3015d095946fc91223e5838f3d6c3d4d1cb Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Sep 12 11:33:02 2016 +1000 ctdb-protocol: Deprecate eventscript controls Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 9272cd42aac96f69b574319ffbe5a2acb13abd2e Author: Amitay Isaacs <ami...@gmail.com> Date: Wed Nov 23 12:28:24 2016 +1100 ctdb-protocol: Drop marshaling for eventscript controls Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 3c74c05c7519ebc19f55316b7a89da86e28f6906 Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Sep 12 11:32:20 2016 +1000 ctdb-client: Drop client code for eventscript controls Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit def5f4b1bfeeddba97141a3d3c08ac5a1187ce32 Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Sep 12 11:25:11 2016 +1000 ctdb-daemon: Drop implementation of eventscript controls Following controls are now implemented by event daemon - RUN_EVENTSCRIPTS - GET_EVENT_SCRIPT_STATUS - ENABLE_SCRIPT - DISABLE_SCRIPT Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit b2d1cea1f3b5b833c4c25b18e4d94e66d2950cbd Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Sep 12 11:31:35 2016 +1000 ctdb-tool: Drop disablescript, enablescript and eventscript commands These commands are now replaced with ctdb event ... ctdb scriptstatus is maintained for backward compatibility. Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit a652b5c3515c8cf611f633b95ac894f60e6f4977 Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Nov 21 14:52:41 2016 +1100 ctdb-tool: Add new command "event" to ctdb tool This command covers all the commands to event daemon. ctdb event run <event> ctdb event status [<event>] [lastrun|lastfail|lastpass] ctdb event script list ctdb event script enable <script> ctdb event script disable <script> Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit ca0894e9325e1687a843bc0a79e100a8adc986d4 Author: Amitay Isaacs <ami...@gmail.com> Date: Tue Sep 6 18:53:02 2016 +1000 ctdb-tests: Add tests for event daemon Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 9cbdb406129343dac30883f43bfe1e8e046d6041 Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Nov 21 17:39:02 2016 +1100 ctdb-tool: Add helper for talking to event daemon Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit b678dfb3a4b2f68c613946217b67598560280a95 Author: Amitay Isaacs <ami...@gmail.com> Date: Thu Sep 1 01:07:47 2016 +1000 ctdb-client: Add client api for eventd communication Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 950110f3c19342def662f19f76c1ac8353943341 Author: Amitay Isaacs <ami...@gmail.com> Date: Sat Aug 27 17:26:52 2016 +1000 ctdb-eventd: Add event script handling daemon Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 7e8ccef49b8cbc23a3b7317dd60e0f9de288b359 Author: Amitay Isaacs <ami...@gmail.com> Date: Wed Aug 31 17:02:55 2016 +1000 ctdb-protocol: Add marshalling for eventd protocol Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit c0c34337d93aca4d683bbe273c67a2303419312d Author: Amitay Isaacs <ami...@gmail.com> Date: Wed Aug 31 15:49:27 2016 +1000 ctdb-protocol: Add data types for eventd communication Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 7ae530c2ab4cf37a51f32bcc6c94628f62493305 Author: Amitay Isaacs <ami...@gmail.com> Date: Sat Sep 3 23:27:23 2016 +1000 ctdb-common: Add sock_daemon abstraction Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 75a25d13310c53328f2b99f856abc8c5d023bc52 Author: Amitay Isaacs <ami...@gmail.com> Date: Fri Sep 16 16:13:18 2016 +1000 ctdb-common: Add generic socket I/O This is a generic socket read/write to be used in the ctdb daemon. It is based on ctdb_io.c and comm.c. Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit f0ba41e1c5a9b4000b918211fc16c3545d2133ab Author: Amitay Isaacs <ami...@gmail.com> Date: Tue Aug 30 17:33:42 2016 +1000 ctdb-common: Add run_proc abstraction Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 4d3c19d14e938672ca403e1546b131a5e5032aac Author: Amitay Isaacs <ami...@gmail.com> Date: Wed Aug 31 15:46:45 2016 +1000 ctdb-protocol: Add marshalling for int32_t Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit a6ee085845c92d4b8fe26ee4dd75836212930922 Author: Amitay Isaacs <ami...@gmail.com> Date: Wed Aug 31 01:33:38 2016 +1000 ctdb-protocol: Fix marshalling of string with length Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit b2b8f1eaed4a50ad2bcd391fef3b66a1ff6e9bfa Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Nov 21 17:38:18 2016 +1100 ctdb-tool: Improve error reporting if helper execution fails Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> commit 590acdc5294eb12259b0112b230418faab575edb Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Nov 21 14:36:04 2016 +1100 ctdb-tool: Allow passing multiple command-line arguments to helper Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> ----------------------------------------------------------------------- Summary of changes: ctdb/client/client.h | 88 +- ctdb/client/client_control_sync.c | 118 -- ctdb/client/client_event.c | 597 ++++++++ ctdb/client/ctdb_client.c | 80 -- ctdb/common/run_proc.c | 527 ++++++++ ctdb/common/run_proc.h | 99 ++ ctdb/common/sock_daemon.c | 831 ++++++++++++ ctdb/common/sock_daemon.h | 204 +++ ctdb/common/sock_io.c | 309 +++++ ctdb/common/sock_io.h | 38 + ctdb/doc/ctdb.1.xml | 194 ++- ctdb/include/ctdb_client.h | 11 - ctdb/include/ctdb_private.h | 22 +- ctdb/packaging/RPM/ctdb.spec.in | 3 +- ctdb/protocol/protocol.h | 91 +- ctdb/protocol/protocol_api.h | 40 +- ctdb/protocol/protocol_client.c | 90 -- ctdb/protocol/protocol_control.c | 74 - ctdb/protocol/protocol_event.c | 848 ++++++++++++ ctdb/protocol/protocol_private.h | 5 + ctdb/protocol/protocol_types.c | 36 +- ctdb/server/ctdb_control.c | 13 +- ctdb/server/ctdb_daemon.c | 6 + ctdb/server/ctdb_event_helper.c | 159 --- ctdb/server/ctdb_eventd.c | 1802 +++++++++++++++++++++++++ ctdb/server/eventscript.c | 1396 +++++++------------ ctdb/tests/complex/35_cifs_external_tickle.sh | 8 +- ctdb/tests/complex/90_debug_hung_script.sh | 11 +- ctdb/tests/cunit/protocol_test_002.sh | 18 + ctdb/tests/cunit/run_proc_001.sh | 140 ++ ctdb/tests/cunit/sock_daemon_test_001.sh | 44 + ctdb/tests/eventd/README | 1 + ctdb/tests/eventd/eventd_001.sh | 31 + ctdb/tests/eventd/eventd_002.sh | 54 + ctdb/tests/eventd/eventd_003.sh | 54 + ctdb/tests/eventd/eventd_004.sh | 45 + ctdb/tests/eventd/eventd_005.sh | 36 + ctdb/tests/eventd/eventd_006.sh | 37 + ctdb/tests/eventd/eventd_007.sh | 37 + ctdb/tests/eventd/eventd_011.sh | 64 + ctdb/tests/eventd/eventd_012.sh | 53 + ctdb/tests/eventd/eventd_013.sh | 53 + ctdb/tests/eventd/eventd_014.sh | 52 + ctdb/tests/eventd/eventd_021.sh | 40 + ctdb/tests/eventd/eventd_022.sh | 41 + ctdb/tests/eventd/eventd_023.sh | 38 + ctdb/tests/eventd/eventd_024.sh | 47 + ctdb/tests/eventd/eventd_031.sh | 65 + ctdb/tests/eventd/eventd_032.sh | 124 ++ ctdb/tests/eventd/eventd_033.sh | 124 ++ ctdb/tests/eventd/eventd_041.sh | 48 + ctdb/tests/eventd/eventd_042.sh | 48 + ctdb/tests/eventd/eventd_043.sh | 48 + ctdb/tests/eventd/eventd_051.sh | 23 + ctdb/tests/eventd/scripts/local.sh | 137 ++ ctdb/tests/run_tests.sh | 2 +- ctdb/tests/simple/60_recoverd_missing_ip.sh | 4 +- ctdb/tests/simple/scripts/local_daemons.bash | 3 +- ctdb/tests/src/protocol_client_test.c | 414 +++++- ctdb/tests/src/protocol_types_test.c | 138 ++ ctdb/tests/src/run_proc_test.c | 105 ++ ctdb/tests/src/sock_daemon_test.c | 632 +++++++++ ctdb/tools/ctdb.c | 334 ++--- ctdb/tools/ctdb_event.c | 532 ++++++++ ctdb/wscript | 37 +- 65 files changed, 9500 insertions(+), 1903 deletions(-) create mode 100644 ctdb/client/client_event.c create mode 100644 ctdb/common/run_proc.c create mode 100644 ctdb/common/run_proc.h create mode 100644 ctdb/common/sock_daemon.c create mode 100644 ctdb/common/sock_daemon.h create mode 100644 ctdb/common/sock_io.c create mode 100644 ctdb/common/sock_io.h create mode 100644 ctdb/protocol/protocol_event.c delete mode 100644 ctdb/server/ctdb_event_helper.c create mode 100644 ctdb/server/ctdb_eventd.c create mode 100755 ctdb/tests/cunit/run_proc_001.sh create mode 100755 ctdb/tests/cunit/sock_daemon_test_001.sh create mode 100644 ctdb/tests/eventd/README create mode 100755 ctdb/tests/eventd/eventd_001.sh create mode 100755 ctdb/tests/eventd/eventd_002.sh create mode 100755 ctdb/tests/eventd/eventd_003.sh create mode 100755 ctdb/tests/eventd/eventd_004.sh create mode 100755 ctdb/tests/eventd/eventd_005.sh create mode 100755 ctdb/tests/eventd/eventd_006.sh create mode 100755 ctdb/tests/eventd/eventd_007.sh create mode 100755 ctdb/tests/eventd/eventd_011.sh create mode 100755 ctdb/tests/eventd/eventd_012.sh create mode 100755 ctdb/tests/eventd/eventd_013.sh create mode 100755 ctdb/tests/eventd/eventd_014.sh create mode 100755 ctdb/tests/eventd/eventd_021.sh create mode 100755 ctdb/tests/eventd/eventd_022.sh create mode 100755 ctdb/tests/eventd/eventd_023.sh create mode 100755 ctdb/tests/eventd/eventd_024.sh create mode 100755 ctdb/tests/eventd/eventd_031.sh create mode 100755 ctdb/tests/eventd/eventd_032.sh create mode 100755 ctdb/tests/eventd/eventd_033.sh create mode 100755 ctdb/tests/eventd/eventd_041.sh create mode 100755 ctdb/tests/eventd/eventd_042.sh create mode 100755 ctdb/tests/eventd/eventd_043.sh create mode 100755 ctdb/tests/eventd/eventd_051.sh create mode 100644 ctdb/tests/eventd/scripts/local.sh create mode 100644 ctdb/tests/src/run_proc_test.c create mode 100644 ctdb/tests/src/sock_daemon_test.c create mode 100644 ctdb/tools/ctdb_event.c Changeset truncated at 500 lines: diff --git a/ctdb/client/client.h b/ctdb/client/client.h index ea41cbe..f6d3fd3 100644 --- a/ctdb/client/client.h +++ b/ctdb/client/client.h @@ -452,11 +452,6 @@ int ctdb_ctrl_del_public_ip(TALLOC_CTX *mem_ctx, struct tevent_context *ev, int destnode, struct timeval timeout, struct ctdb_addr_info *addr_info); -int ctdb_ctrl_run_eventscripts(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - const char *event); - int ctdb_ctrl_get_capabilities(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct ctdb_client_context *client, int destnode, struct timeval timeout, @@ -482,13 +477,6 @@ int ctdb_ctrl_get_nodemap(TALLOC_CTX *mem_ctx, struct tevent_context *ev, int destnode, struct timeval timeout, struct ctdb_node_map **nodemap); -int ctdb_ctrl_get_event_script_status(TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - enum ctdb_event event, - struct ctdb_script_list **slist); - int ctdb_ctrl_traverse_kill(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct ctdb_client_context *client, int destnode, struct timeval timeout, @@ -517,16 +505,6 @@ int ctdb_ctrl_set_recmasterrole(TALLOC_CTX *mem_ctx, struct tevent_context *ev, int destnode, struct timeval timeout, uint32_t recmaster_role); -int ctdb_ctrl_enable_script(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - const char *script); - -int ctdb_ctrl_disable_script(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - const char *script); - int ctdb_ctrl_set_ban_state(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct ctdb_client_context *client, int destnode, struct timeval timeout, @@ -846,4 +824,70 @@ int ctdb_server_id_exists(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct ctdb_client_context *client, struct ctdb_server_id *sid, bool *exists); +/* from client/client_event.c */ + +struct ctdb_event_context; + +int ctdb_event_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, + const char *sockpath, struct ctdb_event_context **out); + +void ctdb_event_set_disconnect_callback(struct ctdb_event_context *eclient, + ctdb_client_callback_func_t callback, + void *private_data); + +struct tevent_req *ctdb_event_msg_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_event_context *eclient, + struct ctdb_event_request *request); + +bool ctdb_event_msg_recv(struct tevent_req *req, int *perr, + TALLOC_CTX *mem_ctx, + struct ctdb_event_reply **reply); + +struct tevent_req *ctdb_event_run_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_event_context *eclient, + enum ctdb_event event, + uint32_t timeout, const char *arg_str); + +bool ctdb_event_run_recv(struct tevent_req *req, int *perr, int32_t *result); + +struct tevent_req *ctdb_event_status_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_event_context *eclient, + enum ctdb_event event, + enum ctdb_event_status_state state); + +bool ctdb_event_status_recv(struct tevent_req *req, int *perr, + int32_t *result, int *event_result, + TALLOC_CTX *mem_ctx, + struct ctdb_script_list **script_list); + +struct tevent_req *ctdb_event_script_list_send( + TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_event_context *eclient); + +bool ctdb_event_script_list_recv(struct tevent_req *req, int *perr, + int32_t *result, TALLOC_CTX *mem_ctx, + struct ctdb_script_list **script_list); + +struct tevent_req *ctdb_event_script_enable_send( + TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_event_context *eclient, + const char *script_name); + +bool ctdb_event_script_enable_recv(struct tevent_req *req, int *perr, + int32_t *result); + +struct tevent_req *ctdb_event_script_disable_send( + TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_event_context *eclient, + const char *script_name); + +bool ctdb_event_script_disable_recv(struct tevent_req *req, int *perr, + int32_t *result); + #endif /* __CTDB_CLIENT_H__ */ diff --git a/ctdb/client/client_control_sync.c b/ctdb/client/client_control_sync.c index ac453b0..d59767b 100644 --- a/ctdb/client/client_control_sync.c +++ b/ctdb/client/client_control_sync.c @@ -1437,35 +1437,6 @@ int ctdb_ctrl_del_public_ip(TALLOC_CTX *mem_ctx, struct tevent_context *ev, return 0; } -int ctdb_ctrl_run_eventscripts(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - const char *event) -{ - struct ctdb_req_control request; - struct ctdb_reply_control *reply; - int ret; - - ctdb_req_control_run_eventscripts(&request, event); - ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout, - &request, &reply); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control RUN_EVENTSCRIPTS failed to node %u, ret=%d\n", - destnode, ret)); - return ret; - } - - ret = ctdb_reply_control_run_eventscripts(reply); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control RUN_EVENTSCRIPTS failed, ret=%d\n", ret)); - return ret; - } - - return 0; -} - int ctdb_ctrl_get_capabilities(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct ctdb_client_context *client, int destnode, struct timeval timeout, @@ -1611,37 +1582,6 @@ int ctdb_ctrl_get_nodemap(TALLOC_CTX *mem_ctx, struct tevent_context *ev, return 0; } -int ctdb_ctrl_get_event_script_status(TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - enum ctdb_event event, - struct ctdb_script_list **slist) -{ - struct ctdb_req_control request; - struct ctdb_reply_control *reply; - int ret; - - ctdb_req_control_get_event_script_status(&request, event); - ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout, - &request, &reply); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control GET_EVENT_SCRIPT_STATUS failed to node %u, ret=%d\n", - destnode, ret)); - return ret; - } - - ret = ctdb_reply_control_get_event_script_status(reply, mem_ctx, slist); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control GET_EVENT_SCRIPT_STATUS failed, ret=%d\n", ret)); - return ret; - } - - return 0; -} - int ctdb_ctrl_traverse_kill(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct ctdb_client_context *client, int destnode, struct timeval timeout, @@ -1814,64 +1754,6 @@ int ctdb_ctrl_set_recmasterrole(TALLOC_CTX *mem_ctx, struct tevent_context *ev, return 0; } -int ctdb_ctrl_enable_script(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - const char *script) -{ - struct ctdb_req_control request; - struct ctdb_reply_control *reply; - int ret; - - ctdb_req_control_enable_script(&request, script); - ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout, - &request, &reply); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control ENABLE_SCRIPT failed to node %u, ret=%d\n", - destnode, ret)); - return ret; - } - - ret = ctdb_reply_control_enable_script(reply); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control ENABLE_SCRIPT failed, ret=%d\n", ret)); - return ret; - } - - return 0; -} - -int ctdb_ctrl_disable_script(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct ctdb_client_context *client, - int destnode, struct timeval timeout, - const char *script) -{ - struct ctdb_req_control request; - struct ctdb_reply_control *reply; - int ret; - - ctdb_req_control_disable_script(&request, script); - ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout, - &request, &reply); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control DISABLE_SCRIPT failed to node %u, ret=%d\n", - destnode, ret)); - return ret; - } - - ret = ctdb_reply_control_disable_script(reply); - if (ret != 0) { - DEBUG(DEBUG_ERR, - ("Control DISABLE_SCRIPT failed, ret=%d\n", ret)); - return ret; - } - - return 0; -} - int ctdb_ctrl_set_ban_state(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct ctdb_client_context *client, int destnode, struct timeval timeout, diff --git a/ctdb/client/client_event.c b/ctdb/client/client_event.c new file mode 100644 index 0000000..6397259 --- /dev/null +++ b/ctdb/client/client_event.c @@ -0,0 +1,597 @@ +/* + Eventd client api + + Copyright (C) Amitay Isaacs 2016 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see <http://www.gnu.org/licenses/>. +*/ + +#include "replace.h" +#include "system/filesys.h" +#include "system/network.h" + +#include <talloc.h> +#include <tevent.h> + +#include "lib/util/debug.h" +#include "lib/util/tevent_unix.h" + +#include "common/logging.h" +#include "common/reqid.h" +#include "common/comm.h" + +#include "protocol/protocol_api.h" + +#include "client/client.h" + +struct ctdb_event_context { + struct reqid_context *idr; + struct comm_context *comm; + int fd; + + ctdb_client_callback_func_t callback; + void *private_data; +}; + +static int ctdb_event_connect(struct ctdb_event_context *eclient, + struct tevent_context *ev, + const char *sockpath); + +static int ctdb_event_context_destructor(struct ctdb_event_context *eclient); + +int ctdb_event_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, + const char *sockpath, struct ctdb_event_context **out) +{ + struct ctdb_event_context *eclient; + int ret; + + eclient = talloc_zero(mem_ctx, struct ctdb_event_context); + if (eclient == NULL) { + DEBUG(DEBUG_ERR, (__location__ " memory allocation error\n")); + return ENOMEM; + } + + ret = reqid_init(eclient, INT_MAX-200, &eclient->idr); + if (ret != 0) { + DEBUG(DEBUG_ERR, ("reqid_init() failed, ret=%d\n", ret)); + talloc_free(eclient); + return ret; + } + + eclient->fd = -1; + + ret = ctdb_event_connect(eclient, ev, sockpath); + if (ret != 0) { + talloc_free(eclient); + return ret; + } + + talloc_set_destructor(eclient, ctdb_event_context_destructor); + + *out = eclient; + return 0; +} + +static int ctdb_event_context_destructor(struct ctdb_event_context *eclient) +{ + if (eclient->fd != -1) { + close(eclient->fd); + eclient->fd = -1; + } + return 0; +} + +static void event_read_handler(uint8_t *buf, size_t buflen, + void *private_data); +static void event_dead_handler(void *private_data); + +static int ctdb_event_connect(struct ctdb_event_context *eclient, + struct tevent_context *ev, const char *sockpath) +{ + struct sockaddr_un addr; + size_t len; + int fd, ret; + + if (sockpath == NULL) { + DEBUG(DEBUG_ERR, ("socket path cannot be NULL\n")); + return EINVAL; + } + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + len = strlcpy(addr.sun_path, sockpath, sizeof(addr.sun_path)); + if (len >= sizeof(addr.sun_path)) { + DEBUG(DEBUG_ERR, ("socket path too long, len=%zu\n", + strlen(sockpath))); + return ENAMETOOLONG; + } + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd == -1) { + ret = errno; + DEBUG(DEBUG_ERR, ("socket() failed, errno=%d\n", ret)); + return ret; + } + + ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); + if (ret == -1) { + ret = errno; + DEBUG(DEBUG_ERR, ("connect() failed, errno=%d\n", ret)); + close(fd); + return ret; + } + eclient->fd = fd; + + ret = comm_setup(eclient, ev, fd, event_read_handler, eclient, + event_dead_handler, eclient, &eclient->comm); + if (ret != 0) { + DEBUG(DEBUG_ERR, ("comm_setup() failed, ret=%d\n", ret)); + close(fd); + eclient->fd = -1; + return ret; + } + + return 0; +} + +static void ctdb_event_msg_reply(struct ctdb_event_context *eclient, + uint8_t *buf, size_t buflen); + +static void event_read_handler(uint8_t *buf, size_t buflen, + void *private_data) +{ + struct ctdb_event_context *eclient = talloc_get_type_abort( + private_data, struct ctdb_event_context); + + ctdb_event_msg_reply(eclient, buf, buflen); +} + +static void event_dead_handler(void *private_data) +{ + struct ctdb_event_context *eclient = talloc_get_type_abort( + private_data, struct ctdb_event_context); + ctdb_client_callback_func_t callback = eclient->callback; + void *callback_data = eclient->private_data; + + talloc_free(eclient); + if (callback != NULL) { + callback(callback_data); + return; + } + + DEBUG(DEBUG_NOTICE, ("connection to daemon closed, exiting\n")); + exit(1); +} + +void ctdb_event_set_disconnect_callback(struct ctdb_event_context *eclient, + ctdb_client_callback_func_t callback, + void *private_data) +{ + eclient->callback = callback; + eclient->private_data = private_data; +} + +/* + * Handle eventd_request and eventd_reply + */ + +struct ctdb_event_msg_state { + struct ctdb_event_context *eclient; + + uint32_t reqid; + struct tevent_req *req; + struct ctdb_event_reply *reply; +}; + +static int ctdb_event_msg_state_destructor(struct ctdb_event_msg_state *state); +static void ctdb_event_msg_done(struct tevent_req *subreq); + +struct tevent_req *ctdb_event_msg_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_event_context *eclient, + struct ctdb_event_request *request) +{ + struct tevent_req *req, *subreq; + struct ctdb_event_msg_state *state; + uint8_t *buf; + size_t buflen; + int ret; + + req = tevent_req_create(mem_ctx, &state, struct ctdb_event_msg_state); + if (req == NULL) { + return NULL; + } + + state->eclient = eclient; + + state->reqid = reqid_new(eclient->idr, state); + if (state->reqid == REQID_INVALID) { + talloc_free(req); + return NULL; + } + state->req = req; + + talloc_set_destructor(state, ctdb_event_msg_state_destructor); + + ctdb_event_header_fill(&request->header, state->reqid); + + buflen = ctdb_event_request_len(request); + buf = talloc_size(state, buflen); + if (tevent_req_nomem(buf, req)) { + return tevent_req_post(req, ev); + } -- Samba Shared Repository