3 files changed, 152 insertions(+), 37 deletions(-)
lib/ais/plugin.c |  164 ++++++++++++++++++++++++++++++++++++++++++++----------
lib/ais/utils.c  |   20 ++++--
lib/ais/utils.h  |    5 +


# HG changeset patch
# User Andrew Beekhof <[EMAIL PROTECTED]>
# Date 1226332723 -3600
# Branch stable-1.0
# Node ID b3733717f0e092045b0e538896cd5135fc7c16e7
# Parent  01daf5d2d73c241062c95a194414d29918cb661e
High: ais: Hook up the openais.conf config logging options

diff --git a/lib/ais/plugin.c b/lib/ais/plugin.c
--- a/lib/ais/plugin.c
+++ b/lib/ais/plugin.c
@@ -260,16 +260,144 @@ __attribute__ ((constructor)) static voi
     lcr_component_register (&crm_comp_ver0);
 }
 
+#ifdef AIS_COROSYNC
+#include <corosync/engine/config.h>
+#endif
+
+struct objdb_iface_ver0 *crm_objdb = NULL;
+
+static unsigned int get_config_section(char *name) 
+{
+    int rc = 0;
+    unsigned int objdb_handle = 0;
+    
+#ifdef AIS_COROSYNC
+    unsigned int top_handle = 0;
+    crm_objdb->object_find_create(OBJECT_PARENT_HANDLE, name, strlen(name), &top_handle);
+    rc = crm_objdb->object_find_next (top_handle, &objdb_handle);
+#endif
+    
+#ifdef AIS_WHITETANK 
+    crm_objdb->object_find_reset (OBJECT_PARENT_HANDLE);
+    rc = crm_objdb->object_find(OBJECT_PARENT_HANDLE, name, strlen (name), &objdb_handle);
+#endif
+
+    if(rc < 0) {
+	ais_info("No additional configuration supplied for: %s", name);
+	objdb_handle = 0;
+    } else {
+	ais_info("Processing additional %s options...", name);
+    }
+    return objdb_handle;
+}
+
+
+/* Create our own local copy of the config so we can navigate it */
+static void process_ais_conf(void)
+{
+    int rc = 0;
+    void *objdb_p = NULL;
+    void *config_p = NULL;
+    char *value = NULL;
+    char *config_iface = NULL;
+    char *error_string = NULL;
+    unsigned int objdb_handle = 0;
+    unsigned int config_handle = 0;
+    unsigned int config_version = 0;
+    struct config_iface_ver0 *config = NULL;
+    
+    ais_info("Reading configure");
+    /*
+     * Load the object database interface
+     */
+    rc = lcr_ifact_reference(&objdb_handle, "objdb", 0, &objdb_p, 0);
+    AIS_CHECK(rc != -1, ais_err("Error loading configuration interface"); return);
+    
+    crm_objdb = (struct objdb_iface_ver0 *)objdb_p;
+    crm_objdb->objdb_init();
+    
+    /*
+     * Bootstrap in the default configuration parser or use
+     * the openais default built in parser if the configuration parser
+     * isn't overridden
+     */
+    config_iface = getenv("OPENAIS_DEFAULT_CONFIG_IFACE");
+    if (!config_iface) {
+	config_iface = "aisparser";
+    }
+    
+    rc = lcr_ifact_reference (
+	&config_handle, config_iface, config_version, &config_p, 0);
+    
+    config = (struct config_iface_ver0 *)config_p;
+    AIS_CHECK(rc != -1, return);
+    
+    rc = config->config_readconfig(crm_objdb, &error_string);
+    AIS_CHECK(rc != -1, ais_err("Error reading configuration: %s", error_string); return);
+    
+    objdb_handle = get_config_section("logging");
+
+    get_config_opt(objdb_handle, "debug", &value, "on");
+    if(ais_str_eq(value, "on")) {
+	plugin_log_level = LOG_DEBUG;
+	setenv("HA_debug",  "1", 1);
+	
+    } else {
+	plugin_log_level = LOG_INFO;
+	setenv("HA_debug",  "0", 1);
+    }    
+    
+    get_config_opt(objdb_handle, "to_syslog", &value, "on");
+    if(ais_str_eq(value, "on")) {
+	get_config_opt(objdb_handle, "syslog_facility", &value, "daemon");
+	setenv("HA_logfacility",  value, 1);
+	
+    } else {
+	setenv("HA_logfacility",  "none", 1);
+    }
+
+    get_config_opt(objdb_handle, "to_file", &value, "off");
+    if(ais_str_eq(value, "on")) {
+	get_config_opt(objdb_handle, "logfile", &value, NULL);
+
+	if(value == NULL) {
+	    ais_err("Logging to a file requested but no log file specified");
+	} else {
+	    setenv("HA_logfile",  value, 1);
+	}
+    }
+
+#ifdef AIS_COROSYNC
+    crm_objdb->object_find_destroy (objdb_handle);
+#endif
+    
+    objdb_handle = get_config_section("pacemaker");
+    
+    get_config_opt(objdb_handle, "expected_nodes", &value, "2");
+    setenv("HA_expected_nodes", value, 1);
+    
+    get_config_opt(objdb_handle, "expected_votes", &value, "2");
+    setenv("HA_expected_votes", value, 1);
+    
+    get_config_opt(objdb_handle, "quorum_votes", &value, "1");
+    setenv("HA_votes", value, 1);
+
+#ifdef AIS_COROSYNC
+    crm_objdb->object_find_destroy (objdb_handle);
+#endif    
+}
+
+
 static void crm_plugin_init(void) 
 {
     int rc = 0;
     struct utsname us;
-    char *value = NULL;
-    unsigned int object_service_handle = 0;
 
 #ifdef AIS_WHITETANK 
     log_init ("crm");
 #endif
+
+    process_ais_conf();
     
     membership_list = g_hash_table_new_full(
 	g_direct_hash, g_direct_equal, NULL, destroy_ais_node);
@@ -278,30 +406,6 @@ static void crm_plugin_init(void)
     setenv("HA_COMPRESSION",  "bz2", 1);
     setenv("HA_cluster_type", "openais", 1);
     
-#if 0
-    objdb->object_find_reset (OBJECT_PARENT_HANDLE);
-    
-    if (objdb->object_find (
-	    OBJECT_PARENT_HANDLE, "pacemaker", strlen ("pacemaker"),
-	    &object_service_handle) != 0) {
-	object_service_handle = 0;
-	ais_info("No configuration supplied for pacemaker");
-    }
-#endif
-    
-    objdb_get_string(
-	object_service_handle, "logfacility", &value, "daemon");
-    setenv("HA_logfacility",  value, 1);
-    
-    objdb_get_string(object_service_handle, "initdead", &value, "20");
-    setenv("HA_initdead",  value, 1);
-    
-    objdb_get_string(object_service_handle, "debug", &value, "0");
-    setenv("HA_debug",  value, 1);
-
-    rc = atoi(value);
-    plugin_log_level = LOG_INFO+rc;
-
     if(system("echo 1 > /proc/sys/kernel/core_uses_pid") != 0) {
 	ais_perror("Could not enable /proc/sys/kernel/core_uses_pid");
     }
@@ -314,15 +418,17 @@ static void crm_plugin_init(void)
     local_uname = ais_strdup(us.nodename);
     local_uname_len = strlen(local_uname);
 
-    ais_info("Local hostname: %s", local_uname);
-    ais_info("Service: %d", CRM_SERVICE);
-
 #if AIS_WHITETANK
     local_nodeid = totempg_my_nodeid_get();
 #endif
 #if AIS_COROSYNC
     local_nodeid = crm_api->totem_nodeid_get();
 #endif
+
+    ais_info("Local node id: %u", local_nodeid);
+    ais_info("Local hostname: %s", local_uname);
+    ais_info("Service: %d", CRM_SERVICE);
+    
     update_member(local_nodeid, 0, 0, 1, 0, local_uname, CRM_NODE_MEMBER, NULL);
     
 }
diff --git a/lib/ais/utils.c b/lib/ais/utils.c
--- a/lib/ais/utils.c
+++ b/lib/ais/utils.c
@@ -531,19 +531,19 @@ ais_concat(const char *prefix, const cha
 	return new_str;
 }
 
-int objdb_get_string(
+extern struct objdb_iface_ver0 *crm_objdb;
+
+int get_config_opt(
     unsigned int object_service_handle,
     char *key, char **value, const char *fallback)
 {
     char *env_key = NULL;
     *value = NULL;
 
-#if AIS_COROSYNC
     if(object_service_handle > 0) {
-	crm_api->object_key_get(
+	crm_objdb->object_key_get(
 	    object_service_handle, key, strlen(key), (void**)value, NULL);
     }
-#endif
     
     if (*value) {
 	ais_info("Found '%s' for option %s", *value, key);
@@ -558,9 +558,15 @@ int objdb_get_string(
 	ais_info("Found '%s' in ENV for option %s", *value, key);
 	return 0;
     }
+
+    if(fallback) {
+	ais_info("Defaulting to '%s' for option %s", fallback, key);
+	*value = ais_strdup(fallback);
+
+    } else {
+	ais_info("No default for option %s", key);
+    }
     
-    ais_info("Defaulting to '%s' for option %s", fallback, key);
-    *value = ais_strdup(fallback);
     return -1;
 }
 
@@ -569,7 +575,7 @@ int objdb_get_int(
     char *key, unsigned int *int_value, const char *fallback)
 {
     char *value = NULL;
-    objdb_get_string(object_service_handle, key, &value, fallback);
+    get_config_opt(object_service_handle, key, &value, fallback);
     if (value) {
 	*int_value = atoi(value);
 	return 0;
diff --git a/lib/ais/utils.h b/lib/ais/utils.h
--- a/lib/ais/utils.h
+++ b/lib/ais/utils.h
@@ -35,6 +35,8 @@ static inline int libais_connection_acti
 #  include <openais/totem/totempg.h>
 #  include <openais/service/service.h>
 #  include <openais/lcr/lcr_comp.h>
+#  include <openais/lcr/lcr_ifact.h>
+#  include <openais/service/config.h>
 #  define openais_conn_partner_get(conn) conn
 #  define PLUGIN_FLOW_CONTROL_NOT_REQUIRED OPENAIS_FLOW_CONTROL_NOT_REQUIRED
 
@@ -56,6 +58,7 @@ extern int openais_dispatch_send (void *
 #  include <corosync/engine/coroapi.h>
 #  include <corosync/ipc_gen.h>
 #  include <corosync/lcr/lcr_comp.h>
+#  include <corosync/lcr/lcr_ifact.h>
 #  define openais_conn_partner_get(conn) crm_api->ipc_conn_partner_get(conn)
 #  define PLUGIN_FLOW_CONTROL_NOT_REQUIRED COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED
 
@@ -114,7 +117,7 @@ extern int objdb_get_int(unsigned int ob
 extern int objdb_get_int(unsigned int object_service_handle,
 			 char *key, unsigned int *int_value, const char *fallback);
 
-extern int objdb_get_string(unsigned int object_service_handle,
+extern int get_config_opt(unsigned int object_service_handle,
 			    char *key, char **value, const char *fallback);
 
 extern GHashTable *membership_list;
_______________________________________________
Pacemaker mailing list
[email protected]
http://list.clusterlabs.org/mailman/listinfo/pacemaker

Reply via email to