diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/.gitignore b/.gitignore index d12d7aa..be468d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,54 @@ corosync-1.2.6.tar.gz corosync-1.2.7.tar.gz /corosync-1.2.8.tar.gz +/corosync-1.3.0.tar.gz +/corosync-1.3.1.tar.gz +/corosync-1.3.2.tar.gz +/corosync-1.4.0.tar.gz +/corosync-1.4.1.tar.gz +/corosync-1.4.2.tar.gz +/corosync-1.99.1.tar.gz +/corosync-1.99.2.tar.gz +/corosync-1.99.3.tar.gz +/corosync-1.99.4.tar.gz +/corosync-1.99.5.tar.gz +/corosync-1.99.6.tar.gz +/corosync-1.99.7.tar.gz +/corosync-1.99.8.tar.gz +/corosync-1.99.9.tar.gz +/corosync-2.0.0.tar.gz +/corosync-2.0.1.tar.gz +/corosync-2.1.0.tar.gz +/corosync-2.2.0.tar.gz +/corosync-2.3.0.tar.gz +/corosync-2.3.1.tar.gz +/corosync-2.3.2.tar.gz +/corosync-2.3.3.tar.gz +/corosync-2.3.4.tar.gz +/corosync-2.3.5.tar.gz +/corosync-2.3.6.tar.gz +/corosync-2.4.0.tar.gz +/corosync-2.4.1.tar.gz +/corosync-2.4.2.tar.gz +/corosync-2.4.3.tar.gz +/corosync-2.99.1.tar.gz +/corosync-2.99.2.tar.gz +/corosync-2.99.3.tar.gz +/corosync-2.99.4.tar.gz +/corosync-2.99.5.tar.gz +/corosync-3.0.0.tar.gz +/corosync-3.0.1.tar.gz +/corosync-3.0.2.tar.gz +/corosync-3.0.3.tar.gz +/corosync-3.0.4.tar.gz +/corosync-3.1.0.tar.gz +/corosync-3.1.1.tar.gz +/corosync-3.1.2.tar.gz +/corosync-3.1.3.tar.gz +/corosync-3.1.4.tar.gz +/corosync-3.1.5.tar.gz +/corosync-3.1.6.tar.gz +/corosync-3.1.7.tar.gz +/corosync-3.1.8.tar.gz +/corosync-3.1.9.tar.gz +/corosync-3.1.10.tar.gz diff --git a/corosync.rpmlintrc b/corosync.rpmlintrc new file mode 100644 index 0000000..39e1f00 --- /dev/null +++ b/corosync.rpmlintrc @@ -0,0 +1,29 @@ +# Empty %postun +addFilter(r'W: empty-%postun') + +# Spelling error init +addFilter(r'W: spelling-error %description -l en_US init') + +# Spelling error corosync +addFilter(r'W: spelling-error .* (C|c)orosync') + +# Spelling error votequorum and subprocesses +addFilter(r'corosync-vqsim\.[^:]+: W: spelling-error .* votequorum') +addFilter(r'corosync-vqsim\.[^:]+: W: spelling-error .* subprocesses') + +# Repeated Corosync +addFilter(r'W: name-repeated-in-summary C Corosync') + +# Explicit lib dependency - knet nss has been requested by QA, +# libxslt may be replaced with xsltproc binary +addFilter(r'corosync\.[^:]+: (E|W): explicit-lib-dependency libknet1-crypto-nss-plugin') +addFilter(r'corosync\.[^:]+: (E|W): explicit-lib-dependency libxslt') + +# Dbus is not config file +addFilter(r'corosync\.[^:]+: (E|W): non-conffile-in-etc /etc/dbus-1/system\.d/corosync-signals\.conf') + +# Logrotate is not requirement +addFilter(r'corosync\.[^:]+: (E|W): missing-dependency-to-logrotate') + +# libcorosync_common.so has no libc call +addFilter(r'corosynclib\.[^:]+: (E|W): library-not-linked-against-libc /usr/lib(64)?/libcorosync_common\.so') diff --git a/corosync.spec b/corosync.spec index f358790..6e04bf1 100644 --- a/corosync.spec +++ b/corosync.spec @@ -1,242 +1,635 @@ -# global alphatag svn1211 +# Conditionals +# Invoke "rpmbuild --without " or "rpmbuild --with " +# to disable or enable specific features +%bcond_with watchdog +%bcond_with monitoring +%bcond_without snmp +%bcond_without dbus +%bcond_without systemd +%bcond_without xmlconf +%bcond_without nozzle +%bcond_without vqsim +%bcond_without runautogen +%bcond_without userflags Name: corosync Summary: The Corosync Cluster Engine and Application Programming Interfaces -Version: 1.2.8 -Release: 1%{?alphatag:.%{alphatag}}%{?dist} -License: BSD -Group: System Environment/Base -URL: http://ftp.corosync.org -Source0: ftp://ftp:user@ftp.corosync.org/downloads/%{name}-%{version}/%{name}-%{version}.tar.gz -Patch0: revision-2770.patch +Version: 3.1.10 +Release: 1%{?dist} +License: BSD-3-Clause +URL: http://corosync.github.io/corosync/ +Source0: https://github.com/%{name}/%{name}/releases/download/v%{version}/%{name}-%{version}.tar.gz # Runtime bits -Requires: corosynclib = %{version}-%{release} -Requires(pre): /usr/sbin/useradd -Requires(post): /sbin/chkconfig -Requires(preun): /sbin/chkconfig -Conflicts: openais <= 0.89, openais-devel <= 0.89 +# The automatic dependency overridden in favor of explicit version lock +Requires: corosynclib%{?_isa} = %{version}-%{release} + +# Support crypto reload +Requires: libknet1 >= 1.18 +# NSS crypto plugin should be always installed +Requires: libknet1-crypto-nss-plugin >= 1.18 # Build bits - -# no InfiniBand stack on s390(x) -%ifarch s390 s390x -%define have_ib 0 +BuildRequires: gcc +BuildRequires: groff +BuildRequires: libqb-devel +BuildRequires: libknet1-devel >= 1.18 +BuildRequires: zlib-devel +%if %{with runautogen} +BuildRequires: autoconf automake libtool +%endif +%if %{with monitoring} +BuildRequires: libstatgrab-devel +%endif +%if %{with snmp} +BuildRequires: net-snmp-devel +%endif +%if %{with dbus} +BuildRequires: dbus-devel +%endif +%if %{with nozzle} +BuildRequires: libnozzle1-devel +%endif +%if %{with systemd} +%{?systemd_requires} +BuildRequires: systemd +BuildRequires: systemd-devel %else -%define have_ib 1 +Requires(post): /sbin/chkconfig +Requires(preun): /sbin/chkconfig %endif - -%define buildtrunk 0 -%{?_with_buildtrunk: %define buildtrunk 1} - -%if %{buildtrunk} -BuildRequires: autoconf automake +%if %{with xmlconf} +Requires: libxslt %endif -BuildRequires: nss-devel -%if %{have_ib} -BuildRequires: libibverbs-devel librdmacm-devel +%if %{with vqsim} +BuildRequires: readline-devel %endif - -BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) +BuildRequires: make +BuildRequires: git %prep -%setup -q -n %{name}-%{version} -%patch0 +%autosetup -S git_am %build -%if %{buildtrunk} +%if %{with runautogen} ./autogen.sh %endif -%if %{have_ib} -export ibverbs_CFLAGS=-I/usr/include/infiniband \ -export ibverbs_LIBS=-libverbs \ -export rdmacm_CFLAGS=-I/usr/include/rdma \ -export rdmacm_LIBS=-lrdmacm \ -%endif %{configure} \ - --enable-nss \ -%if %{have_ib} - --enable-rdma \ +%if %{with watchdog} + --enable-watchdog \ %endif - --with-initddir=%{_initrddir} +%if %{with monitoring} + --enable-monitoring \ +%endif +%if %{with snmp} + --enable-snmp \ +%endif +%if %{with dbus} + --enable-dbus \ +%endif +%if %{with systemd} + --enable-systemd \ +%endif +%if %{with xmlconf} + --enable-xmlconf \ +%endif +%if %{with nozzle} + --enable-nozzle \ +%endif +%if %{with vqsim} + --enable-vqsim \ +%endif +%if %{with userflags} + --enable-user-flags \ +%endif + --with-initddir=%{_initrddir} \ + --with-systemddir=%{_unitdir} \ + --docdir=%{_docdir} -make %{_smp_mflags} +%make_build %install -rm -rf %{buildroot} +%make_install -make install DESTDIR=%{buildroot} +%if %{with dbus} +mkdir -p -m 0700 %{buildroot}/%{_sysconfdir}/dbus-1/system.d +install -m 644 %{_builddir}/%{name}-%{version}/conf/corosync-signals.conf %{buildroot}/%{_datadir}/dbus-1/system.d/corosync-signals.conf +%endif ## tree fixup # drop static libs rm -f %{buildroot}%{_libdir}/*.a +rm -f %{buildroot}%{_libdir}/*.la # drop docs and html docs for now rm -rf %{buildroot}%{_docdir}/* - -%clean -rm -rf %{buildroot} +# /etc/sysconfig/corosync-notifyd +mkdir -p %{buildroot}%{_sysconfdir}/sysconfig +install -m 644 tools/corosync-notifyd.sysconfig.example \ + %{buildroot}%{_sysconfdir}/sysconfig/corosync-notifyd +# /etc/sysconfig/corosync +install -m 644 init/corosync.sysconfig.example \ + %{buildroot}%{_sysconfdir}/sysconfig/corosync %description This package contains the Corosync Cluster Engine Executive, several default APIs and libraries, default configuration files, and an init script. %post +%if %{with systemd} && 0%{?systemd_post:1} +%systemd_post corosync.service +%else if [ $1 -eq 1 ]; then /sbin/chkconfig --add corosync || : fi +%endif %preun +%if %{with systemd} && 0%{?systemd_preun:1} +%systemd_preun corosync.service +%else if [ $1 -eq 0 ]; then /sbin/service corosync stop &>/dev/null || : /sbin/chkconfig --del corosync || : fi +%endif + +%postun +%if %{with systemd} && 0%{?systemd_postun:1} +%systemd_postun corosync.service +%endif %files -%defattr(-,root,root,-) -%doc LICENSE SECURITY +%doc LICENSE %{_sbindir}/corosync %{_sbindir}/corosync-keygen -%{_sbindir}/corosync-objctl +%{_sbindir}/corosync-cmapctl %{_sbindir}/corosync-cfgtool -%{_sbindir}/corosync-fplay -%{_sbindir}/corosync-pload %{_sbindir}/corosync-cpgtool %{_sbindir}/corosync-quorumtool +%{_sbindir}/corosync-notifyd +%{_bindir}/corosync-blackbox +%if %{with xmlconf} +%{_bindir}/corosync-xmlproc +%dir %{_datadir}/corosync +%{_datadir}/corosync/xml2conf.xsl +%{_mandir}/man8/corosync-xmlproc.8* +%{_mandir}/man5/corosync.xml.5* +%endif %dir %{_sysconfdir}/corosync -%dir %{_sysconfdir}/corosync/service.d %dir %{_sysconfdir}/corosync/uidgid.d %config(noreplace) %{_sysconfdir}/corosync/corosync.conf.example +%config(noreplace) %{_sysconfdir}/sysconfig/corosync-notifyd +%config(noreplace) %{_sysconfdir}/sysconfig/corosync +%config(noreplace) %{_sysconfdir}/logrotate.d/corosync +%if %{with dbus} +%{_datadir}/dbus-1/system.d/corosync-signals.conf +%endif +%if %{with snmp} +%{_datadir}/snmp/mibs/COROSYNC-MIB.txt +%endif +%if %{with systemd} +%{_unitdir}/corosync.service +%{_unitdir}/corosync-notifyd.service +%else %{_initrddir}/corosync -%dir %{_libexecdir}/lcrso -%{_libexecdir}/lcrso/coroparse.lcrso -%{_libexecdir}/lcrso/objdb.lcrso -%{_libexecdir}/lcrso/service_cfg.lcrso -%{_libexecdir}/lcrso/service_cpg.lcrso -%{_libexecdir}/lcrso/service_evs.lcrso -%{_libexecdir}/lcrso/service_confdb.lcrso -%{_libexecdir}/lcrso/service_pload.lcrso -%{_libexecdir}/lcrso/quorum_votequorum.lcrso -%{_libexecdir}/lcrso/quorum_testquorum.lcrso -%{_libexecdir}/lcrso/vsf_quorum.lcrso -%{_libexecdir}/lcrso/vsf_ykd.lcrso +%{_initrddir}/corosync-notifyd +%endif +%if %{without systemd} %dir %{_localstatedir}/lib/corosync %dir %{_localstatedir}/log/cluster -%{_mandir}/man8/corosync_overview.8* +%endif +%{_mandir}/man7/corosync_overview.7* %{_mandir}/man8/corosync.8* %{_mandir}/man8/corosync-blackbox.8* -%{_mandir}/man8/corosync-objctl.8* +%{_mandir}/man8/corosync-cmapctl.8* %{_mandir}/man8/corosync-keygen.8* %{_mandir}/man8/corosync-cfgtool.8* %{_mandir}/man8/corosync-cpgtool.8* -%{_mandir}/man8/corosync-fplay.8* -%{_mandir}/man8/corosync-pload.8* +%{_mandir}/man8/corosync-notifyd.8* %{_mandir}/man8/corosync-quorumtool.8* %{_mandir}/man5/corosync.conf.5* +%{_mandir}/man5/votequorum.5* +%{_mandir}/man7/cmap_keys.7* +# library +# %package -n corosynclib Summary: The Corosync Cluster Engine Libraries -Group: System Environment/Libraries -Requires: %{name} = %{version}-%{release} %description -n corosynclib This package contains corosync libraries. %files -n corosynclib -%defattr(-,root,root,-) %doc LICENSE %{_libdir}/libcfg.so.* %{_libdir}/libcpg.so.* -%{_libdir}/libconfdb.so.* -%{_libdir}/libevs.so.* -%{_libdir}/libtotem_pg.so.* -%{_libdir}/liblogsys.so.* -%{_libdir}/libcoroipcc.so.* -%{_libdir}/libcoroipcs.so.* +%{_libdir}/libcmap.so.* %{_libdir}/libquorum.so.* %{_libdir}/libvotequorum.so.* -%{_libdir}/libpload.so.* %{_libdir}/libsam.so.* +%{_libdir}/libcorosync_common.so.* -%post -n corosynclib -p /sbin/ldconfig - -%postun -n corosynclib -p /sbin/ldconfig +%ldconfig_scriptlets -n corosynclib %package -n corosynclib-devel Summary: The Corosync Cluster Engine Development Kit -Group: Development/Libraries -Requires: corosynclib = %{version}-%{release} +Requires: corosynclib%{?_isa} = %{version}-%{release} Requires: pkgconfig -Provides: corosync-devel = %{version} -Obsoletes: corosync-devel < 0.92-7 +Provides: corosync-devel = %{version}-%{release} +Provides: corosync-devel%{?_isa} = %{version}-%{release} %description -n corosynclib-devel This package contains include files and man pages used to develop using The Corosync Cluster Engine APIs. %files -n corosynclib-devel -%defattr(-,root,root,-) -%doc LICENSE README.devmap +%doc LICENSE %dir %{_includedir}/corosync/ -%{_includedir}/corosync/cs_config.h %{_includedir}/corosync/corodefs.h -%{_includedir}/corosync/coroipc_types.h -%{_includedir}/corosync/coroipcs.h -%{_includedir}/corosync/coroipcc.h %{_includedir}/corosync/cfg.h -%{_includedir}/corosync/confdb.h +%{_includedir}/corosync/cmap.h %{_includedir}/corosync/corotypes.h %{_includedir}/corosync/cpg.h -%{_includedir}/corosync/evs.h %{_includedir}/corosync/hdb.h -%{_includedir}/corosync/list.h -%{_includedir}/corosync/mar_gen.h %{_includedir}/corosync/sam.h -%{_includedir}/corosync/swab.h %{_includedir}/corosync/quorum.h %{_includedir}/corosync/votequorum.h -%dir %{_includedir}/corosync/totem/ -%{_includedir}/corosync/totem/coropoll.h -%{_includedir}/corosync/totem/totem.h -%{_includedir}/corosync/totem/totemip.h -%{_includedir}/corosync/totem/totempg.h -%dir %{_includedir}/corosync/lcr/ -%{_includedir}/corosync/lcr/lcr_ckpt.h -%{_includedir}/corosync/lcr/lcr_comp.h -%{_includedir}/corosync/lcr/lcr_ifact.h -%dir %{_includedir}/corosync/engine -%{_includedir}/corosync/engine/config.h -%{_includedir}/corosync/engine/coroapi.h -%{_includedir}/corosync/engine/logsys.h -%{_includedir}/corosync/engine/objdb.h -%{_includedir}/corosync/engine/quorum.h %{_libdir}/libcfg.so %{_libdir}/libcpg.so -%{_libdir}/libconfdb.so -%{_libdir}/libevs.so -%{_libdir}/libtotem_pg.so -%{_libdir}/liblogsys.so -%{_libdir}/libcoroipcc.so -%{_libdir}/libcoroipcs.so +%{_libdir}/libcmap.so %{_libdir}/libquorum.so %{_libdir}/libvotequorum.so -%{_libdir}/libpload.so %{_libdir}/libsam.so +%{_libdir}/libcorosync_common.so %{_libdir}/pkgconfig/*.pc %{_mandir}/man3/cpg_*3* -%{_mandir}/man3/evs_*3* -%{_mandir}/man3/confdb_*3* +%{_mandir}/man3/quorum_*3* %{_mandir}/man3/votequorum_*3* %{_mandir}/man3/sam_*3* -%{_mandir}/man8/cpg_overview.8* -%{_mandir}/man8/evs_overview.8* -%{_mandir}/man8/confdb_overview.8* -%{_mandir}/man8/logsys_overview.8* -%{_mandir}/man8/votequorum_overview.8* -%{_mandir}/man8/coroipc_overview.8* -%{_mandir}/man8/sam_overview.8* +%{_mandir}/man3/cmap_*3* + +%if %{with vqsim} +%package -n corosync-vqsim +Summary: The Corosync Cluster Engine - Votequorum Simulator +Requires: corosynclib%{?_isa} = %{version}-%{release} +Requires: pkgconfig + +%description -n corosync-vqsim +A command-line simulator for the corosync votequorum subsystem. +It uses the same code as the corosync quorum system but forks +them into subprocesses to simulate nodes. +Nodes can be added and removed as well as partitioned (to simulate +network splits) + +%files -n corosync-vqsim +%doc LICENSE +%{_bindir}/corosync-vqsim +%{_mandir}/man8/corosync-vqsim.8* +%endif %changelog +* Sat Nov 15 2025 Jan Friesse - 3.1.10-1 +- New upstream release + +* Wed Jul 23 2025 Fedora Release Engineering - 3.1.9-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + +* Mon Jun 16 2025 Jan Friesse - 3.1.9-4 +- exec: Add support for env STATE_DIRECTORY +- init: Use LogsDirectory in systemd unit file + +* Wed Mar 26 2025 Jan Friesse - 3.1.9-3 +- totemsrp: Check size of orf_token msg + (fixes CVE-2025-30472) + +* Thu Jan 16 2025 Fedora Release Engineering - 3.1.9-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + +* Fri Nov 15 2024 Jan Friesse - 3.1.9-1 +- New upstream release + +* Wed Jul 17 2024 Fedora Release Engineering - 3.1.8-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Wed Jan 24 2024 Fedora Release Engineering - 3.1.8-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Fri Jan 19 2024 Fedora Release Engineering - 3.1.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Wed Nov 15 2023 Jan Friesse - 3.1.8-1 +- New upstream release + +* Wed Jul 19 2023 Fedora Release Engineering - 3.1.7-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Tue Jun 06 2023 Jan Friesse - 3.1.7-3 +- migrated to SPDX license + +* Thu Jan 19 2023 Fedora Release Engineering - 3.1.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Tue Nov 15 2022 Jan Friesse - 3.1.7-1 +- New upstream release + +* Wed Jul 20 2022 Fedora Release Engineering - 3.1.6-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed Mar 30 2022 Jan Friesse - 3.1.6-3 +- Use copytruncate method for logrotate + +* Wed Jan 19 2022 Fedora Release Engineering - 3.1.6-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Mon Nov 15 2021 Jan Friesse - 3.1.6-1 +- New upstream release + +* Wed Aug 04 2021 Jan Friesse - 3.1.5-1 +- New upstream release + +* Wed Jul 21 2021 Fedora Release Engineering - 3.1.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Thu Jun 03 2021 Jan Friesse - 3.1.4-1 +- New upstream release + +* Fri May 21 2021 Jan Friesse - 3.1.3-1 +- New upstream release + +* Tue Apr 06 2021 Jan Friesse - 3.1.2-1 +- New upstream release + +* Wed Mar 31 2021 Jan Friesse - 3.1.1-1 +- New upstream release + +* Tue Jan 26 2021 Fedora Release Engineering - 3.1.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Mon Nov 02 2020 Jan Friesse - 3.1.0-2 +- Add isa version of corosync-devel +- Add release to corosync-devel version to match autogenerated + corosynclib-devel provides + +* Tue Oct 20 2020 Jan Friesse - 3.1.0-1 +- New upstream release + +* Thu Aug 27 2020 Josef Řídký - 3.0.4-6 +- Rebuilt for new net-snmp release + +* Mon Jul 27 2020 Fedora Release Engineering - 3.0.4-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 13 2020 Tom Stellard - 3.0.4-4 +- Use make macros +- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro + +* Wed May 13 2020 Jan Friesse - 3.0.4-3 +- Fix typo in the changelog + +* Wed May 13 2020 Jan Friesse - 3.0.4-2 +- Rebuild for new libqb + +* Thu Apr 23 2020 Jan Friesse - 3.0.4-1 +- New upstream release + +* Fri Mar 27 2020 Jan Friesse - 3.0.3-3 +- Add CI tests +- Enable gating + +* Tue Jan 28 2020 Fedora Release Engineering - 3.0.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Mon Nov 25 2019 Jan Friesse - 3.0.3-1 +- New upstream release + +* Wed Jul 24 2019 Fedora Release Engineering - 3.0.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Wed Jun 12 2019 Jan Friesse - 3.0.2-1 +- New upstream release + +* Thu Jan 31 2019 Fedora Release Engineering - 3.0.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Tue Jan 15 2019 Jan Friesse - 3.0.1-1 +- New upstream release + +* Fri Dec 14 2018 Jan Friesse - 3.0.0-1 +- New upstream release + +* Fri Dec 7 2018 Jan Friesse - 2.99.5-1 +- New upstream release + +* Tue Dec 4 2018 Jan Friesse - 2.99.4-2 +- Add libknet1-crypto-nss-plugin dependency + +* Tue Nov 20 2018 Jan Friesse - 2.99.4-1 +- New upstream release + +* Thu Aug 16 2018 Jan Pokorný - 2.99.3-3 +- Rebuild again, since the previous one was so unfortunate it got affected + with binutils (2.31.1-3.fc29) producing non-monotonically increasing + section offsets causing unprepared eu-strip to damage the binary + (related: rhbz#1609577) +- Apply patch to prevent redundancy in systemd journal + +* Tue Jul 24 2018 Adam Williamson - 2.99.3-2 +- Rebuild for new net-snmp + +* Fri Jul 13 2018 Jan Friesse - 2.99.3-1 +- New upstream release + +* Thu Jul 12 2018 Fedora Release Engineering - 2.99.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Mon Apr 30 2018 Jan Friesse - 2.99.2-1 +- New upstream release + +* Fri Mar 16 2018 Jan Friesse - 2.99.1-1 +- New upstream release + +* Wed Feb 07 2018 Fedora Release Engineering - 2.4.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Fri Jan 19 2018 Igor Gnatenko - 2.4.3-2 +- Rebuild to fix upgradepath + +* Fri Oct 20 2017 Jan Friesse - 2.4.3-1 +- New upstream release + +* Mon Oct 09 2017 Troy Dawson - 2.4.2-7 +- Cleanup spec file conditionals + +* Mon Oct 02 2017 Troy Dawson - 2.4.2-6 +- Bump to rebuild on newer binutils + +* Wed Aug 23 2017 Adam Williamson - 2.4.2-5 +- Disable RDMA on 32-bit ARM (#1484155) + +* Wed Aug 02 2017 Fedora Release Engineering - 2.4.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 2.4.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 2.4.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Nov 7 2016 Jan Friesse - 2.4.2-1 +- New upstream release + +* Thu Aug 4 2016 Jan Friesse - 2.4.1-1 +- New upstream release + +* Thu Jun 30 2016 Jan Friesse - 2.4.0-1 +- New upstream release + +* Thu Jun 16 2016 Jan Friesse - 2.3.6-1 +- New upstream release + +* Wed Feb 03 2016 Fedora Release Engineering - 2.3.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jul 01 2015 Jan Friesse - 2.3.5-1 +- New upstream release + +* Wed Jun 17 2015 Fedora Release Engineering - 2.3.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Tue Aug 26 2014 Jan Friesse - 2.3.4-1 +- New upstream release + +* Sat Aug 16 2014 Fedora Release Engineering - 2.3.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jun 07 2014 Fedora Release Engineering - 2.3.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue Jan 14 2014 Jan Friesse - 2.3.3-1 +- New upstream release + +* Mon Sep 16 2013 Jan Friesse - 2.3.2-1 +- New upstream release + +* Mon Aug 19 2013 Jan Friesse 2.3.1-3 +- Resolves: rhbz#998362 + +- Fix scheduler pause-detection timeout (rhbz#998362) +- merge upstream commit 2740cfd1eac60714601c74df2137fe588b607866 (rhbz#998362) + +* Sat Aug 03 2013 Fedora Release Engineering - 2.3.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Jul 10 2013 Jan Friesse - 2.3.1-1 +- New upstream release +- Fix incorrect dates in specfile changelog section + +* Mon Mar 25 2013 Jan Friesse - 2.3.0-3 +- Resolves: rhbz#925185 + +- Run autogen by default + +* Wed Feb 13 2013 Fedora Release Engineering - 2.3.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Fri Jan 18 2013 Jan Friesse - 2.3.0-1 +- New upstream release + +* Wed Dec 12 2012 Jan Friesse - 2.2.0-1 +- New upstream release + +* Thu Oct 11 2012 Jan Friesse - 2.1.0-1 +- New upstream release + +* Fri Aug 3 2012 Steven Dake - 2.0.1-3 +- add groff as a BuildRequires as it is no longer installed in the buildroot + +* Wed Jul 18 2012 Fedora Release Engineering - 2.0.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue May 22 2012 Jan Friesse - 2.0.1-1 +- New upstream release + +* Tue Apr 17 2012 Fabio M. Di Nitto - 2.0.0-2 +- Backport IPCS fix from master (ack by Steven) + +* Tue Apr 10 2012 Jan Friesse - 2.0.0-1 +- New upstream release + +* Thu Apr 05 2012 Karsten Hopp 1.99.9-1.1 +- bump release and rebuild on PPC + +* Tue Mar 27 2012 Jan Friesse - 1.99.9-1 +- New upstream release + +* Fri Mar 16 2012 Jan Friesse - 1.99.8-1 +- New upstream release + +* Tue Mar 6 2012 Jan Friesse - 1.99.7-1 +- New upstream release + +* Tue Feb 28 2012 Jan Friesse - 1.99.6-1 +- New upstream release + +* Wed Feb 22 2012 Jan Friesse - 1.99.5-1 +- New upstream release + +* Tue Feb 14 2012 Jan Friesse - 1.99.4-1 +- New upstream release + +* Tue Feb 14 2012 Jan Friesse - 1.99.3-1 +- New upstream release + +* Tue Feb 7 2012 Fabio M. Di Nitto - 1.99.2-1 +- New upstream release +- Re-enable xmlconfig bits +- Ship cmap man pages +- Add workaround to usrmove breakage!! + +* Thu Feb 2 2012 Fabio M. Di Nitto - 1.99.1-2 +- Add proper Obsoltes on openais/cman/clusterlib + +* Wed Feb 1 2012 Fabio M. Di Nitto - 1.99.1-1 +- New upstream release +- Temporary disable xml config (broken upstream tarball) + +* Tue Jan 24 2012 Jan Friesse - 1.99.0-1 +- New upstream release + +* Thu Jan 12 2012 Fedora Release Engineering - 1.4.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Oct 06 2011 Jan Friesse - 1.4.2-1 +- New upstream release + +* Thu Sep 08 2011 Jan Friesse - 1.4.1-2 +- Add upstream fixes + +* Tue Jul 26 2011 Jan Friesse - 1.4.1-1 +- New upstream release + +* Wed Jul 20 2011 Jan Friesse - 1.4.0-2 +- Change attributes of cluster log directory + +* Tue Jul 19 2011 Jan Friesse - 1.4.0-1 +- New upstream release +- Resync spec file with upstream changes + +* Fri Jul 08 2011 Jan Friesse - 1.3.2-1 +- New upstream release + +* Tue May 10 2011 Fabio M. Di Nitto - 1.3.1-1 +- New upstream release + +* Tue Feb 08 2011 Fedora Release Engineering - 1.3.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Thu Dec 2 2010 Fabio M. Di Nitto - 1.3.0-1 +- New upstream release +- drop upstream patch revision-2770.patch now included in release +- update spec file to ship corosync-blackbox + * Thu Sep 2 2010 Fabio M. Di Nitto - 1.2.8-1 - New upstream release @@ -267,7 +660,7 @@ The Corosync Cluster Engine APIs. - New upstream release - Use global instead of define - Update Source0 url -- Use more %name macro around +- Use more name macro around - Cleanup install section. Init script is now installed by upstream - Cleanup whitespace - Don't deadlock between package upgrade and corosync condrestart @@ -418,7 +811,7 @@ The Corosync Cluster Engine APIs. * Mon Oct 13 2008 Dennis Gilmore - 0.92-3 - remove ExclusiveArch line -* Fri Sep 24 2008 Steven Dake - 0.92-2 +* Wed Sep 24 2008 Steven Dake - 0.92-2 - Add conflicts for openais and openais-devel packages older then 0.90. * Wed Sep 24 2008 Steven Dake - 0.92-1 diff --git a/gating.yaml b/gating.yaml new file mode 100644 index 0000000..f075ad7 --- /dev/null +++ b/gating.yaml @@ -0,0 +1,15 @@ +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_testing +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} + +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_stable +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} diff --git a/revision-2770.patch b/revision-2770.patch deleted file mode 100644 index 766c980..0000000 --- a/revision-2770.patch +++ /dev/null @@ -1,811 +0,0 @@ -Index: include/corosync/ipc_cpg.h -=================================================================== ---- include/corosync/ipc_cpg.h (revision 2769) -+++ include/corosync/ipc_cpg.h (revision 2770) -@@ -65,6 +65,7 @@ - MESSAGE_RES_CPG_ITERATIONNEXT = 10, - MESSAGE_RES_CPG_ITERATIONFINALIZE = 11, - MESSAGE_RES_CPG_FINALIZE = 12, -+ MESSAGE_RES_CPG_TOTEM_CONFCHG_CALLBACK = 13, - }; - - enum lib_cpg_confchg_reason { -@@ -149,10 +150,24 @@ - marshall_from_mar_cpg_name_t (&dest->group, &src->group); - }; - -+typedef struct { -+ mar_uint32_t nodeid __attribute__((aligned(8))); -+ mar_uint64_t seq __attribute__((aligned(8))); -+} mar_cpg_ring_id_t; -+ -+static inline void marshall_from_mar_cpg_ring_id_t ( -+ struct cpg_ring_id *dest, -+ const mar_cpg_ring_id_t *src) -+{ -+ dest->nodeid = src->nodeid; -+ dest->seq = src->seq; -+} -+ - struct req_lib_cpg_join { - coroipc_request_header_t header __attribute__((aligned(8))); - mar_cpg_name_t group_name __attribute__((aligned(8))); - mar_uint32_t pid __attribute__((aligned(8))); -+ mar_uint32_t flags __attribute__((aligned(8))); - }; - - struct res_lib_cpg_join { -@@ -238,6 +253,13 @@ - // struct cpg_address joined_list[]; - }; - -+struct res_lib_cpg_totem_confchg_callback { -+ coroipc_response_header_t header __attribute__((aligned(8))); -+ mar_cpg_ring_id_t ring_id __attribute__((aligned(8))); -+ mar_uint32_t member_list_entries __attribute__((aligned(8))); -+ mar_uint32_t member_list[]; -+}; -+ - struct req_lib_cpg_leave { - coroipc_request_header_t header __attribute__((aligned(8))); - mar_cpg_name_t group_name __attribute__((aligned(8))); -Index: include/corosync/cpg.h -=================================================================== ---- include/corosync/cpg.h (revision 2769) -+++ include/corosync/cpg.h (revision 2770) -@@ -78,6 +78,10 @@ - CPG_ITERATION_ALL = 3, - } cpg_iteration_type_t; - -+typedef enum { -+ CPG_MODEL_V1 = 1, -+} cpg_model_t; -+ - struct cpg_address { - uint32_t nodeid; - uint32_t pid; -@@ -98,6 +102,11 @@ - uint32_t pid; - }; - -+struct cpg_ring_id { -+ uint32_t nodeid; -+ uint64_t seq; -+}; -+ - typedef void (*cpg_deliver_fn_t) ( - cpg_handle_t handle, - const struct cpg_name *group_name, -@@ -117,11 +126,32 @@ - const struct cpg_address *left_list, size_t left_list_entries, - const struct cpg_address *joined_list, size_t joined_list_entries); - -+typedef void (*cpg_totem_confchg_fn_t) ( -+ cpg_handle_t handle, -+ struct cpg_ring_id ring_id, -+ uint32_t member_list_entries, -+ const uint32_t *member_list); -+ - typedef struct { - cpg_deliver_fn_t cpg_deliver_fn; - cpg_confchg_fn_t cpg_confchg_fn; - } cpg_callbacks_t; - -+typedef struct { -+ cpg_model_t model; -+} cpg_model_data_t; -+ -+#define CPG_MODEL_V1_DELIVER_INITIAL_TOTEM_CONF 0x01 -+ -+typedef struct { -+ cpg_model_t model; -+ cpg_deliver_fn_t cpg_deliver_fn; -+ cpg_confchg_fn_t cpg_confchg_fn; -+ cpg_totem_confchg_fn_t cpg_totem_confchg_fn; -+ unsigned int flags; -+} cpg_model_v1_data_t; -+ -+ - /** @} */ - - /* -@@ -132,6 +162,15 @@ - cpg_callbacks_t *callbacks); - - /* -+ * Create a new cpg connection, initialize with model -+ */ -+cs_error_t cpg_model_initialize ( -+ cpg_handle_t *handle, -+ cpg_model_t model, -+ cpg_model_data_t *model_data, -+ void *context); -+ -+/* - * Close the cpg handle - */ - cs_error_t cpg_finalize ( -Index: services/cpg.c -=================================================================== ---- services/cpg.c (revision 2769) -+++ services/cpg.c (revision 2770) -@@ -133,6 +133,8 @@ - mar_cpg_name_t group_name; - uint32_t pid; - enum cpd_state cpd_state; -+ unsigned int flags; -+ int initial_totem_conf_sent; - struct list_head list; - struct list_head iteration_instance_list_head; - }; -@@ -160,6 +162,8 @@ - - static enum cpg_sync_state my_sync_state = CPGSYNC_DOWNLIST; - -+static mar_cpg_ring_id_t last_sync_ring_id; -+ - struct process_info { - unsigned int nodeid; - uint32_t pid; -@@ -255,6 +259,11 @@ - - static void cpg_sync_abort (void); - -+static int notify_lib_totem_membership ( -+ void *conn, -+ int member_list_entries, -+ const unsigned int *member_list); -+ - /* - * Library Handler Definition - */ -@@ -432,6 +441,9 @@ - sizeof (unsigned int)); - my_member_list_entries = member_list_entries; - -+ last_sync_ring_id.nodeid = ring_id->rep.nodeid; -+ last_sync_ring_id.seq = ring_id->seq; -+ - for (i = 0; i < my_member_list_entries; i++) { - if (my_member_list[i] < lowest_nodeid) { - lowest_nodeid = my_member_list[i]; -@@ -482,14 +494,51 @@ - memcpy (my_old_member_list, my_member_list, - my_member_list_entries * sizeof (unsigned int)); - my_old_member_list_entries = my_member_list_entries; -+ -+ notify_lib_totem_membership (NULL, my_member_list_entries, my_member_list); - } - - static void cpg_sync_abort (void) - { - } - -+static int notify_lib_totem_membership ( -+ void *conn, -+ int member_list_entries, -+ const unsigned int *member_list) -+{ -+ struct list_head *iter; -+ char *buf; -+ int size; -+ struct res_lib_cpg_totem_confchg_callback *res; - -+ size = sizeof(struct res_lib_cpg_totem_confchg_callback) + -+ sizeof(mar_uint32_t) * (member_list_entries); -+ buf = alloca(size); -+ if (!buf) -+ return CPG_ERR_LIBRARY; - -+ res = (struct res_lib_cpg_totem_confchg_callback *)buf; -+ res->member_list_entries = member_list_entries; -+ res->header.size = size; -+ res->header.id = MESSAGE_RES_CPG_TOTEM_CONFCHG_CALLBACK; -+ res->header.error = CS_OK; -+ -+ memcpy (&res->ring_id, &last_sync_ring_id, sizeof (mar_cpg_ring_id_t)); -+ memcpy (res->member_list, member_list, res->member_list_entries * sizeof (mar_uint32_t)); -+ -+ if (conn == NULL) { -+ for (iter = cpg_pd_list_head.next; iter != &cpg_pd_list_head; iter = iter->next) { -+ struct cpg_pd *cpg_pd = list_entry (iter, struct cpg_pd, list); -+ api->ipc_dispatch_send (cpg_pd->conn, buf, size); -+ } -+ } else { -+ api->ipc_dispatch_send (conn, buf, size); -+ } -+ -+ return CPG_OK; -+} -+ - static int notify_lib_joinlist( - const mar_cpg_name_t *group_name, - void *conn, -@@ -604,6 +653,20 @@ - } - } - -+ -+ /* -+ * Traverse thru cpds and send totem membership for cpd, where it is not send yet -+ */ -+ for (iter = cpg_pd_list_head.next; iter != &cpg_pd_list_head; iter = iter->next) { -+ struct cpg_pd *cpd = list_entry (iter, struct cpg_pd, list); -+ -+ if ((cpd->flags & CPG_MODEL_V1_DELIVER_INITIAL_TOTEM_CONF) && (cpd->initial_totem_conf_sent == 0)) { -+ cpd->initial_totem_conf_sent = 1; -+ -+ notify_lib_totem_membership (cpd->conn, my_old_member_list_entries, my_old_member_list); -+ } -+ } -+ - return CPG_OK; - } - -@@ -1093,6 +1156,7 @@ - error = CPG_OK; - cpd->cpd_state = CPD_STATE_JOIN_STARTED; - cpd->pid = req_lib_cpg_join->pid; -+ cpd->flags = req_lib_cpg_join->flags; - memcpy (&cpd->group_name, &req_lib_cpg_join->group_name, - sizeof (cpd->group_name)); - -Index: lib/cpg.c -=================================================================== ---- lib/cpg.c (revision 2769) -+++ lib/cpg.c (revision 2770) -@@ -62,8 +62,11 @@ - struct cpg_inst { - hdb_handle_t handle; - int finalize; -- cpg_callbacks_t callbacks; - void *context; -+ union { -+ cpg_model_data_t model_data; -+ cpg_model_v1_data_t model_v1_data; -+ }; - struct list_head iteration_list_head; - }; - -@@ -118,9 +121,32 @@ - cpg_handle_t *handle, - cpg_callbacks_t *callbacks) - { -+ cpg_model_v1_data_t model_v1_data; -+ -+ memset (&model_v1_data, 0, sizeof (cpg_model_v1_data_t)); -+ -+ if (callbacks) { -+ model_v1_data.cpg_deliver_fn = callbacks->cpg_deliver_fn; -+ model_v1_data.cpg_confchg_fn = callbacks->cpg_confchg_fn; -+ } -+ -+ return (cpg_model_initialize (handle, CPG_MODEL_V1, (cpg_model_data_t *)&model_v1_data, NULL)); -+} -+ -+cs_error_t cpg_model_initialize ( -+ cpg_handle_t *handle, -+ cpg_model_t model, -+ cpg_model_data_t *model_data, -+ void *context) -+{ - cs_error_t error; - struct cpg_inst *cpg_inst; - -+ if (model != CPG_MODEL_V1) { -+ error = CPG_ERR_INVALID_PARAM; -+ goto error_no_destroy; -+ } -+ - error = hdb_error_to_cs (hdb_handle_create (&cpg_handle_t_db, sizeof (struct cpg_inst), handle)); - if (error != CS_OK) { - goto error_no_destroy; -@@ -142,10 +168,26 @@ - goto error_put_destroy; - } - -- if (callbacks) { -- memcpy (&cpg_inst->callbacks, callbacks, sizeof (cpg_callbacks_t)); -+ if (model_data != NULL) { -+ switch (model) { -+ case CPG_MODEL_V1: -+ memcpy (&cpg_inst->model_v1_data, model_data, sizeof (cpg_model_v1_data_t)); -+ if ((cpg_inst->model_v1_data.flags & ~(CPG_MODEL_V1_DELIVER_INITIAL_TOTEM_CONF)) != 0) { -+ error = CS_ERR_INVALID_PARAM; -+ -+ goto error_destroy; -+ } -+ break; -+ default: -+ error = CS_ERR_LIBRARY; -+ goto error_destroy; -+ break; -+ } - } - -+ cpg_inst->model_data.model = model; -+ cpg_inst->context = context; -+ - list_init(&cpg_inst->iteration_list_head); - - hdb_handle_put (&cpg_handle_t_db, *handle); -@@ -283,7 +325,8 @@ - struct cpg_inst *cpg_inst; - struct res_lib_cpg_confchg_callback *res_cpg_confchg_callback; - struct res_lib_cpg_deliver_callback *res_cpg_deliver_callback; -- cpg_callbacks_t callbacks; -+ struct res_lib_cpg_totem_confchg_callback *res_cpg_totem_confchg_callback; -+ struct cpg_inst cpg_inst_copy; - coroipc_response_header_t *dispatch_data; - struct cpg_address member_list[CPG_MEMBERS_MAX]; - struct cpg_address left_list[CPG_MEMBERS_MAX]; -@@ -292,6 +335,8 @@ - mar_cpg_address_t *left_list_start; - mar_cpg_address_t *joined_list_start; - unsigned int i; -+ struct cpg_ring_id ring_id; -+ uint32_t totem_member_list[CPG_MEMBERS_MAX]; - - error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, (void *)&cpg_inst)); - if (error != CS_OK) { -@@ -332,74 +377,96 @@ - * A risk of this dispatch method is that the callback routines may - * operate at the same time that cpgFinalize has been called. - */ -- memcpy (&callbacks, &cpg_inst->callbacks, sizeof (cpg_callbacks_t)); -- /* -- * Dispatch incoming message -- */ -- switch (dispatch_data->id) { -- case MESSAGE_RES_CPG_DELIVER_CALLBACK: -- if (callbacks.cpg_deliver_fn == NULL) { -+ memcpy (&cpg_inst_copy, cpg_inst, sizeof (struct cpg_inst)); -+ -+ switch (cpg_inst_copy.model_data.model) { -+ case CPG_MODEL_V1: -+ /* -+ * Dispatch incoming message -+ */ -+ switch (dispatch_data->id) { -+ case MESSAGE_RES_CPG_DELIVER_CALLBACK: -+ if (cpg_inst_copy.model_v1_data.cpg_deliver_fn == NULL) { -+ break; -+ } -+ -+ res_cpg_deliver_callback = (struct res_lib_cpg_deliver_callback *)dispatch_data; -+ -+ marshall_from_mar_cpg_name_t ( -+ &group_name, -+ &res_cpg_deliver_callback->group_name); -+ -+ cpg_inst_copy.model_v1_data.cpg_deliver_fn (handle, -+ &group_name, -+ res_cpg_deliver_callback->nodeid, -+ res_cpg_deliver_callback->pid, -+ &res_cpg_deliver_callback->message, -+ res_cpg_deliver_callback->msglen); - break; -- } - -- res_cpg_deliver_callback = (struct res_lib_cpg_deliver_callback *)dispatch_data; -+ case MESSAGE_RES_CPG_CONFCHG_CALLBACK: -+ if (cpg_inst_copy.model_v1_data.cpg_confchg_fn == NULL) { -+ break; -+ } - -- marshall_from_mar_cpg_name_t ( -- &group_name, -- &res_cpg_deliver_callback->group_name); -+ res_cpg_confchg_callback = (struct res_lib_cpg_confchg_callback *)dispatch_data; - -- callbacks.cpg_deliver_fn (handle, -- &group_name, -- res_cpg_deliver_callback->nodeid, -- res_cpg_deliver_callback->pid, -- &res_cpg_deliver_callback->message, -- res_cpg_deliver_callback->msglen); -- break; -+ for (i = 0; i < res_cpg_confchg_callback->member_list_entries; i++) { -+ marshall_from_mar_cpg_address_t (&member_list[i], -+ &res_cpg_confchg_callback->member_list[i]); -+ } -+ left_list_start = res_cpg_confchg_callback->member_list + -+ res_cpg_confchg_callback->member_list_entries; -+ for (i = 0; i < res_cpg_confchg_callback->left_list_entries; i++) { -+ marshall_from_mar_cpg_address_t (&left_list[i], -+ &left_list_start[i]); -+ } -+ joined_list_start = res_cpg_confchg_callback->member_list + -+ res_cpg_confchg_callback->member_list_entries + -+ res_cpg_confchg_callback->left_list_entries; -+ for (i = 0; i < res_cpg_confchg_callback->joined_list_entries; i++) { -+ marshall_from_mar_cpg_address_t (&joined_list[i], -+ &joined_list_start[i]); -+ } -+ marshall_from_mar_cpg_name_t ( -+ &group_name, -+ &res_cpg_confchg_callback->group_name); - -- case MESSAGE_RES_CPG_CONFCHG_CALLBACK: -- if (callbacks.cpg_confchg_fn == NULL) { -+ cpg_inst_copy.model_v1_data.cpg_confchg_fn (handle, -+ &group_name, -+ member_list, -+ res_cpg_confchg_callback->member_list_entries, -+ left_list, -+ res_cpg_confchg_callback->left_list_entries, -+ joined_list, -+ res_cpg_confchg_callback->joined_list_entries); -+ - break; -- } -+ case MESSAGE_RES_CPG_TOTEM_CONFCHG_CALLBACK: -+ if (cpg_inst_copy.model_v1_data.cpg_totem_confchg_fn == NULL) { -+ break; -+ } - -- res_cpg_confchg_callback = (struct res_lib_cpg_confchg_callback *)dispatch_data; -+ res_cpg_totem_confchg_callback = (struct res_lib_cpg_totem_confchg_callback *)dispatch_data; - -- for (i = 0; i < res_cpg_confchg_callback->member_list_entries; i++) { -- marshall_from_mar_cpg_address_t (&member_list[i], -- &res_cpg_confchg_callback->member_list[i]); -- } -- left_list_start = res_cpg_confchg_callback->member_list + -- res_cpg_confchg_callback->member_list_entries; -- for (i = 0; i < res_cpg_confchg_callback->left_list_entries; i++) { -- marshall_from_mar_cpg_address_t (&left_list[i], -- &left_list_start[i]); -- } -- joined_list_start = res_cpg_confchg_callback->member_list + -- res_cpg_confchg_callback->member_list_entries + -- res_cpg_confchg_callback->left_list_entries; -- for (i = 0; i < res_cpg_confchg_callback->joined_list_entries; i++) { -- marshall_from_mar_cpg_address_t (&joined_list[i], -- &joined_list_start[i]); -- } -- marshall_from_mar_cpg_name_t ( -- &group_name, -- &res_cpg_confchg_callback->group_name); -+ marshall_from_mar_cpg_ring_id_t (&ring_id, &res_cpg_totem_confchg_callback->ring_id); -+ for (i = 0; i < res_cpg_totem_confchg_callback->member_list_entries; i++) { -+ totem_member_list[i] = res_cpg_totem_confchg_callback->member_list[i]; -+ } - -- callbacks.cpg_confchg_fn (handle, -- &group_name, -- member_list, -- res_cpg_confchg_callback->member_list_entries, -- left_list, -- res_cpg_confchg_callback->left_list_entries, -- joined_list, -- res_cpg_confchg_callback->joined_list_entries); -- break; -- -- default: -- coroipcc_dispatch_put (cpg_inst->handle); -- error = CS_ERR_LIBRARY; -- goto error_put; -- break; -- } -+ cpg_inst_copy.model_v1_data.cpg_totem_confchg_fn (handle, -+ ring_id, -+ res_cpg_totem_confchg_callback->member_list_entries, -+ totem_member_list); -+ break; -+ default: -+ coroipcc_dispatch_put (cpg_inst->handle); -+ error = CS_ERR_LIBRARY; -+ goto error_put; -+ break; -+ } /* - switch (dispatch_data->id) */ -+ break; /* case CPG_MODEL_V1 */ -+ } /* - switch (cpg_inst_copy.model_data.model) */ - coroipcc_dispatch_put (cpg_inst->handle); - - /* -@@ -434,6 +501,14 @@ - req_lib_cpg_join.header.size = sizeof (struct req_lib_cpg_join); - req_lib_cpg_join.header.id = MESSAGE_REQ_CPG_JOIN; - req_lib_cpg_join.pid = getpid(); -+ req_lib_cpg_join.flags = 0; -+ -+ switch (cpg_inst->model_data.model) { -+ case CPG_MODEL_V1: -+ req_lib_cpg_join.flags = cpg_inst->model_v1_data.flags; -+ break; -+ } -+ - marshall_to_mar_cpg_name_t (&req_lib_cpg_join.group_name, - group); - -Index: lib/libcpg.verso -=================================================================== ---- lib/libcpg.verso (revision 2769) -+++ lib/libcpg.verso (revision 2770) -@@ -1 +1 @@ --4.0.1 -+4.1.0 -Index: man/cpg_initialize.3 -=================================================================== ---- man/cpg_initialize.3 (revision 2769) -+++ man/cpg_initialize.3 (revision 2770) -@@ -41,7 +41,10 @@ - .SH DESCRIPTION - The - .B cpg_initialize --function is used to initialize a connection to the closed process groups API. -+function is used to initialize a connection to the closed process groups API. This function is deprecated -+and -+.B cpg_model_initialize -+should be used in newly written code. - .PP - Each application may have several connections to the CPG API. Each application - uses the -@@ -167,5 +170,6 @@ - .BR cpg_context_get (3) - .BR cpg_context_set (3) - .BR cpg_local_get (3) -+.BR cpg_model_initialize (3) - - .PP -Index: man/cpg_overview.8 -=================================================================== ---- man/cpg_overview.8 (revision 2769) -+++ man/cpg_overview.8 (revision 2770) -@@ -61,6 +61,7 @@ - .BR cpg_join (3), - .BR cpg_leave (3), - .BR cpg_mcast_joined (3), -+.BR cpg_model_initialize (3), - .BR cpg_membership_get (3) - .BR cpg_zcb_alloc (3) - .BR cpg_zcb_free (3) -Index: man/cpg_model_initialize.3 -=================================================================== ---- man/cpg_model_initialize.3 (revision 0) -+++ man/cpg_model_initialize.3 (revision 2770) -@@ -0,0 +1,231 @@ -+.\"/* -+.\" * Copyright (c) 2010 Red Hat, Inc. -+.\" * -+.\" * All rights reserved. -+.\" * -+.\" * Author: Jan Friesse -+.\" * Author: Christine Caulfield -+.\" * -+.\" * 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. -+.\" */ -+.TH CPG_MODEL_INITIALIZE 3 2010-04-07 "corosync Man Page" "Corosync Cluster Engine Programmer's Manual" -+.SH NAME -+cpg_model_initialize \- Create a new connection to the CPG service -+.SH SYNOPSIS -+.B #include -+.sp -+.BI "cs_error_t cpg_model_initialize(cpg_handle_t *" handle ", cpg_model_t " model ", cpg_model_data_t *" model_data ", void *" context "); -+ -+.SH DESCRIPTION -+The -+.B cpg_model_initialize -+function is used to initialize a connection to the closed process groups API. -+.PP -+Each application may have several connections to the CPG API. Each application -+uses the -+.I handle -+argument to uniquely identify the connection. The -+.I handle -+argument is then used in other function calls to identify the connection to be used -+for communication with the CPG service. -+.PP -+Argument -+.I model -+is used to explicitly choose set of callbacks and internal parameters. Currently only model -+.I CPG_MODEL_V1 -+is defined. -+.PP -+Callbacks and internal parameters are passed by -+.I model_data -+argument. This is casted pointer (idea is similar as in sockaddr function) to one of structures -+corresponding to chosen model. Currently only -+.I cpg_model_v1_data_t -+is needed. -+.SH MODEL_V1 -+The -+.I MODEL_V1 -+is backwards compatible with original callbacks initialized by -+.I cpg_initialize -+but new callback -+.I cpg_totem_confchg_fn -+is defined. -+.PP -+Every time an CPG event occurs within the joined group, one of the callbacks specified by the argument -+.I callbacks -+is called. The callback functions are described by the following type definitions: -+.PP -+.PP -+.IP -+.RS -+.ne 18 -+.nf -+.ta 4n 20n 32n -+ -+typedef void (*cpg_deliver_fn_t) ( -+ cpg_handle_t handle, -+ const struct cpg_name *group_name, -+ uint32_t nodeid, -+ uint32_t pid, -+ const void *msg, -+ size_t msg_len); -+ -+ -+typedef void (*cpg_confchg_fn_t) ( -+ cpg_handle_t handle, -+ const struct cpg_name *group_name, -+ const struct cpg_address *member_list, size_t member_list_entries, -+ const struct cpg_address *left_list, size_t left_list_entries, -+ const struct cpg_address *joined_list, size_t joined_list_entries); -+ -+ -+typedef void (*cpg_totem_confchg_fn_t) ( -+ cpg_handle_t handle, -+ struct cpg_ring_id ring_id, -+ uint32_t member_list_entries, -+ const uint32_t *member_list); -+.ta -+.fi -+.RE -+.IP -+.PP -+.PP -+The -+.I cpg_model_v1_data_t -+structure is defined as: -+.IP -+.RS -+.ne 18 -+.nf -+.PP -+typedef struct { -+ cpg_model_t model; -+ cpg_deliver_fn_t cpg_deliver_fn; -+ cpg_confchg_fn_t cpg_confchg_fn; -+ cpg_totem_confchg_fn_t cpg_totem_confchg_fn; -+ unsigned int flags; -+} cpg_model_v1_data_t; -+.ta -+.fi -+.RE -+.IP -+.PP -+When a configuration change occurs or a message is to be delivered one of the callbacks -+is called from the -+.B cpg_dispatch() -+function. If a configuration change occurs, -+.I cpg_confchg_fn -+is called. If a delivery of a message occurs, -+.I cpg_deliver_fn -+is called. -+When totem membership change occurs, -+.I cpg_totem_confchg_fn -+is called. You can OR -+.I CPG_MODEL_V1_DELIVER_INITIAL_TOTEM_CONF -+constant to flags to get callback after first confchg event. -+ -+The -+.I cpg_address -+structure is defined -+.IP -+.RS -+.ne 18 -+.nf -+.PP -+struct cpg_address { -+ unsigned int nodeid; -+ unsigned int pid; -+ unsigned int reason; -+}; -+.ta -+.fi -+.RE -+.IP -+.PP -+where nodeid is a 32 bit unique node identifier, pid is the process ID of the process that has joined/left the group -+or sent the message, and reason is an integer code indicating why the node joined/left the group. -+.PP -+.IP -+.RS -+.ne 18 -+.nf -+.PP -+CPG_REASON_JOIN - the process joined a group using cpg_join(). -+CPG_REASON_LEAVE - the process left a group using cpg_leave() -+CPG_REASON_NODEDOWN - the process left a group because the node left the cluster. -+CPG_REASON_NODEUP - the process joined a group because it was already a member of a group on a node that has just joined the cluster -+CPG_REASON_PROCDOWN - the process left a group without calling cpg_leave() -+.ta -+.fi -+.RE -+.IP -+.PP -+The -+.I cpg_ring_id -+structure is defined -+.IP -+.RS -+.ne 18 -+.nf -+.PP -+struct cpg_ring_id { -+ uint32_t nodeid; -+ uint64_t seq; -+}; -+.ta -+.fi -+.RE -+.IP -+.PP -+where -+.I nodeid -+is if of node of current Totem leader and seq is increasing number. -+ -+.PP -+.SH RETURN VALUE -+This call returns the CPG_OK value if successful, otherwise an error is returned. -+.PP -+.SH ERRORS -+The errors are undocumented. -+.SH "SEE ALSO" -+.BR cpg_overview (8), -+.BR cpg_initialize (3), -+.BR cpg_finalize (3), -+.BR cpg_fd_get (3), -+.BR cpg_dispatch (3), -+.BR cpg_join (3), -+.BR cpg_leave (3), -+.BR cpg_mcast_joined (3), -+.BR cpg_membership_get (3) -+.BR cpg_zcb_alloc (3) -+.BR cpg_zcb_free (3) -+.BR cpg_zcb_mcast_joined (3) -+.BR cpg_context_get (3) -+.BR cpg_context_set (3) -+.BR cpg_local_get (3) -+.BR cpg_model_initialize (3) -+ -+.PP -Index: man/Makefile.am -=================================================================== ---- man/Makefile.am (revision 2769) -+++ man/Makefile.am (revision 2770) -@@ -71,6 +71,7 @@ - cpg_leave.3 \ - cpg_local_get.3 \ - cpg_mcast_joined.3 \ -+ cpg_model_initialize.3 \ - cpg_zcb_mcast_joined.3 \ - cpg_zcb_alloc.3 \ - cpg_zcb_free.3 \ diff --git a/sources b/sources index 46c3b90..9c626fd 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -43e97ef0d964ccb4063f40a4478eb679 corosync-1.2.8.tar.gz +SHA512 (corosync-3.1.10.tar.gz) = cf2014d15fdbd3495cfe64629255f7855a79651a595938dac7bc7ec67338d843079ae40cf1c15de23b50d85cb39b2c2e3e3448a9cc33759ad8988b8c85ce59d3 diff --git a/tests/plan.fmf b/tests/plan.fmf new file mode 100644 index 0000000..1c97683 --- /dev/null +++ b/tests/plan.fmf @@ -0,0 +1,12 @@ +summary: Run all smoke tests +discover: + how: fmf +execute: + how: tmt +prepare: + how: install + package: + - gcc + - iproute + - corosync + - corosync-devel diff --git a/tests/smoke/main.fmf b/tests/smoke/main.fmf new file mode 100644 index 0000000..c431594 --- /dev/null +++ b/tests/smoke/main.fmf @@ -0,0 +1,2 @@ +summary: Basic smoke test +test: ./runtest.sh diff --git a/tests/smoke/runtest.sh b/tests/smoke/runtest.sh new file mode 100755 index 0000000..9fd5e68 --- /dev/null +++ b/tests/smoke/runtest.sh @@ -0,0 +1,623 @@ +#!/bin/bash + +# This file was autogenerated at 2019-05-13T13:43:38+02:00 from 90bd97ada89befa1a63133335a419ad7311c3d75 + +# Copyright (c) 2019, Red Hat, Inc. +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND RED HAT, INC. DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RED HAT, INC. BE LIABLE +# FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Author: Jan Friesse + + +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# !!! Script overwrites corosync.conf, authkey and qdevice/qnetd certificates !!! +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +# Home https://github.com/jfriesse/csts/tree/master/smoke + +# -e is really important +set -xe +set -o pipefail + +# Variables changing test behavior +PREFIX="/" + +COROSYNC_SYSCONFD="${PREFIX}etc/corosync" +COROSYNC_CONF="${COROSYNC_SYSCONFD}/corosync.conf" +COROSYNC_AUTHKEY="${COROSYNC_SYSCONFD}/authkey" +COROSYNC_CLUSTER_NAME="smoketestcluster" + +TOKEN_TIMEOUT=1000 +MAX_REPEATS=60 + +#################### +# Helper functions # +#################### +get_ip() { + ip_res=$(ip route get 8.8.8.8) + # Format is "8.8.8.8 via ROUTE_IPADDR dev DEV src IPADDR uid NUMBER" + # Remove everything up to "src " and then everything after " " + addr=${ip_res##*src } + addr=${addr%% *} + + echo "$addr" +} + +# generate_corosync_conf crypto [token] [qdevice] +# crypto can be on or off +# when token is defined it is used for token timeout +# when qdevice is set to on qdevice section is created and second node is added +generate_corosync_conf() { + case "$1" in + "on") + cipher="aes256" + hash="sha256" + ;; + "off") + cipher="none" + hash="none" + ;; + *) + # Unknown crypto + exit 1 + esac + + token=$TOKEN_TIMEOUT + if [ ! -z "$2" ];then + token="$2" + fi + qdevice="$3" + true_command=`which true` + +cat << _EOF_ + totem { + version: 2 + cluster_name: $COROSYNC_CLUSTER_NAME + transport: knet + crypto_cipher: $cipher + crypto_hash: $hash + token: $token + } + + logging { + to_logfile: yes + logfile: /var/log/cluster/corosync.log + to_syslog: yes + } + + quorum { + provider: corosync_votequorum +_EOF_ + + if [ "$qdevice" == "on" ];then +cat << _EOF_ + device { + votes: 1 + model: net + net { + host: $LOCAL_IP + algorithm: ffsplit + } + heuristics { + mode: sync + exec_true: $true_command + } + } +_EOF_ + fi + +cat << _EOF_ + } + + nodelist { + node { + nodeid: 1 + ring0_addr: $LOCAL_IP + } +_EOF_ + + if [ "$qdevice" == "on" ];then +cat << _EOF_ + node { + nodeid: 2 + ring0_addr: 192.0.2.2 + } +_EOF_ + fi + +cat << _EOF_ + } +_EOF_ +} + +# service_start service +service_start() { + # service service must be inactive + systemctl is-active "$1" && exit 1 || true + + systemctl start "$1" + + systemctl is-active "$1" +} + +# service_stop service +service_stop() { + systemctl is-active "$1" || exit 1 + + systemctl stop "$1" + + systemctl is-active "$1" && exit 1 || true +} + +###################### +# Computed variables # +###################### +LOCAL_IP=$(get_ip) + +################## +# C test sources # +################## + +# Test sources are encoded as a base64 string and piped to base64 to store them in /tmp +# corosync-api-test.c +echo "LyoKICogQ29weXJpZ2h0IChjKSAyMDE5LCBSZWQgSGF0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24g +dG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9y +IGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHBy +b3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlz +c2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQ +Uk9WSURFRCAiQVMgSVMiIEFORCBSRUQgSEFULCBJTkMuIERJU0NMQUlNUyBBTEwgV0FSUkFOVElF +UwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBX +QVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQg +U0hBTEwgUkVEIEhBVCwgSU5DLiBCRSBMSUFCTEUKICogRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1Qs +IElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hB +VFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVU +SEVSIElOIEFOIEFDVElPTgogKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JU +SU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUg +VVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqCiAqIEF1dGhvcjogSmFuIEZy +aWVzc2UgPGpmcmllc3NlQHJlZGhhdC5jb20+CiAqLwoKLyoKICogU2ltcGxlIHRlc3Qgb2YgQ1BH +IGNhbGxiYWNrcy4gUHJvZ3JhbSBpbml0aWFsbHkgam9pbnMgQ1BHIGdyb3VwLCB3YWl0cyBmb3IK +ICogY3BnX2NvbmZjaGcgYW5kIGNwZ190b3RlbV9jb25mY2hnIGNhbGxiYWNrcyBhbmQgdGhlbiBz +dGFydHMgbG9vcCBvZiBzZW5kaW5nCiAqIGFuZCB3YWl0aW5nIGZvciB0aGUgbWVzc2FnZS4gTWVz +c2FnZSBoYXMgcmFuZG9tIGxlbmd0aCAodXAtdG8gTUFYX01TR19MRU4pCiAqIGFuZCByYW5kb20g +Y29udGVudC4gcmFuZF9yIGlzIHVzZWQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGluZy4gTWVz +c2FnZQogKiBpcyBjaGVja2VkIG9uIGRlbGl2ZXJ5IGJ5IGlzc3Vpbmcgc2FtZSByYW5kX3IuIFNl +ZWQgZm9yIHJhbmRfciBhcmUKICogc3RvcmVkIGluIHNlbnRfcmFuZF9zZWVkIGFuZCByZWNlaXZl +ZF9yYW5kX3NlZWQgdmFyaWFibGVzLgogKgogKiBUaGlzIHRlc3QgY2hlY2tzIGZvbGxvd2luZyBD +UEcgcHJvcGVydGllczoKICogLSBQcm9jZXNzIGNhbiBqb2luIENQRyBncm91cAogKiAtIEJvdGgg +Y3BnX2NvbmZjaGcgYW5kIGNwZ190b3RlbV9jb25mY2hnIGNhbGxiYWNrcyBhcmUgcmVjZWl2ZWQg +d2l0aAogKiAgIG9ubHkgb25lIG5vZGUgYW5kIG9ubHkgb25lIHByb2Nlc3MgaW4gdGhlcmUKICog +LSBNZXNzYWdlcyBhcmUgc2VudCBhbmQgcmVjZWl2ZWQgd2l0aG91dCBhbnkgY29ycnVwdGlvbgog +Ki8KCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KCiNpbmNs +dWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxpbnR0eXBlcy5oPgoj +aW5jbHVkZSA8cG9sbC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoj +aW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlIDxjb3Jvc3lu +Yy9jb3JvdHlwZXMuaD4KI2luY2x1ZGUgPGNvcm9zeW5jL2NwZy5oPgoKLyoKICogUHJlZGVmaW5l +ZCB0ZXN0IGNvbnN0YW50cwogKi8KI2RlZmluZSBURVNUX05PREVJRAkJMQojZGVmaW5lIFRFU1Rf +R1JPVVBfTkFNRQkJInNtb2tlLWFwaS10ZXN0LWNwZy1ncm91cCIKI2RlZmluZSBNQVhfUkVUUklF +UwkJMzAKI2RlZmluZSBNQVhfTVNHX0xFTgkJKDEwMjQgKiAxMjgpCiNkZWZpbmUgTUVTU0FHRVNf +VE9fU0VOVAkxMjgKCi8qCiAqIFVzZWZ1bCBtYWNyb3MKICovCiNkZWZpbmUgY3NfcmVwZWF0KGNv +ZGUpIGRvIHsJCQkJXAoJaW50IGNzX3JlcGVhdF9jb3VudGVyID0gMDsJCQlcCglkbyB7CQkJCQkJ +XAoJCWlmICgoY29kZSkgPT0gQ1NfRVJSX1RSWV9BR0FJTikgewlcCgkJCWNzX3JlcGVhdF9jb3Vu +dGVyKys7CQlcCgkJCXBvbGwoTlVMTCwgMCwgMTAwMCk7CQlcCgkJfSBlbHNlIHsJCQkJXAoJCQli +cmVhazsJCQkJXAoJCX0JCQkJCVwKCX0gd2hpbGUgKGNzX3JlcGVhdF9jb3VudGVyIDwgTUFYX1JF +VFJJRVMpOwlcCn0gd2hpbGUgKDApCgojaWZuZGVmIElORlRJTQojZGVmaW5lIElORlRJTQkJCS0x +CiNlbmRpZgoKI2RlZmluZSBFTlRFUigpIHByaW50ZigiKyAlczoldSAlc1xuIiwgX19GSUxFX18s +IF9fTElORV9fLCBfX2Z1bmNfXykKI2RlZmluZSBMRUFWRSgpIHByaW50ZigiLSAlczoldSAlc1xu +IiwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXykKCnN0YXRpYyBpbnQgY3BnX2NvbmZjaGdf +cmVjZWl2ZWQgPSAwOwpzdGF0aWMgaW50IGNwZ190b3RlbV9jb25mY2hnX3JlY2VpdmVkID0gMDsK +Ci8qCiAqIGJvdGggcmFuZCBzZWVkcyBtdXN0IGJlIGluIHN5bmMKICovCnN0YXRpYyB1bnNpZ25l +ZCBpbnQgc2VudF9yYW5kX3NlZWQgPSAwOwpzdGF0aWMgdW5zaWduZWQgaW50IHJlY2VpdmVkX3Jh +bmRfc2VlZCA9IDA7CnN0YXRpYyB1aW50MzJfdCBzZW50X21zZ19zZXFfbm8gPSAwOwpzdGF0aWMg +dWludDMyX3QgcmVjZWl2ZWRfbXNnX3NlcV9ubyA9IDA7CgpzdHJ1Y3QgdGVzdF9tc2cgewoJdWlu +dDMyX3Qgc2VxX25vIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpOwoJdWludDMyX3QgZGF0 +YV9sZW4gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSk7Cgl1bnNpZ25lZCBjaGFyIGRhdGFb +MF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSk7Cn07CgpzdGF0aWMgdm9pZApEZWxpdmVy +Q2FsbGJhY2soY3BnX2hhbmRsZV90IGhhbmRsZSwKICAgIGNvbnN0IHN0cnVjdCBjcGdfbmFtZSAq +Z3JvdXBOYW1lLAogICAgdWludDMyX3Qgbm9kZWlkLAogICAgdWludDMyX3QgcGlkLAogICAgdm9p +ZCAqY3BnX21zZywKICAgIHNpemVfdCBjcGdfbXNnX2xlbikKewoJc3RydWN0IHRlc3RfbXNnICpt +c2c7Cgl1aW50MzJfdCB1MzI7CgoJRU5URVIoKTsKCglhc3NlcnQobm9kZWlkID09IFRFU1RfTk9E +RUlEKTsKCWFzc2VydChwaWQgPT0gZ2V0cGlkKCkpOwoKCWFzc2VydChjcGdfbXNnX2xlbiA+PSBz +aXplb2Yoc3RydWN0IHRlc3RfbXNnKSk7CgoJbXNnID0gKHN0cnVjdCB0ZXN0X21zZyAqKWNwZ19t +c2c7Cglhc3NlcnQobXNnLT5zZXFfbm8gPT0gcmVjZWl2ZWRfbXNnX3NlcV9ubyk7CglyZWNlaXZl +ZF9tc2dfc2VxX25vKys7CgoJYXNzZXJ0KGNwZ19tc2dfbGVuID09IG1zZy0+ZGF0YV9sZW4gKyBz +aXplb2Yoc3RydWN0IHRlc3RfbXNnKSk7CgoJLyoKCSAqIE1lc3NhZ2UgaGFzIGV4cGVjdGVkIGxl +bmd0aCBhbmQgY29udGVudAoJICovCglhc3NlcnQobXNnLT5kYXRhX2xlbiA9PSAodWludDMyX3Qp +KHJhbmRfcigmcmVjZWl2ZWRfcmFuZF9zZWVkKSAlIE1BWF9NU0dfTEVOKSk7CgoJZm9yICh1MzIg +PSAwOyB1MzIgPCBtc2ctPmRhdGFfbGVuOyB1MzIrKykgewoJCWFzc2VydChtc2ctPmRhdGFbdTMy +XSA9PSAodW5zaWduZWQgY2hhcilyYW5kX3IoJnJlY2VpdmVkX3JhbmRfc2VlZCkpOwoJfQoKCUxF +QVZFKCk7Cn0KCnN0YXRpYyB2b2lkClRvdGVtQ29uZmNoZ0NhbGxiYWNrKGNwZ19oYW5kbGVfdCBo +YW5kbGUsCiAgICBzdHJ1Y3QgY3BnX3JpbmdfaWQgcmluZ19pZCwKICAgIHVpbnQzMl90IG1lbWJl +cl9saXN0X2VudHJpZXMsCiAgICBjb25zdCB1aW50MzJfdCAqbWVtYmVyX2xpc3QpCnsKCglFTlRF +UigpOwoKCWFzc2VydChtZW1iZXJfbGlzdF9lbnRyaWVzID09IDEpOwoJYXNzZXJ0KG1lbWJlcl9s +aXN0WzBdID09IFRFU1RfTk9ERUlEKTsKCgljcGdfdG90ZW1fY29uZmNoZ19yZWNlaXZlZCA9IDE7 +CgoJTEVBVkUoKTsKfQoKc3RhdGljIHZvaWQKQ29uZmNoZ0NhbGxiYWNrKGNwZ19oYW5kbGVfdCBo +YW5kbGUsCiAgICBjb25zdCBzdHJ1Y3QgY3BnX25hbWUgKmdyb3VwX25hbWUsCiAgICBjb25zdCBz +dHJ1Y3QgY3BnX2FkZHJlc3MgKm1lbWJlcl9saXN0LCBzaXplX3QgbWVtYmVyX2xpc3RfZW50cmll +cywKICAgIGNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqbGVmdF9saXN0LCBzaXplX3QgbGVmdF9s +aXN0X2VudHJpZXMsCiAgICBjb25zdCBzdHJ1Y3QgY3BnX2FkZHJlc3MgKmpvaW5lZF9saXN0LCBz +aXplX3Qgam9pbmVkX2xpc3RfZW50cmllcykKewoKCUVOVEVSKCk7CgoJYXNzZXJ0KGdyb3VwX25h +bWUtPmxlbmd0aCA9PSBzdHJsZW4oVEVTVF9HUk9VUF9OQU1FKSk7Cglhc3NlcnQobWVtY21wKGdy +b3VwX25hbWUtPnZhbHVlLCBURVNUX0dST1VQX05BTUUsIHN0cmxlbihURVNUX0dST1VQX05BTUUp +KSA9PSAwKTsKCWFzc2VydChtZW1iZXJfbGlzdF9lbnRyaWVzID09IDEpOwoJYXNzZXJ0KG1lbWJl +cl9saXN0WzBdLm5vZGVpZCA9PSBURVNUX05PREVJRCk7Cglhc3NlcnQobWVtYmVyX2xpc3RbMF0u +cGlkID09IGdldHBpZCgpKTsKCgljcGdfY29uZmNoZ19yZWNlaXZlZCA9IDE7CgoJTEVBVkUoKTsK +fQoKc3RhdGljIGNwZ19tb2RlbF92MV9kYXRhX3QgbW9kZWxfZGF0YSA9IHsKCS5jcGdfZGVsaXZl +cl9mbiA9CURlbGl2ZXJDYWxsYmFjaywKCS5jcGdfY29uZmNoZ19mbiA9CUNvbmZjaGdDYWxsYmFj +aywKCS5jcGdfdG90ZW1fY29uZmNoZ19mbiA9CVRvdGVtQ29uZmNoZ0NhbGxiYWNrLAoJLmZsYWdz +ID0JCUNQR19NT0RFTF9WMV9ERUxJVkVSX0lOSVRJQUxfVE9URU1fQ09ORiwKfTsKCnN0YXRpYyB2 +b2lkCnNlbmRfbXNnKGNwZ19oYW5kbGVfdCBjcGdfaGFuZGxlKQp7CglzdHJ1Y3QgdGVzdF9tc2cg +bXNnOwoJdW5zaWduZWQgY2hhciAqZGF0YTsKCXVpbnQzMl90IHUzMjsKCXN0cnVjdCBpb3ZlYyBp +b3ZbMl07Cgljc19lcnJvcl90IGNzX3JlczsKCglFTlRFUigpOwoKCW1zZy5kYXRhX2xlbiA9IHJh +bmRfcigmc2VudF9yYW5kX3NlZWQpICUgTUFYX01TR19MRU47Cgltc2cuc2VxX25vID0gc2VudF9t +c2dfc2VxX25vOwoKCXNlbnRfbXNnX3NlcV9ubysrOwoKCWRhdGEgPSBtYWxsb2Moc2l6ZW9mKHVu +c2lnbmVkIGNoYXIpICogbXNnLmRhdGFfbGVuKTsKCWFzc2VydChkYXRhICE9IE5VTEwpOwoKCWZv +ciAodTMyID0gMDsgdTMyIDwgbXNnLmRhdGFfbGVuOyB1MzIrKykgewoJCWRhdGFbdTMyXSA9ICh1 +bnNpZ25lZCBjaGFyKXJhbmRfcigmc2VudF9yYW5kX3NlZWQpOwoJfQoKCWlvdlswXS5pb3ZfYmFz +ZSA9ICh2b2lkICopJm1zZzsKCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKG1zZyk7Cglpb3ZbMV0u +aW92X2Jhc2UgPSAodm9pZCAqKWRhdGE7Cglpb3ZbMV0uaW92X2xlbiA9IG1zZy5kYXRhX2xlbjsK +Cgljc19yZXMgPSBjcGdfbWNhc3Rfam9pbmVkKGNwZ19oYW5kbGUsIENQR19UWVBFX0FHUkVFRCwg +aW92LCAyKTsKCWFzc2VydChjc19yZXMgPT0gQ1NfT0spOwoKCWZyZWUoZGF0YSk7CgoJTEVBVkUo +KTsKfQoKc3RhdGljIHZvaWQKdGVzdF9jcGcodm9pZCkKewoJY3BnX2hhbmRsZV90IGNwZ19oYW5k +bGU7CglzdHJ1Y3QgY3BnX25hbWUgZ3JvdXBfbmFtZTsKCWNzX2Vycm9yX3QgY3NfcmVzOwoJdW5z +aWduZWQgaW50IGxvY2FsX25vZGVpZDsKCWludCBjcGdfZmQ7CglzdHJ1Y3QgcG9sbGZkIHBmZDsK +CWludCBwb2xsX3JlczsKCWludCBzdGF0ZTsKCWludCBjb250OwoKCUVOVEVSKCk7CgoJc3RhdGUg +PSAwOwoKCXN0cmNweShncm91cF9uYW1lLnZhbHVlLCBURVNUX0dST1VQX05BTUUpOwoJZ3JvdXBf +bmFtZS5sZW5ndGggPSBzdHJsZW4oVEVTVF9HUk9VUF9OQU1FKTsKCgljc19yZXBlYXQoY3NfcmVz +ID0gY3BnX21vZGVsX2luaXRpYWxpemUoJmNwZ19oYW5kbGUsIENQR19NT0RFTF9WMSwKCSAgICAo +Y3BnX21vZGVsX2RhdGFfdCAqKSZtb2RlbF9kYXRhLCBOVUxMKSk7Cglhc3NlcnQoY3NfcmVzID09 +IENTX09LKTsKCgljc19yZXBlYXQoY3NfcmVzID0gY3BnX2pvaW4oY3BnX2hhbmRsZSwgJmdyb3Vw +X25hbWUpKTsKCWFzc2VydChjc19yZXMgPT0gQ1NfT0spOwoKCWNzX3JlcGVhdChjc19yZXMgPSBj +cGdfbG9jYWxfZ2V0KGNwZ19oYW5kbGUsICZsb2NhbF9ub2RlaWQpKTsKCWFzc2VydChjc19yZXMg +PT0gQ1NfT0spOwoJYXNzZXJ0KGxvY2FsX25vZGVpZCA9PSBURVNUX05PREVJRCk7CgoJY3NfcmVw +ZWF0KGNzX3JlcyA9IGNwZ19mZF9nZXQoY3BnX2hhbmRsZSwgJmNwZ19mZCkpOwoJYXNzZXJ0KGNz +X3JlcyA9PSBDU19PSyk7CgoJY29udCA9IDE7CgoJZG8gewoJCXBmZC5mZCA9IGNwZ19mZDsKCQlw +ZmQuZXZlbnRzID0gUE9MTElOOwoJCXBmZC5yZXZlbnRzID0gMDsKCgkJcG9sbF9yZXMgPSBwb2xs +KCZwZmQsIDEsIElORlRJTSk7CgkJaWYgKHBvbGxfcmVzID09IC0xKSB7CgkJCXBlcnJvcigicG9s +bF9yZXMgPT0gLTEiKTsKCQl9CgoJCWFzc2VydChwb2xsX3JlcyAhPSAwKTsKCQlhc3NlcnQocGZk +LnJldmVudHMgJiBQT0xMSU4pOwoKCQljc19yZXBlYXQoY3NfcmVzID0gY3BnX2Rpc3BhdGNoKGNw +Z19oYW5kbGUsIENTX0RJU1BBVENIX0FMTCkpOwoJCWFzc2VydChjc19yZXMgPT0gQ1NfT0spOwoK +CQlzd2l0Y2ggKHN0YXRlKSB7CgkJY2FzZSAwOgoJCQkvKgoJCQkgKiBXYWl0aW5nIGZvciBjcGdf +Y29uZmNoZ19yZWNlaXZlZCBhbmQgY3BnX3RvdGVtX2NvbmZjaGdfcmVjZWl2ZWQKCQkJICovCgkJ +CWlmIChjcGdfY29uZmNoZ19yZWNlaXZlZCAmJiBjcGdfdG90ZW1fY29uZmNoZ19yZWNlaXZlZCkg +ewoJCQkJLyoKCQkJCSAqIFNlbmQgZmlyc3QgbWVzc2FnZSBhbmQgd2FpdCBmb3IgaXQgaW4gbmV4 +dCBzdGF0ZQoJCQkJICovCgkJCQlzZW5kX21zZyhjcGdfaGFuZGxlKTsKCQkJCXN0YXRlID0gMTsK +CQkJfQoJCQlicmVhazsKCQljYXNlIDE6CgkJCWlmIChyZWNlaXZlZF9tc2dfc2VxX25vID49IE1F +U1NBR0VTX1RPX1NFTlQpIHsKCQkJCWNvbnQgPSAwOwoJCQl9IGVsc2UgIGlmIChyZWNlaXZlZF9t +c2dfc2VxX25vID09IHNlbnRfbXNnX3NlcV9ubykgewoJCQkJLyoKCQkJCSAqIE1lc3NhZ2UgZGVs +aXZlcmVkIHNvIHNlbnQgbmV3IG9uZSBhbmQgd2FpdCBmb3IgaXQKCQkJCSAqLwoJCQkJc2VuZF9t +c2coY3BnX2hhbmRsZSk7CgkJCX0KCQkJYnJlYWs7CgkJfQoJfSB3aGlsZSAoY29udCk7CgoJY3Nf +cmVwZWF0KGNzX3JlcyA9IGNwZ19sZWF2ZShjcGdfaGFuZGxlLCAmZ3JvdXBfbmFtZSkpOwoJYXNz +ZXJ0KGNzX3JlcyA9PSBDU19PSyk7CgoJY3NfcmVwZWF0KGNzX3JlcyA9IGNwZ19maW5hbGl6ZShj +cGdfaGFuZGxlKSk7Cglhc3NlcnQoY3NfcmVzID09IENTX09LKTsKCglMRUFWRSgpOwp9CgppbnQK +bWFpbih2b2lkKQp7CgoJRU5URVIoKTsKCglzZXRsaW5lYnVmKHN0ZG91dCk7CgoJdGVzdF9jcGco +KTsKCglMRUFWRSgpOwoKCXJldHVybiAoMCk7Cn0K" | base64 -d | tee "/tmp/corosync-api-test.c" +# - corosync-api-test.c +# corosync-api-test-mp.c +echo "LyoKICogQ29weXJpZ2h0IChjKSAyMDE5LCBSZWQgSGF0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24g +dG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9y +IGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHBy +b3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlz +c2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQ +Uk9WSURFRCAiQVMgSVMiIEFORCBSRUQgSEFULCBJTkMuIERJU0NMQUlNUyBBTEwgV0FSUkFOVElF +UwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBX +QVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQg +U0hBTEwgUkVEIEhBVCwgSU5DLiBCRSBMSUFCTEUKICogRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1Qs +IElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hB +VFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVU +SEVSIElOIEFOIEFDVElPTgogKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JU +SU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUg +VVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqCiAqIEF1dGhvcjogSmFuIEZy +aWVzc2UgPGpmcmllc3NlQHJlZGhhdC5jb20+CiAqLwoKLyoKICogTWFpbiBwcm9jZXNzIGNyZWF0 +ZXMgbXVsdGlwbGUgKE5PX0NISUxEUykgY2hpbGRzIGFuZCB3YWl0cyBmb3IgdGhlaXIgZXhpdC4K +ICogRWFjaCBjaGlsZCBqb2lucyBDUEcgZ3JvdXAgYW5kIHN0YXJ0cyBwcm9jZXNzaW5nIENQRyBl +dmVudHMuIEVhY2ggY2hpbGQgaXMKICogaWRlbnRpZmllZCBieSBJRCAobXlfaWQpIHdoaWNoIGlz +IHNldCBieSBtYWluIHByb2Nlc3MgaW4gaW5jcmVhc2luZyBvcmRlciAoc28KICogdmFsdWUgaXMg +MC4uTk9fQ0hJTERTLTEpLiBXaGVuIGFsbCBjaGlsZHMgam9pbiBDUEcgZ3JvdXAgKENvbmZjaGdD +YWxsYmFjayB2YXJpYWJsZQogKiBtZW1iZXJfbGlzdF9lbnRyaWVzIGlzIGVxdWFsIHRvIE5PX0NI +SUxEUykgdGhlbiBjaGlsZCB3aXRoIElEIDAgc2VuZHMgQ1BHIG1lc3NhZ2UKICogd2l0aCByYW5k +b20gbGVuZ3RoICh1cC10byBNQVhfTVNHX0xFTikgYW5kIHJhbmRvbSBjb250ZW50LiBXaGVuIGNo +aWxkIHdpdGggSUQgMQogKiByZWNlaXZlcyBtZXNzYWdlIGlzc3VlZCBieSBjaGlsZCB3aXRoIElE +IDAsIGl0IHNlbmRzIGFub3RoZXIgcmFuZG9tIG1lc3NhZ2UuCiAqIFRoaXMgcHJvY2VzcyBjb250 +aW51ZXMgd2l0aCBjaGlsZCB3aXRoIElEIDIsIHRoZW4gd2l0aCBjaGlsZCAzLCAuLi4gTk9fQ0hJ +TERTIC0gMSBhbmQKICogdGhlbiBvdmVybGFwcyBiYWNrIHRvIDAuIEVhY2ggY2hpbGQgY29tcGFy +ZXMgcmVjZWl2ZWQgbWVzc2FnZSBieSBnZW5lcmF0aW5nIHNhbWUKICogcmFuZG9tIG51bWJlcnMg +KHJhbmRfciBmdW5jdGlvbiBpcyB1c2VkKSBzdHJlYW0gYXMgc2VuZGVyIHNvIHNlbnRfcmFuZF9z +ZWVkIGFuZAogKiByZWNlaXZlZF9yYW5kX3NlZWQgbXVzdCBiZSBrZXB0IGluIHN5bmMuIEtlZXBp +bmcgcmVjZWllZF9yYW5kX3NlZWQgaW4gc3luYyBpcwogKiBzaW1wbGUsIGJlY2F1c2UgaXQgaXMg +dXBkYXRlZCBldmVyeSB0aW1lIHdoZW4gbWVzc2FnZSBpcyByZWNlaXZlZC4KICogc2VudF9yYW5k +X3NlZWQgaXMgdXBkYXRlZCBldGhlciBieSBzZW5kaW5nIG1lc3NhZ2Ugb3IgYnkKICogY2FsbGlu +ZyBhZGp1c3Rfc2VudF9yYW5kX3NlZWQgZnVuY3Rpb24uCiAqCiAqIFRoaXMgdGVzdCBjaGVja3Mg +Zm9sbG93aW5nIHByb3BlcnRpZXMgQ1BHOgogKiAtIE1vcmUgdGhhbiBvbmUgY2xpZW50IGNhbiBq +b2luIENQRyBncm91cAogKiAtIEVhY2ggY2xpZW50IGV2ZW50dWFsbHkgc2VlcyBhbGwgb3RoZXIg +Y2xpZW50cwogKiAtIEVhY2ggY2xpZW50IHJlY2VpdmVzIG1lc3NhZ2VzIHNlbnQgYnkgb3RoZXIg +Y2xpZW50cyBbMV0KICogLSBNZXNzYWdlIGlzIG5vdCBjb3JydXB0ZWQgWzFdCiAqIC0gTWVzc2Fn +ZXMgYXJlIGRlbGl2ZXJlZCB3aXRoIEZJRk8gcXVhcmFudGVlIFsxXQogKgogKiBbMV0gLSBFbnN1 +cmVkIGJ5IGVxdWFsaXR5IG9mIHJhbmRfciBnZW5lcmF0ZWQgYnl0ZXMgd2hlcmUgc2VuZGVyIHNl +ZWQKICogICAgICAgKHNlbnRfcmFuZF9zZWVkKSBhbmQgcmVjZWl2ZXIgc2VlZCAocmVjZWl2ZWRf +cmFuZF9zZWVkKSBhcmUga2VwdCBpbgogKiAgICAgICBzeW5jLgogKi8KCiNpbmNsdWRlIDxzeXMv +dHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+Cgoj +aW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8aW50dHlwZXMu +aD4KI2luY2x1ZGUgPHBvbGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIu +aD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSA8Y29y +b3N5bmMvY29yb3R5cGVzLmg+CiNpbmNsdWRlIDxjb3Jvc3luYy9jcGcuaD4KCi8qCiAqIFByZWRl +ZmluZWQgdGVzdCBjb25zdGFudHMKICovCiNkZWZpbmUgVEVTVF9OT0RFSUQJCTEKI2RlZmluZSBU +RVNUX0dST1VQX05BTUUJCSJzbW9rZS1hcGktdGVzdC1jcGctZ3JvdXAtbXAiCiNkZWZpbmUgTUFY +X1JFVFJJRVMJCTMwCiNkZWZpbmUgTUFYX01TR19MRU4JCSgxMDI0ICogMTI4KQoKI2RlZmluZSBO +T19DSElMRFMJCTMKCiNkZWZpbmUgTUVTU0FHRVNfVE9fU0VOVAkoMTI4ICogTk9fQ0hJTERTKQoK +LyoKICogVXNlZnVsIG1hY3JvcwogKi8KI2RlZmluZSBjc19yZXBlYXQoY29kZSkgZG8gewkJCQlc +CglpbnQgY3NfcmVwZWF0X2NvdW50ZXIgPSAwOwkJCVwKCWRvIHsJCQkJCQlcCgkJaWYgKChjb2Rl +KSA9PSBDU19FUlJfVFJZX0FHQUlOKSB7CVwKCQkJY3NfcmVwZWF0X2NvdW50ZXIrKzsJCVwKCQkJ +cG9sbChOVUxMLCAwLCAxMDAwKTsJCVwKCQl9IGVsc2UgewkJCQlcCgkJCWJyZWFrOwkJCQlcCgkJ +fQkJCQkJXAoJfSB3aGlsZSAoY3NfcmVwZWF0X2NvdW50ZXIgPCBNQVhfUkVUUklFUyk7CVwKfSB3 +aGlsZSAoMCkKCiNpZm5kZWYgSU5GVElNCiNkZWZpbmUgSU5GVElNCQkJLTEKI2VuZGlmCgojZGVm +aW5lIEVOVEVSKCkgcHJpbnRmKCJbJWxkXSArICVzOiV1ICVzXG4iLCAobG9uZyBzaWduZWQgaW50 +KWdldHBpZCgpLCBfX0ZJTEVfXyxcCiAgICBfX0xJTkVfXywgX19mdW5jX18pCiNkZWZpbmUgTEVB +VkUoKSBwcmludGYoIlslbGRdIC0gJXM6JXUgJXNcbiIsIChsb25nIHNpZ25lZCBpbnQpZ2V0cGlk +KCksIF9fRklMRV9fLFwKICAgIF9fTElORV9fLCBfX2Z1bmNfXykKCnN0YXRpYyBpbnQzMl90IG15 +X2lkID0gLTE7CnN0YXRpYyBpbnQgZnVsbF9tZW1iZXJzaGlwX3NlZW4gPSAwOwpzdGF0aWMgaW50 +IHNlbnRfbWVzc2FnZXMgPSAwOwpzdGF0aWMgaW50IHRlc3RfY3BnX2xvb3BfY29udCA9IDE7Cgov +KgogKiBib3RoIHJhbmQgc2VlZHMgbXVzdCBiZSBpbiBzeW5jCiAqLwpzdGF0aWMgdW5zaWduZWQg +aW50IHNlbnRfcmFuZF9zZWVkID0gMDsKc3RhdGljIHVuc2lnbmVkIGludCByZWNlaXZlZF9yYW5k +X3NlZWQgPSAwOwpzdGF0aWMgaW50MzJfdCBleHBlY3RlZF9zZW5kZXJfaWQ7CnN0YXRpYyB1aW50 +MzJfdCBleHBlY3RlZF9tc2dfc2VxX25vID0gMDsKCnN0cnVjdCB0ZXN0X21zZyB7CglpbnQzMl90 +IHNlbmRlcl9pZCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKTsKCXVpbnQzMl90IHNlcV9u +byBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKTsKCXVpbnQzMl90IGRhdGFfbGVuIF9fYXR0 +cmlidXRlX18gKChhbGlnbmVkICg4KSkpOwoJdW5zaWduZWQgY2hhciBkYXRhWzBdIF9fYXR0cmli +dXRlX18gKChhbGlnbmVkICg4KSkpOwp9OwoKc3RhdGljIHZvaWQKc2VuZF9tc2coY3BnX2hhbmRs +ZV90IGNwZ19oYW5kbGUpCnsKCXN0cnVjdCB0ZXN0X21zZyBtc2c7Cgl1bnNpZ25lZCBjaGFyICpk +YXRhOwoJdWludDMyX3QgdTMyOwoJc3RydWN0IGlvdmVjIGlvdlsyXTsKCWNzX2Vycm9yX3QgY3Nf +cmVzOwoKCUVOVEVSKCk7CgoJbXNnLnNlbmRlcl9pZCA9IG15X2lkOwoJbXNnLmRhdGFfbGVuID0g +cmFuZF9yKCZzZW50X3JhbmRfc2VlZCkgJSBNQVhfTVNHX0xFTjsKCW1zZy5zZXFfbm8gPSBleHBl +Y3RlZF9tc2dfc2VxX25vOwoKCWRhdGEgPSBtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICog +bXNnLmRhdGFfbGVuKTsKCWFzc2VydChkYXRhICE9IE5VTEwpOwoKCWZvciAodTMyID0gMDsgdTMy +IDwgbXNnLmRhdGFfbGVuOyB1MzIrKykgewoJCWRhdGFbdTMyXSA9ICh1bnNpZ25lZCBjaGFyKXJh +bmRfcigmc2VudF9yYW5kX3NlZWQpOwoJfQoKCWlvdlswXS5pb3ZfYmFzZSA9ICh2b2lkICopJm1z +ZzsKCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKG1zZyk7Cglpb3ZbMV0uaW92X2Jhc2UgPSAodm9p +ZCAqKWRhdGE7Cglpb3ZbMV0uaW92X2xlbiA9IG1zZy5kYXRhX2xlbjsKCgljc19yZXMgPSBjcGdf +bWNhc3Rfam9pbmVkKGNwZ19oYW5kbGUsIENQR19UWVBFX0FHUkVFRCwgaW92LCAyKTsKCWFzc2Vy +dChjc19yZXMgPT0gQ1NfT0spOwoKCWZyZWUoZGF0YSk7CgoJc2VudF9tZXNzYWdlcysrOwoKCUxF +QVZFKCk7Cn0KCnN0YXRpYyB2b2lkCmFkanVzdF9zZW50X3JhbmRfc2VlZCh2b2lkKQp7Cgl1aW50 +MzJfdCBkYXRhX2xlbjsKCXVpbnQzMl90IHUzMjsKCglkYXRhX2xlbiA9IHJhbmRfcigmc2VudF9y +YW5kX3NlZWQpICUgTUFYX01TR19MRU47CgoJZm9yICh1MzIgPSAwOyB1MzIgPCBkYXRhX2xlbjsg +dTMyKyspIHsKCQkodm9pZClyYW5kX3IoJnNlbnRfcmFuZF9zZWVkKTsKCX0KfQoKc3RhdGljIHZv +aWQKRGVsaXZlckNhbGxiYWNrKGNwZ19oYW5kbGVfdCBoYW5kbGUsCiAgICBjb25zdCBzdHJ1Y3Qg +Y3BnX25hbWUgKmdyb3VwTmFtZSwKICAgIHVpbnQzMl90IG5vZGVpZCwKICAgIHVpbnQzMl90IHBp +ZCwKICAgIHZvaWQgKmNwZ19tc2csCiAgICBzaXplX3QgY3BnX21zZ19sZW4pCnsKCXN0cnVjdCB0 +ZXN0X21zZyAqbXNnOwoJdWludDMyX3QgdTMyOwoKCUVOVEVSKCk7CgoJYXNzZXJ0KG5vZGVpZCA9 +PSBURVNUX05PREVJRCk7CgoJYXNzZXJ0KGNwZ19tc2dfbGVuID49IHNpemVvZihzdHJ1Y3QgdGVz +dF9tc2cpKTsKCgltc2cgPSAoc3RydWN0IHRlc3RfbXNnICopY3BnX21zZzsKCWFzc2VydChtc2ct +PnNlbmRlcl9pZCA9PSBleHBlY3RlZF9zZW5kZXJfaWQpOwoKCWV4cGVjdGVkX3NlbmRlcl9pZCA9 +IChleHBlY3RlZF9zZW5kZXJfaWQgKyAxKSAlIE5PX0NISUxEUzsKCglhc3NlcnQobXNnLT5zZXFf +bm8gPT0gZXhwZWN0ZWRfbXNnX3NlcV9ubyk7CglleHBlY3RlZF9tc2dfc2VxX25vKys7CgoJYXNz +ZXJ0KGNwZ19tc2dfbGVuID09IG1zZy0+ZGF0YV9sZW4gKyBzaXplb2Yoc3RydWN0IHRlc3RfbXNn +KSk7CgoJLyoKCSAqIE1lc3NhZ2UgaGFzIGV4cGVjdGVkIGxlbmd0aCBhbmQgY29udGVudAoJICov +Cglhc3NlcnQobXNnLT5kYXRhX2xlbiA9PSAodWludDMyX3QpKHJhbmRfcigmcmVjZWl2ZWRfcmFu +ZF9zZWVkKSAlIE1BWF9NU0dfTEVOKSk7CgoJZm9yICh1MzIgPSAwOyB1MzIgPCBtc2ctPmRhdGFf +bGVuOyB1MzIrKykgewoJCWFzc2VydChtc2ctPmRhdGFbdTMyXSA9PSAodW5zaWduZWQgY2hhcily +YW5kX3IoJnJlY2VpdmVkX3JhbmRfc2VlZCkpOwoJfQoKCWlmIChleHBlY3RlZF9tc2dfc2VxX25v +ID4gTUVTU0FHRVNfVE9fU0VOVCkgewoJCXRlc3RfY3BnX2xvb3BfY29udCA9IDA7Cgl9CgoJaWYg +KGV4cGVjdGVkX3NlbmRlcl9pZCA9PSBteV9pZCkgewoJCXNlbmRfbXNnKGhhbmRsZSk7Cgl9IGVs +c2UgewoJCWFkanVzdF9zZW50X3JhbmRfc2VlZCgpOwoJfQoKCUxFQVZFKCk7Cn0KCnN0YXRpYyB2 +b2lkClRvdGVtQ29uZmNoZ0NhbGxiYWNrKGNwZ19oYW5kbGVfdCBoYW5kbGUsCiAgICBzdHJ1Y3Qg +Y3BnX3JpbmdfaWQgcmluZ19pZCwKICAgIHVpbnQzMl90IG1lbWJlcl9saXN0X2VudHJpZXMsCiAg +ICBjb25zdCB1aW50MzJfdCAqbWVtYmVyX2xpc3QpCnsKCglFTlRFUigpOwoKCWFzc2VydChtZW1i +ZXJfbGlzdF9lbnRyaWVzID09IDEpOwoJYXNzZXJ0KG1lbWJlcl9saXN0WzBdID09IFRFU1RfTk9E +RUlEKTsKCglMRUFWRSgpOwp9CgpzdGF0aWMgdm9pZApDb25mY2hnQ2FsbGJhY2soY3BnX2hhbmRs +ZV90IGhhbmRsZSwKICAgIGNvbnN0IHN0cnVjdCBjcGdfbmFtZSAqZ3JvdXBfbmFtZSwKICAgIGNv +bnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqbWVtYmVyX2xpc3QsIHNpemVfdCBtZW1iZXJfbGlzdF9l +bnRyaWVzLAogICAgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpsZWZ0X2xpc3QsIHNpemVfdCBs +ZWZ0X2xpc3RfZW50cmllcywKICAgIGNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqam9pbmVkX2xp +c3QsIHNpemVfdCBqb2luZWRfbGlzdF9lbnRyaWVzKQp7CglpbnQgaTsKCglFTlRFUigpOwoKCWFz +c2VydChncm91cF9uYW1lLT5sZW5ndGggPT0gc3RybGVuKFRFU1RfR1JPVVBfTkFNRSkpOwoJYXNz +ZXJ0KG1lbWNtcChncm91cF9uYW1lLT52YWx1ZSwgVEVTVF9HUk9VUF9OQU1FLCBzdHJsZW4oVEVT +VF9HUk9VUF9OQU1FKSkgPT0gMCk7CgoJZm9yIChpID0gMDsgaSA8IG1lbWJlcl9saXN0X2VudHJp +ZXM7IGkrKykgewoJCWFzc2VydChtZW1iZXJfbGlzdFtpXS5ub2RlaWQgPT0gVEVTVF9OT0RFSUQp +OwoJfQoKCWlmICghZnVsbF9tZW1iZXJzaGlwX3NlZW4gJiYgbWVtYmVyX2xpc3RfZW50cmllcyA9 +PSBOT19DSElMRFMpIHsKCQlpZiAobXlfaWQgPT0gMCkgewoJCQkvKgoJCQkgKiBGaXJzdCBjaGls +ZCBzZW5kcyBmaXJzdCBtZXNzYWdlCgkJCSAqLwoJCQlzZW5kX21zZyhoYW5kbGUpOwoJCX0gZWxz +ZSB7CgkJCWFkanVzdF9zZW50X3JhbmRfc2VlZCgpOwoJCX0KCgkJZnVsbF9tZW1iZXJzaGlwX3Nl +ZW4gPSAxOwoJfQoKCUxFQVZFKCk7Cn0KCnN0YXRpYyBjcGdfbW9kZWxfdjFfZGF0YV90IG1vZGVs +X2RhdGEgPSB7CgkuY3BnX2RlbGl2ZXJfZm4gPQlEZWxpdmVyQ2FsbGJhY2ssCgkuY3BnX2NvbmZj +aGdfZm4gPQlDb25mY2hnQ2FsbGJhY2ssCgkuY3BnX3RvdGVtX2NvbmZjaGdfZm4gPQlUb3RlbUNv +bmZjaGdDYWxsYmFjaywKCS5mbGFncyA9CQlDUEdfTU9ERUxfVjFfREVMSVZFUl9JTklUSUFMX1RP +VEVNX0NPTkYsCn07CgoKc3RhdGljIHZvaWQKdGVzdF9jcGcodm9pZCkKewoJY3BnX2hhbmRsZV90 +IGNwZ19oYW5kbGU7CglzdHJ1Y3QgY3BnX25hbWUgZ3JvdXBfbmFtZTsKCWNzX2Vycm9yX3QgY3Nf +cmVzOwoJdW5zaWduZWQgaW50IGxvY2FsX25vZGVpZDsKCWludCBjcGdfZmQ7CglzdHJ1Y3QgcG9s +bGZkIHBmZDsKCWludCBwb2xsX3JlczsKCglFTlRFUigpOwoKCXN0cmNweShncm91cF9uYW1lLnZh +bHVlLCBURVNUX0dST1VQX05BTUUpOwoJZ3JvdXBfbmFtZS5sZW5ndGggPSBzdHJsZW4oVEVTVF9H +Uk9VUF9OQU1FKTsKCgljc19yZXBlYXQoY3NfcmVzID0gY3BnX21vZGVsX2luaXRpYWxpemUoJmNw +Z19oYW5kbGUsIENQR19NT0RFTF9WMSwKCSAgICAoY3BnX21vZGVsX2RhdGFfdCAqKSZtb2RlbF9k +YXRhLCBOVUxMKSk7Cglhc3NlcnQoY3NfcmVzID09IENTX09LKTsKCgljc19yZXBlYXQoY3NfcmVz +ID0gY3BnX2pvaW4oY3BnX2hhbmRsZSwgJmdyb3VwX25hbWUpKTsKCWFzc2VydChjc19yZXMgPT0g +Q1NfT0spOwoKCWNzX3JlcGVhdChjc19yZXMgPSBjcGdfbG9jYWxfZ2V0KGNwZ19oYW5kbGUsICZs +b2NhbF9ub2RlaWQpKTsKCWFzc2VydChjc19yZXMgPT0gQ1NfT0spOwoJYXNzZXJ0KGxvY2FsX25v +ZGVpZCA9PSBURVNUX05PREVJRCk7CgoJY3NfcmVwZWF0KGNzX3JlcyA9IGNwZ19mZF9nZXQoY3Bn +X2hhbmRsZSwgJmNwZ19mZCkpOwoJYXNzZXJ0KGNzX3JlcyA9PSBDU19PSyk7CgoJZG8gewoJCXBm +ZC5mZCA9IGNwZ19mZDsKCQlwZmQuZXZlbnRzID0gUE9MTElOOwoJCXBmZC5yZXZlbnRzID0gMDsK +CgkJcG9sbF9yZXMgPSBwb2xsKCZwZmQsIDEsIElORlRJTSk7CgkJaWYgKHBvbGxfcmVzID09IC0x +KSB7CgkJCXBlcnJvcigicG9sbF9yZXMgPT0gLTEiKTsKCQl9CgoJCWFzc2VydChwb2xsX3JlcyAh +PSAwKTsKCQlhc3NlcnQocGZkLnJldmVudHMgJiBQT0xMSU4pOwoKCQljc19yZXBlYXQoY3NfcmVz +ID0gY3BnX2Rpc3BhdGNoKGNwZ19oYW5kbGUsIENTX0RJU1BBVENIX0FMTCkpOwoJCWFzc2VydChj +c19yZXMgPT0gQ1NfT0spOwoJfSB3aGlsZSAodGVzdF9jcGdfbG9vcF9jb250KTsKCgljc19yZXBl +YXQoY3NfcmVzID0gY3BnX2xlYXZlKGNwZ19oYW5kbGUsICZncm91cF9uYW1lKSk7Cglhc3NlcnQo +Y3NfcmVzID09IENTX09LKTsKCgljc19yZXBlYXQoY3NfcmVzID0gY3BnX2ZpbmFsaXplKGNwZ19o +YW5kbGUpKTsKCWFzc2VydChjc19yZXMgPT0gQ1NfT0spOwoKCUxFQVZFKCk7Cn0KCmludAptYWlu +KHZvaWQpCnsKCWludCBpOwoJcGlkX3QgZm9ya19yZXM7CglwaWRfdCB3YWl0X3JlczsKCWludCBz +dGF0dXM7CgoJRU5URVIoKTsKCglzZXRsaW5lYnVmKHN0ZG91dCk7CgoJZm9yIChpID0gMDsgaSA8 +IE5PX0NISUxEUzsgaSsrKSB7CgkJbXlfaWQgPSBpOwoKCQlmb3JrX3JlcyA9IGZvcmsoKTsKCgkJ +aWYgKGZvcmtfcmVzID09IC0xKSB7CgkJCXBlcnJvcigiZm9yayIpOwoJCX0KCgkJaWYgKGZvcmtf +cmVzID09IDApIHsKCQkJLyoKCQkJICogQ2hpbGQKCQkJICovCgkJCWJyZWFrIDsKCQl9IGVsc2Ug +ewoJCQkvKgoJCQkgKiBQYXJlbnQKCQkJICovCgkJCW15X2lkID0gLTE7CgkJfQoJfQoKCWlmIChm +b3JrX3JlcyA9PSAwKSB7CgkJLyoKCQkgKiBDaGlsZCBydW5zIHRoZSB0ZXN0CgkJICovCgkJdGVz +dF9jcGcoKTsKCX0gZWxzZSB7CgkJLyoKCQkgKiBXYWl0IGZvciBjaGlsZHMKCQkgKi8KCQlmb3Ig +KGkgPSAwOyBpIDwgTk9fQ0hJTERTOyBpKyspIHsKCQkJd2FpdF9yZXMgPSB3YWl0KCZzdGF0dXMp +OwoJCQlpZiAod2FpdF9yZXMgPT0gLTEpIHsKCQkJCXBlcnJvcigid2FpdCIpOwoJCQl9CgoJCQlh +c3NlcnQoV0lGRVhJVEVEKHN0YXR1cykpOwoJCQlhc3NlcnQoV0VYSVRTVEFUVVMoc3RhdHVzKSA9 +PSAwKTsKCQl9Cgl9CgoJTEVBVkUoKTsKCglyZXR1cm4gKDApOwp9Cg==" | base64 -d | tee "/tmp/corosync-api-test-mp.c" +# - corosync-api-test-mp.c +################## +# Test functions # +################## +test_corosync_v() { + # Check corosync -v exits without error and + # result version contain numbers in path format [0-9]*.[0-9]*.[0-9] + ver_res=$(corosync -v) + [ "$ver_res" != "${ver_res/[0-9]*\.[0-9]*\.[0-9]/}" ] +} + +test_corosync_keygen() { + rm -f "$COROSYNC_AUTHKEY" + corosync-keygen + + # File exists + [ -f "$COROSYNC_AUTHKEY" ] + + # ... and is not empty (wc format is "SIZE FILENAME" - remove FILENAME part) + wc_res=$(wc -c "$COROSYNC_AUTHKEY") + [ "${wc_res%% *}" -gt 0 ] +} + +# test_corosync_start crypto +# crypto can be on or off +test_corosync_start() { + generate_corosync_conf "$1" > "$COROSYNC_CONF" + cat "$COROSYNC_CONF" + + service_start "corosync" +} + +test_corosync_stop() { + service_stop "corosync" +} + +test_corosync_quorumtool() { + quorumtool_res_file=`mktemp` + # This is already fixed in upstream db38e3958c4f88d5d06e8f7c83d6d90334d9fbd2 + (corosync-quorumtool -ips || true) | tee "$quorumtool_res_file" + + # Ensure this is single node cluster + grep -qi '^Nodes:.*1$' "$quorumtool_res_file" + # Current node id is 1 + grep -qi '^Node ID:.*1$' "$quorumtool_res_file" + # Is quorate (libquorum) + grep -qi '^Quorate:.*Yes$' "$quorumtool_res_file" + # Quorum is 1 + grep -qi '^Quorum:.*1' "$quorumtool_res_file" + # Is quorate (libvotequorum) + grep -qi '^Flags:.*Quorate' "$quorumtool_res_file" + + rm -f "$quorumtool_res_file" +} + +test_corosync_cmapctl() { + cmapctl_res_file=`mktemp` + corosync-cmapctl | tee "$cmapctl_res_file" + # cluster_name key exists in full output + grep -qi '^totem.cluster_name (str) = smoketestcluster$' "$cmapctl_res_file" + + corosync-cmapctl "totem." | tee "$cmapctl_res_file" + # cluster_name key exists in reduced output + grep -qi '^totem.cluster_name (str) = smoketestcluster$' "$cmapctl_res_file" + + # cluster_name key should be returned + corosync-cmapctl -g "totem.cluster_name" | tee "$cmapctl_res_file" + grep -qi '^totem.cluster_name (str) = smoketestcluster$' "$cmapctl_res_file" + + rm -f "$cmapctl_res_file" +} + +# test_corosync_reload - requires stopped corosync +test_corosync_reload() { + cmapctl_res_file=`mktemp` + + test_corosync_start "off" + + # Get current token timeout + corosync-cmapctl -g "runtime.config.totem.token" | tee "$cmapctl_res_file" + cmapctl_res=$(cat "$cmapctl_res_file") + # Format is runtime.config.totem.token (u32) = value + token_pre_reload=${cmapctl_res##* } + [ "$token_pre_reload" -eq "$TOKEN_TIMEOUT" ] + + # Generate new corosync.conf with token_timeout*10 + new_token_timeout=$((TOKEN_TIMEOUT*10)) + generate_corosync_conf "off" "$new_token_timeout" > "$COROSYNC_CONF" + cat "$COROSYNC_CONF" + + # Main call of the test + corosync-cfgtool -R + + # Check that new token timeout is in use + corosync-cmapctl -g "runtime.config.totem.token" | tee "$cmapctl_res_file" + cmapctl_res=$(cat "$cmapctl_res_file") + # Format is runtime.config.totem.token (u32) = value + token_post_reload=${cmapctl_res##* } + [ "$token_post_reload" -eq "$new_token_timeout" ] + + test_corosync_stop + + rm -f "$cmapctl_res_file" +} + +test_corosync_api() { + cflags=$(pkg-config --cflags libcpg) + libs=$(pkg-config --libs libcpg) + + gcc -ggdb -Wall $cflags "/tmp/corosync-api-test.c" \ + $libs -o "/tmp/corosync-api-test" + + /tmp/corosync-api-test +} + +test_corosync_api_mp() { + cflags=$(pkg-config --cflags libcpg) + libs=$(pkg-config --libs libcpg) + + gcc -ggdb -Wall $cflags "/tmp/corosync-api-test-mp.c" \ + $libs -o "/tmp/corosync-api-test-mp" + + /tmp/corosync-api-test-mp +} + +test_corosync_man_pages() { + # At least these man pages should be installed + expected_mp="corosync corosync.conf corosync-cfgtool corosync-cmapctl + corosync-keygen corosync-quorumtool" + + for mp in $expected_mp;do + man -w "$mp" + done +} + +######## +# main # +######## +if [ -z "$PREFIX" ];then + echo "PREFIX not defined. Do not run *.inc.sh directly" + exit 1 +fi + +test_corosync_v +test_corosync_keygen +test_corosync_man_pages + +for crypto in "off" "on";do + test_corosync_start "$crypto" + test_corosync_quorumtool + test_corosync_cmapctl + test_corosync_api + test_corosync_api_mp + test_corosync_stop +done + +test_corosync_reload