From 6539bedcca48fd80e334e28550eda3ce2924f81d Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Thu, 10 Apr 2014 21:13:18 +0200 Subject: [PATCH] sysdb: Added support for the -c option. This option (which may be specified multiple times) may be used to send commands to the server in a non-interactive way. After handling the reply from the last command, the process exits. --- doc/sysdb.1.txt | 6 ++++ src/Makefile.am | 4 ++- src/tools/sysdb/main.c | 69 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 2 deletions(-) diff --git a/doc/sysdb.1.txt b/doc/sysdb.1.txt index f2838eb..b53a4f0 100644 --- a/doc/sysdb.1.txt +++ b/doc/sysdb.1.txt @@ -32,6 +32,12 @@ OPTIONS The username used to authenticate against the server. Defaults to the current user. +*-c* '':: + Send the specified command to the server after authenticating. This option + may be used multiple times. Each command will be send to the server + separately. Exit the process after handling the reply from the last + command. + *-h*:: Display a usage and help summary and exit. diff --git a/src/Makefile.am b/src/Makefile.am index 8bd8214..f6df34a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -105,7 +105,9 @@ libsysdb_scanner_la_SOURCES = tools/sysdb/scanner.l libsysdb_scanner_la_CFLAGS = -DBUILD_DATE="\"$$( date --utc '+%F %T' ) (UTC)\"" sysdb_SOURCES = tools/sysdb/main.c include/client/sysdb.h \ tools/sysdb/command.c tools/sysdb/command.h \ - tools/sysdb/input.c tools/sysdb/input.h + tools/sysdb/input.c tools/sysdb/input.h \ + core/object.c include/core/object.h \ + utils/llist.c include/utils/llist.h sysdb_CFLAGS = -DBUILD_DATE="\"$$( date --utc '+%F %T' ) (UTC)\"" \ $(AM_CFLAGS) @READLINE_CFLAGS@ sysdb_LDADD = libsysdb_scanner.la libsysdbclient.la @READLINE_LIBS@ diff --git a/src/tools/sysdb/main.c b/src/tools/sysdb/main.c index b20e0ca..991e1ff 100644 --- a/src/tools/sysdb/main.c +++ b/src/tools/sysdb/main.c @@ -29,11 +29,13 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ +#include "tools/sysdb/command.h" #include "tools/sysdb/input.h" #include "client/sysdb.h" #include "client/sock.h" #include "utils/error.h" +#include "utils/llist.h" #include "utils/strbuf.h" #include @@ -142,6 +144,7 @@ exit_usage(char *name, int status) " default: "DEFAULT_SOCKET"\n" " -U USER the username to connect as\n" " default: %s\n" +" -c CMD execute the specified command and then exit\n" "\n" " -h display this help and exit\n" " -V display the version number and copyright\n" @@ -167,6 +170,38 @@ exit_version(void) exit(0); } /* exit_version */ +static int +execute_commands(sdb_client_t *client, sdb_llist_t *commands) +{ + sdb_llist_iter_t *iter; + int status = 0; + + iter = sdb_llist_get_iter(commands); + if (! iter) { + sdb_log(SDB_LOG_ERR, "Failed to iterate commands"); + return 1; + } + + while (sdb_llist_iter_has_next(iter)) { + sdb_object_t *obj = sdb_llist_iter_get_next(iter); + if (sdb_client_send(client, CONNECTION_QUERY, + (uint32_t)strlen(obj->name), obj->name) <= 0) { + sdb_log(SDB_LOG_ERR, "Failed to send command '%s' to server", + obj->name); + status = 1; + break; + } + if (sdb_command_print_reply(client)) { + sdb_log(SDB_LOG_ERR, "Failed to read reply from server"); + status = 1; + break; + } + } + + sdb_llist_iter_destroy(iter); + return status; +} /* execute_commands */ + int main(int argc, char **argv) { @@ -177,9 +212,10 @@ main(int argc, char **argv) char hist_file[1024] = ""; sdb_input_t input = SDB_INPUT_INIT; + sdb_llist_t *commands = NULL; while (42) { - int opt = getopt(argc, argv, "H:U:hV"); + int opt = getopt(argc, argv, "H:U:c:hV"); if (-1 == opt) break; @@ -192,6 +228,30 @@ main(int argc, char **argv) user = optarg; break; + case 'c': + { + sdb_object_t *obj; + + if (! commands) + commands = sdb_llist_create(); + if (! commands) { + sdb_log(SDB_LOG_ERR, "Failed to create list object"); + exit(1); + } + + if (! (obj = sdb_object_create_T(optarg, sdb_object_t))) { + sdb_log(SDB_LOG_ERR, "Failed to create object"); + exit(1); + } + if (sdb_llist_append(commands, obj)) { + sdb_log(SDB_LOG_ERR, "Failed to append command to list"); + sdb_object_deref(obj); + exit(1); + } + sdb_object_deref(obj); + } + break; + case 'h': exit_usage(argv[0], 0); break; @@ -225,6 +285,13 @@ main(int argc, char **argv) exit(1); } + if (commands) { + int status = execute_commands(input.client, commands); + sdb_llist_destroy(commands); + sdb_client_destroy(input.client); + exit(status); + } + sdb_log(SDB_LOG_INFO, "SysDB client "SDB_CLIENT_VERSION_STRING SDB_CLIENT_VERSION_EXTRA"\n"); -- 2.30.2