diff options
author | Liang Hou <houliang@intel.com> | 2008-01-28 06:25:25 +0000 |
---|---|---|
committer | Liang Hou <houliang@intel.com> | 2008-01-28 06:25:25 +0000 |
commit | 07fb1d0cdaf2347b83a708a50eafa3d4ca02df04 (patch) | |
tree | 705a6e784be1cdcc141411995df0dc4c8a843130 /src | |
parent | c34a225f30b4e78133dbba02219f6b4c082a5350 (diff) | |
download | wsmancli-07fb1d0cdaf2347b83a708a50eafa3d4ca02df04.tar.gz wsmancli-07fb1d0cdaf2347b83a708a50eafa3d4ca02df04.tar.xz wsmancli-07fb1d0cdaf2347b83a708a50eafa3d4ca02df04.zip |
add initial wseventmgr.c
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 10 | ||||
-rw-r--r-- | src/wseventmgr.c | 586 |
2 files changed, 592 insertions, 4 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 8b50b88..c34591c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,11 +6,13 @@ CFLAGS = \ wsman_LDADD = \ $(OPENWSMAN_LIBS) \ -lwsman_curl_client_transport +wseventmgr_LDADD = \ + $(wsman_LDADD) -wsman_SOURCES = wsman.c +wsman_SOURCES = wsman.c +wseventmgr_SOURCES = wseventmgr.c bin_PROGRAMS = \ - wsman - - + wsman \ + wseventmgr diff --git a/src/wseventmgr.c b/src/wseventmgr.c new file mode 100644 index 0000000..3822b91 --- /dev/null +++ b/src/wseventmgr.c @@ -0,0 +1,586 @@ +/******************************************************************************* + * Copyright (C) 2004-2006 Intel Corp. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of Intel Corp. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *******************************************************************************/ + +/** + * @author Anas Nashif + * @author Vadim Revyakin + * @author Liang Hou + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#include <errno.h> +#include <time.h> + +#include <wsman-client-api.h> +#include <wsman-client-transport.h> +#include <wsman-debug.h> + + +#if __linux__ +extern char *getpass (const char *__prompt); +#endif + +static int server_port = 0; +static char *cainfo = NULL; +static char *cert = NULL; +static char *sslkey = NULL; +static char *endpoint = NULL; +static char *username = NULL; +static char *password = NULL; +static char *server = "localhost"; +static char *url_path = NULL; +static char *authentication_method = NULL; +static char noverify_peer = 0; +static char noverify_host = 0; + +static int transport_timeout = 0; +static char *proxy = NULL; +static char *proxy_upwd = NULL; + + +static int debug_level = -1; +static char *encoding = NULL; +char dump_request = 0; +char request_only = 0; + +static char *wsm_filter = NULL; +static char *wsm_dialect = NULL; +static char *event_delivery_mode = NULL; +static char *event_delivery_sec_mode = NULL; +static char *event_delivery_uri = NULL; +static int event_subscription_expire = 0; +static int event_heartbeat = 0; +static int event_sendbookmark =0; +static char *event_subscription_id = NULL; +static char *event_reference_properties = NULL; +static char *event_username = NULL; +static char *event_password = NULL; +static char *event_thumbprint = NULL; +static char *enum_context = NULL; +static int eventsink_enabled = 0; + +static char *cim_namespace = NULL; + +static char *_action = NULL; +static char *config_file = NULL; +static char *output_file = NULL; +static char *resource_uri_opt = NULL; + +struct _WsActions { + char *action; + int value; +}; +typedef struct _WsActions WsActions; + +WsActions action_data[] = { + {"pull", WSMAN_ACTION_PULL}, + {"subscribe", WSMAN_ACTION_SUBSCRIBE}, + {"unsubscribe", WSMAN_ACTION_UNSUBSCRIBE}, + {"renew", WSMAN_ACTION_RENEW}, + {"test", WSMAN_ACTION_TEST}, + {NULL, 0}, +}; + +WsActions delivery_mode[] = { + {"push", WSMAN_DELIVERY_PUSH}, + {"pushwithack", WSMAN_DELIVERY_PUSHWITHACK}, + {"events", WSMAN_DELIVERY_EVENTS}, + {"pull", WSMAN_DELIVERY_PULL}, + {NULL, 0} +}; + +WsActions delivery_sec_mode[] = { + {"httpbasic", WSMAN_DELIVERY_SEC_HTTP_BASIC}, + {"httpdigest", WSMAN_DELIVERY_SEC_HTTP_DIGEST}, + {"httpsbasic", WSMAN_DELIVERY_SEC_HTTPS_BASIC}, + {"httpsdigest", WSMAN_DELIVERY_SEC_HTTPS_DIGEST}, + {"httpsmutual", WSMAN_DELIVERY_SEC_HTTPS_MUTUAL}, + {"httpsmutualbasic", WSMAN_DELIVERY_SEC_HTTPS_MUTUAL_BASIC}, + {"httpsmutualdigest", WSMAN_DELIVERY_SEC_HTTPS_MUTUAL_DIGEST}, + {NULL, 0} +}; + +static int wsman_options_get_action(void) +{ + int op = 0; + int i; + for (i = 0; action_data[i].action != NULL; i++) { + if (strcmp(action_data[i].action, _action) == 0) { + op = action_data[i].value; + break; + } + } + return op; +} + +static char wsman_parse_options(int argc, char **argv) +{ + char retval = 0; + u_error_t *error = NULL; + + u_option_entry_t options[] = { + {"debug", 'd', U_OPTION_ARG_INT, &debug_level, + "Set the verbosity of debugging output.", "1-6"}, + {"print-request", 'R', U_OPTION_ARG_NONE, &dump_request, + "print request on stdout", NULL}, + {"encoding", 'j', U_OPTION_ARG_STRING, &encoding, + "Set request message encoding"}, + {"cacert", 'c', U_OPTION_ARG_STRING, &cainfo, + "Certificate file to verify the peer", "<filename>"}, + {"cert", 'A', U_OPTION_ARG_STRING, &cert, + "Certificate file. The certificate must be in PEM format.", "<filename>"}, + {"sslkey", 'K', U_OPTION_ARG_STRING, &sslkey, + "SSL Key.", "<key>"}, + {"username", 'u', U_OPTION_ARG_STRING, &username, + "User name", "<username>"}, + {"path", 'g', U_OPTION_ARG_STRING, &url_path, + "Path", "<path>"}, + {"password", 'p', U_OPTION_ARG_STRING, &password, + "Password", "<password>"}, + {"hostname", 'h', U_OPTION_ARG_STRING, &server, + "Host name", "<hostname>"}, + {"endpoint", 'b', U_OPTION_ARG_STRING, &endpoint, + "End point", "<url>"}, + {"port", 'P', U_OPTION_ARG_INT, &server_port, + "Server Port", "<port>"}, + {"proxy", 'X', U_OPTION_ARG_STRING, &proxy, + "Proxy name", "<proxy>"}, + {"proxyauth", 'Y', U_OPTION_ARG_STRING, &proxy_upwd, + "Proxy user:pwd", "<proxyauth>"}, + {"auth", 'y', U_OPTION_ARG_STRING, &authentication_method, + "Authentication Method", "<basic|digest|gss>"}, + {"config-file", 'C', U_OPTION_ARG_STRING, &config_file, + "Alternate configuration file", "<file>"}, + {"out-file", 'O', U_OPTION_ARG_STRING, &output_file, + "Write output to file", "<file>"}, + {"noverifypeer", 'V', U_OPTION_ARG_NONE, &noverify_peer, + "Not to verify peer certificate", NULL}, + {"noverifyhost", 'v', U_OPTION_ARG_NONE, &noverify_host, + "Not to verify hostname", NULL}, + {"transport-timeout", 'I', U_OPTION_ARG_INT, &transport_timeout, + "Transport timeout in seconds", "<time in sec>"}, + {NULL} + }; + + + u_option_entry_t event_options[] = { + {"filter", 'x', U_OPTION_ARG_STRING, &wsm_filter, + "Filter", "<filter>"}, + {"dialect", 'D', U_OPTION_ARG_STRING, &wsm_dialect, + "Filter Dialect", "<dialect>"}, + {"delivery-mode", 'G', U_OPTION_ARG_STRING, &event_delivery_mode, + "Four delivery modes available: push/pushwithack/events/pull", + "<mode>"}, + {"delivery-sec-mode", 's', U_OPTION_ARG_STRING, &event_delivery_sec_mode, + "Four delivery modes available: httpbasic/httpdigest/httpsbasic/httpsdigest/httpsmutual/httpsmutualbasic/httpsmutualdigest", + "<mode>"}, + {"delivery-username", 'U', U_OPTION_ARG_STRING, &event_username, + "username for the eventing receiver", + "<username>"}, + {"delivery-password", 'P', U_OPTION_ARG_STRING, &event_password, + "password for the eventing receiver", + "<password>"}, + {"delivery-thumbprint", 'T', U_OPTION_ARG_STRING, &event_thumbprint, + "ceritificate thumbprint of the eventing receiver", + "<thumbprint>"}, + {"notification-uri", 'Z', U_OPTION_ARG_STRING, &event_delivery_uri, + "Where notifications are sent", + "<uri>"}, + {"subscription-expiry-time", 'r', U_OPTION_ARG_INT, &event_subscription_expire, + "subscription expiry time in seconds", + "<seconds>"}, + {"heartbeat",'H', U_OPTION_ARG_INT, &event_heartbeat, + "Send hearbeat in an interval", + "<seconds>"}, + {"bookmark", 'l', U_OPTION_ARG_NONE, &event_sendbookmark, + "Send bookmark",NULL}, + {"subscription-identifier", 'i', U_OPTION_ARG_STRING, &event_subscription_id, + "Used to specify which subscription", + "<uuid:XXX>"}, + {"event-reference-properties", 'r', U_OPTION_ARG_STRING, &event_reference_properties, + "Event Reference Properties, correlation of Events with Subscription", + "<xml string>"}, + {"enum-context", 'C', U_OPTION_ARG_STRING, &enum_context, + "Events enumeration Context (For use with Pull)", + "<enum context>"}, + {"enable-eventsink", 'E', U_OPTION_ARG_NONE, &eventsink_enabled, + "Enable this tool as event sink", + NULL}, + {NULL} + }; + + u_option_group_t *event_group; + u_option_group_t *req_flag_group; + + u_option_context_t *opt_ctx; + opt_ctx = u_option_context_new("<action> <Resource Uri>"); + event_group = u_option_group_new("event", "Event subscription", "Subscription Options"); + req_flag_group = + u_option_group_new("flags", "Flags", "Request Flags"); + + u_option_group_add_entries(event_group, event_options); + + u_option_context_set_ignore_unknown_options(opt_ctx, FALSE); + u_option_context_add_main_entries(opt_ctx, options, "wsman"); + u_option_context_add_group(opt_ctx, event_group); + + retval = u_option_context_parse(opt_ctx, &argc, &argv, &error); + u_option_context_free(opt_ctx); + + if (error) { + if (error->message) + printf("%s\n", error->message); + u_error_free(error); + return FALSE; + } + + if (argc > 2) { + _action = argv[1]; + resource_uri_opt = argv[2]; + } else { + if (argv[1] && (strcmp(argv[1], "identify") == 0 || + strcmp(argv[1], "test") == 0 || + strcmp(argv[1], "anonid") == 0 || + strcmp(argv[1], "unsubscribe") == 0 || + strcmp(argv[1], "renew") == 0)) { + _action = argv[1]; + } else { + fprintf(stderr, + "Error: operation can not be completed." + " Action or/and Resource Uri missing.\n"); + return FALSE; + } + } + u_error_free(error); + + // set default options + if (server_port == 0) { + server_port = cainfo ? 8888 : 8889; + } + if (url_path == NULL) { + url_path = "/wsman"; + } + return TRUE; +} + + + + +static void wsman_output(WsManClient * cl, WsXmlDocH doc) +{ + FILE *f = stdout; + const char *filename = output_file; + WS_LASTERR_Code err; + + err = wsmc_get_last_error(cl); + if (err != WS_LASTERR_OK) { + return; + } + if (!doc) { + error("doc with NULL content"); + return; + } + if (filename) { + f = fopen(filename, "w+"); + if (f == NULL) { + error("Could not open file for writing"); + return; + } + } + ws_xml_dump_node_tree(f, ws_xml_get_doc_root(doc)); + if (f != stdout) { + fclose(f); + } + return; +} + + +static void initialize_logging(void) +{ + debug_add_handler(wsman_debug_message_handler, DEBUG_LEVEL_ALWAYS, + NULL); +} + + + +static void +request_usr_pwd( WsManClient *client, wsman_auth_type_t auth, + char **username, + char **password) +{ + char *pw; + char user[21]; + char *p; + + fprintf(stdout,"Authentication failed, please retry\n"); + /* + fprintf(stdout, "%s authentication is used\n", + wsmc_transport_get_auth_name( auth)); + */ + printf("User name: "); + fflush(stdout); + if ( (p = fgets(user, 20, stdin) ) != NULL ) + { + + if (strchr(user, '\n')) + (*(strchr(user, '\n'))) = '\0'; + *username = u_strdup_printf ("%s", user); + } else { + *username = NULL; + } + + pw = (char *)getpass("Password: "); + *password = u_strdup_printf ("%s", pw); +} + + + +static int wsman_options_get_delivery_mode(void) +{ + int mode = 0; + int i; + for (i = 0; delivery_mode[i].action != NULL; i++) { + if (strcmp(delivery_mode[i].action, event_delivery_mode) == 0) { + mode = delivery_mode[i].value; + break; + } + } + return mode; +} + +static int wsman_options_get_delivery_sec_mode(void) +{ + int mode = 0; + int i; + for (i = 0; delivery_sec_mode[i].action != NULL; i++) { + if (strcmp(delivery_sec_mode[i].action, event_delivery_sec_mode) == 0) { + mode = delivery_sec_mode[i].value; + break; + } + } + return mode; +} + + +int main(int argc, char **argv) +{ + int retVal = 0; + int op; + WsManClient *cl; + WsXmlDocH doc; + WsXmlDocH rqstDoc; + client_opt_t *options; + char *resource_uri_with_selectors; + char *event_mode, *delivery_uri; + char *resource_uri = NULL; + char subscontext[512]; + if (!wsman_parse_options(argc, argv)) { + exit(EXIT_FAILURE); + } + + initialize_logging(); + // wsmc_transport_init(NULL); + options = wsmc_options_init(); + + debug("Certificate: %s", cainfo); + + if (endpoint) { + cl = wsmc_create_from_uri(endpoint); + } else { + cl = wsmc_create(server, + server_port, + url_path, + cainfo? "https" : "http", + username, + password); + } + + wsmc_transport_set_auth_request_func(cl , &request_usr_pwd ); + + + if (cl == NULL) { + error("Null Client"); + exit(EXIT_FAILURE); + } + // transport options + wsman_transport_set_auth_method(cl, authentication_method); + if (proxy) { + wsman_transport_set_proxy(cl, proxy); + if (proxy_upwd) { + wsman_transport_set_proxyauth(cl, proxy_upwd); + } + } + + if (cainfo) { + wsman_transport_set_cainfo(cl, cainfo); + } + if (cert) { + wsman_transport_set_cert(cl, cert); + } + if (sslkey) { + wsman_transport_set_cert(cl, sslkey); + } + wsman_transport_set_verify_peer(cl, !noverify_peer); + wsman_transport_set_verify_host(cl, !noverify_host); + wsman_transport_set_timeout(cl, transport_timeout); + + // library options + wsman_debug_set_level(debug_level); + /* + * Setup Resource URI and Selectors + */ + resource_uri_with_selectors = resource_uri_opt; + if (resource_uri_with_selectors && + strcmp(resource_uri_with_selectors,CIM_ALL_AVAILABLE_CLASSES) != 0) { + wsmc_set_options_from_uri(resource_uri_with_selectors, + options); + wsmc_remove_query_string(resource_uri_with_selectors, + &resource_uri); + } else if (resource_uri_with_selectors) { + wsmc_remove_query_string(resource_uri_with_selectors, + &resource_uri); + } + op = wsman_options_get_action(); + if (encoding) { + wsmc_set_encoding(cl, encoding); + } + if (dump_request) { + wsmc_set_action_option(options, FLAG_DUMP_REQUEST); + } + if (wsm_filter) { + options->filter = wsm_filter; + } + if (wsm_dialect) { + options->dialect = wsm_dialect; + } + options->cim_ns = cim_namespace; + + switch (op) { + case WSMAN_ACTION_PULL: + doc = + wsmc_action_pull(cl, resource_uri, options, + enum_context); + wsman_output(cl, doc); + if (doc) { + ws_xml_destroy_doc(doc); + } + break; + case WSMAN_ACTION_SUBSCRIBE: + event_mode = event_delivery_mode; + delivery_uri = event_delivery_uri; + if(event_sendbookmark) + wsmc_set_action_option(options, FLAG_EVENT_SENDBOOKMARK); + if(event_delivery_mode) + options->delivery_mode = wsman_options_get_delivery_mode(); + if(event_delivery_sec_mode) + options->delivery_sec_mode = wsman_options_get_delivery_sec_mode(); + if(event_username) + options->delivery_username = event_username; + if(event_password) + options->delivery_password = event_password; + if(event_thumbprint) + options->delivery_certificatethumbprint = event_thumbprint; + if(event_delivery_uri) + options->delivery_uri = event_delivery_uri; + if(event_heartbeat) + options->heartbeat_interval = event_heartbeat; + if(event_subscription_expire) + options->expires = event_subscription_expire; + if(wsm_dialect) + options->dialect = wsm_dialect; + if(event_reference_properties) + options->reference = event_reference_properties; + rqstDoc = wsmc_action_subscribe(cl, resource_uri, options); + wsman_output(cl, rqstDoc); + if (rqstDoc) { + ws_xml_destroy_doc(rqstDoc); + } + break; + case WSMAN_ACTION_UNSUBSCRIBE: + snprintf(subscontext, 512 , "<wsa:ReferenceParameters xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" \ + xmlns:wse=\"http://schemas.xmlsoap.org/ws/2004/08/eventing\"><wse:Identifier>%s</wse:Identifier> \ + </wsa:ReferenceParameters>", event_subscription_id); + rqstDoc = wsmc_action_unsubscribe(cl, resource_uri, options, subscontext); + wsman_output(cl, rqstDoc); + if (rqstDoc) { + ws_xml_destroy_doc(rqstDoc); + } + break; + case WSMAN_ACTION_RENEW: + if(event_subscription_expire) + options->expires = event_subscription_expire; + snprintf(subscontext, 512 , "<wsa:ReferenceParameters xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" \ + xmlns:wse=\"http://schemas.xmlsoap.org/ws/2004/08/eventing\"><wse:Identifier>%s</wse:Identifier> \ + </wsa:ReferenceParameters>", event_subscription_id); + rqstDoc = wsmc_action_renew(cl, resource_uri, options, subscontext); + wsman_output(cl, rqstDoc); + if (rqstDoc) { + ws_xml_destroy_doc(rqstDoc); + } + break; + default: + fprintf(stderr, "Action not supported\n"); + retVal = 1; + } + + + if (wsmc_get_response_code(cl) != 200) { + fprintf(stderr, "Connection failed. response code = %ld\n", + wsmc_get_response_code(cl)); + if (wsmc_get_fault_string(cl)) { + fprintf(stderr, "%s\n", + wsmc_get_fault_string(cl)); + } + } + wsmc_options_destroy(options); + wsmc_transport_fini(cl); + wsmc_release(cl); + if(op == WSMAN_ACTION_PULL && strcmp(event_delivery_mode, "pull") \ + && eventsink_enabled) { +// to do here: start related event sink service according to options +// start_eventsink(options); + } +#ifdef DEBUG_VERBOSE + printf(" ****** Transfer Time = %ull usecs ******\n", + get_transfer_time()); +#endif + return retVal; + +} |