Hello community, here is the log from the commit of package booth for openSUSE:Factory checked in at 2014-03-04 13:20:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/booth (Old) and /work/SRC/openSUSE:Factory/.booth.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "booth" Changes: -------- --- /work/SRC/openSUSE:Factory/booth/booth.changes 2014-02-18 14:43:53.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.booth.new/booth.changes 2014-03-04 13:20:36.000000000 +0100 @@ -1,0 +2,11 @@ +Mon Feb 24 13:32:21 CET 2014 - [email protected] + +- Systemd integration +- Atomic ticket writes (grant/revoke with attributes) + Automatic fallback for older 'crm_ticket' binaries +- Autoconf/Configure check for moved log_cib_diff() function + Make package build again with newer Pacemaker libraries. +- Small fixes, cleanups, and enhancements for the unit tests. +- Version 0.1.6 + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ booth.spec ++++++ --- /var/tmp/diff_new_pack.R9ao1q/_old 2014-03-04 13:20:36.000000000 +0100 +++ /var/tmp/diff_new_pack.R9ao1q/_new 2014-03-04 13:20:36.000000000 +0100 @@ -38,7 +38,7 @@ Summary: The Booth Cluster Ticket Manager License: GPL-2.0+ Group: Productivity/Clustering/HA -Version: 0.1.5 +Version: 0.1.6 Release: 0 Source: booth.tar.bz2 Source1: %name-rpmlintrc @@ -88,6 +88,10 @@ gzip < docs/boothd.8 > %{buildroot}/%{_mandir}/man8/booth.8.gz ln %{buildroot}/%{_mandir}/man8/booth.8.gz %{buildroot}/%{_mandir}/man8/boothd.8.gz +# systemd +mkdir -p %{buildroot}/usr/lib/systemd/system/ +cp -a conf/[email protected] %{buildroot}/usr/lib/systemd/system/[email protected] + #install test-parts mkdir -p %{buildroot}/%{test_path} @@ -129,6 +133,9 @@ %{_initddir}/booth-arbitrator /usr/lib/ocf/resource.d/pacemaker/booth-site %config %{_sysconfdir}/booth/booth.conf.example + +/usr/lib/systemd/system/[email protected] + %doc README COPYING %package test ++++++ _service ++++++ --- /var/tmp/diff_new_pack.R9ao1q/_old 2014-03-04 13:20:36.000000000 +0100 +++ /var/tmp/diff_new_pack.R9ao1q/_new 2014-03-04 13:20:36.000000000 +0100 @@ -1,6 +1,6 @@ <services> <service name="tar_scm" mode="disabled"> - <param name="url">git://github.com/jjzhang/booth.git</param> + <param name="url">git://github.com/ClusterLabs/booth.git</param> <param name="scm">git</param> <param name="exclude">.git</param> <param name="version"></param> ++++++ booth.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/conf/[email protected] new/booth/conf/[email protected] --- old/booth/conf/[email protected] 1970-01-01 01:00:00.000000000 +0100 +++ new/booth/conf/[email protected] 2014-02-24 13:41:07.000000000 +0100 @@ -0,0 +1,17 @@ +# This file is part of Booth. + +[Unit] +Description=Booth - Ticket Manager for Pacemaker Clusters +Documentation=man:boothd(8) +After=network-online.target +ConditionFileExists=/etc/booth/%i.conf + +[Install] +Alias=boothd +WantedBy=multi-user.target + +[Service] +Type=simple +Conflicts=pacemaker.service +ExecStart=/usr/sbin/boothd daemon -S -c %i + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/configure new/booth/configure --- old/booth/configure 2014-02-17 12:46:01.000000000 +0100 +++ new/booth/configure 2014-02-24 13:15:11.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for booth 0.1.4. +# Generated by GNU Autoconf 2.69 for booth 0.1.5. # # Report bugs to <[email protected]>. # @@ -580,8 +580,8 @@ # Identity of this package. PACKAGE_NAME='booth' PACKAGE_TARNAME='booth' -PACKAGE_VERSION='0.1.4' -PACKAGE_STRING='booth 0.1.4' +PACKAGE_VERSION='0.1.5' +PACKAGE_STRING='booth 0.1.5' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='' @@ -626,6 +626,8 @@ am__EXEEXT_TRUE LTLIBOBJS BOOTHSYSCONFDIR +HAVE_XML_LOG_PATCHSET +HAVE_LOG_CIB_DIFF LINT_FLAGS BUILD_HTML_DOCS_FALSE BUILD_HTML_DOCS_TRUE @@ -1316,7 +1318,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures booth 0.1.4 to adapt to many kinds of systems. +\`configure' configures booth 0.1.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1386,7 +1388,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of booth 0.1.4:";; + short | recursive ) echo "Configuration of booth 0.1.5:";; esac cat <<\_ACEOF @@ -1495,7 +1497,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -booth configure 0.1.4 +booth configure 0.1.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2094,7 +2096,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by booth $as_me 0.1.4, which was +It was created by booth $as_me 0.1.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2958,7 +2960,7 @@ # Define the identity of the package. PACKAGE='booth' - VERSION='0.1.4' + VERSION='0.1.5' cat >>confdefs.h <<_ACEOF @@ -7097,7 +7099,182 @@ 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" + for ac_header in libxml/tree.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libxml/tree.h" "ac_cv_header_libxml_tree_h" "$ac_includes_default" +if test "x$ac_cv_header_libxml_tree_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBXML_TREE_H 1 +_ACEOF + +fi + +done + + for ac_header in crm/cib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "crm/cib.h" "ac_cv_header_crm_cib_h" "$ac_includes_default" +if test "x$ac_cv_header_crm_cib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CRM_CIB_H 1 +_ACEOF + +fi + +done + + for ac_header in crm/cib/util.h +do : + ac_fn_c_check_header_compile "$LINENO" "crm/cib/util.h" "ac_cv_header_crm_cib_util_h" " +#include <libxml/tree.h> +#include <crm/cib.h> + +" +if test "x$ac_cv_header_crm_cib_util_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CRM_CIB_UTIL_H 1 +_ACEOF + +fi + +done + + for ac_header in crm/common/xml.h +do : + ac_fn_c_check_header_compile "$LINENO" "crm/common/xml.h" "ac_cv_header_crm_common_xml_h" " +#include <libxml/tree.h> +#include <crm/cib.h> + +" +if test "x$ac_cv_header_crm_common_xml_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CRM_COMMON_XML_H 1 +_ACEOF + +fi + +done + + as_ac_Lib=`$as_echo "ac_cv_lib_crmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2''_xml_log_patchset" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xml_log_patchset in -lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2" >&5 +$as_echo_n "checking for xml_log_patchset in -lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char xml_log_patchset (); +int +main () +{ +return xml_log_patchset (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCRMCOMMON__LCRMCLUSTER__LPE_STATUS__LCIB__LGLIB_2_0__LQB__LXML2 1 +_ACEOF + + LIBS="-lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2 $LIBS" + +fi + + as_ac_Lib=`$as_echo "ac_cv_lib_crmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2''_log_cib_diff" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for log_cib_diff in -lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2" >&5 +$as_echo_n "checking for log_cib_diff in -lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char log_cib_diff (); +int +main () +{ +return log_cib_diff (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCRMCOMMON__LCRMCLUSTER__LPE_STATUS__LCIB__LGLIB_2_0__LQB__LXML2 1 +_ACEOF + + LIBS="-lcrmcommon -lcrmcluster -lpe_status -lcib -lglib-2.0 -lqb -lxml2 $LIBS" + +fi + + for ac_func in log_cib_diff +do : + ac_fn_c_check_func "$LINENO" "log_cib_diff" "ac_cv_func_log_cib_diff" +if test "x$ac_cv_func_log_cib_diff" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOG_CIB_DIFF 1 +_ACEOF + +fi +done + + for ac_func in xml_log_patchset +do : + ac_fn_c_check_func "$LINENO" "xml_log_patchset" "ac_cv_func_xml_log_patchset" +if test "x$ac_cv_func_xml_log_patchset" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_XML_LOG_PATCHSET 1 +_ACEOF + +fi +done + PACKAGE_FEATURES="$PACKAGE_FEATURES resource-monitor" WITH_LIST="$WITH_LIST --with resource-monitor" SUPPORT_RESOURCE_MONITOR=1 @@ -7124,7 +7301,7 @@ # 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" +CPPFLAGS="$ENV_CPPFLAGS $ANSI_CPPFLAGS $OS_CPPFLAGS $GLIB_CFLAGS $RESMON_CFLAGS" LDFLAGS="$ENV_LDFLAGS $COVERAGE_LDFLAGS $OS_LDFLAGS" # substitute what we need: @@ -7184,6 +7361,8 @@ BOOTHSYSCONFDIR=${sysconfdir}/booth + + cat >>confdefs.h <<_ACEOF #define BOOTHSYSCONFDIR "$(eval echo ${BOOTHSYSCONFDIR})" _ACEOF @@ -7745,7 +7924,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by booth $as_me 0.1.4, which was +This file was extended by booth $as_me 0.1.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -7815,7 +7994,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -booth config.status 0.1.4 +booth config.status 0.1.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/configure.ac new/booth/configure.ac --- old/booth/configure.ac 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/configure.ac 2014-02-24 13:41:07.000000000 +0100 @@ -4,7 +4,7 @@ # bootstrap / init AC_PREREQ([2.61]) -AC_INIT([booth], [0.1.5], [[email protected]]) +AC_INIT([booth], [0.1.6], [[email protected]]) AM_INIT_AUTOMAKE([-Wno-portability]) @@ -347,7 +347,26 @@ 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 @@ -367,7 +386,7 @@ # 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" +CPPFLAGS="$ENV_CPPFLAGS $ANSI_CPPFLAGS $OS_CPPFLAGS $GLIB_CFLAGS $RESMON_CFLAGS" LDFLAGS="$ENV_LDFLAGS $COVERAGE_LDFLAGS $OS_LDFLAGS" # substitute what we need: @@ -392,6 +411,8 @@ 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]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/docs/boothd.8 new/booth/docs/boothd.8 --- old/booth/docs/boothd.8 2014-01-24 15:59:55.000000000 +0100 +++ new/booth/docs/boothd.8 2014-02-21 12:53:32.000000000 +0100 @@ -2,12 +2,12 @@ .\" Title: boothd .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/> -.\" Date: 01/24/2014 +.\" Date: 02/21/2014 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "BOOTHD" "8" "01/24/2014" "\ \&" "\ \&" +.TH "BOOTHD" "8" "02/21/2014" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -104,6 +104,14 @@ .RS 4 Report version information\&. .RE +.PP +\fB\-S\fR +.RS 4 +\fIsystemd\fR +mode: don\(cqt fork\&. This is like +\fI\-D\fR +but without the debug output\&. +.RE .SH "COMMANDS" .sp Whether the binary is called as \fIboothd\fR or \fIbooth\fR doesn\(cqt matter; the first argument determines the mode of operation\&. @@ -306,6 +314,22 @@ \fIstatus\fR command\&. .RE +.SH "SYSTEMD INTEGRATION" +.sp +The Booth sources (and, very likely, packages too) include a \fIsystemd\fR unit file for \fIboothd\fR\&. +.sp +So don\(cqt forget to install \fIboothd\fR into \fIsystemd\fR after configuration! +.sp +.if n \{\ +.RS 4 +.\} +.nf +# systemctl enable booth@{configurationname}\&.service +# systemctl start booth@{configurationname}\&.service +.fi +.if n \{\ +.RE +.\} .SH "EXIT STATUS" .PP \fB0\fR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/docs/boothd.8.html new/booth/docs/boothd.8.html --- old/booth/docs/boothd.8.html 2014-02-17 13:12:37.000000000 +0100 +++ new/booth/docs/boothd.8.html 2014-02-24 13:41:17.000000000 +0100 @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>boothd</title><link rel="stylesheet" type="text/css" href="docbook-xsl.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.78.1" /></head><body><div xml:lang="en" class="refentry" lang="en"><a id="idm139789799956336"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>boothd — The Booth Cluster Ticket Manager.</p></div><div class="refsynopsisdiv"><a id="_synopsis"></a><h2>Synopsis</h2><p><span class="strong"><strong>boothd</strong></span> <span class="emphasis"><em>daemon</em></span> [<span class="emphasis"><em>-D</em></span>] [-c <span class="emphasis"><em>config</em></span>]</p><p><span class="strong"><strong>booth</strong></span> [<span class="emphasis"><em>client</em></span>] {<span class="emphasis"><em>list</em></span>} [-S <span class="emphasis"><em>site</em></span>] [<span class="emphasis"><em>-D</em></span>] [-c <span class="emphasis"><em>config</em></span>]</p><p><span class="strong"><strong>booth</strong></span> [<span class="emphasis"><em>client</em></span>] {<span class="emphasis"><em>grant</em></span>|<span class="emphasis"><em>revoke</em></span>} [-S <span class="emphasis"><em>site</em></span>] [<span class="emphasis"><em>-D</em></span>] [-t] <span class="emphasis"><em>ticket</em></span> [-c <span class="emphasis"><em>config</em></span>]</p><p><span class="strong"><strong>booth</strong></span> <span class="emphasis"><em>status</em></span> [<span class="emphasis"><em>-D</em></span>] [-c <span class="emphasis"><em>config</em></span>]</p></div><div class="refsect1"><a id="_description"></a><h2>DESCRIPTION</h2><p>Booth manages tickets which authorizes one of the cluster sites located in +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>boothd</title><link rel="stylesheet" type="text/css" href="docbook-xsl.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.78.1" /></head><body><div xml:lang="en" class="refentry" lang="en"><a id="idm140263446345392"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>boothd — The Booth Cluster Ticket Manager.</p></div><div class="refsynopsisdiv"><a id="_synopsis"></a><h2>Synopsis</h2><p><span class="strong"><strong>boothd</strong></span> <span class="emphasis"><em>daemon</em></span> [<span class="emphasis"><em>-D</em></span>] [-c <span class="emphasis"><em>config</em></span>]</p><p><span class="strong"><strong>booth</strong></span> [<span class="emphasis"><em>client</em></span>] {<span class="emphasis"><em>list</em></span>} [-S <span class="emphasis"><em>site</em></span>] [<span class="emphasis"><em>-D</em></span>] [-c <span class="emphasis"><em>config</em></span>]</p><p><span class="strong"><strong>booth</strong></span> [<span class="emphasis"><em>client</em></span>] {<span class="emphasis"><em>grant</em></span>|<span class="emphasis"><em>revoke</em></span>} [-S <span class="emphasis"><em>site</em></span>] [<span class="emphasis"><em>-D</em></span>] [-t] <span class="emphasis"><em>ticket</em></span> [-c <span class="emphasis"><em>config</em></span>]</p><p><span class="strong"><strong>booth</strong></span> <span class="emphasis"><em>status</em></span> [<span class="emphasis"><em>-D</em></span>] [-c <span class="emphasis"><em>config</em></span>]</p></div><div class="refsect1"><a id="_description"></a><h2>DESCRIPTION</h2><p>Booth manages tickets which authorizes one of the cluster sites located in geographically dispersed distances to run certain resources. It is designed to be an add-on to Pacemaker, which extends Pacemaker to support geographically distributed clustering.</p><p>It is based on the PAXOS protocol, see eg. @@ -39,6 +39,10 @@ <span class="strong"><strong>-v</strong></span>, <span class="strong"><strong>--version</strong></span> </span></dt><dd> Report version information. +</dd><dt><span class="term"> +<span class="strong"><strong>-S</strong></span> +</span></dt><dd> + <span class="emphasis"><em>systemd</em></span> mode: don’t fork. This is like <span class="emphasis"><em>-D</em></span> but without the debug output. </dd></dl></div></div><div class="refsect1"><a id="_commands"></a><h2>COMMANDS</h2><p>Whether the binary is called as <span class="emphasis"><em>boothd</em></span> or <span class="emphasis"><em>booth</em></span> doesn’t matter; the first argument determines the mode of operation.</p><div class="variablelist"><dl class="variablelist"><dt><span class="term"> <span class="strong"><strong><span class="emphasis"><em>daemon</em></span></strong></span> @@ -153,7 +157,9 @@ <span class="strong"><strong><span class="emphasis"><em>/var/run/booth/</em></span></strong></span> </span></dt><dd> Directory that holds PID/lock files. See also the <span class="emphasis"><em>status</em></span> command. -</dd></dl></div></div><div class="refsect1"><a id="_exit_status"></a><h2>EXIT STATUS</h2><div class="variablelist"><dl class="variablelist"><dt><span class="term"> +</dd></dl></div></div><div class="refsect1"><a id="_systemd_integration"></a><h2>SYSTEMD INTEGRATION</h2><p>The Booth sources (and, very likely, packages too) include a <span class="emphasis"><em>systemd</em></span> unit +file for <span class="emphasis"><em>boothd</em></span>.</p><p>So don’t forget to install <span class="emphasis"><em>boothd</em></span> into <span class="emphasis"><em>systemd</em></span> after configuration!</p><pre class="screen"># systemctl enable booth@{configurationname}.service +# systemctl start booth@{configurationname}.service</pre></div><div class="refsect1"><a id="_exit_status"></a><h2>EXIT STATUS</h2><div class="variablelist"><dl class="variablelist"><dt><span class="term"> <span class="strong"><strong>0</strong></span> </span></dt><dd> Success. For the <span class="emphasis"><em>status</em></span> command: Daemon running. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/docs/boothd.8.txt new/booth/docs/boothd.8.txt --- old/booth/docs/boothd.8.txt 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/docs/boothd.8.txt 2014-02-24 13:41:07.000000000 +0100 @@ -76,6 +76,9 @@ *-v*, *--version*:: Report version information. +*-S*:: + 'systemd' mode: don't fork. This is like '-D' but without the debug output. + COMMANDS @@ -259,6 +262,19 @@ Directory that holds PID/lock files. See also the 'status' command. +SYSTEMD INTEGRATION +------------------- + +The Booth sources (and, very likely, packages too) include a 'systemd' unit +file for 'boothd'. + +So don't forget to install 'boothd' into 'systemd' after configuration! + +----------- +# systemctl enable booth@{configurationname}.service +# systemctl start booth@{configurationname}.service +----------- + EXIT STATUS ----------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/docs/boothd.8.xml new/booth/docs/boothd.8.xml --- old/booth/docs/boothd.8.xml 2014-02-17 13:12:39.000000000 +0100 +++ new/booth/docs/boothd.8.xml 2014-02-24 13:41:18.000000000 +0100 @@ -112,6 +112,16 @@ </simpara> </listitem> </varlistentry> +<varlistentry> +<term> +<emphasis role="strong">-S</emphasis> +</term> +<listitem> +<simpara> + <emphasis>systemd</emphasis> mode: don’t fork. This is like <emphasis>-D</emphasis> but without the debug output. +</simpara> +</listitem> +</varlistentry> </variablelist> </refsect1> <refsect1 id="_commands"> @@ -364,6 +374,14 @@ </varlistentry> </variablelist> </refsect1> +<refsect1 id="_systemd_integration"> +<title>SYSTEMD INTEGRATION</title> +<simpara>The Booth sources (and, very likely, packages too) include a <emphasis>systemd</emphasis> unit +file for <emphasis>boothd</emphasis>.</simpara> +<simpara>So don’t forget to install <emphasis>boothd</emphasis> into <emphasis>systemd</emphasis> after configuration!</simpara> +<screen># systemctl enable booth@{configurationname}.service +# systemctl start booth@{configurationname}.service</screen> +</refsect1> <refsect1 id="_exit_status"> <title>EXIT STATUS</title> <variablelist> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/script/unit-test.py new/booth/script/unit-test.py --- old/booth/script/unit-test.py 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/script/unit-test.py 2014-02-24 13:41:07.000000000 +0100 @@ -180,6 +180,7 @@ # if not, we terminate it ourselves. if self.gdb: self.gdb.close( force=True ); + self.drain_booth_log() if self.booth: self.booth.close( force=self.booth.isalive() ) @@ -225,7 +226,14 @@ self.gdb = self.start_a_process("gdb", args=["-quiet", "-p", str(self.booth.pid), - "-nx", "-nh", # don't use .gdbinit + # Don't use .gdbinit + "-nx", "-nh", + # Run until the defined point. + # This is necessary so that ticket state setting doesn't + # happen _before_ the call to pcmk_load_ticket() + # (which would overwrite our data) + "-ex", "break ticket_cron", + "-ex", "continue", ]) logging.info("started GDB with PID %d" % self.gdb.pid) self.gdb.expect("(gdb)") @@ -234,18 +242,18 @@ self.gdb.sendline("set verbose off\n") ## sadly to late for the initial "symbol not found" messages self.gdb.sendline("set prompt " + self.prompt + "\\n\n"); self.sync(2000) - #os.system("strace -o /tmp/sfdgs -f -tt -s 2000 -p %d &" % self.gdb.pid) + # Only stop for this recipient, so that broadcasts are not seen multiple times + self.send_cmd("break booth_udp_send if to == &(booth_conf->site[1])") + self.send_cmd("break recvfrom") + # ticket_cron is still a breakpoint + + # Now we're set up. self.this_site_id = self.query_value("local->site_id") self.this_port = int(self.query_value("booth_conf->port")) # do a self-test assert(self.check_value("local->site_id", self.this_site_id)) - - # Now we're set up. - self.send_cmd("break ticket_cron") - self.send_cmd("break booth_udp_send if to == &(booth_conf->site[1])") - self.send_cmd("break recvfrom") self.running = False # }}} @@ -269,6 +277,8 @@ def drain_booth_log(self): try: self.booth.read_nonblocking(64*1024, 0) + except pexpect.EOF: + pass except pexpect.TIMEOUT: pass finally: @@ -479,8 +489,11 @@ time.sleep(1) self.drain_booth_log() # stop it - posix.kill(self.booth.pid, signal.SIGINT) - posix.kill(self.gdb.pid, signal.SIGINT) + self.booth.sendintr() + # This additional signal seems to be unnecessary. + #posix.kill(self.gdb.pid, signal.SIGINT) + # In case it's really needed we should drain booth's signals queue, + # eg. by sending "print getpid()" twice, before the sync() call. self.running = False self.sync(2000) @@ -500,18 +513,22 @@ sys.exit(1) - def run(self, start_from="000"): + def run(self, start_from="000", end_with="999"): os.chdir(self.test_base) # TODO: sorted, random order tests = filter( (lambda f: re.match(r"^\d\d\d_.*\.txt$", f)), glob.glob("*")) tests.sort() + failed = 0 for f in tests: - if f < start_from: + if f[0:3] < start_from: + continue + if f[0:3] > end_with: continue log = None logfn = UT._filename(f) if self.running_on_console(): sys.stdout.write("\n") + self.current_nr = "setup" try: log = self.setup_log(filename = logfn) @@ -526,10 +543,11 @@ self.loop(f, test) self.do_finally(test.get("finally")) - self.current_nr = None + self.current_nr = "teardown" logging.warn(self.colored_string("Finished test '%s' - OK" % f, self.GREEN)) except: - logging.error(self.colored_string("Broke in %s:%d %s" % (f, self.current_nr, sys.exc_info()), self.RED)) + failed += 1 + logging.error(self.colored_string("Broke in %s:%s %s" % (f, self.current_nr, sys.exc_info()), self.RED)) for frame in traceback.format_tb(sys.exc_traceback): logging.info(" - %s " % frame.rstrip()) finally: @@ -539,7 +557,7 @@ logging.getLogger("").removeHandler(log) if self.running_on_console(): sys.stdout.write("\n") - return + return failed # }}} @@ -587,6 +605,9 @@ starting = "0" if len(sys.argv) > 3: starting = sys.argv[3] - ret = ut.run(starting) + ending = "999" + if len(sys.argv) > 4: + ending = sys.argv[4] + ret = ut.run(starting, ending) sys.exit(ret) # }}} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/src/main.c new/booth/src/main.c --- old/booth/src/main.c 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/src/main.c 2014-02-24 13:41:07.000000000 +0100 @@ -798,6 +798,7 @@ printf(" -c FILE Specify config file [default " BOOTH_DEFAULT_CONF "]\n"); printf(" Can be a path or a name without \".conf\" suffix\n"); printf(" -D Enable debugging to stderr and don't fork\n"); + printf(" -S Systemd mode (no forking)\n"); printf(" -t ticket name\n"); printf(" -s site name\n"); printf(" -l LOCKFILE Specify lock file path (daemon only)\n"); @@ -806,7 +807,7 @@ printf("Please see the man page for details.\n"); } -#define OPTION_STRING "c:Dl:t:s:h" +#define OPTION_STRING "c:Dl:t:s:hS" void safe_copy(char *dest, char *value, size_t buflen, const char *description) { @@ -932,8 +933,10 @@ } break; case 'D': - daemonize = 1; debug_level++; + /* Fall through */ + case 'S': + daemonize = 1; break; case 'l': diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/src/pacemaker.c new/booth/src/pacemaker.c --- old/booth/src/pacemaker.c 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/src/pacemaker.c 2014-02-24 13:41:07.000000000 +0100 @@ -27,7 +27,74 @@ #include "pacemaker.h" #include "inline-fn.h" -#define COMMAND_MAX 256 + +enum atomic_ticket_supported { + YES=0, + NO, + FILENOTFOUND, /* Ie. UNKNOWN */ + UNKNOWN = FILENOTFOUND, +}; +/* http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx */ + + +enum atomic_ticket_supported atomicity = UNKNOWN; + + + +#define COMMAND_MAX 1024 + + +/** Determines whether the installed crm_ticket can do atomic ticket grants, + * _including_ multiple attribute changes. + * + * See + * https://bugzilla.novell.com/show_bug.cgi?id=855099 + * + * Run "crm_ticket" without "--force"; + * - the old version asks for "Y/N" via STDIN, and returns 0 + * when reading "no"; + * - the new version just reports an error without asking. + */ +static void test_atomicity(void) +{ + int rv; + + if (atomicity != UNKNOWN) + return; + + rv = system("echo n | crm_ticket -g -t any-ticket-name > /dev/null 2> /dev/null"); + if (rv == -1) { + log_error("Cannot run \"crm_ticket\"!"); + /* BIG problem. Abort. */ + exit(1); + } + + if (WIFSIGNALED(rv)) { + log_error("\"crm_ticket\" terminated by a signal!"); + /* Problem. Abort. */ + exit(1); + } + + switch (WEXITSTATUS(rv)) { + case 0: + atomicity = NO; + log_info("Old \"crm_ticket\" found, using non-atomic ticket updates."); + break; + + case 1: + atomicity = YES; + log_info("New \"crm_ticket\" found, using atomic ticket updates."); + break; + + default: + log_error("Unexpected return value from \"crm_ticket\" (%d), " + "falling back to non-atomic ticket updates.", + rv); + atomicity = NO; + } + + assert(atomicity == YES || atomicity == NO); +} static const char * interpret_rv(int rv) @@ -48,31 +115,86 @@ } +static int pcmk_write_ticket_atomic(struct ticket_config *tk, int grant) +{ + char cmd[COMMAND_MAX]; + int rv; + -static void pcmk_grant_ticket(struct ticket_config *tk) + /* The values are appended to "-v", so that NO_OWNER + * (which is -1) isn't seen as another option. */ + snprintf(cmd, COMMAND_MAX, + "crm_ticket -t '%s' " + "%s --force " + "-S owner -v%" PRIi32 " " + "-S expires -v%" PRIi64 " " + "-S ballot -v%" PRIi64, + tk->name, + (grant > 0 ? "-g" : + grant < 0 ? "-r" : + ""), + (int32_t)get_node_id(tk->owner), + (int64_t)tk->expires, + (int64_t)tk->last_ack_ballot); + + rv = system(cmd); + log_info("command: '%s' was executed", cmd); + if (rv != 0) + log_error("error: \"%s\" failed, %s", cmd, interpret_rv(rv)); + + return rv; +} + + +static int pcmk_store_ticket_nonatomic(struct ticket_config *tk); + +static int pcmk_grant_ticket(struct ticket_config *tk) { char cmd[COMMAND_MAX]; int rv; + + test_atomicity(); + if (atomicity == YES) + return pcmk_write_ticket_atomic(tk, +1); + + + rv = pcmk_store_ticket_nonatomic(tk); + if (rv) + return rv; + snprintf(cmd, COMMAND_MAX, "crm_ticket -t %s -g --force", tk->name); log_info("command: '%s' was executed", cmd); rv = system(cmd); if (rv != 0) log_error("error: \"%s\" failed, %s", cmd, interpret_rv(rv)); + return rv; } -static void pcmk_revoke_ticket(struct ticket_config *tk) + +static int pcmk_revoke_ticket(struct ticket_config *tk) { char cmd[COMMAND_MAX]; int rv; + + test_atomicity(); + if (atomicity == YES) + return pcmk_write_ticket_atomic(tk, -1); + + + rv = pcmk_store_ticket_nonatomic(tk); + if (rv) + return rv; + snprintf(cmd, COMMAND_MAX, "crm_ticket -t %s -r --force", tk->name); log_info("command: '%s' was executed", cmd); rv = system(cmd); if (rv != 0) log_error("error: \"%s\" failed, %s", cmd, interpret_rv(rv)); + return rv; } @@ -90,17 +212,29 @@ (rv = system(cmd)); i++) ; - log_info("'%s' gave result %s", cmd, interpret_rv(rv)); + log_debug("'%s' gave result %s", cmd, interpret_rv(rv)); return rv; } -static void pcmk_store_ticket(struct ticket_config *tk) +static int pcmk_store_ticket_nonatomic(struct ticket_config *tk) { - crm_ticket_set(tk, "owner", (int32_t)get_node_id(tk->owner)); - crm_ticket_set(tk, "expires", tk->expires); - crm_ticket_set(tk, "ballot", tk->last_ack_ballot); + int rv; + + /* Always try to store *each* attribute, even if there's an error + * for one of them. */ + rv = crm_ticket_set(tk, "owner", (int32_t)get_node_id(tk->owner)); + rv = crm_ticket_set(tk, "expires", tk->expires) || rv; + rv = crm_ticket_set(tk, "ballot", tk->last_ack_ballot) || rv; + + if (rv) + log_error("setting crm_ticket attributes failed; %s", + interpret_rv(rv)); + else + log_info("setting crm_ticket attributes successful"); + + return rv; } @@ -140,17 +274,22 @@ out: rv = pclose(p); - log_info("command \"%s\" returned %s, value %" PRIi64, cmd, interpret_rv(rv), v); + log_debug("command \"%s\" returned %s, value %" PRIi64, cmd, interpret_rv(rv), v); return rv; } -static void pcmk_load_ticket(struct ticket_config *tk) +static int pcmk_load_ticket(struct ticket_config *tk) { int rv; int64_t v; + /* This here gets run during startup; testing that here means that + * normal operation won't be interrupted with that test. */ + test_atomicity(); + + rv = crm_ticket_get(tk, "expires", &v); if (!rv) { tk->expires = v; @@ -176,12 +315,12 @@ /* We load only when the state is completely unknown. */ tk->state = ST_INIT; - return; + return rv; } + struct ticket_handler pcmk_handler = { .grant_ticket = pcmk_grant_ticket, .revoke_ticket = pcmk_revoke_ticket, - .store_ticket = pcmk_store_ticket, .load_ticket = pcmk_load_ticket, }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/src/pacemaker.h new/booth/src/pacemaker.h --- old/booth/src/pacemaker.h 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/src/pacemaker.h 2014-02-24 13:41:07.000000000 +0100 @@ -1,6 +1,6 @@ /* * Copyright (C) 2011 Jiaju Zhang <[email protected]> - * Copyright (C) 2013 Philipp Marek <[email protected]> + * Copyright (C) 2013-2014 Philipp Marek <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public @@ -24,10 +24,9 @@ #include "config.h" struct ticket_handler { - void (*grant_ticket) (struct ticket_config *tk); - void (*revoke_ticket) (struct ticket_config *tk); - void (*store_ticket) (struct ticket_config *tk); - void (*load_ticket) (struct ticket_config *tk); + int (*grant_ticket) (struct ticket_config *tk); + int (*revoke_ticket) (struct ticket_config *tk); + int (*load_ticket) (struct ticket_config *tk); }; struct ticket_handler pcmk_handler; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/src/ticket.c new/booth/src/ticket.c --- old/booth/src/ticket.c 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/src/ticket.c 2014-02-24 13:41:07.000000000 +0100 @@ -126,8 +126,6 @@ disown_if_expired(tk); - pcmk_handler.store_ticket(tk); - if (tk->owner == local) { pcmk_handler.grant_ticket(tk); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/tools/booth_resource_monitord.c new/booth/tools/booth_resource_monitord.c --- old/booth/tools/booth_resource_monitord.c 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/tools/booth_resource_monitord.c 2014-02-24 13:41:07.000000000 +0100 @@ -4,6 +4,7 @@ * 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 <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/tools/booth_resource_monitord.h new/booth/tools/booth_resource_monitord.h --- old/booth/tools/booth_resource_monitord.h 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/tools/booth_resource_monitord.h 2014-02-24 13:41:07.000000000 +0100 @@ -4,6 +4,7 @@ * 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 <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public @@ -122,3 +123,20 @@ 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/booth/unit-tests/bin/crm_ticket new/booth/unit-tests/bin/crm_ticket --- old/booth/unit-tests/bin/crm_ticket 2014-02-17 13:11:17.000000000 +0100 +++ new/booth/unit-tests/bin/crm_ticket 2014-02-24 13:41:07.000000000 +0100 @@ -8,21 +8,24 @@ function word_after() { +# Per default $1 is printed perl -e ' $search=shift(); $stg=shift(); - print $1 if $stg =~ /$search/;' "$1" "$2" + print $'${3:-1}' if $stg =~ /$search/;' "$1" "$2" } function Get() { - which=$(word_after " -G '(\\w+)'" "$1") + which=$(word_after " -G ('?)(\\w+)\\1" "$1" 2) if [[ -z "$which" ]] ; then exit 1 fi word_after "\\b$which\\b (\\S+)" "$UNIT_TEST_AUX" + # provide a newline + echo "" exit 0 } -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
