/******************************************************************************* * 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 Vadim Revyakin */ #ifdef HAVE_CONFIG_H #include #endif #ifndef WIN32 #include #endif #include "u/libu.h" #include "wsman-types.h" #include "wsman-faults.h" #include "wsman-soap-message.h" #include "wsman-server-api.h" #include "wsman-server.h" #include "wsman-dispatcher.h" #include "wsman-soap.h" #include "wsman-plugins.h" #ifdef ENABLE_EVENTING_SUPPORT #include "wsman-cimindication-processor.h" static char *uri_subsRepository; #endif #if 0 static void debug_message_handler(const char *str, debug_level_e level, void *user_data) { int log_pid = getpid(); char *log_name = u_strdup_printf("wsmand[%d]", log_pid); openlog(log_name, 0, LOG_DAEMON); syslog(LOG_INFO, "%s", str); closelog(); u_free(log_name); } #endif void wsman_server_read_plugin_config(void *arg, char *config_file) { lnode_t *node; SoapH soap = (SoapH) arg; WsManListenerH * listener = (WsManListenerH *)soap->listener; if (config_file) { debug("reading config file 2"); dictionary *ini; ini = iniparser_new(config_file); if (ini) { listener->config = ini; } } node = list_first(listener->plugins); while (node) { WsManPlugin *p = (WsManPlugin *) node->list_data; p->set_config = dlsym(p->p_handle, "set_config"); if (listener->config && p->set_config) { p->set_config(p->p_handle, listener->config); } else { debug("no configuration available for plugin: %s", p->p_name); } node = list_next(listener->plugins, node); } } /* * Create server config (from ini-style config file) * * call wsman_server_destroy_config() to de-allocate the returned pointer * */ ServerConfig *wsman_server_create_config(char *config_file) { SoapH soap = NULL; dictionary *ini; WsManListenerH *listener = wsman_dispatch_list_new(); WsContextH cntx; if (config_file) { debug("reading config file 1"); ini = iniparser_new(config_file); if (ini) { listener->config = ini; } } cntx = wsman_init_plugins(listener); if (cntx != NULL) { soap = ws_context_get_runtime(cntx); if (listener) soap->listener = (WsManListenerH *)listener; } else { u_free(listener); } //debug_add_handler (debug_message_handler, DEBUG_LEVEL_ALWAYS, NULL); return (ServerConfig *)soap; } void wsman_server_destroy_config(ServerConfig *config) { SoapH soap = (SoapH)config; if (soap == NULL) return; if (soap->listener) { #if 0 if (soap->listener->config) { iniparser_free(soap->listener->config); } #endif u_free(soap->listener); } soap_destroy(soap); } void wsman_server_get_response(void *arg, void *msg) { SoapH soap = (SoapH) arg; dispatch_inbound_call(soap,(WsmanMessage *)msg, NULL); } #ifdef ENABLE_EVENTING_SUPPORT void wsman_server_set_subscription_repos(char *repos) { uri_subsRepository = u_strdup(repos); } void *wsman_server_get_subscription_repos() { return uri_subsRepository; } void wsman_event_init(void *arg) { SoapH soap = (SoapH)arg; WsContextH cntx = soap->cntx; SubsRepositoryOpSetH ops = wsman_init_subscription_repository(cntx, (char *)wsman_server_get_subscription_repos()); list_t *subs_list = list_create(-1); debug("subscription_repository_uri = %s", soap->uri_subsRepository); if(ops->load_subscription(soap->uri_subsRepository, subs_list) == 0) { lnode_t *node = list_first(subs_list); while(node) { SubsRepositoryEntryH entry = (SubsRepositoryEntryH)node->list_data; if(wsman_clean_subsrepository(cntx->soap, entry) == 0) { debug("load subscription %s", entry->uuid); wsman_repos_notification_dispatcher(cntx, entry, list_count(cntx->subscriptionMemList)); } else u_free(entry->strdoc); u_free(entry->uuid); u_free(entry); list_delete(subs_list, node); lnode_destroy(node); node = list_first(subs_list); } } list_destroy(subs_list); wsman_init_event_pool(cntx, NULL); } void wsman_receive_cim_indication(void *arg, char *uuid, void *msg) { SoapH soap = (SoapH) arg; CimxmlMessage *cimxml_msg = msg; cimxml_context *cntx = NULL; cntx = u_malloc(sizeof(cimxml_context)); cntx->soap = soap; cntx->uuid = uuid; CIM_Indication_call(cntx, cimxml_msg, NULL); } #endif