diff --git a/cib/Makefile.am b/cib/Makefile.am
index b4040905e5..7d712e4630 100644
--- a/cib/Makefile.am
+++ b/cib/Makefile.am
@@ -1,67 +1,66 @@
 #
 # Copyright (C) 2004 Andrew Beekhof
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 # as published by the Free Software Foundation; either version 2
 # of the License, or (at your option) any later version.
 # 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #
 MAINTAINERCLEANFILES    = Makefile.in
 
 INCLUDES        = -I$(top_builddir)/include  -I$(top_srcdir)/include  \
 		  -I$(top_builddir)/libltdl  -I$(top_srcdir)/libltdl
 
 EXTRA_DIST	= cib.pam
 
 hadir		= $(sysconfdir)/ha.d
 halibdir	= $(CRM_DAEMON_DIR)
 commmoddir	= $(halibdir)/modules/comm
 
 COMMONLIBS	= $(top_builddir)/lib/common/libcrmcommon.la	\
 		  $(top_builddir)/lib/cib/libcib.la
 
 ## binary progs
 halib_PROGRAMS	= cib cibmon
-sbin_PROGRAMS   = cibpipe
 
 if BUILD_HELP
 man8_MANS =	
 %.8:	%
 	echo Creating $@
 	chmod a+x $<
 	$(HELP2MAN) --output $@ --no-info --section 8 --name "Part of the Pacemaker cluster resource manager" $(top_builddir)/cib/$<
 endif
 
 ## SOURCES
 noinst_HEADERS          = callbacks.h cibio.h cibmessages.h common.h notify.h
 
 cib_SOURCES		= io.c messages.c notify.c	\
 			callbacks.c main.c remote.c common.c
 
 cib_LDADD		= $(top_builddir)/lib/cluster/libcrmcluster.la \
 			  $(COMMONLIBS) $(CRYPTOLIB) $(CLUSTERLIBS)
 
 cibmon_SOURCES		= cibmon.c
 cibmon_LDADD		= $(COMMONLIBS) 
 
 cibpipe_SOURCES		= cibpipe.c
 
 cibpipe_LDADD		= $(COMMONLIBS) $(CRYPTOLIB)
 cibpipe_CFLAGS		= -DCIBPIPE=1
 
 clean-generic:
 	rm -f *.log *.debug *.xml *~
 
 install-exec-local:
 #	cp -f $(top_srcdir)/crm/cib/cib.pam $(DESTDIR)/etc/pam.d/cib
 
 uninstall-local:
diff --git a/cib/cibpipe.c b/cib/cibpipe.c
deleted file mode 100644
index 8895f7fa7b..0000000000
--- a/cib/cibpipe.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* 
- * Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <crm_internal.h>
-
-#include <sys/param.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <stdlib.h>
-#include <errno.h>
-
-#include <crm/crm.h>
-#include <crm/cib.h>
-#include <crm/msg_xml.h>
-
-#include <crm/common/xml.h>
-
-#include "common.h"
-
-#ifdef HAVE_GETOPT_H
-#  include <getopt.h>
-#endif
-
-void usage(const char *cmd, int exit_status);
-
-struct cib_func_entry {
-    const char *op;
-    gboolean read_only;
-    cib_op_t fn;
-};
-
-/* *INDENT-OFF* */
-static struct cib_func_entry cib_pipe_ops[] = {
-    {CIB_OP_QUERY,      TRUE,  cib_process_query},
-    {CIB_OP_MODIFY,     FALSE, cib_process_modify},
-    {CIB_OP_APPLY_DIFF, FALSE, cib_process_diff},
-    {CIB_OP_BUMP,       FALSE, cib_process_bump},
-    {CIB_OP_REPLACE,    FALSE, cib_process_replace},
-    {CIB_OP_CREATE,     FALSE, cib_process_create},
-    {CIB_OP_DELETE,     FALSE, cib_process_delete},
-    {CIB_OP_ERASE,      FALSE, cib_process_erase},
-};
-/* *INDENT-ON* */
-
-#define OPTARGS	"V?o:QDUCEX:t:MBfRx:P5S$"
-
-int
-main(int argc, char **argv)
-{
-    int lpc;
-    int flag;
-    int rc = 0;
-    int argerr = 0;
-    int max_msg_types = DIMOF(cib_pipe_ops);
-
-    int command_options = 0;
-    gboolean changed = FALSE;
-    gboolean force_flag = FALSE;
-    gboolean dangerous_cmd = FALSE;
-
-    char *buffer = NULL;
-    const char *section = NULL;
-    const char *input_xml = NULL;
-    const char *input_file = NULL;
-    const char *cib_action = NULL;
-
-    xmlNode *input = NULL;
-    xmlNode *output = NULL;
-    xmlNode *result_cib = NULL;
-    xmlNode *current_cib = NULL;
-
-    gboolean query = FALSE;
-    cib_op_t *fn = NULL;
-
-#ifdef HAVE_GETOPT_H
-    int option_index = 0;
-
-    static struct option long_options[] = {
-        {CIB_OP_ERASE, 0, 0, 'E'},
-        {CIB_OP_QUERY, 0, 0, 'Q'},
-        {CIB_OP_CREATE, 0, 0, 'C'},
-        {CIB_OP_REPLACE, 0, 0, 'R'},
-        {CIB_OP_UPDATE, 0, 0, 'U'},
-        {CIB_OP_MODIFY, 0, 0, 'M'},
-        {"patch", 0, 0, 'P'},
-        {CIB_OP_DELETE, 0, 0, 'D'},
-        {CIB_OP_BUMP, 0, 0, 'B'},
-        {"md5-sum", 0, 0, '5'},
-
-        {"force", 0, 0, 'f'},
-        {"xml-file", 1, 0, 'x'},
-        {"xml-text", 1, 0, 'X'},
-        {"xml-save", 1, 0, 'S'},
-        {"obj_type", 1, 0, 'o'},
-
-        {"version", 0, 0, '$'},
-        {"verbose", 0, 0, 'V'},
-        {"help", 0, 0, '?'},
-
-        {0, 0, 0, 0}
-    };
-#endif
-
-    crm_log_cli_init("cib_pipe");
-
-    while (1) {
-#ifdef HAVE_GETOPT_H
-        flag = getopt_long(argc, argv, OPTARGS, long_options, &option_index);
-#else
-        flag = getopt(argc, argv, OPTARGS);
-#endif
-        if (flag == -1)
-            break;
-
-        switch (flag) {
-            case 'E':
-                cib_action = CIB_OP_ERASE;
-                dangerous_cmd = TRUE;
-                break;
-            case 'Q':
-                cib_action = CIB_OP_QUERY;
-                break;
-            case 'P':
-                cib_action = CIB_OP_APPLY_DIFF;
-                break;
-            case 'S':
-                cib_action = CIB_OP_SYNC;
-                break;
-            case 'U':
-            case 'M':
-                cib_action = CIB_OP_MODIFY;
-                break;
-            case 'R':
-                cib_action = CIB_OP_REPLACE;
-                break;
-            case 'C':
-                cib_action = CIB_OP_CREATE;
-                break;
-            case 'D':
-                cib_action = CIB_OP_DELETE;
-                break;
-            case '5':
-                cib_action = "md5-sum";
-                break;
-            case 'd':
-                cib_action = CIB_OP_DELETE_ALT;
-                break;
-            case 'm':
-                cib_action = CIB_OP_ISMASTER;
-                command_options |= cib_scope_local;
-                break;
-            case 'B':
-                cib_action = CIB_OP_BUMP;
-                break;
-            case 'o':
-                crm_trace("Option %c => %s", flag, optarg);
-                section = crm_strdup(optarg);
-                break;
-            case 'x':
-                crm_trace("Option %c => %s", flag, optarg);
-                input_file = crm_strdup(optarg);
-                break;
-            case 'X':
-                crm_trace("Option %c => %s", flag, optarg);
-                input_xml = crm_strdup(optarg);
-                break;
-            case 'f':
-                force_flag = TRUE;
-                command_options |= cib_quorum_override;
-                break;
-            case 'V':
-                crm_bump_log_level();
-                break;
-            case '?':          /* Help message */
-                usage(crm_system_name, LSB_EXIT_OK);
-                break;
-            case '$':          /* Version message */
-                crm_help(flag, LSB_EXIT_OK);
-                break;
-            default:
-                ++argerr;
-                break;
-        }
-    }
-
-    if (cib_action == NULL) {
-        ++argerr;
-    }
-
-    if (optind > argc) {
-        ++argerr;
-    }
-
-    if (argerr) {
-        usage(crm_system_name, LSB_EXIT_GENERIC);
-    }
-
-    if (dangerous_cmd && force_flag == FALSE) {
-        fprintf(stderr, "The supplied command is considered dangerous."
-                "  To prevent accidental destruction of the cluster,"
-                " the --force flag is required in order to proceed.\n");
-        fflush(stderr);
-        usage(crm_system_name, LSB_EXIT_GENERIC);
-    }
-
-    if (input_file != NULL) {
-        input = filename2xml(input_file);
-        if (input == NULL) {
-            fprintf(stderr, "Couldn't parse input file: %s\n", input_file);
-            return 1;
-        }
-
-    } else if (input_xml != NULL) {
-        input = string2xml(input_xml);
-        if (input == NULL) {
-            fprintf(stderr, "Couldn't parse input string: %s\n", input_xml);
-            return 1;
-        }
-    }
-
-    if (input && safe_str_eq(cib_action, CIB_OP_QUERY)) {
-        current_cib = copy_xml(input);
-
-    } else {
-        current_cib = stdin2xml();
-        if (current_cib == NULL && safe_str_neq(cib_action, CIB_OP_ERASE)) {
-            fprintf(stderr, "Couldn't parse existing CIB from STDIN.\n");
-            return 1;
-        }
-    }
-
-    if (current_cib == NULL) {
-        current_cib = createEmptyCib();
-    }
-    result_cib = copy_xml(current_cib);
-
-    if (safe_str_eq(cib_action, "md5-sum")) {
-        char *digest = NULL;
-
-        digest = calculate_on_disk_digest(current_cib);
-        fprintf(stdout, "%s\n", crm_str(digest));
-        free(digest);
-        return 0;
-    }
-
-    /* read local config file */
-    if (cib_action == NULL) {
-        crm_err("No operation specified");
-        return cib_operation;
-    }
-
-    for (lpc = 0; lpc < max_msg_types; lpc++) {
-        if (safe_str_eq(cib_action, cib_pipe_ops[lpc].op)) {
-            fn = &(cib_pipe_ops[lpc].fn);
-            query = cib_pipe_ops[lpc].read_only;
-            break;
-        }
-    }
-
-    if (fn == NULL) {
-        rc = cib_NOTSUPPORTED;
-    } else {
-        rc = cib_perform_op(cib_action, command_options, fn, query,
-                            section, NULL, input, TRUE, &changed,
-                            current_cib, &result_cib, NULL, &output);
-    }
-
-    if (rc != cib_ok) {
-        fprintf(stderr, "Call failed: %s\n", cib_error2string(rc));
-        fprintf(stdout, "%c", 0);
-        return -rc;
-    }
-
-    crm_log_args(argc, argv);
-
-    if (output) {
-        buffer = dump_xml_formatted(output);
-    } else {
-        buffer = dump_xml_formatted(result_cib);
-    }
-
-    fprintf(stdout, "%s\n", buffer);
-    fflush(stdout);
-
-    crm_info("Done");
-    return 0;
-}
-
-void
-usage(const char *cmd, int exit_status)
-{
-    FILE *stream;
-
-    stream = exit_status ? stderr : stdout;
-
-    fprintf(stream, "usage: %s -Q -(x|X)\n", cmd);
-    fprintf(stream, "usage: %s -Q -(x|X) | %s [-%s] | %s [-%s] | ...\n",
-            cmd, cmd, OPTARGS, cmd, OPTARGS);
-    fprintf(stream, "usage: cibadmin -Q  | %s [-%s] | %s [-%s] | ...\n",
-            cmd, OPTARGS, cmd, OPTARGS);
-
-    fprintf(stream, "\nOptions\n");
-    fprintf(stream, "\t--%s (-%c) <type>\tobject type being operated on\n", "obj_type", 'o');
-    fprintf(stream, "\t\tValid values are:" " nodes, resources, constraints, crm_config, status\n");
-    fprintf(stream, "\t--%s (-%c)\tturn on debug info."
-            "  additional instance increase verbosity\n", "verbose", 'V');
-    fprintf(stream, "\t--%s (-%c)\tthis help message\n", "help", '?');
-
-    fprintf(stream, "\nCommands\n");
-    fprintf(stream, "\t--%s (-%c)\tErase the contents of the whole CIB\n", CIB_OP_ERASE, 'E');
-    fprintf(stream, "\t--%s (-%c)\t\n", CIB_OP_QUERY, 'Q');
-    fprintf(stream, "\t--%s (-%c)\tCreate an object that does not yet exist\n", CIB_OP_CREATE, 'C');
-    fprintf(stream, "\t--%s (-%c)\tRecursivly update an object in the CIB\n", CIB_OP_UPDATE, 'U');
-    fprintf(stream,
-            "\t--%s (-%c)\tFind the object somewhere in the CIB's XML tree and update it as --"
-            CIB_OP_UPDATE " would\n", CIB_OP_MODIFY, 'M');
-    fprintf(stream, "\t--%s (-%c)\tRecursivly replace an object in the CIB\n", CIB_OP_REPLACE, 'R');
-    fprintf(stream, "\t--%s (-%c)\t\n", CIB_OP_DELETE, 'D');
-    fprintf(stream, "\t\t\tDelete the first object matching the supplied criteria\n");
-    fprintf(stream, "\t\t\tEg. <op id=\"rsc1_op1\" name=\"monitor\"/>\n");
-    fprintf(stream,
-            "\t\t\tThe tagname and all attributes must match in order for the element to be deleted\n");
-
-    fprintf(stream, "\t--%s (-%c)\t\n", CIB_OP_BUMP, 'B');
-    fprintf(stream, "\t--%s (-%c)\t\tCalculate the configuration's digest.\n", "md5-sum", '5');
-    fprintf(stream, "\nXML data\n");
-    fprintf(stream, "\t--%s (-%c) <filename>\tRetrieve XML from the named file\n", "xml-file", 'x');
-    fprintf(stream, "\t--%s (-%c) <string>\tRetrieve XML from the supplied string\n",
-            "xml-text", 'X');
-    fprintf(stream, "\t--%s (-%c) <filename>\tSave the XML output to the named file\n",
-            "xml-save", 'S');
-    fprintf(stream, "\nNOTE: The current CIB is assumed to be passed in via stdin,"
-            " unless -Q is used in which case -x or -X are also acceptable\n");
-    fflush(stream);
-
-    exit(exit_status);
-}
diff --git a/configure.ac b/configure.ac
index 8f9677124e..18d7c5271b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,1731 +1,1729 @@
 dnl
 dnl autoconf for Pacemaker
 dnl
 dnl License: GNU General Public License (GPL)
 
 dnl ===============================================
 dnl Bootstrap 
 dnl ===============================================
 AC_PREREQ(2.59)
 
 dnl Suggested structure:
 dnl     information on the package
 dnl     checks for programs
 dnl     checks for libraries
 dnl     checks for header files
 dnl     checks for types
 dnl     checks for structures
 dnl     checks for compiler characteristics
 dnl     checks for library functions
 dnl     checks for system services
 
 AC_INIT(pacemaker, 1.1.7, pacemaker@oss.clusterlabs.org)
 CRM_DTD_VERSION="1.2"
 
 PCMK_FEATURES=""
 HB_PKG=heartbeat
 
 AC_CONFIG_AUX_DIR(.)
 AC_CANONICAL_HOST
 
 dnl Where #defines go (e.g. `AC_CHECK_HEADERS' below)
 dnl
 dnl Internal header: include/config.h
 dnl   - Contains ALL defines
 dnl   - include/config.h.in is generated automatically by autoheader
 dnl   - NOT to be included in any header files except lha_internal.h
 dnl     (which is also not to be included in any other header files)
 dnl
 dnl External header: include/crm_config.h
 dnl   - Contains a subset of defines checked here
 dnl   - Manually edit include/crm_config.h.in to have configure include
 dnl     new defines
 dnl   - Should not include HAVE_* defines
 dnl   - Safe to include anywhere
 AM_CONFIG_HEADER(include/config.h include/crm_config.h)
 ALL_LINGUAS="en fr"
 
 AC_ARG_WITH(version,
     [  --with-version=version   Override package version (if you're a packager needing to pretend) ],
     [ PACKAGE_VERSION="$withval" ])
 
 AC_ARG_WITH(pkg-name,
     [  --with-pkg-name=name     Override package name (if you're a packager needing to pretend) ],
     [ PACKAGE_NAME="$withval" ])
 
 AM_INIT_AUTOMAKE($PACKAGE_NAME, $PACKAGE_VERSION)
 AC_DEFINE_UNQUOTED(PACEMAKER_VERSION, "$PACKAGE_VERSION", Current pacemaker version)
 
 PACKAGE_SERIES=`echo $PACKAGE_VERSION | awk -F. '{ print $1"."$2 }'`
 AC_SUBST(PACKAGE_SERIES)
 AC_SUBST(PACKAGE_VERSION)
 
 dnl automake >= 1.11 offers --enable-silent-rules for suppressing the output from
 dnl normal compilation.  When a failure occurs, it will then display the full 
 dnl command line
 dnl Wrap in m4_ifdef to avoid breaking on older platforms
 m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
 
 dnl Example 2.4. Silent Custom Rule to Generate a File
 dnl %-bar.pc: %.pc
 dnl	$(AM_V_GEN)$(LN_S) $(notdir $^) $@
 
 CC_IN_CONFIGURE=yes
 export CC_IN_CONFIGURE
 
 LDD=ldd
 
 dnl ========================================================================
 dnl Compiler characteristics
 dnl ========================================================================
 
 AC_PROG_CC dnl Can force other with environment variable "CC".
 AM_PROG_CC_C_O
 AC_PROG_CC_STDC
 gl_EARLY
 gl_INIT
 
 AC_LIBTOOL_DLOPEN               dnl Enable dlopen support...
 AC_LIBLTDL_CONVENIENCE          dnl make libltdl a convenience lib
 AC_PROG_LIBTOOL
 
 AC_PROG_YACC
 AM_PROG_LEX
 
 AC_C_STRINGIZE
 AC_TYPE_SIZE_T
 AC_CHECK_SIZEOF(char)
 AC_CHECK_SIZEOF(short)
 AC_CHECK_SIZEOF(int)
 AC_CHECK_SIZEOF(long)
 AC_CHECK_SIZEOF(long long)
 AC_STRUCT_TIMEZONE
 
 dnl ===============================================
 dnl Helpers 
 dnl ===============================================
 cc_supports_flag() {
          local CFLAGS="$@"
          AC_MSG_CHECKING(whether $CC supports "$@")
          AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])], [RC=0; AC_MSG_RESULT(yes)],[RC=1; AC_MSG_RESULT(no)])
          return $RC
 }
 
 try_extract_header_define() {
 	  AC_MSG_CHECKING(if $2 in $1 exists. If not defaulting to $3)
 	  Cfile=$srcdir/extract_define.$2.${$}
 	  printf "#include <stdio.h>\n" > ${Cfile}.c
 	  printf "#include <%s>\n" $1 >> ${Cfile}.c
 	  printf "int main(int argc, char **argv) {\n" >> ${Cfile}.c
 	  printf "#ifdef %s\n" $2 >> ${Cfile}.c
 	  printf "printf(\"%%s\", %s);\n" $2 >> ${Cfile}.c
 	  printf "#endif \n return 0; }\n" >> ${Cfile}.c
 	  $CC $CFLAGS ${Cfile}.c -o ${Cfile}
 	  value=`${Cfile}`
 	  if  test x"${value}" == x""; then
 	      value=$3
 	  fi
 	  AC_MSG_RESULT($value)
 	  printf $value
 	  rm -rf ${Cfile}.c ${Cfile} ${Cfile}.dSYM ${Cfile}.gcno
 	}
 
 extract_header_define() {
 	  AC_MSG_CHECKING(for $2 in $1)
 	  Cfile=$srcdir/extract_define.$2.${$}
 	  printf "#include <stdio.h>\n" > ${Cfile}.c
 	  printf "#include <%s>\n" $1 >> ${Cfile}.c
 	  printf "int main(int argc, char **argv) { printf(\"%%s\", %s); return 0; }\n" $2 >> ${Cfile}.c
 	  $CC $CFLAGS ${Cfile}.c -o ${Cfile}
 	  value=`${Cfile}`
 	  AC_MSG_RESULT($value)
 	  printf $value
 	  rm -rf ${Cfile}.c ${Cfile} ${Cfile}.dSYM ${Cfile}.gcno
 	}
 
 dnl ===============================================
 dnl Configure Options
 dnl ===============================================
 
 dnl Some systems, like Solaris require a custom package name
 AC_ARG_WITH(pkgname,
     [  --with-pkgname=name     name for pkg (typically for Solaris) ],
     [ PKGNAME="$withval" ],
     [ PKGNAME="LXHAhb" ],
   )
 AC_SUBST(PKGNAME)
 
 AC_ARG_ENABLE([ansi],
 [  --enable-ansi force GCC to compile to ANSI/ANSI standard for older compilers.
      [default=no]])
 
 AC_ARG_ENABLE([fatal-warnings],
 [  --enable-fatal-warnings very pedantic and fatal warnings for gcc
      [default=yes]])
 
 AC_ARG_ENABLE([quiet],
 [  --enable-quiet 
      Supress make output unless there is an error
      [default=no]])
 
 AC_ARG_ENABLE([thread-safe],
 [  --enable-thread-safe Enable some client libraries to be thread safe.
      [default=no]])
 
 AC_ARG_ENABLE([bundled-ltdl],
 [  --enable-bundled-ltdl  Configure, build and install the standalone ltdl library bundled with ${PACKAGE} [default=no]]) 
 LTDL_LIBS=""
 
 AC_ARG_ENABLE([no-stack],
     [  --enable-no-stack
        Only build the Policy Engine and pieces needed to support it [default=no]])
 
 AC_ARG_WITH(ais,
     [  --with-ais     
        Support the Corosync messaging and membership layer ],
     [ SUPPORT_CS=$withval ],
     [ SUPPORT_CS=try ],
 )
 
 AC_ARG_WITH(corosync,
     [  --with-corosync     
        Support the Corosync messaging and membership layer ],
     [ SUPPORT_CS=$withval ]
 dnl	initialized in AC_ARG_WITH(ais...) already,
 dnl	don't reset to try if it was given as --without-ais
 )
 
 AC_ARG_WITH(heartbeat,
     [  --with-heartbeat     
        Support the Heartbeat messaging and membership layer ],
     [ SUPPORT_HEARTBEAT=$withval ],
     [ SUPPORT_HEARTBEAT=try ],
 )
 
 AC_ARG_WITH(cman,
     [  --with-cman     
        Support the consumption of membership and quorum from cman ],
     [ SUPPORT_CMAN=$withval ],
     [ SUPPORT_CMAN=try ],
 )
 
 AC_ARG_WITH(cpg,
     [  --with-cs-quorum     
        Support the consumption of membership and quorum from corosync ],
     [ SUPPORT_CS_QUORUM=$withval ],
     [ SUPPORT_CS_QUORUM=try ],
 )
 
 AC_ARG_WITH(snmp,
     [  --with-snmp     
        Support the SNMP protocol ],
     [ SUPPORT_SNMP=$withval ],
     [ SUPPORT_SNMP=try ],
 )
 
 AC_ARG_WITH(esmtp,
     [  --with-esmtp  
        Support the sending mail notifications with the esmtp library ],
     [ SUPPORT_ESMTP=$withval ],
     [ SUPPORT_ESMTP=try ],
 )
 
 AC_ARG_WITH(acl,
     [  --with-acl
        Support CIB ACL ],
     [ SUPPORT_ACL=$withval ],
     [ SUPPORT_ACL=no ],
 )
 
 CSPREFIX=""
 AC_ARG_WITH(ais-prefix,
     [  --with-ais-prefix=DIR  Prefix used when Corosync was installed [$prefix]],
     [ CSPREFIX=$withval ], 
     [ CSPREFIX=$prefix ])
 
 LCRSODIR=""
 AC_ARG_WITH(lcrso-dir, 
     [  --with-lcrso-dir=DIR   Corosync lcrso files. ],
     [ LCRSODIR="$withval" ])
 
 INITDIR=""
 AC_ARG_WITH(initdir,
     [  --with-initdir=DIR      directory for init (rc) scripts [${INITDIR}]],
     [ INITDIR="$withval" ])
 
 SUPPORT_PROFILING=0
 AC_ARG_WITH(profiling,
     [  --with-profiling     
        Support gprof profiling ],
     [ SUPPORT_PROFILING=$withval ])
 
 SUPPORT_GCOV=0
 AC_ARG_WITH(gcov,
     [  --with-gcov
        Support gcov coverage testing ],
     [ SUPPORT_GCOV=$withval ])
 
 PUBLICAN_BRAND="common"
 AC_ARG_WITH(brand,
     [  --with-brand=brand  Brand to use for generated documentation [$PUBLICAN_BRAND]],
     [ PUBLICAN_BRAND="$withval" ])
 AC_SUBST(PUBLICAN_BRAND)
 
 dnl ===============================================
 dnl General Processing
 dnl ===============================================
 
 AC_SUBST(HB_PKG)
 
 INIT_EXT=""
 echo Our Host OS: $host_os/$host
 
 
 AC_MSG_NOTICE(Sanitizing prefix: ${prefix})
 case $prefix in
   NONE)
 	prefix=/usr
 	dnl Fix default variables - "prefix" variable if not specified
 	if test "$localstatedir" = "\${prefix}/var"; then
 		localstatedir="/var"
 	fi
 	if test "$sysconfdir" = "\${prefix}/etc"; then
 		sysconfdir="/etc"
 	fi
 	;;
 esac
 
 
 AC_MSG_NOTICE(Sanitizing exec_prefix: ${exec_prefix})
 case $exec_prefix in
   dnl For consistency with Heartbeat, map NONE->$prefix
   NONE)	  exec_prefix=$prefix;;
   prefix) exec_prefix=$prefix;;
 esac
 
 AC_MSG_NOTICE(Sanitizing ais_prefix: ${CSPREFIX})
 case $CSPREFIX in
   dnl For consistency with Heartbeat, map NONE->$prefix
   NONE)	  CSPREFIX=$prefix;;
   prefix) CSPREFIX=$prefix;;
 esac
 
 AC_MSG_NOTICE(Sanitizing INITDIR: ${INITDIR})
 case $INITDIR in
   prefix) INITDIR=$prefix;;
   "")
     AC_MSG_CHECKING(which init (rc) directory to use)
       for initdir in /etc/init.d /etc/rc.d/init.d /sbin/init.d	\
 	   /usr/local/etc/rc.d /etc/rc.d
       do
         if
           test -d $initdir
         then
           INITDIR=$initdir
           break
         fi
       done
       AC_MSG_RESULT($INITDIR);;
 esac
 AC_SUBST(INITDIR)
 
 AC_MSG_NOTICE(Sanitizing libdir: ${libdir})
 case $libdir in
   dnl For consistency with Heartbeat, map NONE->$prefix
   *prefix*|NONE)
     AC_MSG_CHECKING(which lib directory to use)
     for aDir in lib64 lib
     do
       trydir="${exec_prefix}/${aDir}"
       if
         test -d ${trydir}
       then
         libdir=${trydir}
         break
       fi
     done
     AC_MSG_RESULT($libdir);
     ;;
 esac
 
 dnl Expand autoconf variables so that we dont end up with '${prefix}' 
 dnl in #defines and python scripts
 dnl NOTE: Autoconf deliberately leaves them unexpanded to allow
 dnl    make exec_prefix=/foo install
 dnl No longer being able to do this seems like no great loss to me...
 
 eval prefix="`eval echo ${prefix}`"
 eval exec_prefix="`eval echo ${exec_prefix}`"
 eval bindir="`eval echo ${bindir}`"
 eval sbindir="`eval echo ${sbindir}`"
 eval libexecdir="`eval echo ${libexecdir}`"
 eval datadir="`eval echo ${datadir}`"
 eval sysconfdir="`eval echo ${sysconfdir}`"
 eval sharedstatedir="`eval echo ${sharedstatedir}`"
 eval localstatedir="`eval echo ${localstatedir}`"
 eval libdir="`eval echo ${libdir}`"
 eval includedir="`eval echo ${includedir}`"
 eval oldincludedir="`eval echo ${oldincludedir}`"
 eval infodir="`eval echo ${infodir}`"
 eval mandir="`eval echo ${mandir}`"
 
 dnl Home-grown variables
 eval INITDIR="${INITDIR}"
 eval docdir="`eval echo ${docdir}`"
 if test x"${docdir}" = x""; then
    docdir=${datadir}/doc/${PACKAGE}-${VERSION}
    #docdir=${datadir}/doc/packages/${PACKAGE}
 fi
 AC_SUBST(docdir)
 
 for j in prefix exec_prefix bindir sbindir libexecdir datadir sysconfdir \
     sharedstatedir localstatedir libdir includedir oldincludedir infodir \
     mandir INITDIR docdir
 do 
   dirname=`eval echo '${'${j}'}'`
   if
     test ! -d "$dirname"
   then
     AC_MSG_WARN([$j directory ($dirname) does not exist!])
   fi
 done
 
 dnl This OS-based decision-making is poor autotools practice;
 dnl feature-based mechanisms are strongly preferred.
 dnl
 dnl So keep this section to a bare minimum; regard as a "necessary evil". 
 
 case "$host_os" in
 *bsd*)		LIBS="-L/usr/local/lib"
 		CPPFLAGS="$CPPFLAGS -I/usr/local/include"
 		INIT_EXT=".sh"
 		;;
 *solaris*)
 		;;
 *linux*)	
 		AC_DEFINE_UNQUOTED(ON_LINUX, 1, Compiling for Linux platform)
   		CFLAGS="$CFLAGS -I${prefix}/include"
  		;;
 darwin*)	
 		AC_DEFINE_UNQUOTED(ON_DARWIN, 1, Compiling for Darwin platform)
   		LIBS="$LIBS -L${prefix}/lib"
   		CFLAGS="$CFLAGS -I${prefix}/include"
 		;;
 esac
 
 dnl Eventually remove this 
 CFLAGS="$CFLAGS -I${prefix}/include/heartbeat"
 
 AC_SUBST(INIT_EXT)
 AC_MSG_NOTICE(Host CPU: $host_cpu)
 
 case "$host_cpu" in
   ppc64|powerpc64)
     case $CFLAGS in
      *powerpc64*)			;;
      *)	if test "$GCC" = yes; then
 	  CFLAGS="$CFLAGS -m64"
 	fi				;;
     esac
 esac
 
 AC_MSG_CHECKING(which format is needed to print uint64_t)
 
 ac_save_CFLAGS=$CFLAGS
 CFLAGS="-Wall -Werror"
 
 AC_COMPILE_IFELSE(
     [AC_LANG_PROGRAM(
       [
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
       ],
       [
 int max = 512;	
 uint64_t bignum = 42;
 char *buffer = malloc(max);
 const char *random = "random";
 snprintf(buffer, max-1, "<quorum id=%lu quorate=%s/>", bignum, random);
 fprintf(stderr, "Result: %s\n", buffer);
       ]
     )], 
     [U64T="%lu"],
     [U64T="%llu"]
 )
 CFLAGS=$ac_save_CFLAGS
 
 AC_MSG_RESULT($U64T)
 AC_DEFINE_UNQUOTED(U64T, "$U64T", Correct printf format for logging uint64_t)
 
 dnl ===============================================
 dnl Program Paths
 dnl ===============================================
 
 PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin"
 export PATH
 
 
 dnl Replacing AC_PROG_LIBTOOL with AC_CHECK_PROG because LIBTOOL
 dnl was NOT being expanded all the time thus causing things to fail.
 AC_CHECK_PROGS(LIBTOOL, glibtool libtool libtool15 libtool13)
 
 AM_PATH_PYTHON
 AC_CHECK_PROGS(MAKE, gmake make)
 AC_PATH_PROGS(HTML2TXT, lynx w3m)
 AC_PATH_PROGS(HELP2MAN, help2man)
 AC_PATH_PROGS(POD2MAN, pod2man, pod2man)
 AC_PATH_PROGS(ASCIIDOC, asciidoc)
 AC_PATH_PROGS(PUBLICAN, publican)
 AC_PATH_PROGS(INKSCAPE, inkscape)
 AC_PATH_PROGS(XSLTPROC, xsltproc)
 AC_PATH_PROGS(FOP, fop)
 AC_PATH_PROGS(SSH, ssh, /usr/bin/ssh)
 AC_PATH_PROGS(SCP, scp, /usr/bin/scp)
 AC_PATH_PROGS(TAR, tar)
 AC_PATH_PROGS(MD5, md5)
 AC_PATH_PROGS(TEST, test)
 AC_PATH_PROGS(PKGCONFIG, pkg-config)
 AC_PATH_PROGS(XML2CONFIG, xml2-config)
 AC_PATH_PROGS(VALGRIND_BIN, valgrind, /usr/bin/valgrind)
 AC_DEFINE_UNQUOTED(VALGRIND_BIN, "$VALGRIND_BIN", Valgrind command)
 
 dnl Disable these until we decide if the stonith config file should be supported
 dnl AC_PATH_PROGS(BISON, bison)
 dnl AC_PATH_PROGS(FLEX, flex)
 dnl AC_PATH_PROGS(HAVE_YACC, $YACC)
 
 if test x"${LIBTOOL}" = x""; then
    AC_MSG_ERROR(You need (g)libtool installed in order to build ${PACKAGE})
 fi
 if test x"${MAKE}" = x""; then
    AC_MSG_ERROR(You need (g)make installed in order to build ${PACKAGE})
 fi
 
 AM_CONDITIONAL(BUILD_HELP, test x"${HELP2MAN}" != x"")
 if test x"${HELP2MAN}" != x""; then
    PCMK_FEATURES="$PCMK_FEATURES generated-manpages"
 fi
 
 MANPAGE_XSLT=""
 if test x"${XSLTPROC}" != x""; then
   AC_MSG_CHECKING(docbook to manpage transform)
   XSLT=`find ${datadir} -name docbook.xsl`
   for xsl in $XSLT; do
     dname=`dirname $xsl`
     bname=`basename $dname`
     if test "$bname" = "manpages"; then
        MANPAGE_XSLT="$xsl"
        break
     fi
   done
 fi
 AC_MSG_RESULT($MANPAGE_XSLT)
 AC_SUBST(MANPAGE_XSLT)
 
 AM_CONDITIONAL(BUILD_XML_HELP, test x"${MANPAGE_XSLT}" != x"")
 if test x"${MANPAGE_XSLT}" != x""; then
    PCMK_FEATURES="$PCMK_FEATURES agent-manpages"
 fi
 
 AM_CONDITIONAL(BUILD_ASCIIDOC, test x"${ASCIIDOC}" != x"")
 if test x"${ASCIIDOC}" != x""; then
    PCMK_FEATURES="$PCMK_FEATURES ascii-docs"
 fi
 
 SUPPORT_STONITH_CONFIG=0
 if test x"${HAVE_YACC}" != x"" -a x"${FLEX}" != x"" -a x"${BISON}" != x""; then
    SUPPORT_STONITH_CONFIG=1
    PCMK_FEATURES="$PCMK_FEATURES st-conf"
 fi
 
 AM_CONDITIONAL(BUILD_STONITH_CONFIG, test $SUPPORT_STONITH_CONFIG = 1)
 AC_DEFINE_UNQUOTED(SUPPORT_STONITH_CONFIG, $SUPPORT_STONITH_CONFIG, Support a stand-alone stonith config file in addition to the CIB)
 
 AM_CONDITIONAL(BUILD_DOCBOOK, test x"${PUBLICAN}" != x"" -a x"${INKSCAPE}" != x"")
 if test x"${PUBLICAN}" != x"" -a x"${INKSCAPE}" != x""; then
    AC_MSG_NOTICE(Enabling publican)
    PCMK_FEATURES="$PCMK_FEATURES publican-docs"
 fi
 
 dnl ========================================================================
 dnl checks for library functions to replace them
 dnl
 dnl     NoSuchFunctionName:
 dnl             is a dummy function which no system supplies.  It is here to make
 dnl             the system compile semi-correctly on OpenBSD which doesn't know
 dnl             how to create an empty archive
 dnl
 dnl     scandir: Only on BSD.
 dnl             System-V systems may have it, but hidden and/or deprecated.
 dnl             A replacement function is supplied for it.
 dnl
 dnl     setenv: is some bsdish function that should also be avoided (use
 dnl             putenv instead)
 dnl             On the other hand, putenv doesn't provide the right API for the
 dnl             code and has memory leaks designed in (sigh...)  Fortunately this
 dnl             A replacement function is supplied for it.
 dnl
 dnl     strerror: returns a string that corresponds to an errno.
 dnl             A replacement function is supplied for it.
 dnl
 dnl     unsetenv: is some bsdish function that should also be avoided (No 
 dnl             replacement)
 dnl             A replacement function is supplied for it.
 dnl
 dnl	strnlen: is a gnu function similar to strlen, but safer.
 dnl		We wrote a tolearably-fast replacement function for it.
 dnl
 dnl	strndup: is a gnu function similar to strdup, but safer.
 dnl		We wrote a tolearably-fast replacement function for it.
 dnl
 dnl	daemon: is a GNU function.  The daemon() function is for programs wishing to
 dnl             detach themselves from the controlling terminal and run in the
 dnl             background as system daemon
 dnl             A replacement function is supplied for it.
 
 AC_REPLACE_FUNCS(alphasort inet_pton NoSuchFunctionName scandir setenv strerror strchrnul unsetenv strnlen strndup daemon)
 
 dnl ===============================================
 dnl Libraries
 dnl ===============================================
 AC_CHECK_LIB(socket, socket)			dnl -lsocket
 AC_CHECK_LIB(c, dlopen)				dnl if dlopen is in libc...
 AC_CHECK_LIB(dl, dlopen)			dnl -ldl (for Linux)
 AC_CHECK_LIB(rt, sched_getscheduler)            dnl -lrt (for Tru64)
 AC_CHECK_LIB(gnugetopt, getopt_long)		dnl -lgnugetopt ( if available )
 AC_CHECK_LIB(pam, pam_start)			dnl -lpam (if available)
 AC_CHECK_LIB(uuid, uuid_parse)			dnl libuuid
 
 if test "x$ac_cv_lib_uuid_uuid_parse" != x""yes; then
    AC_MSG_ERROR(You do not have the libuuid development package installed)
 fi
 
 if test x"${PKGCONFIG}" = x""; then
    AC_MSG_ERROR(You need pkgconfig installed in order to build ${PACKAGE})
 fi
 
 if test "x${enable_thread_safe}" = "xyes"; then
         GPKGNAME="gthread-2.0"
 else
         GPKGNAME="glib-2.0"
 fi
 
 if 
    $PKGCONFIG --exists $GPKGNAME
 then
 	GLIBCONFIG="$PKGCONFIG $GPKGNAME"
 else
 	set -x
         echo PKG_CONFIG_PATH=$PKG_CONFIG_PATH
 	$PKGCONFIG --exists $GPKGNAME; echo $?
 	$PKGCONFIG --cflags $GPKGNAME; echo $?
 	$PKGCONFIG $GPKGNAME; echo $?
 	set +x
         
 	AC_MSG_ERROR(You need glib2-devel installed in order to build ${PACKAGE})
 fi
 AC_MSG_RESULT(using $GLIBCONFIG)
 
 USE_GHASH_COMPAT=0
 AC_CHECK_LIB(glib-2.0, g_hash_table_get_values)
 if test "x$ac_cv_lib_glib_2_0_g_hash_table_get_values" != x""yes; then
    AC_MSG_WARN(Your version of Glib is too old, you should have at least 2.14)
    USE_GHASH_COMPAT=1
 fi
 AC_DEFINE_UNQUOTED(USE_GHASH_COMPAT, $USE_GHASH_COMPAT, Use g_hash_table compatibility functions)
 AC_SUBST(USE_GHASH_COMPAT)
 
 
 if 
     $PKGCONFIG --exists systemd
 then
     systemdunitdir=`$PKGCONFIG --variable=systemdsystemunitdir systemd`
     AC_SUBST(systemdunitdir)
 fi
 AM_CONDITIONAL(HAVE_SYSTEMD, test -n "$systemdunitdir" -a "x$systemdunitdir" != xno)
 
 #
 #	Where is dlopen?
 #
 if test "$ac_cv_lib_c_dlopen" = yes; then
 	LIBADD_DL=""
 elif test "$ac_cv_lib_dl_dlopen" = yes; then
 	LIBADD_DL=-ldl
 else
         LIBADD_DL=${lt_cv_dlopen_libs}
 fi
 dnl
 dnl Check for location of gettext
 dnl
 dnl On at least Solaris 2.x, where it is in libc, specifying lintl causes
 dnl grief. Ensure minimal result, not the sum of all possibilities.
 dnl And do libc first.
 dnl Known examples:
 dnl    c:      Linux, Solaris 2.6+
 dnl    intl:   BSD, AIX
 
 AC_CHECK_LIB(c, gettext)
 if test x$ac_cv_lib_c_gettext != xyes; then
    AC_CHECK_LIB(intl, gettext)
 fi
 
 if test x$ac_cv_lib_c_gettext != xyes -a x$ac_cv_lib_intl_gettext != xyes; then
    AC_MSG_ERROR(You need gettext installed in order to build ${PACKAGE})
 fi
 
 if test "X$GLIBCONFIG" != X; then
 	AC_MSG_CHECKING(for special glib includes: )
 	GLIBHEAD=`$GLIBCONFIG --cflags`
 	AC_MSG_RESULT($GLIBHEAD)
 	CPPFLAGS="$CPPFLAGS $GLIBHEAD"
 
 	AC_MSG_CHECKING(for glib library flags)
 	GLIBLIB=`$GLIBCONFIG --libs`
 	AC_MSG_RESULT($GLIBLIB)
 	LIBS="$LIBS $GLIBLIB"
 fi
 
 dnl ========================================================================
 dnl Headers
 dnl ========================================================================
 
 AC_HEADER_STDC
 AC_CHECK_HEADERS(arpa/inet.h)
 AC_CHECK_HEADERS(asm/types.h)
 AC_CHECK_HEADERS(assert.h)
 AC_CHECK_HEADERS(auth-client.h)
 AC_CHECK_HEADERS(ctype.h)
 AC_CHECK_HEADERS(dirent.h)
 AC_CHECK_HEADERS(errno.h)
 AC_CHECK_HEADERS(fcntl.h)
 AC_CHECK_HEADERS(getopt.h)
 AC_CHECK_HEADERS(glib.h)
 AC_CHECK_HEADERS(grp.h)
 AC_CHECK_HEADERS(limits.h)
 AC_CHECK_HEADERS(linux/errqueue.h)
 AC_CHECK_HEADERS(malloc.h)
 AC_CHECK_HEADERS(netdb.h)
 AC_CHECK_HEADERS(netinet/in.h)
 AC_CHECK_HEADERS(netinet/ip.h)
 AC_CHECK_HEADERS(pam/pam_appl.h)
 AC_CHECK_HEADERS(pthread.h)
 AC_CHECK_HEADERS(pwd.h)
 AC_CHECK_HEADERS(security/pam_appl.h)
 AC_CHECK_HEADERS(sgtty.h)
 AC_CHECK_HEADERS(signal.h)
 AC_CHECK_HEADERS(stdarg.h)
 AC_CHECK_HEADERS(stddef.h)
 AC_CHECK_HEADERS(stdio.h)
 AC_CHECK_HEADERS(stdlib.h)
 AC_CHECK_HEADERS(string.h)
 AC_CHECK_HEADERS(strings.h)
 AC_CHECK_HEADERS(sys/dir.h)
 AC_CHECK_HEADERS(sys/ioctl.h)
 AC_CHECK_HEADERS(sys/param.h)
 AC_CHECK_HEADERS(sys/poll.h)
 AC_CHECK_HEADERS(sys/resource.h)
 AC_CHECK_HEADERS(sys/select.h)
 AC_CHECK_HEADERS(sys/socket.h)
 AC_CHECK_HEADERS(sys/sockio.h)
 AC_CHECK_HEADERS(sys/stat.h)
 AC_CHECK_HEADERS(sys/time.h)
 AC_CHECK_HEADERS(sys/timeb.h)
 AC_CHECK_HEADERS(sys/types.h)
 AC_CHECK_HEADERS(sys/uio.h)
 AC_CHECK_HEADERS(sys/un.h)
 AC_CHECK_HEADERS(sys/utsname.h)
 AC_CHECK_HEADERS(sys/wait.h)
 AC_CHECK_HEADERS(time.h)
 AC_CHECK_HEADERS(unistd.h)
 AC_CHECK_HEADERS(winsock.h)
 
 dnl These headers need prerequisits before the tests will pass 
 dnl AC_CHECK_HEADERS(net/if.h)
 dnl AC_CHECK_HEADERS(netinet/icmp6.h)
 dnl AC_CHECK_HEADERS(netinet/ip6.h)
 dnl AC_CHECK_HEADERS(netinet/ip_icmp.h)
 
 AC_MSG_CHECKING(for special libxml2 includes)
 if test "x$XML2CONFIG" = "x"; then
    AC_MSG_ERROR(libxml2 config not found)
 else
    XML2HEAD="`$XML2CONFIG --cflags`"
    AC_MSG_RESULT($XML2HEAD)
    AC_CHECK_LIB(xml2, xmlReadMemory)
    AC_CHECK_LIB(xslt, xsltApplyStylesheet)
 fi
 
 CPPFLAGS="$CPPFLAGS $XML2HEAD"
 
 AC_CHECK_HEADERS(libxml/xpath.h)
 AC_CHECK_HEADERS(libxslt/xslt.h)
 if test "$ac_cv_header_libxml_xpath_h" != "yes"; then
    AC_MSG_ERROR(The libxml developement headers were not found)
 fi
 if test "$ac_cv_header_libxslt_xslt_h" != "yes"; then
    AC_MSG_ERROR(The libxslt developement headers were not found)
 fi
 
 dnl ========================================================================
 dnl Structures
 dnl ========================================================================
 
 AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[[#include <time.h>]])
 AC_CHECK_MEMBERS([lrm_op_t.rsc_deleted],,,[[#include <lrm/lrm_api.h>]])
 
 dnl ========================================================================
 dnl Functions
 dnl ========================================================================
 
 AC_CHECK_FUNCS(g_log_set_default_handler)
 AC_CHECK_FUNCS(getopt, AC_DEFINE(HAVE_DECL_GETOPT,  1, [Have getopt function]))
 AC_CHECK_FUNCS(nanosleep, AC_DEFINE(HAVE_DECL_NANOSLEEP,  1, [Have nanosleep function]))
 
 dnl ========================================================================
 dnl   ltdl
 dnl ========================================================================
 
 AC_CHECK_LIB(ltdl, lt_dlopen, [LTDL_foo=1])
 if test "x${enable_bundled_ltdl}" = "xyes"; then
    if test $ac_cv_lib_ltdl_lt_dlopen = yes; then
       AC_MSG_NOTICE([Disabling usage of installed ltdl])
    fi
    ac_cv_lib_ltdl_lt_dlopen=no
 fi
 
 LIBLTDL_DIR=""
 if test $ac_cv_lib_ltdl_lt_dlopen != yes ; then
    AC_MSG_NOTICE([Installing local ltdl])
    LIBLTDL_DIR=libltdl
    ( cd $srcdir ; $TAR -xvf libltdl.tar )
    if test "$?" -ne 0; then
      AC_MSG_ERROR([$TAR of libltdl.tar in $srcdir failed])
    fi
    AC_CONFIG_SUBDIRS(libltdl)
 else
    LIBS="$LIBS -lltdl"
    AC_MSG_NOTICE([Using installed ltdl])
    INCLTDL=""
    LIBLTDL=""
 fi
 
 AC_SUBST(INCLTDL)
 AC_SUBST(LIBLTDL)
 AC_SUBST(LIBLTDL_DIR)
 
 dnl ========================================================================
 dnl   bzip2
 dnl ========================================================================
 AC_CHECK_HEADERS(bzlib.h)
 AC_CHECK_LIB(bz2, BZ2_bzBuffToBuffCompress)
 
 if test x$ac_cv_lib_bz2_BZ2_bzBuffToBuffCompress != xyes ; then
    AC_MSG_ERROR(BZ2 libraries not found)
 fi
 
 if test x$ac_cv_header_bzlib_h != xyes; then
    AC_MSG_ERROR(BZ2 Development headers not found)
 fi
 
 
 dnl ========================================================================
 dnl   ncurses
 dnl ========================================================================
 dnl
 dnl A few OSes (e.g. Linux) deliver a default "ncurses" alongside "curses".
 dnl Many non-Linux deliver "curses"; sites may add "ncurses".
 dnl
 dnl However, the source-code recommendation for both is to #include "curses.h"
 dnl (i.e. "ncurses" still wants the include to be simple, no-'n', "curses.h").
 dnl
 dnl ncurse takes precedence.
 dnl
 AC_CHECK_HEADERS(curses.h)
 AC_CHECK_HEADERS(curses/curses.h)
 AC_CHECK_HEADERS(ncurses.h)
 AC_CHECK_HEADERS(ncurses/ncurses.h)
 
 dnl Although n-library is preferred, only look for it if the n-header was found.
 CURSESLIBS=''
 if test "$ac_cv_header_ncurses_h" = "yes"; then
   AC_CHECK_LIB(ncurses, printw,
     [CURSESLIBS='-lncurses'; AC_DEFINE(HAVE_LIBNCURSES,1, have ncurses library)]
   )
 fi
 
 if test "$ac_cv_header_ncurses_ncurses_h" = "yes"; then
   AC_CHECK_LIB(ncurses, printw,
     [CURSESLIBS='-lncurses'; AC_DEFINE(HAVE_LIBNCURSES,1, have ncurses library)]
   )
 fi
 
 dnl Only look for non-n-library if there was no n-library.
 if test X"$CURSESLIBS" = X"" -a "$ac_cv_header_curses_h" = "yes"; then
   AC_CHECK_LIB(curses, printw,
     [CURSESLIBS='-lcurses'; AC_DEFINE(HAVE_LIBCURSES,1, have curses library)]
   )
 fi
 
 dnl Only look for non-n-library if there was no n-library.
 if test X"$CURSESLIBS" = X"" -a "$ac_cv_header_curses_curses_h" = "yes"; then
   AC_CHECK_LIB(curses, printw,
     [CURSESLIBS='-lcurses'; AC_DEFINE(HAVE_LIBCURSES,1, have curses library)]
   )
 fi
 
 if test "x$CURSESLIBS" != "x"; then
    PCMK_FEATURES="$PCMK_FEATURES ncurses"
 fi
 
 dnl Check for printw() prototype compatibility
 if test X"$CURSESLIBS" != X"" && cc_supports_flag -Wcast-qual && cc_supports_flag -Werror; then 
     AC_MSG_CHECKING(whether printw() requires argument of "const char *")
     ac_save_LIBS=$LIBS
     LIBS="$CURSESLIBS  $LIBS"
     ac_save_CFLAGS=$CFLAGS
     CFLAGS="-Wcast-qual -Werror"
 
     AC_LINK_IFELSE(
 	    [AC_LANG_PROGRAM(
 	      [
 #if defined(HAVE_CURSES_H)
 #  include <curses.h>
 #elif defined(HAVE_NCURSES_H)
 #  include <ncurses.h>
 #endif
 	      ],
 	      [printw((const char *)"Test");]
 	    )], 
 	    [ac_cv_compatible_printw=yes],
 	    [ac_cv_compatible_printw=no]
     )
 
     LIBS=$ac_save_LIBS
     CFLAGS=$ac_save_CFLAGS
 
     AC_MSG_RESULT([$ac_cv_compatible_printw])
 
     if test "$ac_cv_compatible_printw" = no; then
 		AC_MSG_WARN([The printw() function of your ncurses or curses library is old, we will disable usage of the library. If you want to use this library anyway, please update to newer version of the library, ncurses 5.4 or later is recommended. You can get the library from http://www.gnu.org/software/ncurses/.])
 		AC_MSG_NOTICE([Disabling curses])
 		AC_DEFINE(HAVE_INCOMPATIBLE_PRINTW, 1, [Do we have incompatible printw() in curses library?])
     fi
 fi
 
 AC_SUBST(CURSESLIBS)
 
 dnl ========================================================================
 dnl    Profiling and GProf
 dnl ========================================================================
 
 case $SUPPORT_PROFILING in
      1|yes|true) 
 	SUPPORT_PROFILING=1
 
         dnl Enable gprof
 	#LIBS="$LIBS -pg"
 	#CFLAGS="$CFLAGS -pg"
 
 	dnl Disable various compiler optimizations
 	CFLAGS="$CFLAGS -fno-omit-frame-pointer"
 	#CFLAGS="$CFLAGS -fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls"
 	dnl CFLAGS="$CFLAGS -fno-default-inline -fno-inline"
 
 	dnl Update features
 	PCMK_FEATURES="$PCMK_FEATURES gprof"
 	;;
      *) SUPPORT_PROFILING=0;;
 esac
 AC_DEFINE_UNQUOTED(SUPPORT_PROFILING, $SUPPORT_PROFILING, Support for gprof profiling)
 
 case $SUPPORT_GCOV in
      1|yes|true) 
 	SUPPORT_GCOV=1
 
         dnl Enable gprof
 	#LIBS="$LIBS -pg"
 	#CFLAGS="$CFLAGS -pg"
 
 	dnl Disable various compiler optimizations
 	CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage -fno-inline"
 
 	dnl Turn off optimization so code coverage tool
 	dnl can get accurate line numbers
 	AC_MSG_NOTICE(Old CFLAGS: $CFLAGS) 
 	CFLAGS=`echo $CFLAGS | sed -e 's/-O.\ //g' -e 's/-Wp,-D_FORTIFY_SOURCE=.\ //g'`
 	CFLAGS="$CFLAGS -O0"
 	AC_MSG_NOTICE(New CFLAGS: $CFLAGS) 
 
 	dnl Update features
 	PCMK_FEATURES="$PCMK_FEATURES gcov"
 	;;
      *) SUPPORT_PROFILING=0;;
 esac
 AC_DEFINE_UNQUOTED(SUPPORT_GCOV, $SUPPORT_GCOV, Support for gcov coverage testing)
 
 dnl ========================================================================
 dnl    Cluster infrastructure - Heartbeat / LibQB
 dnl ========================================================================
 
 dnl Compatability checks
 AC_CHECK_MEMBERS([struct lrm_ops.fail_rsc],,,[[#include <lrm/lrm_api.h>]])
 
 if test x${enable_no_stack} = xyes; then
     SUPPORT_HEARTBEAT=no
     SUPPORT_CS=no
 fi
 
 PKG_CHECK_MODULES(libqb, libqb, HAVE_libqb=1, HAVE_libqb=0)
 AC_CHECK_HEADERS(qb/qbipc_common.h)
 AC_CHECK_LIB(qb, qb_ipcc_is_connected)
 AC_CHECK_FUNCS(qb_ipcc_is_connected)
 
 LIBQB_LOG=1
 PCMK_FEATURES="$PCMK_FEATURES libqb-logging"
 
 if test $ac_cv_lib_qb_qb_ipcc_is_connected != yes; then
    AC_MSG_FAILURE(Version of IPC in libqb is not new enough)
 fi
 
 AC_DEFINE_UNQUOTED(LIBQB_LOGGING, $LIBQB_LOG, Use libqb for logging)
 AC_DEFINE_UNQUOTED(LIBQB_IPC, 0, Use libqb for IPC)
 
 LIBS="$LIBS $libqb_LIBS"
 
 AC_CHECK_HEADERS(hb_config.h)
 AC_CHECK_HEADERS(glue_config.h)
 AC_CHECK_HEADERS(agent_config.h)
 GLUE_HEADER=none
 if test "$ac_cv_header_glue_config_h" = "yes";  then
    GLUE_HEADER=glue_config.h
 
 elif test "$ac_cv_header_hb_config_h" = "yes"; then
    GLUE_HEADER=hb_config.h
 
 else
    AC_MSG_WARN(cluster-glue development headers were not found)
 fi
 
 dnl ===============================================
 dnl Variables needed for substitution
 dnl ===============================================
 CRM_DTD_DIRECTORY="${datadir}/pacemaker"
 AC_DEFINE_UNQUOTED(CRM_DTD_DIRECTORY,"$CRM_DTD_DIRECTORY", Location for the Pacemaker Relax-NG Schema)
 AC_SUBST(CRM_DTD_DIRECTORY)
 
 AC_DEFINE_UNQUOTED(CRM_DTD_VERSION,"$CRM_DTD_VERSION", Current version of the Pacemaker Relax-NG Schema)
 AC_SUBST(CRM_DTD_VERSION)
 
 CRM_CORE_DIR=`try_extract_header_define $GLUE_HEADER HA_COREDIR ${localstatedir}/lib/heartbeat/cores`
 AC_DEFINE_UNQUOTED(CRM_CORE_DIR,"$CRM_CORE_DIR", Location to store core files produced by Pacemaker daemons)
 AC_SUBST(CRM_CORE_DIR)
 
 CRM_DAEMON_USER=`try_extract_header_define $GLUE_HEADER HA_CCMUSER hacluster`
 AC_DEFINE_UNQUOTED(CRM_DAEMON_USER,"$CRM_DAEMON_USER", User to run Pacemaker daemons as)
 AC_SUBST(CRM_DAEMON_USER)
 
 CRM_DAEMON_GROUP=`try_extract_header_define $GLUE_HEADER HA_APIGROUP haclient`
 AC_DEFINE_UNQUOTED(CRM_DAEMON_GROUP,"$CRM_DAEMON_GROUP", Group to run Pacemaker daemons as)
 AC_SUBST(CRM_DAEMON_GROUP)
 
 CRM_STATE_DIR=${localstatedir}/run/crm
 AC_DEFINE_UNQUOTED(CRM_STATE_DIR,"$CRM_STATE_DIR", Where to keep state files and sockets)
 AC_SUBST(CRM_STATE_DIR)
 
 CRM_BLACKBOX_DIR=${localstatedir}/lib/pacemaker
 AC_DEFINE_UNQUOTED(CRM_BLACKBOX_DIR,"$CRM_BLACKBOX_DIR", Where to keep blackbox dumps)
 AC_SUBST(CRM_BLACKBOX_DIR)
 
 PE_STATE_DIR="${localstatedir}/lib/pengine"
 AC_DEFINE_UNQUOTED(PE_STATE_DIR,"$PE_STATE_DIR", Where to keep PEngine outputs)
 AC_SUBST(PE_STATE_DIR)
 
 dnl Eventually move out of the heartbeat dir tree and create compatability code
 CRM_CONFIG_DIR="${localstatedir}/lib/heartbeat/crm"
 AC_DEFINE_UNQUOTED(CRM_CONFIG_DIR,"$CRM_CONFIG_DIR", Where to keep CIB configuration files)
 AC_SUBST(CRM_CONFIG_DIR)
 
 CRM_DAEMON_DIR="${libexecdir}/pacemaker"
 AC_DEFINE_UNQUOTED(CRM_DAEMON_DIR,"$CRM_DAEMON_DIR", Location for Pacemaker daemons)
 AC_SUBST(CRM_DAEMON_DIR)
 
 HB_DAEMON_DIR=`try_extract_header_define $GLUE_HEADER HA_LIBHBDIR $libdir/heartbeat`
 AC_DEFINE_UNQUOTED(HB_DAEMON_DIR,"$HB_DAEMON_DIR", Location for Heartbeat expects Pacemaker daemons to be in)
 AC_SUBST(HB_DAEMON_DIR)
 
 dnl Needed so that the Corosync plugin can clear out the directory as Heartbeat does
 HA_STATE_DIR=`try_extract_header_define $GLUE_HEADER HA_VARRUNDIR ${localstatedir}/run`
 AC_DEFINE_UNQUOTED(HA_STATE_DIR,"$HA_STATE_DIR", Where Heartbeat keeps state files and sockets)
 AC_SUBST(HA_STATE_DIR)
 
 CRM_RSCTMP_DIR=`try_extract_header_define agent_config.h HA_RSCTMPDIR $HA_STATE_DIR/heartbeat/rsctmp`
 AC_MSG_CHECKING(Scratch dir for resource agents)
 AC_MSG_RESULT($CRM_RSCTMP_DIR)
 AC_DEFINE_UNQUOTED(CRM_RSCTMP_DIR,"$CRM_RSCTMP_DIR", Where resource agents should keep state files)
 AC_SUBST(CRM_RSCTMP_DIR)
 
 dnl Needed for the location of hostcache in CTS.py
 HA_VARLIBHBDIR=`try_extract_header_define $GLUE_HEADER HA_VARLIBHBDIR ${localstatedir}/lib/heartbeat`
 AC_SUBST(HA_VARLIBHBDIR)
 
 AC_DEFINE_UNQUOTED(UUID_FILE,"$localstatedir/lib/heartbeat/hb_uuid", Location of Heartbeat's UUID file)
 
 OCF_ROOT_DIR=`try_extract_header_define $GLUE_HEADER OCF_ROOT_DIR /usr/lib/ocf`
 if test "X$OCF_ROOT_DIR" = X; then
   AC_MSG_ERROR(Could not locate OCF directory)
 fi
 AC_SUBST(OCF_ROOT_DIR)
 
 OCF_RA_DIR=`try_extract_header_define $GLUE_HEADER OCF_RA_DIR $OCF_ROOT_DIR/resource.d`
 AC_DEFINE_UNQUOTED(OCF_RA_DIR,"$OCF_RA_DIR", Location for OCF RAs)
 AC_SUBST(OCF_RA_DIR)
 
 RH_STONITH_DIR="$sbindir"
 AC_DEFINE_UNQUOTED(RH_STONITH_DIR,"$RH_STONITH_DIR", Location for Red Hat Stonith agents)
 
 RH_STONITH_PREFIX="fence_"
 AC_DEFINE_UNQUOTED(RH_STONITH_PREFIX,"$RH_STONITH_PREFIX", Prefix for Red Hat Stonith agents)
 
 AC_PATH_PROGS(GIT, git false)
 AC_MSG_CHECKING(build version)
 
 BUILD_VERSION=$Format:%H$
 if test $BUILD_VERSION != ":%H$"; then
    AC_MSG_RESULT(archive hash: $BUILD_VERSION)
 
 elif test -x $GIT -a -d .git; then
    BUILD_VERSION=`$GIT log --pretty="format:%h" -n 1`
    AC_MSG_RESULT(git hash: $BUILD_VERSION)
 
 else
    # The current directory name make a reasonable default
    # Most generated archives will include the hash or tag 
    BASE=`basename $PWD`
    BUILD_VERSION=`echo $BASE | sed s:.*[[Pp]]acemaker-::`
    AC_MSG_RESULT(directory based hash: $BUILD_VERSION)
 fi
 
 AC_DEFINE_UNQUOTED(BUILD_VERSION, "$BUILD_VERSION", Build version)
 AC_SUBST(BUILD_VERSION)
 
 
 STACKS=""
 CLUSTERLIBS=""
 
 dnl ========================================================================
 dnl    Cluster stack - Heartbeat
 dnl ========================================================================
 
 case $SUPPORT_HEARTBEAT in
 1|yes|true|try)
    AC_MSG_CHECKING(for heartbeat support)
 
    dnl On Debian, AC_CHECK_LIBS fail if a library has any unresolved symbols
    dnl So check for all the depenancies (so they're added to LIBS) before checking for -lplumb
    AC_CHECK_LIB(pils, PILLoadPlugin)
    AC_CHECK_LIB(plumb, G_main_add_IPC_Channel)
    AC_CHECK_LIB(hbclient, ll_cluster_new, [SUPPORT_HEARTBEAT=1],
 		[if $SUPPORT_HEARTBEAT != try; then
 			AC_MSG_FAILURE(Unable to support Heartbeat: client libraries not found)
 		fi])
 
    if test $SUPPORT_HEARTBEAT = 1 ; then
 	STACKS="$STACKS heartbeat"
 	AC_DEFINE_UNQUOTED(CCM_LIBRARY, "libccmclient.so.1", Library to load for ccm support)
 	AC_DEFINE_UNQUOTED(HEARTBEAT_LIBRARY, "libhbclient.so.1", Library to load for heartbeat support)
    else
 	SUPPORT_HEARTBEAT=0
    fi
    ;;
 *) SUPPORT_HEARTBEAT=0;;
 esac
 
 AM_CONDITIONAL(BUILD_HEARTBEAT_SUPPORT, test $SUPPORT_HEARTBEAT = 1)
 AC_DEFINE_UNQUOTED(SUPPORT_HEARTBEAT, $SUPPORT_HEARTBEAT, Support the Heartbeat messaging and membership layer)
 AC_SUBST(SUPPORT_HEARTBEAT)
 
 dnl ========================================================================
 dnl    Cluster stack - Corosync
 dnl ========================================================================
 
 dnl Normalize the values
 case $SUPPORT_CS in
      1|yes|true)
 		SUPPORT_CS=yes
 		missingisfatal=1;;
      try)	missingisfatal=0;;
      *) SUPPORT_CS=no;;
 esac
 
 AC_MSG_CHECKING(for native corosync)
 COROSYNC_LIBS=""
 CS_USES_LIBQB=0
 
 PCMK_SERVICE_ID=9
 LCRSODIR="$libdir"
 
 if test $SUPPORT_CS = no; then
     AC_MSG_RESULT(no (disabled))
     SUPPORT_CS=0
 else
     AC_MSG_RESULT($SUPPORT_CS, with '$CSPREFIX')
     PKG_CHECK_MODULES(cpg,    libcpg) dnl Fatal
     PKG_CHECK_MODULES(cfg,    libcfg) dnl Fatal
     PKG_CHECK_MODULES(cmap,   libcmap,   HAVE_cmap=1,   HAVE_cmap=0)
     PKG_CHECK_MODULES(cman,   libcman,   HAVE_cman=1,   HAVE_cman=0)
     PKG_CHECK_MODULES(confdb, libconfdb, HAVE_confdb=1, HAVE_confdb=0)
     PKG_CHECK_MODULES(fenced, libfenced, HAVE_fenced=1, HAVE_fenced=0)
     PKG_CHECK_MODULES(quorum, libquorum, HAVE_quorum=1, HAVE_quorum=0)
     PKG_CHECK_MODULES(oldipc, libcoroipcc, HAVE_oldipc=1, HAVE_oldipc=0)
 
     if test $HAVE_oldipc = 1; then
         SUPPORT_CS=1
 	CFLAGS="$CFLAGS $oldipc_FLAGS $cpg_FLAGS $cfg_FLAGS"
         COROSYNC_LIBS="$COROSYNC_LIBS $oldipc_LIBS $cpg_LIBS $cfg_LIBS"
     
     elif test $HAVE_libqb = 1; then
         SUPPORT_CS=1
         CS_USES_LIBQB=1
 	CFLAGS="$CFLAGS $libqb_FLAGS $cpg_FLAGS $cfg_FLAGS"
         COROSYNC_LIBS="$COROSYNC_LIBS $libqb_LIBS $cpg_LIBS $cfg_LIBS"
         AC_CHECK_LIB(corosync_common, cs_strerror) 
 
     else
         aisreason="corosync/libqb IPC libraries not found by pkg_config"
     fi
 
     AC_DEFINE_UNQUOTED(HAVE_CONFDB, $HAVE_confdb, Have the old herarchial Corosync config API)
     AC_DEFINE_UNQUOTED(HAVE_CMAP, $HAVE_cmap, Have the new non-herarchial Corosync config API)
 fi
 
 
 if test $SUPPORT_CS = 1 -a x$HAVE_oldipc = x0 ; then
     dnl Support for plugins was removed about the time the IPC was
     dnl moved to libqb.
     dnl The only option now is the built-in quorum API
     CFLAGS="$CFLAGS $cmap_CFLAGS $quorum_CFLAGS"
     COROSYNC_LIBS="$COROSYNC_LIBS $cmap_LIBS $quorum_LIBS"
 	
     STACKS="$STACKS corosync-native"
     AC_DEFINE_UNQUOTED(SUPPORT_CS_QUORUM, 1, Support the consumption of membership and quorum from corosync)
 fi
 
 if test $SUPPORT_CS = 1 -a x$HAVE_confdb = x1; then
     dnl Need confdb to support cman and the plugins
     LCRSODIR=`$PKGCONFIG corosync --variable=lcrsodir`
     STACKS="$STACKS corosync-plugin"
     COROSYNC_LIBS="$COROSYNC_LIBS $confdb_LIBS"
 
     if test $SUPPORT_CMAN != no; then
         if test $HAVE_cman = 1 -a $HAVE_fenced = 1; then
             SUPPORT_CMAN=1
 	    STACKS="$STACKS cman"
             CFLAGS="$CFLAGS $cman_FLAGS $fenced_FLAGS"
             COROSYNC_LIBS="$COROSYNC_LIBS $cman_LIBS $fenced_LIBS"
         fi
     fi
 fi
 
 dnl Normalize SUPPORT_CS and SUPPORT_CMAN for use with #if directives
 if test $SUPPORT_CMAN != 1; then
     SUPPORT_CMAN=0
 fi
 
 if test $SUPPORT_CS = 1; then
     CLUSTERLIBS="$CLUSTERLIBS $COROSYNC_LIBS"
 
 elif test $SUPPORT_CS != 0; then
     SUPPORT_CS=0
     if test $missingisfatal = 0; then
         AC_MSG_WARN(Unable to support Corosync: $aisreason) 
     else
         AC_MSG_FAILURE(Unable to support Corosync: $aisreason) 
     fi
 fi
 
 AC_DEFINE_UNQUOTED(SUPPORT_COROSYNC, $SUPPORT_CS,    Support the Corosync messaging and membership layer)
 AC_DEFINE_UNQUOTED(SUPPORT_CMAN,     $SUPPORT_CMAN,  Support the consumption of membership and quorum from cman)
 AC_DEFINE_UNQUOTED(CS_USES_LIBQB,    $CS_USES_LIBQB, Does corosync use libqb for its ipc)
 AC_DEFINE_UNQUOTED(PCMK_SERVICE_ID,  $PCMK_SERVICE_ID, Corosync service number)
 
 AM_CONDITIONAL(BUILD_CS_SUPPORT, test $SUPPORT_CS = 1)
 AM_CONDITIONAL(BUILD_CS_PLUGIN, test $HAVE_confdb = 1) dnl confdb went away at about the same time as plugins
 
 AC_SUBST(SUPPORT_CMAN)
 AC_SUBST(SUPPORT_CS)
 
 dnl
 dnl    Cluster stack - Sanity
 dnl
 
 if test x${enable_no_stack} = xyes; then
     AC_MSG_NOTICE(No cluster stack supported.  Just building the Policy Engine)
     PCMK_FEATURES="$PCMK_FEATURES no-cluster-stack"
 else
     AC_MSG_CHECKING(for supported stacks)
     if test x"$STACKS" = x; then
       AC_MSG_FAILURE(You must support at least one cluster stack (heartbeat or corosync) )
     fi
     AC_MSG_RESULT($STACKS)
     PCMK_FEATURES="$PCMK_FEATURES $STACKS"
 fi
 
 AC_SUBST(CLUSTERLIBS)
 AC_SUBST(LCRSODIR)
 
 dnl ========================================================================
 dnl    SNMP
 dnl ========================================================================
 
 case $SUPPORT_SNMP in
      1|yes|true) missingisfatal=1;;
      try)        missingisfatal=0;;
      *)		 SUPPORT_SNMP=no;;
 esac
 
 SNMPLIBS=""
 
 AC_MSG_CHECKING(for snmp support)
 if test $SUPPORT_SNMP = no; then
    AC_MSG_RESULT(no (disabled))
    SUPPORT_SNMP=0
 else
     SNMPCONFIG=""
     AC_MSG_RESULT($SUPPORT_SNMP)
     AC_CHECK_HEADERS(net-snmp/net-snmp-config.h)
 
     if test "x${ac_cv_header_net_snmp_net_snmp_config_h}" != "xyes"; then
  	SUPPORT_SNMP="no"
     fi
 
     if test $SUPPORT_SNMP != no; then
 	AC_PATH_PROGS(SNMPCONFIG, net-snmp-config)
 	if test "X${SNMPCONFIG}" = "X"; then
 		AC_MSG_RESULT(You need the net_snmp development package to continue.)
 		SUPPORT_SNMP=no
 	fi
     fi
 
     if test $SUPPORT_SNMP != no; then
 	AC_MSG_CHECKING(for special snmp libraries)
 	SNMPLIBS=`$SNMPCONFIG --agent-libs`
 	AC_MSG_RESULT($SNMPLIBS)
     fi
 
     if test $SUPPORT_SNMP != no; then
         savedLibs=$LIBS
         LIBS="$LIBS $SNMPLIBS"
 
         dnl    On many systems libcrypto is needed when linking against libsnmp.
         dnl    Check to see if it exists, and if so use it.
 	dnl AC_CHECK_LIB(crypto, CRYPTO_free, CRYPTOLIB="-lcrypto",)
 	dnl AC_SUBST(CRYPTOLIB)
 
         AC_CHECK_FUNCS(netsnmp_transport_open_client)
         if test $ac_cv_func_netsnmp_transport_open_client != yes; then
             AC_CHECK_FUNCS(netsnmp_tdomain_transport)
             if test $ac_cv_func_netsnmp_tdomain_transport != yes; then
                 SUPPORT_SNMP=no
 	    else
                 AC_DEFINE_UNQUOTED(NETSNMPV53, 1, [Use the older 5.3 version of the net-snmp API])
             fi
         fi
         LIBS=$savedLibs
     fi
 
     if test $SUPPORT_SNMP = no; then
    	SNMPLIBS=""
    	SUPPORT_SNMP=0
      	if test $missingisfatal = 0; then
 	    AC_MSG_WARN(Unable to support SNMP) 
         else
 	    AC_MSG_FAILURE(Unable to support SNMP) 
         fi
     else
    	SUPPORT_SNMP=1
     fi
 fi
 
 if test $SUPPORT_SNMP = 1; then
    PCMK_FEATURES="$PCMK_FEATURES snmp"
 fi
 
 AC_SUBST(SNMPLIBS)
 AM_CONDITIONAL(ENABLE_SNMP, test "$SUPPORT_SNMP" = "1")
 AC_DEFINE_UNQUOTED(ENABLE_SNMP, $SUPPORT_SNMP, Build in support for sending SNMP traps)
 
 dnl ========================================================================
 dnl    ESMTP
 dnl ========================================================================
 
 case $SUPPORT_ESMTP in
      1|yes|true) missingisfatal=1;;
      try)        missingisfatal=0;;
      *)		 SUPPORT_ESMTP=no;;
 esac
 
 ESMTPLIB=""
 
 AC_MSG_CHECKING(for esmtp support)
 if test $SUPPORT_ESMTP = no; then
    AC_MSG_RESULT(no (disabled))
    SUPPORT_ESMTP=0
 else
    ESMTPCONFIG=""
    AC_MSG_RESULT($SUPPORT_ESMTP)
    AC_CHECK_HEADERS(libesmtp.h)
 
    if test "x${ac_cv_header_libesmtp_h}" != "xyes"; then
 	ENABLE_ESMTP="no"
    fi
 
    if test $SUPPORT_ESMTP != no; then
 	AC_PATH_PROGS(ESMTPCONFIG, libesmtp-config)
 	if test "X${ESMTPCONFIG}" = "X"; then
 		AC_MSG_RESULT(You need the libesmtp development package to continue.)
 		SUPPORT_ESMTP=no
 	fi
    fi
 
    if test $SUPPORT_ESMTP != no; then
 	AC_MSG_CHECKING(for special esmtp libraries)
 	ESMTPLIBS=`$ESMTPCONFIG --libs | tr '\n' ' '`
 	AC_MSG_RESULT($ESMTPLIBS)
    fi
 
    if test $SUPPORT_ESMTP = no; then
    	SUPPORT_ESMTP=0
      	if test $missingisfatal = 0; then
 	    AC_MSG_WARN(Unable to support ESMTP) 
         else
 	    AC_MSG_FAILURE(Unable to support ESMTP) 
         fi
    else
    	SUPPORT_ESMTP=1
         PCMK_FEATURES="$PCMK_FEATURES libesmtp"
    fi
 fi
 
 AC_SUBST(ESMTPLIBS)
 AM_CONDITIONAL(ENABLE_ESMTP, test "$SUPPORT_ESMTP" = "1")
 AC_DEFINE_UNQUOTED(ENABLE_ESMTP, $SUPPORT_ESMTP, Build in support for sending mail notifications with ESMTP)
 
 dnl ========================================================================
 dnl    ACL 
 dnl ========================================================================
 
 case $SUPPORT_ACL in
      1|yes|true) missingisfatal=1;;
      try)        missingisfatal=0;;
      *)		 SUPPORT_ACL=no;;
 esac
 
 AC_MSG_CHECKING(for acl support)
 if test $SUPPORT_ACL = no; then
     AC_MSG_RESULT(no (disabled))
     SUPPORT_ACL=0
 else
     AC_MSG_RESULT($SUPPORT_ACL)
 
     AC_CHECK_LIB(qb, qb_ipcs_connection_auth_set)
     if test $ac_cv_lib_qb_qb_ipcs_connection_auth_set != yes; then
         SUPPORT_ACL=0
     else
         SUPPORT_ACL=1
     fi
 
     if test $SUPPORT_ACL = 0; then
         if test $missingisfatal = 0; then
             AC_MSG_WARN(Unable to support ACL. You need to use libqb > 0.13.0) 
         else
             AC_MSG_FAILURE(Unable to support ACL. You need to use libqb > 0.13.0) 
         fi
     fi
 fi
 
 if test $SUPPORT_ACL = 1; then
     PCMK_FEATURES="$PCMK_FEATURES acls"
 fi
 
 AM_CONDITIONAL(ENABLE_ACL, test "$SUPPORT_ACL" = "1")
 AC_DEFINE_UNQUOTED(ENABLE_ACL, $SUPPORT_ACL, Build in support for CIB ACL)
 
 dnl ========================================================================
 dnl    GnuTLS
 dnl ========================================================================
 
 AC_CHECK_HEADERS(gnutls/gnutls.h)
 AC_CHECK_HEADERS(security/pam_appl.h pam/pam_appl.h)
 
 dnl GNUTLS library: Attempt to determine by 'libgnutls-config' program.
 dnl If no 'libgnutls-config', try traditional autoconf means.
 AC_PATH_PROGS(LIBGNUTLS_CONFIG, libgnutls-config)
 
 if test -n "$LIBGNUTLS_CONFIG"; then
 	AC_MSG_CHECKING(for gnutls header flags)
 	GNUTLSHEAD="`$LIBGNUTLS_CONFIG --cflags`";
 	AC_MSG_RESULT($GNUTLSHEAD)
 	AC_MSG_CHECKING(for gnutls library flags)
 	GNUTLSLIBS="`$LIBGNUTLS_CONFIG --libs`";
 	AC_MSG_RESULT($GNUTLSLIBS)
 fi
 AC_CHECK_LIB(gnutls, gnutls_init)
 AC_CHECK_FUNCS(gnutls_priority_set_direct)
 
 AC_SUBST(GNUTLSHEAD)
 AC_SUBST(GNUTLSLIBS)
 
 
 dnl ========================================================================
 dnl    System Health
 dnl ========================================================================
 
 dnl Check if servicelog development package is installed
 SERVICELOG=servicelog-1
 SERVICELOG_EXISTS="no"
 AC_MSG_CHECKING(for $SERVICELOG packages)
 if
     $PKGCONFIG --exists $SERVICELOG
 then
     PKG_CHECK_MODULES([SERVICELOG], [servicelog-1])
     SERVICELOG_EXISTS="yes"
 fi
 AC_MSG_RESULT($SERVICELOG_EXISTS)
 AM_CONDITIONAL(BUILD_SERVICELOG, test "$SERVICELOG_EXISTS" = "yes")
 
 dnl Check if OpenIMPI packages and servicelog are installed
 OPENIPMI="OpenIPMI OpenIPMIposix"
 OPENIPMI_SERVICELOG_EXISTS="no"
 AC_MSG_CHECKING(for $SERVICELOG $OPENIPMI packages)
 if
     $PKGCONFIG --exists $OPENIPMI $SERVICELOG
 then
     PKG_CHECK_MODULES([OPENIPMI_SERVICELOG],[OpenIPMI OpenIPMIposix])
     OPENIPMI_SERVICELOG_EXISTS="yes"
 fi
 AC_MSG_RESULT($OPENIPMI_SERVICELOG_EXISTS)
 AM_CONDITIONAL(BUILD_OPENIPMI_SERVICELOG, test "$OPENIPMI_SERVICELOG_EXISTS" = "yes")
 
 dnl ========================================================================
 dnl Compiler flags
 dnl ========================================================================
 
 dnl Make sure that CFLAGS is not exported. If the user did
 dnl not have CFLAGS in their environment then this should have
 dnl no effect. However if CFLAGS was exported from the user's
 dnl environment, then the new CFLAGS will also be exported
 dnl to sub processes.
 
 CC_ERRORS=""
 CC_EXTRAS=""
 
 if export | fgrep " CFLAGS=" > /dev/null; then
 	SAVED_CFLAGS="$CFLAGS"
 	unset CFLAGS
 	CFLAGS="$SAVED_CFLAGS"
 	unset SAVED_CFLAGS
 fi
 
 if test "$GCC" != yes; then
         CFLAGS="$CFLAGS -g"
 	enable_fatal_warnings=no
 else
         CFLAGS="$CFLAGS -ggdb"
 
 	# We had to eliminate -Wnested-externs because of libtool changes
         EXTRA_FLAGS="-fgnu89-inline
 		-fstack-protector-all
 		-Wall
 		-Waggregate-return
 		-Wbad-function-cast 
 		-Wcast-align 
 		-Wdeclaration-after-statement
 		-Wendif-labels
 		-Wfloat-equal
 		-Wformat=2
 		-Wformat-security
 		-Wformat-nonliteral
 		-Wmissing-prototypes 
 		-Wmissing-declarations 
 		-Wnested-externs
 		-Wno-long-long
 		-Wno-strict-aliasing
 		-Wno-unused-but-set-variable
 		-Wpointer-arith 
 		-Wstrict-prototypes
     		-Wunsigned-char
 		-Wwrite-strings"
 
 # Additional warnings it might be nice to enable one day
 #		-Wshadow
 #		-Wunreachable-code
 
 	for j in $EXTRA_FLAGS
 	do
 	  if
 	    cc_supports_flag $j
 	  then
 	    CC_EXTRAS="$CC_EXTRAS $j"
 	  fi
 	done
 
 dnl In lib/ais/Makefile.am there's a gcc option available as of v4.x
 
 	GCC_MAJOR=`gcc -v 2>&1 | awk 'END{print $3}' | sed 's/[.].*//'`
 	AM_CONDITIONAL(GCC_4, test "${GCC_MAJOR}" = 4)
 
 dnl System specific options
 
 	case "$host_os" in
   	*linux*|*bsd*)
 		if test "${enable_fatal_warnings}" = "unknown"; then
         		enable_fatal_warnings=yes
         	fi
           	;;
 	esac
 
 	if test "x${enable_fatal_warnings}" != xno && cc_supports_flag -Werror ; then
 	   enable_fatal_warnings=yes
 	else
 	   enable_fatal_warnings=no
         fi
 
 	if test "x${enable_ansi}" = xyes && cc_supports_flag -std=iso9899:199409 ; then
 	  AC_MSG_NOTICE(Enabling ANSI Compatibility)
 	  CC_EXTRAS="$CC_EXTRAS -ansi -D_GNU_SOURCE -DANSI_ONLY"
 	fi
 
   	AC_MSG_NOTICE(Activated additional gcc flags: ${CC_EXTRAS})
 fi
 
 CFLAGS="$CFLAGS $CC_EXTRAS"
 
 NON_FATAL_CFLAGS="$CFLAGS"
 AC_SUBST(NON_FATAL_CFLAGS)
 
 dnl
 dnl We reset CFLAGS to include our warnings *after* all function
 dnl checking goes on, so that our warning flags don't keep the
 dnl AC_*FUNCS() calls above from working.  In particular, -Werror will
 dnl *always* cause us troubles if we set it before here.
 dnl
 dnl
 if test "x${enable_fatal_warnings}" = xyes ; then
    AC_MSG_NOTICE(Enabling Fatal Warnings)
    CFLAGS="$CFLAGS -Werror"
 fi
 AC_SUBST(CFLAGS)
 
 dnl This is useful for use in Makefiles that need to remove one specific flag
 CFLAGS_COPY="$CFLAGS"
 AC_SUBST(CFLAGS_COPY)
 
 AC_SUBST(LIBADD_DL)	dnl extra flags for dynamic linking libraries
 AC_SUBST(LIBADD_INTL)	dnl extra flags for GNU gettext stuff...
 
 AC_SUBST(LOCALE)
 
 dnl Options for cleaning up the compiler output 
 QUIET_LIBTOOL_OPTS=""
 QUIET_MAKE_OPTS=""
 if test "x${enable_quiet}" = "xyes"; then
    QUIET_LIBTOOL_OPTS="--quiet"
    QUIET_MAKE_OPTS="--quiet"
 fi
 
 AC_MSG_RESULT(Supress make details: ${enable_quiet})
 
 dnl Put the above variables to use
 LIBTOOL="${LIBTOOL} --tag=CC \$(QUIET_LIBTOOL_OPTS)"
 MAKE="${MAKE} \$(QUIET_MAKE_OPTS)"
 
 AC_SUBST(CC)
 AC_SUBST(MAKE)
 AC_SUBST(LIBTOOL)
 AC_SUBST(QUIET_MAKE_OPTS)
 AC_SUBST(QUIET_LIBTOOL_OPTS)
 AC_DEFINE_UNQUOTED(CRM_FEATURES, "$PCMK_FEATURES", Set of enabled features)
 AC_SUBST(PCMK_FEATURES)
 
 dnl The Makefiles and shell scripts we output
 AC_CONFIG_FILES(Makefile				        \
 cts/Makefile					        	\
 	cts/CTSvars.py						\
 	cts/LSBDummy						\
 	cts/benchmark/Makefile					\
 		cts/benchmark/clubench				\
 cib/Makefile							\
 crmd/Makefile							\
 pengine/Makefile						\
 	pengine/regression.core.sh				\
 doc/Makefile							\
 	doc/Pacemaker_Explained/publican.cfg			\
 	doc/Clusters_from_Scratch/publican.cfg			\
 include/Makefile						\
 	include/crm/Makefile					\
 		include/crm/common/Makefile			\
 		include/crm/pengine/Makefile			\
 replace/Makefile						\
 lib/Makefile							\
 	lib/pcmk.pc						\
 	lib/pcmk-pe.pc						\
 	lib/pcmk-cib.pc						\
 	lib/ais/Makefile					\
 	lib/common/Makefile					\
 	lib/cluster/Makefile					\
 	lib/cib/Makefile					\
 	lib/pengine/Makefile					\
 	lib/transition/Makefile					\
 	lib/fencing/Makefile					\
 	lib/lrmd/Makefile					\
 	lib/services/Makefile					\
 mcp/Makefile							\
 	mcp/pacemaker						\
 	mcp/pacemaker.service					\
 fencing/Makefile                                                \
 lrmd/Makefile                                                \
 extra/Makefile							\
 	extra/resources/Makefile				\
 	extra/rgmanager/Makefile				\
 tools/Makefile							\
 	tools/crm_report					\
 	tools/coverage.sh					\
-	tools/hb2openais.sh					\
-	tools/crm_primitive.py					\
 xml/Makefile							\
 lib/gnu/Makefile						\
 		)
 
 dnl Now process the entire list of files added by previous 
 dnl  calls to AC_CONFIG_FILES()
 AC_OUTPUT()
 
 dnl *****************
 dnl Configure summary
 dnl *****************
 
 AC_MSG_RESULT([])
 AC_MSG_RESULT([$PACKAGE configuration:])
 AC_MSG_RESULT([  Version                  = ${VERSION} (Build: $BUILD_VERSION)])
 AC_MSG_RESULT([  Features                 =${PCMK_FEATURES}])
 AC_MSG_RESULT([])
 AC_MSG_RESULT([  Prefix                   = ${prefix}])
 AC_MSG_RESULT([  Executables              = ${sbindir}])
 AC_MSG_RESULT([  Man pages                = ${mandir}])
 AC_MSG_RESULT([  Libraries                = ${libdir}])
 AC_MSG_RESULT([  Header files             = ${includedir}])
 AC_MSG_RESULT([  Arch-independent files   = ${datadir}])
 AC_MSG_RESULT([  State information        = ${localstatedir}])
 AC_MSG_RESULT([  System configuration     = ${sysconfdir}])
 AC_MSG_RESULT([  Corosync Plugins         = ${LCRSODIR}])
 AC_MSG_RESULT([])
 AC_MSG_RESULT([  Use system LTDL          = ${ac_cv_lib_ltdl_lt_dlopen}])
 AC_MSG_RESULT([])
 AC_MSG_RESULT([  HA group name            = ${CRM_DAEMON_GROUP}])
 AC_MSG_RESULT([  HA user name             = ${CRM_DAEMON_USER}])
 AC_MSG_RESULT([])
 AC_MSG_RESULT([  CFLAGS                   = ${CFLAGS}])
 AC_MSG_RESULT([  Libraries                = ${LIBS}])
 AC_MSG_RESULT([  Stack Libraries          = ${CLUSTERLIBS}])
 
diff --git a/pacemaker.spec.in b/pacemaker.spec.in
index c366318efc..5a3574f0e3 100644
--- a/pacemaker.spec.in
+++ b/pacemaker.spec.in
@@ -1,786 +1,780 @@
 %global gname haclient
 %global uname hacluster
 %global pcmk_docdir %{_docdir}/%{name}
 
 %global specversion 1
 %global upstream_version HEAD
 %global upstream_prefix pacemaker
 
 # Compatibility macros for distros (fedora) that don't provide Python macros by default
 # Do this instead of trying to conditionally include {_rpmconfigdir}/macros.python
 %{!?py_ver:     %{expand: %%global py_ver      %%(echo `python -c "import sys; print sys.version[:3]"`)}}
 %{!?py_prefix:  %{expand: %%global py_prefix   %%(echo `python -c "import sys; print sys.prefix"`)}}
 %{!?py_libdir:  %{expand: %%global py_libdir   %%{expand:%%%%{py_prefix}/%%%%{_lib}/python%%%%{py_ver}}}}
 %{!?py_sitedir: %{expand: %%global py_sitedir  %%{expand:%%%%{py_libdir}/site-packages}}}
 
 # Compatibility macro wrappers for legacy RPM versions that do not
 # support conditional builds
 %{!?bcond_without: %{expand: %%global bcond_without() %%{expand:%%%%{!?_without_%%{1}:%%%%global with_%%{1} 1}}}}
 %{!?bcond_with:    %{expand: %%global bcond_with()    %%{expand:%%%%{?_with_%%{1}:%%%%global with_%%{1} 1}}}}
 %{!?with:          %{expand: %%global with()          %%{expand:%%%%{?with_%%{1}:1}%%%%{!?with_%%{1}:0}}}}
 %{!?without:       %{expand: %%global without()       %%{expand:%%%%{?with_%%{1}:0}%%%%{!?with_%%{1}:1}}}}
 
 %global cs_major %(pkg-config corosync --modversion  | awk -F . '{print $1}')
 %global cs_minor %(pkg-config corosync --modversion  | awk -F . '{print $2}')
 %global rawhide  %(test ! -e /etc/yum.repos.d/fedora-rawhide.repo; echo $?)
 
 # Conditionals
 # Invoke "rpmbuild --without <feature>" or "rpmbuild --with <feature>"
 # to disable or enable specific features
 
 # Supported cluster stacks, must support at least one
 %bcond_without cman
 %bcond_without corosync
 %bcond_with heartbeat
 
 # ESMTP is not available in RHEL, only in EPEL. Allow people to build
 # the RPM without ESMTP in case they choose not to use EPEL packages
 %bcond_with esmtp
 %bcond_with snmp
 
 # Build with/without support for profiling tools
 %bcond_with profiling
 %bcond_with gcov
 
 # We generate docs using Publican, Asciidoc and Inkscape, but they're not available everywhere
 %bcond_without doc
 
 # Use a different versioning scheme
 %bcond_with pre_release
 
 %if %{with profiling}
 # This disables -debuginfo package creation and also the stripping binaries/libraries
 # Useful if you want sane profiling data
 %global debug_package %{nil}
 %endif
 
 %if %{with pre_release}
 %global pcmk_release 0.%{specversion}.%{upstream_version}.git
 %else
 %global pcmk_release %{specversion}
 %endif
 
 Name:          pacemaker
 Summary:       Scalable High-Availability cluster resource manager
 Version:       1.1.7
 Release:       %{pcmk_release}%{?dist}
 License:       GPLv2+ and LGPLv2+
 Url:           http://www.clusterlabs.org
 Group:         System Environment/Daemons
 
 # export VER={upstream_version}
 # wget --no-check-certificate -O ClusterLabs-pacemaker-${VER}.tar.gz https://github.com/ClusterLabs/pacemaker/tarball/${VER}
 Source0:       %{upstream_prefix}-%{upstream_version}.tar.gz
 BuildRoot:     %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
 AutoReqProv:   on
 Requires(pre): cluster-glue
 Requires:      resource-agents
 Requires:      %{name}-libs = %{version}-%{release}
 Requires:      %{name}-cluster-libs = %{version}-%{release}
 Requires:      %{name}-cli = %{version}-%{release}
 Requires:      python >= 2.4
 Conflicts:     heartbeat < 2.99
 
 %if %{with snmp}
 Requires:      perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
 %endif
 
 %if 0%{?suse_version}
 # net-snmp-devel on SLES10 does not suck in tcpd-devel automatically
 BuildRequires: tcpd-devel
 # Suse splits this off into a separate package
 Requires:      python-curses python-xml
 BuildRequires: python-curses python-xml
 %endif
 
 # Required for core functionality
 BuildRequires: automake autoconf libtool pkgconfig python libtool-ltdl-devel
 BuildRequires: glib2-devel cluster-glue-libs-devel libxml2-devel libxslt-devel 
 BuildRequires: pkgconfig python-devel gcc-c++ bzip2-devel pam-devel libuuid-devel
 
 %if 0%{?suse_version} >= 1100
 # Renamed since opensuse-11.0
 BuildRequires:  libgnutls-devel
 %else
 BuildRequires:  gnutls-devel
 %endif
 
 
 # Enables optional functionality
 BuildRequires: ncurses-devel openssl-devel libselinux-devel docbook-style-xsl libqb-devel
 BuildRequires: bison byacc flex help2man
 
 %if %{with cman}
 
 %if 0%{?fedora} > 0
 %if 0%{?fedora} < 17
 BuildRequires: clusterlib-devel
 %endif
 %endif
 
 %if 0%{?rhel} > 0
 %if 0%{?rhel} < 7
 BuildRequires: clusterlib-devel
 %endif
 %endif
 
 %endif
 
 %if %{with esmtp}
 BuildRequires: libesmtp-devel
 %endif
 
 %if %{with snmp}
 %ifarch alpha %{ix86} x86_64
 BuildRequires: lm_sensors-devel
 %endif
 
 BuildRequires: net-snmp-devel
 %endif
 
 %if %{with corosync}
 Requires: corosync
 BuildRequires: corosynclib-devel
 %endif
 
 %if %{with heartbeat}
 # Do not require heartbeat, the admin should select which stack to use and install it
 BuildRequires: heartbeat-devel heartbeat-libs >= 3.0.0
 %endif
 
 %if !%{rawhide}
 # More often than not, inkscape is busted on rawhide, don't even bother
 
 %if %{with doc}
 %ifarch %{ix86} x86_64
 BuildRequires: publican inkscape asciidoc
 %endif
 %endif
 
 %endif
 
 %description
 Pacemaker is an advanced, scalable High-Availability cluster resource
 manager for Linux-HA (Heartbeat) and/or Corosync.
 
 It supports "n-node" clusters with significant capabilities for
 managing resources and dependencies.
 
 It will run scripts at initialization, when machines go up or down,
 when related resources fail and can be configured to periodically check
 resource health.
 
 Available rpmbuild rebuild options:
   --with(out) : heartbeat cman corosync doc publican snmp esmtp pre_release
 
 %package cli
 License:      GPLv2+ and LGPLv2+
 Summary:      Command line tools for controlling Pacemaker clusters
 Group:        System Environment/Daemons
 Requires:     %{name}-libs = %{version}-%{release}
 
 %description cli
 Pacemaker is an advanced, scalable High-Availability cluster resource
 manager for Linux-HA (Heartbeat) and/or Corosync.
 
 The %{name}-cli package contains command line tools that can be used
 to query and control the cluster from machines that may, or may not,
 be part of the cluster.
 
 %package -n %{name}-libs
 License:      GPLv2+ and LGPLv2+
 Summary:      Core Pacemaker libraries
 Group:        System Environment/Daemons
 
 %description -n %{name}-libs
 Pacemaker is an advanced, scalable High-Availability cluster resource
 manager for Linux-HA (Heartbeat) and/or Corosync.
 
 The %{name}-libs package contains shared libraries needed for cluster
 nodes and those just running the CLI tools.
 
 %package -n %{name}-cluster-libs
 License:      GPLv2+ and LGPLv2+
 Summary:      Cluster Libraries used by Pacemaker
 Group:        System Environment/Daemons
 Requires:     %{name}-libs = %{version}-%{release}
 
 %description -n %{name}-cluster-libs
 Pacemaker is an advanced, scalable High-Availability cluster resource
 manager for Linux-HA (Heartbeat) and/or Corosync.
 
 The %{name}-cluster-libs package contains cluster-aware shared
 libraries needed for nodes that will form part of the cluster nodes.
 
 %package -n %{name}-libs-devel 
 License:      GPLv2+ and LGPLv2+
 Summary:      Pacemaker development package
 Group:        Development/Libraries
 Requires:     %{name}-libs = %{version}-%{release}
 Requires:     %{name}-cluster-libs = %{version}-%{release}
 Requires:     cluster-glue-libs-devel libtool-ltdl-devel
 Requires:     libxml2-devel libxslt-devel bzip2-devel glib2-devel 
 %if %{with corosync}
 Requires:     corosynclib-devel
 %endif
 %if %{with heartbeat}
 Requires:     heartbeat-devel
 %endif
 
 %description -n %{name}-libs-devel
 Pacemaker is an advanced, scalable High-Availability cluster resource
 manager for Linux-HA (Heartbeat) and/or Corosync.
 
 The %{name}-libs-devel package contains headers and shared libraries
 for developing tools for Pacemaker.
 
 
 %package      cts
 License:      GPLv2+ and LGPLv2+
 Summary:      Test framework for cluster-related technologies like Pacemaker
 Group:        System Environment/Daemons
 Requires:     python
 
 %description  cts
 Test framework for cluster-related technologies like Pacemaker
 
 %package      doc
 License:      GPLv2+ and LGPLv2+
 Summary:      Documentation for Pacemaker
 Group:        Documentation
 
 %description  doc
 Documentation for Pacemaker.
 
 Pacemaker is an advanced, scalable High-Availability cluster resource
 manager for Linux-HA (Heartbeat) and/or Corosync.
 
 
 %prep
 %setup -q -n %{upstream_prefix}-%{upstream_version}
 
 # Force the local time
 #
 # 'hg archive' sets the file date to the date of the last commit.
 # This can result in files having been created in the future
 # when building on machines in timezones 'behind' the one the 
 # commit occurred in - which seriously confuses 'make'
 find . -exec touch \{\} \;
 
 %build
 ./autogen.sh
 
 %if %{with snmp}
 eval `objdump --headers --private-headers /usr/bin/perl | grep RPATH | awk '{print "export LD_LIBRARY_PATH="$2}'`
 %endif
 
 echo "CSV: %{cs_major} . %{cs_minor}."
 
 # RHEL <= 5 does not support --docdir
 docdir=%{pcmk_docdir} %{configure}                 \
         %{!?with_heartbeat:  --without-heartbeat}  \
         %{!?with_corosync:   --without-ais}        \
         %{!?with_esmtp:      --without-esmtp}      \
         %{!?with_snmp:       --without-snmp}       \
         %{?with_cman:        --with-cman}          \
         %{?with_profiling:   --with-profiling}     \
         %{?with_gcov:        --with-gcov}          \
         --with-initdir=%{_initrddir}               \
         --localstatedir=%{_var}                    \
         --with-version=%{version}-%{release}
 
 make %{_smp_mflags} V=1 docdir=%{pcmk_docdir} all
 
 %install
 rm -rf %{buildroot}
 make DESTDIR=%{buildroot} docdir=%{pcmk_docdir} V=1 install
 
 mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig
 install -m 644 mcp/pacemaker.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/pacemaker
 
 # Scripts that should be executable
-chmod a+x %{buildroot}/%{_libexecdir}/pacemaker/hb2openais-helper.py
 chmod a+x %{buildroot}/%{_datadir}/pacemaker/tests/cts/CTSlab.py
 
 # These are not actually scripts
 find %{buildroot} -name '*.xml' -type f -print0 | xargs -0 chmod a-x
 find %{buildroot} -name '*.xsl' -type f -print0 | xargs -0 chmod a-x
 find %{buildroot} -name '*.rng' -type f -print0 | xargs -0 chmod a-x
 find %{buildroot} -name '*.dtd' -type f -print0 | xargs -0 chmod a-x
  
 # Dont package static libs
 find %{buildroot} -name '*.a' -type f -print0 | xargs -0 rm -f
 find %{buildroot} -name '*.la' -type f -print0 | xargs -0 rm -f
 
 # Do not package these either
-rm -f %{buildroot}/%{_libexecdir}/pacemaker/hb2openais-helper.*
-rm -f %{buildroot}/%{_libexecdir}/pacemaker/crm_primitive.*
 rm -f %{buildroot}/%{_libdir}/service_crm.so
 
 %if %{with gcov}
 GCOV_BASE=%{buildroot}/%{_var}/lib/pacemaker/gcov
 mkdir -p $GCOV_BASE
 find . -name '*.gcno' -type f | while read F ; do
         D=`dirname $F`
         mkdir -p ${GCOV_BASE}/$D
         cp $F ${GCOV_BASE}/$D
 done
 %endif
 
 %clean
 rm -rf %{buildroot}
 
 %post
 /sbin/chkconfig --add pacemaker || :
 
 %preun
 if [ $1 -eq 0 ]; then
         /sbin/service pacemaker stop &>/dev/null || :
         /sbin/chkconfig --del pacemaker || :
 fi
 
 %post -n %{name}-libs -p /sbin/ldconfig
 
 %postun -n %{name}-libs -p /sbin/ldconfig
 
 %post -n %{name}-cluster-libs -p /sbin/ldconfig
 
 %postun -n %{name}-cluster-libs -p /sbin/ldconfig
 
 %files
 ###########################################################
 %defattr(-,root,root)
 
 %exclude %{_datadir}/pacemaker/tests
 
 %config(noreplace) %{_sysconfdir}/sysconfig/pacemaker
 %if %{with corosync}
 %{_sbindir}/pacemakerd
 %{_initrddir}/pacemaker
 %endif
 
 %if %{defined _unitdir}
 %{_unitdir}/pacemaker.service
 %endif
 
 %{_datadir}/pacemaker
 %{_datadir}/snmp/mibs/PCMK-MIB.txt
-#%{_libdir}/heartbeat/*
 %{_libexecdir}/pacemaker/*
 
 %{_sbindir}/crm_attribute
 %{_sbindir}/crm_master
 %{_sbindir}/crm_node
 %{_sbindir}/attrd_updater
 %{_sbindir}/fence_legacy
 %{_sbindir}/fence_pcmk
 %{_bindir}/ccs2cib
 %{_bindir}/ccs_flatten
 %{_bindir}/disable_rgmanager
 %{_sbindir}/stonith_admin
 
 %if %{with heartbeat}
 %{_sbindir}/crm_uuid
 %else
 %exclude %{_sbindir}/crm_uuid
 %endif
 
 %doc %{_mandir}/man7/*
 %doc %{_mandir}/man8/attrd_updater.*
 %doc %{_mandir}/man8/crm_attribute.*
 %doc %{_mandir}/man8/crm_node.*
 %doc %{_mandir}/man8/crm_master.*
 %doc %{_mandir}/man8/fence_pcmk.*
 %if %{with corosync}
 %doc %{_mandir}/man8/pacemakerd.*
 %endif
 %doc %{_mandir}/man8/stonith_admin.*
 
 %doc COPYING
 %doc AUTHORS
 %doc ChangeLog
 
 %dir %attr (750, %{uname}, %{gname}) %{_var}/lib/heartbeat/crm
 %dir %attr (750, %{uname}, %{gname}) %{_var}/lib/pengine
 %dir %attr (750, %{uname}, %{gname}) %{_var}/lib/pacemaker
 %ghost %dir %attr (750, %{uname}, %{gname}) %{_var}/run/crm
 %dir /usr/lib/ocf
 %dir /usr/lib/ocf/resource.d
 /usr/lib/ocf/resource.d/pacemaker
 
 %if %{with corosync}
 %if 0%{?cs_major} < 2
 %if 0%{?cs_minor} < 8
 %{_libexecdir}/lcrso/pacemaker.lcrso
 %endif
 %endif
 %endif
 
 %files cli
 %defattr(-,root,root)
 %{_sbindir}/cibadmin
 %{_sbindir}/crm_diff
 %{_sbindir}/crm_failcount
 %{_sbindir}/crm_mon
 %{_sbindir}/crm_resource
 %{_sbindir}/crm_standby
 %{_sbindir}/crm_verify
 %{_sbindir}/crmadmin
 %{_sbindir}/iso8601
-%{_sbindir}/ptest
 %{_sbindir}/crm_shadow
-%{_sbindir}/cibpipe
 %{_sbindir}/crm_simulate
 %{_sbindir}/crm_report
 %{_sbindir}/crm_ticket
 %doc %{_mandir}/man8/*
 %exclude %{_mandir}/man8/attrd_updater.*
 %exclude %{_mandir}/man8/crm_attribute.*
 %exclude %{_mandir}/man8/crm_node.*
 %exclude %{_mandir}/man8/crm_master.*
 %exclude %{_mandir}/man8/fence_pcmk.*
 %if %{with corosync}
 %exclude %{_mandir}/man8/pacemakerd.*
 %endif
 %exclude %{_mandir}/man8/stonith_admin.*
 
 %doc COPYING
 %doc AUTHORS
 %doc ChangeLog
 
 %files -n %{name}-libs
 %defattr(-,root,root)
 %{_libdir}/libcib.so.*
 %{_libdir}/liblrmd.so.*
 %{_libdir}/libcrmservice.so.*
 %{_libdir}/libcrmcommon.so.*
 %{_libdir}/libpe_status.so.*
 %{_libdir}/libpe_rules.so.*
 %{_libdir}/libpengine.so.*
 %{_libdir}/libtransitioner.so.*
 %doc COPYING.LIB
 %doc AUTHORS
 
 %files -n %{name}-cluster-libs
 %defattr(-,root,root)
 %{_libdir}/libcrmcluster.so.*
 %{_libdir}/libstonithd.so.*
 %doc COPYING.LIB
 %doc AUTHORS
 
 %files doc
 %defattr(-,root,root)
 %doc %{pcmk_docdir}
 
 %files cts
 %defattr(-,root,root)
 %{py_sitedir}/cts
 %{_datadir}/pacemaker/tests/cts
 %doc COPYING.LIB
 %doc AUTHORS
 
 %files -n %{name}-libs-devel
 %defattr(-,root,root)
 %exclude %{_datadir}/pacemaker/tests/cts
 %{_datadir}/pacemaker/tests
 %{_includedir}/pacemaker
 %{_libdir}/*.so
 %if %{with gcov}
 %{_var}/lib/pacemaker
 %endif
 %{_libdir}/pkgconfig/*.pc
 %doc COPYING.LIB
 %doc AUTHORS
 
 %changelog
 
 * Wed Jun 20 2012 Andrew Beekhof <andrew@beekhof.net> Pacemaker-1.1.8-0.1
 - 1.1.8 pre-releases
 
 * Wed Mar 28 2012 Andrew Beekhof <andrew@beekhof.net> Pacemaker-1.1.7-1
 - Update source tarball to revision: bc7ff2c
 - Statistics:
   Changesets: 513
   Diff:       1171 files changed, 90472 insertions(+), 19368 deletions(-)
 - See included ChangeLog file or https://github.com/ClusterLabs/pacemaker/blob/master/ChangeLog for details
 
 * Wed Aug 31 2011 Andrew Beekhof <andrew@beekhof.net> 1.1.6-1
 - Update source tarball to revision: 676e5f25aa46 tip
 - Statistics:
   Changesets: 376
   Diff:       1761 files changed, 36259 insertions(+), 140578 deletions(-)
 - See included ChangeLog file or https://github.com/ClusterLabs/pacemaker/blob/master/ChangeLog for details
 
 * Fri Feb 11 2011 Andrew Beekhof <andrew@beekhof.net> 1.1.5-1
 - Update source tarball to revision: baad6636a053
 - Statistics:
   Changesets: 184
   Diff:       605 files changed, 46103 insertions(+), 26417 deletions(-)
 - See included ChangeLog file or https://github.com/ClusterLabs/pacemaker/blob/master/ChangeLog for details
 
 * Wed Oct 20 2010 Andrew Beekhof <andrew@beekhof.net> 1.1.4-1
 - Moved all the interesting parts of the changelog into a separate file as per the Fedora policy :-/
 - Update source tarball to revision: 75406c3eb2c1 tip
 - Significant performance enhancements to the Policy Engine and CIB
 - Statistics:
   Changesets: 169
   Diff:       772 files changed, 56172 insertions(+), 39309 deletions(-)
 - See included ChangeLog file or http://hg.clusterlabs.org/pacemaker/1.1/file/tip/ChangeLog for details
 
 * Tue Sep 21 2010 Andrew Beekhof <andrew@beekhof.net> 1.1.3-1
 - Update source tarball to revision: e3bb31c56244 tip
 - Statistics:
   Changesets: 352
   Diff:       481 files changed, 14130 insertions(+), 11156 deletions(-)
 
 * Wed May 12 2010 Andrew Beekhof <andrew@beekhof.net> 1.1.2-1
 - Update source tarball to revision: c25c972a25cc tip
 - Statistics:
   Changesets: 339
   Diff:       708 files changed, 37918 insertions(+), 10584 deletions(-)
 
 * Tue Feb 16 2010 Andrew Beekhof <andrew@beekhof.net> - 1.1.1-1
 - First public release of Pacemaker 1.1
 - Package reference documentation in a doc subpackage
 - Move cts into a subpackage so that it can be easily consumed by others
 - Update source tarball to revision: 17d9cd4ee29f
   + New stonith daemon that supports global notifications
   + Service placement influenced by the physical resources
   + A new tool for simulating failures and the cluster’s reaction to them
   + Ability to serialize an otherwise unrelated a set of resource actions (eg. Xen migrations)
 
 * Wed Feb 10 2010 Andrew Beekhof <andrew@beekhof.net> - 1.0.7-4
 - Rebuild for heartbeat 3.0.2-2
 
 * Wed Feb 10 2010 Andrew Beekhof <andrew@beekhof.net> - 1.0.7-3
 - Rebuild for cluster-glue 1.0.3
 
 * Tue Jan 19 2010 Andrew Beekhof <andrew@beekhof.net> - 1.0.7-2
 - Rebuild for corosync 1.2.0
 
 * Mon Jan 18 2010 Andrew Beekhof <andrew@beekhof.net> - 1.0.7-1
 - Update source tarball to revision: 2eed906f43e9 (stable-1.0) tip
 - Statistics:
       Changesets:      193
       Diff:            220 files changed, 15933 insertions(+), 8782 deletions(-)
 
 * Thu Oct 29 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.5-4
 - Include the fixes from CoroSync integration testing
 - Move the resource templates - they are not documentation
 - Ensure documentation is placed in a standard location
 - Exclude documentation that is included elsewhere in the package
 
 - Update the tarball from upstream to version ee19d8e83c2a
   + High: cib: Correctly clean up when both plaintext and tls remote ports are requested
   + High: PE: Bug bnc#515172 - Provide better defaults for lt(e) and gt(e) comparisions
   + High: PE: Bug lf#2197 - Allow master instances placemaker to be influenced by colocation constraints
   + High: PE: Make sure promote/demote pseudo actions are created correctly
   + High: PE: Prevent target-role from promoting more than master-max instances
   + High: ais: Bug lf#2199 - Prevent expected-quorum-votes from being populated with garbage
   + High: ais: Prevent deadlock - dont try to release IPC message if the connection failed
   + High: cib: For validation errors, send back the full CIB so the client can display the errors
   + High: cib: Prevent use-after-free for remote plaintext connections
   + High: crmd: Bug lf#2201 - Prevent use-of-NULL when running heartbeat
 
 * Wed Oct 13 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.5-3
 - Update the tarball from upstream to version 38cd629e5c3c
   + High: Core: Bug lf#2169 - Allow dtd/schema validation to be disabled
   + High: PE: Bug lf#2106 - Not all anonymous clone children are restarted after configuration change
   + High: PE: Bug lf#2170 - stop-all-resources option had no effect
   + High: PE: Bug lf#2171 - Prevent groups from starting if they depend on a complex resource which can not
   + High: PE: Disable resource management if stonith-enabled=true and no stonith resources are defined
   + High: PE: do not include master score if it would prevent allocation
   + High: ais: Avoid excessive load by checking for dead children every 1s (instead of 100ms)
   + High: ais: Bug rh#525589 - Prevent shutdown deadlocks when running on CoroSync
   + High: ais: Gracefully handle changes to the AIS nodeid
   + High: crmd: Bug bnc#527530 - Wait for the transition to complete before leaving S_TRANSITION_ENGINE
   + High: crmd: Prevent use-after-free with LOG_DEBUG_3
   + Medium: xml: Mask the "symmetrical" attribute on rsc_colocation constraints (bnc#540672)
   + Medium (bnc#520707): Tools: crm: new templates ocfs2 and clvm
   + Medium: Build: Invert the disable ais/heartbeat logic so that --without (ais|heartbeat) is available to rpmbuild
   + Medium: PE: Bug lf#2178 - Indicate unmanaged clones
   + Medium: PE: Bug lf#2180 - Include node information for all failed ops
   + Medium: PE: Bug lf#2189 - Incorrect error message when unpacking simple ordering constraint
   + Medium: PE: Correctly log resources that would like to start but can not
   + Medium: PE: Stop ptest from logging to syslog
   + Medium: ais: Include version details in plugin name
   + Medium: crmd: Requery the resource metadata after every start operation
 
 * Fri Aug 21 2009 Tomas Mraz <tmraz@redhat.com> - 1.0.5-2.1
 - rebuilt with new openssl
 
 * Wed Aug 19 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.5-2
 - Add versioned perl dependency as specified by
     https://fedoraproject.org/wiki/Packaging/Perl#Packages_that_link_to_libperl
 - No longer remove RPATH data, it prevents us finding libperl.so and no other
   libraries were being hardcoded
 - Compile in support for heartbeat
 - Conditionally add heartbeat-devel and corosynclib-devel to the -devel requirements 
   depending on which stacks are supported
 
 * Mon Aug 17 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.5-1
 - Add dependency on resource-agents
 - Use the version of the configure macro that supplies --prefix, --libdir, etc
 - Update the tarball from upstream to version 462f1569a437 (Pacemaker 1.0.5 final)
   + High: Tools: crm_resource - Advertise --move instead of --migrate
   + Medium: Extra: New node connectivity RA that uses system ping and attrd_updater
   + Medium: crmd: Note that dc-deadtime can be used to mask the brokeness of some switches
 
 * Tue Aug 11 2009 Ville Skyttä <ville.skytta@iki.fi> - 1.0.5-0.7.c9120a53a6ae.hg
 - Use bzipped upstream tarball.
 
 * Wed Jul  29 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.5-0.6.c9120a53a6ae.hg
 - Add back missing build auto* dependancies
 - Minor cleanups to the install directive
 
 * Tue Jul  28 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.5-0.5.c9120a53a6ae.hg
 - Add a leading zero to the revision when alphatag is used
 
 * Tue Jul  28 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.5-0.4.c9120a53a6ae.hg
 - Incorporate the feedback from the cluster-glue review
 - Realistically, the version is a 1.0.5 pre-release
 - Use the global directive instead of define for variables
 - Use the haclient/hacluster group/user instead of daemon
 - Use the _configure macro
 - Fix install dependancies
 
 * Fri Jul  24 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.4-3
 - Initial Fedora checkin
 - Include an AUTHORS and license file in each package
 - Change the library package name to pacemaker-libs to be more 
   Fedora compliant
 - Remove execute permissions from xml related files
 - Reference the new cluster-glue devel package name
 - Update the tarball from upstream to version c9120a53a6ae
   + High: PE: Only prevent migration if the clone dependency is stopping/starting on the target node
   + High: PE: Bug 2160 - Dont shuffle clones due to colocation
   + High: PE: New implementation of the resource migration (not stop/start) logic
   + Medium: Tools: crm_resource - Prevent use-of-NULL by requiring a resource name for the -A and -a options
   + Medium: PE: Prevent use-of-NULL in find_first_action()
 
 * Tue Jul 14 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.4-2
 - Reference authors from the project AUTHORS file instead of listing in description
 - Change Source0 to reference the Mercurial repo
 - Cleaned up the summaries and descriptions
 - Incorporate the results of Fedora package self-review
 
 * Thu Jun 04 2009 Andrew Beekhof <abeekhof@suse.de> - 1.0.4-1
 - Update source tarball to revision: 1d87d3e0fc7f (stable-1.0)
 - Statistics:
     Changesets:      209
     Diff:            266 files changed, 12010 insertions(+), 8276 deletions(-)
 
 * Wed Apr 08 2009 Andrew Beekhof <abeekhof@suse.de> - 1.0.3-1
 - Update source tarball to revision: b133b3f19797 (stable-1.0) tip
 - Statistics:
     Changesets:      383
     Diff:            329 files changed, 15471 insertions(+), 15119 deletions(-)
 
 * Mon Feb 16 2009 Andrew Beekhof <abeekhof@suse.de> - 1.0.2-1
 - Update source tarball to revision: d232d19daeb9 (stable-1.0) tip
 - Statistics:
     Changesets:      441
     Diff:            639 files changed, 20871 insertions(+), 21594 deletions(-)
 
 * Tue Nov 18 2008 Andrew Beekhof <abeekhof@suse.de> - 1.0.1-1
 - Update source tarball to revision: 6fc5ce8302ab (stable-1.0) tip
 - Statistics:
     Changesets:      170
     Diff:            816 files changed, 7633 insertions(+), 6286 deletions(-)
 
 * Thu Oct 16 2008 Andrew Beekhof <abeekhof@suse.de> - 1.0.0-1
 - Update source tarball to revision: 388654dfef8f tip
 - Statistics:
     Changesets:      261
     Diff:            3021 files changed, 244985 insertions(+), 111596 deletions(-)
 
 * Mon Sep 22 2008 Andrew Beekhof <abeekhof@suse.de> - 0.7.3-1
 - Update source tarball to revision: 33e677ab7764+ tip
 - Statistics:
     Changesets:      133
     Diff:            89 files changed, 7492 insertions(+), 1125 deletions(-)
 
 * Wed Aug 20 2008 Andrew Beekhof <abeekhof@suse.de> - 0.7.1-1
 - Update source tarball to revision: f805e1b30103+ tip
 - Statistics:
     Changesets:      184
     Diff:            513 files changed, 43408 insertions(+), 43783 deletions(-)
 
 * Fri Jul 18 2008 Andrew Beekhof <abeekhof@suse.de> - 0.7.0-19
 - Update source tarball to revision: 007c3a1c50f5 (unstable) tip
 - Statistics:
     Changesets:      108
     Diff:            216 files changed, 4632 insertions(+), 4173 deletions(-)
 
 * Wed Jun 25 2008 Andrew Beekhof <abeekhof@suse.de> - 0.7.0-1
 - Update source tarball to revision: bde0c7db74fb tip
 - Statistics:
     Changesets:      439
     Diff:            676 files changed, 41310 insertions(+), 52071 deletions(-)
 
 * Thu Jun 19 2008 Andrew Beekhof <abeekhof@suse.de> - 0.6.5-1
 - Update source tarball to revision: b9fe723d1ac5 tip
 - Statistics:
     Changesets:      48
     Diff:            37 files changed, 1204 insertions(+), 234 deletions(-)
 
 * Thu May 22 2008 Andrew Beekhof <abeekhof@suse.de> - 0.6.4-1
 - Update source tarball to revision: 226d8e356924 tip
 - Statistics:
     Changesets:       55
     Diff:             199 files changed, 7103 insertions(+), 12378 deletions(-)
 
 * Wed Apr 23 2008 Andrew Beekhof <abeekhof@suse.de> - 0.6.3-1
 - Update source tarball to revision: fd8904c9bc67 tip
 - Statistics:
     Changesets:      117
     Diff:            354 files changed, 19094 insertions(+), 11338 deletions(-)
 
 * Thu Feb 14 2008 Andrew Beekhof <abeekhof@suse.de> - 0.6.2-1
 - Update source tarball to revision: 28b1a8c1868b tip
 - Statistics:
     Changesets:    11
     Diff:          7 files changed, 58 insertions(+), 18 deletions(-)
 
 * Tue Feb 12 2008 Andrew Beekhof <abeekhof@suse.de> - 0.6.1-1
 - Update source tarball to revision: e7152d1be933 tip
 - Statistics:
     Changesets:    25
     Diff:          37 files changed, 1323 insertions(+), 227 deletions(-)
 
 * Mon Jan 14 2008 Andrew Beekhof <abeekhof@suse.de> - 0.6.0-2
 - This is the first release of the Pacemaker Cluster Resource Manager formerly part of Heartbeat.
 - For those looking for the GUI, mgmtd, CIM or TSA components, they are now found in
   the new pacemaker-pygui project.  Build dependancies prevent them from being
   included in Heartbeat (since the built-in CRM is no longer supported) and,
   being non-core components, are not included with Pacemaker.
 - Update source tarball to revision: c94b92d550cf
 - Statistics:
     Changesets:      347
     Diff:            2272 files changed, 132508 insertions(+), 305991 deletions(-)
 - Test hardware:
     + 6-node vmware cluster (sles10-sp1/256Mb/vmware stonith) on a single host (opensuse10.3/2Gb/2.66Ghz Quad Core2)
     + 7-node EMC Centera cluster (sles10/512Mb/2Ghz Xeon/ssh stonith)
 - Notes: Heartbeat Stack
     + All testing was performed with STONITH enabled
     + The CRM was enabled using the "crm respawn" directive
 - Notes: OpenAIS Stack
     + This release contains a preview of support for the OpenAIS cluster stack
     + The current release of the OpenAIS project is missing two important
     patches that we require.  OpenAIS packages containing these patches are
     available for most major distributions at:
     http://download.opensuse.org/repositories/server:/ha-clustering
     + The OpenAIS stack is not currently recommended for use in clusters that
     have shared data as STONITH support is not yet implimented
     + pingd is not yet available for use with the OpenAIS stack
     + 3 significant OpenAIS issues were found during testing of 4 and 6 node
     clusters.  We are activly working together with the OpenAIS project to
     get these resolved.
 - Pending bugs encountered during testing:
     + OpenAIS   #1736 - Openais membership took 20s to stabilize
     + Heartbeat #1750 - ipc_bufpool_update: magic number in head does not match
     + OpenAIS   #1793 - Assertion failure in memb_state_gather_enter()
     + OpenAIS   #1796 - Cluster message corruption
 
 * Mon Dec 10 2007 Andrew Beekhof <abeekhof@suse.de> - 0.6.0-1
 - Initial opensuse package check-in
diff --git a/pengine/Makefile.am b/pengine/Makefile.am
index 2ca91514b3..3d436daf1e 100644
--- a/pengine/Makefile.am
+++ b/pengine/Makefile.am
@@ -1,97 +1,89 @@
 #
 # Copyright (C) 2004 Andrew Beekhof
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 # as published by the Free Software Foundation; either version 2
 # of the License, or (at your option) any later version.
 # 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #
 MAINTAINERCLEANFILES    = Makefile.in
 
 INCLUDES        = -I$(top_builddir)/include -I$(top_srcdir)/include	\
 		-I$(top_builddir)           -I$(top_srcdir)		\
 		-I$(top_builddir)/libltdl   -I$(top_srcdir)/libltdl
 
 halibdir	= $(CRM_DAEMON_DIR)
 
 PE_TESTS	= $(wildcard test10/*.scores)
 
 testdir			= $(datadir)/$(PACKAGE)/tests/pengine
 test_SCRIPTS		= regression.sh
 test_DATA		= regression.core.sh ptest.supp
 
 test10dir		= $(datadir)/$(PACKAGE)/tests/pengine/test10
 test10_DATA		= $(PE_TESTS) $(PE_TESTS:%.scores=%.xml) $(PE_TESTS:%.scores=%.exp) $(PE_TESTS:%.scores=%.dot)
 
 COMMONLIBS	= 					\
 		$(top_builddir)/lib/common/libcrmcommon.la		\
 		$(top_builddir)/lib/pengine/libpe_status.la		\
 		libpengine.la $(CURSESLIBS) $(CLUSTERLIBS) 
 
 ## libraries
 lib_LTLIBRARIES	= libpengine.la
 
 ## binary progs
 halib_PROGRAMS	= pengine
-sbin_PROGRAMS	= ptest
 
 man7_MANS =
-man8_MANS =
-
-if BUILD_HELP
-man8_MANS +=	ptest.8
-ptest.8:	ptest
-	$(HELP2MAN) --output $@ --no-info --section 8 --name "Part of the Pacemaker cluster resource manager" $(top_builddir)/pengine/$<
-endif
 
 if BUILD_XML_HELP
 man7_MANS +=	pengine.7
 
 pengine.xml:	pengine
 	$(top_builddir)/pengine/$< metadata | $(XSLTPROC) --nonet --novalid --stringparam man.name $< $(top_srcdir)/xml/ocf-meta2man.xsl - > $(top_builddir)/pengine/$@
 
 pengine.7:	pengine.xml
 	$(XSLTPROC) $(MANPAGE_XSLT) $(top_builddir)/pengine/$<
 endif
 
 ## SOURCES
 noinst_HEADERS	= allocate.h utils.h pengine.h
 #utils.h pengine.h
 
 libpengine_la_LDFLAGS	= -version-info 3:1:0
 # -L$(top_builddir)/lib/pils -lpils -export-dynamic -module -avoid-version 
 libpengine_la_SOURCES	= pengine.c allocate.c utils.c constraints.c
 libpengine_la_SOURCES  += native.c group.c clone.c master.c graph.c
 
 libpengine_la_LIBADD    = $(top_builddir)/lib/pengine/libpe_status.la \
 	$(top_builddir)/lib/cib/libcib.la
 
 pengine_SOURCES	= main.c
 pengine_LDADD	= $(top_builddir)/lib/cib/libcib.la $(COMMONLIBS)
 # libcib for get_object_root()
 #		$(top_builddir)/lib/hbclient/libhbclient.la
 
 ptest_SOURCES	= ptest.c 
 ptest_LDADD	= $(top_builddir)/lib/cib/libcib.la			\
 		$(top_builddir)/lib/transition/libtransitioner.la	\
 		$(COMMONLIBS)
 
 install-exec-local:
 	$(mkinstalldirs) $(DESTDIR)/$(PE_STATE_DIR)
 	-chown $(CRM_DAEMON_USER) $(DESTDIR)/$(PE_STATE_DIR)
 	-chgrp $(CRM_DAEMON_GROUP) $(DESTDIR)/$(PE_STATE_DIR)
 	-chmod 750 $(DESTDIR)/$(PE_STATE_DIR)
 
 uninstall-local:
 
 clean-generic:
 	rm -f test10/*.pe.*
diff --git a/tools/Makefile.am b/tools/Makefile.am
index beaf2ba166..3f3e1b0c07 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,159 +1,157 @@
 #
 # Copyright (C) 2004-2009 Andrew Beekhof
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 # as published by the Free Software Foundation; either version 2
 # of the License, or (at your option) any later version.
 # 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #
 MAINTAINERCLEANFILES    = Makefile.in 
 
 INCLUDES                = -I$(top_builddir)/include -I$(top_srcdir)/include   \
 			  -I$(top_builddir)/libltdl -I$(top_srcdir)/libltdl
 
 COMMONLIBS	= 							\
 		$(top_builddir)/lib/common/libcrmcommon.la		\
 		$(top_builddir)/lib/cib/libcib.la			\
 		$(CURSESLIBS) $(CLUSTERLIBS) 
 
 headerdir               = $(pkgincludedir)/crm
 header_HEADERS		= 
 
 pcmkdir			= $(datadir)/$(PACKAGE)
 pcmk_DATA		= report.common report.collector
 
 sbin_SCRIPTS		= crm_report crm_standby crm_master crm_failcount
 EXTRA_DIST		= $(sbin_SCRIPTS)
 
 halibdir		= $(CRM_DAEMON_DIR)
-halib_SCRIPTS		= hb2openais.sh
 halib_PROGRAMS		= attrd
-halib_PYTHON		= crm_primitive.py hb2openais-helper.py
 
 sbin_PROGRAMS		= crm_simulate crmadmin cibadmin crm_node crm_attribute crm_resource crm_verify \
 			 crm_uuid crm_shadow attrd_updater crm_diff crm_mon iso8601 crm_ticket
 
 testdir			= $(datadir)/$(PACKAGE)/tests
 test_SCRIPTS		= coverage.sh
 
 clidir			= $(testdir)/cli
 cli_SCRIPTS		= regression.sh
 cli_DATA		= regression.exp cli.supp
 
 if BUILD_SERVICELOG
 sbin_PROGRAMS		+= notifyServicelogEvent
 endif
 if BUILD_OPENIPMI_SERVICELOG
 sbin_PROGRAMS		+= ipmiservicelogd
 endif
 
 if BUILD_HELP
 man8_MANS =		$(sbin_PROGRAMS:%=%.8) $(sbin_SCRIPTS:%=%.8)
 endif
 
 ## SOURCES
 
 noinst_HEADERS		= 
 
 crmadmin_SOURCES	= crmadmin.c
 crmadmin_LDADD		= $(top_builddir)/lib/pengine/libpe_status.la \
 			  $(COMMONLIBS) $(CLUSTERLIBS)
 
 crm_uuid_SOURCES	= crm_uuid.c
 crm_uuid_LDADD		= $(COMMONLIBS) $(top_builddir)/lib/cluster/libcrmcluster.la
 
 cibadmin_SOURCES	= cibadmin.c
 cibadmin_LDADD		= $(COMMONLIBS) 
 
 crm_shadow_SOURCES	= cib_shadow.c
 crm_shadow_LDADD	= $(COMMONLIBS) 
 
 crm_node_SOURCES	= crm_node.c
 crm_node_LDADD		= $(top_builddir)/lib/cluster/libcrmcluster.la \
 			  $(COMMONLIBS) $(CLUSTERLIBS)
 
 crm_simulate_SOURCES	= crm_inject.c
 crm_simulate_CFLAGS	= -I$(top_srcdir)/pengine
 
 crm_simulate_LDADD	= $(top_builddir)/lib/pengine/libpe_status.la		\
 			$(top_builddir)/pengine/libpengine.la 			\
 			$(top_builddir)/lib/cib/libcib.la			\
 			$(top_builddir)/lib/lrmd/liblrmd.la			\
 			$(top_builddir)/lib/transition/libtransitioner.la	\
 			$(COMMONLIBS)
 
 crm_diff_SOURCES	= xml_diff.c
 crm_diff_LDADD		= $(COMMONLIBS)
 
 crm_mon_SOURCES		= crm_mon.c
 crm_mon_LDADD		= $(top_builddir)/lib/pengine/libpe_status.la		\
 			  $(top_builddir)/pengine/libpengine.la \
 			  $(COMMONLIBS) $(SNMPLIBS) $(ESMTPLIBS)
 
 # Arguments could be made that this should live in crm/pengine
 crm_verify_SOURCES	= crm_verify.c
 crm_verify_LDADD	= $(top_builddir)/lib/pengine/libpe_status.la 	\
 			$(top_builddir)/pengine/libpengine.la		\
 			$(COMMONLIBS)
 
 crm_attribute_SOURCES	= crm_attribute.c
 crm_attribute_LDADD	= $(COMMONLIBS)
 
 crm_resource_SOURCES	= crm_resource.c
 crm_resource_LDADD	= $(top_builddir)/lib/pengine/libpe_rules.la  \
 			$(top_builddir)/lib/pengine/libpe_status.la \
 			$(top_builddir)/pengine/libpengine.la \
 			$(COMMONLIBS)
 
 iso8601_SOURCES		= test.iso8601.c
 iso8601_LDADD		= $(COMMONLIBS) 
 
 attrd_SOURCES		= attrd.c
 attrd_LDADD		= $(top_builddir)/lib/cluster/libcrmcluster.la $(COMMONLIBS)
 
 #pingd_SOURCES		= pingd.c
 #pingd_LDADD		= $(COMMONLIBS)
 
 attrd_updater_SOURCES	= attrd_updater.c
 attrd_updater_LDADD	= $(COMMONLIBS)
 
 crm_ticket_SOURCES	= crm_ticket.c
 crm_ticket_LDADD	= $(top_builddir)/lib/pengine/libpe_rules.la  \
 			$(top_builddir)/lib/pengine/libpe_status.la \
 			$(top_builddir)/pengine/libpengine.la \
 			$(COMMONLIBS)
 
 if BUILD_SERVICELOG
 notifyServicelogEvent_SOURCES	= notifyServicelogEvent.c
 notifyServicelogEvent_CFLAGS	= $(SERVICELOG_CFLAGS)
 notifyServicelogEvent_LDADD	= $(top_builddir)/lib/common/libcrmcommon.la $(SERVICELOG_LIBS)
 endif
 
 if BUILD_OPENIPMI_SERVICELOG
 ipmiservicelogd_SOURCES	= ipmiservicelogd.c
 ipmiservicelogd_CFLAGS	= $(OPENIPMI_SERVICELOG_CFLAGS) $(SERVICELOG_CFLAGS) 
 ipmiservicelogd_LDFLAGS	= $(top_builddir)/lib/common/libcrmcommon.la $(OPENIPMI_SERVICELOG_LIBS) $(SERVICELOG_LIBS)
 endif
 
 %.8:	% crm_attribute
 	echo Creating $@
 	chmod a+x $(top_builddir)/tools/$<
 	PATH=$(top_builddir)/tools:$$PATH $(HELP2MAN) --output $@ --no-info --section 8 --name "Part of the Pacemaker cluster resource manager" $(top_builddir)/tools/$<
 
 clean-generic:
 	rm -f *.log *.debug *.xml *~
 
 install-exec-local:
 
 uninstall-local:
 
 .PHONY: install-exec-hook
diff --git a/tools/hb2openais-helper.py b/tools/hb2openais-helper.py
deleted file mode 100755
index 4bc8e0c76e..0000000000
--- a/tools/hb2openais-helper.py
+++ /dev/null
@@ -1,578 +0,0 @@
-#!/usr/bin/env python
-
- # Copyright (C) 2008,2009 Dejan Muhamedagic <dmuhamedagic@suse.de>
- # 
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public
- # License as published by the Free Software Foundation; either
- # version 2 of the License, or (at your option) any later version.
- # 
- # This software is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- # General Public License for more details.
- # 
- # You should have received a copy of the GNU General Public
- # License along with this library; if not, write to the Free Software
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- #
-
-import os,sys
-import getopt
-import re
-import xml.dom.minidom
-
-def usage():
-    print >> sys.stderr, "usage: %s [-T] [-c ha_cf] {set_property <name> <value>|analyze_cib|convert_cib|manage_ocfs2 {start|stop}|print_ocfs2_devs}"%sys.argv[0]
-    sys.exit(1)
-
-TEST = False
-try:
-    optlist, arglist = getopt.getopt(sys.argv[1:], "hTc:")
-except getopt.GetoptError:
-    usage()
-for opt,arg in optlist:
-    if opt == '-h':
-        usage()
-    elif opt == '-c':
-        HA_CF = arg
-    elif opt == '-T':
-        TEST = True
-if len(arglist) < 1:
-    usage()
-
-def load_cib():
-    doc = xml.dom.minidom.parse(sys.stdin)
-    return doc
-def is_whitespace(node):
-    return node.nodeType == node.TEXT_NODE and not node.data.strip()
-def rmnodes(node_list):
-    for node in node_list:
-        node.parentNode.removeChild(node)
-        node.unlink()
-def get_children_cnt(node,taglist):
-    cnt = 0
-    for c in node.childNodes:
-        if is_element(c) and c.tagName in taglist:
-            cnt += 1
-    return cnt
-def is_empty_group(node):
-    return is_element(node) and node.tagName == "group" and \
-        get_children_cnt(node,["primitive"]) == 0
-def is_empty_clone(node):
-    return is_element(node) and node.tagName == "clone" and \
-        get_children_cnt(node,["primitive","group"]) == 0
-def is_constraint(node):
-    return is_element(node) and node.tagName in cons_tags
-def is_id_node(node):
-    return is_element(node) and node.getAttribute("id")
-def is_badid(id):
-    return re.match("^[^a-zA-Z_]",id)
-def fix_id(node):
-    newid = "A"+node.getAttribute("id")
-    node.setAttribute("id",newid)
-    return newid
-rename_ids = {}  # global used in rename_refs
-def fix_ids(node_list):
-    for node in node_list:
-        oldid = node.getAttribute("id")
-        if is_badid(oldid):
-            newid = fix_id(node)
-            rename_ids[oldid] = newid
-def rename_refs(node_list):
-    for node in node_list:
-        for attr in cons_idattr_list[node.tagName]:
-            ref = node.getAttribute(attr)
-            if ref in rename_ids.keys():
-                node.setAttribute(attr,rename_ids[ref])
-def set_id2uname(node_list):
-    for node in node_list:
-        if node.tagName != "node":
-            continue
-        id = node.getAttribute("id")
-        uname = node.getAttribute("uname")
-        if uname:
-            node.setAttribute("id",uname)
-        else:
-            print >> sys.stderr, "WARNING: node %s has no uname attribute" % id
-def is_element(xmlnode):
-    return xmlnode.nodeType == xmlnode.ELEMENT_NODE
-def xml_processnodes(xmlnode,filter,proc):
-    '''
-    Process with proc all nodes that match filter.
-    '''
-    node_list = []
-    for child in xmlnode.childNodes:
-        if filter(child):
-            node_list.append(child)
-        if child.hasChildNodes():
-            xml_processnodes(child,filter,proc)
-    if node_list:
-        proc(node_list)
-def skip_first(s):
-    l = s.split('\n')
-    return '\n'.join(l[1:])
-def get_attribute(tag,node,p):
-    attr_set = node.getElementsByTagName(tag)
-    if not attr_set:
-        return ''
-    attributes = attr_set[0].getElementsByTagName("attributes")
-    if not attributes:
-        return ''
-    attributes = attributes[0]
-    for nvpair in attributes.getElementsByTagName("nvpair"):
-        if p == nvpair.getAttribute("name"):
-            return nvpair.getAttribute("value")
-    return ''
-def get_param(node,p):
-    return get_attribute("instance_attributes",node,p)
-def mknvpair(id,name,value):
-    nvpair = doc.createElement("nvpair")
-    nvpair.setAttribute("id",id + "-" + name)
-    nvpair.setAttribute("name",name)
-    nvpair.setAttribute("value",value)
-    return nvpair
-def set_attribute(tag,node,p,value,overwrite = True):
-    attr_set = node.getElementsByTagName(tag)
-    if not attr_set:
-        return ["",False]
-    set_id = attr_set[0].getAttribute("id")
-    attributes = attr_set[0].getElementsByTagName("attributes")
-    if not attributes:
-        attributes = doc.createElement("attributes")
-        attr_set[0].appendChild(attributes)
-    else:
-        attributes = attributes[0]
-    for nvp in attributes.getElementsByTagName("nvpair"):
-        if p == nvp.getAttribute("name"):
-            if overwrite:
-                nvp.setAttribute("value",value)
-            return [nvp.getAttribute("value"),overwrite]
-    attributes.appendChild(mknvpair(set_id,p,value))
-    return [value,True]
-
-doc = load_cib()
-xml_processnodes(doc,is_whitespace,rmnodes)
-resources = doc.getElementsByTagName("resources")[0]
-constraints = doc.getElementsByTagName("constraints")[0]
-nodes = doc.getElementsByTagName("nodes")[0]
-crm_config = doc.getElementsByTagName("crm_config")[0]
-rsc_tags = ("primitive","group","clone","ms")
-cons_tags = ("rsc_location","rsc_order","rsc_colocation")
-cons_idattr_list = {
-    "rsc_location": ("rsc",),
-    "rsc_order": ("from","to"),
-    "rsc_colocation": ("from","to"),
-}
-if not resources:
-    print >> sys.stderr, "ERROR: sorry, no resources section in the CIB, cannot proceed"
-    sys.exit(1)
-if not constraints:
-    print >> sys.stderr, "ERROR: sorry, no constraints section in the CIB, cannot proceed"
-    sys.exit(1)
-if not nodes:
-    print >> sys.stderr, "ERROR: sorry, no nodes section in the CIB, cannot proceed"
-    sys.exit(1)
-
-if arglist[0] == "set_node_ids":
-    xml_processnodes(nodes,lambda x:1,set_id2uname)
-    s = skip_first(doc.toprettyxml())
-    print s
-    sys.exit(0)
-
-if arglist[0] == "set_property":
-    overwrite = False
-    if len(arglist) == 4:
-        if arglist[3] == "overwrite":
-            overwrite = True
-    elif len(arglist) != 3:
-        usage()
-    p = arglist[1]
-    value = arglist[2]
-    set_value,rc = set_attribute("cluster_property_set", \
-        crm_config,p,value,overwrite)
-    if not set_value and not rc:
-        print >> sys.stderr, \
-            "WARNING: cluster_property_set not found"
-    elif not rc:
-        print >> sys.stderr, \
-            "INFO: cluster property %s is set to %s and NOT overwritten to %s" % (p,set_value,value)
-    else:
-        print >> sys.stderr, \
-            "INFO: cluster property %s set to %s" % (p,set_value)
-    s = skip_first(doc.toprettyxml())
-    print s
-    sys.exit(0)
-
-if arglist[0] == "analyze_cib":
-    rc = 0
-    for rsc in doc.getElementsByTagName("primitive"):
-        rsc_type = rsc.getAttribute("type")
-        if rsc_type == "EvmsSCC":
-            print >> sys.stderr, "INFO: evms configuration found; conversion required"
-            rc = 1
-        elif rsc_type == "Filesystem":
-            if get_param(rsc,"fstype") == "ocfs2":
-                print >> sys.stderr, "INFO: ocfs2 configuration found; conversion required"
-                rc = 1
-    sys.exit(rc)
-
-if arglist[0] == "print_ocfs2_devs":
-    for rsc in doc.getElementsByTagName("primitive"):
-        if rsc.getAttribute("type") == "Filesystem":
-            if get_param(rsc,"fstype") == "ocfs2":
-                print get_param(rsc,"device")
-    sys.exit(0)
-
-def rm_attribute(tag,node,p):
-    attr_set = node.getElementsByTagName(tag)
-    if not attr_set:
-        return ''
-    attributes = attr_set[0].getElementsByTagName("attributes")
-    if not attributes:
-        return ''
-    attributes = attributes[0]
-    for nvpair in attributes.getElementsByTagName("nvpair"):
-        if p == nvpair.getAttribute("name"):
-            nvpair.parentNode.removeChild(nvpair)
-def set_param(node,p,value):
-    set_attribute("instance_attributes",node,p,value)
-def rm_param(node,p):
-    rm_attribute("instance_attributes",node,p)
-def evms2lvm(node,a):
-    v = node.getAttribute(a)
-    if v:
-        v = v.replace("EVMS","LVM")
-        v = v.replace("Evms","LVM")
-        v = v.replace("evms","lvm")
-        node.setAttribute(a,v)
-def replace_evms_strings(node_list):
-    for node in node_list:
-        evms2lvm(node,"id")
-        if node.tagName in ("rsc_colocation","rsc_order"):
-            evms2lvm(node,"to")
-            evms2lvm(node,"from")
-
-def get_input(msg):
-    if TEST:
-        print >> sys.stderr, "%s: setting to /dev/null" % msg
-        return "/dev/null"
-    while True:
-        ans = raw_input(msg)
-        if ans:
-            if os.access(ans,os.F_OK):
-                return ans
-            else:
-                print >> sys.stderr, "Cannot read %s" % ans
-        print >> sys.stderr, "We do need this input to continue."
-def mk_lvm(rsc_id,volgrp):
-    print >> sys.stderr, \
-        "INFO: creating LVM resource %s for vg %s" % (rsc_id,volgrp)
-    node = doc.createElement("primitive")
-    node.setAttribute("id",rsc_id)
-    node.setAttribute("type","LVM")
-    node.setAttribute("provider","heartbeat")
-    node.setAttribute("class","ocf")
-    operations = doc.createElement("operations")
-    node.appendChild(operations)
-    mon_op = doc.createElement("op")
-    operations.appendChild(mon_op)
-    mon_op.setAttribute("id", rsc_id + "_mon")
-    mon_op.setAttribute("name","monitor")
-    interval = "120s"
-    timeout = "60s"
-    mon_op.setAttribute("interval", interval)
-    mon_op.setAttribute("timeout", timeout)
-    instance_attributes = doc.createElement("instance_attributes")
-    instance_attributes.setAttribute("id", rsc_id + "_inst_attr")
-    node.appendChild(instance_attributes)
-    attributes = doc.createElement("attributes")
-    instance_attributes.appendChild(attributes)
-    attributes.appendChild(mknvpair(rsc_id,"volgrpname",volgrp))
-    return node
-def mk_clone(id,ra_type,ra_class,prov):
-    c = doc.createElement("clone")
-    c.setAttribute("id",id + "-clone")
-    meta = doc.createElement("meta_attributes")
-    c.appendChild(meta)
-    meta.setAttribute("id",id + "_meta")
-    attributes = doc.createElement("attributes")
-    meta.appendChild(attributes)
-    attributes.appendChild(mknvpair(id,"globally-unique","false"))
-    attributes.appendChild(mknvpair(id,"interleave","true"))
-    p = doc.createElement("primitive")
-    c.appendChild(p)
-    p.setAttribute("id",id)
-    p.setAttribute("type",ra_type)
-    if prov:
-        p.setAttribute("provider",prov)
-    p.setAttribute("class",ra_class)
-    operations = doc.createElement("operations")
-    p.appendChild(operations)
-    mon_op = doc.createElement("op")
-    operations.appendChild(mon_op)
-    mon_op.setAttribute("id", id + "_mon")
-    mon_op.setAttribute("name","monitor")
-    interval = "60s"
-    timeout = "30s"
-    mon_op.setAttribute("interval", interval)
-    mon_op.setAttribute("timeout", timeout)
-    return c
-def add_ocfs_clones():
-    c1 = mk_clone("o2cb","o2cb","ocf","ocfs2")
-    c2 = mk_clone("dlm","controld","ocf","pacemaker")
-    print >> sys.stderr, \
-        "INFO: adding clones o2cb-clone and dlm-clone"
-    resources.appendChild(c1)
-    resources.appendChild(c2)
-    c1 = mk_order("dlm-clone","o2cb-clone")
-    c2 = mk_colocation("dlm-clone","o2cb-clone")
-    constraints.appendChild(c1)
-    constraints.appendChild(c2)
-def mk_order(r1,r2):
-    rsc_order = doc.createElement("rsc_order")
-    rsc_order.setAttribute("id","rsc_order_"+r1+"_"+r2)
-    rsc_order.setAttribute("from",r1)
-    rsc_order.setAttribute("to",r2)
-    rsc_order.setAttribute("type","before")
-    rsc_order.setAttribute("score","INFINITY")
-    rsc_order.setAttribute("symmetrical","true")
-    return rsc_order
-def mk_colocation(r1,r2):
-    rsc_colocation = doc.createElement("rsc_colocation")
-    rsc_colocation.setAttribute("id","rsc_colocation_"+r1+"_"+r2)
-    rsc_colocation.setAttribute("from",r1)
-    rsc_colocation.setAttribute("to",r2)
-    rsc_colocation.setAttribute("score","INFINITY")
-    return rsc_colocation
-def add_ocfs_constraints(rsc):
-    node = rsc.parentNode
-    if node.tagName != "clone":
-        node = rsc
-    rsc_id = node.getAttribute("id")
-    print >> sys.stderr, \
-        "INFO: adding constraints for o2cb-clone and %s" % rsc_id
-    c1 = mk_order("o2cb-clone",rsc_id)
-    c2 = mk_colocation("o2cb-clone",rsc_id)
-    constraints.appendChild(c1)
-    constraints.appendChild(c2)
-def add_lvm_constraints(lvm_id,rsc):
-    node = rsc.parentNode
-    if node.tagName != "clone":
-        node = rsc
-    rsc_id = node.getAttribute("id")
-    print >> sys.stderr, \
-        "INFO: adding constraints for %s and %s" % (lvm_id,rsc_id)
-    c1 = mk_order(lvm_id,rsc_id)
-    c2 = mk_colocation(lvm_id,rsc_id)
-    constraints.appendChild(c1)
-    constraints.appendChild(c2)
-def change_ocfs2_device(rsc):
-    print >> sys.stderr, "The current device for ocfs2 depends on evms: %s"%get_param(rsc,"device")
-    dev = get_input("Please supply the device where %s ocfs2 resource resides: "%rsc.getAttribute("id"))
-    set_param(rsc,"device",dev)
-def set_target_role(rsc,target_role):
-    node = rsc.parentNode
-    if node.tagName != "clone":
-        node = rsc
-    id = node.getAttribute("id")
-    l = rsc.getElementsByTagName("meta_attributes")
-    if l:
-        meta = l[0]
-    else:
-        meta = doc.createElement("meta_attributes")
-        meta.setAttribute("id",id + "_meta")
-        node.appendChild(meta)
-        attributes = doc.createElement("attributes")
-        meta.appendChild(attributes)
-    rm_param(rsc,"target_role")
-    set_attribute("meta_attributes",node,"target_role",target_role)
-def start_ocfs2(node_list):
-    for node in node_list:
-        set_target_role(node,"Started")
-def stop_ocfs2(node_list):
-    for node in node_list:
-        set_target_role(node,"Stopped")
-def is_ocfs2_fs(node):
-    return node.tagName == "primitive" and \
-        node.getAttribute("type") == "Filesystem" and \
-        get_param(node,"fstype") == "ocfs2"
-def new_pingd_rsc(options,host_list):
-    rsc_id = "pingd"
-    c = mk_clone(rsc_id,"pingd","ocf","pacemaker")
-    node = c.getElementsByTagName("primitive")[0]
-    instance_attributes = doc.createElement("instance_attributes")
-    instance_attributes.setAttribute("id", rsc_id + "_inst_attr")
-    node.appendChild(instance_attributes)
-    attributes = doc.createElement("attributes")
-    instance_attributes.appendChild(attributes)
-    if options:
-        attributes.appendChild(mknvpair(rsc_id,"options",options))
-    set_param(node,"host_list",host_list)
-    return c
-def new_cloned_rsc(rsc_class,rsc_provider,rsc_type):
-    return mk_clone(rsc_type,rsc_type,rsc_class,rsc_provider)
-def find_respawn(prog):
-    rc = False
-    f = open(HA_CF or "/etc/ha.d/ha.cf", 'r')
-    for l in f:
-        s = l.split()
-        if not s:
-            continue
-        if s[0] == "respawn" and s[2].find(prog) > 0:
-            rc = True
-            break
-    f.close()
-    return rc
-def parse_pingd_respawn():
-    f = open(HA_CF or "/etc/ha.d/ha.cf", 'r')
-    opts = ''
-    ping_list = []
-    for l in f:
-        s = l.split()
-        if not s:
-            continue
-        if s[0] == "respawn" and s[2].find("pingd") > 0:
-            opts = ' '.join(s[3:])
-        elif s[0] == "ping":
-            ping_list.append(s[1])
-    f.close()
-    return opts,' '.join(ping_list)
-
-class NewLVMfromEVMS2(object):
-    def __init__(self):
-        self.vgdict = {}
-    def add_rsc(self,rsc,vg):
-        if vg not in self.vgdict:
-            self.vgdict[vg] = []
-        self.vgdict[vg].append(rsc)
-    def edit_attr(self,rsc,rsc_id,nvpair,vg,lv):
-        v = "/dev/%s/%s" % (vg,lv)
-        attr = nvpair.getAttribute("name")
-        nvpair.setAttribute("value",v)
-        print >> sys.stderr, \
-            "INFO: set resource %s attribute %s to %s"%(rsc_id,attr,v)
-    def proc_attr(self,rsc,rsc_id,nvpair):
-        v = nvpair.getAttribute("value")
-        path_elems = v.split("/")
-        if v.startswith("/dev/evms/"):
-            if v.find("/lvm2/") and len(path_elems) == 7:
-                vg = path_elems[5]
-                lv = path_elems[6]
-                self.add_rsc(rsc,vg)
-                self.edit_attr(rsc,rsc_id,nvpair,vg,lv)
-            else:
-                print >> sys.stderr, \
-                    "ERROR: resource %s attribute %s=%s obviously" % \
-                        (rsc_id,nvpair.getAttribute("name"),v)
-                print >> sys.stderr, \
-                    "ERROR: references an EVMS volume, but I don't know what to do about it"
-                print >> sys.stderr, \
-                    "ERROR: Please fix it on SLES10 (see README.hb2openais for more details)"
-                sys.exit(1)
-    def check_rsc(self,rsc,rsc_id):
-        for inst_attr in rsc.getElementsByTagName("instance_attributes"):
-            for nvpair in inst_attr.getElementsByTagName("nvpair"):
-                self.proc_attr(rsc,rsc_id,nvpair)
-    def mklvms(self):
-        for vg in self.vgdict.keys():
-            node = mk_lvm("LVM"+vg,vg)
-            resources.appendChild(node)
-            lvm_id = node.getAttribute("id")
-            for rsc in self.vgdict[vg]:
-                add_lvm_constraints(lvm_id,rsc)
-
-def get_rsc_id_list(doc):
-    l = []
-    for tag in rsc_tags:
-        for node in doc.getElementsByTagName(tag):
-            l.append(node.getAttribute("id"))
-    return l
-def drop_degenerate_constraints(doc):
-    degenerates = []
-    rsc_id_list = get_rsc_id_list(doc)
-    # 1. referenced resources don't exist
-    for tag in cons_tags:
-        for node in doc.getElementsByTagName(tag):
-            for attr in cons_idattr_list[tag]:
-                if node.getAttribute(attr) not in rsc_id_list:
-                    degenerates.append(node)
-                    break
-    # 2. rules in rsc_location empty
-    for node in doc.getElementsByTagName("rsc_location"):
-        for rule in node.childNodes:
-            if not is_element(rule) or rule.tagName != "rule":
-                continue
-            if get_children_cnt(rule,["expression"]) == 0:
-                degenerates.append(node)
-                break
-    rmnodes(degenerates)
-
-def process_evmsd(rsc,rsc_id):
-    print >> sys.stderr, "INFO: Evmsd resource %s will change type to clvmd"%rsc_id
-    rsc.setAttribute("type","clvmd")
-    rsc.setAttribute("provider","lvm2")
-    add_ocfs_constraints(rsc)
-def process_evmsSCC(rsc,rsc_id):
-    print >> sys.stderr, "INFO: EvmsSCC resource is going to be removed"
-    parent = rsc.parentNode
-    parent.removeChild(rsc)
-    rsc.unlink()
-def process_cib():
-    ocfs_clones = []
-    evms_present = False
-    lvm_evms = NewLVMfromEVMS2()
-
-    for rsc in doc.getElementsByTagName("primitive"):
-        rsc_id = rsc.getAttribute("id")
-        rsc_type = rsc.getAttribute("type")
-        lvm_evms.check_rsc(rsc,rsc_id)
-        if rsc_type == "Evmsd":
-            process_evmsd(rsc,rsc_id)
-        elif rsc_type == "EvmsSCC":
-            evms_present = True
-            process_evmsSCC(rsc,rsc_id)
-        elif rsc_type == "Filesystem":
-            if get_param(rsc,"fstype") == "ocfs2":
-                ocfs_clones.append(rsc)
-                id = rsc.getAttribute("id")
-                add_ocfs_constraints(rsc)
-    lvm_evms.mklvms()
-    if ocfs_clones:
-        add_ocfs_clones()
-    if evms_present:
-        xml_processnodes(doc,lambda x:1,replace_evms_strings)
-    # drop degenerate groups/clones
-    xml_processnodes(doc,is_empty_group,rmnodes)
-    xml_processnodes(doc,is_empty_clone,rmnodes)
-    drop_degenerate_constraints(doc)
-    #xml_processnodes(doc,is_id_node,fix_ids)
-    #xml_processnodes(doc,is_constraint,rename_refs)
-
-if arglist[0] == "convert_cib":
-    opts,pingd_host_list = parse_pingd_respawn()
-    if pingd_host_list:
-        clone = new_pingd_rsc(opts,pingd_host_list)
-        resources.appendChild(clone)
-    if find_respawn("evmsd"):
-        resources.appendChild(new_cloned_rsc("ocf","lvm2","clvmd"))
-    process_cib()
-    s = skip_first(doc.toprettyxml())
-    print s
-    sys.exit(0)
-
-if arglist[0] == "manage_ocfs2":
-    if len(arglist) != 2:
-        usage()
-    if arglist[1] == "stop":
-        xml_processnodes(doc,is_ocfs2_fs,stop_ocfs2)
-    elif arglist[1] == "start":
-        xml_processnodes(doc,is_ocfs2_fs,start_ocfs2)
-    s = skip_first(doc.toprettyxml())
-    print s
-    sys.exit(0)
-
-# shouldn't get here
-usage()
-
-# vim:ts=4:sw=4:et:
diff --git a/tools/hb2openais.sh.in b/tools/hb2openais.sh.in
deleted file mode 100755
index 6723c3d789..0000000000
--- a/tools/hb2openais.sh.in
+++ /dev/null
@@ -1,804 +0,0 @@
-#!/bin/bash
-
- # Copyright (C) 2008,2009 Dejan Muhamedagic <dmuhamedagic@suse.de>
- # 
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public
- # License as published by the Free Software Foundation; either
- # version 2.1 of the License, or (at your option) any later version.
- # 
- # This software is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- # General Public License for more details.
- # 
- # You should have received a copy of the GNU General Public
- # License along with this library; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- #
-
-. @sysconfdir@/ha.d/shellfuncs
-# utillib.sh moved (sigh!)
-# cluster-glue doesn't make its shared data dir available
-# we guess, and guess that that's safe, that the datadir is the same
-testdirs="@datadir@/cluster-glue $HA_NOARCHBIN/utillib.sh"
-for d in $testdirs; do
-	if [ -f $d/utillib.sh ]; then
-		NOARCH_DIR=$d
-		break
-	fi
-done
-test -f $NOARCH_DIR/utillib.sh || {
-	echo "sorry, could not find utillib.sh in $testdirs"
-	exit 1
-}
-
-. $NOARCH_DIR/utillib.sh
-. $NOARCH_DIR/ha_cf_support.sh
-
-PROG=`basename $0`
-PROGDIR=`dirname $0`
-
-# the default syslog facility is not (yet) exported by heartbeat
-# to shell scripts
-#
-DEFAULT_HA_LOGFACILITY="daemon"
-export DEFAULT_HA_LOGFACILITY
-
-: ${SSH_OPTS="-T"}
-
-usage() {
-	cat<<EOF
-
-usage: $PROG [-UF] [-u user] [-T directory] [revert]
-
-	-U: skip upgrade the CIB to v1.0
-	-F: force conversion despite it being done beforehand
-	-u user: a user to sudo with (otherwise, you'd
-	         have to run this as root)
-	-C: force conversion to corosync (default is openais)
-	-T directory: a directory containing ha.cf/logd.cf/cib.xml/hostcache
-	         (use for testing); with this option files are not
-	         copied to other nodes and there are no destructive
-	         commands executed; you may run as unprivileged uid
-
-EOF
-	exit
-}
-
-SUDO_USER=""
-MYSUDO=""
-TEST_DIR=""
-FORCE=""
-UPGRADE="1"
-while getopts UFCu:T:h o; do
-	case "$o" in
-		h) usage;;
-		U) UPGRADE="";;
-		F) FORCE=1;;
-		u) SUDO_USER="$OPTARG";;
-		T) TEST_DIR="$OPTARG";;
-		C) COROSYNC="1";;
-		[?]) usage;;
-	esac
-done
-shift $(($OPTIND-1))
-[ $# -gt 1 ] && usage
-[ "$TEST_DIR" ] && [ $# -ne 0 ] && usage
-
-if [ "$COROSYNC" -o -d /etc/corosync ]; then
-	AIS_CONF=/etc/corosync/corosync.conf
-	AIS_KEYF=/etc/corosync/authkey
-	KEYGEN_PROG="corosync-keygen"
-	COROSYNC=1
-else
-	AIS_CONF=/etc/ais/openais.conf
-	AIS_KEYF=/etc/ais/authkey
-	KEYGEN_PROG="ais-keygen"
-	COROSYNC=""
-fi
-AIS_CONF_BASE=`basename $AIS_CONF`
-PRODUCT=`basename $AIS_CONF_BASE .conf`
-AUTHENTICATION=on
-MAXINTERFACE=2
-MCASTPORT=5405
-RRP_MODE=active
-SUPPORTED_RESPAWNS="pingd evmsd"
-
-PY_HELPER=$HA_BIN/hb2openais-helper.py
-CRM_VARLIB=$HA_VARLIB/crm
-CIB=$CRM_VARLIB/cib.xml
-CIBSIG=$CRM_VARLIB/cib.xml.sig
-CIBLAST=$CRM_VARLIB/cib.xml.last
-CIBLAST_SIG=$CRM_VARLIB/cib.xml.sig.last
-HOSTCACHE=$HA_VARLIB/hostcache
-HB_UUID=$HA_VARLIB/hb_uuid
-DONE_F=$HA_VARRUN/heartbeat/.$PROG.conv_done
-BACKUPDIR=/var/tmp/`basename $PROG .sh`.backup
-RM_FILES=" $CIBSIG $CIBLAST $CIBLAST_SIG"
-REMOTE_RM_FILES=" $CIB $RM_FILES"
-BACKUP_FILES=" $AIS_CONF $AIS_KEYF $REMOTE_RM_FILES "
-DIST_FILES=" $AIS_CONF $AIS_KEYF $DONE_F "
-MAN_TARF=/var/tmp/`basename $PROG .sh`.tar.gz
-
-if [ "$TEST_DIR" ]; then
-	cp $TEST_DIR/cib.xml $TEST_DIR/cib-out.xml
-	CIB=$TEST_DIR/cib-out.xml
-	HOSTCACHE=$TEST_DIR/hostcache
-	HA_CF=$TEST_DIR/ha.cf
-	AIS_CONF=$TEST_DIR/$AIS_CONF_BASE
-	if [ "$SUDO_USER" ]; then
-		warning "-u option ignored when used with -T"
-	fi
-else
-	ps -ef | grep -wqs [c]rmd &&
-		fatal "you must first stop heartbeat on _all_ nodes"
-	if [ "$SUDO_USER" ]; then
-		MYSUDO="sudo -u $SUDO_USER"
-	fi
-fi
-
-CIB_file=$CIB
-CONF=$HA_CF
-LOGD_CF=`findlogdcf $TEST_DIR /etc $HA_DIR`
-export CIB_file LOGD_CF
-
-prerequisites() {
-	test -f $HA_CF ||
-		fatal "$HA_CF does not exist: cannot proceed"
-	iscfvartrue crm || grep -w "^crm" $HA_CF | grep -wqs respawn ||
-		fatal "crm is not enabled: we cannot convert v1 configurations"
-	$DRY test -f $CIB ||
-		fatal "CIB $CIB does not exist: cannot proceed"
-	[ "$FORCE" ] && rm -f "$DONE_F"
-	if [ -f "$DONE_F" ]; then
-		info "Conversion to OpenAIS already done, exiting"
-		exit 0
-	fi
-}
-# some notes about unsupported stuff
-unsupported() {
-	respawned_progs=`awk '/^respawn/{print $3}' $HA_CF |while read p; do basename $p; done`
-	grep -qs "^serial" $HA_CF &&
-		warning "serial media is not supported by OpenAIS"
-	for prog in $respawned_progs; do
-		case $prog in
-		mgmtd|pingd|evmsd) : these are fine
-			;;
-		*)
-			warning "program $prog is being controlled by heartbeat (thru respawn)"
-			warning "you have to find another way of running it"
-			;;
-		esac
-	done
-}
-#
-# find nodes for this cluster
-#
-getnodes() {
-	# 1. hostcache
-	if [ -f $HOSTCACHE ]; then
-		awk '{print $1}' $HOSTCACHE
-		return
-	fi
-	# 2. ha.cf
-	getcfvar node
-}
-#
-# does ssh work?
-#
-testsshuser() {
-	if [ "$2" ]; then
-		ssh -T -o Batchmode=yes $2@$1 true 2>/dev/null
-	else
-		ssh -T -o Batchmode=yes $1 true 2>/dev/null
-	fi
-}
-findsshuser() {
-	for u in "" $TRY_SSH; do
-		rc=0
-		for n in `getnodes`; do
-			[ "$node" = "$WE" ] && continue
-			testsshuser $n $u || {
-				rc=1
-				break
-			}
-		done
-		if [ $rc -eq 0 ]; then
-			echo $u
-			return 0
-		fi
-	done
-	return 1
-}
-important() {
-	echo "IMPORTANT: $*" >&2
-}
-newportinfo() {
-	important "the multicast port number on $1 is set to $2"
-	important "please update your firewall rules (if any)"
-}
-changemediainfo() {
-	important "$PRODUCT uses multicast for communication"
-	important "please make sure that your network infrastructure supports it"
-}
-multicastinfo() {
-	info "multicast for $PRODUCT ring $1 set to $2:$3"
-}
-netaddrinfo() {
-	info "network address for $PRODUCT ring $1 set to $2"
-}
-backup_files() {
-	[ "$TEST_DIR" ] && return
-	info "backing up $BACKUP_FILES to $BACKUPDIR"
-	$DRY mkdir $BACKUPDIR || {
-		echo sorry, could not create $BACKUPDIR directory
-		echo please cleanup
-		exit 1
-	}
-	if [ -z "$DRY" ]; then
-		tar cf - $BACKUP_FILES | gzip > $BACKUPDIR/$WE.tar.gz || {
-			echo sorry, could not create $BACKUPDIR/$WE.tar.gz
-			exit 1
-		}
-	else
-		$DRY "tar cf - $BACKUP_FILES | gzip > $BACKUPDIR/$WE.tar.gz"
-	fi
-}
-revert() {
-	[ "$TEST_DIR" ] && return
-	test -d $BACKUPDIR || {
-		echo sorry, there is no $BACKUPDIR directory
-		echo cannot revert
-		exit 1
-	}
-	info "restoring $BACKUP_FILES from $BACKUPDIR/$WE.tar.gz"
-	gzip -dc $BACKUPDIR/$WE.tar.gz | (cd / && tar xf -) || {
-		echo sorry, could not unpack $BACKUPDIR/$WE.tar.gz
-		exit 1
-	}
-}
-pls_press_enter() {
-	[ "$TEST_DIR" ] && return
-	cat<<EOF
-
-Please press enter to continue or ^C to exit ...
-EOF
-	read junk
-	echo ""
-}
-introduction() {
-	cat<<EOF
-
-This is a Heartbeat to OpenAIS conversion tool.
-
-* IMPORTANT * IMPORTANT * IMPORTANT * IMPORTANT * IMPORTANT *
-
-Please read this and don't proceed before understanding what
-we try to do and what is required.
-
-1. You need to know your cluster in detail. This program will
-inform you on changes it makes. It is up to you to verify
-that the changes are meaningful. We will also probably ask
-some questions now and again.
-
-2. This procedure is supposed to be run on one node only.
-Although the main cluster configuration (the CIB) is
-automatically replicated, there are some things which have to
-be copied by other means. For that to work, we need sshd
-running on all nodes and root access working.
-
-3. Do not run this procedure on more than one node!
-EOF
-	pls_press_enter
-	cat<<EOF
-The procedure consists of two parts: the OpenAIS
-configuration and the Pacemaker/CRM CIB configuration.
-
-The first part is obligatory. The second part may be skipped
-unless your cluster configuration requires changes due to the
-change from Heartbeat to OpenAIS.
-
-We will try to analyze your configuration and let you know
-whether the CIB configuration should be changed as well.
-However, you will still have a choice to skip the CIB
-mangling part in case you want to do that yourself.
-
-The next step is to create the OpenAIS configuration. If you
-want to leave, now is the time to interrupt the program.
-EOF
-	pls_press_enter
-}
-confirm() {
-	while :; do
-		printf "$1 (y/n) "
-		read ans
-		if echo $ans | grep -iqs '^[yn]'; then
-			echo $ans | grep -iqs '^y'
-			return $?
-		else
-			echo Please answer with y or n
-		fi
-	done
-}
-want_to_proceed() {
-	[ "$TEST_DIR" ] && return 0
-	confirm "Do you want to proceed?"
-}
-intro_part2() {
-	cat<<EOF
-
-The second part of the configuration deals with the CIB.
-According to our analysis (you should have seen some
-messages), this step is necessary.
-EOF
-	want_to_proceed || return
-}
-
-gethbmedia() {
-	grep "^[bum]cast" $HA_CF
-}
-pl_ipcalc() {
-perl -e '
-# stolen from internet!
-my $ipaddr=$ARGV[0];
-my $nmask=$ARGV[1];
-my @addrarr=split(/\./,$ipaddr);
-my ( $ipaddress ) = unpack( "N", pack( "C4",@addrarr ) );
-my @maskarr=split(/\./,$nmask);
-my ( $netmask ) = unpack( "N", pack( "C4",@maskarr ) );
-# Calculate network address by logical AND operation of addr &
-# netmask
-# and convert network address to IP address format
-my $netadd = ( $ipaddress & $netmask );
-my @netarr=unpack( "C4", pack( "N",$netadd ) );
-my $netaddress=join(".",@netarr);
-print "$netaddress\n";
-' $1 $2
-}
-get_if_val() {
-	test "$1" || return
-	awk -v key=$1 '
-	{ for( i=1; i<=NF; i++ )
-		if( match($i,key) ) {
-			sub(key,"",$i);
-			print $i
-			exit
-		}
-	}'
-}
-netaddress() {
-	ip=`ifconfig $1 | grep 'inet addr:' | get_if_val addr:`
-	mask=`ifconfig $1 | grep 'Mask:' | get_if_val Mask:`
-	if test "$mask"; then
-		pl_ipcalc $ip $mask
-	else
-		warning "could not get the network mask for interface $1"
-	fi
-}
-
-sw=0
-do_tabs() {
-	for i in `seq $sw`; do printf "\t"; done
-}
-newstanza() {
-	do_tabs
-	printf "%s {\n" $1
-	sw=$(($sw+1))
-}
-endstanza() {
-	sw=$(($sw-1))
-	do_tabs
-	printf "}\n"
-}
-setvalue() {
-	name=$1
-	val=$2
-	test "$val" || {
-		warning "sorry, no value set for $name"
-	}
-	do_tabs
-	echo "$name: $val"
-}
-setcomment() {
-	do_tabs
-	echo "# $*"
-}
-setdebug() {
-	[ "$HA_LOGLEVEL" = debug ] &&
-		echo "on" || echo "off"
-}
-
-WE=`uname -n`  # who am i?
-
-if [ "$1" = revert ]; then
-	revert
-	exit
-fi
-
-test -d $BACKUPDIR &&
-	fatal "please remove the backup directory: $BACKUPDIR"
-
-prerequisites
-
-introduction
-
-backup_files
-
-unsupported
-
-# 1. Generate the openais.conf
-
-prochbmedia() {
-	while read media_type iface address rest; do
-		info "Processing interface $iface of type $media_type ..."
-		case "$media_type" in
-			ucast|bcast) mcastaddr=226.94.1.1 ;;
-			mcast) mcastaddr=$address ;;
-		esac
-		if [ -z "$local_mcastport" ]; then
-			local_mcastport="$MCASTPORT"
-		fi
-		netaddress="`netaddress $iface`"
-		if [ "$netaddress" ]; then
-			let local_mcastport=$local_mcastport+1
-			newportinfo $iface $local_mcastport
-			echo "$netaddress" "$mcastaddr" "$local_mcastport"
-		else
-			warning "cannot process interface $iface!"
-		fi
-	done
-}
-
-openaisconf() {
-
-info "Generating $AIS_CONF from $HA_CF ..."
-
-# the totem stanza
-
-cpunum=`grep -c ^processor /proc/cpuinfo`
-setcomment "Generated by hb2openais on `date`"
-setcomment "Please read the $AIS_CONF_BASE.5 manual page"
-
-[ "$COROSYNC" ] &&
-	setvalue compatibility whitetank
-
-newstanza aisexec
-setcomment "Run as root - this is necessary to be able to manage resources with Pacemaker"
-setvalue user	root
-setvalue group	root
-endstanza
-
-newstanza service
-setcomment "Load the Pacemaker Cluster Resource Manager"
-setvalue name	pacemaker
-setvalue ver	0
-if uselogd; then
-	setvalue use_logd	yes
-	important "Make sure that the logd service is started (chkconfig logd on)"
-fi
-if grep -qs "^respawn.*mgmtd" $HA_CF; then
-	setvalue use_mgmtd	yes
-fi
-endstanza
-
-newstanza totem
-setvalue version 2
-setcomment "How long before declaring a token lost (ms)"
-setvalue token          1000
-setcomment "How many token retransmits before forming a new configuration"
-setvalue token_retransmits_before_loss_const 20
-setcomment "How long to wait for join messages in the membership protocol (ms)"
-setvalue join           50
-setcomment "How long to wait for consensus to be achieved before"
-setcomment "starting a new round of membership configuration (ms)"
-setvalue consensus      1200
-setcomment "Turn off the virtual synchrony filter"
-setvalue vsftype        none
-setcomment "Number of messages that may be sent by one processor on receipt of the token"
-setvalue max_messages   20
-setcomment "Limit generated nodeids to 31-bits (positive signed integers)"
-setvalue clear_node_high_bit yes
-setcomment "Enable encryption"
-setvalue secauth $AUTHENTICATION
-if [ "$AUTHENTICATION" = on ]; then
-	setvalue threads $cpunum
-else
-	setvalue threads 0
-fi
-setcomment "Optionally assign a fixed node id (integer)"
-setcomment "nodeid:         1234"
-ring=0
-gethbmedia | prochbmedia |
-sort -u |
-while read network addr port; do
-	if [ $ring -ge $MAXINTERFACE ]; then
-		warning "$PRODUCT supports only $MAXINTERFACE rings!"
-		info "consider bonding interfaces"
-		warning "skipping communication link on $network"
-		setcomment "$network skipped: too many rings"
-		continue
-	fi
-	newstanza interface
-	setvalue ringnumber $ring
-	setvalue bindnetaddr $network
-	netaddrinfo $ring $network
-	multicastinfo $ring $addr $port
-	setvalue mcastport $port
-	setvalue mcastaddr $addr
-	ring=$(($ring+1))
-	endstanza
-done
-mediacnt=`gethbmedia 2>/dev/null | prochbmedia 2>/dev/null | sort -u | wc -l`
-if [ $mediacnt -ge 2 ]; then
-	setvalue rrp_mode $RRP_MODE
-fi
-changemediainfo
-endstanza
-
-# the logging stanza
-
-getlogvars
-# enforce some syslog facility
-[ "$COROSYNC" ] &&
-	TO_FILE=to_logfile ||
-	TO_FILE=to_file
-debugsetting=`setdebug`
-newstanza logging
-setvalue debug $debugsetting
-setvalue fileline off
-setvalue to_stderr no
-setvalue timestamp off
-if [ "$HA_LOGFILE" ]; then
-	setvalue $TO_FILE yes
-	setvalue logfile $HA_LOGFILE
-else
-	setvalue $TO_FILE no
-fi
-if [ "$HA_LOGFACILITY" ]; then
-	setvalue to_syslog yes
-	setvalue syslog_facility $HA_LOGFACILITY
-else
-	setvalue to_syslog no
-fi
-newstanza logger_subsys
-setvalue subsys AMF
-setvalue debug $debugsetting
-endstanza
-endstanza
-
-newstanza amf
-setvalue mode disabled
-endstanza
-
-}
-
-if [ -z "$DRY" ]; then
-	openaisconf > $AIS_CONF ||
-		fatal "cannot create $AIS_CONF"
-	grep -wqs interface $AIS_CONF ||
-		fatal "no media found in $HA_CF"
-else
-	openaisconf
-fi
-
-[ "$AIS_KEYF" ] && {
-	info "Generating a key for OpenAIS authentication ..."
-	if [ "$TEST_DIR" ]; then
-		echo would run: $DRY $KEYGEN_PROG
-	else
-		$DRY $KEYGEN_PROG ||
-			fatal "cannot generate the key using $KEYGEN_PROG"
-	fi
-}
-
-# remove various files which could get in a way
-
-if [ -z "$TEST_DIR" ]; then
-	$DRY rm -f $RM_FILES
-fi
-
-fixcibperms() {
-	[ "$TEST_DIR" ] && return
-	uid=`ls -ldn $CRM_VARLIB | awk '{print $3}'`
-	gid=`ls -ldn $CRM_VARLIB | awk '{print $4}'`
-	$DRY $MYSUDO chown $uid:$gid $CIB
-}
-upgrade_cib() {
-	$DRY $MYSUDO cibadmin --upgrade --force
-	$DRY $MYSUDO crm_verify -V -x $CIB_file
-}
-py_proc_cib() {
-	tmpfile=`maketempfile`
-	$MYSUDO sh -c "python $PY_HELPER $* <$CIB >$tmpfile" ||
-		fatal "cannot process cib: $PY_HELPER $*"
-	$DRY $MYSUDO mv $tmpfile $CIB
-}
-set_property() {
-	py_proc_cib set_property $*
-}
-
-# remove the nodes section from the CIB
-py_proc_cib set_node_ids
-info "Edited the nodes' ids in the CIB"
-
-numnodes=`getnodes | wc -w`
-[ $numnodes -eq 2 ] &&
-	set_property no-quorum-policy ignore
-
-set_property expected-nodes $numnodes overwrite
-
-info "Done converting ha.cf to $AIS_CONF_BASE"
-important "Please check the resulting $AIS_CONF"
-important "and in particular interface stanzas and logging."
-important "If you find problems, please edit $AIS_CONF now!"
-#
-# first part done (openais), on to the CIB
-
-analyze_cib() {
-	info "Analyzing the CIB..."
-	$MYSUDO sh -c "python $PY_HELPER analyze_cib <$CIB"
-}
-check_respawns() {
-	rc=1
-	for p in $SUPPORTED_RESPAWNS; do
-		grep -qs "^respawn.*$p" $HA_CF && {
-			info "a $p resource has to be created"
-			rc=0
-		}
-	done
-	return $rc
-}
-
-part2() {
-	intro_part2 || return 0
-	opts="-c $HA_CF"
-	[ "$TEST_DIR" ] && opts="-T $opts"
-	py_proc_cib $opts convert_cib
-	info "Processed the CIB successfully"
-}
-# make the user believe that something's happening :)
-some_dots_idle() {
-	[ "$TEST_DIR" ] && return
-	cnt=0
-	printf "$2 ."
-	while [ $cnt -lt $1 ]; do
-		sleep 1
-		printf "."
-		ctn=$((cnt+1))
-	done
-	echo
-}
-print_dc() {
-	crm_mon -1 | awk '/Current DC/{print $3}'
-}
-dcidle() {
-	dc=`$MYSUDO print_dc`
-	if [ "$dc" = "$WE" ]; then
-		maxcnt=60 cnt=0
-		while [ $cnt -lt $maxcnt ]; do
-			stat=`$MYSUDO crmadmin -S $dc`
-			echo $stat | grep -qs S_IDLE && break
-			[ "$1" = "-v" ] && echo $stat
-			sleep 1
-			printf "."
-			cnt=$((cnt+1))
-		done
-		echo $stat | grep -qs S_IDLE
-	else
-		some_dots_idle 10 #just wait for 10 seconds
-	fi
-}
-wait_crm() {
-	[ "$TEST_DIR" ] && return
-	cnt=10
-	dc=""
-	while [ -z "$dc" -a $cnt -gt 0 ]; do
-		dc=`$MYSUDO print_dc`
-		cnt=$((cnt-1))
-	done
-
-	if [ x = x"$dc" ]; then
-		echo "sorry, no dc found/elected"
-		exit 1
-	fi
-	dcidle
-}
-manage_cluster() {
-	if [ "$TEST_DIR" ]; then
-		echo would run: /etc/init.d/openais $1
-	else
-		$DRY /etc/init.d/openais $1
-	fi
-}
-tune_ocfs2() {
-	cat<<EOF
-The ocfs2 metadata has to change to reflect the cluster stack
-change. To do that, we have to start the cluster stack on
-this node.
-EOF
-	pls_press_enter
-	py_proc_cib manage_ocfs2 stop
-	manage_cluster start
-	some_dots_idle 10 "waiting for crm to start"
-	if $DRY wait_crm; then
-		for fsdev; do
-			info "converting the ocfs2 meta-data on $fsdev"
-			if [ "$TEST_DIR" ]; then
-				echo would run: tunefs.ocfs2 --update-cluster-stack -y $fsdev
-			else
-				$DRY tunefs.ocfs2 --update-cluster-stack -y $fsdev
-			fi
-		done
-	else
-		fatal "could not start pacemaker; please check the logs"
-	fi
-	manage_cluster stop
-	py_proc_cib manage_ocfs2 start
-}
-convert_csm() {
-	info "converting all EVMS2 CSM containers"
-	if [ "$TEST_DIR" ]; then
-		echo would run: /usr/sbin/csm-converter --scan
-	else
-		$DRY /usr/sbin/csm-converter --scan ||
-			fatal "CSM conversion failed! Aborting"
-	fi
-}
-
-analyze_cib
-rc=$?
-[ $rc -gt 1 ] && fatal "error while analyzing CIB"
-if [ $rc -eq 1 ] || check_respawns; then
-	part2
-else
-	info "No need to process CIB further"
-fi
-
-# upgrade the CIB to v1.0
-if [ "$UPGRADE" ]; then
-	upgrade_cib
-	info "Upgraded the CIB to v1.0"
-else
-	info "Skipped upgrading the CIB to v1.0"
-	important "You should do this sooner rather than later!"
-fi
-fixcibperms
-
-convert_csm
-ocfs2_devs=`$MYSUDO sh -c "python $PY_HELPER $opts print_ocfs2_devs <$CIB"`
-[ "$ocfs2_devs" ] &&
-	tune_ocfs2 $ocfs2_devs
-
-[ "$TEST_DIR" ] && exit
-
-$DRY touch $DONE_F
-
-# finally, copy files to all nodes
-info "Copying files to other nodes ..."
-info "(please provide root password if prompted)"
-ssh_opts="-l root $SSH_OPTS"
-rc=0
-for node in `getnodes`; do
-	[ "$node" = "$WE" ] &&
-		continue
-	if [ "$DRY" ]; then
-		$DRY "(cd / && tar cf - $DIST_FILES) |
-		ssh $ssh_opts $node \"rm -f $REMOTE_RM_FILES &&
-			cd / && tar xf -\""
-	else
-		echo "Copying to node $node ..."
-		(cd / && tar cf - $DIST_FILES) |
-		ssh $ssh_opts $node "rm -f $REMOTE_RM_FILES &&
-			cd / && tar xf -"
-		rc=$(($rc+$?))
-	fi
-done
-info "Done transfering files"
-if [ $rc -ne 0 ]; then
-	warning "we could not update some ssh nodes"
-	important "before starting the cluster stack on those nodes:"
-	important "copy and unpack $MAN_TARF (from the / directory)"
-	important "and execute: rm -f $REMOTE_RM_FILES"
-	(cd / && tar cf - $DIST_FILES | gzip > $MAN_TARF)
-fi
diff --git a/tools/pingd.c b/tools/pingd.c
deleted file mode 100644
index 7773947f8b..0000000000
--- a/tools/pingd.c
+++ /dev/null
@@ -1,1402 +0,0 @@
-
-/* 
- * Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <crm_internal.h>
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libgen.h>
-#include <glib.h>
-#include <netdb.h>
-
-#ifdef HAVE_SYS_SOCKET_H
-#  include <sys/socket.h>
-#endif
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <sys/poll.h>
-#include <sys/un.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <sys/time.h>
-#include <net/if.h>
-#include <sys/ioctl.h>
-
-#include <arpa/inet.h>
-#include <netinet/ip.h>
-#include <netinet/ip_icmp.h>
-#include <netinet/ip6.h>
-#include <netinet/icmp6.h>
-
-#ifdef ON_LINUX
-#  include <asm/types.h>
-#  include <linux/errqueue.h>
-#  ifndef ICMP_FILTER
-#    define ICMP_FILTER	1
-struct icmp_filter {
-    uint32_t data;
-};
-#  endif
-#endif
-
-#include <crm/crm.h>
-#include <crm/common/ipc.h>
-#include <attrd.h>
-
-#if SUPPORT_HEARTBEAT
-#  include <crm/cluster.h>
-ll_cluster_t *pingd_cluster = NULL;
-void do_node_walk(ll_cluster_t * hb_cluster);
-#endif
-
-/* GMainLoop *mainloop = NULL; */
-
-GListPtr ping_list = NULL;
-GMainLoop *mainloop = NULL;
-GHashTable *ping_nodes = NULL;
-const char *pingd_attr = "pingd";
-gboolean do_filter = FALSE;
-gboolean need_shutdown = FALSE;
-gboolean stand_alone = FALSE;
-gboolean do_updates = TRUE;
-
-const char *attr_set = NULL;
-const char *attr_section = NULL;
-int attr_dampen = 5000;         /* 5s */
-int attr_multiplier = 1;
-int pings_per_host = 2;
-int ping_timeout = 2;
-int re_ping_interval = 1000;    /* 1s */
-
-int ident;                      /* our pid */
-
-unsigned char cmsgbuf[4096];
-int cmsglen = 0;
-
-typedef struct ping_node_s {
-    int fd;                     /* ping socket */
-    uint16_t iseq;              /* sequence number */
-    gboolean type;
-    gboolean extra_filters;
-    union {
-        struct sockaddr raw;
-        struct sockaddr_in v4;  /* ipv4 ping addr */
-        struct sockaddr_in6 v6; /* ipv6 ping addr */
-    } addr;
-    char dest[256];
-    char *host;
-} ping_node;
-
-void pingd_nstatus_callback(const char *node, const char *status, void *private_data);
-void pingd_lstatus_callback(const char *node, const char *link, const char *status,
-                            void *private_data);
-void send_update(int active);
-int process_icmp6_error(ping_node * node, struct sockaddr_in6 *whereto);
-int process_icmp4_error(ping_node * node, struct sockaddr_in *whereto);
-
-/*
- * in_cksum --
- *	Checksum routine for Internet Protocol family headers (C Version)
- *	This function taken from Mike Muuss' ping program.
- */
-static int
-in_cksum(u_short * addr, size_t len)
-{
-    size_t nleft = len;
-    u_short *w = addr;
-    int sum = 0;
-    u_short answer = 0;
-
-    /*
-     * The IP checksum algorithm is simple: using a 32 bit accumulator (sum)
-     * add sequential 16 bit words to it, and at the end, folding back all
-     * the carry bits from the top 16 bits into the lower 16 bits.
-     */
-    while (nleft > 1) {
-        sum += *w++;
-        nleft -= 2;
-    }
-
-    /* Mop up an odd byte, if necessary */
-    if (nleft == 1) {
-        sum += *(u_char *) w;
-    }
-
-    /* Add back carry bits from top 16 bits to low 16 bits */
-
-    sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
-    sum += (sum >> 16);         /* add carry */
-    answer = ~sum;              /* truncate to 16 bits */
-
-    return answer;
-}
-
-static const char *
-ping_desc(gboolean family, uint8_t type, uint8_t code)
-{
-    if (family == AF_INET6) {
-        switch (type) {
-            case ICMP6_DST_UNREACH:
-                switch (code) {
-                    case ICMP6_DST_UNREACH_NOROUTE:
-                        return "No Route to Destination";
-                    case ICMP6_DST_UNREACH_ADMIN:
-                        return "Destination Administratively Unreachable";
-#ifdef ICMP6_DST_UNREACH_BEYONDSCOPE
-                    case ICMP6_DST_UNREACH_BEYONDSCOPE:
-                        return "Destination Unreachable Beyond Scope";
-#endif
-                    case ICMP6_DST_UNREACH_ADDR:
-                        return "Destination Address Unreachable";
-                    case ICMP6_DST_UNREACH_NOPORT:
-                        return "Destination Port Unreachable";
-                    default:
-                        crm_err("Unreachable: Unknown subtype: %d", code);
-                        return "Unreachable: Unknown Subtype";
-                }
-            case ICMP6_PACKET_TOO_BIG:
-                return "Packet too big";
-            case ICMP6_TIME_EXCEEDED:
-                switch (code) {
-                    case ICMP6_TIME_EXCEED_TRANSIT:
-                        return "Time to live exceeded";
-                    case ICMP6_TIME_EXCEED_REASSEMBLY:
-                        return "Frag reassembly time exceeded";
-                    default:
-                        crm_err("Timeout: Unknown subtype: %d", code);
-                        return "Timeout: Unknown Subtype";
-                }
-            case ICMP6_PARAM_PROB:
-                switch (code) {
-                    case ICMP6_PARAMPROB_HEADER:
-                        return "Parameter problem: Erroneous Header";
-                    case ICMP6_PARAMPROB_NEXTHEADER:
-                        return "Parameter problem: Unknown Nextheader";
-                    case ICMP6_PARAMPROB_OPTION:
-                        return "Parameter problem: Unrecognized Option";
-                    default:
-                        crm_err("Invalid header: Unknown subtype: %d", code);
-                        return "Invalid header: Unknown Subtype";
-                }
-            case ICMP6_ECHO_REQUEST:
-                return "Echo Request";
-            case ICMP6_ECHO_REPLY:
-                return "Echo Reply";
-#ifdef MLD_LISTENER_QUERY
-            case MLD_LISTENER_QUERY:
-                return "Multicast Listener Query";
-#endif
-#ifdef MLD_LISTENER_REPORT
-            case MLD_LISTENER_REPORT:
-                return "Multicast Listener Report";
-#endif
-#ifdef MLD_LISTENER_REDUCTION
-            case MLD_LISTENER_REDUCTION:
-                return "Multicast Listener Done";
-#endif
-            case ND_ROUTER_SOLICIT:
-                return "Router Solicitation";
-            case ND_ROUTER_ADVERT:
-                return "Router Advertisement";
-            case ND_NEIGHBOR_SOLICIT:
-                return "Neighbor Solicitation";
-            case ND_NEIGHBOR_ADVERT:
-                return "Neighbor Advertisement";
-            case ND_REDIRECT:
-                return "Redirect";
-#ifdef ICMP6_ROUTER_RENUMBERING
-            case ICMP6_ROUTER_RENUMBERING:
-                return "Router renumbering";
-#endif
-            default:
-                crm_err("Unknown type: %d", type);
-                return "Unknown type";
-        }
-    } else {
-        switch (type) {
-            case ICMP_ECHOREPLY:
-                return "Echo Reply";
-            case ICMP_ECHO:
-                return "Echo Request";
-            case ICMP_PARAMPROB:
-                return "Bad Parameter";
-            case ICMP_SOURCEQUENCH:
-                return "Packet lost, slow down";
-            case ICMP_TSTAMP:
-                return "Timestamp Request";
-            case ICMP_TSTAMPREPLY:
-                return "Timestamp Reply";
-            case ICMP_IREQ:
-                return "Information Request";
-            case ICMP_IREQREPLY:
-                return "Information Reply";
-
-            case ICMP_UNREACH:
-                switch (code) {
-                    case ICMP_UNREACH_NET:
-                        return "Unreachable Network";
-                    case ICMP_UNREACH_HOST:
-                        return "Unreachable Host";
-                    case ICMP_UNREACH_PROTOCOL:
-                        return "Unreachable Protocol";
-                    case ICMP_UNREACH_PORT:
-                        return "Unreachable Port";
-                    case ICMP_UNREACH_NEEDFRAG:
-                        return "Unreachable: Fragmentation needed";
-                    case ICMP_UNREACH_SRCFAIL:
-                        return "Unreachable Source Route";
-                    case ICMP_UNREACH_NET_UNKNOWN:
-                        return "Unknown Network";
-                    case ICMP_UNREACH_HOST_UNKNOWN:
-                        return "Unknown Host";
-                    case ICMP_UNREACH_ISOLATED:
-                        return "Unreachable: Isolated";
-                    case ICMP_UNREACH_NET_PROHIB:
-                        return "Prohibited network";
-                    case ICMP_UNREACH_HOST_PROHIB:
-                        return "Prohibited host";
-                    case ICMP_UNREACH_FILTER_PROHIB:
-                        return "Unreachable: Prohibited filter";
-                    case ICMP_UNREACH_TOSNET:
-                        return "Unreachable: Type of Service and Network";
-                    case ICMP_UNREACH_TOSHOST:
-                        return "Unreachable: Type of Service and Host";
-                    case ICMP_UNREACH_HOST_PRECEDENCE:
-                        return "Unreachable: Prec vio";
-                    case ICMP_UNREACH_PRECEDENCE_CUTOFF:
-                        return "Unreachable: Prec cutoff";
-                    default:
-                        crm_err("Unreachable: Unknown subtype: %d", code);
-                        return "Unreachable: Unknown Subtype";
-                }
-                break;
-
-            case ICMP_REDIRECT:
-                switch (code) {
-                    case ICMP_REDIRECT_NET:
-                        return "Redirect: Network";
-                    case ICMP_REDIRECT_HOST:
-                        return "Redirect: Host";
-                    case ICMP_REDIRECT_TOSNET:
-                        return "Redirect: Type of Service and Network";
-                    case ICMP_REDIRECT_TOSHOST:
-                        return "Redirect: Type of Service and Host";
-                    default:
-                        crm_err("Redirect: Unknown subtype: %d", code);
-                        return "Redirect: Unknown Subtype";
-                }
-
-            case ICMP_TIMXCEED:
-                switch (code) {
-                    case ICMP_TIMXCEED_INTRANS:
-                        return "Timeout: TTL";
-                    case ICMP_TIMXCEED_REASS:
-                        return "Timeout: Fragmentation reassembly";
-                    default:
-                        crm_err("Timeout: Unknown subtype: %d", code);
-                        return "Timeout: Unknown Subtype";
-                }
-                break;
-
-            default:
-                crm_err("Unknown type: %d", type);
-                return "Unknown type";
-        }
-    }
-}
-
-#ifdef ON_LINUX
-#  define MAX_HOST 1024
-int
-process_icmp6_error(ping_node * node, struct sockaddr_in6 *whereto)
-{
-    int rc = 0;
-    char buf[512];
-    struct iovec iov;
-    struct msghdr msg;
-    struct icmp6_hdr icmph;
-    struct sockaddr_in6 target;
-    struct cmsghdr *cmsg = NULL;
-    struct sock_extended_err *s_err = NULL;
-
-    iov.iov_base = &icmph;
-    iov.iov_len = sizeof(icmph);
-    msg.msg_name = (void *)&target;
-    msg.msg_namelen = sizeof(target);
-    msg.msg_iov = &iov;
-    msg.msg_iovlen = 1;
-    msg.msg_flags = 0;
-    msg.msg_control = buf;
-    msg.msg_controllen = sizeof(buf);
-
-    rc = recvmsg(node->fd, &msg, MSG_ERRQUEUE | MSG_DONTWAIT);
-    if (rc < 0 || rc < sizeof(icmph)) {
-        crm_perror(LOG_DEBUG, "No error message: %d", rc);
-        return 0;
-    }
-
-    for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-        if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IPV6_RECVERR) {
-            s_err = (struct sock_extended_err *)CMSG_DATA(cmsg);
-        }
-    }
-
-    CRM_ASSERT(s_err != NULL);
-
-    if (s_err->ee_origin == SO_EE_ORIGIN_LOCAL) {
-        if (s_err->ee_errno == EMSGSIZE) {
-            crm_info("local error: Message too long, mtu=%u", s_err->ee_info);
-        } else {
-            crm_info("local error: %s", strerror(s_err->ee_errno));
-        }
-        return 0;
-
-    } else if (s_err->ee_origin == SO_EE_ORIGIN_ICMP6) {
-        struct sockaddr_in6 *sin = (struct sockaddr_in6 *)(s_err + 1);
-        const char *ping_result = ping_desc(node->type, s_err->ee_type, s_err->ee_code);
-        static char target_s[64], whereto_s[64], ping_host_s[64];
-
-        inet_ntop(AF_INET6, (struct in6_addr *)&(target.sin6_addr), target_s, sizeof(target_s));
-        inet_ntop(AF_INET6, (struct in6_addr *)&(whereto->sin6_addr), whereto_s, sizeof(whereto_s));
-
-        if (ntohs(icmph.icmp6_id) != ident) {
-            /* Result was not for us */
-            crm_debug("Not our error (ident): %d %d", ntohs(icmph.icmp6_id), ident);
-            return -1;
-
-        } else if (memcmp(&target.sin6_addr, &whereto->sin6_addr, 16)) {
-            /* Result was not for us */
-            crm_debug("Not our error (addr): %s %s", target_s, whereto_s);
-            return -1;
-
-        } else if (icmph.icmp6_type != ICMP6_ECHO_REQUEST) {
-            /* Not an error */
-            crm_info("Not an error: %d", icmph.icmp6_type);
-            return -1;
-        }
-
-        inet_ntop(AF_INET6, (struct in6_addr *)&(sin->sin6_addr), ping_host_s, sizeof(ping_host_s));
-        crm_debug("From %s icmp_seq=%u %s", ping_host_s, ntohs(icmph.icmp6_seq), ping_result);
-
-    } else {
-        crm_debug("else: %d", s_err->ee_origin);
-    }
-
-    return 0;
-}
-
-int
-process_icmp4_error(ping_node * node, struct sockaddr_in *whereto)
-{
-    int rc = 0;
-    char buf[512];
-    struct iovec iov;
-    struct msghdr msg;
-    struct icmphdr icmph;
-    struct sockaddr_in target;
-    struct cmsghdr *cmsg = NULL;
-    struct sock_extended_err *s_err = NULL;
-
-    iov.iov_base = &icmph;
-    iov.iov_len = sizeof(icmph);
-    msg.msg_name = (void *)&target;
-    msg.msg_namelen = sizeof(target);
-    msg.msg_iov = &iov;
-    msg.msg_iovlen = 1;
-    msg.msg_flags = 0;
-    msg.msg_control = buf;
-    msg.msg_controllen = sizeof(buf);
-
-    rc = recvmsg(node->fd, &msg, MSG_ERRQUEUE | MSG_DONTWAIT);
-    if (rc < 0 || rc < sizeof(icmph)) {
-        crm_perror(LOG_DEBUG, "No error message: %d", rc);
-        return 0;
-    }
-
-    for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-        if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR) {
-            s_err = (struct sock_extended_err *)CMSG_DATA(cmsg);
-        }
-    }
-
-    CRM_ASSERT(s_err != NULL);
-
-    if (s_err->ee_origin == SO_EE_ORIGIN_LOCAL) {
-        if (s_err->ee_errno == EMSGSIZE) {
-            crm_info("local error: Message too long, mtu=%u", s_err->ee_info);
-        } else {
-            crm_info("local error: %s", strerror(s_err->ee_errno));
-        }
-        return 0;
-
-    } else if (s_err->ee_origin == SO_EE_ORIGIN_ICMP) {
-        char ping_host[MAX_HOST];
-        struct sockaddr_in *sin = (struct sockaddr_in *)(s_err + 1);
-        const char *ping_result = ping_desc(node->type, s_err->ee_type, s_err->ee_code);
-        char *target_s = inet_ntoa(*(struct in_addr *)&(target.sin_addr.s_addr));
-        char *whereto_s = inet_ntoa(*(struct in_addr *)&(whereto->sin_addr.s_addr));
-
-        if (ntohs(icmph.un.echo.id) != ident) {
-            /* Result was not for us */
-            crm_debug("Not our error (ident): %d %d", ntohs(icmph.un.echo.id), ident);
-            return -1;
-
-        } else if (safe_str_neq(target_s, whereto_s)) {
-            /* Result was not for us */
-            crm_debug("Not our error (addr): %s %s", target_s, whereto_s);
-            return -1;
-
-        } else if (icmph.type != ICMP_ECHO) {
-            /* Not an error */
-            crm_info("Not an error: %d", icmph.type);
-            return -1;
-        }
-
-        /* snprintf(ping_host, MAX_HOST, "%s", inet_ntoa(*(struct in_addr *)&(sin->sin_addr.s_addr))); */
-        snprintf(ping_host, MAX_HOST, "%s", inet_ntoa(sin->sin_addr));
-
-        if (node->extra_filters == FALSE) {
-            /* Now that we got some sort of reply, add extra filters to
-             * ensure we keep getting the _right_ replies for dead hosts
-             */
-            struct icmp_filter filt;
-
-            crm_debug("Installing additional ICMP filters");
-            node->extra_filters = TRUE; /* only try once */
-
-            filt.data = ~((1 << ICMP_SOURCE_QUENCH) | (1 << ICMP_REDIRECT) | (1 << ICMP_ECHOREPLY));
-            if (setsockopt(node->fd, SOL_RAW, ICMP_FILTER, (char *)&filt, sizeof(filt)) == -1) {
-                crm_perror(LOG_WARNING, "setsockopt failed: Cannot install ICMP filters for %s",
-                           ping_host);
-            }
-        }
-
-        crm_debug("From %s icmp_seq=%u %s", ping_host, ntohs(icmph.un.echo.sequence), ping_result);
-
-    } else {
-        crm_debug("else: %d", s_err->ee_origin);
-    }
-
-    return 0;
-}
-#else
-int
-process_icmp6_error(ping_node * node, struct sockaddr_in6 *whereto)
-{
-    /* dummy function */
-    return 0;
-}
-
-int
-process_icmp4_error(ping_node * node, struct sockaddr_in *whereto)
-{
-    /* dummy function */
-    return 0;
-}
-#endif
-
-static ping_node *
-ping_new(const char *host)
-{
-    ping_node *node;
-
-    node = calloc(1, sizeof(ping_node));
-
-    if (strstr(host, ":")) {
-        node->type = AF_INET6;
-    } else {
-        node->type = AF_INET;
-    }
-
-    node->host = crm_strdup(host);
-
-    return node;
-}
-
-static gboolean
-ping_open(ping_node * node)
-{
-    int ret_ga = 0;
-    char *hostname = NULL;
-    struct addrinfo *res = NULL;
-    struct addrinfo hints;
-    char *addr = NULL;
-    char *cp = NULL;
-
-    /* getaddrinfo */
-    bzero(&hints, sizeof(struct addrinfo));
-    hints.ai_flags = AI_CANONNAME;
-    hints.ai_family = node->type;
-    hints.ai_socktype = SOCK_RAW;
-
-    if (node->type == AF_INET6) {
-        hints.ai_protocol = IPPROTO_ICMPV6;
-    } else {
-        hints.ai_protocol = IPPROTO_ICMP;
-    }
-
-    addr = crm_strdup(node->host);
-    if ((cp = strchr(addr, '%'))) {
-        *cp = 0;
-    }
-    crm_debug("node->host[%s], addr[%s]", node->host, addr);
-    ret_ga = getaddrinfo(addr, NULL, &hints, &res);
-    free(addr);
-    if (ret_ga) {
-        crm_warn("getaddrinfo: %s", gai_strerror(ret_ga));
-        goto bail;
-    }
-
-    if (res->ai_canonname) {
-        hostname = res->ai_canonname;
-    } else {
-        hostname = node->host;
-    }
-
-    crm_trace("Got address %s for %s", hostname, node->host);
-
-    if (!res->ai_addr) {
-        crm_warn("getaddrinfo failed: no address");
-        goto bail;
-    }
-
-    memcpy(&(node->addr.raw), res->ai_addr, res->ai_addrlen);
-    node->fd = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol);
-    /* node->fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); */
-
-    if (node->fd < 0) {
-        crm_perror(LOG_WARNING, "Can't open socket to %s", hostname);
-        goto bail;
-    }
-
-    if (node->type == AF_INET6) {
-        int sockopt;
-
-        inet_ntop(node->type, &node->addr.v6.sin6_addr, node->dest, sizeof(node->dest));
-
-        /* set recv buf for broadcast pings */
-        sockopt = 48 * 1024;
-        setsockopt(node->fd, SOL_SOCKET, SO_RCVBUF, (char *)&sockopt, sizeof(sockopt));
-
-    } else {
-        inet_ntop(node->type, &node->addr.v4.sin_addr, node->dest, sizeof(node->dest));
-    }
-
-    if (ping_timeout > 0) {
-        struct timeval timeout_opt;
-
-        timeout_opt.tv_sec = ping_timeout;
-        timeout_opt.tv_usec = 0;
-
-        setsockopt(node->fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout_opt, sizeof(timeout_opt));
-    }
-#ifdef ON_LINUX
-    {
-        int dummy = 1;
-
-        memset(&cmsgbuf, 0, sizeof(cmsgbuf));
-        cmsglen = 0;
-
-        if (node->type == AF_INET6) {
-            struct icmp6_filter filt;
-
-            ICMP6_FILTER_SETBLOCKALL(&filt);
-            ICMP6_FILTER_SETPASS(ICMP6_ECHO_REPLY, &filt);
-
-            if (setsockopt(node->fd, IPPROTO_ICMPV6, ICMP6_FILTER, (char *)&filt, sizeof(filt)) ==
-                -1) {
-                crm_perror(LOG_WARNING, "setsockopt failed: Cannot install ICMP6 filters for %s",
-                           node->dest);
-            }
-            setsockopt(node->fd, SOL_IPV6, IPV6_RECVERR, (char *)&dummy, sizeof(dummy));
-
-            if ((cp = strchr(node->host, '%'))) {
-                struct ifreq ifr;
-                struct cmsghdr *cmsg;
-                struct in6_pktinfo *ipi;
-
-                memset(&ifr, 0, sizeof(ifr));
-                cp++;
-                crm_debug("set interface: [%s]", cp);
-                strncpy(ifr.ifr_name, cp, IFNAMSIZ - 1);
-
-                if (ioctl(node->fd, SIOCGIFINDEX, &ifr) >= 0) {
-                    cmsg = (struct cmsghdr *)cmsgbuf;
-                    cmsglen = CMSG_SPACE(sizeof(*ipi));
-                    cmsg->cmsg_len = CMSG_LEN(sizeof(*ipi));
-                    cmsg->cmsg_level = SOL_IPV6;
-                    cmsg->cmsg_type = IPV6_PKTINFO;
-
-                    ipi = (struct in6_pktinfo *)CMSG_DATA(cmsg);
-                    memset(ipi, 0, sizeof(*ipi));
-                    ipi->ipi6_ifindex = ifr.ifr_ifindex;
-                } else {
-                    crm_warn("unknown interface %s specified", cp);
-                }
-            }
-        } else {
-            struct icmp_filter filt;
-
-            filt.data = ~((1 << ICMP_SOURCE_QUENCH) |
-                          (1 << ICMP_DEST_UNREACH) |
-                          (1 << ICMP_TIME_EXCEEDED) |
-                          (1 << ICMP_PARAMETERPROB) | (1 << ICMP_REDIRECT) | (1 << ICMP_ECHOREPLY));
-
-            if (setsockopt(node->fd, SOL_RAW, ICMP_FILTER, (char *)&filt, sizeof(filt)) == -1) {
-                crm_perror(LOG_WARNING, "setsockopt failed: Cannot install ICMP filters for %s",
-                           node->dest);
-            }
-            setsockopt(node->fd, SOL_IP, IP_RECVERR, (char *)&dummy, sizeof(dummy));
-
-            if ((cp = strchr(node->host, '%'))) {
-                struct ifreq ifr;
-                struct cmsghdr *cmsg;
-                struct in_pktinfo *ipi;
-
-                memset(&ifr, 0, sizeof(ifr));
-                cp++;
-                crm_debug("set interface: [%s]", cp);
-                strncpy(ifr.ifr_name, cp, IFNAMSIZ - 1);
-
-                if (ioctl(node->fd, SIOCGIFINDEX, &ifr) >= 0) {
-                    cmsg = (struct cmsghdr *)cmsgbuf;
-                    cmsglen = CMSG_SPACE(sizeof(*ipi));
-                    cmsg->cmsg_len = CMSG_LEN(sizeof(*ipi));
-                    cmsg->cmsg_level = SOL_IP;
-                    cmsg->cmsg_type = IP_PKTINFO;
-
-                    ipi = (struct in_pktinfo *)CMSG_DATA(cmsg);
-                    memset(ipi, 0, sizeof(*ipi));
-                    ipi->ipi_ifindex = ifr.ifr_ifindex;
-                } else {
-                    crm_warn("unknown interface %s specified", cp);
-                }
-            }
-        }
-    }
-#endif
-
-    crm_trace("Opened connection to %s", node->dest);
-    freeaddrinfo(res);
-    return TRUE;
-
-  bail:
-    if (res) {
-        freeaddrinfo(res);
-    }
-    return FALSE;
-}
-
-static gboolean
-ping_close(ping_node * node)
-{
-    int tmp_fd = node->fd;
-
-    node->fd = -1;
-
-    if (tmp_fd >= 0) {
-        if (close(tmp_fd) < 0) {
-            crm_perror(LOG_ERR, "Could not close ping socket");
-        } else {
-            tmp_fd = -1;
-            crm_trace("Closed connection to %s", node->dest);
-        }
-    }
-    return (tmp_fd == -1);
-}
-
-#define MAXPACKETLEN	131072
-#define ICMP6ECHOLEN	8       /* icmp echo header len excluding time */
-#define ICMP6ECHOTMLEN  20
-#define	DEFDATALEN	ICMP6ECHOTMLEN
-#define	EXTRA		256     /* for AH and various other headers. weird. */
-#define	IP6LEN		40
-
-static int
-dump_v6_echo(ping_node * node, u_char * buf, int bytes, struct msghdr *hdr)
-{
-    int rc = -1;                /* Try again */
-    int fromlen;
-    char from_host[1024];
-
-    struct icmp6_hdr *icp;
-    struct sockaddr *from;
-
-    if (!hdr || !hdr->msg_name || hdr->msg_namelen != sizeof(struct sockaddr_in6)
-        || ((struct sockaddr *)hdr->msg_name)->sa_family != AF_INET6) {
-        crm_warn("Invalid echo peer");
-        return rc;
-    }
-
-    fromlen = hdr->msg_namelen;
-    from = (struct sockaddr *)hdr->msg_name;
-    getnameinfo(from, fromlen, from_host, sizeof(from_host), NULL, 0,
-                NI_NUMERICHOST | NI_NUMERICSERV);
-
-    if (bytes < (int)sizeof(struct icmp6_hdr)) {
-        crm_warn("Invalid echo packet (too short: %d bytes) from %s", bytes, from_host);
-        return rc;
-    }
-    icp = (struct icmp6_hdr *)buf;
-
-    if (icp->icmp6_type == ICMP6_ECHO_REPLY) {
-        if (ident == ntohs(icp->icmp6_id)
-            && node->iseq == ntohs(icp->icmp6_seq)) {
-            rc = 1;             /* Alive */
-        }
-
-    } else if (icp->icmp6_type != ICMP6_ECHO_REQUEST) {
-        rc = process_icmp6_error(node, (struct sockaddr_in6 *)&(node->addr));
-    }
-
-    crm_trace(
-               "Echo from %s (exp=%d, seq=%d, id=%d, dest=%s, data=%s): %s",
-               from_host, node->iseq, ntohs(icp->icmp6_seq),
-               ntohs(icp->icmp6_id), node->dest, (char *)(buf + ICMP6ECHOLEN),
-               ping_desc(node->type, icp->icmp6_type, icp->icmp6_code));
-
-    return rc;
-}
-
-static int
-dump_v4_echo(ping_node * node, u_char * buf, int bytes, struct msghdr *hdr)
-{
-    int rc = -1;                /* Try again */
-    int iplen, fromlen;
-    char from_host[1024];
-
-    struct ip *ip;
-    struct icmp *icp;
-    struct sockaddr *from;
-
-    if (hdr == NULL || !hdr->msg_name || hdr->msg_namelen != sizeof(struct sockaddr_in)
-        || ((struct sockaddr *)hdr->msg_name)->sa_family != AF_INET) {
-        crm_warn("Invalid echo peer");
-        return rc;
-    }
-
-    fromlen = hdr->msg_namelen;
-    from = (struct sockaddr *)hdr->msg_name;
-    getnameinfo(from, fromlen, from_host, sizeof(from_host), NULL, 0,
-                NI_NUMERICHOST | NI_NUMERICSERV);
-
-    ip = (struct ip *)buf;
-    iplen = ip->ip_hl * 4;
-
-    if (bytes < (iplen + sizeof(struct icmp))) {
-        crm_warn("Invalid echo packet (too short: %d bytes) from %s", bytes, from_host);
-        return rc;
-    }
-
-    /* Check the IP header */
-    icp = (struct icmp *)(buf + iplen);
-
-    if (icp->icmp_type == ICMP_ECHOREPLY) {
-        if (ident == ntohs(icp->icmp_id)
-            && node->iseq == ntohs(icp->icmp_seq)) {
-            rc = 1;             /* Alive */
-        }
-
-    } else if (icp->icmp_type != ICMP_ECHO) {
-        rc = process_icmp4_error(node, (struct sockaddr_in *)from);
-    }
-
-    /* TODO: Stop logging icmp_id once we're sure everything works */
-    crm_trace(
-               "Echo from %s (exp=%d, seq=%d, id=%d, dest=%s, data=%s): %s",
-               from_host, node->iseq, ntohs(icp->icmp_seq),
-               ntohs(icp->icmp_id), node->dest, icp->icmp_data,
-               ping_desc(node->type, icp->icmp_type, icp->icmp_code));
-
-    return rc;
-}
-
-static int
-ping_read(ping_node * node, int *lenp)
-{
-    int bytes;
-    char fromaddr[128];
-    struct msghdr m;
-    struct cmsghdr *cm;
-    u_char buf[1024];
-    struct iovec iov[2];
-    int saved_errno = 0;
-
-    struct timeval recv_start_time;
-    struct timeval recv_time;
-    int packlen;
-    u_char *packet;
-
-    gettimeofday(&recv_start_time, NULL);
-    packlen = DEFDATALEN + IP6LEN + ICMP6ECHOLEN + EXTRA;
-
-    packet = calloc(1, packlen);
-
-  retry:
-    m.msg_name = &fromaddr;
-    m.msg_namelen = sizeof(fromaddr);
-    memset(&iov, 0, sizeof(iov));
-    iov[0].iov_base = (caddr_t) packet;
-    iov[0].iov_len = packlen;
-    m.msg_iov = iov;
-    m.msg_iovlen = 1;
-    cm = (struct cmsghdr *)buf;
-    m.msg_control = (caddr_t) buf;
-    m.msg_controllen = sizeof(buf);
-
-    bytes = recvmsg(node->fd, &m, 0);
-    saved_errno = errno;
-    crm_trace("Got %d bytes", bytes);
-
-    if (bytes < 0) {
-        crm_perror(LOG_DEBUG, "Read failed");
-        if (saved_errno != EAGAIN && saved_errno != EINTR) {
-            int rc = 0;
-
-            if (node->type == AF_INET6) {
-                rc = process_icmp6_error(node, (struct sockaddr_in6 *)&(node->addr));
-            } else {
-                rc = process_icmp4_error(node, (struct sockaddr_in *)&fromaddr);
-            }
-
-            if (rc < 0) {
-                crm_info("Retrying...");
-                goto retry;
-            }
-        }
-
-    } else if (bytes > 0) {
-        int rc = 0;
-
-        if (node->type == AF_INET6) {
-            rc = dump_v6_echo(node, packet, bytes, &m);
-        } else {
-            rc = dump_v4_echo(node, packet, bytes, &m);
-        }
-
-        gettimeofday(&recv_time, NULL);
-        if ((recv_start_time.tv_sec + ping_timeout) < recv_time.tv_sec) {
-            crm_warn("failed to receive for timeout.");
-            free(packet);
-            return FALSE;
-        }
-
-        if (rc < 0) {
-            crm_info("Retrying...");
-            goto retry;
-
-        } else if (rc > 0) {
-            free(packet);
-            return TRUE;
-        }
-
-    } else {
-        crm_err("Unexpected reply");
-    }
-
-    free(packet);
-    return FALSE;
-}
-
-static int
-ping_write(ping_node * node, const char *data, size_t size)
-{
-    struct iovec iov;
-    int rc, bytes, namelen;
-
-    /* static int ntransmitted = 9; */
-    struct msghdr smsghdr;
-    u_char outpack[MAXPACKETLEN];
-
-    memset(outpack, 0, MAXPACKETLEN);
-
-    node->iseq++;
-
-    if (node->type == AF_INET6) {
-        struct icmp6_hdr *icp;
-
-        namelen = sizeof(struct sockaddr_in6);
-        bytes = ICMP6ECHOLEN + DEFDATALEN;
-
-        icp = (struct icmp6_hdr *)outpack;
-
-        icp->icmp6_code = 0;
-        icp->icmp6_cksum = 0;
-        icp->icmp6_type = ICMP6_ECHO_REQUEST;
-        icp->icmp6_id = htons(ident);
-        icp->icmp6_seq = htons(node->iseq);
-
-        /* Sanity check */
-        if (ntohs(icp->icmp6_seq) != node->iseq) {
-            crm_debug("Wrapping at %u", node->iseq);
-            node->iseq = ntohs(icp->icmp6_seq);
-        }
-
-        memcpy(&outpack[ICMP6ECHOLEN], "pingd-v6", 8);
-
-    } else {
-        struct icmp *icp;
-
-        namelen = sizeof(struct sockaddr_in);
-        bytes = sizeof(struct icmp) + 11;
-
-        icp = (struct icmp *)outpack;
-
-        icp->icmp_code = 0;
-        icp->icmp_cksum = 0;
-        icp->icmp_type = ICMP_ECHO;
-        icp->icmp_id = htons(ident);
-        icp->icmp_seq = htons(node->iseq);
-
-        /* Sanity check */
-        if (ntohs(icp->icmp_seq) != node->iseq) {
-            crm_debug("Wrapping at %u", node->iseq);
-            node->iseq = ntohs(icp->icmp_seq);
-        }
-
-        memcpy(icp->icmp_data, "pingd-v4", 8);
-        icp->icmp_cksum = in_cksum((u_short *) icp, bytes);
-    }
-
-    memset(&iov, 0, sizeof(struct iovec));
-    memset(&smsghdr, 0, sizeof(struct msghdr));
-
-    smsghdr.msg_name = (caddr_t) & (node->addr);
-    smsghdr.msg_namelen = namelen;
-    iov.iov_base = (caddr_t) outpack;
-    iov.iov_len = bytes;
-    smsghdr.msg_iov = &iov;
-    smsghdr.msg_iovlen = 1;
-    smsghdr.msg_control = cmsgbuf;
-    smsghdr.msg_controllen = cmsglen;
-
-    rc = sendmsg(node->fd, &smsghdr, 0);
-
-    if (rc < 0 || rc != bytes) {
-        crm_perror(LOG_WARNING, "Wrote %d of %d chars", rc, bytes);
-        return FALSE;
-    }
-
-    crm_trace("Sent %d bytes to %s", rc, node->dest);
-    return TRUE;
-}
-
-static void
-pingd_shutdown(int nsig)
-{
-    need_shutdown = TRUE;
-    send_update(0);
-
-    g_hash_table_destroy(ping_nodes);
-    slist_destroy(ping_node, p, ping_list, free(p->host); crm_free(p););
-
-    exit(0);
-}
-
-#if SUPPORT_HEARTBEAT
-static gboolean
-pingd_ha_dispatch(IPC_Channel * channel, gpointer user_data)
-{
-    gboolean stay_connected = TRUE;
-
-    crm_trace("Invoked");
-
-    while (pingd_cluster != NULL && IPC_ISRCONN(channel)) {
-        if (pingd_cluster->llc_ops->msgready(pingd_cluster) == 0) {
-            crm_trace("no message ready yet");
-            break;
-        }
-        /* invoke the callbacks but dont block */
-        pingd_cluster->llc_ops->rcvmsg(pingd_cluster, 0);
-    }
-
-    if (pingd_cluster == NULL || channel->ch_status != IPC_CONNECT) {
-        if (need_shutdown == FALSE) {
-            crm_crit("Lost connection to heartbeat service.");
-        } else {
-            crm_info("Lost connection to heartbeat service.");
-        }
-        stay_connected = FALSE;
-    }
-
-    return stay_connected;
-}
-
-static void
-pingd_ha_connection_destroy(gpointer user_data)
-{
-    crm_trace("Invoked");
-    if (need_shutdown) {
-        /* we signed out, so this is expected */
-        crm_info("Heartbeat disconnection complete");
-        return;
-    }
-
-    crm_crit("Lost connection to heartbeat service!");
-}
-
-static gboolean
-register_with_ha(void)
-{
-    if (pingd_cluster == NULL) {
-        pingd_cluster = ll_cluster_new("heartbeat");
-    }
-    if (pingd_cluster == NULL) {
-        crm_err("Cannot create heartbeat object");
-        return FALSE;
-    }
-
-    crm_debug("Signing in with Heartbeat");
-    if (pingd_cluster->llc_ops->signon(pingd_cluster, crm_system_name) != HA_OK) {
-
-        crm_err("Cannot sign on with heartbeat: %s", pingd_cluster->llc_ops->errmsg(pingd_cluster));
-        crm_err("REASON: %s", pingd_cluster->llc_ops->errmsg(pingd_cluster));
-        return FALSE;
-    }
-
-    do_node_walk(pingd_cluster);
-
-    crm_trace("Be informed of Node Status changes");
-    if (HA_OK !=
-        pingd_cluster->llc_ops->set_nstatus_callback(pingd_cluster, pingd_nstatus_callback, NULL)) {
-
-        crm_err("Cannot set nstatus callback: %s", pingd_cluster->llc_ops->errmsg(pingd_cluster));
-        crm_err("REASON: %s", pingd_cluster->llc_ops->errmsg(pingd_cluster));
-        return FALSE;
-    }
-
-    if (pingd_cluster->llc_ops->
-        set_ifstatus_callback(pingd_cluster, pingd_lstatus_callback, NULL) != HA_OK) {
-        crm_err("Cannot set if status callback: %s", pingd_cluster->llc_ops->errmsg(pingd_cluster));
-        return FALSE;
-    }
-
-    crm_trace("Adding channel to mainloop");
-    G_main_add_IPC_Channel(G_PRIORITY_HIGH, pingd_cluster->llc_ops->ipcchan(pingd_cluster),
-                           FALSE, pingd_ha_dispatch, pingd_cluster, pingd_ha_connection_destroy);
-
-    return TRUE;
-}
-
-void
-do_node_walk(ll_cluster_t * hb_cluster)
-{
-    const char *ha_node = NULL;
-
-    /* Async get client status information in the cluster */
-    crm_trace("Invoked");
-    crm_trace("Requesting an initial dump of CRMD client_status");
-    hb_cluster->llc_ops->client_status(hb_cluster, NULL, CRM_SYSTEM_CRMD, -1);
-
-    crm_info("Requesting the list of configured nodes");
-    hb_cluster->llc_ops->init_nodewalk(hb_cluster);
-
-    do {
-        const char *ha_node_type = NULL;
-        const char *ha_node_status = NULL;
-
-        ha_node = hb_cluster->llc_ops->nextnode(hb_cluster);
-        if (ha_node == NULL) {
-            continue;
-        }
-
-        ha_node_type = hb_cluster->llc_ops->node_type(hb_cluster, ha_node);
-        if (safe_str_neq("ping", ha_node_type)) {
-            crm_debug("Node %s: skipping '%s'", ha_node, ha_node_type);
-            continue;
-        }
-
-        if (do_filter && g_hash_table_lookup(ping_nodes, ha_node) == NULL) {
-            crm_debug("Filtering: %s", ha_node);
-            continue;
-        }
-
-        ha_node_status = hb_cluster->llc_ops->node_status(hb_cluster, ha_node);
-
-        crm_debug("Adding: %s=%s", ha_node, ha_node_status);
-        g_hash_table_replace(ping_nodes, crm_strdup(ha_node), crm_strdup(ha_node_status));
-
-    } while (ha_node != NULL);
-
-    hb_cluster->llc_ops->end_nodewalk(hb_cluster);
-    crm_trace("Complete");
-    send_update(-1);
-}
-#endif
-
-static gboolean
-stand_alone_ping(gpointer data)
-{
-    int num_active = 0;
-    GListPtr num = NULL;
-
-    crm_trace("Checking connectivity");
-    for (num = ping_list; num != NULL; num = num->next) {
-        ping_node *ping = (ping_node *) num->data;
-
-        if (ping_open(ping)) {
-            int lpc = 0;
-
-            for (; lpc < pings_per_host; lpc++) {
-                int len = 0;
-
-                if (ping_write(ping, "test", 4) == FALSE) {
-                    crm_info("Node %s is unreachable (write)", ping->host);
-
-                } else if (ping_read(ping, &len)) {
-                    crm_debug("Node %s is alive", ping->host);
-                    num_active++;
-                    break;
-                } else {
-                    crm_info("Node %s is unreachable (read)", ping->host);
-                }
-                sleep(1);
-            }
-        }
-
-        ping_close(ping);
-    }
-
-    send_update(num_active);
-
-    return TRUE;
-}
-
-/* *INDENT-OFF* */
-static struct crm_option long_options[] = {
-    /* Top-level Options */
-    {"help",            0, 0, '?', "This text"},
-    {"version",         0, 0, '$', "Version information"  },
-    {"verbose",         0, 0, 'V', "Increase debug output\n"},
-    {"daemonize",       0, 0, 'D', "\t\tRun in daemon mode"},
-    {"pid-file",        1, 0, 'p', "\tFile in which to store the process' PID\n"},
-    {"node",            1, 0, 'N', "\tDNS name or IP address of a host to check (can be specified more than once\n"},
-    {"attr-name",       1, 0, 'a', "\tName of the node attribute to set"},
-    {"attr-dampen",     1, 0, 'd', "How long to wait for no further changes to occur before updating the CIB with a changed attribute"},
-    {"attr-section",    1, 0, 'S', "(Advanced) Which part of the CIB to put the attribute in"},
-    {"attr-set",        1, 0, 's', "\t(Advanced) Name of the set in which to put the attribute\n"},
-    {"ping-interval",   1, 0, 'i', "How often, in seconds, to check for node liveliness (default=1)"},
-    {"ping-attempts",   1, 0, 'n', "Number of ping attempts, per host, before declaring it dead (default=2)"},
-    {"ping-timeout",    1, 0, 't', "How long, in seconds, to wait before declaring a ping lost (default=2)"},
-    {"ping-multiplier", 1, 0, 'm', "For every connected node, add <integer> to the value set in the CIB"},
-    {"no-updates",      0, 0, 'U', NULL, 1},
-    
-    /* Legacy */
-    {"ping-host",         1, 0, 'h', NULL, 1},
-    {"value-multiplier",  1, 0, 'm', NULL, 1},
-    {"interval",          1, 0, 'i', NULL, 1},
-    
-    {0, 0, 0, 0}
-};
-/* *INDENT-ON* */
-
-int
-main(int argc, char **argv)
-{
-    int argerr = 0;
-    int flag;
-    const char *pid_file = NULL;
-    gboolean daemonize = FALSE;
-    ping_node *p = NULL;
-
-    int option_index = 0;
-
-    pid_file = "/tmp/pingd.pid";
-
-    mainloop_add_signal(SIGTERM, pingd_shutdown);
-
-    ping_nodes = g_hash_table_new_full(crm_str_hash, g_str_equal,
-                                       g_hash_destroy_str, g_hash_destroy_str);
-
-    crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv);
-    crm_set_options("V?$p:a:d:s:S:h:Dm:N:Ui:t:n:", NULL, long_options,
-                    "Daemon for checking external connectivity and making the results available to the cluster");
-
-    while (1) {
-        flag = crm_get_option(argc, argv, &option_index);
-        if (flag == -1)
-            break;
-
-        switch (flag) {
-            case 'V':
-                crm_bump_log_level();
-                break;
-            case 'p':
-                pid_file = optarg;
-                break;
-            case 'a':
-                pingd_attr = optarg;
-                break;
-            case 'N':
-            case 'h':
-                stand_alone = TRUE;
-                crm_debug("Adding ping host %s", optarg);
-                p = ping_new(optarg);
-                ping_list = g_list_append(ping_list, p);
-                break;
-            case 's':
-                attr_set = crm_strdup(optarg);
-                break;
-            case 'm':
-                attr_multiplier = crm_parse_int(optarg, "1");
-                break;
-            case 'S':
-                attr_section = crm_strdup(optarg);
-                break;
-            case 'd':
-                attr_dampen = crm_get_msec(optarg);
-                break;
-            case 'i':
-                re_ping_interval = crm_get_msec(optarg);
-                break;
-            case 'n':
-                pings_per_host = crm_atoi(optarg, NULL);
-                break;
-            case 't':
-                ping_timeout = crm_atoi(optarg, NULL);
-                break;
-            case 'D':
-                daemonize = TRUE;
-                break;
-            case 'U':
-                do_updates = FALSE;
-                break;
-            case '$':
-            case '?':
-                crm_help(flag, LSB_EXIT_OK);
-                break;
-            default:
-                printf("Argument code 0%o (%c) is not (?yet?) supported\n", flag, flag);
-                crm_err("Argument code 0%o (%c) is not (?yet?) supported\n", flag, flag);
-                ++argerr;
-                break;
-        }
-    }
-
-    if (optind < argc) {
-        crm_err("non-option ARGV-elements: ");
-        printf("non-option ARGV-elements: ");
-        while (optind < argc) {
-            crm_err("%s ", argv[optind]);
-            printf("%s ", argv[optind++]);
-        }
-        printf("\n");
-    }
-    if (argerr) {
-        crm_help(flag, LSB_EXIT_GENERIC);
-    }
-
-    crm_make_daemon(crm_system_name, daemonize, pid_file);
-    ident = getpid();
-
-    if (do_updates == FALSE) {
-        goto start_ping;
-    }
-#if SUPPORT_COROSYNC
-    if (is_openais_cluster()) {
-        stand_alone = TRUE;
-    }
-#endif
-
-#if SUPPORT_HEARTBEAT
-    if (stand_alone == FALSE && register_with_ha() == FALSE) {
-        crm_err("HA registration failed");
-        cl_flush_logs();
-        exit(LSB_EXIT_GENERIC);
-    }
-#endif
-  start_ping:
-    if (stand_alone && ping_list == NULL) {
-        crm_err("You must specify a list of hosts to monitor");
-        exit(LSB_EXIT_GENERIC);
-    }
-
-    crm_info("Starting %s", crm_system_name);
-    mainloop = g_main_new(FALSE);
-
-    if (stand_alone) {
-        stand_alone_ping(NULL);
-        g_timeout_add(re_ping_interval, stand_alone_ping, NULL);
-    }
-
-    g_main_run(mainloop);
-
-    crm_info("Exiting %s", crm_system_name);
-    return 0;
-}
-
-static void
-count_ping_nodes(gpointer key, gpointer value, gpointer user_data)
-{
-    int *num_active = user_data;
-
-    CRM_CHECK(num_active != NULL, return);
-
-    if (need_shutdown) {
-        return;
-    }
-
-    if (safe_str_eq(value, "ping")) {
-        (*num_active)++;
-    } else if (safe_str_eq(value, "up")) {
-        (*num_active)++;
-    }
-}
-
-void
-send_update(int num_active)
-{
-    char *value = NULL;
-    char *damp = crm_itoa(attr_dampen / 1000);
-
-    if (num_active < 0) {
-        num_active = 0;
-        g_hash_table_foreach(ping_nodes, count_ping_nodes, &num_active);
-    }
-
-    value = crm_itoa(attr_multiplier * num_active);
-    attrd_lazy_update('U', NULL, pingd_attr, value, attr_section, attr_set, damp);
-
-    free(value);
-    free(damp);
-}
-
-void
-pingd_nstatus_callback(const char *node, const char *status, void *private_data)
-{
-    crm_notice("Status update: Ping node %s now has status [%s]", node, status);
-
-    if (g_hash_table_lookup(ping_nodes, node) != NULL) {
-        g_hash_table_replace(ping_nodes, crm_strdup(node), crm_strdup(status));
-        send_update(-1);
-    }
-}
-
-void
-pingd_lstatus_callback(const char *node, const char *lnk, const char *status, void *private)
-{
-    crm_notice("Status update: Ping node %s now has status [%s]", node, status);
-    pingd_nstatus_callback(node, status, private);
-}