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