X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Fovsdb-client.c;h=e7d3b50def7d95d95340b8ec30aab0e10aaada6e;hb=847c7448532ddf90f28ace17233f4993e403f6f2;hp=6e0068125fcb03070b3f6862d1074d54690ed8ca;hpb=a8425c53c5785856cabe80295f0cea0135febdb6;p=openvswitch diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c index 6e006812..e7d3b50d 100644 --- a/ovsdb/ovsdb-client.c +++ b/ovsdb/ovsdb-client.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -27,12 +28,14 @@ #include "command-line.h" #include "column.h" #include "compiler.h" +#include "daemon.h" #include "dynamic-string.h" #include "json.h" #include "jsonrpc.h" #include "ovsdb.h" #include "ovsdb-error.h" #include "stream.h" +#include "stream-ssl.h" #include "table.h" #include "timeval.h" #include "util.h" @@ -53,6 +56,9 @@ static int output_width; /* --no-headings: Whether table output should include headings. */ static int output_headings = true; +/* --pretty: Flags to pass to json_to_string(). */ +static int json_flags = JSSF_SORT; + static const struct command all_commands[]; static void usage(void) NO_RETURN; @@ -61,6 +67,7 @@ static void parse_options(int argc, char *argv[]); int main(int argc, char *argv[]) { + proctitle_init(argc, argv); set_program_name(argv[0]); time_init(); vlog_init(); @@ -73,13 +80,22 @@ main(int argc, char *argv[]) static void parse_options(int argc, char *argv[]) { + enum { + OPT_BOOTSTRAP_CA_CERT = UCHAR_MAX + 1 + }; static struct option long_options[] = { {"wide", no_argument, &output_width, INT_MAX}, {"format", required_argument, 0, 'f'}, {"no-headings", no_argument, &output_headings, 0}, + {"pretty", no_argument, &json_flags, JSSF_PRETTY | JSSF_SORT}, {"verbose", optional_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, + DAEMON_LONG_OPTIONS, +#ifdef HAVE_OPENSSL + {"bootstrap-ca-cert", required_argument, 0, OPT_BOOTSTRAP_CA_CERT}, + STREAM_SSL_LONG_OPTIONS +#endif {0, 0, 0, 0}, }; char *short_options = long_options_to_short_options(long_options); @@ -121,6 +137,16 @@ parse_options(int argc, char *argv[]) vlog_set_verbosity(optarg); break; + DAEMON_OPTION_HANDLERS + +#ifdef HAVE_OPENSSL + STREAM_SSL_OPTION_HANDLERS + + case OPT_BOOTSTRAP_CA_CERT: + stream_ssl_set_ca_cert_file(optarg, true); + break; +#endif + case '?': exit(EXIT_FAILURE); @@ -154,12 +180,14 @@ usage(void) " monitor contents of (COLUMNs in) TABLE on SERVER\n" " Valid SELECTs are: initial, insert, delete, modify\n", program_name, program_name); - stream_usage("SERVER", true, true); + stream_usage("SERVER", true, true, true); printf("\nOutput formatting options:\n" " -f, --format=FORMAT set output formatting to FORMAT\n" " (\"table\", \"html\", or \"csv\"\n" " --wide don't limit TTY lines to 79 bytes\n" - " --no-headings omit table heading row\n"); + " --no-headings omit table heading row\n" + " --pretty pretty-print JSON in output"); + daemon_usage(); vlog_usage(); printf("\nOther options:\n" " -h, --help display this help message\n" @@ -209,7 +237,7 @@ open_jsonrpc(const char *server) static void print_json(struct json *json) { - char *string = json_to_string(json, JSSF_SORT); + char *string = json_to_string(json, json_flags); fputs(string, stdout); free(string); } @@ -236,7 +264,8 @@ fetch_schema_from_rpc(struct jsonrpc *rpc) struct ovsdb_schema *schema; int error; - request = jsonrpc_create_request("get_schema", json_array_create_empty()); + request = jsonrpc_create_request("get_schema", json_array_create_empty(), + NULL); error = jsonrpc_transact_block(rpc, request, &reply); if (error) { ovs_fatal(error, "transaction failed"); @@ -629,14 +658,14 @@ do_transact(int argc UNUSED, char *argv[]) transaction = parse_json(argv[2]); rpc = open_jsonrpc(argv[1]); - request = jsonrpc_create_request("transact", transaction); + request = jsonrpc_create_request("transact", transaction, NULL); error = jsonrpc_transact_block(rpc, request, &reply); if (error) { ovs_fatal(error, "transaction failed"); } if (reply->error) { ovs_fatal(error, "transaction returned error: %s", - json_to_string(reply->error, JSSF_SORT)); + json_to_string(reply->error, json_flags)); } print_json(reply->result); putchar('\n'); @@ -795,7 +824,7 @@ do_monitor(int argc, char *argv[]) json_object_put(monitor_requests, argv[2], monitor_request); monitor = json_array_create_2(json_null_create(), monitor_requests); - request = jsonrpc_create_request("monitor", monitor); + request = jsonrpc_create_request("monitor", monitor, NULL); request_id = json_clone(request->id); jsonrpc_send(rpc, request); for (;;) { @@ -804,6 +833,7 @@ do_monitor(int argc, char *argv[]) error = jsonrpc_recv_block(rpc, &msg); if (error) { + ovsdb_schema_destroy(schema); ovs_fatal(error, "%s: receive failed", argv[1]); } @@ -813,6 +843,15 @@ do_monitor(int argc, char *argv[]) } else if (msg->type == JSONRPC_REPLY && json_equal(msg->id, request_id)) { monitor_print(msg->result, table, &columns, true); + fflush(stdout); + if (get_detach()) { + /* daemonize() closes the standard file descriptors. We output + * to stdout, so we need to save and restore STDOUT_FILENO. */ + int fd = dup(STDOUT_FILENO); + daemonize(); + dup2(fd, STDOUT_FILENO); + close(fd); + } } else if (msg->type == JSONRPC_NOTIFY && !strcmp(msg->method, "update")) { struct json *params = msg->params; @@ -821,8 +860,10 @@ do_monitor(int argc, char *argv[]) && params->u.array.elems[0]->type == JSON_NULL) { monitor_print(params->u.array.elems[1], table, &columns, false); + fflush(stdout); } } + jsonrpc_msg_destroy(msg); } }