blob: 3c21014ab805330370f7e82f963058648248e800 [file]
/*******************************************************************************
* 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
*/
#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 "u/libu.h"
#include "wsman-client-api.h"
#include "wsman-client-transport.h"
#include "wsman-client-options.h"
#include "wsman-debug.h"
#if 0
static char *auth_methods[] = {
"basic",
"digest",
"ntlm",
NULL,
};
#endif
static const char **wsman_argv = NULL;
static int server_port = 0;
static char *cafile = NULL;
static char *username = NULL;
static char *password = NULL;
static char *server = "localhost";
static char *agent = NULL;
static char *url_path = NULL;
static char *authentication_method = NULL;
static char no_verify_peer = 0;
static int transport_timeout = 0;
static char *proxy = NULL;
static char *proxy_upwd = NULL;
static int debug_level = -1;
static char *test_case = NULL;
static int enum_max_elements = 0;
char enum_optimize = 0;
char enum_estimate = 0;
char dump_request = 0;
char step = 0;
char request_only = 0;
char cim_extensions = 0;
char cim_references = 0;
static char *enum_mode = NULL;
static char *binding_enum_mode = NULL;
static char *enum_context = NULL;
static char *cim_namespace = NULL;
static char *fragment = NULL;
static char *wsm_filter = NULL;
static char *wsm_dialect = NULL;
static char *input = NULL;
static unsigned long operation_timeout = 0;
static unsigned long max_envelope_size = 0;
static char *_action = NULL;
static char *config_file = NULL;
static char *output_file = NULL;
static char *resource_uri = NULL;
static char *invoke_method = NULL;
static char **properties = NULL;
WsActions action_data[] = {
{"get", WSMAN_ACTION_TRANSFER_GET},
{"put", WSMAN_ACTION_TRANSFER_PUT},
{"create", WSMAN_ACTION_TRANSFER_CREATE},
{"delete", WSMAN_ACTION_TRANSFER_DELETE},
{"enumerate", WSMAN_ACTION_ENUMERATION},
{"pull", WSMAN_ACTION_PULL},
{"release", WSMAN_ACTION_RELEASE},
{"invoke", WSMAN_ACTION_CUSTOM},
{"identify", WSMAN_ACTION_IDENTIFY},
{"test", WSMAN_ACTION_TEST},
{NULL, 0},
};
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"},
{"cafile", 'c', U_OPTION_ARG_STRING, &cafile,
"Certificate file", "<filename>"},
{"username", 'u', U_OPTION_ARG_STRING, &username,
"User name", "<username>"},
{"path", 'g', U_OPTION_ARG_STRING, &url_path,
"Path", "<path>"},
{"input", 'J', U_OPTION_ARG_STRING, &input,
"File with resource for Create and Put operations in XML, can be a SOAP envelope",
"<filename>"},
{"password", 'p', U_OPTION_ARG_STRING, &password,
"Password", "<password>"},
{"hostname", 'h', U_OPTION_ARG_STRING, &server,
"Host name", "<hostname>"},
{"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>"},
{"method", 'a', U_OPTION_ARG_STRING, &invoke_method,
"Method (Works only with 'invoke')", "<custom method>"},
{"prop", 'k', U_OPTION_ARG_STRING_ARRAY, &properties,
"Properties with key value pairs (For 'put', 'invoke' and 'create')",
"<key=val>"},
{"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, &no_verify_peer,
"Not to verify peer certificate", NULL},
{"transport-timeout", 'I', U_OPTION_ARG_INT, &transport_timeout,
"Transport timeout in seconds", "<time in sec>"},
{NULL}
};
u_option_entry_t request_options[] = {
{"filter", 'x', U_OPTION_ARG_STRING, &wsm_filter,
"Filter", "<filter>"},
{"dialect", 'D', U_OPTION_ARG_STRING, &wsm_dialect,
"Filter Dialect", "<dialect>"},
{"operation-timeout", 't', U_OPTION_ARG_INT, &operation_timeout,
"Operation timeout in seconds", "<time in sec>"},
{"max-envelope-size", 'e', U_OPTION_ARG_INT,
&max_envelope_size,
"maximal envelope size", "<size>"},
{"fragment", 'F', U_OPTION_ARG_STRING, &fragment,
"Fragment (Supported Dialects: XPATH)", "<fragment>"},
{NULL}
};
u_option_entry_t enum_options[] = {
{"max-elements", 'm', U_OPTION_ARG_INT, &enum_max_elements,
"Max Elements Per Pull/Optimized Enumeration",
"<max number of elements>"},
{"optimize", 'o', U_OPTION_ARG_NONE, &enum_optimize,
"Optimize enumeration results", NULL},
{"estimate-count", 'E', U_OPTION_ARG_NONE, &enum_estimate,
"Return estimation of total items", NULL},
{"enum-mode", 'M', U_OPTION_ARG_STRING, &enum_mode,
"Enumeration Mode", "epr|objepr"},
{"enum-context", 'U', U_OPTION_ARG_STRING, &enum_context,
"Enumeration Context (For use with Pull and Release)",
"<enum context>"},
{NULL}
};
u_option_entry_t cim_options[] = {
{"namespace", 'N', U_OPTION_ARG_STRING, &cim_namespace,
"CIM Namespace (default is root/cimv2)", "<namespace>"},
{"binding-enum-mode", 'B', U_OPTION_ARG_STRING,
&binding_enum_mode,
"CIM binding Enumeration Mode", "none|include|exclude"},
{"cim-extensions", 'T', U_OPTION_ARG_NONE, &cim_extensions,
"Show CIM Extensions", NULL},
{"references", 'W', U_OPTION_ARG_NONE, &cim_references,
"CIM References", NULL},
{NULL}
};
u_option_entry_t test_options[] = {
{"from-file", 'f', U_OPTION_ARG_STRING, &test_case,
"Send request from file", "<file name>"},
{"print-request", 'R', U_OPTION_ARG_NONE, &dump_request,
"print request on stdout", NULL},
{"request", 'Q', U_OPTION_ARG_NONE, &request_only,
"Only output reqest. Not send it.", NULL},
{"step", 'S', U_OPTION_ARG_NONE, &step,
"Do not perform multiple operations (do not pull data when enumerating)",
NULL},
//{ "print-response", 'N', 0, G_OPTION_ARG_NONE, &dump_response, "print all responses to stdout", NULL},
{NULL}
};
u_option_group_t *enum_group;
u_option_group_t *test_group;
u_option_group_t *cim_group;
u_option_group_t *req_flag_group;
u_option_context_t *opt_ctx;
opt_ctx = u_option_context_new("<action> <Resource Uri>");
enum_group = u_option_group_new("enumeration", "Enumeration",
"Enumeration Options");
test_group = u_option_group_new("tests", "Tests", "Test Cases");
cim_group = u_option_group_new("cim", "CIM", "CIM Options");
req_flag_group =
u_option_group_new("flags", "Flags", "Request Flags");
u_option_group_add_entries(enum_group, enum_options);
u_option_group_add_entries(test_group, test_options);
u_option_group_add_entries(cim_group, cim_options);
u_option_group_add_entries(req_flag_group, request_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, enum_group);
u_option_context_add_group(opt_ctx, test_group);
u_option_context_add_group(opt_ctx, cim_group);
u_option_context_add_group(opt_ctx, req_flag_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 = argv[2];
} else {
if (argv[1] && (strcmp(argv[1], "identify") == 0 ||
strcmp(argv[1], "test") == 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 = cafile ? 8888 : 8889;
}
if (url_path == NULL) {
url_path = "/wsman";
}
return TRUE;
}
const char *wsman_options_get_output_file(void)
{
return output_file;
}
const char *wsman_options_get_config_file(void)
{
return config_file;
}
int wsman_read_client_config(dictionary * ini)
{
if (iniparser_find_entry(ini, "client")) {
agent = iniparser_getstr(ini, "client:agent");
server_port = server_port ?
server_port : iniparser_getint(ini, "client:port", 80);
authentication_method = authentication_method ?
authentication_method :
iniparser_getstr(ini, "client:authentication_method");
} else {
return 0;
}
return 1;
}
void wsman_setup_transport_and_library_options()
{
// transport options
wsman_transport_set_auth_method(authentication_method);
if (proxy) {
wsman_transport_set_proxy(proxy);
if (proxy_upwd) {
wsman_transport_set_proxyauth(proxy_upwd);
}
}
if (cafile) {
wsman_transport_set_cafile(cafile);
}
wsman_transport_set_no_verify_peer(no_verify_peer);
wsman_transport_set_timeout(transport_timeout);
// library options
wsman_debug_set_level(debug_level);
}
const char **wsman_options_get_argv(void)
{
return wsman_argv;
}
int wsman_options_get_server_port(void)
{
return server_port;
}
unsigned long wsman_options_get_max_envelope_size(void)
{
return max_envelope_size;
}
unsigned long wsman_options_get_operation_timeout(void)
{
return operation_timeout;
}
char *wsman_options_get_cafile(void)
{
return cafile;
}
char *wsman_options_get_server(void)
{
if (server)
return server;
else
return "localhost";
}
char *wsman_options_get_invoke_method(void)
{
return invoke_method;
}
char *wsman_options_get_username(void)
{
return username;
}
char *wsman_options_get_password(void)
{
return password;
}
hash_t *wsman_options_get_properties(void)
{
int c = 0;
hash_t *h = hash_create(HASHCOUNT_T_MAX, 0, 0);
while (properties != NULL && properties[c] != NULL) {
char *cc[3];
u_tokenize1(cc, 2, properties[c], '=');
if (!hash_alloc_insert(h, cc[0], cc[1])) {
debug("hash_alloc_insert failed");
}
c++;
}
return h;
}
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;
}
char *wsman_options_get_resource_uri(void)
{
return resource_uri;
}
int wsman_options_get_max_elements(void)
{
return enum_max_elements;
}
char wsman_options_get_optimize_enum(void)
{
return enum_optimize;
}
char wsman_options_get_cim_ref(void)
{
return cim_references;
}
char wsman_options_get_cim_ext(void)
{
return cim_extensions;
}
char wsman_options_get_estimate_enum(void)
{
return enum_estimate;
}
char wsman_options_get_dump_request(void)
{
return dump_request;
}
char wsman_options_get_step_request(void)
{
return step;
}
char *wsman_options_get_enum_context(void)
{
return enum_context;
}
char *wsman_options_get_test_file(void)
{
return test_case;
}
char *wsman_options_get_input_file(void)
{
return input;
}
char *wsman_options_get_enum_mode(void)
{
return enum_mode;
}
char *wsman_options_get_binding_enum_mode(void)
{
return binding_enum_mode;
}
char *wsman_options_get_cim_namespace(void)
{
return cim_namespace;
}
char *wsman_options_get_fragment(void)
{
return fragment;
}
char *wsman_options_get_filter(void)
{
return wsm_filter;
}
char *wsman_options_get_dialect(void)
{
return wsm_dialect;
}
char *wsman_options_get_path(void)
{
return url_path;
}