Page MenuHomeClusterLabs Projects

No OneTemporary

diff --git a/Makefile.am b/Makefile.am
index f8bebc755d..3eecc3f293 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,197 +1,191 @@
#
# Pacemaker code
#
# 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.
#
EXTRA_DIST = autogen.sh ConfigureMe README.in libltdl.tar
RPM = rpmbuild
RPMFLAGS = -ba
TARFILE = pacemaker.tar.gz
AM_TAR = tar
LAST_RELEASE = Pacemaker-1.0.3
STABLE_SERIES = stable-1.0
BOMB_ADDRESS = pacemaker@clusterlabs.org
BOMB_STATUS := $(shell $(HG) id -i | grep -c +)
BOMB_LAST := $(shell test -e .bomb && cat .bomb)
BOMB_TARGET := $(shell $(HG) id -i)
BOMB_DATE := $(shell python -c 'from time import *; print strftime ("%W, %Y", gmtime(time()))')
BOMB_SUBJECT := Pacemaker $(VERSION) patch update for week $(BOMB_DATE)
BOMB_ROOT := $(shell $(HG) root 2>/dev/null)
BOMB_VARIANT := $(shell basename $(BOMB_ROOT))
BOMB_PROJECT := $(shell basename `dirname $(BOMB_ROOT)`)
AUTOMAKE_OPTIONS = foreign
##ACLOCAL = aclocal -I $(auxdir)
PRETTY_ARGS = --braces-on-if-line --braces-on-struct-decl-line --cuddle-do-while --cuddle-else --leave-preprocessor-space --blank-lines-after-declarations --blank-lines-after-procedures -sc --case-indentation4 --no-space-after-function-call-names --no-blank-lines-after-commas --procnames-start-lines --leave-optional-blank-lines --indent-level4 --line-length100 --break-before-boolean-operator --ignore-newlines --no-space-after-if --no-space-after-for --no-space-after-while --paren-indentation4
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure DRF/config-h.in \
DRF/stamp-h.in libtool.m4 ltdl.m4 libltdl.tar
SUBDIRS = debian $(LIBLTDL_DIR) replace include lib pengine cib crmd fencing tools xml cts extra doc
tgz:
rm -f $(TARFILE)
$(HG) archive -X pengine/test06 -X pengine/test10 -t tgz $(TARFILE)
echo Rebuilt $(TARFILE) on `date`
week:
$(HG) log -M --template " + {desc|firstline|strip}\n" -d -7 | grep -v -e Dev: -e Low: | sort -u
bomb-zero:
echo $(BOMB_TARGET) > .bomb
bomb-list:
echo Summary of `$(HG) log -M --template "{node|short}\n" -r $(BOMB_LAST):tip | wc -l` Pacemaker $(VERSION) patches from week $(BOMB_DATE)
echo ""
for cs in `$(HG) log -M --template "{node|short} " -r $(BOMB_LAST):tip`; do \
echo "http://hg.clusterlabs.org/$(BOMB_PROJECT)/$(BOMB_VARIANT)/rev/$$cs"; \
$(HG) log -M --template "by {author|user} on {date|shortdate}::\t{desc|firstline|strip}\n\n" -r $$cs; \
done
bomb:
if [ $(BOMB_STATUS) = 1 ]; then \
echo "Uncommitted changes exist"; \
elif [ -e .bomb -a "$(BOMB_TARGET)" != "$(BOMB_LAST)" ]; then \
$(HG) email --config ui.interactive=false -i -g -d -t $(BOMB_ADDRESS) -s '$(BOMB_SUBJECT)' -r $(BOMB_LAST):tip; \
echo $(BOMB_TARGET) > .bomb; \
elif [ ! -e .bomb ]; then \
echo "Initializing patch record"; \
echo $(BOMB_TARGET) > .bomb; \
else \
echo "No patches to send"; \
fi
changes:
printf "$(PACKAGE) ($(VERSION)-1) stable; urgency=medium\n"
printf " * Update source tarball to revision: `$(HG) id`\n"
printf " * Statistics:\n"
printf " Changesets: `$(HG) log -M --template "{desc|firstline|strip}\n" -r $(LAST_RELEASE):tip | wc -l`\n"
printf " Diff: "
$(HG) diff -r $(LAST_RELEASE):tip | diffstat | tail -n 1
printf "\n * Testing Notes:\n"
printf "\n + Test hardware:\n"
printf "\n + All testing was performed with STONITH enabled\n"
printf "\n + Pending bugs encountered during testing:\n"
printf "\n * Changes since $(LAST_RELEASE)\n"
$(HG) log -M --template " + {desc|firstline|strip}\n" -r $(LAST_RELEASE):tip | grep -v -e Dev: -e Low: | sort -uf
printf "\n -- Andrew Beekhof <abeekhof@suse.de> `date +"%a, %d %b %Y %T %z"`\n"
features:
printf "$(PACKAGE) ($(VERSION)-1) unstable; urgency=medium\n"
printf " * Update source tarball to revision: `$(HG) id`\n"
printf " * Statistics:\n"
printf " Changesets: `$(HG) out -M --template "{desc|firstline|strip}\n" ../$(STABLE_SERIES) | wc -l`\n"
printf " Diff: "
$(HG) out -M -p ../$(STABLE_SERIES) | diffstat | tail -n 1
printf "\n * Changes added since $(STABLE_SERIES)\n"
$(HG) out -M --template " + {desc|firstline|strip}\n" ../$(STABLE_SERIES) | grep -v -e Dev: -e Low: | sort -uf
printf "\n -- Andrew Beekhof <abeekhof@suse.de> `date +"%a, %d %b %Y %T %z"`\n"
OBS_PROJECT = pacemaker
OBS_SERVER = c001n16.suse.de
OBS_PREFIX = Development/obs
IBS_PREFIX = Development/ibs
OBS_FILES = .changes $(TARFILE)
stable: tgz
make changes > .changes
scp $(OBS_FILES) $(OBS_SERVER):$(OBS_PREFIX)/server:ha-clustering/$(OBS_PROJECT)/
unstable: tgz
make changes > .changes
scp $(OBS_FILES) $(OBS_SERVER):$(OBS_PREFIX)/server:ha-clustering:UNSTABLE/$(OBS_PROJECT)/
factory: tgz
make changes > .changes
scp $(OBS_FILES) $(OBS_SERVER):$(IBS_PREFIX)/Devel:HAE:SLE11/$(OBS_PROJECT)/
quick: tgz
hg diff > quick.diff
scp $(TARFILE) quick.diff $(OBS_SERVER):$(IBS_PREFIX)/home:beekhof/$(OBS_PROJECT)/
snap: quick
ssh $(OBS_SERVER) -- "cd $(IBS_PREFIX)/home:beekhof/$(IBS_PROJECT); bs --commit -m \"New $(OBS_PROJECT) snapshot - $(shell $(HG) id)\""
global: clean-generic
gtags -q
global-html: global
htags -sanhIT
global-www: global-html
rsync -avzxlSD --progress HTML/ root@clusterlabs.org:/var/lib/global/pacemaker
pretty:
for file in `find . -name "*.c" | tr '\n' ' '`; do \
gnuindent $(PRETTY_ARGS) $$file; \
done
rpmtgz: tgz
echo "Installing $(TARFILE) into /usr/src/packages/SOURCES for rpm"
-test -d /usr/src/packages/SOURCES && cp $(TARFILE) /usr/src/packages/SOURCES/
-test -d /usr/src/redhat/SOURCES && cp $(TARFILE) /usr/src/redhat/SOURCES/
rpm: rpmtgz
echo To make create custom builds, edit the flags and options in pacemaker.spec first
$(RPM) $(RPMFLAGS) $(top_srcdir)/pacemaker.spec </dev/null;
drpm: rpmtgz
echo To make create custom builds, edit the flags and options in pacemaker.spec first
$(RPM) --nodeps $(RPMFLAGS) $(top_srcdir)/pacemaker.spec </dev/null;
deb:
echo To make create custom builds, edit the configure flags in debian/rules first
dpkg-buildpackage -rfakeroot -us -uc
install-exec-local:
- $(mkinstalldirs) $(DESTDIR)/$(CRM_CONFIG_DIR)
- -chown $(CRM_DAEMON_USER) $(DESTDIR)/$(CRM_CONFIG_DIR)
- -chgrp $(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_CONFIG_DIR)
- -chmod 750 $(DESTDIR)/$(CRM_CONFIG_DIR)
- $(mkinstalldirs) $(DESTDIR)/$(CRM_STATE_DIR)
- -chown $(CRM_DAEMON_USER) $(DESTDIR)/$(CRM_STATE_DIR)
- -chgrp $(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_STATE_DIR)
- -chmod 750 $(DESTDIR)/$(CRM_STATE_DIR)
- -test -d $(DESTDIR)$(LCRSODIR) || mkdir -p $(DESTDIR)$(LCRSODIR)
+ $(INSTALL) -d $(DESTDIR)/$(LCRSODIR)
+ -$(INSTALL) -d -m 750 -o $(CRM_DAEMON_USER) -g $(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_CONFIG_DIR)
+ -$(INSTALL) -d -m 750 -o $(CRM_DAEMON_USER) -g $(CRM_DAEMON_GROUP) $(DESTDIR)/$(CRM_STATE_DIR)
if BUILD_AIS_SUPPORT
rm -f $(DESTDIR)$(LCRSODIR)/pacemaker.lcrso $(DESTDIR)$(LCRSODIR)/service_crm.so
cp $(DESTDIR)$(libdir)/service_crm.so $(DESTDIR)$(LCRSODIR)/pacemaker.lcrso
endif
clean-generic:
find . -name ".gres.*" -exec rm \{\} \;
find . -name "*~" -exec rm \{\} \;
dist-clean-local:
rm -f autoconf automake autoheader $(TARFILE)
maintainer-clean-local:
rm -f libltdl.tar
# "pkg" format for Solaris etc.
pkg:
(cd build/pkg && $(MAKE) PWD=`pwd` pkg)
# "port" format for BSD
portfile: dist
( cd build/port && $(MAKE) PWD=`pwd` portfile)
.PHONY: rpm pkg handy handy-copy
diff --git a/configure.ac b/configure.ac
index 18430ed3ca..dbb684562e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,1436 +1,1427 @@
dnl
dnl autoconf for Pacemaker
dnl
dnl License: GNU General Public License (GPL)
dnl ===============================================
dnl Bootstrap
dnl ===============================================
AC_PREREQ(2.53)
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.0.4, pacemaker@oss.clusterlabs.org)
CRM_DTD_VERSION="1.0"
PKG_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)
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
AC_LIBTOOL_DLOPEN dnl Enable dlopen support...
AC_LIBLTDL_CONVENIENCE dnl make libltdl a convenience lib
AC_PROG_LIBTOOL
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([int main(){return 0;}] ,[RC=0; AC_MSG_RESULT(yes)],[RC=1; AC_MSG_RESULT(no)])
return $RC
}
extract_header_define() {
AC_MSG_CHECKING(for $2 in $1)
Cfile=/tmp/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 -f ${Cfile}.c ${Cfile}
}
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=yes]])
AC_ARG_ENABLE([fatal-warnings],
[ --enable-fatal-warnings very pedantic and fatal warnings for gcc
[default=yes]])
AC_ARG_ENABLE([pretty],
[ --enable-pretty
Pretty-print compiler output unless there is an error
[default=no]])
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_WITH(ais,
[ --with-ais
Support the OpenAIS messaging and membership layer ],
[ SUPPORT_AIS=$withval ],
[ SUPPORT_AIS=try ],
)
AC_ARG_WITH(heartbeat,
[ --with-heartbeat
Support the Heartbeat messaging and membership layer ],
[ SUPPORT_HEARTBEAT=$withval ],
[ SUPPORT_HEARTBEAT=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 ],
)
AISPREFIX=""
AC_ARG_WITH(ais-prefix,
[ --with-ais-prefix=DIR Prefix used when OpenAIS was installed [$prefix]],
[ AISPREFIX=$withval ],
[ AISPREFIX=$prefix ])
LCRSODIR=""
AC_ARG_WITH(lcrso-dir,
[ --with-lcrso-dir=DIR OpenAIS lcrso files. ],
[ LCRSODIR="$withval" ])
INITDIR=""
AC_ARG_WITH(initdir,
[ --with-initdir=DIR directory for init (rc) scripts [${INITDIR}]],
[ INITDIR="$withval" ])
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;;
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: ${AISPREFIX})
case $AISPREFIX in
dnl For consistency with Heartbeat, map NONE->$prefix
NONE) AISPREFIX=$prefix;;
prefix) AISPREFIX=$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}`"
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)
;;
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_DEFINE_UNQUOTED(HA_LOG_FACILITY, LOG_DAEMON, Default logging facility)
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)
case "$host_cpu" in
s390x)U64T="%lu";;
*64*) U64T="%lu";;
*) U64T="%llu";;
esac
AC_MSG_RESULT($U64T)
AC_DEFINE_UNQUOTED(U64T, "$U64T", Correct printf format for logging uint64_t)
AC_CHECK_HEADERS(hb_config.h)
AC_CHECK_HEADERS(glue_config.h)
GLUE_HEADER=none
if test "$ac_cv_header_hb_config_h" = "yes"; then
GLUE_HEADER=hb_config.h
elif test "$ac_cv_header_glue_config_h" = "yes"; then
GLUE_HEADER=glue_config.h
else
AC_MSG_FAILURE(Core development headers were not found)
fi
dnl Variables needed for substitution
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_DAEMON_USER=`extract_header_define $GLUE_HEADER HA_CCMUSER`
AC_DEFINE_UNQUOTED(CRM_DAEMON_USER,"$CRM_DAEMON_USER", User to run Pacemaker daemons as)
AC_SUBST(CRM_DAEMON_USER)
CRM_DAEMON_GROUP=`extract_header_define $GLUE_HEADER HA_APIGROUP`
AC_DEFINE_UNQUOTED(CRM_DAEMON_GROUP,"$CRM_DAEMON_GROUP", Group to run Pacemaker daemons as)
AC_SUBST(CRM_DAEMON_GROUP)
-dnl Eventually move out of the heartbeat dir tree and create symlinks when needed
-CRM_DAEMON_DIR=`extract_header_define $GLUE_HEADER HA_LIBHBDIR`
-AC_DEFINE_UNQUOTED(CRM_DAEMON_DIR,"$CRM_DAEMON_DIR", Location for Pacemaker daemons)
-AC_SUBST(CRM_DAEMON_DIR)
-
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)
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
-dnl HA_VARLIBDIR="${localstatedir}/lib"
-HA_VARLIBDIR=`extract_header_define $GLUE_HEADER HA_VARLIBDIR`
-CRM_CONFIG_DIR="$HA_VARLIBDIR/heartbeat/crm"
+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)
+dnl Eventually move out of the heartbeat dir tree and create symlinks when needed
+CRM_DAEMON_DIR=`extract_header_define $GLUE_HEADER HA_LIBHBDIR`
+AC_DEFINE_UNQUOTED(CRM_DAEMON_DIR,"$CRM_DAEMON_DIR", Location for Pacemaker daemons)
+AC_SUBST(CRM_DAEMON_DIR)
+
dnl Needed so that the AIS plugin can clear out the directory as Heartbeat does
HA_STATE_DIR=`extract_header_define $GLUE_HEADER HA_VARRUNDIR`
AC_DEFINE_UNQUOTED(HA_STATE_DIR,"$HA_STATE_DIR", Where Heartbeat keeps state files and sockets)
AC_SUBST(HA_STATE_DIR)
-dnl The next two are needed for haresources2cib.py
-HA_HBCONF_DIR=`extract_header_define $GLUE_HEADER HA_HBCONF_DIR`
-AC_SUBST(HA_HBCONF_DIR)
-
-HB_RA_DIR=`extract_header_define $GLUE_HEADER HB_RA_DIR`
-AC_SUBST(HB_RA_DIR)
-
dnl Needed for the location of hostcache in CTS.py
HA_VARLIBHBDIR=`extract_header_define $GLUE_HEADER HA_VARLIBHBDIR`
AC_SUBST(HA_VARLIBHBDIR)
OCF_ROOT_DIR=`extract_header_define $GLUE_HEADER OCF_ROOT_DIR`
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=`extract_header_define $GLUE_HEADER OCF_RA_DIR`
AC_DEFINE_UNQUOTED(OCF_RA_DIR,"$OCF_RA_DIR", Location for OCF RAs)
AC_SUBST(OCF_RA_DIR)
AC_PATH_PROGS(HG, hg false)
AC_MSG_CHECKING(build version)
BUILD_VERSION=unknown
if test -f $srcdir/.hg_archival.txt; then
BUILD_VERSION=`cat $srcdir/.hg_archival.txt | awk '/node:/ { print $2 }'`
elif test -x $HG -a -d .hg; then
BUILD_VERSION=`$HG id -itb`
if test $? != 0; then
BUILD_VERSION=unknown
fi
fi
AC_DEFINE_UNQUOTED(BUILD_VERSION, "$BUILD_VERSION", Build version)
AC_MSG_RESULT($BUILD_VERSION)
AC_SUBST(BUILD_VERSION)
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(SSH, ssh, /usr/bin/ssh)
AC_PATH_PROGS(SCP, scp, /usr/bin/scp)
AC_PATH_PROGS(HG, hg, /bin/false)
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)
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
PKG_FEATURES="$PKG_FEATURES manpages"
fi
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 e2fsprogs
AC_CHECK_LIB(uuid, uuid_create) dnl ossp
if test x"${PKGCONFIG}" = x""; then
AC_MSG_ERROR(You need pkgconfig installed in order to build ${PACKAGE})
fi
dnl
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",)
AC_SUBST(CRYPTOLIB)
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)
#
# 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>]])
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]))
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
PKG_FEATURES="$PKG_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 Cluster infrastructure - Heartbeat
dnl ========================================================================
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)
if test x"$ac_cv_lib_plumb_G_main_add_IPC_Channel" != x"yes"; then
AC_MSG_FAILURE(Core Heartbeat utility libraries not found: $ac_cv_lib_plumb_G_main_add_IPC_Channel)
fi
dnl Compatability checks
AC_CHECK_FUNCS(msgfromIPC_timeout)
AC_CHECK_MEMBERS([struct lrm_ops.fail_rsc],,,[[#include <lrm/lrm_api.h>]])
dnl ========================================================================
dnl Cluster stack - Heartbeat
dnl ========================================================================
case $SUPPORT_HEARTBEAT in
1|yes|true)
AC_CHECK_LIB(hbclient, ll_cluster_new,
[SUPPORT_HEARTBEAT=1], [AC_MSG_FAILURE(Unable to support Heartbeat: client libraries not found)]);;
try)
AC_CHECK_LIB(hbclient, ll_cluster_new,
[SUPPORT_HEARTBEAT=1], [SUPPORT_HEARTBEAT=0]);;
*) 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)
dnl ========================================================================
dnl Cluster stack - OpenAIS
dnl ========================================================================
AISLIB=""
dnl Normalize the values
case $SUPPORT_AIS in
1|yes|true) missingisfatal=1;;
try) missingisfatal=0;;
*) SUPPORT_AIS=no;;
esac
AC_MSG_CHECKING(for native AIS)
AISMSGLIB=""
AIS_VERSION="none"
COROSYNC_PKG="$PKGCONFIG libcoroipcc"
if test $SUPPORT_AIS = no; then
AC_MSG_RESULT(no... not requested.)
else
AC_MSG_RESULT($SUPPORT_AIS, with '$AISPREFIX')
AC_CHECK_HEADERS(openais/saAis.h)
AC_CHECK_HEADERS(corosync/coroipcc.h)
$COROSYNC_PKG --exists
if test $? = 0; then
AIS_VERSION="corosync"
elif test "$ac_cv_header_openais_saAis_h" = "yes"; then
AIS_VERSION="whitetank"
else
aisreason="Whitetank headers not found"
fi
fi
if test $AIS_VERSION != "none"; then
AC_MSG_CHECKING(for OpenAIS branch)
AC_MSG_RESULT($AIS_VERSION)
fi
if test $AIS_VERSION = "corosync"; then
if test "$ac_cv_header_corosync_coroipcc_h" != "yes"; then
AIS_VERSION="none"
aisreason="Corosync headers not found"
fi
saveLIBS="$LIBS"
LIBS="$LIBS `$COROSYNC_PKG --libs-only-L`"
AC_CHECK_LIB(coroipcc, coroipcc_msg_send_reply_receive, [])
LIBS="$saveLIBS"
if test $ac_cv_lib_coroipcc_coroipcc_msg_send_reply_receive != yes; then
AC_MSG_RESULT(Cannot locate AIS messaging library)
aisreason="requred Corosync libraries not found"
AIS_VERSION="none"
fi
fi
dnl continue?
if test $AIS_VERSION = "whitetank"; then
dnl Find it in lib, lib64, or wherever it wants to live...
AC_MSG_CHECKING(location of OpenAIS libraries)
dnl CoroSync location
alib=`ls ${AISPREFIX}/*/libcpg.so | head -n 1`
if test -z "$alib"; then
dnl Whitetank location
alib=`ls ${AISPREFIX}/*/*/libcpg.so | head -n 1`
fi
AISLIB=`dirname $alib`
AC_MSG_RESULT($AISLIB)
if test "x$AISLIB" = "x"; then
AC_MSG_WARN(Use --with-ais-prefix to specify the prefix OpenAIS was installed with)
aisreason="library directory not found"
AIS_VERSION="none"
elif test ! -d "$AISLIB"; then
AC_MSG_WARN(Use --with-ais-prefix to specify the prefix OpenAIS was installed with)
aisreason="specified library directory does not exist"
AIS_VERSION="none"
fi
fi
dnl continue?
if test $AIS_VERSION = "whitetank"; then
AC_MSG_CHECKING(location of OpenAIS plugins)
if test -z "$LCRSODIR"; then
LCRSODIR="$libexecdir/lcrso"
alib=`ls ${AISPREFIX}/*/lcrso/objdb.lcrso | head -n 1`
LCRSODIR=`dirname $alib`
fi
AC_MSG_RESULT($LCRSODIR)
if test "x$LCRSODIR" = "x"; then
AC_MSG_RESULT(Invalid. Please specify the correct location with --with-lcrso-dir)
aisreason="plugin directory not found"
AIS_VERSION="none"
elif test ! -d "$LCRSODIR"; then
AC_MSG_RESULT(Invalid. Please specify the correct location with --with-lcrso-dir)
aisreason="specified plugin directory does not exist"
AIS_VERSION="none"
fi
fi
dnl continue?
if test $AIS_VERSION = "whitetank"; then
dnl Don't add the messaging library to LIBS since most daemons don't need/use it
saveLIBS="$LIBS"
LIBS="$LIBS -L${AISLIB} -R${AISLIB}"
AC_CHECK_LIB(SaMsg, saSendReceiveReply, [])
AC_CHECK_LIB(SaMsg, openais_msg_send_reply_receive, [])
if test $ac_cv_lib_SaMsg_openais_msg_send_reply_receive = yes; then
: OpenAIS
elif test $ac_cv_lib_SaMsg_saSendReceiveReply = yes; then
: OpenAIS
AC_DEFINE_UNQUOTED(TRADITIONAL_AIS_IPC, 1, "Use the 'old' AIS IPC interface")
else
AC_MSG_RESULT(Cannot locate AIS messaging library)
aisreason="requred libraries not found"
AIS_VERSION="none"
fi
LIBS="$saveLIBS"
fi
SUPPORT_AIS=1
case $AIS_VERSION in
corosync)
AC_DEFINE_UNQUOTED(AIS_COROSYNC, 1, "AIS target is the corosync series")
LCRSODIR=`$PKGCONFIG corosync --variable=lcrsodir`
CFLAGS="$CFLAGS `$COROSYNC_PKG --cflags`"
AISMSGLIB=`$COROSYNC_PKG --libs`
;;
whitetank)
AC_DEFINE_UNQUOTED(AIS_WHITETANK, 1, "AIS target is the whitetank series")
CFLAGS="$CFLAGS -I$AISPREFIX/include/openais"
AISMSGLIB="-L${AISLIB} -R${AISLIB} -lSaMsg"
;;
none)
SUPPORT_AIS=0
if test "x$aisreason" != x; then
if test $missingisfatal = 0; then
AC_MSG_WARN(Unable to support OpenAIS: $aisreason)
else
AC_MSG_FAILURE(Unable to support OpenAIS: $aisreason)
fi
fi
;;
*) AC_MSG_FAILURE(Unknown OpenAIS branch: $AIS_VERSION);;
esac
AC_DEFINE_UNQUOTED(SUPPORT_AIS, $SUPPORT_AIS, Support the OpenAIS messaging and membership layer)
AM_CONDITIONAL(BUILD_AIS_SUPPORT, test $SUPPORT_AIS = 1)
dnl
dnl Cluster stack - Sanity
dnl
STACKS=""
CLUSTERLIBS=""
if test $SUPPORT_HEARTBEAT = 1; then
STACKS="$STACKS heartbeat"
CLUSTERLIBS="$CLUSTERLIBS -lhbclient -lccmclient"
fi
if test $SUPPORT_AIS = 1; then
STACKS="$STACKS $AIS_VERSION"
CLUSTERLIBS="$CLUSTERLIBS ${AISMSGLIB}"
else
AISPREFIX=""
LCRSODIR="$libdir"
fi
PKG_FEATURES="$PKG_FEATURES$STACKS"
AC_MSG_CHECKING(for supported stacks)
if test x"$STACKS" = x; then
AC_MSG_FAILURE(You must choose at least one cluster stack to support)
fi
AC_MSG_RESULT($STACKS)
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
SNMPLIB=""
AC_MSG_CHECKING(for snmp support)
if test $SUPPORT_SNMP = no; then
AC_MSG_RESULT(no... not requested.)
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"
AC_CHECK_FUNCS(netsnmp_transport_open_client)
if test $ac_cv_func_netsnmp_transport_open_client != yes; then
SUPPORT_SNMP=no
fi
LIBS=$savedLibs
fi
if test $SUPPORT_SNMP = no; then
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
PKG_FEATURES="$PKG_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... not requested.)
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
fi
fi
if test $SUPPORT_ESMTP = 1; then
PKG_FEATURES="$PKG_FEATURES libesmtp"
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 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)
else
AC_CHECK_LIB(gnutls, gnutls_init)
fi
AC_SUBST(GNUTLSHEAD)
AC_SUBST(GNUTLSLIBS)
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 unsetenv strnlen strndup daemon strlcpy strlcat)
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
export -n CFLAGS || true # We don't want to bomb out if this fails
fi
if test "$GCC" != yes; then
CFLAGS="$CFLAGS -g"
enable_fatal_warnings=no
else
CFLAGS="$CFLAGS -ggdb3 -O0"
# We had to eliminate -Wnested-externs because of libtool changes
EXTRA_FLAGS="-fgnu89-inline
-fstack-protector-all
-Wall
-Waggregate-return
-Wbad-function-cast
-Wcast-qual
-Wcast-align
-Wdeclaration-after-statement
-Wendif-labels
-Wfloat-equal
-Wformat=2
-Wformat-security
-Wformat-nonliteral
-Winline
-Wmissing-prototypes
-Wmissing-declarations
-Wmissing-format-attribute
-Wnested-externs
-Wno-long-long
-Wno-strict-aliasing
-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}" != xno && 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
PRETTY_CC=""
QUIET_LIBTOOL_OPTS=""
QUIET_MAKE_OPTS=""
if test x"${enable_pretty}" = "xyes"; then
enable_quiet="yes"
echo "install_sh: ${install_sh}"
PRETTY_CC="`pwd`/tools/ccdv"
dnl It would be nice if this was rebuilt when needed too...
mkdir `pwd`/tools/ 2>/dev/null
${CC} $CFLAGS -o `pwd`/tools/ccdv ${srcdir}/tools/ccdv.c
CC="\$(PRETTY_CC) ${CC}"
fi
if test "x${enable_quiet}" = "xyes"; then
QUIET_LIBTOOL_OPTS="--quiet"
QUIET_MAKE_OPTS="--quiet"
fi
AC_MSG_RESULT(Supress make details: ${enable_quiet})
AC_MSG_RESULT(Pretty print compiler output: ${enable_pretty})
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(PRETTY_CC)
AC_SUBST(QUIET_MAKE_OPTS)
AC_SUBST(QUIET_LIBTOOL_OPTS)
dnl The Makefiles and shell scripts we output
AC_CONFIG_FILES(Makefile \
README \
cts/Makefile \
cts/CTSvars.py \
cts/LSBDummy \
cib/Makefile \
crmd/Makefile \
pengine/Makefile \
debian/Makefile \
doc/Makefile \
doc/cibadmin.8 \
doc/crm_resource.8 \
include/Makefile \
include/crm/Makefile \
include/crm/common/Makefile \
include/crm/pengine/Makefile \
include/fencing/Makefile \
replace/Makefile \
lib/Makefile \
lib/ais/Makefile \
lib/common/Makefile \
lib/cib/Makefile \
lib/pengine/Makefile \
lib/transition/Makefile \
lib/fencing/Makefile \
lib/plugins/Makefile \
lib/plugins/lrm/Makefile \
fencing/Makefile \
fencing/stonithd/Makefile \
fencing/test/Makefile \
fencing/test/STONITHDBasicSanityCheck \
extra/Makefile \
extra/resources/Makefile \
tools/Makefile \
tools/haresources2cib.py \
tools/hb2openais.sh \
tools/crm_primitive.py \
tools/crm \
tools/shell/Makefile \
tools/shell/templates/Makefile \
tools/shell/regression/Makefile \
tools/shell/regression/regression.sh \
tools/shell/regression/lrmregtest-lsb \
tools/shell/regression/testcases/Makefile \
xml/Makefile \
xml/pacemaker.rng \
xml/resources.rng \
xml/constraints.rng \
xml/rule.rng \
xml/nvset.rng \
)
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 =${PKG_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([ AIS 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/cts/LSBDummy.in b/cts/LSBDummy.in
index 4386e6a414..cbec9dbb3a 100755
--- a/cts/LSBDummy.in
+++ b/cts/LSBDummy.in
@@ -1,11 +1,11 @@
#!/bin/sh
#
# WARNING: This script is for CTS testing only
#
-. @HB_RA_DIR@/hto-mapfuncs
+. @sysconfdir@/ha.d/resource.d/hto-mapfuncs
OCF_TYPE=Dummy
OCF_RESOURCE_INSTANCE=LSBDummy
export OCF_TYPE OCF_RESOURCE_INSTANCE
ra_execocf $1
diff --git a/include/crm/common/cluster.h b/include/crm/common/cluster.h
index 86415bdf8d..56042357e8 100644
--- a/include/crm/common/cluster.h
+++ b/include/crm/common/cluster.h
@@ -1,105 +1,113 @@
/*
* 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.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
*/
#ifndef CRM_COMMON_CLUSTER__H
#define CRM_COMMON_CLUSTER__H
#include <crm/common/xml.h>
#include <crm/common/msg.h>
#include <crm/ais.h>
-#include <heartbeat.h> /* For ACTIVESTATUS etc */
#if SUPPORT_HEARTBEAT
+# include <heartbeat.h>
# include <heartbeat/hb_api.h>
# include <ocf/oc_event.h>
+#else
+# define ACTIVESTATUS "active" /* fully functional, and all links are up */
+# define DEADSTATUS "dead" /* Status of non-working link or machine */
+# define PINGSTATUS "ping" /* Status of a working ping node */
+# define JOINSTATUS "join" /* Status when an api client joins */
+# define LEAVESTATUS "leave" /* Status when an api client leaves */
+# define ONLINESTATUS "online" /* Status of an online client */
+# define OFFLINESTATUS "offline" /* Status of an offline client */
#endif
extern gboolean crm_have_quorum;
extern GHashTable *crm_peer_cache;
extern GHashTable *crm_peer_id_cache;
extern unsigned long long crm_peer_seq;
extern void crm_peer_init(void);
extern void crm_peer_destroy(void);
extern gboolean crm_cluster_connect(
char **our_uname, char **our_uuid, void *dispatch, void *destroy,
#if SUPPORT_HEARTBEAT
ll_cluster_t **hb_conn
#else
void **unused
#endif
);
extern gboolean send_cluster_message(
const char *node, enum crm_ais_msg_types service, xmlNode *data, gboolean ordered);
extern void destroy_crm_node(gpointer data);
extern crm_node_t *crm_get_peer(unsigned int id, const char *uname);
extern crm_node_t *crm_update_ais_node(xmlNode *member, long long seq);
extern void crm_update_peer_proc(
const char *uname, uint32_t flag, const char *status);
extern crm_node_t *crm_update_peer(
unsigned int id, uint64_t born, uint64_t seen, int32_t votes, uint32_t children,
const char *uuid, const char *uname, const char *addr, const char *state);
extern gboolean crm_is_member_active(const crm_node_t *node);
extern guint crm_active_members(void);
extern guint reap_crm_member(uint32_t id);
extern guint crm_active_members(void);
extern guint crm_active_peers(uint32_t peer);
extern gboolean crm_calculate_quorum(void);
extern int crm_terminate_member(int nodeid, const char *uname, IPC_Channel *cluster);
extern int crm_terminate_member_no_mainloop(int nodeid, const char *uname, int *connection);
#if SUPPORT_HEARTBEAT
extern gboolean ccm_have_quorum(oc_ed_t event);
extern const char *ccm_event_name(oc_ed_t event);
extern crm_node_t *crm_update_ccm_node(
const oc_ev_membership_t *oc, int offset, const char *state, uint64_t seq);
#endif
#if SUPPORT_AIS
extern int ais_fd_sync;
extern GFDSource *ais_source;
extern gboolean send_ais_text(
int class, const char *data, gboolean local,
const char *node, enum crm_ais_msg_types dest);
extern gboolean get_ais_nodeid(uint32_t *id, char **uname);
extern gboolean ais_dispatch(int sender, gpointer user_data);
#endif
extern void empty_uuid_cache(void);
extern const char *get_uuid(const char *uname);
extern const char *get_uname(const char *uuid);
extern void set_uuid(xmlNode *node, const char *attr, const char *uname);
extern void unget_uuid(const char *uname);
enum crm_status_type
{
crm_status_uname,
crm_status_nstate,
crm_status_processes,
};
enum crm_ais_msg_types text2msg_type(const char *text);
extern void crm_set_status_callback(
void (*dispatch)(enum crm_status_type, crm_node_t*, const void*));
#endif
diff --git a/tools/haresources2cib.py.in b/tools/haresources2cib.py.in
index faf6f22740..3026c9df21 100755
--- a/tools/haresources2cib.py.in
+++ b/tools/haresources2cib.py.in
@@ -1,519 +1,519 @@
#!@PYTHON@
'''haresources2cib.py.in, convert the haresources file of heartbeat 1.x
to cib.xml for heartbeat 2.x
'''
__copyright__='''
Author: Huang Zhen <zhenhltc@cn.ibm.com>
Copyright (C) 2005 International Business Machines
'''
#
# 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.
import sys,string,os
import xml.dom.minidom
using_ocf = 1
using_mon = 1
enable_stonith = False
ocf_ra_setting = {
"apache" :{"params":["configfile","httpd","port","statusurl","options","testregex"],"time":["120s","60s"]},
"IPaddr" :{"params":["ip","cidr_netmask","nic","broadcast","iflabel","lvs_support","local_stop_script","local_start_script","ARP_INTERVAL_MS","ARP_REPEAT","ARP_BACKGROUND","ARP_NETMASK"],"time":["5s","5s"]},
"IPaddr2" :{"params":["ip","cidr_netmask","nic","broadcast","iflabel","lvs_support","mac","clusterip_hash","arp_interval","arp_count","arp_bg","arp_mac"],"time":["5s","5s"]},
"db2" :{"params":["instance","admin"],"time":["120s","60s"]},
"oracle" :{"params":["sid","home","user","ipcrm"],"time":["120s","60s"]},
"oralsnr" :{"params":["sid","home","user","listener"],"time":["120s","60s"]},
"AudibleAlarm":{"params":["nodelist"],"time":["120s","60s"]},
"Delay" :{"params":["startdelay","stopdelay","mondelay"],"time":["120s","60s"]},
"Filesystem":{"params":["device","directory","fstype","options","ocfs2_cluster","ocfs2_configfs"],"time":["120s","60s"]},
"ICP" :{"params":["driveid","device"],"time":["120s","60s"]},
"IPsrcaddr" :{"params":["ipaddress"],"time":["5s","5s"]},
"IPv6addr" :{"params":["ipv6addr"],"time":["5s","5s"]},
"LinuxSCSI" :{"params":["scsi"],"time":["120s","60s"]},
"LVM" :{"params":["volgrpname"],"time":["120s","60s"]},
"MailTo" :{"params":["email","subject"],"time":["120s","60s"]},
"portblock" :{"params":["protocol","portno","action"],"time":["120s","60s"]},
"Raid1" :{"params":["raidconf","raiddev","homehost"],"time":["120s","60s"]},
"ServeRAID" :{"params":["serveraid","mergegroup"],"time":["120s","60s"]},
"WinPopup" :{"params":["hostfile"],"time":["120s","60s"]},
"Xinetd" :{"params":["service"],"time":["120s","60s"]},
"ClusterMon" :{"params":["user","update","extra_options","pidfile","htmlfile"],"time":["120s","60s"]},
"Dummy" :{"params":["state"],"time":["120s","60s"]},
"EvmsSCC" :{"params":[],"time":["120s","60s"]},
"Evmsd" :{"params":[],"time":["120s","60s"]},
"ManageRAID" :{"params":["raidname"],"time":["120s","60s"]},
"ManageVE" :{"params":["veid"],"time":["120s","60s"]},
"Pure-FTPd" :{"params":["script","conffile","daemon_type","pidfile"],"time":["120s","60s"]},
"SAPDatabase" :{"params":["SID","DIR_EXECUTABLE","DBTYPE","NETSERVICENAME","DBJ2EE_ONLY","DIR_BOOTSTRAP","DIR_SECSTORE"],"time":["120s","60s"]},
"SAPInstance" :{"params":["InstanceName","DIR_EXECUTABLE","DIR_PROFILE","START_PROFILE"],"time":["120s","60s"]},
"SendArp" :{"params":["ip","nic"],"time":["120s","60s"]},
"Stateful" :{"params":["state"],"time":["120s","60s"]},
"SysInfo" :{"params":["pidfile","delay"],"time":["120s","60s"]},
"VIPArip" :{"params":["ip","nic"],"time":["120s","60s"]},
"WAS" :{"params":["config","port"],"time":["120s","60s"]},
"WAS6" :{"params":["profile"],"time":["120s","60s"]},
"Xen" :{"params":["xmfile"],"time":["120s","60s"]},
"drbd" :{"params":["drbd_resource","drbdconf","clone_overrides_hostname","clone_max","clone_node_max","master_max","master_node_max"],"time":["120s","60s"]},
"eDir88" :{"params":["eDir_config_file","eDir_monitor_ldap","eDir_monitor_idm","eDir_jvm_initial_heap","eDir_jvm_max_heap","eDir_jvm_options"],"time":["120s","60s"]},
"ids" :{"params":["informixdir","informixserver","onconfig","dbname","sqltestquery"],"time":["120s","60s"]},
"iscsi" :{"params":["portal","target","discovery_type","iscsiadm"],"time":["120s","60s"]},
"mysql" :{"params":["binary","config","datadir","user","group","log","pid","socket","test_table","test_user","test_passwd","enable_creation","additional_parameters"],"time":["120s","60s"]},
"o2cb" :{"params":["netdev","port","ocfs2_cluster"],"time":["120s","60s"]},
"pgsql" :{"params":["pgctl","start_opt","ctl_opt","psql","pgdata","pgdba","pghost","pgport","pgdb","logfile","stop_escalate"],"time":["120s","60s"]},
"pingd" :{"params":["pidfile","user","dampen","set","name","section","multiplier","host_list"],"time":["120s","60s"]},
"rsyncd" :{"params":["binpath","conffile","bwlimit"],"time":["120s","60s"]},
"tomcat" :{"params":["tomcat_name","script_log","tomcat_stop_timeout","tomcat_suspend_trialcount","tomcat_user","statusurl","java_home","catalina_home","catalina_pid"],"time":["120s","60s"]}
}
config_defaults = [
"symmetric-cluster=true",
"no-quorum-policy=stop",
"default-resource-stickiness=0",
"default-resource-failure-stickiness=0",
"stonith-enabled=false",
"stonith-action=reboot",
"startup-fencing=true",
"stop-orphan-resources=true",
"stop-orphan-actions=true",
"remove-after-stop=false",
"short-resource-names=true",
"transition-idle-timeout=5min",
"default-action-timeout=20s",
"is-managed-default=true",
"cluster-delay=60s",
"pe-error-series-max=-1",
"pe-warn-series-max=-1",
"pe-input-series-max=-1",
]
def create_cib() :
doc = xml.dom.minidom.Document()
cib = doc.createElement("cib")
doc.appendChild(cib)
configuration = doc.createElement("configuration")
cib.appendChild(configuration)
cib.setAttribute("admin_epoch","0")
cib.setAttribute("epoch","0")
cib.setAttribute("num_updates","0")
crm_config = doc.createElement("crm_config")
configuration.appendChild(crm_config)
option_set = doc.createElement("cluster_property_set")
option_set.setAttribute("id","cib-bootstrap-options")
crm_config.appendChild(option_set)
attr_list = doc.createElement("attributes")
option_set.appendChild(attr_list)
for option in config_defaults:
option_details = string.split(option, '=')
nvpair = doc.createElement("nvpair")
attr_list.appendChild(nvpair)
nvpair.setAttribute("id", "cib-bootstrap-options-"+option_details[0])
nvpair.setAttribute("name", option_details[0])
nvpair.setAttribute("value", option_details[1])
if option_details[0] == "stonith-enabled" and enable_stonith:
nvpair.setAttribute("value", "true")
configuration.appendChild(doc.createElement("nodes"))
resources = doc.createElement("resources")
configuration.appendChild(resources)
constraints = doc.createElement("constraints")
configuration.appendChild(constraints)
status = doc.createElement("status")
cib.appendChild(status)
return doc, resources, constraints
def get_ra_class(type) :
- if os.path.exists("@HB_RA_DIR@"+"/"+type) :
+ if os.path.exists("@sysconfdir@/ha.d/resource.d"+"/"+type) :
return "heartbeat"
if os.path.exists("@INITDIR@"+"/"+type) :
return "lsb"
sys.stderr.write(type+" is an unknown Resource Agent. " \
"Please refer to http://www.linux-ha.org/ResourceAgent\n")
return "UNKNOWN"
def cib_resource(doc,user_res_id,index, rsc):
id, type, params = None, None, None
#if no parameters in rsc, like "apache", "192.168.0.11"
if string.find(rsc, "::") == -1 :
#if there is a IP address in rsc, like "192.168.0.11"
if len(string.split(string.split(rsc,'/')[0],'.')) == 4 :
type = "IPaddr"
params = [rsc]
#no IP address, like "apache"
else :
type = rsc
#else there have "::" in rsc,
#like "IPaddr::192.168.0.11", "IPaddr2::192.168.0.11"
else :
if string.find(rsc, "IPaddr") == 0 :
type = string.split(rsc, "::")[0]
params = [string.split(rsc, "::")[1]]
else :
fields = string.split(rsc,"::")
type = fields[0]
params = fields[1:]
if user_res_id == "" :
if type == "IPaddr" :
id = type+"_"+string.replace(string.split(params[0],'/')[0],'.','_')
else :
id = type+"_"+str(index)
else :
id = user_res_id
resource = doc.createElement("primitive")
resource.setAttribute("id",id)
resource.setAttribute("type",type)
if using_ocf and type in ocf_ra_setting:
resource.setAttribute("class","ocf")
else :
ra_class = get_ra_class(type)
resource.setAttribute("class",ra_class)
resource.setAttribute("provider","heartbeat")
if using_mon :
operations = doc.createElement("operations")
resource.appendChild(operations)
mon_op = doc.createElement("op")
operations.appendChild(mon_op)
mon_op.setAttribute("id", id + "_mon")
mon_op.setAttribute("name","monitor")
interval = "120s"
timeout = "60s"
if using_ocf and type in ocf_ra_setting :
interval = ocf_ra_setting[type]["time"][0]
timeout = ocf_ra_setting[type]["time"][1]
mon_op.setAttribute("interval", interval)
mon_op.setAttribute("timeout", timeout)
if params != None and len(params) != 0:
instance_attributes = doc.createElement("instance_attributes")
instance_attributes.setAttribute("id", id + "_inst_attr")
resource.appendChild(instance_attributes)
attributes = doc.createElement("attributes")
instance_attributes.appendChild(attributes)
if using_ocf and type in ocf_ra_setting :
if type in ["IPaddr", "IPaddr2"] :
unsort = string.split(params[0], "/")
params = [None, None, None, None]
#ip
params[0] = unsort[0]
for param in unsort[1:] :
if len(string.split(param, ".")) == 4 :
#broadcast
params[3] = param
break
try :
int(param)
#netmask bits
params[2] = param
except ValueError:
#nic
params[1] = param
for i in range(0,len(params)) :
if params[i] == None :
continue
nvpair = doc.createElement("nvpair")
name = ocf_ra_setting[type]["params"][i]
nvpair.setAttribute("id",id + "_attr_" + str(i))
nvpair.setAttribute("name",name)
if i == len(ocf_ra_setting[type]["params"]) - 1 :
nvpair.setAttribute("value",string.join(params[i:]))
attributes.appendChild(nvpair)
break
else :
nvpair.setAttribute("value",str(params[i]))
attributes.appendChild(nvpair)
else :
i = 1
for param in params :
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id",id + "_attr_" + str(i))
nvpair.setAttribute("name",str(i))
nvpair.setAttribute("value",str(param))
attributes.appendChild(nvpair)
i += 1
return id, resource
def cib_rsc_order(doc, args):
rsc_order = doc.createElement("rsc_order")
rsc_order.setAttribute("id","rsc_order_"+args[0]+"_"+args[3])
rsc_order.setAttribute("from",args[0])
rsc_order.setAttribute("action",args[1])
rsc_order.setAttribute("type",args[2])
rsc_order.setAttribute("to",args[3])
rsc_order.setAttribute("symmetrical","true")
return rsc_order
def cib_rsc_colocation(doc, args):
if len(args) != 3 :
sys.stderr.write("rsc_colocation: bad usage\n")
return
rsc_colocation = doc.createElement("rsc_colocation")
rsc_colocation.setAttribute("id","rsc_colocation_"+args[0]+"_"+args[1])
rsc_colocation.setAttribute("from",args[0])
rsc_colocation.setAttribute("to",args[1])
rsc_colocation.setAttribute("score",args[2])
return rsc_colocation
def cib_rsc_location(doc, id, node):
rsc_location = doc.createElement("rsc_location")
rsc_location.setAttribute("id","rsc_location_"+id)
rsc_location.setAttribute("rsc",id)
rule = doc.createElement("rule")
rule.setAttribute("id","prefered_location_"+id)
rule.setAttribute("score","100")
rsc_location.appendChild(rule)
expression = doc.createElement("expression")
expression.setAttribute("id","prefered_location_"+id+"_expr")
expression.setAttribute("attribute","#uname")
expression.setAttribute("operation","eq")
expression.setAttribute("value", node)
rule.appendChild(expression)
return rsc_location
def cib_resource_group(doc, id):
resource_group = doc.createElement("group")
resource_group.setAttribute("id",id)
return resource_group
def cib_resource_clone(doc, id, clone_max, clone_node_max):
resource_clone = doc.createElement("clone")
resource_clone.setAttribute("id",id)
instance_attributes = doc.createElement("instance_attributes")
instance_attributes.setAttribute("id", id + "_inst_attr")
resource_clone.appendChild(instance_attributes)
attributes = doc.createElement("attributes")
instance_attributes.appendChild(attributes)
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id",id + "_attr_1")
nvpair.setAttribute("name", "clone_max")
nvpair.setAttribute("value", str(clone_max))
attributes.appendChild(nvpair)
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id",id + "_attr_2")
nvpair.setAttribute("name", "clone_node_max")
nvpair.setAttribute("value", str(clone_node_max))
attributes.appendChild(nvpair)
return resource_clone
def add_resource(cib,user_res_id,index,node,rsc):
id,resource = cib_resource(cib[0],user_res_id,index,rsc)
cib[1].appendChild(resource)
rsc_location = cib_rsc_location(cib[0],id,node)
cib[2].appendChild(rsc_location)
def add_resource_group(cib,user_res_id,index,node,rscs):
if user_res_id == "" :
groupid = "group_"+str(group_index)
else :
groupid = user_res_id
resource_group = cib_resource_group(cib[0],groupid)
cib[1].appendChild(resource_group)
for rsc in rscs :
rid,resource = cib_resource(cib[0],"",index,rsc)
resource_group.appendChild(resource)
index += 1
rsc_location = cib_rsc_location(cib[0],groupid,node)
cib[2].appendChild(rsc_location)
def add_clone(cib,user_res_id, index,rsc) :
if user_res_id == "" :
cloneid = "clone_"+str(index)
else :
cloneid = user_res_id
clone = cib_resource_clone(cib[0], cloneid, node_num, 1)
cib[1].appendChild(clone)
id,resource = cib_resource(cib[0],"",index,rsc)
clone.appendChild(resource)
def add_stonith_clone(cib, index, params, node_num) :
clone = cib_resource_clone(cib[0], "clone_"+str(index), node_num, 1)
cib[1].appendChild(clone)
id, stonith = cib_stonith(cib[0], index, params)
clone.appendChild(stonith)
def cib_stonith(doc, index, params):
id = "stonith_"+str(index)
resource = doc.createElement("primitive")
resource.setAttribute("id",id)
resource.setAttribute("type",params[1])
resource.setAttribute("class","stonith")
resource.setAttribute("provider","heartbeat")
if using_mon :
operations = doc.createElement("operations")
resource.appendChild(operations)
mon_op = doc.createElement("op")
operations.appendChild(mon_op)
mon_op.setAttribute("id", id + "_mon")
mon_op.setAttribute("name","monitor")
mon_op.setAttribute("interval", "5s")
mon_op.setAttribute("timeout", "20s")
mon_op.setAttribute("prereq", "nothing")
start_op = doc.createElement("op")
operations.appendChild(start_op)
start_op.setAttribute("id", id + "_start")
start_op.setAttribute("name","start")
start_op.setAttribute("timeout", "20s")
start_op.setAttribute("prereq", "nothing")
if len(params) > 2 :
instance_attributes = doc.createElement("instance_attributes")
instance_attributes.setAttribute("id", id + "_inst_attr")
resource.appendChild(instance_attributes)
attributes = doc.createElement("attributes")
instance_attributes.appendChild(attributes)
names = string.split(os.popen("stonith -n -t "+params[1]).readline())
for i in range(2, len(params)) :
nvpair = doc.createElement("nvpair")
nvpair.setAttribute("id", id + "_attr_" + str(i))
nvpair.setAttribute("name", names[i-2])
nvpair.setAttribute("value", params[i])
attributes.appendChild(nvpair)
return id, resource
def add_stonith_host(cib, stonith_host, index, node_num) :
params = string.split(stonith_host)[1:]
if params[0] == "*" :
add_stonith_clone(cib, index, params, node_num)
else :
id, resource = cib_stonith(cib[0], index, params)
cib[1].appendChild(resource)
stonith_location = cib_rsc_location(cib[0],id,params[0])
cib[2].appendChild(stonith_location)
def get_directive_list(config, directive) :
directive_list = []
for line in config :
line = line.lstrip()
if len (line) == 0 or line[0] == "#" :
continue
if string.split(line)[0] == directive :
directive_list.append(line)
return directive_list
if __name__=="__main__" :
- resource_file = "@HA_HBCONF_DIR@/haresources"
- config_file = "@HA_HBCONF_DIR@/ha.cf"
+ resource_file = "@sysconfdir@/ha.d/haresources"
+ config_file = "@sysconfdir@/ha.d/ha.cf"
target_file = "@CRM_CONFIG_DIR@/cib.xml"
to_stdout = False
# Process arguments...
skipthis = None
args = sys.argv[1:]
for i in range(0, len(args)) :
if skipthis :
skipthis = None
continue
elif args[i] == "--no-ocf" :
using_ocf = 0
elif args[i] == "--stdout" :
to_stdout = True
elif args[i] == "--no-monitor" :
using_mon = 0
elif args[i] == "--config" or args[i] == "-c" :
skipthis = True
config_file = args[i+1]
elif args[i] == "--help" or args[i] == "-h" :
print "usage: " + sys.argv[0] \
+ " [--no-ocf]"\
+ " [--stdout]"\
+ " [--no-monitor]"\
+ " [--config|-c configfile]"\
+ " [--help|-h]"\
+ " [resourcefile]"
sys.exit(1)
else:
resource_file = args[i]
config = open(config_file, "r").readlines()
node_list = get_directive_list(config, "node")
node_num = 0
for nodes in node_list :
node_num += len(string.split(nodes)) -1
stonith_host_list = get_directive_list(config, "stonith_host")
if len(stonith_host_list) != 0 :
enable_stonith = True
file = open(resource_file, "r")
cib = create_cib()
pre_line = ""
id_index = 1
group_index = 1
for line in file.readlines() :
line = string.strip(line)
if len (line) == 0 :
continue
if line[0] == '#' and string.find(line,"#rsc_order") != 0 and string.find(line,"#rsc_colocation") != 0 :
continue
if line[-1] == '\\' :
pre_line += line[:-1] + " "
continue
else :
line = pre_line + line
pre_line = ""
fields = string.split(line)
if fields[len(fields)-1][0] == '#' :
user_res_id = fields[len(fields)-1][1:]
fields.pop()
else :
user_res_id = ""
if fields[0] == "#rsc_order" and len(fields) == 5 :
rsc_order = cib_rsc_order(cib[0],fields[1:])
cib[2].appendChild(rsc_order)
elif fields[0] == "#rsc_colocation" and len(fields) == 4 :
rsc_colocation = cib_rsc_colocation(cib[0],fields[1:])
cib[2].appendChild(rsc_colocation)
elif string.find(user_res_id, "clone:") == 0 :
add_clone(cib, user_res_id[len("clone:"):], group_index, fields[1])
group_index += 10
id_index += 1
elif len(fields) == 2 :
add_resource(cib, user_res_id, id_index, fields[0], fields[1])
id_index += 1
elif len(fields) > 2 :
add_resource_group(cib, user_res_id, group_index, fields[0], fields[1:])
group_index += 10
id_index += len(fields)
else :
sys.stderr.write("can not parse this line:"+line+"\n")
if enable_stonith :
for stonith_host in stonith_host_list :
add_stonith_host(cib, stonith_host, id_index, node_num)
id_index += 1
if to_stdout :
print cib[0].toprettyxml()
elif os.access(target_file, os.F_OK) or os.access(target_file+".sig", os.F_OK) :
sys.stderr.write("cib.xml or cib.xml.sig exist in @CRM_CONFIG_DIR@\n")
sys.stderr.write("please remove them before generating new cib.xml\n")
else :
cib_file = open(target_file, "w")
cib_file.write(cib[0].toprettyxml())
cib_file.close()
os.system("chown @CRM_DAEMON_USER@.@CRM_DAEMON_GROUP@ "+target_file)
diff --git a/tools/shell/regression/lrmregtest-lsb.in b/tools/shell/regression/lrmregtest-lsb.in
index 1d47cd3e09..83d23988c3 100644
--- a/tools/shell/regression/lrmregtest-lsb.in
+++ b/tools/shell/regression/lrmregtest-lsb.in
@@ -1,12 +1,12 @@
#!/bin/sh
#
# WARNING: This script is for LRM regressions tests only
#
-. @HB_RA_DIR@/hto-mapfuncs
+. @sysconfdir@/ha.d/resource.d/hto-mapfuncs
OCF_TYPE=lrmregtest
OCF_RESOURCE_INSTANCE=lsb
export OCF_TYPE OCF_RESOURCE_INSTANCE
ra_execocf $1

File Metadata

Mime Type
text/x-diff
Expires
Wed, Jun 25, 4:31 AM (1 d, 11 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1952147
Default Alt Text
(77 KB)

Event Timeline