summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 3582ecb)
raw | patch | inline | side by side (parent: 3582ecb)
author | Sebastian Harl <sh@tokkee.org> | |
Thu, 10 Apr 2014 19:13:18 +0000 (21:13 +0200) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Thu, 10 Apr 2014 19:13:18 +0000 (21:13 +0200) |
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.
commands to the server in a non-interactive way. After handling the reply from
the last command, the process exits.
doc/sysdb.1.txt | patch | blob | history | |
src/Makefile.am | patch | blob | history | |
src/tools/sysdb/main.c | patch | blob | history |
diff --git a/doc/sysdb.1.txt b/doc/sysdb.1.txt
index f2838eb6b230e9927c97b78f3e27429ba4ac81df..b53a4f0091b1915dee110a493961e81826c3d009 100644 (file)
--- a/doc/sysdb.1.txt
+++ b/doc/sysdb.1.txt
The username used to authenticate against the server. Defaults to the
current user.
+*-c* '<command>'::
+ 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 8bd82149163643967aa3a5e3d833b769d41d609d..f6df34a25e7cdd16ac80ea4a06564ddf689cd785 100644 (file)
--- a/src/Makefile.am
+++ b/src/Makefile.am
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 b20e0ca4d65e3f0de245e358459402de54c77bb0..991e1ffb6d8e744252309646f4741e67abfe901d 100644 (file)
--- a/src/tools/sysdb/main.c
+++ b/src/tools/sysdb/main.c
# 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 <errno.h>
" 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"
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)
{
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;
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;
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");