Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F3156223
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
80 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/Makefile.am b/Makefile.am
index 3b489d7..443c664 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,155 +1,155 @@
# Copyright (c) 2009 Red Hat, Inc.
#
# Authors: Andrew Beekhof
# Steven Dake (sdake@redhat.com)
#
# This software licensed under BSD license, the text of which follows:
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# - Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# - Neither the name of the MontaVista Software, Inc. nor the names of its
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.
SPEC = $(PACKAGE_NAME).spec
TARFILE = $(PACKAGE_NAME)-$(VERSION).tar.gz
EXTRA_DIST = autogen.sh conf/booth.conf.example $(bootharbitrator_SCRIPTS) $(boothsite_SCRIPTS)
AUTOMAKE_OPTIONS = foreign
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure depcomp \
config.guess config.sub missing install-sh \
autoheader automake autoconf test_lense.sh
dist_doc_DATA = README COPYING
notrans_dist_man8_MANS = docs/boothd.8
boothconfdir = ${BOOTHSYSCONFDIR}
boothconf_DATA = conf/booth.conf.example
boothsitedir = /usr/lib/ocf/resource.d/pacemaker
boothsite_SCRIPTS = script/ocf/booth-site
bootharbitratordir = ${INITDDIR}
bootharbitrator_SCRIPTS = script/lsb/booth-arbitrator
TESTS = test/runtests.py
-SUBDIRS = src tools
+SUBDIRS = src
coverity:
cov-build --dir=cov make
cov-analyze --dir cov --concurrency --wait-for-license
cov-format-errors --dir cov
install-exec-local:
$(INSTALL) -d $(DESTDIR)/${boothconfdir}
$(INSTALL) -d $(DESTDIR)/${bootharbitratordir}
$(INSTALL) -d $(DESTDIR)/${boothsitedir}
$(INSTALL) -d $(DESTDIR)/${SOCKETDIR}
install-exec-hook:
ln -sf ${sbindir}/boothd $(DESTDIR)/${sbindir}/booth
uninstall-local:
rmdir $(DESTDIR)/${boothconfdir} || :;
rmdir $(DESTDIR)/${bootharbitratordir} || :;
rmdir $(DESTDIR)/${boothsitedir} || :;
rmdir $(DESTDIR)/${SOCKETDIR} || :;
test: check
lint:
for dir in src; do make -C $$dir lint; done
dist-clean-local:
rm -f autoconf automake autoheader
dist-hook:
echo $(VERSION) > $(distdir)/.tarball-version
## make rpm/srpm section.
$(SPEC): $(SPEC).in
rm -f $@-t $@
date="$(shell LC_ALL=C date "+%a %b %d %Y")" && \
if [ -f .tarball-version ]; then \
gitver="$(shell cat .tarball-version)" && \
rpmver=$$gitver && \
alphatag="" && \
dirty="" && \
numcomm="0"; \
else \
gitver="$(shell git describe --tags --abbrev=4 --match='v*' HEAD 2>/dev/null)" && \
rpmver=`echo $$gitver | sed -e "s/^v//" -e "s/-.*//g"` && \
alphatag=`echo $$gitver | sed -e "s/.*-//" -e "s/^g//"` && \
vtag=`echo $$gitver | sed -e "s/-.*//g"` && \
numcomm=`git rev-list $$vtag..HEAD | wc -l` && \
git update-index --refresh > /dev/null 2>&1 || true && \
dirty=`git diff-index --name-only HEAD 2>/dev/null`; \
fi && \
if [ -n "$$dirty" ]; then dirty="dirty"; else dirty=""; fi && \
if [ "$$numcomm" = "0" ]; then \
sed \
-e "s#@version@#$$rpmver#g" \
-e "s#%glo.*alpha.*##g" \
-e "s#%glo.*numcomm.*##g" \
-e "s#@dirty@#$$dirty#g" \
-e "s#@date@#$$date#g" \
$< > $@-t; \
else \
sed \
-e "s#@version@#$$rpmver#g" \
-e "s#@alphatag@#$$alphatag#g" \
-e "s#@numcomm@#$$numcomm#g" \
-e "s#@dirty@#$$dirty#g" \
-e "s#@date@#$$date#g" \
$< > $@-t; \
fi; \
if [ -z "$$dirty" ]; then sed -i -e "s#%glo.*dirty.*##g" $@-t; fi
chmod a-w $@-t
mv $@-t $@
$(TARFILE):
$(MAKE) dist
RPMBUILDOPTS = --define "_sourcedir $(abs_builddir)" \
--define "_specdir $(abs_builddir)" \
--define "_builddir $(abs_builddir)" \
--define "_srcrpmdir $(abs_builddir)" \
--define "_rpmdir $(abs_builddir)"
srpm: clean
autoreconf -if
$(MAKE) $(SPEC) $(TARFILE)
rpmbuild $(WITH_LIST) $(RPMBUILDOPTS) --nodeps -bs $(SPEC)
rpm: clean
autoreconf -if
$(MAKE) $(SPEC) $(TARFILE)
rpmbuild $(WITH_LIST) $(RPMBUILDOPTS) -ba $(SPEC)
diff --git a/booth.spec.in b/booth.spec.in
index 4e9357b..69cf2e6 100644
--- a/booth.spec.in
+++ b/booth.spec.in
@@ -1,78 +1,70 @@
-%bcond_with resource_monitor
%global alphatag @alphatag@
%global numcomm @numcomm@
%global dirty @dirty@
Name: booth
Version: @version@
Release: 1%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist}
Summary: The Booth Cluster Ticket Manager.
Group: System Environment/Daemons
License: GPLv2
URL: http://www.clusterlabs.org
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Provides: booth
Requires: pacemaker
BuildRequires: autoconf automake libtool cluster-glue-libs-devel help2man
%if %{with resource-monitor}
BuildRequires: pacemaker-libs-devel
%endif
%description
Booth manages the ticket which authorizes one of the cluster sites located in
geographically dispersed distances to run certain resources. It is designed to
be an add-on of Pacemaker, which extends Pacemaker to support geographically
distributed clustering.
%prep
%setup -q -n %{name}-%{version}
%build
./autogen.sh
%configure \
-%if %{with resource_monitor}
- --enable-resource-monitor \
-%endif
--with-initddir=%{_initrddir}
make all
#except check
#%check
#make check
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%doc %{_docdir}/booth/README
%doc %{_docdir}/booth/COPYING
%{_sbindir}/booth
%{_sbindir}/boothd
%config %{_sysconfdir}/booth/booth.conf.example
%{_mandir}/man8/booth.8.gz
%{_mandir}/man8/boothd.8.gz
%dir /usr/lib/ocf/resource.d/pacemaker/
/usr/lib/ocf/resource.d/pacemaker/booth-site
%{_initrddir}/booth-arbitrator
-%if %{with resource_monitor}
-%{_sbindir}/booth_resource_monitord
-%endif
-
%changelog
* @date@ Autotools generated version <nobody@nowhere.org> - @version@-1-@numcomm@.@alphatag@.@dirty@
- Autotools generated version
diff --git a/configure.ac b/configure.ac
index 9cb69be..262078a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,460 +1,430 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
# bootstrap / init
AC_PREREQ([2.61])
AC_INIT([booth], [0.1.6], [pacemaker@oss.clusterlabs.org])
AM_INIT_AUTOMAKE([-Wno-portability])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADER([src/b_config.h src/booth_config.h])
AC_CANONICAL_HOST
AC_LANG([C])
AC_SUBST(WITH_LIST, [""])
dnl Fix default variables - "prefix" variable if not specified
if test "$prefix" = "NONE"; then
prefix="/usr"
dnl Fix "localstatedir" variable if not specified
if test "$localstatedir" = "\${prefix}/var"; then
localstatedir="/var"
fi
dnl Fix "sysconfdir" variable if not specified
if test "$sysconfdir" = "\${prefix}/etc"; then
sysconfdir="/etc"
fi
dnl Fix "libdir" variable if not specified
if test "$libdir" = "\${exec_prefix}/lib"; then
if test -e /usr/lib64; then
libdir="/usr/lib64"
else
libdir="/usr/lib"
fi
fi
fi
if test "$srcdir" = "."; then
AC_MSG_NOTICE([building in place srcdir:$srcdir])
AC_DEFINE([BUILDING_IN_PLACE], 1, [building in place])
else
AC_MSG_NOTICE([building out of tree srcdir:$srcdir])
fi
# Checks for programs.
# check stolen from gnulib/m4/gnu-make.m4
if ! ${MAKE-make} --version /cannot/make/this >/dev/null 2>&1; then
AC_MSG_ERROR([you don't seem to have GNU make; it is required])
fi
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PATH_PROGS(HELP2MAN, help2man)
AC_PATH_PROGS(PKGCONFIG, pkg-config)
AM_CONDITIONAL(HAVE_HELP2MAN, test x"${HELP2MAN}" != x"")
# Checks for libraries.
AC_CHECK_LIB([socket], [socket])
AC_CHECK_LIB([nsl], [t_open])
AC_CHECK_LIB([gpl], [cl_log])
PKG_CHECK_MODULES(GLIB, [glib-2.0])
# Checks for header files.
AC_FUNC_ALLOCA
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stdint.h \
stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h \
sys/time.h syslog.h unistd.h sys/types.h getopt.h malloc.h \
sys/sockio.h utmpx.h])
AC_CHECK_HEADERS(heartbeat/glue_config.h)
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_UID_T
AC_C_INLINE
AC_TYPE_INT16_T
AC_TYPE_INT32_T
AC_TYPE_INT64_T
AC_TYPE_INT8_T
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_HEADER_TIME
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_TYPE_UINT8_T
AC_C_VOLATILE
# Checks for library functions.
AC_FUNC_CLOSEDIR_VOID
AC_FUNC_ERROR_AT_LINE
AC_REPLACE_FNMATCH
AC_FUNC_FORK
AC_PROG_GCC_TRADITIONAL
AC_FUNC_MALLOC
AC_FUNC_MEMCMP
AC_FUNC_REALLOC
AC_FUNC_SELECT_ARGTYPES
AC_TYPE_SIGNAL
AC_FUNC_VPRINTF
AC_CHECK_FUNCS([alarm alphasort atexit bzero dup2 endgrent endpwent fcntl \
getcwd getpeerucred getpeereid gettimeofday inet_ntoa memmove \
memset mkdir scandir select socket strcasecmp strchr strdup \
strerror strrchr strspn strstr \
sched_get_priority_max sched_setscheduler])
AC_CONFIG_FILES([Makefile
- src/Makefile
- tools/Makefile])
+ src/Makefile])
# ===============================================
# Helpers
# ===============================================
## helper for CC stuff
cc_supports_flag() {
local CFLAGS="-Werror $@"
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
}
## cleanup
AC_MSG_NOTICE(Sanitizing prefix: ${prefix})
case $prefix in
NONE) prefix=/usr/local;;
esac
AC_MSG_NOTICE(Sanitizing exec_prefix: ${exec_prefix})
case $exec_prefix in
dnl For consistency with Corosync, map NONE->$prefix
NONE) exec_prefix=$prefix;;
prefix) exec_prefix=$prefix;;
esac
## local defines
PACKAGE_FEATURES=""
LINT_FLAGS="-weak -unrecog +posixlib +ignoresigns -fcnuse \
-badflag -D__gnuc_va_list=va_list -D__attribute\(x\)="
# local options
AC_ARG_ENABLE([fatal-warnings],
[ --enable-fatal-warnings : enable fatal warnings. ],
[ default="no" ])
AC_ARG_ENABLE([debug],
[ --enable-debug : enable debug build. ],
[ default="no" ])
AC_ARG_ENABLE([user-flags],
[ --enable-user-flags : rely on user environment. ],
[ default="no" ])
AC_ARG_ENABLE([coverage],
[ --enable-coverage : coverage analysis of the codebase. ],
[ default="no" ])
AC_ARG_ENABLE([small-memory-footprint],
[ --enable-small-memory-footprint : Use small message queues and small messages sizes. ],
[ default="no" ])
AC_ARG_WITH([initddir],
[ --with-initddir=DIR : path to init script directory. ],
[ INITDDIR="$withval" ],
[ INITDDIR="$sysconfdir/init.d" ])
AC_ARG_ENABLE([resource-monitor],
[ --enable-resource-monitor : Enabling Resource Monitor ],
[ default="no" ])
# OS detection
# THIS SECTION MUST DIE!
CP=cp
OS_LDL="-ldl"
have_linux="no"
case "$host_os" in
*linux*)
AC_DEFINE_UNQUOTED([BOOTH_LINUX], [1],
[Compiling for Linux platform])
OS_CFLAGS=""
OS_CPPFLAGS="-D_GNU_SOURCE"
OS_LDFLAGS=""
OS_DYFLAGS="-rdynamic"
DARWIN_OPTS=""
have_linux="yes"
;;
darwin*)
AC_DEFINE_UNQUOTED([BOOTH_DARWIN], [1],
[Compiling for Darwin platform])
CP=rsync
OS_CFLAGS=""
OS_CPPFLAGS=""
OS_LDFLAGS=""
OS_DYFLAGS=""
DARWIN_OPTS="-dynamiclib -bind_at_load \
-current_version ${SONAME} \
-compatibility_version ${SONAME} -install_name \$(libdir)/\$(@)"
AC_DEFINE_UNQUOTED([MAP_ANONYMOUS], [MAP_ANON],
[Shared memory define for Darwin platform])
AC_DEFINE_UNQUOTED([PATH_MAX], [4096],
[Number of chars in a path name including nul])
AC_DEFINE_UNQUOTED([NAME_MAX], [255],
[Number of chars in a file name])
;;
*bsd*)
AC_DEFINE_UNQUOTED([BOOTH_BSD], [1],
[Compiling for BSD platform])
AC_DEFINE_UNQUOTED([MAP_ANONYMOUS], [MAP_ANON],
[Shared memory define for Darwin platform])
OS_CFLAGS=""
OS_CPPFLAGS="-I/usr/local/include"
OS_LDFLAGS="-L/usr/local/lib"
OS_DYFLAGS="-export-dynamic"
DARWIN_OPTS=""
OS_LDL=""
case "$host_os" in
*freebsd[[234567]]*)
;;
*freebsd*)
AC_DEFINE_UNQUOTED([BOOTH_FREEBSD_GE_8], [1],
[Compiling for FreeBSD >= 8 platform])
;;
esac
;;
*solaris*)
AC_DEFINE_UNQUOTED([BOOTH_SOLARIS], [1],
[Compiling for Solaris platform])
AC_DEFINE_UNQUOTED([TS_CLASS], [1],
[Prevent being scheduled RR])
AC_DEFINE_UNQUOTED([_SEM_SEMUN_UNDEFINED], [1],
[The semun structure is undefined])
CP=rsync
OS_CFLAGS=""
OS_CPPFLAGS="-D_REENTRANT"
OS_LDFLAGS=""
OS_DYFLAGS="-Wl,-z,lazyload"
DARWIN_OPTS=""
SOLARIS_OPTS=" "
;;
*)
AC_MSG_ERROR([Unsupported OS? hmmmm])
;;
esac
AC_SUBST(CP)
# *FLAGS handling goes here
ENV_CFLAGS="$CFLAGS"
ENV_CPPFLAGS="$CPPFLAGS"
ENV_LDFLAGS="$LDFLAGS"
# debug build stuff
if test "x${enable_debug}" = xyes; then
AC_DEFINE_UNQUOTED([DEBUG], [1], [Compiling Debugging code])
OPT_CFLAGS="-O0"
PACKAGE_FEATURES="$PACKAGE_FEATURES debug"
else
OPT_CFLAGS="-O3"
fi
# gdb flags
if test "x${GCC}" = xyes; then
GDB_FLAGS="-ggdb3"
else
GDB_FLAGS="-g"
fi
# extra warnings
EXTRA_WARNINGS=""
WARNLIST="
all
shadow
missing-prototypes
missing-declarations
strict-prototypes
declaration-after-statement
pointer-arith
write-strings
bad-function-cast
missing-format-attribute
format=2
format-security
format-nonliteral
no-long-long
unsigned-char
gnu89-inline
no-strict-aliasing
"
for j in $WARNLIST; do
if cc_supports_flag -W$j; then
EXTRA_WARNINGS="$EXTRA_WARNINGS -W$j";
fi
done
if test "x${enable_coverage}" = xyes && \
cc_supports_flag -ftest-coverage && \
cc_supports_flag -fprofile-arcs ; then
AC_MSG_NOTICE([Enabling Coverage (enable -O0 by default)])
OPT_CFLAGS="-O0"
COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
COVERAGE_LCRSO_EXTRA_LDFLAGS="-rdynamic"
PACKAGE_FEATURES="$PACKAGE_FEATURES coverage"
else
COVERAGE_CFLAGS=""
COVERAGE_LDFLAGS=""
COVERAGE_LCRSO_EXTRA_LDFLAGS=""
fi
if test "x${enable_small_memory_footprint}" = xyes ; then
AC_DEFINE_UNQUOTED([HAVE_SMALL_MEMORY_FOOTPRINT], 1, [have small_memory_footprint])
PACKAGE_FEATURES="$PACKAGE_FEATURES small-memory-footprint"
fi
if test "x${enable_ansi}" = xyes && \
cc_supports_flag -std=iso9899:199409 ; then
AC_MSG_NOTICE([Enabling ANSI Compatibility])
ANSI_CPPFLAGS="-ansi -D_GNU_SOURCE -DANSI_ONLY"
PACKAGE_FEATURES="$PACKAGE_FEATURES ansi"
else
ANSI_CPPFLAGS=""
fi
if test "x${enable_fatal_warnings}" = xyes && \
cc_supports_flag -Werror ; then
AC_MSG_NOTICE([Enabling Fatal Warnings (-Werror)])
WERROR_CFLAGS="-Werror"
PACKAGE_FEATURES="$PACKAGE_FEATURES fatal-warnings"
else
WERROR_CFLAGS=""
fi
-RESMON_CFLAGS=""
-if test "x${enable_resource_monitor}" = xyes; then
- RESMON_CFLAGS="-I$oldincludedir/pacemaker/"
- CPPFLAGS="$ENV_CPPFLAGS $ANSI_CPPFLAGS $OS_CPPFLAGS $GLIB_CFLAGS $RESMON_CFLAGS"
- AC_CHECK_HEADERS(libxml/tree.h)
- AC_CHECK_HEADERS(crm/cib.h)
- AC_CHECK_HEADERS([crm/cib/util.h], [], [],
- [
-#include <libxml/tree.h>
-#include <crm/cib.h>
- ])
- AC_CHECK_HEADERS([crm/common/xml.h], [], [],
- [
-#include <libxml/tree.h>
-#include <crm/cib.h>
- ])
- AC_CHECK_LIB([crmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2], [xml_log_patchset])
- AC_CHECK_LIB([crmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2], [log_cib_diff])
- AC_CHECK_FUNCS(log_cib_diff)
- AC_CHECK_FUNCS(xml_log_patchset)
- PACKAGE_FEATURES="$PACKAGE_FEATURES resource-monitor"
- WITH_LIST="$WITH_LIST --with resource-monitor"
- SUPPORT_RESOURCE_MONITOR=1
-else
- SUPPORT_RESOURCE_MONITOR=0
-fi
-
-AM_CONDITIONAL(RESOURCE_MONITOR, test $SUPPORT_RESOURCE_MONITOR = 1)
-
# don't add addtional cflags
if test "x${enable_user_flags}" = xyes; then
OPT_CFLAGS=""
GDB_FLAGS=""
EXTRA_WARNINGS=""
fi
# final build of *FLAGS
CFLAGS="$ENV_CFLAGS $OPT_CFLAGS $GDB_FLAGS $OS_CFLAGS \
$COVERAGE_CFLAGS $EXTRA_WARNINGS $WERROR_CFLAGS $NSS_CFLAGS"
CPPFLAGS="$ENV_CPPFLAGS $ANSI_CPPFLAGS $OS_CPPFLAGS $GLIB_CFLAGS $RESMON_CFLAGS"
LDFLAGS="$ENV_LDFLAGS $COVERAGE_LDFLAGS $OS_LDFLAGS"
# substitute what we need:
AC_SUBST([INITDDIR])
AC_SUBST([COVERAGE_LCRSO_EXTRA_LDFLAGS])
AC_SUBST([OS_DYFLAGS])
AC_SUBST([OS_LDL])
AM_CONDITIONAL(BUILD_DARWIN, test -n "${DARWIN_OPTS}")
AM_CONDITIONAL(BUILD_SOLARIS, test -n "${SOLARIS_OPTS}")
AC_SUBST([DARWIN_OPTS])
AC_SUBST([SOLARIS_OPTS])
AM_CONDITIONAL(BUILD_HTML_DOCS, test -n "${GROFF}")
AC_SUBST([LINT_FLAGS])
AC_DEFINE_UNQUOTED([LCRSODIR], "$(eval echo ${LCRSODIR})", [LCRSO directory])
AC_DEFINE_UNQUOTED([SOCKETDIR], "$(eval echo ${SOCKETDIR})", [Socket directory])
AC_DEFINE_UNQUOTED([LOCALSTATEDIR], "$(eval echo ${localstatedir})", [localstate directory])
BOOTHSYSCONFDIR=${sysconfdir}/booth
AC_SUBST([HAVE_LOG_CIB_DIFF])
AC_SUBST([HAVE_XML_LOG_PATCHSET])
AC_SUBST([BOOTHSYSCONFDIR])
AC_DEFINE_UNQUOTED([BOOTHSYSCONFDIR], "$(eval echo ${BOOTHSYSCONFDIR})", [booth config directory])
AC_DEFINE_UNQUOTED([PACKAGE_FEATURES], "${PACKAGE_FEATURES}", [booth built-in features])
AC_OUTPUT
AC_MSG_RESULT([])
AC_MSG_RESULT([$PACKAGE configuration:])
AC_MSG_RESULT([ Version = ${VERSION}])
AC_MSG_RESULT([ Prefix = ${prefix}])
AC_MSG_RESULT([ Executables = ${sbindir}])
AC_MSG_RESULT([ Man pages = ${mandir}])
AC_MSG_RESULT([ Doc dir = ${docdir}])
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([ System init.d directory = ${INITDDIR}])
AC_MSG_RESULT([ booth config dir = ${BOOTHSYSCONFDIR}])
AC_MSG_RESULT([ SOCKETDIR = ${SOCKETDIR}])
AC_MSG_RESULT([ Features =${PACKAGE_FEATURES}])
AC_MSG_RESULT([])
AC_MSG_RESULT([$PACKAGE build info:])
AC_MSG_RESULT([ Library SONAME = ${SONAME}])
LIB_MSG_RESULT(m4_shift(local_soname_list))dnl
AC_MSG_RESULT([ Default optimization = ${OPT_CFLAGS}])
AC_MSG_RESULT([ Default debug options = ${GDB_CFLAGS}])
AC_MSG_RESULT([ Extra compiler warnings = ${EXTRA_WARNING}])
AC_MSG_RESULT([ Env. defined CFLAG = ${ENV_CFLAGS}])
AC_MSG_RESULT([ Env. defined CPPFLAGS = ${ENV_CPPFLAGS}])
AC_MSG_RESULT([ Env. defined LDFLAGS = ${ENV_LDFLAGS}])
AC_MSG_RESULT([ OS defined CFLAGS = ${OS_CFLAGS}])
AC_MSG_RESULT([ OS defined CPPFLAGS = ${OS_CPPFLAGS}])
AC_MSG_RESULT([ OS defined LDFLAGS = ${OS_LDFLAGS}])
AC_MSG_RESULT([ OS defined LDL = ${OS_LDL}])
AC_MSG_RESULT([ OS defined DYFLAGS = ${OS_DYFLAGS}])
AC_MSG_RESULT([ ANSI defined CPPFLAGS = ${ANSI_CPPFLAGS}])
AC_MSG_RESULT([ Coverage CFLAGS = ${COVERAGE_CFLAGS}])
AC_MSG_RESULT([ Coverage LDFLAGS = ${COVERAGE_LDFLAGS}])
AC_MSG_RESULT([ Fatal War. CFLAGS = ${WERROR_CFLAGS}])
AC_MSG_RESULT([ Final CFLAGS = ${CFLAGS}])
AC_MSG_RESULT([ Final CPPFLAGS = ${CPPFLAGS}])
AC_MSG_RESULT([ Final LDFLAGS = ${LDFLAGS}])
diff --git a/src/handler.c b/src/handler.c
new file mode 100644
index 0000000..8670385
--- /dev/null
+++ b/src/handler.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2014 Philipp Marek <philipp.marek@linbit.com>
+ *
+ * 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
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <arpa/inet.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <assert.h>
+#include <time.h>
+#include "ticket.h"
+#include "config.h"
+#include "inline-fn.h"
+#include "log.h"
+#include "pacemaker.h"
+#include "booth.h"
+#include "handler.h"
+
+
+
+/** Runs an external handler.
+ * See eg. 'before-acquire-handler'.
+ * TODO: timeout, async operation?. */
+int run_handler(struct ticket_config *tk,
+ const char *cmd, int synchronous)
+{
+ int rv;
+ char expires[16];
+
+
+ assert(synchronous);
+ sprintf(expires, "%" PRId64, tk->expires);
+
+ rv = setenv("BOOTH_TICKET", tk->name, 1) ||
+ setenv("BOOTH_LOCAL", local->addr_string, 1) ||
+ setenv("BOOTH_CONF_NAME", booth_conf->name, 1) ||
+ setenv("BOOTH_CONF_PATH", cl.configfile, 1) ||
+ setenv("BOOTH_TICKET_EXPIRES", expires, 1);
+
+ if (rv) {
+ log_error("Cannot set environment: %d", errno);
+ } else {
+ rv = system(cmd);
+ if (rv)
+ log_error("Error calling \"%s\": %s",
+ cmd, interpret_rv(rv));
+ else
+ log_info("Ran \"%s\" successfully.", cmd);
+ }
+
+ return rv;
+}
diff --git a/src/handler.h b/src/handler.h
new file mode 100644
index 0000000..59dc069
--- /dev/null
+++ b/src/handler.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2014 Philipp Marek <philipp.marek@linbit.com>
+ *
+ * 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 _HANDLER_H
+#define _HANDLER_H
+
+int run_handler(struct ticket_config *tk,
+ const char *cmd, int synchronous);
+
+
+#endif
diff --git a/tools/Makefile.am b/tools/Makefile.am
deleted file mode 100644
index e8000e5..0000000
--- a/tools/Makefile.am
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (C) 2012, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
-#
-# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-MAINTAINERCLEANFILES = Makefile.in
-
-INCLUDES = -I/usr/include/pacemaker \
- -I/usr/include/heartbeat \
- -I/usr/include/libxml2 \
- -I$(srcdir)
-
-if RESOURCE_MONITOR
-noinst_HEADERS = booth_resource_monitord.h
-
-sbin_PROGRAMS = booth_resource_monitord
-
-# BUILD
-
-booth_resource_monitord_SOURCES = booth_resource_monitord.c
-booth_resource_monitord_LDADD = -lcrmcommon \
- -lcrmcluster \
- -lpe_status \
- -lcib \
- -lglib-2.0 \
- -lqb \
- -lxml2
-booth_resource_monitord_CPPFLAGS = $(GLIB_CFLAGS)
-endif
-
-
-AM_CFLAGS = -Wall -Werror
diff --git a/tools/booth_resource_monitord.c b/tools/booth_resource_monitord.c
deleted file mode 100644
index a262435..0000000
--- a/tools/booth_resource_monitord.c
+++ /dev/null
@@ -1,2043 +0,0 @@
-/* -------------------------------------------------------------------------
- * booth_resource_monitord --- The monitoring of the resources which depended on the ticket.
- * This program watches the resource that depended on the ticket.
- * When abnormality occurs in a resource, move a ticket to other sites using booth.
- *
- * Copyright (c) 2012 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
- * Copyright (c) 2013-2014 Philipp Marek <philipp.marek@linbit.com>
- *
- * 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
- *
- * -------------------------------------------------------------------------
- */
-
-#include "b_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <libgen.h>
-#include <errno.h>
-#include <glib.h>
-#include <sysexits.h>
-
-#ifdef HAVE_GETOPT_H
-# include <getopt.h>
-#endif
-
-/* booth find myself */
-#include <net/if.h>
-#include <asm/types.h>
-#include <linux/rtnetlink.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <libxml/tree.h>
-
-#include <crm_config.h>
-#include <crm/crm.h>
-#include <crm/cib.h>
-#include <crm/error.h>
-#include <crm/msg_xml.h>
-#include <crm/common/ipc.h>
-#include <crm/common/mainloop.h>
-#include <crm/pengine/status.h>
-
-#include "booth_resource_monitord.h"
-
-GMainLoop *mainloop;
-char *booth_config_file;
-char *pid_file;
-int max_failures = 30;
-
-GHashTable *booth_tickets;
-GHashTable *tickets;
-GHashTable *tmp_tickets;
-GList *sites;
-GList *exclude_tickets;
-
-cib_t *cib;
-
-crm_ipc_t *crmd_channel;
-char *booth_resource_monitord_uuid;
-int crmd_message_timer_id = -1;
-int revoke_check_timeout = 5;
-gboolean do_crmd_query = FALSE;
-gboolean need_shutdown = FALSE;
-
-void clean_up(int rc)
-{
- crm_debug("Clean up to %s.", crm_system_name);
-
- if (cib != NULL) {
- crm_info("Clean up to CIB session.");
- cib->cmds->signoff(cib);
- cib_delete(cib);
- cib = NULL;
- }
-
- if (booth_config_file != NULL) {
- crm_trace("free() booth_config_file.");
- free(booth_config_file);
- booth_config_file = NULL;
- }
-
- if (pid_file != NULL) {
- crm_trace("free() pid_file.");
- free(pid_file);
- pid_file = NULL;
- }
-
- if (rc > 0) {
- crm_exit(rc);
- }
-}
-
-void free_ticket(gpointer data)
-{
- GListPtr gIter = NULL;
- ticket_info_t *ticket = (ticket_info_t *) data;
-
- crm_debug("Free ticket name[%s]", ticket->name);
-
- free(ticket->name);
-
- for (gIter = ticket->resources; gIter != NULL; gIter = gIter->next) {
- resource_info_t *resource = (resource_info_t *) gIter->data;
-
- if (resource->id != NULL) {
- free(resource->id);
- }
-
- free(resource);
- }
-
- g_list_free(ticket->resources);
-
- free(ticket);
-
- return;
-}
-
-void shutdown_called(int nsig)
-{
- need_shutdown = TRUE;
-
- crm_info("Shutdown was called. signal[%d]", nsig);
-
- if (mainloop != NULL && g_main_is_running(mainloop)) {
- g_main_quit(mainloop);
- } else {
- clean_up(EX_OK);
- crm_exit(0);
- }
-
- return;
-}
-
-void print_ticket_summary(gpointer key, gpointer value, gpointer user_data)
-{
- GListPtr gIter = NULL;
- ticket_info_t *ticket = (ticket_info_t *) value;
-
- crm_debug
- ("Ticket name[%s] monitored[%s] grant[%s] standby[%s] expected[%d].",
- ticket->name, ticket->monitored ? "TRUE" : "FALSE",
- ticket->granted ? "granted" : "revoked",
- ticket->standby ? "TRUE" : "FALSE", ticket->expected_count);
-
- for (gIter = ticket->resources; gIter != NULL; gIter = gIter->next) {
- resource_info_t *rsc = (resource_info_t *) gIter->data;
- crm_debug("resource[%s] target-role[%s]",
- rsc->id, role2text(rsc->target_role));
- }
-
- return;
-}
-
-void unpack_cluster_status(pe_working_set_t *data_set)
-{
- xmlNode *current_cib = NULL;
-
- crm_trace("Unpack cluster status.");
- qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
-
- set_working_set_defaults(data_set);
- current_cib = get_cib_copy(cib);
- data_set->input = copy_xml(current_cib);
- cluster_status(data_set);
- free_xml(current_cib);
-
- qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_TRUE);
-
- return;
-}
-
-resource_t *find_resource_from_list(const char *search_rsc_id, GListPtr list)
-{
- GListPtr gIter = NULL;
- resource_t *faund_rsc = NULL;
-
- crm_trace("Find rsc[%s]", search_rsc_id);
- for (gIter = list; gIter != NULL; gIter = gIter->next) {
- resource_t *rsc = (resource_t *) gIter->data;
-
- crm_trace("Resource id[%s].", rsc->id);
-
- if (g_list_length(rsc->children) > 0) {
- crm_trace("Resource id[%s] have a children.", rsc->id);
- faund_rsc =
- find_resource_from_list(search_rsc_id,
- rsc->children);
- }
-
- if (safe_str_eq(search_rsc_id, rsc->id)) {
- faund_rsc = rsc;
- }
-
- if (faund_rsc != NULL) {
- crm_trace("Faund resource id[%s].", faund_rsc->id);
- break;
- }
- }
-
- return faund_rsc;
-}
-
-void print_info_summary(int nsig)
-{
- GListPtr gIter = NULL;
-
- for (gIter = sites; gIter != NULL; gIter = gIter->next) {
- site_info_t *site = (site_info_t *) gIter->data;
- crm_debug("Site address[%s] local[%s].",
- site->addr, site->local ? "TRUE" : "FALSE");
- }
-
- g_hash_table_foreach(tickets, print_ticket_summary, NULL);
-
- return;
-}
-
-int grant_ticket(ticket_info_t *ticket)
-{
- FILE *p;
- int rc;
- char cmd[COMMAND_MAX];
- char new_owner_ip[IPADDR_LEN];
- site_info_t *site = NULL;
- exclude_ticket_info_t *exclude_ticket = NULL;
- GListPtr gIter = NULL;
- GListPtr gIter2 = NULL;
-
- memset(new_owner_ip, 0, IPADDR_LEN);
-
- /* Set the IP of the failover destination */
- for (gIter = sites; gIter != NULL; gIter = gIter->next) {
- gboolean exclude_flag = FALSE;
- site = (site_info_t *) gIter->data;
-
- if (site->local)
- continue;
-
- for (gIter2 = exclude_tickets; gIter2 != NULL;
- gIter2 = gIter2->next) {
- exclude_ticket = (exclude_ticket_info_t *) gIter2->data;
-
- if (safe_str_eq(ticket->name, exclude_ticket->ticket) &&
- safe_str_eq(site->addr, exclude_ticket->site))
- exclude_flag = TRUE;
- }
-
- if (exclude_flag) {
- crm_debug("Site address[%s] is exclude site",
- site->addr);
- continue;
- }
-
- crm_debug
- ("The site[%s] was chosen as the movement place of a ticket.",
- site->addr);
- strcpy(new_owner_ip, site->addr);
-
- break;
- }
-
- if (strlen(new_owner_ip) == 0) {
- crm_err("Failed to select the destination of the ticket.");
- return -1;
- }
-
- /* used site is turned back */
- sites = g_list_remove(sites, site);
- sites = g_list_append(sites, site);
-
- snprintf(cmd, COMMAND_MAX, "booth client grant -t %s -s %s",
- ticket->name, new_owner_ip);
-
- crm_info("Command: '%s' was executed", cmd);
- p = popen(cmd, "r");
-
- if (p == NULL) {
- crm_perror(LOG_ERR, "popen() call failed");
- return -1;
- }
-
- rc = pclose(p);
-
- if (rc == -1) {
- crm_perror(LOG_ERR, "pclose() call failed");
- return -1;
- } else if (rc > 0) {
- crm_err("Failed to execute booth command. exit code %d",
- WEXITSTATUS(rc));
- return -1;
- }
-
- crm_info("Ticket[%s] was granted to %s.", ticket->name, new_owner_ip);
-
- return 0;
-}
-
-int revoke_ticket(ticket_info_t *ticket)
-{
- FILE *p;
- int rc;
- char cmd[COMMAND_MAX];
- char owner_ip[IPADDR_LEN];
- GListPtr gIter = NULL;
-
- memset(owner_ip, 0, IPADDR_LEN);
-
- /* use own site ip */
- for (gIter = sites; gIter != NULL; gIter = gIter->next) {
- site_info_t *site = (site_info_t *) gIter->data;
-
- crm_trace("site address[%s].", site->addr);
-
- if (site->local) {
- crm_info("%s is own site address.", site->addr);
- strcpy(owner_ip, site->addr);
-
- break;
- }
- }
-
- if (strlen(owner_ip) == 0) {
- crm_err("Failed to pick the holder of the ticket.");
- return -1;
- }
-
- snprintf(cmd, COMMAND_MAX, "booth client revoke -t %s -s %s",
- ticket->name, owner_ip);
-
- crm_info("Command: '%s' was executed", cmd);
- p = popen(cmd, "r");
-
- if (p == NULL) {
- crm_perror(LOG_ERR, "popen() call failed");
- return -1;
- }
-
- rc = pclose(p);
-
- if (rc == -1) {
- crm_perror(LOG_ERR, "pclose() call failed");
- return -1;
- } else if (rc > 0) {
- crm_err("Failed to execute booth command. exit code %d",
- WEXITSTATUS(rc));
- return -1;
- }
-
- crm_info("Ticket[%s] was revoked by %s.", ticket->name, owner_ip);
-
- return 0;
-}
-
-void update_tickets_info(gpointer key, gpointer value, gpointer user_data)
-{
- ticket_info_t *manage_ticket = (ticket_info_t *) value;
- ticket_t *cluster_ticket = NULL;
- pe_working_set_t *data_set = NULL;
-
- if (user_data == NULL) {
- crm_err("Failed to unpack cluster status.");
- return;
- }
-
- data_set = (pe_working_set_t *) user_data;
-
- cluster_ticket =
- g_hash_table_lookup(data_set->tickets, manage_ticket->name);
-
- if (cluster_ticket == NULL) {
- crm_info("State of the ticket[%s] is not yet in the cluster.",
- manage_ticket->name);
- return;
- }
-
- manage_ticket->granted = cluster_ticket->granted;
- manage_ticket->standby = cluster_ticket->standby;
-
- crm_trace
- ("Ticket name[%s] monitored[%s] grant[%s] standby[%s] expected[%d].",
- manage_ticket->name, manage_ticket->monitored ? "TRUE" : "FALSE",
- manage_ticket->granted ? "granted" : "revoked",
- manage_ticket->standby ? "TRUE" : "FALSE",
- manage_ticket->expected_count);
-
- return;
-}
-
-void failover_ticket(gpointer key, gpointer value, gpointer user_data)
-{
- int rc, i;
- gboolean revoke_succeed = FALSE;
- pe_working_set_t data_set;
- ticket_info_t *manage_ticket = (ticket_info_t *) value;
- ticket_t *cluster_ticket = NULL;
-
- if (manage_ticket->failover != TRUE) {
- crm_trace("Ticket[%s] does not have to failover it.",
- manage_ticket->name);
- return;
- }
-
- crm_info("Failover ticket[%s].", manage_ticket->name);
-
- rc = revoke_ticket(manage_ticket);
-
- if (rc != 0) {
- crm_err("Failed in revoke of ticket[%s].", manage_ticket->name);
- manage_ticket->failover = FALSE;
- return;
- }
-
- /* check the completion of the revoke */
- for (i = 0; i <= revoke_check_timeout; i++) {
- const char *owner = NULL;
- const char *expires = NULL;
-
- unpack_cluster_status(&data_set);
-
- cluster_ticket =
- g_hash_table_lookup(data_set.tickets, manage_ticket->name);
-
- if (cluster_ticket == NULL) {
- crm_err("Failed to get information for the ticket[%s], "
- "can not confirm the success of the revoke.",
- manage_ticket->name);
- cleanup_calculations(&data_set);
- manage_ticket->failover = FALSE;
- return;
- }
-
- owner = g_hash_table_lookup(cluster_ticket->state, "owner");
- expires = g_hash_table_lookup(cluster_ticket->state, "expires");
-
- crm_debug("ticket[%s] granted=%s owner=%s expires=%s",
- cluster_ticket->id,
- cluster_ticket->granted ? "true" : "false", owner,
- expires);
-
- if (cluster_ticket->granted == FALSE &&
- safe_str_eq(owner, "NO_OWNER") && safe_str_eq(expires, "0")) {
- revoke_succeed = TRUE;
- cleanup_calculations(&data_set);
-
- break;
- }
-
- cleanup_calculations(&data_set);
- sleep(1);
- }
-
- if (revoke_succeed == FALSE) {
- crm_err("Failed in revoke of ticket[%s]. Reason: Timeout.",
- manage_ticket->name);
- manage_ticket->failover = FALSE;
- return;
- }
-
- rc = grant_ticket(manage_ticket);
-
- if (rc != 0) {
- crm_err("Failed in grant of ticket[%s].", manage_ticket->name);
- manage_ticket->failover = FALSE;
- return;
- }
-
- crm_info("Ticket[%s] failover succeeded.", manage_ticket->name);
- manage_ticket->failover = FALSE;
-
- return;
-}
-
-int check_ticket_condition(ticket_info_t *manage_ticket)
-{
- crm_trace
- ("Ticket name[%s] monitored[%s] grant[%s] standby[%s] expected[%d].",
- manage_ticket->name, manage_ticket->monitored ? "TRUE" : "FALSE",
- manage_ticket->granted ? "granted" : "revoked",
- manage_ticket->standby ? "TRUE" : "FALSE",
- manage_ticket->expected_count);
-
- /* The state of a ticket checks in "revoke" or "standby" */
- if (manage_ticket->granted == FALSE || manage_ticket->standby == TRUE) {
- crm_debug("Ticket[%s] is revoked or standby.",
- manage_ticket->name);
- return 1;
- }
-
- return 0;
-}
-
-int
-check_resource_role(resource_t *cluster_resource,
- resource_info_t *manage_resource)
-{
- gboolean flag;
- enum rsc_role_e rsc_target_role;
-
- crm_trace("Cluster resource id[%s] is role[%s].",
- cluster_resource->id, role2text(cluster_resource->role));
-
- /* If the role of the resource is specified by the user */
- flag = get_target_role(cluster_resource, &rsc_target_role);
-
- if (flag && manage_resource->target_role != rsc_target_role) {
- crm_trace("Cluster resource id[%s] target-role[%s].",
- cluster_resource->id, role2text(rsc_target_role));
- return -1;
- }
-
- /* When role of the resource becomes prospective role */
- if (cluster_resource->role == manage_resource->target_role) {
- crm_trace("Role[%s] of the resource[%s] is expected role.",
- role2text(cluster_resource->role),
- cluster_resource->id);
- return 1;
- }
-
- crm_trace("Role[%s] of the resource[%s] is not expected role[%s].",
- role2text(cluster_resource->role),
- cluster_resource->id,
- role2text(manage_resource->target_role));
-
- /* When role of the resource does not become prospective role */
- return 0;
-}
-
-void
-check_ticket_failover_need(gpointer key, gpointer value, gpointer user_data)
-{
- int rc;
- int count = 0;
- GListPtr gIter = NULL;
- ticket_info_t *manage_ticket = (ticket_info_t *) value;
- GListPtr cluster_resource_list = (GListPtr) user_data;
-
- /* Determine whether there is a need for failover */
- rc = check_ticket_condition(manage_ticket);
-
- if (rc != 0) {
- crm_info("Ticket name[%s] is not a condition to be monitored.",
- manage_ticket->name);
- manage_ticket->monitored = FALSE;
- manage_ticket->failover = FALSE;
- return;
- }
-
- for (gIter = manage_ticket->resources; gIter != NULL;
- gIter = gIter->next) {
- resource_info_t *manage_resource =
- (resource_info_t *) gIter->data;
- resource_t *cluster_resource = NULL;
-
- crm_trace("Ticket[%s] find resource[%s].",
- manage_ticket->name, manage_resource->id);
-
- cluster_resource = find_resource_from_list(manage_resource->id,
- cluster_resource_list);
-
- if (cluster_resource == NULL) {
- crm_err("Resource[%s] is not found in the cluster."
- " This resource is ignored.",
- manage_resource->id);
-
- continue;
- }
-
- /* check role of the resource */
- rc = check_resource_role(cluster_resource, manage_resource);
-
- if (rc == 1) {
- crm_debug("Role of resources[%s] is expected role.",
- cluster_resource->id);
- count = count + 1;
- } else if (rc == -1) {
- crm_warn("Role of resources[%s] was changed explicitly."
- " Stop the monitoring of the ticket[%s].",
- cluster_resource->id, manage_ticket->name);
- manage_ticket->monitored = FALSE;
- return;
- } else {
- crm_warn("Role of resources[%s] is not expected role.",
- cluster_resource->id);
- }
- }
-
- crm_trace("expected count[%d] vs real count[%d].",
- manage_ticket->expected_count, count);
-
- if (manage_ticket->expected_count == count) {
- crm_info
- ("All the resources depending on ticket name[%s] started or promoted.",
- manage_ticket->name);
- manage_ticket->monitored = TRUE;
-
- } else if (manage_ticket->monitored
- && manage_ticket->expected_count != count) {
- crm_info("Ticket name[%s] is required for failover.",
- manage_ticket->name);
- manage_ticket->monitored = FALSE;
- manage_ticket->failover = TRUE;
- }
-
- return;
-}
-
-void start_resource_monitor(void)
-{
- pe_working_set_t data_set;
-
- crm_trace("Start resource monitor.");
- unpack_cluster_status(&data_set);
-
- /* update a ticket in the latest CIB information */
- g_hash_table_foreach(tickets, update_tickets_info, &data_set);
-
- /* determine whether failover of the ticket is necessary */
- g_hash_table_foreach(tickets, check_ticket_failover_need,
- data_set.resources);
-
- /* failover of a ticket is performed */
- g_hash_table_foreach(tickets, failover_ticket, NULL);
-
- print_info_summary(0);
-
- cleanup_calculations(&data_set);
- crm_trace("End resource monitor.");
-
- return;
-}
-
-gboolean docHasTag(xmlNode *root, const char *tag)
-{
- xmlNode *child = NULL;
-
- crm_trace("Find tag[%s]", tag);
-
- for (child = __xml_first_child(root); child != NULL;
- child = __xml_next(child)) {
-
- if (safe_str_eq((const char *)child->name, tag)) {
- crm_trace("Faund tag[%s]", (const char *)child->name);
- return TRUE;
- }
-
- if (child->children) {
- crm_trace("xmlNode[%s] has children",
- (const char *)child->name);
-
- if (docHasTag(child, tag)) {
- return TRUE;
- }
- }
- }
-
- return FALSE;
-}
-
-int
-search_xml_children(GListPtr *children, xmlNode *root, const char *tag,
- const char *field, const char *value,
- gboolean search_matches)
-{
- int match_found = 0;
-
- CRM_CHECK(root != NULL, return FALSE);
- CRM_CHECK(children != NULL, return FALSE);
-
- if (tag != NULL && safe_str_neq(tag, crm_element_name(root))) {
-
- } else if (value != NULL
- && safe_str_neq(value, crm_element_value(root, field))) {
-
- } else {
- *children = g_list_append(*children, root);
- match_found = 1;
- }
-
- if (search_matches || match_found == 0) {
- xmlNode *child = NULL;
-
- for (child = __xml_first_child(root); child;
- child = __xml_next(child)) {
- match_found +=
- search_xml_children(children, child, tag, field,
- value, search_matches);
- }
- }
-
- return match_found;
-}
-
-void
-register_monitor_resource(ticket_info_t *ticket, resource_t *resource,
- enum rsc_role_e target_role)
-{
- resource_info_t *manage_resource = NULL;
-
- if (resource->variant != pe_native) {
- crm_debug
- ("Resource id[%s] type is not primitive, does not register.",
- resource->id);
- return;
- }
-
- if (is_set(resource->flags, pe_rsc_orphan)) {
- crm_notice("Resource id[%s] is ORPHAN, does not register.",
- resource->id);
- return;
- }
-
- manage_resource = calloc(1, sizeof(resource_info_t));
- memset(manage_resource, 0, sizeof(resource_info_t));
-
- manage_resource->id = strdup(resource->id);
- manage_resource->target_role = target_role;
- manage_resource->variant = resource->variant;
-
- crm_info
- ("Registered ticket[%s] monitor resource[%s] set target role [%s].",
- ticket->name, manage_resource->id, role2text(target_role));
-
- ticket->resources = g_list_append(ticket->resources, manage_resource);
-
- return;
-}
-
-void
-register_monitor_resource_children(ticket_info_t *ticket, GListPtr list,
- enum rsc_role_e target_role)
-{
- GListPtr gIter = NULL;
-
- for (gIter = list; gIter != NULL; gIter = gIter->next) {
- resource_t *rsc = (resource_t *) gIter->data;
-
- if (g_list_length(rsc->children) > 0) {
- crm_trace("Resource id[%s] have a children.", rsc->id);
- register_monitor_resource_children(ticket,
- rsc->children,
- target_role);
- }
-
- register_monitor_resource(ticket, rsc, target_role);
- }
-
- return;
-}
-
-void
-create_ticket_info(xmlNode *rsc_ticket, gboolean update,
- pe_working_set_t *data_set)
-{
- ticket_info_t *ticket = NULL;
- const char *id = NULL;
- const char *ticket_name = NULL;
- const char *ticket_target_role = NULL;
- enum rsc_role_e target_role;
- int child_count = 1;
- resource_t *child = NULL;
-
- id = crm_element_value(rsc_ticket, XML_ATTR_ID);
- ticket_name = crm_element_value(rsc_ticket, XML_TICKET_ATTR_TICKET);
- crm_debug("rsc_ticket id[%s] name[%s]", id, ticket_name);
-
- /* check whether it is a ticket managed in booth */
- if (g_hash_table_lookup(booth_tickets, ticket_name) == NULL) {
- crm_info("Ticket name[%s] is not managed in booth.",
- ticket_name);
- return;
- }
-
- crm_trace("Ticket name[%s] is managed in booth.", ticket_name);
-
- ticket = g_hash_table_lookup(tmp_tickets, ticket_name);
-
- if (ticket == NULL) {
- ticket = calloc(1, sizeof(ticket_info_t));
- memset(ticket, 0, sizeof(ticket_info_t));
- ticket->name = strdup(ticket_name);
- ticket->need_delete = FALSE;
- g_hash_table_insert(tmp_tickets, ticket->name, ticket);
- }
-
- /* acquire the value of the rsc-role attribute of rsc_ticket */
- ticket_target_role =
- crm_element_value(rsc_ticket, XML_COLOC_ATTR_SOURCE_ROLE);
-
- if (ticket_target_role == NULL) {
- target_role = RSC_ROLE_STARTED;
- } else {
- target_role = text2role(ticket_target_role);
- }
-
- /* When rsc_ticket has rsc attribute */
- if (xmlHasProp(rsc_ticket, (const xmlChar*)"rsc")) {
- resource_t *cluster_resource = NULL;
- const char *rsc_id = NULL;
- const char *clone_max = NULL;
- const char *master_max = NULL;
-
- rsc_id = crm_element_value(rsc_ticket, "rsc");
- cluster_resource =
- find_resource_from_list(rsc_id, data_set->resources);
-
- if (cluster_resource == NULL) {
- crm_err
- ("Resource id[%s] to depend on the ticket was not found.",
- rsc_id);
- return;
- }
-
- /* The number of resources is registered into management information */
- switch (cluster_resource->variant) {
-
- case pe_native:
- crm_trace("Resource[%s] is native.",
- cluster_resource->id);
-
- register_monitor_resource(ticket, cluster_resource,
- target_role);
-
- ticket->expected_count = ticket->expected_count + 1;
-
- break;
- case pe_group:
- crm_trace("Resource[%s] is group.",
- cluster_resource->id);
-
- register_monitor_resource_children(ticket,
- cluster_resource->children,
- target_role);
-
- ticket->expected_count = ticket->expected_count +
- g_list_length(cluster_resource->children);
-
- break;
- case pe_clone:
- crm_trace("Resource[%s] is clone.",
- cluster_resource->id);
-
- register_monitor_resource_children(ticket,
- cluster_resource->children,
- target_role);
-
- clone_max = g_hash_table_lookup(cluster_resource->meta,
- XML_RSC_ATTR_INCARNATION_MAX);
-
- child =
- (resource_t *)
- g_list_nth_data(cluster_resource->children, 0);
-
- if (child != NULL && child->variant == pe_group) {
- child_count = g_list_length(child->children);
- }
-
- if (clone_max != NULL) {
- crm_trace("Clone resource[%s] clone_max[%s].",
- cluster_resource->id, clone_max);
- ticket->expected_count =
- ticket->expected_count +
- crm_parse_int(clone_max,
- NULL) * child_count;
- } else {
- /* When there is no setup of clone_max, the number of nodes is set up */
- crm_trace("Clone resource[%s] node num[%d].",
- cluster_resource->id,
- g_list_length(data_set->nodes));
- ticket->expected_count =
- ticket->expected_count +
- g_list_length(data_set->nodes) *
- child_count;
- }
-
- break;
- case pe_master:
- crm_trace("Resource[%s] is master.",
- cluster_resource->id);
-
- register_monitor_resource_children(ticket,
- cluster_resource->children,
- target_role);
-
- child =
- (resource_t *)
- g_list_nth_data(cluster_resource->children, 0);
-
- if (child != NULL && child->variant == pe_group) {
- child_count = g_list_length(child->children);
- }
-
- if (target_role == RSC_ROLE_STARTED) {
- clone_max =
- g_hash_table_lookup(cluster_resource->meta,
- XML_RSC_ATTR_INCARNATION_MAX);
-
- if (clone_max != NULL) {
- crm_trace
- ("Clone resource[%s] clone_max[%s].",
- cluster_resource->id, clone_max);
- ticket->expected_count =
- ticket->expected_count +
- crm_parse_int(clone_max,
- NULL) * child_count;
- } else {
- /* When there is no setup of clone_max, the number of nodes is set up */
- crm_trace
- ("Clone resource[%s] node num[%d].",
- cluster_resource->id,
- g_list_length(data_set->nodes));
- ticket->expected_count =
- ticket->expected_count +
- g_list_length(data_set->nodes) *
- child_count;
- }
- } else {
- master_max =
- g_hash_table_lookup(cluster_resource->meta,
- XML_RSC_ATTR_MASTER_MAX);
-
- if (master_max != NULL) {
- crm_trace
- ("Master resource[%s] master_max[%s].",
- cluster_resource->id, master_max);
- ticket->expected_count =
- ticket->expected_count +
- crm_parse_int(master_max,
- NULL) * child_count;
- } else {
- /* When there is no setup of master_max, 1 is set up as a default value */
- crm_trace
- ("Master resource[%s] master_max is 1.",
- cluster_resource->id);
- ticket->expected_count =
- ticket->expected_count +
- 1 * child_count;
- }
- }
-
- break;
- default:
- crm_warn("Unknown type resource[%s].",
- cluster_resource->id);
- break;
- }
-
- } else {
- /* TODO: At a present stage, it does not correspond to the notation of resource_set */
- crm_warn("rsc_ticket(id=%s) is notation which does not support."
- " Ignore this rsc_ticket constraint.", id);
- return;
- }
-
- crm_debug("Ticket name[%s] expected count[%d].",
- ticket->name, ticket->expected_count);
-
- return;
-}
-
-ticket_info_t *copy_ticket_info(ticket_info_t *copy_ticket)
-{
- GListPtr gIter = NULL;
- ticket_info_t *ticket = NULL;
-
- ticket = calloc(1, sizeof(ticket_info_t));
- ticket = memcpy(ticket, copy_ticket, sizeof(ticket_info_t));
- ticket->name = strdup(copy_ticket->name);
- ticket->resources = NULL;
-
- for (gIter = copy_ticket->resources; gIter != NULL; gIter = gIter->next) {
- resource_info_t *copy_resource =
- (resource_info_t *) gIter->data;
- resource_info_t *resource = NULL;
-
- resource = calloc(1, sizeof(resource_info_t));
- resource =
- memcpy(resource, copy_resource, sizeof(resource_info_t));
- resource->id = strdup(copy_resource->id);
-
- crm_debug("Copy resource [%s]", resource->id);
- ticket->resources = g_list_append(ticket->resources, resource);
- }
-
- return ticket;
-}
-
-int compare_resource(GListPtr rsc_list, resource_info_t *rsc)
-{
- GListPtr gIter = NULL;
-
- crm_trace("Compare resource id[%s]", rsc->id);
-
- for (gIter = rsc_list; gIter != NULL; gIter = gIter->next) {
- resource_info_t *register_rsc = (resource_info_t *) gIter->data;
- crm_trace("Compare resource id[%s]", register_rsc->id);
-
- if (safe_str_eq(rsc->id, register_rsc->id)) {
- crm_debug("Match resource id[%s]", register_rsc->id);
-
- if (rsc->target_role == register_rsc->target_role) {
- crm_debug
- ("Role of resource id[%s] not changed.",
- rsc->id);
- return 0;
- }
- }
-
- }
-
- return 1;
-}
-
-int
-compare_ticket_info(ticket_info_t *tmp_ticket, ticket_info_t *register_ticket)
-{
- int rc;
- GListPtr gIter = NULL;
-
- crm_trace("Compare ticket name[%s]", tmp_ticket->name);
-
- if (g_list_length(tmp_ticket->resources) !=
- g_list_length(register_ticket->resources)) {
- crm_debug
- ("The number of the resources to watch of ticket name[%s] changed.",
- tmp_ticket->name);
- return 1;
- }
-
- for (gIter = tmp_ticket->resources; gIter != NULL; gIter = gIter->next) {
- resource_info_t *rsc = (resource_info_t *) gIter->data;
-
- rc = compare_resource(register_ticket->resources, rsc);
-
- if (rc != 0) {
- crm_debug("Resource of ticket name[%s] changed.",
- tmp_ticket->name);
- return 1;
- }
- }
-
- return 0;
-}
-
-void register_tickets(gpointer key, gpointer value, gpointer user_data)
-{
- int rc;
- gboolean complete;
- ticket_info_t *tmp_ticket = (ticket_info_t *) value;
- ticket_info_t *register_ticket = NULL;
-
- crm_debug("Register ticket name[%s]", tmp_ticket->name);
-
- register_ticket = g_hash_table_lookup(tickets, tmp_ticket->name);
-
- if (register_ticket == NULL) {
- register_ticket = copy_ticket_info(tmp_ticket);
- crm_info("Register new information ticket name[%s].",
- register_ticket->name);
- g_hash_table_insert(tickets, register_ticket->name,
- register_ticket);
- return;
- }
-
- rc = compare_ticket_info(tmp_ticket, register_ticket);
-
- if (rc != 0) {
- crm_info("Ticket name[%s] was changed.", register_ticket->name);
- tmp_ticket->monitored = register_ticket->monitored;
- complete = g_hash_table_remove(tickets, register_ticket->name);
-
- if (complete != TRUE) {
- crm_err("Failed to delete registered ticket");
- return;
- }
-
- register_ticket = copy_ticket_info(tmp_ticket);
- g_hash_table_insert(tickets, register_ticket->name,
- register_ticket);
- } else {
- crm_info("Ticket name[%s] was no changed.",
- register_ticket->name);
- register_ticket->need_delete = FALSE;
- }
-
- return;
-}
-
-void delete_unnecessary_ticket(gpointer key, gpointer value, gpointer user_data)
-{
- gboolean complete;
- ticket_info_t *ticket = (ticket_info_t *) value;
-
- if (ticket->need_delete == FALSE) {
- ticket->need_delete = TRUE;
- return;
- }
-
- /* The information on the ticket deleted from cib
- * information is deleted from management information
- */
- crm_info("Delete unnecessary ticket name[%s].", ticket->name);
- complete = g_hash_table_remove(tickets, ticket->name);
-
- if (complete != TRUE) {
- crm_err("Failed to delete registered ticket");
- }
-
- return;
-}
-
-void create_information(void)
-{
- int match_num;
- GListPtr match_list = NULL;
- GListPtr gIter = NULL;
- pe_working_set_t data_set;
- xmlNode *current_cib = NULL;
-
- tmp_tickets =
- g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, free_ticket);
-
- if (tickets == NULL) {
- tickets =
- g_hash_table_new_full(crm_str_hash, g_str_equal, NULL,
- free_ticket);
- }
-
- current_cib = get_cib_copy(cib);
- /* find rsc_ticket from CIB information */
- match_num = search_xml_children(&match_list, current_cib,
- XML_CONS_TAG_RSC_TICKET, NULL, NULL,
- TRUE);
-
- if (match_num == 0) {
- crm_warn("CIB does not have information of <%s>.",
- XML_CONS_TAG_RSC_TICKET);
- goto out;
- }
-
- unpack_cluster_status(&data_set);
-
- for (gIter = match_list; gIter != NULL; gIter = gIter->next) {
- xmlNode *match = NULL;
-
- match = (xmlNode *) gIter->data;
- create_ticket_info(match, FALSE, &data_set);
- }
-
- free_xml(current_cib);
- cleanup_calculations(&data_set);
-
-out:
- g_hash_table_foreach(tmp_tickets, register_tickets, NULL);
- g_hash_table_destroy(tmp_tickets);
- g_hash_table_foreach(tickets, delete_unnecessary_ticket, NULL);
-
- return;
-}
-
-int do_dc_health(void)
-{
- gboolean rc;
- const char *sys_to = NULL;
- const char *crmd_operation = NULL;
- xmlNode *msg_data = NULL;
- xmlNode *cmd = NULL;
-
- sys_to = CRM_SYSTEM_DC;
- crmd_operation = CRM_OP_PING;
-
- crm_trace("Do dc health.");
-
- if (crmd_channel == NULL) {
- crm_err
- ("The IPC connection is not valid, cannot send anything");
- return 1;
- }
-
- cmd = create_request(crmd_operation, msg_data, NULL, sys_to,
- crm_system_name, booth_resource_monitord_uuid);
-
- /* send it */
- crm_trace("Send health check message.");
- rc = crm_ipc_send(crmd_channel, cmd, 0, 0, NULL);
-
- if (rc == FALSE) {
- crm_err("Failed to send ipc messege to CRMd.");
- return 1;
- }
-
- free_xml(cmd);
-
- return 0;
-}
-
-gboolean do_dc_health_start(gpointer data)
-{
- int rc = 0;
-
- rc = do_dc_health();
-
- if (rc != 0) {
- crm_err("Failed in a state inquiry of DC.");
- clean_up(1);
- }
-
- return FALSE;
-}
-
-void cib_diff_notify(const char *event, xmlNode *msg)
-{
- int rc = -1;
- const char *op = NULL;
- const char *value = NULL;
- unsigned int log_level = LOG_INFO;
- int crmd_transition_delay = 0;
- pe_working_set_t data_set;
-
- xmlNode *diff = NULL;
- xmlNode *update = get_message_xml(msg, F_CIB_UPDATE);
-
- if (msg == NULL) {
- crm_err("NULL update");
- return;
- }
-
- crm_element_value_int(msg, F_CIB_RC, &rc);
- op = crm_element_value(msg, F_CIB_OPERATION);
- diff = get_message_xml(msg, F_CIB_UPDATE_RESULT);
-
- if (rc < pcmk_ok) {
- log_level = LOG_WARNING;
- do_crm_log(log_level, "[%s] %s ABORTED: %s",
- event, op, pcmk_strerror(rc));
- return;
- }
-
- if (diff) {
- crm_log_xml_trace(diff, "cib_diff");
-
- /* It is checked whether change has been in configuration */
- if (docHasTag(diff, XML_CIB_TAG_CONFIGURATION)) {
- crm_trace("Change configuration.");
- create_information();
- } else {
- crm_trace("Not change configuration.");
- }
-
- log_cib_diff(LOG_TRACE, diff, op);
- }
-
- if (update != NULL) {
- crm_log_xml_trace(update, "raw_update");
- }
-
- unpack_cluster_status(&data_set);
-
- value =
- g_hash_table_lookup(data_set.config_hash, "crmd-transition-delay");
- crmd_transition_delay = crm_get_msec(value);
-
- if (crmd_transition_delay < 0) {
- crmd_transition_delay = 0;
- }
-
- cleanup_calculations(&data_set);
- crm_trace("Set crmd-transition-delay is %d msec",
- crmd_transition_delay);
-
- /* Nothing will be done if it has asked DC */
- if (do_crmd_query) {
- crm_trace("Already queried crmd.");
- goto out;
- }
-
- /* The state of DC is checked */
- crm_trace("Query for dc health.");
- do_crmd_query = TRUE;
- g_timeout_add(crmd_transition_delay + 1000, do_dc_health_start, NULL);
-
-out:
- return;
-}
-
-void usage(const char *cmd, int exit_status)
-{
- FILE *stream;
-
- stream = exit_status ? stderr : stdout;
-
- fprintf(stream, "usage: %s [-%s]\n", cmd, OPTARGS);
- fprintf(stream, " Basic options\n");
- fprintf(stream,
- "\t--%s (-%c) <filename>\t\tFile in which to store the process' PID\n"
- "\t\t\t\t\t\t* Default=%s\n", "pid-file", 'p', PID_FILE);
- fprintf(stream,
- "\t--%s (-%c) <filename>\t\tAppoint a place with booth.conf.\n"
- "\t\t\t\t\t\t* Default=%s\n", "booth-config", 'b',
- BOOTH_CONFIG_FILE);
- fprintf(stream, "\t--%s (-%c) \t\t\tRun in daemon mode\n", "daemonize",
- 'D');
- fprintf(stream, "\t--%s (-%c) \t\t\t\tRun in verbose mode\n", "verbose",
- 'V');
- fprintf(stream, "\t--%s (-%c) \t\t\t\tThis text\n", "help", 'h');
-
- fflush(stream);
-
- clean_up(exit_status);
-}
-
-void cib_connection_destroy(gpointer user_data)
-{
- cib_t *conn = user_data;
-
- /* Ensure IPC is cleaned up */
- conn->cmds->signoff(conn);
-
- if (need_shutdown) {
- crm_info("Connection to the CIB terminated.");
- } else {
- crm_err("Connection to the CIB terminated.");
- clean_up(1);
- }
-
- return;
-}
-
-int cib_connect(void)
-{
- int rc = -ENOTCONN;
- int attempts = 0;
-
- cib = cib_new();
-
- while (rc != pcmk_ok && attempts++ < max_failures) {
- crm_trace("Connecting to CIB. attempt %d", attempts);
- rc = cib->cmds->signon(cib, crm_system_name, cib_query);
-
- if (rc != pcmk_ok) {
- crm_trace("Waiting signing on to the CIB service\n");
- sleep(1);
- }
- }
-
- if (rc != pcmk_ok) {
- crm_err("Signon to CIB failed: %s", pcmk_strerror(rc));
- return rc;
- }
-
- if (rc == pcmk_ok) {
- /* set a function called at the time of CIB cutting */
- crm_trace("Setting dnotify.");
- rc = cib->cmds->set_connection_dnotify(cib,
- cib_connection_destroy);
-
- if (rc != pcmk_ok) {
- crm_err("Failed to setting dnotify: %s",
- pcmk_strerror(rc));
- return rc;
- }
-
- /* set a function called at the time of CIB change */
- crm_trace("Setting notify callback.");
- rc = cib->cmds->add_notify_callback(cib, T_CIB_DIFF_NOTIFY,
- cib_diff_notify);
-
- if (rc != pcmk_ok) {
- crm_err("Failed to setting notify callback: %s",
- pcmk_strerror(rc));
- return rc;
- }
- }
-
- return rc;
-}
-
-void parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
-{
- while (RTA_OK(rta, len)) {
-
- if (rta->rta_type <= max) {
- tb[rta->rta_type] = rta;
- }
-
- rta = RTA_NEXT(rta, len);
- }
-}
-
-int search_self_node_ip(site_info_t *site)
-{
- int fd, addrlen, found = 0;
- struct sockaddr_nl nladdr;
- unsigned char ndaddr[IPADDR_LEN];
- unsigned char ipaddr[IPADDR_LEN];
- static char rcvbuf[NETLINK_BUFSIZE];
- struct {
- struct nlmsghdr nlh;
- struct rtgenmsg g;
- } req;
-
- memset(ipaddr, 0, IPADDR_LEN);
- memset(ndaddr, 0, IPADDR_LEN);
-
- if (site->family == AF_INET) {
- inet_pton(AF_INET, site->addr, ndaddr);
- addrlen = sizeof(struct in_addr);
- } else if (site->family == AF_INET6) {
- inet_pton(AF_INET6, site->addr, ndaddr);
- addrlen = sizeof(struct in6_addr);
- } else {
- crm_err("Invalid INET family");
- return 0;
- }
-
- fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
-
- if (fd < 0) {
- crm_err("Failed to create netlink socket");
- return 0;
- }
-
- setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
-
- memset(&nladdr, 0, sizeof(nladdr));
- nladdr.nl_family = AF_NETLINK;
-
- memset(&req, 0, sizeof(req));
- req.nlh.nlmsg_len = sizeof(req);
- req.nlh.nlmsg_type = RTM_GETADDR;
- req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
- req.nlh.nlmsg_pid = 0;
- req.nlh.nlmsg_seq = 1;
- req.g.rtgen_family = AF_INET;
-
- if (sendto(fd, (void *)&req, sizeof(req), 0,
- (struct sockaddr *)&nladdr, sizeof(nladdr)) < 0) {
- close(fd);
- crm_err("Failed to send data to netlink socket");
- return 0;
- }
-
- while (1) {
- int status;
- struct nlmsghdr *h;
- struct iovec iov = { rcvbuf, sizeof(rcvbuf) };
- struct msghdr msg = {
- (void *)&nladdr, sizeof(nladdr),
- &iov, 1,
- NULL, 0,
- 0
- };
-
- status = recvmsg(fd, &msg, 0);
-
- if (status <= 0) {
- close(fd);
- crm_err("Failed to recvmsg from netlink socket");
- return 0;
- }
-
- h = (struct nlmsghdr *)rcvbuf;
-
- if (h->nlmsg_type == NLMSG_DONE)
- break;
-
- if (h->nlmsg_type == NLMSG_ERROR) {
- close(fd);
- crm_err("Netlink socket recvmsg error");
- return 0;
- }
-
- while (NLMSG_OK(h, status)) {
-
- if (h->nlmsg_type == RTM_NEWADDR) {
- struct ifaddrmsg *ifa = NLMSG_DATA(h);
- struct rtattr *tb[IFA_MAX + 1];
- int len = h->nlmsg_len
- - NLMSG_LENGTH(sizeof(*ifa));
-
- memset(tb, 0, sizeof(tb));
- parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), len);
- memcpy(ipaddr, RTA_DATA(tb[IFA_ADDRESS]),
- IPADDR_LEN);
-
- if (!memcmp(ipaddr, ndaddr, addrlen)) {
- found = 1;
- goto out;
- }
-
- }
-
- h = NLMSG_NEXT(h, status);
- }
- }
-
-out:
- close(fd);
- return found;
-}
-
-int read_booth_config(void)
-{
- char line[1024];
- FILE *fp;
- char *s, *key, *val, *expiry, *weight;
- int in_quotes, got_equals, got_quotes;
- int lineno = 0;
- int rc = 0;
- int fclose_rc;
-
- booth_tickets = g_hash_table_new(crm_str_hash, g_str_equal);
-
- fp = fopen(booth_config_file, "r");
-
- if (!fp) {
- crm_err("Failed to open %s: %s", booth_config_file,
- strerror(errno));
- return -1;
- }
-
- while (fgets(line, sizeof(line), fp)) {
- lineno++;
- s = line;
-
- while (*s == ' ')
- s++;
-
- if (*s == '#' || *s == '\n')
- continue;
-
- if (*s == '-' || *s == '.' || *s == '/'
- || *s == '+' || *s == '(' || *s == ')'
- || *s == ':' || *s == ',' || *s == '@'
- || *s == '=' || *s == '"') {
- crm_err("Invalid key name in config file "
- "('%c', line %d char %ld)", *s, lineno,
- (long)(s - line));
- rc = -1;
- goto out;
- }
-
- key = s; /* will point to the key on the left hand side */
- val = NULL; /* will point to the value on the right hand side */
- in_quotes = 0; /* true iff we're inside a double-quoted string */
- got_equals = 0; /* true iff we're on the RHS of the = assignment */
- got_quotes = 0; /* true iff the RHS is quoted */
-
- while (*s != '\n' && *s != '\0') {
- if (!(*s >= 'a' && *s <= 'z')
- && !(*s >= 'A' && *s <= 'Z')
- && !(*s >= '0' && *s <= '9')
- && !(*s == '_')
- && !(*s == '-')
- && !(*s == '.')
- && !(*s == '/')
- && !(*s == ' ')
- && !(*s == '+')
- && !(*s == '(')
- && !(*s == ')')
- && !(*s == ':')
- && !(*s == ';')
- && !(*s == ',')
- && !(*s == '@')
- && !(*s == '=')
- && !(*s == '"')) {
- crm_err
- ("Invalid character ('%c', line %d char %ld)"
- " in config file", *s, lineno,
- (long)(s - line));
- rc = -1;
- goto out;
- }
-
- if (*s == '=' && !got_equals) {
- got_equals = 1;
- *s = '\0';
- val = s + 1;
- } else
- if ((*s == '=' || *s == '_' || *s == '-'
- || *s == '.')
- && got_equals && !in_quotes) {
- crm_err
- ("Invalid config file format: unquoted '%c' "
- "(line %d char %ld)", *s, lineno,
- (long)(s - line));
- rc = -1;
- goto out;
- } else if ((*s == '/' || *s == '+'
- || *s == '(' || *s == ')' || *s == ':'
- || *s == ',' || *s == '@') && !in_quotes) {
- crm_err
- ("Invalid config file format: unquoted '%c' "
- "(line %d char %ld)", *s, lineno,
- (long)(s - line));
- rc = -1;
- goto out;
- } else if ((*s == ' ')
- && !in_quotes && !got_quotes) {
- crm_err
- ("Invalid config file format: unquoted whitespace "
- "(line %d char %ld)", lineno,
- (long)(s - line));
- rc = -1;
- goto out;
- } else if (*s == '"' && !got_equals) {
- crm_err
- ("Invalid config file format: unexpected quotes "
- "(line %d char %ld)", lineno,
- (long)(s - line));
- rc = -1;
- goto out;
- } else if (*s == '"' && !in_quotes) {
- in_quotes = 1;
- if (val) {
- val++;
- got_quotes = 1;
- }
- } else if (*s == '"' && in_quotes) {
- in_quotes = 0;
- *s = '\0';
- }
-
- s++;
- }
-
- if (!got_equals) {
- crm_err
- ("Invalid config file format: missing '=' (lineno %d)",
- lineno);
- rc = -1;
- goto out;
- }
-
- if (in_quotes) {
- crm_err
- ("Invalid config file format: unterminated quotes (lineno %d)",
- lineno);
- rc = -1;
- goto out;
- }
-
- if (!got_quotes)
- *s = '\0';
-
- if (strlen(key) > BOOTH_NAME_LEN
- || strlen(val) > BOOTH_NAME_LEN) {
- crm_err("key/value too long");
- rc = -1;
- goto out;
- }
-
- if (!strcmp(key, "site")) {
- site_info_t *site = calloc(1, sizeof(site_info_t));
- memset(site, 0, sizeof(site_info_t));
-
- strcpy(site->addr, val);
- site->family = AF_INET;
- crm_trace("Site address[%s].", site->addr);
- if (search_self_node_ip(site) == 1) {
- crm_trace("Site[%s] is local site.",
- site->addr);
- site->local = TRUE;
- }
-
- sites = g_list_append(sites, site);
- }
-
- if (!strcmp(key, "ticket")) {
- char *ticket_name = calloc(1, BOOTH_NAME_LEN);
- memset(ticket_name, 0, BOOTH_NAME_LEN);
- expiry = index(val, ';');
- weight = rindex(val, ';');
-
- if (!expiry) {
- crm_trace("Not expire");
- strcpy(ticket_name, val);
- } else if (expiry && expiry == weight) {
- crm_trace("Expire only");
- *expiry++ = '\0';
-
- while (*expiry == ' ')
- expiry++;
-
- strcpy(ticket_name, val);
- } else {
- crm_trace("Expire and weight");
- *expiry++ = '\0';
- *weight++ = '\0';
-
- while (*expiry == ' ')
- expiry++;
-
- while (*weight == ' ')
- weight++;
-
- strcpy(ticket_name, val);
- }
-
- crm_info("Registered booth managed ticket[%s].",
- ticket_name);
- g_hash_table_insert(booth_tickets, ticket_name,
- ticket_name);
- }
-
- if (!strcmp(key, "exclude_ticket")) {
- exclude_ticket_info_t *exclude_ticket = calloc(1,
- sizeof
- (exclude_ticket_info_t));
- char *ticket_name = NULL;
-
- ticket_name = index(val, ';');
-
- if (ticket_name == NULL) {
- crm_err("exclude ticket format error. "
- "there is no ';'");
- rc = -1;
- goto out;
- }
-
- *ticket_name++ = '\0';
-
- exclude_ticket->site = strdup(val);
- exclude_ticket->ticket = strdup(ticket_name);
-
- exclude_tickets =
- g_list_append(exclude_tickets, exclude_ticket);
- }
- }
-
-out:
- fclose_rc = fclose(fp);
-
- if (fclose_rc != 0) {
- crm_perror(LOG_ERR, "fclose() call failed");
- rc = -1;
- }
-
- return rc;
-}
-
-gboolean
-validate_crm_message(xmlNode *msg, const char *sys, const char *uuid,
- const char *msg_type)
-{
- const char *type = NULL;
- const char *crm_msg_reference = NULL;
-
- if (msg == NULL) {
- return FALSE;
- }
-
- type = crm_element_value(msg, F_CRM_MSG_TYPE);
- crm_msg_reference = crm_element_value(msg, XML_ATTR_REFERENCE);
-
- if (type == NULL) {
- crm_info("No message type defined.");
- return FALSE;
-
- } else if (msg_type != NULL && strcasecmp(msg_type, type) != 0) {
- crm_info("Expecting a (%s) message but received a (%s).",
- msg_type, type);
- return FALSE;
- }
-
- if (crm_msg_reference == NULL) {
- crm_info("No message crm_msg_reference defined.");
- return FALSE;
- }
-
- return TRUE;
-}
-
-int
-crmd_ipc_msg_callback(const char *buffer, ssize_t length, gpointer user_data)
-{
- xmlNode *msg = string2xml(buffer);
- xmlNode *data = NULL;
- const char *dc = NULL;
- const char *state = NULL;
- const char *result = NULL;
-
- g_source_remove(crmd_message_timer_id);
- crmd_message_timer_id = -1;
-
- if (msg == NULL) {
- crm_info("XML in IPC message was not valid... " "discarding.");
- } else
- if (validate_crm_message
- (msg, crm_system_name, booth_resource_monitord_uuid,
- XML_ATTR_RESPONSE) == FALSE) {
- crm_trace("Message was not a CRM response. Discarding.");
-
- } else {
- result = crm_element_value(msg, XML_ATTR_RESULT);
-
- if (result == NULL || strcasecmp(result, "ok") == 0) {
- result = "pass";
-
- } else {
- result = "fail";
- }
-
- dc = crm_element_value(msg, F_CRM_HOST_FROM);
- data = get_message_xml(msg, F_CRM_DATA);
- state = crm_element_value(data, "crmd_state");
-
- crm_trace("Cluster status of %s@%s: %s (%s).",
- crm_element_value(data, XML_PING_ATTR_SYSFROM), dc,
- state, crm_element_value(data, XML_PING_ATTR_STATUS));
-
- if (safe_str_eq(state, "S_IDLE")) {
- /* Since the state is S_IDLE, the resource for surveillance is checked */
- crm_info
- ("Cluster status is %s: resource monitoring start.",
- state);
- start_resource_monitor();
- do_crmd_query = FALSE;
- } else {
- /* When a state is except S_IDLE, a state is checked again */
- crm_trace("State of the DC is not S_IDLE.");
- crmd_message_timer_id = g_timeout_add(1 * 1000,
- do_dc_health_start,
- NULL);
- }
- }
-
- free_xml(msg);
- msg = NULL;
-
- return 0;
-}
-
-void crmd_ipc_connection_destroy(gpointer user_data)
-{
- crm_err("Connection to CRMd was terminated");
-
- if (mainloop) {
- g_main_quit(mainloop);
- } else {
- crm_exit(1);
- }
-}
-
-struct ipc_client_callbacks crm_callbacks = {
- .dispatch = crmd_ipc_msg_callback,
- .destroy = crmd_ipc_connection_destroy
-};
-
-int crmd_connect(void)
-{
- xmlNode *xml = NULL;
- mainloop_io_t *src = NULL;
- int attempts = 0;
-
- booth_resource_monitord_uuid = calloc(1, 11);
-
- if (booth_resource_monitord_uuid == NULL) {
- crm_err("Failed to allocate memory.");
- return -1;
- }
-
- snprintf(booth_resource_monitord_uuid, 10, "%d", getpid());
- booth_resource_monitord_uuid[10] = '\0';
- crm_trace("uuid[%s]", booth_resource_monitord_uuid);
-
- while (src == NULL && attempts++ < max_failures) {
- crm_trace("Connecting to CRMd. attempt %d", attempts);
- src = mainloop_add_ipc_client(CRM_SYSTEM_CRMD,
- G_PRIORITY_DEFAULT, 0, NULL,
- &crm_callbacks);
-
- if (src == NULL) {
- crm_trace("Waiting signing on to the CRMd service.");
- sleep(1);
- }
- }
-
- crmd_channel = mainloop_get_ipc_client(src);
-
- if (crmd_channel == NULL) {
- crm_err("Failed in a connection trial with CRMd.");
- return -1;
- }
-
- xml =
- create_hello_message(booth_resource_monitord_uuid, crm_system_name,
- "0", "1");
- crm_ipc_send(crmd_channel, xml, 0, 0, NULL);
- free_xml(xml);
-
- crm_debug("Signing on to the CRMd service.");
-
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- int rc;
- int argerr = 0;
- int flag;
- gboolean daemonize = FALSE;
-
-#ifdef HAVE_GETOPT_H
- int option_index = 0;
- static struct option long_options[] = {
- /* Top-level Options */
- {"verbose", 0, 0, 'V'},
- {"help", 0, 0, 'h'},
- {"pid-file", 1, 0, 'p'},
- {"booth-config", 1, 0, 'b'},
- {"daemonize", 0, 0, 'D'},
- {0, 0, 0, 0}
- };
-#endif
- signal(SIGTERM, shutdown_called);
- signal(SIGINT, shutdown_called);
- signal(SIGPIPE, SIG_IGN);
-
- booth_config_file = strdup(BOOTH_CONFIG_FILE);
- pid_file = strdup(PID_FILE);
-
- crm_log_init(basename(argv[0]), LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
-
- 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 'V':
- crm_bump_log_level(argc, argv);
- break;
- case 'p':
- free(pid_file);
- pid_file = strdup(optarg);
- break;
- case 'b':
- free(booth_config_file);
- booth_config_file = strdup(optarg);
- break;
- case 'D':
- daemonize = TRUE;
- break;
- case 'h':
- usage(crm_system_name, EX_USAGE);
- break;
- default:
- ++argerr;
- break;
- }
- }
-
- if (optind < argc) {
- printf("non-option ARGV-elements: ");
-
- while (optind < argc) {
- crm_err("%s ", argv[optind]);
- printf("%s ", argv[optind]);
- optind++;
- }
-
- printf("\n");
- argerr++;
- }
-
- if (argerr > 0) {
- printf("Options exist that can not be processed.\n");
- usage(crm_system_name, EX_USAGE);
- }
-
- crm_make_daemon(crm_system_name, daemonize, pid_file);
-
- crm_info("Initializing %s.", crm_system_name);
-
- crm_trace("connect to CRMd.");
- rc = crmd_connect();
-
- if (rc == 0) {
- crm_info("Succeeded to connect CRMd.");
- } else {
- crm_err("Failed to connect CRMd.");
- clean_up(1);
- }
-
- crm_trace("connect to CIB.");
- rc = cib_connect();
-
- if (rc == pcmk_ok) {
- crm_info("Succeeded to connect CIB.");
- } else {
- crm_err("Failed to connect CIB.");
- clean_up(1);
- }
-
- rc = read_booth_config();
-
- if (rc != 0) {
- crm_err("Failed to reading of %s.", booth_config_file);
- clean_up(1);
- }
-
- create_information();
- start_resource_monitor();
-
- crm_info("Starting %s.", crm_system_name);
-
- mainloop = g_main_new(FALSE);
- mainloop_add_signal(SIGTERM, shutdown_called);
- mainloop_add_signal(SIGINT, shutdown_called);
- mainloop_add_signal(SIGHUP, print_info_summary);
- g_main_run(mainloop);
-
- crm_info("Exiting %s.", crm_system_name);
-
- clean_up(EX_OK);
-
- return 0;
-}
diff --git a/tools/booth_resource_monitord.h b/tools/booth_resource_monitord.h
deleted file mode 100644
index 97de366..0000000
--- a/tools/booth_resource_monitord.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/* -------------------------------------------------------------------------
- * booth_resource_monitord --- The monitoring of the resources which depended on the ticket.
- * This program watches the resource that depended on the ticket.
- * When abnormality occurs in a resource, move a ticket to other sites using booth.
- *
- * Copyright (c) 2012 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
- * Copyright (c) 2014 Philipp Marek <philipp.marek@linbit.com>
- *
- * 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
- *
- * -------------------------------------------------------------------------
- */
-
-#define IPADDR_LEN (sizeof(struct in6_addr))
-#define NETLINK_BUFSIZE 16384
-
-#define BOOTH_NAME_LEN 63
-#define COMMAND_MAX 256
-
-#define OPTARGS "p:b:DVh"
-#define PID_FILE "/tmp/booth_resource_monitord.pid"
-#define BOOTH_CONFIG_FILE "/etc/booth/booth.conf"
-
-#define F_CIB_UPDATE "cib_update"
-#define F_CIB_RC "cib_rc"
-#define F_CIB_OPERATION "cib_op"
-#define F_CIB_UPDATE_RESULT "cib_update_result"
-
-typedef struct site_info_s {
- gboolean local;
- unsigned short family;
- char addr[IPADDR_LEN];
- int weight;
-} site_info_t;
-
-typedef struct ticket_info_s {
- char *name;
- gboolean granted;
- gboolean standby;
- gboolean monitored;
- gboolean failover;
- gboolean need_delete;
- int expected_count;
- GList *resources;
-} ticket_info_t;
-
-typedef struct exclude_ticket_info_s {
- char *site;
- char *ticket;
-} exclude_ticket_info_t;
-
-typedef struct resource_info_s {
- char *id;
- enum rsc_role_e target_role;
- enum pe_obj_types variant;
- int clone_max;
- int clone_node_max;
- int master_max;
- int master_node_max;
-} resource_info_t;
-
-gboolean get_target_role(resource_t * rsc, enum rsc_role_e *role);
-void crm_make_daemon(const char *name, gboolean daemonize, const char *pidfile);
-void clean_up(int rc);
-void free_ticket(gpointer data);
-void shutdown_called(int nsig);
-void print_ticket_summary(gpointer key, gpointer value, gpointer user_data);
-void unpack_cluster_status(pe_working_set_t * data_set);
-resource_t *find_resource_from_list(const char *search_rsc_id, GListPtr list);
-void print_info_summary(int nsig);
-int grant_ticket(ticket_info_t * ticket);
-int revoke_ticket(ticket_info_t * ticket);
-void update_tickets_info(gpointer key, gpointer value, gpointer user_data);
-void failover_ticket(gpointer key, gpointer value, gpointer user_data);
-int check_ticket_condition(ticket_info_t * manage_ticket);
-int check_resource_role(resource_t * cluster_resource,
- resource_info_t * manage_resource);
-void check_ticket_failover_need(gpointer key, gpointer value,
- gpointer user_data);
-void start_resource_monitor(void);
-gboolean docHasTag(xmlNode * root, const char *tag);
-int search_xml_children(GListPtr * children, xmlNode * root, const char *tag,
- const char *field, const char *value,
- gboolean search_matches);
-void register_monitor_resource(ticket_info_t * ticket, resource_t * resource,
- enum rsc_role_e target_role);
-void register_monitor_resource_children(ticket_info_t * ticket, GListPtr list,
- enum rsc_role_e target_role);
-void create_ticket_info(xmlNode * rsc_ticket, gboolean update,
- pe_working_set_t * data_set);
-ticket_info_t *copy_ticket_info(ticket_info_t * copy_ticket);
-int compare_resource(GListPtr rsc_list, resource_info_t * rsc);
-int compare_ticket_info(ticket_info_t * tmp_ticket,
- ticket_info_t * register_ticket);
-void register_tickets(gpointer key, gpointer value, gpointer user_data);
-void delete_unnecessary_ticket(gpointer key, gpointer value,
- gpointer user_data);
-void create_information(void);
-int do_dc_health(void);
-gboolean do_dc_health_start(gpointer data);
-void cib_diff_notify(const char *event, xmlNode * msg);
-void usage(const char *cmd, int exit_status);
-void cib_connection_destroy(gpointer user_data);
-int cib_connect(void);
-void parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
-int search_self_node_ip(site_info_t * site);
-int read_booth_config(void);
-gboolean validate_crm_message(xmlNode * msg, const char *sys, const char *uuid,
- const char *msg_type);
-int crmd_ipc_msg_callback(const char *buffer, ssize_t length,
- gpointer user_data);
-void crmd_ipc_connection_destroy(gpointer user_data);
-int crmd_connect(void);
-
-
-#ifdef HAVE_LOG_CIB_DIFF
-/* OK */
-#else
-#ifdef HAVE_XML_LOG_PATCHSET
-/* See https://github.com/ClusterLabs/pacemaker, commit
- * 6953aa52e00c4ddf481254a828f6d7c7826a23b9 */
- static inline void
-log_cib_diff(int log_level, xmlNode * diff, const char *function)
-{
- xml_log_patchset(log_level, function, diff);
-}
-#else
-#error "Neither log_cib_diff() nor xml_log_patchset() available."
-#endif
-#endif
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Feb 27, 4:52 AM (1 d, 9 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1466180
Default Alt Text
(80 KB)
Attached To
Mode
rB Booth
Attached
Detach File
Event Timeline
Log In to Comment