[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] 07/40: NEWS: Added command to execute a script.
From: |
gnunet |
Subject: |
[gnunet] 07/40: NEWS: Added command to execute a script. |
Date: |
Thu, 05 Oct 2023 08:57:10 +0200 |
This is an automated email from the git hooks/post-receive script.
martin-schanzenbach pushed a commit to branch master
in repository gnunet.
commit 40a5a650d3b61aca9474692416adeba7272e61b3
Author: t3sserakt <t3ss@posteo.de>
AuthorDate: Fri Jul 14 16:59:30 2023 +0200
NEWS: Added command to execute a script.
---
src/include/gnunet_testing_ng_lib.h | 206 ++++++++++++++++++++++-
src/testing/testing_api_cmd_exec_bash_script.c | 217 +++++++++++++++++++++++++
2 files changed, 422 insertions(+), 1 deletion(-)
diff --git a/src/include/gnunet_testing_ng_lib.h
b/src/include/gnunet_testing_ng_lib.h
index 77e9bd74a..98ba65b59 100644
--- a/src/include/gnunet_testing_ng_lib.h
+++ b/src/include/gnunet_testing_ng_lib.h
@@ -519,6 +519,20 @@ struct GNUNET_TESTING_Timer
unsigned int num_retries;
};
+/**
+ * Command to execute a script synchronously.
+ *
+ * @param label Label of the command.
+ * @param script The name of the script.
+ * @param script_argv The arguments of the script.
+*/
+const struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_exec_bash_script (const char *label,
+ const char *script,
+ char *const script_argv[],
+ int argc,
+ GNUNET_ChildCompletedCallback cb);
+
/**
* Retrieve peer identity from the test system with the unique node id.
@@ -603,6 +617,188 @@ GNUNET_TESTING_get_trait (const struct
GNUNET_TESTING_Trait *traits,
/* ****** Specific traits supported by this component ******* */
+typedef void *
+(*GNUNET_TESTING_notify_connect_cb) (struct GNUNET_TESTING_Interpreter *is,
+ const struct GNUNET_PeerIdentity *peer);
+
+
+/**
+ * Struct to store information needed in callbacks.
+ *
+ */
+struct ConnectPeersState
+{
+ /**
+ * Context for our asynchronous completion.
+ */
+ struct GNUNET_TESTING_AsyncContext ac;
+
+ GNUNET_TESTING_notify_connect_cb notify_connect;
+
+ /**
+ * The testing system of this node.
+ */
+ const struct GNUNET_TESTING_System *tl_system;
+
+ // Label of the cmd which started the test system.
+ const char *create_label;
+
+ /**
+ * Number globally identifying the node.
+ *
+ */
+ uint32_t num;
+
+ /**
+ * Label of the cmd to start a peer.
+ *
+ */
+ const char *start_peer_label;
+
+ /**
+ * The topology of the test setup.
+ */
+ struct GNUNET_TESTING_NetjailTopology *topology;
+
+ /**
+ * Connections to other peers.
+ */
+ struct GNUNET_TESTING_NodeConnection *node_connections_head;
+
+ struct GNUNET_TESTING_Interpreter *is;
+
+ /**
+ * Number of connections.
+ */
+ unsigned int con_num;
+
+ /**
+ * Number of additional connects this cmd will wait for not triggered by
this cmd.
+ */
+ unsigned int additional_connects;
+
+ /**
+ * Number of connections we already have a notification for.
+ */
+ unsigned int con_num_notified;
+
+ /**
+ * Number of additional connects this cmd will wait for not triggered by
this cmd we already have a notification for.
+ */
+ unsigned int additional_connects_notified;
+
+ /**
+ * Flag indicating, whether the command is waiting for peers to connect that
are configured to connect.
+ */
+ unsigned int wait_for_connect;
+};
+
+
+struct GNUNET_TESTING_StartPeerState
+{
+ /**
+ * Context for our asynchronous completion.
+ */
+ struct GNUNET_TESTING_AsyncContext ac;
+
+ /**
+ * The ip of a node.
+ */
+ char *node_ip;
+
+ /**
+ * Receive callback
+ */
+ struct GNUNET_MQ_MessageHandler *handlers;
+
+ /**
+ * GNUnet configuration file used to start a peer.
+ */
+ char *cfgname;
+
+ /**
+ * Peer's configuration
+ */
+ struct GNUNET_CONFIGURATION_Handle *cfg;
+
+ /**
+ * struct GNUNET_TESTING_Peer returned by GNUNET_TESTING_peer_configure.
+ */
+ struct GNUNET_TESTING_Peer *peer;
+
+ /**
+ * Peer identity
+ */
+ struct GNUNET_PeerIdentity id;
+
+ /**
+ * Peer's transport service handle
+ */
+ struct GNUNET_TRANSPORT_CoreHandle *th;
+
+ /**
+ * Application handle
+ */
+ struct GNUNET_TRANSPORT_ApplicationHandle *ah;
+
+ /**
+ * Peer's PEERSTORE Handle
+ */
+ struct GNUNET_PEERSTORE_Handle *ph;
+
+ /**
+ * Hello get task
+ */
+ struct GNUNET_SCHEDULER_Task *rh_task;
+
+ /**
+ * Peer's transport get hello handle to retrieve peer's HELLO message
+ */
+ struct GNUNET_PEERSTORE_IterateContext *pic;
+
+ /**
+ * Hello
+ */
+ char *hello;
+
+ /**
+ * Hello size
+ */
+ size_t hello_size;
+
+ /**
+ * The label of the command which was started by calling
GNUNET_TESTING_cmd_system_create.
+ */
+ char *system_label;
+
+ /**
+ * An unique number to identify the peer
+ */
+ unsigned int no;
+
+ /**
+ * A map with struct GNUNET_MQ_Handle values for each peer this peer
+ * is connected to.
+ */
+ struct GNUNET_CONTAINER_MultiShortmap *connected_peers_map;
+
+ /**
+ * Test setup for this peer.
+ */
+ const struct GNUNET_TESTING_System *tl_system;
+
+ /**
+ * Callback which is called on neighbour connect events.
+ */
+ GNUNET_TESTING_notify_connect_cb notify_connect;
+
+ /**
+ * Flag indicating, if udp broadcast should be switched on.
+ */
+ enum GNUNET_GenericReturnValue broadcast;
+};
+
+
/**
* Create headers for a trait with name @a name for
* statically allocated data of type @a type.
@@ -697,7 +893,15 @@ GNUNET_TESTING_get_trait (const struct
GNUNET_TESTING_Trait *traits,
*/
#define GNUNET_TESTING_SIMPLE_TRAITS(op) \
op (batch_cmds, struct GNUNET_TESTING_Command *) \
- op (process, struct GNUNET_OS_Process *)
+ op (process, struct GNUNET_OS_Process *) \
+ op (peer_id, const struct GNUNET_PeerIdentity) \
+ op (connected_peers_map, const struct GNUNET_CONTAINER_MultiShortmap) \
+ op (hello_size, const size_t) \
+ op (hello, const char) \
+ op (application_handle, const struct GNUNET_TRANSPORT_ApplicationHandle) \
+ op (connect_peer_state, const struct ConnectPeersState) \
+ op (state, const struct GNUNET_TESTING_StartPeerState) \
+ op (broadcast, const enum GNUNET_GenericReturnValue)
/**
diff --git a/src/testing/testing_api_cmd_exec_bash_script.c
b/src/testing/testing_api_cmd_exec_bash_script.c
new file mode 100644
index 000000000..5b9f5cbbb
--- /dev/null
+++ b/src/testing/testing_api_cmd_exec_bash_script.c
@@ -0,0 +1,217 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2023 GNUnet e.V.
+
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
+
+ GNUnet 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
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @file testing_api_cmd_local_test_prepared.c
+ * @brief cmd to block the interpreter loop until all peers started.
+ * @author t3sserakt
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_testing_ng_lib.h"
+
+#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
+
+struct BashScriptState
+{
+ /**
+ * Context for our asynchronous completion.
+ */
+ struct GNUNET_TESTING_AsyncContext ac;
+
+ /**
+ * Callback handed over to the command, which should
+ * be called upon death or completion of the script.
+ */
+ GNUNET_ChildCompletedCallback cb;
+
+ // Child Wait handle
+ struct GNUNET_ChildWaitHandle *cwh;
+
+ /**
+ * The process id of the script.
+ */
+ struct GNUNET_OS_Process *start_proc;
+
+ /**
+ * Script this cmd will execute.
+ */
+ const char *script;
+
+
+ /**
+ * Arguments for the script
+ */
+ char **script_argv;
+
+ /**
+ * Size of script_argv.
+ */
+ int argc;
+};
+
+/**
+ * The cleanup function of this cmd frees resources the cmd allocated.
+ *
+ */
+static void
+exec_bash_script_cleanup (void *cls)
+{
+ struct BashScriptState *bss = cls;
+
+ if (NULL != bss->cwh)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Cancel child\n");
+ GNUNET_wait_child_cancel (bss->cwh);
+ bss->cwh = NULL;
+ }
+ if (NULL != bss->start_proc)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Kill process\n");
+ GNUNET_assert (0 ==
+ GNUNET_OS_process_kill (bss->start_proc,
+ SIGKILL));
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_OS_process_wait (bss->start_proc));
+ GNUNET_OS_process_destroy (bss->start_proc);
+ bss->start_proc = NULL;
+ }
+ GNUNET_free (bss);
+}
+
+/**
+ * Callback which will be called if the setup script finished.
+ *
+ */
+static void
+child_completed_callback (void *cls,
+ enum GNUNET_OS_ProcessStatusType type,
+ long unsigned int exit_code)
+{
+ struct BashScriptState *bss = cls;
+
+ GNUNET_OS_process_destroy (bss->start_proc);
+ bss->start_proc = NULL;
+ bss->cwh = NULL;
+ if (0 == exit_code)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Child succeeded!\n",
+ exit_code);
+ GNUNET_TESTING_async_finish (&bss->ac);
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Child failed with error %lu!\n",
+ exit_code);
+ GNUNET_TESTING_async_fail (&bss->ac);
+ }
+ bss->cb (cls, type, exit_code);
+}
+
+/**
+ * Run method of the command created by the interpreter to wait for another
+ * command to finish.
+ *
+ */
+static void
+exec_bash_script_run (void *cls,
+ struct GNUNET_TESTING_Interpreter *is)
+{
+ struct BashScriptState *bss = cls;
+ enum GNUNET_GenericReturnValue helper_check;
+ char *argv[bss->argc + 2];
+
+ char *data_dir;
+ char *script_name;
+
+ data_dir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR);
+ GNUNET_asprintf (&script_name, "%s%s", data_dir, bss->script);
+
+ helper_check = GNUNET_OS_check_helper_binary (
+ script_name,
+ GNUNET_YES,
+ NULL);
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "script_name %s\n",
+ script_name);
+
+ if (GNUNET_NO == helper_check)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "No SUID for %s!\n",
+ script_name);
+ GNUNET_TESTING_interpreter_fail (is);
+ return;
+ }
+ if (GNUNET_SYSERR == helper_check)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "%s not found!\n",
+ script_name);
+ GNUNET_TESTING_interpreter_fail (is);
+ return;
+ }
+ argv[0] = script_name;
+ if (NULL != bss->script_argv)
+ {
+ for (int i = 0; i < bss->argc;i++)
+ argv[i + 1] = bss->script_argv[i];
+ }
+ argv[bss->argc] = NULL;
+
+ bss->start_proc = GNUNET_OS_start_process_vap (GNUNET_OS_INHERIT_STD_ERR,
+ NULL,
+ NULL,
+ NULL,
+ script_name,
+ argv);
+ bss->cwh = GNUNET_wait_child (bss->start_proc,
+ &child_completed_callback,
+ bss);
+ GNUNET_break (NULL != bss->cwh);
+}
+
+const struct GNUNET_TESTING_Command
+GNUNET_TESTING_cmd_exec_bash_script (const char *label,
+ const char *script,
+ char *const script_argv[],
+ int argc,
+ GNUNET_ChildCompletedCallback cb)
+{
+ struct BashScriptState *bss;
+
+ bss = GNUNET_new (struct BashScriptState);
+ bss->script = script;
+ bss->script_argv = script_argv;
+ bss->argc = argc;
+ bss->cb = cb;
+
+ return GNUNET_TESTING_command_new (bss,
+ label,
+ &exec_bash_script_run,
+ &exec_bash_script_cleanup,
+ NULL,
+ &bss->ac);
+}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [gnunet] 01/40: NEWS: Added __attribute__((deprecated)) to the old transport API, (continued)
- [gnunet] 01/40: NEWS: Added __attribute__((deprecated)) to the old transport API, gnunet, 2023/10/05
- [gnunet] 06/40: TNG: Accidentally removed code., gnunet, 2023/10/05
- [gnunet] 02/40: NEWS: Added __attribute__((deprecated)) to the old transport API, gnunet, 2023/10/05
- [gnunet] 09/40: NEWS: Moved start peer command to testing subsystem., gnunet, 2023/10/05
- [gnunet] 05/40: TNG: Deactivated all tests which rely on the old transport api., gnunet, 2023/10/05
- [gnunet] 12/40: TNG: Fixed bug that QueueEntry of another queue still holds reference to PendingMessage., gnunet, 2023/10/05
- [gnunet] 13/40: NEWS: Changed new hello uri api to allow to change the expiration time, gnunet, 2023/10/05
- [gnunet] 22/40: NEWS: Code moved to the core package to get rid of circular dependencies., gnunet, 2023/10/05
- [gnunet] 16/40: TOPOLOGY: Exchanged peerinfo api to store hellos with new peerstore api., gnunet, 2023/10/05
- [gnunet] 19/40: HELLO: Cli tool for changing hello files in contrib can change file from old to new hello design., gnunet, 2023/10/05
- [gnunet] 07/40: NEWS: Added command to execute a script.,
gnunet <=
- [gnunet] 17/40: PEERSTORE: change watch to return actual values, before watching., gnunet, 2023/10/05
- [gnunet] 32/40: Merge branch 'master' into l20integration, gnunet, 2023/10/05
- [gnunet] 29/40: TNG: Fixed syntax., gnunet, 2023/10/05
- [gnunet] 03/40: News: Merge branch 'l20integration' of ssh://git.gnunet.org/gnunet into l20integration, gnunet, 2023/10/05
- [gnunet] 36/40: Fix warnings; CADET not FTBFS because old hello removed, gnunet, 2023/10/05
- [gnunet] 33/40: Merge branch 'master' into l20integration, gnunet, 2023/10/05
- [gnunet] 18/40: NEWS: The old hello design replaced by the new hello design., gnunet, 2023/10/05
- [gnunet] 39/40: Make fs and cadet build again; cadet hello handling suspicious, gnunet, 2023/10/05
- [gnunet] 25/40: Hello: Changed address and hello format to new TNG format., gnunet, 2023/10/05
- [gnunet] 38/40: Remove more traces of old transport, gnunet, 2023/10/05