Architecture specific change in rpms/rust-wide.git
by githook-noreply@fedoraproject.org
The package rpms/rust-wide.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-wide.git/commit/?id=81d9e71b...
https://src.fedoraproject.org/cgit/rpms/rust-wide.git/commit/?id=4dc7a758....
Change:
+%ifarch s390x
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit 65c476429a822cd018524878286f3b66975bc8bb
Author: Rémi Lauzier <remilauzier(a)protonmail.com>
Date: Tue Jul 6 12:44:54 2021 -0400
Add link
diff --git a/rust-wide.spec b/rust-wide.spec
index 8a7c566..55970e5 100644
--- a/rust-wide.spec
+++ b/rust-wide.spec
@@ -1,5 +1,6 @@
# Generated by rust2rpm 17
# Deactivate tests on s390x as they failed due to endianness problem
+# https://github.com/Lokathor/wide/issues/88
%ifarch s390x
%bcond_with check
%else
commit 81d9e71b3a17f9e359f82a3361919fb8e6bf84eb
Author: Rémi Lauzier <remilauzier(a)protonmail.com>
Date: Tue Jul 6 12:44:23 2021 -0400
Deactivate tests on s390x
diff --git a/rust-wide.spec b/rust-wide.spec
index a260f8f..8a7c566 100644
--- a/rust-wide.spec
+++ b/rust-wide.spec
@@ -1,5 +1,10 @@
# Generated by rust2rpm 17
+# Deactivate tests on s390x as they failed due to endianness problem
+%ifarch s390x
+%bcond_with check
+%else
%bcond_without check
+%endif
%global debug_package %{nil}
%global crate wide
commit 4dc7a7580385e2e90e907da9c6b135466156eb77
Author: Rémi Lauzier <remilauzier(a)protonmail.com>
Date: Tue Jul 6 12:28:05 2021 -0400
Initial import
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0c54600
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/wide-0.6.5.crate
diff --git a/rust-wide.spec b/rust-wide.spec
new file mode 100644
index 0000000..a260f8f
--- /dev/null
+++ b/rust-wide.spec
@@ -0,0 +1,91 @@
+# Generated by rust2rpm 17
+%bcond_without check
+%global debug_package %{nil}
+
+%global crate wide
+
+Name: rust-%{crate}
+Version: 0.6.5
+Release: 1%{?dist}
+Summary: Crate to help you go wide
+
+# Upstream license specification: Zlib OR Apache-2.0 OR MIT
+License: zlib or ASL 2.0 or MIT
+URL: https://crates.io/crates/wide
+Source: %{crates_source}
+# Initial patched metadata
+# Update safe_arch to 0.6
+# https://github.com/Lokathor/wide/pull/87
+Patch0: wide-fix-metadata.diff
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+Crate to help you go wide.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%license LICENSE-ZLIB.md
+%doc README.md
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%package -n %{name}+std-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+std-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "std" feature of "%{crate}" crate.
+
+%files -n %{name}+std-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Sat Jun 19 13:36:27 EDT 2021 Rémi Lauzier <remilauzier(a)protonmail.com> - 0.6.5-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..7bc7df6
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (wide-0.6.5.crate) = 581c7be93687196f57c24d3752782e3e0271228cccd81ddce131d2ae0b29928681cd6b7b19509d077e5167372d1b1a3d81475168657df930d3aac34a90656b84
diff --git a/wide-fix-metadata.diff b/wide-fix-metadata.diff
new file mode 100644
index 0000000..7770d5e
--- /dev/null
+++ b/wide-fix-metadata.diff
@@ -0,0 +1,11 @@
+--- wide-0.6.5/Cargo.toml 1970-01-01T00:00:00+00:00
++++ wide-0.6.5/Cargo.toml 2021-06-23T18:02:52.611701+00:00
+@@ -25,7 +25,7 @@
+ version = "1"
+
+ [dependencies.safe_arch]
+-version = "0.5"
++version = "0.6"
+ features = ["bytemuck"]
+
+ [features]
2 years, 9 months
Architecture specific change in rpms/rust-just.git
by githook-noreply@fedoraproject.org
The package rpms/rust-just.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-just.git/commit/?id=6208ad79....
Change:
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit 6208ad79cf44e9c4353a8bfe4ff8778314a564f7
Author: Olivier Lemasle <o.lemasle(a)gmail.com>
Date: Tue Jul 6 19:02:15 2021 +0200
Initial import (#1978904)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f91d57e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/just-0.9.8.crate
diff --git a/rust-just.spec b/rust-just.spec
new file mode 100644
index 0000000..7ae1bcf
--- /dev/null
+++ b/rust-just.spec
@@ -0,0 +1,104 @@
+# Generated by rust2rpm 17
+%bcond_without check
+
+%global crate just
+
+Name: rust-%{crate}
+Version: 0.9.8
+Release: 1%{?dist}
+Summary: A command runner
+
+# Upstream license specification: CC0-1.0
+License: CC0
+URL: https://crates.io/crates/just
+Source: %{crates_source}
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+just is a handy way to save and run project-specific commands.}
+
+%description %{_description}
+
+%if ! %{__cargo_skip_build}
+%package -n %{crate}
+Summary: %{summary}
+
+%description -n %{crate} %{_description}
+
+%files -n %{crate}
+%license LICENSE
+%doc README.adoc examples
+%doc GRAMMAR.md CHANGELOG.md CONTRIBUTING.md
+%{_bindir}/just
+%{_mandir}/man1/just.1*
+%{_datadir}/bash-completion
+%{_datadir}/fish/
+%{_datadir}/zsh/site-functions
+%endif
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%license LICENSE
+%doc crates-io-readme.md
+%doc GRAMMAR.md CHANGELOG.md CONTRIBUTING.md
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+install -dp %{buildroot}%{_mandir}/man1
+install -p -m 644 man/just.1 %{buildroot}%{_mandir}/man1
+install -dp %{buildroot}%{_datadir}/bash-completion/completions/
+install -p -m 644 completions/just.bash %{buildroot}%{_datadir}/bash-completion/completions/just
+install -dp %{buildroot}%{_datadir}/fish/vendor_completions.d
+install -p -m 644 completions/just.fish %{buildroot}%{_datadir}/fish/vendor_completions.d/just.fish
+install -dp %{buildroot}%{_datadir}/zsh/site-functions
+install -p -m 644 completions/just.zsh %{buildroot}%{_datadir}/zsh/site-functions/_just
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Sun Jul 04 09:45:37 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 0.9.8-1
+- Update to upstream 0.9.8; enable tests
+- Add shell completions
+
+* Sat Jul 03 12:57:26 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 0.9.6-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..7ef680a
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (just-0.9.8.crate) = 46cb9da586f9b226d3632cb102dd3033778630b0501b65e27a8286dc0d8cd8862b4f2be0e2c43a1722c89a889519c885cd9057d3d73758cf7e68a977d9bb4505
2 years, 9 months
Architecture specific change in rpms/rust-safe_arch.git
by githook-noreply@fedoraproject.org
The package rpms/rust-safe_arch.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-safe_arch.git/commit/?id=217....
Change:
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit 217b9106fb1abd7071148be602938b4743c10efb
Author: Rémi Lauzier <remilauzier(a)protonmail.com>
Date: Tue Jul 6 11:46:26 2021 -0400
Initial import
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9a80208
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/safe_arch-0.6.0.crate
diff --git a/rust-safe_arch.spec b/rust-safe_arch.spec
new file mode 100644
index 0000000..a378d1f
--- /dev/null
+++ b/rust-safe_arch.spec
@@ -0,0 +1,87 @@
+# Generated by rust2rpm 17
+%bcond_without check
+%global debug_package %{nil}
+
+%global crate safe_arch
+
+Name: rust-%{crate}
+Version: 0.6.0
+Release: 1%{?dist}
+Summary: Crate that exposes `core::arch` safely via `#[cfg()]`
+
+# Upstream license specification: Zlib OR Apache-2.0 OR MIT
+License: zlib or ASL 2.0 or MIT
+URL: https://crates.io/crates/safe_arch
+Source: %{crates_source}
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+Crate that exposes `core::arch` safely via `#[cfg()]`.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%license LICENSE-ZLIB.md
+%doc README.md
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%package -n %{name}+bytemuck-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+bytemuck-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "bytemuck" feature of "%{crate}" crate.
+
+%files -n %{name}+bytemuck-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Wed Jun 23 13:26:55 EDT 2021 Rémi Lauzier <remilauzier(a)protonmail.com> - 0.6.0-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..6f2e0b7
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (safe_arch-0.6.0.crate) = 37af0aa16b671d3bda2b660979f6f047748b7d8b2f11458e45d8dc3127e15cd36e7d5b3afc686839130bfde39af1a0d17348fc3ba3da388f59c22e276d639d09
2 years, 9 months
Architecture specific change in rpms/rust-camino.git
by githook-noreply@fedoraproject.org
The package rpms/rust-camino.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-camino.git/commit/?id=3b621d....
Change:
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit b026fa0d7fcdf4b7be8f3a02245b906766871ce5
Author: Olivier Lemasle <o.lemasle(a)gmail.com>
Date: Tue Jul 6 18:34:05 2021 +0200
Clarify description and summary
diff --git a/rust-camino.spec b/rust-camino.spec
index 64d9a52..2230c7c 100644
--- a/rust-camino.spec
+++ b/rust-camino.spec
@@ -6,8 +6,8 @@
Name: rust-%{crate}
Version: 1.0.4
-Release: 1%{?dist}
-Summary: UTF-8 paths
+Release: 2%{?dist}
+Summary: Rust's PathBuf and Path types with UTF-8 encoded data
# Upstream license specification: MIT OR Apache-2.0
License: MIT or ASL 2.0
@@ -22,7 +22,10 @@ BuildArch: noarch
BuildRequires: rust-packaging
%global _description %{expand:
-UTF-8 paths.}
+camino's Utf8PathBuf and Utf8Path types are like the standard library's PathBuf
+and Path types, except they are guaranteed to only contain UTF-8 encoded data.
+Therefore, they expose the ability to get their contents as strings, they
+implement Display, etc.}
%description %{_description}
@@ -95,5 +98,8 @@ which use "serde1" feature of "%{crate}" crate.
%endif
%changelog
+* Tue Jul 06 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 1.0.4-2
+- Clarify description and summary
+
* Sat Jul 03 12:22:42 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 1.0.4-1
- Initial package
commit 3b621d0014326b194ed8ac2048104c8892e854aa
Author: Olivier Lemasle <o.lemasle(a)gmail.com>
Date: Tue Jul 6 18:31:55 2021 +0200
Initial import (#1978902)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..09412d5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/camino-1.0.4.crate
diff --git a/rust-camino.spec b/rust-camino.spec
new file mode 100644
index 0000000..64d9a52
--- /dev/null
+++ b/rust-camino.spec
@@ -0,0 +1,99 @@
+# Generated by rust2rpm 17
+%bcond_without check
+%global debug_package %{nil}
+
+%global crate camino
+
+Name: rust-%{crate}
+Version: 1.0.4
+Release: 1%{?dist}
+Summary: UTF-8 paths
+
+# Upstream license specification: MIT OR Apache-2.0
+License: MIT or ASL 2.0
+URL: https://crates.io/crates/camino
+Source: %{crates_source}
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+UTF-8 paths.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%doc README.md CHANGELOG.md CODE_OF_CONDUCT.md
+%license LICENSE-APACHE LICENSE-MIT
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%package -n %{name}+serde-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+serde-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "serde" feature of "%{crate}" crate.
+
+%files -n %{name}+serde-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%package -n %{name}+serde1-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+serde1-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "serde1" feature of "%{crate}" crate.
+
+%files -n %{name}+serde1-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Sat Jul 03 12:22:42 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 1.0.4-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..bad71c6
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (camino-1.0.4.crate) = d095e5d35920647a2b03f8fa5a1a699bb25b2f2368c47a60457e65cfc87ca1a0447e574e0894f57bb2705148e1deb480893b3fd92ae7f2745ac6edcff6217ea6
2 years, 9 months
Architecture specific change in rpms/rust-temptree.git
by githook-noreply@fedoraproject.org
The package rpms/rust-temptree.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-temptree.git/commit/?id=aae7....
Change:
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit aae78484dbe397e181c24b2936a8e6b452fe66de
Author: Olivier Lemasle <o.lemasle(a)gmail.com>
Date: Tue Jul 6 18:39:15 2021 +0200
Initial import (#1978986)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3db996d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/temptree-0.1.0.crate
diff --git a/rust-temptree.spec b/rust-temptree.spec
new file mode 100644
index 0000000..00f2e4f
--- /dev/null
+++ b/rust-temptree.spec
@@ -0,0 +1,81 @@
+# Generated by rust2rpm 17
+%bcond_without check
+%global debug_package %{nil}
+
+%global crate temptree
+
+Name: rust-%{crate}
+Version: 0.1.0
+Release: 1%{?dist}
+Summary: Temporary trees of files
+
+# Upstream license specification: CC0-1.0
+License: CC0
+URL: https://crates.io/crates/temptree
+Source: %{crates_source}
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+Temporary trees of files.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%doc README.md CHANGELOG.md CONTRIBUTING
+%license LICENSE
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Sun Jul 04 09:40:52 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 0.1.0-1
+- Update to upstream 0.1.0
+
+* Sun Jul 04 00:41:09 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 0.0.1-1
+- Update to upstream 0.0.1 (add license file)
+
+* Sun Jul 04 00:18:20 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 0.0.0-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..b987f09
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (temptree-0.1.0.crate) = 9540e32e36f4d9cbbfff0cc6410e9fa3b85703b43539b07f16a74c15bb916da687140273d5b2d0c2d4f2b1247aa26fbbac1fd9028d60a92e94247f83e678a4fe
2 years, 9 months
Architecture specific change in rpms/rust-executable-path.git
by githook-noreply@fedoraproject.org
The package rpms/rust-executable-path.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-executable-path.git/commit/?....
Change:
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit c85b565323c0f1f9a3c7fc77087db4e8b88d3352
Author: Olivier Lemasle <o.lemasle(a)gmail.com>
Date: Tue Jul 6 18:36:31 2021 +0200
Initial import (#1978985)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1978272
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/executable-path-1.0.0.crate
diff --git a/rust-executable-path.spec b/rust-executable-path.spec
new file mode 100644
index 0000000..9c5d6fc
--- /dev/null
+++ b/rust-executable-path.spec
@@ -0,0 +1,75 @@
+# Generated by rust2rpm 17
+%bcond_without check
+%global debug_package %{nil}
+
+%global crate executable-path
+
+Name: rust-%{crate}
+Version: 1.0.0
+Release: 1%{?dist}
+Summary: Get the path of a binary target's executable
+
+# Upstream license specification: CC0-1.0
+License: CC0
+URL: https://crates.io/crates/executable-path
+Source: %{crates_source}
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+Get the path of a binary target's executable.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%license LICENSE
+%doc README.md
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Sun Jun 20 19:41:10 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 1.0.0-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..1d122f9
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (executable-path-1.0.0.crate) = 40483193290dbd617c874927c2f54d72a75c374cc81e3db0e490c9cecff03f53a3c92db177e4c66372477c841fa233e84d4b6d44ea90452d5f46ecfcb679db0d
2 years, 9 months
Architecture specific change in rpms/rust-lexiclean.git
by githook-noreply@fedoraproject.org
The package rpms/rust-lexiclean.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-lexiclean.git/commit/?id=1b8....
Change:
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit 1b8522f5b19b38e731ffadeddd3ad4508d31961e
Author: Olivier Lemasle <o.lemasle(a)gmail.com>
Date: Tue Jul 6 18:28:02 2021 +0200
Initial import (#1978900)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..67fed9d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/lexiclean-0.0.1.crate
diff --git a/rust-lexiclean.spec b/rust-lexiclean.spec
new file mode 100644
index 0000000..7052531
--- /dev/null
+++ b/rust-lexiclean.spec
@@ -0,0 +1,75 @@
+# Generated by rust2rpm 17
+%bcond_without check
+%global debug_package %{nil}
+
+%global crate lexiclean
+
+Name: rust-%{crate}
+Version: 0.0.1
+Release: 1%{?dist}
+Summary: Lexically clean paths
+
+# Upstream license specification: CC0-1.0
+License: CC0
+URL: https://crates.io/crates/lexiclean
+Source: %{crates_source}
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+Lexically clean paths.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%doc README.md CONTRIBUTING
+%license LICENSE
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Sat Jul 03 12:30:11 CEST 2021 Olivier Lemasle <o.lemasle(a)gmail.com> - 0.0.1-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..47c7e96
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (lexiclean-0.0.1.crate) = 5f60056a6830fcd21ece4fbdbaba5cf4b8bf33d85aa520c32de44a2f821c6dab60d2c9ec108981bd081f394e216ae45b62c9aa7f223eaf6702dd0586157ec868
2 years, 9 months
Architecture specific change in rpms/pacemaker.git
by githook-noreply@fedoraproject.org
The package rpms/pacemaker.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/pacemaker.git/commit/?id=5603f192....
Change:
+ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
Thanks.
Full change:
============
commit 5603f1922d76984e428988af1575ffd06e0c322f
Author: Klaus Wenninger <klaus.wenninger(a)aon.at>
Date: Mon Jul 5 18:38:43 2021 +0200
* Mon Jul 5 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-6
- synced/merged with CS9 spec-file for current 2.1.0-release build
* Tue Jun 8 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-0.5.rc3
- silence f33 s390x build complaining about possible format-trucation
diff --git a/001-ping-agent.patch b/001-ping-agent.patch
new file mode 100644
index 0000000..89fe41a
--- /dev/null
+++ b/001-ping-agent.patch
@@ -0,0 +1,225 @@
+From c6ee0973522268ed7b3241cf0ec2e06398444114 Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 4 May 2021 12:02:17 -0400
+Subject: [PATCH 1/4] Remove deprecated attrd_options
+
+---
+ extra/resources/ping | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index 3cf8dfe..2e93f22 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -178,7 +178,7 @@ ping_stop() {
+
+ rm -f "${OCF_RESKEY_pidfile}"
+
+- attrd_updater -D -n "$OCF_RESKEY_name" -d "$OCF_RESKEY_dampen" $attrd_options
++ attrd_updater -D -n "$OCF_RESKEY_name" -d "$OCF_RESKEY_dampen"
+
+ return $OCF_SUCCESS
+ }
+@@ -302,9 +302,9 @@ ping_update() {
+
+ score=$(expr $active \* $OCF_RESKEY_multiplier)
+ if [ "$__OCF_ACTION" = "start" ] ; then
+- attrd_updater -n "$OCF_RESKEY_name" -B "$score" -d "$OCF_RESKEY_dampen" $attrd_options
++ attrd_updater -n "$OCF_RESKEY_name" -B "$score" -d "$OCF_RESKEY_dampen"
+ else
+- attrd_updater -n "$OCF_RESKEY_name" -v "$score" -d "$OCF_RESKEY_dampen" $attrd_options
++ attrd_updater -n "$OCF_RESKEY_name" -v "$score" -d "$OCF_RESKEY_dampen"
+ fi
+ rc=$?
+ case $rc in
+@@ -396,11 +396,6 @@ case "${OCF_RESKEY_debug}" in
+ ;;
+ esac
+
+-attrd_options='-q'
+-if [ "${OCF_RESKEY_debug}" = "true" ]; then
+- attrd_options=''
+-fi
+-
+ case "$__OCF_ACTION" in
+ meta-data) meta_data
+ exit $OCF_SUCCESS
+--
+1.8.3.1
+
+
+From 6d6c4691cf0970059689856c354daf9e098b4451 Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 4 May 2021 14:50:37 -0400
+Subject: [PATCH 2/4] Replace debug values, true and false, with 0 and 1
+
+---
+ extra/resources/ping | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index 2e93f22..fee019b 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -24,7 +24,7 @@
+ : ${OCF_RESKEY_dampen:="5s"}
+ : ${OCF_RESKEY_attempts:="3"}
+ : ${OCF_RESKEY_multiplier:="1"}
+-: ${OCF_RESKEY_debug:="false"}
++: ${OCF_RESKEY_debug:="0"}
+ : ${OCF_RESKEY_failure_score:="0"}
+ : ${OCF_RESKEY_use_fping:="1"}
+ : ${OCF_RESKEY_host_list:=""}
+@@ -152,7 +152,7 @@ END
+
+ ping_conditional_log() {
+ level="$1"; shift
+- if [ "${OCF_RESKEY_debug}" = "true" ]; then
++ if [ $OCF_RESKEY_debug -gt 0 ]; then
+ ocf_log "$level" "$*"
+ fi
+ }
+@@ -388,8 +388,8 @@ fi
+
+ # Check the debug option
+ case "${OCF_RESKEY_debug}" in
+- true|True|TRUE|1) OCF_RESKEY_debug=true;;
+- false|False|FALSE|0) OCF_RESKEY_debug=false;;
++ true|True|TRUE|1) OCF_RESKEY_debug=0;;
++ false|False|FALSE|0) OCF_RESKEY_debug=1;;
+ *)
+ ocf_log warn "Value for 'debug' is incorrect. Please specify 'true' or 'false' not: ${OCF_RESKEY_debug}"
+ OCF_RESKEY_debug=false
+--
+1.8.3.1
+
+
+From a886a31056b6aca764c6911f5432af2c5ebf51df Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 11 May 2021 11:04:50 -0400
+Subject: [PATCH 3/4] Add verbose debug mode which logs ping and fping output
+ when set
+
+---
+ extra/resources/ping | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index fee019b..cc796af 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -249,10 +249,13 @@ fping_check() {
+
+ case $rc in
+ 0)
++ if [ $OCF_RESKEY_debug -gt 1 ]; then
++ ping_conditional_log info "$output"
++ fi
+ ;;
+ 1)
+ for h in $(echo "$output" | grep "is unreachable" | awk '{print $1}'); do
+- ping_conditional_log warn "$h is inactive"
++ ping_conditional_log warn "$h is inactive: $output"
+ done
+ ;;
+ *)
+@@ -282,7 +285,12 @@ ping_check() {
+ p_out=$($p_exe $p_args $OCF_RESKEY_options $host 2>&1); rc=$?
+
+ case $rc in
+- 0) active=$(expr $active + 1);;
++ 0)
++ active=$(expr $active + 1)
++ if [ $OCF_RESKEY_debug -gt 1 ]; then
++ ping_conditional_log info "$p_out"
++ fi
++ ;;
+ 1) ping_conditional_log warn "$host is inactive: $p_out";;
+ *) ocf_log err "Unexpected result for '$p_exe $p_args $OCF_RESKEY_options $host' $rc: $p_out";;
+ esac
+@@ -388,10 +396,11 @@ fi
+
+ # Check the debug option
+ case "${OCF_RESKEY_debug}" in
+- true|True|TRUE|1) OCF_RESKEY_debug=0;;
+- false|False|FALSE|0) OCF_RESKEY_debug=1;;
++ true|True|TRUE|1) OCF_RESKEY_debug=1;;
++ false|False|FALSE|0) OCF_RESKEY_debug=0;;
++ verbose|Verbose|VERBOSE|2) OCF_RESKEY_debug=2;;
+ *)
+- ocf_log warn "Value for 'debug' is incorrect. Please specify 'true' or 'false' not: ${OCF_RESKEY_debug}"
++ ocf_log warn "Value for 'debug' is incorrect. Please specify 'true', 'false', or 'verbose', not: ${OCF_RESKEY_debug}"
+ OCF_RESKEY_debug=false
+ ;;
+ esac
+--
+1.8.3.1
+
+
+From 460043f133ced80e923b1290af70502a72deb7f8 Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 11 May 2021 11:07:05 -0400
+Subject: [PATCH 4/4] Improve variable names
+
+---
+ extra/resources/ping | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index cc796af..9763b60 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -244,22 +244,22 @@ fping_check() {
+ timeout=$(expr $OCF_RESKEY_timeout \* 1000 / $OCF_RESKEY_attempts)
+
+ cmd="$p_exe -r $OCF_RESKEY_attempts -t $timeout -B 1.0 $OCF_RESKEY_options $OCF_RESKEY_host_list"
+- output=$($cmd 2>&1); rc=$?
+- active=$(echo "$output" | grep "is alive" | wc -l)
++ fping_output=$($cmd 2>&1); rc=$?
++ active=$(echo "$fping_output" | grep "is alive" | wc -l)
+
+ case $rc in
+ 0)
+ if [ $OCF_RESKEY_debug -gt 1 ]; then
+- ping_conditional_log info "$output"
++ ping_conditional_log info "$fping_output"
+ fi
+ ;;
+ 1)
+- for h in $(echo "$output" | grep "is unreachable" | awk '{print $1}'); do
+- ping_conditional_log warn "$h is inactive: $output"
++ for h in $(echo "$fping_output" | grep "is unreachable" | awk '{print $1}'); do
++ ping_conditional_log warn "$h is inactive: $fping_output"
+ done
+ ;;
+ *)
+- ocf_log err "Unexpected result for '$cmd' $rc: $(echo "$output" | tr '\n' ';')"
++ ocf_log err "Unexpected result for '$cmd' $rc: $(echo "$fping_output" | tr '\n' ';')"
+ ;;
+ esac
+
+@@ -282,17 +282,17 @@ ping_check() {
+ *:*) p_exe=ping6
+ esac
+
+- p_out=$($p_exe $p_args $OCF_RESKEY_options $host 2>&1); rc=$?
++ ping_output=$($p_exe $p_args $OCF_RESKEY_options $host 2>&1); rc=$?
+
+ case $rc in
+ 0)
+ active=$(expr $active + 1)
+ if [ $OCF_RESKEY_debug -gt 1 ]; then
+- ping_conditional_log info "$p_out"
++ ping_conditional_log info "$ping_output"
+ fi
+ ;;
+- 1) ping_conditional_log warn "$host is inactive: $p_out";;
+- *) ocf_log err "Unexpected result for '$p_exe $p_args $OCF_RESKEY_options $host' $rc: $p_out";;
++ 1) ping_conditional_log warn "$host is inactive: $ping_output";;
++ *) ocf_log err "Unexpected result for '$p_exe $p_args $OCF_RESKEY_options $host' $rc: $ping_output";;
+ esac
+ done
+ return $active
+--
+1.8.3.1
+
diff --git a/002-pacemakerd-options.patch b/002-pacemakerd-options.patch
new file mode 100644
index 0000000..56941ec
--- /dev/null
+++ b/002-pacemakerd-options.patch
@@ -0,0 +1,451 @@
+From 0d40ebf10b1794ece2c5c9768ea7222d3834d3b3 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 11:42:18 -0400
+Subject: [PATCH 1/4] Build: Use a different variable to find man page
+ includes.
+
+With other programs outside of the tools directory being converted to
+use glib for command line handling, their includes are not going to be
+in tools/. So we need to use a different autoconf variable to find
+them.
+---
+ mk/common.mk | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/mk/common.mk b/mk/common.mk
+index b247670..aa59feb 100644
+--- a/mk/common.mk
++++ b/mk/common.mk
+@@ -1,5 +1,5 @@
+ #
+-# Copyright 2014-2020 the Pacemaker project contributors
++# Copyright 2014-2021 the Pacemaker project contributors
+ #
+ # The version control history for this file may have further details.
+ #
+@@ -68,11 +68,11 @@ HELP2MAN_ARGS = -N --section 8 --name "Part of the Pacemaker cluster resource ma
+ # and all wrappers to C code.
+ %.8: % $(MAN8DEPS)
+ $(AM_V_at)chmod a+x $(abs_builddir)/$<
+- $(AM_V_MAN)if [ -f $(top_srcdir)/tools/$@.inc ]; then \
++ $(AM_V_MAN)if [ -f $(abs_srcdir)/$@.inc ]; then \
+ PATH=$(abs_builddir):$$PATH $(HELP2MAN) $(HELP2MAN_ARGS) \
+ -h --help-all \
+ --no-discard-stderr \
+- -i $(top_srcdir)/tools/$@.inc $(abs_builddir)/$< \
++ -i $(abs_srcdir)/$@.inc $(abs_builddir)/$< \
+ | sed -f $(top_srcdir)/tools/fix-manpages > $@ ; \
+ else \
+ PATH=$(abs_builddir):$$PATH $(HELP2MAN) $(HELP2MAN_ARGS) \
+--
+1.8.3.1
+
+
+From c7ab1d901bcbbf0137277e783e072777ca2f82d9 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 11:44:16 -0400
+Subject: [PATCH 2/4] Refactor: daemons: Remove the pid_file variable from
+ pacemakerd.
+
+It's never used anywhere.
+---
+ daemons/pacemakerd/pacemakerd.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index 8ec9708..03d688e 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -27,8 +27,7 @@
+
+ static crm_trigger_t *shutdown_trigger = NULL;
+ static crm_trigger_t *startup_trigger = NULL;
+-static const char *pid_file = PCMK_RUN_DIR "/pacemaker.pid";
+
+ /* state we report when asked via pacemakerd-api status-ping */
+ static const char *pacemakerd_state = XML_PING_ATTR_PACEMAKERDSTATE_INIT;
+ static gboolean running_with_sbd = FALSE; /* local copy */
+@@ -224,7 +222,6 @@ main(int argc, char **argv)
+ /* Legacy */
+ break;
+ case 'p':
+- pid_file = optarg;
+ break;
+ case 's':
+ pcmk__set_env_option("node_start_state", "standby");
+--
+1.8.3.1
+
+
+From 98990eed9f6a5dbde7c8a5aa0783e93d5479295b Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 13:14:38 -0400
+Subject: [PATCH 3/4] Refactor: daemons: Use glib for command line handling in
+ pacemakerd.
+
+---
+ daemons/pacemakerd/Makefile.am | 2 +
+ daemons/pacemakerd/pacemakerd.8.inc | 5 +
+ daemons/pacemakerd/pacemakerd.c | 195 ++++++++++++++++++------------------
+ 3 files changed, 102 insertions(+), 100 deletions(-)
+ create mode 100644 daemons/pacemakerd/pacemakerd.8.inc
+
+diff --git a/daemons/pacemakerd/Makefile.am b/daemons/pacemakerd/Makefile.am
+index cc657f5..84517a3 100644
+--- a/daemons/pacemakerd/Makefile.am
++++ b/daemons/pacemakerd/Makefile.am
+@@ -15,6 +15,8 @@ if BUILD_SYSTEMD
+ systemdsystemunit_DATA = pacemaker.service
+ endif
+
++EXTRA_DIST = pacemakerd.8.inc
++
+ ## SOURCES
+
+ noinst_HEADERS = pacemakerd.h
+diff --git a/daemons/pacemakerd/pacemakerd.8.inc b/daemons/pacemakerd/pacemakerd.8.inc
+new file mode 100644
+index 0000000..902af4e
+--- /dev/null
++++ b/daemons/pacemakerd/pacemakerd.8.inc
+@@ -0,0 +1,5 @@
++[synopsis]
++pacemakerd [options]
++
++/subsidiary Pacemaker daemons/
++.SH OPTIONS
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index 03d688e..ce194bf 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -23,12 +23,54 @@
+ #include <crm/msg_xml.h>
+ #include <crm/common/ipc_internal.h>
+ #include <crm/common/mainloop.h>
++#include <crm/common/cmdline_internal.h>
+ #include <crm/cluster/internal.h>
+ #include <crm/cluster.h>
+
+ #include <dirent.h>
+ #include <ctype.h>
+
++#define SUMMARY "pacemakerd - primary Pacemaker daemon that launches and monitors all subsidiary Pacemaker daemons"
++
++struct {
++ gboolean features;
++ gboolean foreground;
++ gboolean shutdown;
++ gboolean standby;
++} options;
++
++static gboolean
++pid_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
++ return TRUE;
++}
++
++static gboolean
++standby_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
++ options.standby = TRUE;
++ pcmk__set_env_option("node_start_state", "standby");
++ return TRUE;
++}
++
++static GOptionEntry entries[] = {
++ { "features", 'F', 0, G_OPTION_ARG_NONE, &options.features,
++ "Display full version and list of features Pacemaker was built with",
++ NULL },
++ { "foreground", 'f', 0, G_OPTION_ARG_NONE, &options.foreground,
++ "(Ignored) Pacemaker always runs in the foreground",
++ NULL },
++ { "pid-file", 'p', 0, G_OPTION_ARG_CALLBACK, pid_cb,
++ "(Ignored) Daemon pid file location",
++ "FILE" },
++ { "shutdown", 'S', 0, G_OPTION_ARG_NONE, &options.shutdown,
++ "Instruct Pacemaker to shutdown on this machine",
++ NULL },
++ { "standby", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, standby_cb,
++ "Start node in standby state",
++ NULL },
++
++ { NULL }
++};
++
+ static gboolean fatal_error = FALSE;
+ static GMainLoop *mainloop = NULL;
+ static bool global_keep_tracking = false;
+@@ -642,49 +685,6 @@ pcmk_sigquit(int nsig)
+ .connection_destroyed = pcmk_ipc_destroy
+ };
+
+-static pcmk__cli_option_t long_options[] = {
+- // long option, argument type, storage, short option, description, flags
+- {
+- "help", no_argument, NULL, '?',
+- "\tThis text", pcmk__option_default
+- },
+- {
+- "version", no_argument, NULL, '$',
+- "\tVersion information", pcmk__option_default
+- },
+- {
+- "verbose", no_argument, NULL, 'V',
+- "\tIncrease debug output", pcmk__option_default
+- },
+- {
+- "shutdown", no_argument, NULL, 'S',
+- "\tInstruct Pacemaker to shutdown on this machine", pcmk__option_default
+- },
+- {
+- "features", no_argument, NULL, 'F',
+- "\tDisplay full version and list of features Pacemaker was built with",
+- pcmk__option_default
+- },
+- {
+- "-spacer-", no_argument, NULL, '-',
+- "\nAdditional Options:", pcmk__option_default
+- },
+- {
+- "foreground", no_argument, NULL, 'f',
+- "\t(Ignored) Pacemaker always runs in the foreground",
+- pcmk__option_default
+- },
+- {
+- "pid-file", required_argument, NULL, 'p',
+- "\t(Ignored) Daemon pid file location", pcmk__option_default
+- },
+- {
+- "standby", no_argument, NULL, 's',
+- "\tStart node in standby state", pcmk__option_default
+- },
+- { 0, 0, 0, 0 }
+-};
+-
+ static void
+ mcp_chown(const char *path, uid_t uid, gid_t gid)
+ {
+@@ -1168,83 +1211,66 @@ request_shutdown(crm_ipc_t *ipc)
+ return status;
+ }
+
++static GOptionContext *
++build_arg_context(pcmk__common_args_t *args) {
++ GOptionContext *context = NULL;
++
++ context = pcmk__build_arg_context(args, NULL, NULL, NULL);
++ pcmk__add_main_args(context, entries);
++ return context;
++}
++
+ int
+ main(int argc, char **argv)
+ {
+- int flag;
+- int argerr = 0;
++ crm_exit_t exit_code = CRM_EX_OK;
++
++ GError *error = NULL;
++
++ pcmk__common_args_t *args = pcmk__new_common_args(SUMMARY);
++ gchar **processed_args = pcmk__cmdline_preproc(argv, "p");
++ GOptionContext *context = build_arg_context(args);
+
+- int option_index = 0;
+ bool old_instance_connected = false;
+- gboolean shutdown = FALSE;
+
+ crm_ipc_t *old_instance = NULL;
+ qb_ipcs_service_t *ipcs = NULL;
+
+ crm_log_preinit(NULL, argc, argv);
+- pcmk__set_cli_options(NULL, "[options]", long_options,
+- "primary Pacemaker daemon that launches and "
+- "monitors all subsidiary Pacemaker daemons");
+ mainloop_add_signal(SIGHUP, pcmk_ignore);
+ mainloop_add_signal(SIGQUIT, pcmk_sigquit);
+
+- while (1) {
+- flag = pcmk__next_cli_option(argc, argv, &option_index, NULL);
+- if (flag == -1)
+- break;
+-
+- switch (flag) {
+- case 'V':
+- crm_bump_log_level(argc, argv);
+- break;
+- case 'f':
+- /* Legacy */
+- break;
+- case 'p':
+- break;
+- case 's':
+- pcmk__set_env_option("node_start_state", "standby");
+- break;
+- case '$':
+- case '?':
+- pcmk__cli_help(flag, CRM_EX_OK);
+- break;
+- case 'S':
+- shutdown = TRUE;
+- break;
+- case 'F':
+- printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
+- CRM_FEATURE_SET, CRM_FEATURES);
+- crm_exit(CRM_EX_OK);
+- default:
+- printf("Argument code 0%o (%c) is not (?yet?) supported\n", flag, flag);
+- ++argerr;
+- break;
+- }
++ if (!g_option_context_parse_strv(context, &processed_args, &error)) {
++ exit_code = CRM_EX_USAGE;
++ goto done;
+ }
+
+- if (optind < argc) {
+- printf("non-option ARGV-elements: ");
+- while (optind < argc)
+- printf("%s ", argv[optind++]);
+- printf("\n");
+- }
+- if (argerr) {
+- pcmk__cli_help('?', CRM_EX_USAGE);
++ if (options.features) {
++ printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
++ CRM_FEATURE_SET, CRM_FEATURES);
++ exit_code = CRM_EX_OK;
++ goto done;
+ }
+
++ if (args->version) {
++ g_strfreev(processed_args);
++ pcmk__free_arg_context(context);
++ /* FIXME: When pacemakerd is converted to use formatted output, this can go. */
++ pcmk__cli_help('v', CRM_EX_USAGE);
++ }
+
+ setenv("LC_ALL", "C", 1);
+
+ pcmk__set_env_option("mcp", "true");
+
++ pcmk__cli_init_logging("pacemakerd", args->verbosity);
+ crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
+
+ crm_debug("Checking for existing Pacemaker instance");
+ old_instance = crm_ipc_new(CRM_SYSTEM_MCP, 0);
+ old_instance_connected = crm_ipc_connect(old_instance);
+
+- if (shutdown) {
++ if (options.shutdown) {
+ if (old_instance_connected) {
+ crm_exit(request_shutdown(old_instance));
+ } else {
+@@ -1253,22 +1279,25 @@ main(int argc, char **argv)
+ "Pacemaker instance: %s", strerror(errno));
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+- crm_exit(CRM_EX_DISCONNECT);
++ exit_code = CRM_EX_DISCONNECT;
++ goto done;
+ }
+
+ } else if (old_instance_connected) {
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+ crm_err("Aborting start-up because active Pacemaker instance found");
+- crm_exit(CRM_EX_FATAL);
++ exit_code = CRM_EX_FATAL;
++ goto done;
+ }
+
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+
+ #ifdef SUPPORT_COROSYNC
+ if (mcp_read_config() == FALSE) {
+- crm_exit(CRM_EX_UNAVAILABLE);
++ exit_code = CRM_EX_UNAVAILABLE;
++ goto done;
+ }
+ #endif
+
+@@ -1292,7 +1321,8 @@ main(int argc, char **argv)
+ #ifdef SUPPORT_COROSYNC
+ /* Allows us to block shutdown */
+ if (!cluster_connect_cfg()) {
+- crm_exit(CRM_EX_PROTOCOL);
++ exit_code = CRM_EX_PROTOCOL;
++ goto done;
+ }
+ #endif
+
+@@ -1307,9 +1337,11 @@ main(int argc, char **argv)
+ case pcmk_rc_ok:
+ break;
+ case pcmk_rc_ipc_unauthorized:
+- crm_exit(CRM_EX_CANTCREAT);
++ exit_code = CRM_EX_CANTCREAT;
++ goto done;
+ default:
+- crm_exit(CRM_EX_FATAL);
++ exit_code = CRM_EX_FATAL;
++ goto done;
+ };
+
+ mainloop_add_signal(SIGTERM, pcmk_shutdown);
+@@ -1342,5 +1374,11 @@ main(int argc, char **argv)
+ #ifdef SUPPORT_COROSYNC
+ cluster_disconnect_cfg();
+ #endif
+- crm_exit(CRM_EX_OK);
++
++done:
++ g_strfreev(processed_args);
++ pcmk__free_arg_context(context);
++
++ pcmk__output_and_clear_error(error, NULL);
++ crm_exit(exit_code);
+ }
+--
+1.8.3.1
+
+
+From 8f7924fbb2a012bedcad59335b7bebc5020b26e3 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 13:27:13 -0400
+Subject: [PATCH 4/4] Low: pacemaker.service: Don't start pacemakerd with -f.
+
+This option is completely ignored by pacemakerd.
+---
+ daemons/pacemakerd/pacemaker.service.in | 2 +-
+ doc/sphinx/Clusters_from_Scratch/verification.rst | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemaker.service.in b/daemons/pacemakerd/pacemaker.service.in
+index b128ddc..0363a22 100644
+--- a/daemons/pacemakerd/pacemaker.service.in
++++ b/daemons/pacemakerd/pacemaker.service.in
+@@ -44,7 +44,7 @@ EnvironmentFile=-@CONFIGDIR@/pacemaker
+ EnvironmentFile=-@CONFIGDIR@/sbd
+ SuccessExitStatus=100
+
+-ExecStart=@sbindir@/pacemakerd -f
++ExecStart=@sbindir@/pacemakerd
+
+ # Systemd v227 and above can limit the number of processes spawned by a
+ # service. That is a bad idea for an HA cluster resource manager, so disable it
+diff --git a/doc/sphinx/Clusters_from_Scratch/verification.rst b/doc/sphinx/Clusters_from_Scratch/verification.rst
+index 9d647f8..b7fa20e 100644
+--- a/doc/sphinx/Clusters_from_Scratch/verification.rst
++++ b/doc/sphinx/Clusters_from_Scratch/verification.rst
+@@ -103,7 +103,7 @@ the necessary processes are running:
+ 2 ? S 0:00 [kthreadd]
+ ...lots of processes...
+ 17121 ? SLsl 0:01 /usr/sbin/corosync -f
+- 17133 ? Ss 0:00 /usr/sbin/pacemakerd -f
++ 17133 ? Ss 0:00 /usr/sbin/pacemakerd
+ 17134 ? Ss 0:00 \_ /usr/libexec/pacemaker/pacemaker-based
+ 17135 ? Ss 0:00 \_ /usr/libexec/pacemaker/pacemaker-fenced
+ 17136 ? Ss 0:00 \_ /usr/libexec/pacemaker/pacemaker-execd
+--
+1.8.3.1
+
diff --git a/003-pacemakerd-output.patch b/003-pacemakerd-output.patch
new file mode 100644
index 0000000..167e22b
--- /dev/null
+++ b/003-pacemakerd-output.patch
@@ -0,0 +1,343 @@
+From 7c35387a9896cb968cf4087b5cbed94af44e1ea5 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 14 May 2021 12:03:46 -0400
+Subject: [PATCH 1/5] Feature: daemons: Convert pacemakerd to formatted output.
+
+The main purpose of this is to finish getting pacemakerd moved off the
+existing command line handling code (pcmk__cli_help in particular) so
+that code can eventually be deprecated or removed. pacemakerd itself
+does fairly little printing.
+---
+ daemons/pacemakerd/pacemakerd.c | 58 ++++++++++++++++++++++++++++++-----------
+ 1 file changed, 43 insertions(+), 15 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index ce194bf..bd59729 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -25,6 +25,7 @@
+ #include <crm/common/ipc_internal.h>
+ #include <crm/common/mainloop.h>
+ #include <crm/common/cmdline_internal.h>
++#include <crm/common/output_internal.h>
+ #include <crm/cluster/internal.h>
+ #include <crm/cluster.h>
+
+@@ -37,6 +38,14 @@ struct {
+ gboolean standby;
+ } options;
+
++static pcmk__output_t *out = NULL;
++
++static pcmk__supported_format_t formats[] = {
++ PCMK__SUPPORTED_FORMAT_NONE,
++ PCMK__SUPPORTED_FORMAT_TEXT,
++ { NULL, NULL, NULL }
++};
++
+ static gboolean
+ pid_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
+ return TRUE;
+@@ -1167,10 +1176,10 @@ pacemakerd_event_cb(pcmk_ipc_api_t *pacemakerd_api,
+ }
+
+ static GOptionContext *
+-build_arg_context(pcmk__common_args_t *args) {
++build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
+ GOptionContext *context = NULL;
+
+- context = pcmk__build_arg_context(args, NULL, NULL, NULL);
++ context = pcmk__build_arg_context(args, "text", group, NULL);
+ pcmk__add_main_args(context, entries);
+ return context;
+ }
+@@ -1182,9 +1191,11 @@ main(int argc, char **argv)
+
+ GError *error = NULL;
+
++ int rc = pcmk_rc_ok;
++ GOptionGroup *output_group = NULL;
+ pcmk__common_args_t *args = pcmk__new_common_args(SUMMARY);
+ gchar **processed_args = pcmk__cmdline_preproc(argv, "p");
+- GOptionContext *context = build_arg_context(args);
++ GOptionContext *context = build_arg_context(args, &output_group);
+
+ bool old_instance_connected = false;
+
+@@ -1195,23 +1205,30 @@ main(int argc, char **argv)
+ mainloop_add_signal(SIGHUP, pcmk_ignore);
+ mainloop_add_signal(SIGQUIT, pcmk_sigquit);
+
++ pcmk__register_formats(output_group, formats);
+ if (!g_option_context_parse_strv(context, &processed_args, &error)) {
+ exit_code = CRM_EX_USAGE;
+ goto done;
+ }
+
++ rc = pcmk__output_new(&out, args->output_ty, args->output_dest, argv);
++ if (rc != pcmk_rc_ok) {
++ exit_code = CRM_EX_ERROR;
++ g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Error creating output format %s: %s",
++ args->output_ty, pcmk_rc_str(rc));
++ goto done;
++ }
++
+ if (options.features) {
+- printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
+- CRM_FEATURE_SET, CRM_FEATURES);
++ out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
++ BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
+ exit_code = CRM_EX_OK;
+ goto done;
+ }
+
+ if (args->version) {
+- g_strfreev(processed_args);
+- pcmk__free_arg_context(context);
+- /* FIXME: When pacemakerd is converted to use formatted output, this can go. */
+- pcmk__cli_help('v', CRM_EX_USAGE);
++ out->version(out, false);
++ goto done;
+ }
+
+ setenv("LC_ALL", "C", 1);
+@@ -1248,6 +1265,13 @@ main(int argc, char **argv)
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+
++ /* Don't allow any accidental output after this point. */
++ if (out != NULL) {
++ out->finish(out, exit_code, true, NULL);
++ pcmk__output_free(out);
++ out = NULL;
++ }
++
+ #ifdef SUPPORT_COROSYNC
+ if (mcp_read_config() == FALSE) {
+ exit_code = CRM_EX_UNAVAILABLE;
+@@ -1333,6 +1357,11 @@ done:
+ g_strfreev(processed_args);
+ pcmk__free_arg_context(context);
+
+- pcmk__output_and_clear_error(error, NULL);
++ pcmk__output_and_clear_error(error, out);
++
++ if (out != NULL) {
++ out->finish(out, exit_code, true, NULL);
++ pcmk__output_free(out);
++ }
+ crm_exit(exit_code);
+ }
+--
+1.8.3.1
+
+
+From 35e6da64381fcb092d81ce16835cc28670b077cb Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 10:04:04 -0400
+Subject: [PATCH 2/5] Features: daemons: Output the pacemakerd feature list in
+ XML.
+
+---
+ daemons/pacemakerd/pacemakerd.c | 45 ++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 42 insertions(+), 3 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index bd59729..93cf743 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -43,6 +43,42 @@ static pcmk__output_t *out = NULL;
+ static pcmk__supported_format_t formats[] = {
+ PCMK__SUPPORTED_FORMAT_NONE,
+ PCMK__SUPPORTED_FORMAT_TEXT,
++ PCMK__SUPPORTED_FORMAT_XML,
++ { NULL, NULL, NULL }
++};
++
++static int
++pacemakerd_features(pcmk__output_t *out, va_list args) {
++ out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
++ BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
++ return pcmk_rc_ok;
++}
++
++static int
++pacemakerd_features_xml(pcmk__output_t *out, va_list args) {
++ gchar **feature_list = g_strsplit(CRM_FEATURES, " ", 0);
++
++ pcmk__output_xml_create_parent(out, "pacemakerd",
++ "version", PACEMAKER_VERSION,
++ "build", BUILD_VERSION,
++ "feature_set", CRM_FEATURE_SET,
++ NULL);
++ out->begin_list(out, NULL, NULL, "features");
++
++ for (char **s = feature_list; *s != NULL; s++) {
++ pcmk__output_create_xml_text_node(out, "feature", *s);
++ }
++
++ out->end_list(out);
++
++ g_strfreev(feature_list);
++ return pcmk_rc_ok;
++}
++
++static pcmk__message_entry_t fmt_functions[] = {
++ { "features", "default", pacemakerd_features },
++ { "features", "xml", pacemakerd_features_xml },
++
+ { NULL, NULL, NULL }
+ };
+
+@@ -200,7 +236,7 @@ static GOptionContext *
+ build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
+ GOptionContext *context = NULL;
+
+- context = pcmk__build_arg_context(args, "text", group, NULL);
++ context = pcmk__build_arg_context(args, "text (default), xml", group, NULL);
+ pcmk__add_main_args(context, entries);
+ return context;
+ }
+@@ -241,9 +277,12 @@ main(int argc, char **argv)
+ goto done;
+ }
+
++ pcmk__force_args(context, &error, "%s --xml-simple-list", g_get_prgname());
++
++ pcmk__register_messages(out, fmt_functions);
++
+ if (options.features) {
+- out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
+- BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
++ out->message(out, "features");
+ exit_code = CRM_EX_OK;
+ goto done;
+ }
+--
+1.8.3.1
+
+
+From 5b7f5eb35b025b59805cf3c7c3dcb6a3cf4b71b3 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 11:09:53 -0400
+Subject: [PATCH 3/5] Low: daemons: Conditionally enable logging in pacemakerd.
+
+If we're doing an interactive command-line call, use
+pcmk__cli_init_logging. At the moment, all command line calls except
+for --shutdown do their work before logging would even come up, so we
+really only need to do this for --shutdown.
+
+If we're doing a daemon call, use crm_log_init.
+---
+ daemons/pacemakerd/pacemakerd.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index 93cf743..c20bde7 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -296,8 +296,11 @@ main(int argc, char **argv)
+
+ pcmk__set_env_option("mcp", "true");
+
+- pcmk__cli_init_logging("pacemakerd", args->verbosity);
+- crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
++ if (options.shutdown) {
++ pcmk__cli_init_logging("pacemakerd", args->verbosity);
++ } else {
++ crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
++ }
+
+ crm_debug("Checking for existing Pacemaker instance");
+ old_instance = crm_ipc_new(CRM_SYSTEM_MCP, 0);
+--
+1.8.3.1
+
+
+From 2393362bb7489e86d937ed46a1c5cfb93d9bf3ab Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 11:58:06 -0400
+Subject: [PATCH 4/5] Fix: include: Bump CRM_FEATURE_SET for new pacemakerd
+ args.
+
+---
+ include/crm/crm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/crm.h b/include/crm/crm.h
+index fdfc825..92a98fa 100644
+--- a/include/crm/crm.h
++++ b/include/crm/crm.h
+@@ -66,7 +66,7 @@ extern "C" {
+ * >=3.0.13: Fail counts include operation name and interval
+ * >=3.2.0: DC supports PCMK_LRM_OP_INVALID and PCMK_LRM_OP_NOT_CONNECTED
+ */
+-# define CRM_FEATURE_SET "3.10.0"
++# define CRM_FEATURE_SET "3.10.1"
+
+ /* Pacemaker's CPG protocols use fixed-width binary fields for the sender and
+ * recipient of a CPG message. This imposes an arbitrary limit on cluster node
+--
+1.8.3.1
+
+
+From 3ad8edbd91631b87ef5f53fa2d68f0c8bbb9ee2b Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 11:57:09 -0400
+Subject: [PATCH 5/5] Feature: xml: Add schema for pacemakerd.
+
+---
+ xml/Makefile.am | 1 +
+ xml/api/pacemakerd-2.10.rng | 28 ++++++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+)
+ create mode 100644 xml/api/pacemakerd-2.10.rng
+
+diff --git a/xml/Makefile.am b/xml/Makefile.am
+index 12a51c5..b9448d4 100644
+--- a/xml/Makefile.am
++++ b/xml/Makefile.am
+@@ -56,6 +56,7 @@ API_request_base = command-output \
+ crm_simulate \
+ crmadmin \
+ digests \
++ pacemakerd \
+ stonith_admin \
+ version
+
+diff --git a/xml/api/pacemakerd-2.10.rng b/xml/api/pacemakerd-2.10.rng
+new file mode 100644
+index 0000000..41a11e7
+--- /dev/null
++++ b/xml/api/pacemakerd-2.10.rng
+@@ -0,0 +1,28 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-pacemakerd"/>
++ </start>
++
++ <define name="element-pacemakerd">
++ <element name="pacemakerd">
++ <attribute name="version"> <text /> </attribute>
++ <attribute name="build"> <text /> </attribute>
++ <attribute name="feature_set"> <text /> </attribute>
++
++ <optional>
++ <ref name="feature-list" />
++ </optional>
++ </element>
++ </define>
++
++ <define name="feature-list">
++ <element name="features">
++ <oneOrMore>
++ <element name="feature"> <text/> </element>
++ </oneOrMore>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
diff --git a/004-check-level.patch b/004-check-level.patch
new file mode 100644
index 0000000..f2abb5f
--- /dev/null
+++ b/004-check-level.patch
@@ -0,0 +1,199 @@
+From 3905e7eac11298fc20efd567a773666f948edf61 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 3 May 2021 11:19:04 -0400
+Subject: [PATCH 1/2] Feature: tools: Add OCF_CHECK_LEVEL to crm_resource
+ environment.
+
+If --validate= or --force-check= are given with a level, pass that along
+as OCF_CHECK_LEVEL. This argument is optional, and if no value is given
+then the environment variable will not be set and whatever's the default
+on the resource agent will be used.
+
+See: rhbz#1955792.
+---
+ tools/crm_resource.c | 29 +++++++++++++++++++++--------
+ tools/crm_resource.h | 4 ++--
+ tools/crm_resource_runtime.c | 13 ++++++++++---
+ 3 files changed, 33 insertions(+), 13 deletions(-)
+
+diff --git a/tools/crm_resource.c b/tools/crm_resource.c
+index 45db2b2..6ca96f8 100644
+--- a/tools/crm_resource.c
++++ b/tools/crm_resource.c
+@@ -100,6 +100,7 @@ struct {
+ int timeout_ms; // Parsed from --timeout value
+ char *agent_spec; // Standard and/or provider and/or agent
+ gchar *xml_file; // Value of (deprecated) --xml-file
++ int check_level; // Optional value of --validate or --force-check
+
+ // Resource configuration specified via command-line arguments
+ gboolean cmdline_config; // Resource configuration was via arguments
+@@ -113,6 +114,7 @@ struct {
+ GHashTable *override_params; // Resource parameter values that override config
+ } options = {
+ .attr_set_type = XML_TAG_ATTR_SETS,
++ .check_level = -1,
+ .cib_options = cib_sync_call,
+ .require_cib = TRUE,
+ .require_dataset = TRUE,
+@@ -402,14 +404,15 @@ static GOptionEntry query_entries[] = {
+ };
+
+ static GOptionEntry command_entries[] = {
+- { "validate", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
++ { "validate", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ validate_or_force_cb,
+ "Validate resource configuration by calling agent's validate-all\n"
+ INDENT "action. The configuration may be specified either by giving an\n"
+ INDENT "existing resource name with -r, or by specifying --class,\n"
+ INDENT "--agent, and --provider arguments, along with any number of\n"
+- INDENT "--option arguments.",
+- NULL },
++ INDENT "--option arguments. An optional LEVEL argument can be given\n"
++ INDENT "to control the level of checking performed.",
++ "LEVEL" },
+ { "cleanup", 'C', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, cleanup_refresh_cb,
+ "If resource has any past failures, clear its history and fail\n"
+ INDENT "count. Optionally filtered by --resource, --node, --operation\n"
+@@ -546,11 +549,12 @@ static GOptionEntry advanced_entries[] = {
+ INDENT "the cluster believes the resource is a clone instance already\n"
+ INDENT "running on the local node.",
+ NULL },
+- { "force-check", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
++ { "force-check", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ validate_or_force_cb,
+ "(Advanced) Bypass the cluster and check the state of a resource on\n"
+- INDENT "the local node",
+- NULL },
++ INDENT "the local node. An optional LEVEL argument can be given\n"
++ INDENT "to control the level of checking performed.",
++ "LEVEL" },
+
+ { NULL }
+ };
+@@ -910,6 +914,15 @@ validate_or_force_cb(const gchar *option_name, const gchar *optarg,
+ if (options.override_params == NULL) {
+ options.override_params = pcmk__strkey_table(free, free);
+ }
++
++ if (optarg != NULL) {
++ if (pcmk__scan_min_int(optarg, &options.check_level, 0) != pcmk_rc_ok) {
++ g_set_error(error, G_OPTION_ERROR, CRM_EX_INVALID_PARAM,
++ "Invalid check level setting: %s", optarg);
++ return FALSE;
++ }
++ }
++
+ return TRUE;
+ }
+
+@@ -1826,12 +1839,12 @@ main(int argc, char **argv)
+ options.v_class, options.v_provider, options.v_agent,
+ "validate-all", options.cmdline_params,
+ options.override_params, options.timeout_ms,
+- args->verbosity, options.force);
++ args->verbosity, options.force, options.check_level);
+ } else {
+ exit_code = cli_resource_execute(rsc, options.rsc_id,
+ options.operation, options.override_params,
+ options.timeout_ms, cib_conn, data_set,
+- args->verbosity, options.force);
++ args->verbosity, options.force, options.check_level);
+ }
+ goto done;
+
+diff --git a/tools/crm_resource.h b/tools/crm_resource.h
+index 3560377..5ab10d6 100644
+--- a/tools/crm_resource.h
++++ b/tools/crm_resource.h
+@@ -88,11 +88,11 @@ crm_exit_t cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc
+ const char *rsc_type, const char *rsc_action,
+ GHashTable *params, GHashTable *override_hash,
+ int timeout_ms, int resource_verbose,
+- gboolean force);
++ gboolean force, int check_level);
+ crm_exit_t cli_resource_execute(pe_resource_t *rsc, const char *requested_name,
+ const char *rsc_action, GHashTable *override_hash,
+ int timeout_ms, cib_t *cib, pe_working_set_t *data_set,
+- int resource_verbose, gboolean force);
++ int resource_verbose, gboolean force, int check_level);
+
+ int cli_resource_update_attribute(pe_resource_t *rsc, const char *requested_name,
+ const char *attr_set, const char *attr_set_type,
+diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
+index fe0ec98..bde83b6 100644
+--- a/tools/crm_resource_runtime.c
++++ b/tools/crm_resource_runtime.c
+@@ -1679,7 +1679,8 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ const char *rsc_class, const char *rsc_prov,
+ const char *rsc_type, const char *action,
+ GHashTable *params, GHashTable *override_hash,
+- int timeout_ms, int resource_verbose, gboolean force)
++ int timeout_ms, int resource_verbose, gboolean force,
++ int check_level)
+ {
+ GHashTable *params_copy = NULL;
+ crm_exit_t exit_code = CRM_EX_OK;
+@@ -1703,6 +1704,12 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ /* add crm_feature_set env needed by some resource agents */
+ g_hash_table_insert(params, strdup(XML_ATTR_CRM_VERSION), strdup(CRM_FEATURE_SET));
+
++ if (check_level >= 0) {
++ char *level = crm_strdup_printf("%d", check_level);
++ setenv("OCF_CHECK_LEVEL", level, 1);
++ free(level);
++ }
++
+ /* resources_action_create frees the params hash table it's passed, but we
+ * may need to reuse it in a second call to resources_action_create. Thus
+ * we'll make a copy here so that gets freed and the original remains for
+@@ -1790,7 +1797,7 @@ crm_exit_t
+ cli_resource_execute(pe_resource_t *rsc, const char *requested_name,
+ const char *rsc_action, GHashTable *override_hash,
+ int timeout_ms, cib_t * cib, pe_working_set_t *data_set,
+- int resource_verbose, gboolean force)
++ int resource_verbose, gboolean force, int check_level)
+ {
+ pcmk__output_t *out = data_set->priv;
+ crm_exit_t exit_code = CRM_EX_OK;
+@@ -1856,7 +1863,7 @@ cli_resource_execute(pe_resource_t *rsc, const char *requested_name,
+
+ exit_code = cli_resource_execute_from_params(out, rid, rclass, rprov, rtype, action,
+ params, override_hash, timeout_ms,
+- resource_verbose, force);
++ resource_verbose, force, check_level);
+ return exit_code;
+ }
+
+--
+1.8.3.1
+
+
+From d13ba4bd6defe0dd81fdf8ab39ae5b889513c0c0 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 20 May 2021 10:59:23 -0400
+Subject: [PATCH 2/2] Fix: include: Bump feature set to 3.10.2.
+
+This is for the OCF_CHECK_LEVEL environment variable.
+
+See: rhbz#1955792.
+---
+ include/crm/crm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/crm.h b/include/crm/crm.h
+index 92a98fa..ee52c36 100644
+--- a/include/crm/crm.h
++++ b/include/crm/crm.h
+@@ -66,7 +66,7 @@ extern "C" {
+ * >=3.0.13: Fail counts include operation name and interval
+ * >=3.2.0: DC supports PCMK_LRM_OP_INVALID and PCMK_LRM_OP_NOT_CONNECTED
+ */
+-# define CRM_FEATURE_SET "3.10.1"
++# define CRM_FEATURE_SET "3.10.2"
+
+ /* Pacemaker's CPG protocols use fixed-width binary fields for the sender and
+ * recipient of a CPG message. This imposes an arbitrary limit on cluster node
+--
+1.8.3.1
+
diff --git a/005-crm_resource.patch b/005-crm_resource.patch
new file mode 100644
index 0000000..1683026
--- /dev/null
+++ b/005-crm_resource.patch
@@ -0,0 +1,866 @@
+From a5a507d4e1abf242903472719a19977811e6f164 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 20 May 2021 11:59:36 -0400
+Subject: [PATCH 01/10] Feature: libcrmcommon: Add OCF_OUTPUT_FORMAT to
+ crm_resource environment.
+
+See: rhbz#1644628
+---
+ lib/common/output.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/common/output.c b/lib/common/output.c
+index 6cb49b5..58872e0 100644
+--- a/lib/common/output.c
++++ b/lib/common/output.c
+@@ -71,6 +71,8 @@ pcmk__output_new(pcmk__output_t **out, const char *fmt_name, const char *filenam
+ return ENOMEM;
+ }
+
++ setenv("OCF_OUTPUT_FORMAT", (*out)->fmt_name, 1);
++
+ return pcmk_rc_ok;
+ }
+
+--
+1.8.3.1
+
+
+From acc6ecdbfb797d69794e68f75a734d6252434e01 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 21 May 2021 14:20:30 -0400
+Subject: [PATCH 02/10] Feature: schemas: Copy crm_resource schema in
+ preparation for changes.
+
+See: rhbz#1644628
+---
+ xml/api/crm_resource-2.11.rng | 238 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 238 insertions(+)
+ create mode 100644 xml/api/crm_resource-2.11.rng
+
+diff --git a/xml/api/crm_resource-2.11.rng b/xml/api/crm_resource-2.11.rng
+new file mode 100644
+index 0000000..8e386db
+--- /dev/null
++++ b/xml/api/crm_resource-2.11.rng
+@@ -0,0 +1,238 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-crm-resource"/>
++ </start>
++
++ <define name="element-crm-resource">
++ <choice>
++ <ref name="agents-list" />
++ <ref name="alternatives-list" />
++ <ref name="constraints-list" />
++ <externalRef href="generic-list-2.4.rng"/>
++ <element name="metadata"> <text/> </element>
++ <ref name="locate-list" />
++ <ref name="operations-list" />
++ <ref name="providers-list" />
++ <ref name="reasons-list" />
++ <ref name="resource-check" />
++ <ref name="resource-config" />
++ <ref name="resources-list" />
++ </choice>
++ </define>
++
++ <define name="agents-list">
++ <element name="agents">
++ <attribute name="standard"> <text/> </attribute>
++ <optional>
++ <attribute name="provider"> <text/> </attribute>
++ </optional>
++ <zeroOrMore>
++ <element name="agent"> <text/> </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="alternatives-list">
++ <element name="providers">
++ <attribute name="for"> <text/> </attribute>
++ <zeroOrMore>
++ <element name="provider"> <text/> </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="constraints-list">
++ <element name="constraints">
++ <interleave>
++ <zeroOrMore>
++ <ref name="rsc-location" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="rsc-colocation" />
++ </zeroOrMore>
++ </interleave>
++ </element>
++ </define>
++
++ <define name="locate-list">
++ <element name="nodes">
++ <attribute name="resource"> <text/> </attribute>
++ <zeroOrMore>
++ <element name="node">
++ <optional>
++ <attribute name="state"><value>promoted</value></attribute>
++ </optional>
++ <text/>
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="rsc-location">
++ <element name="rsc_location">
++ <attribute name="node"> <text/> </attribute>
++ <attribute name="rsc"> <text/> </attribute>
++ <attribute name="id"> <text/> </attribute>
++ <externalRef href="../score.rng"/>
++ </element>
++ </define>
++
++ <define name="operations-list">
++ <element name="operations">
++ <oneOrMore>
++ <ref name="element-operation-list" />
++ </oneOrMore>
++ </element>
++ </define>
++
++ <define name="providers-list">
++ <element name="providers">
++ <attribute name="standard"> <value>ocf</value> </attribute>
++ <optional>
++ <attribute name="agent"> <text/> </attribute>
++ </optional>
++ <zeroOrMore>
++ <element name="provider"> <text/> </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="reasons-list">
++ <choice>
++ <ref name="no-resource-or-uname"/>
++ <ref name="resource-and-uname"/>
++ <ref name="no-resource-but-uname"/>
++ <ref name="resource-but-no-uname"/>
++ </choice>
++ </define>
++
++ <define name="no-resource-or-uname">
++ <element name="reason">
++ <element name="resources">
++ <zeroOrMore>
++ <element name="resource">
++ <attribute name="id"> <text/> </attribute>
++ <attribute name="running"> <data type="boolean"/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </zeroOrMore>
++ </element>
++ </element>
++ </define>
++
++ <define name="resource-and-uname">
++ <element name="reason">
++ <attribute name="running_on"> <text/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </define>
++
++ <define name="no-resource-but-uname">
++ <element name="reason">
++ <element name="resources">
++ <zeroOrMore>
++ <element name="resource">
++ <attribute name="id"> <text/> </attribute>
++ <attribute name="running"> <data type="boolean"/> </attribute>
++ <attribute name="host"> <text/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </zeroOrMore>
++ </element>
++ </element>
++ </define>
++
++ <define name="resource-but-no-uname">
++ <element name="reason">
++ <attribute name="running"> <data type="boolean"/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </define>
++
++ <define name="resource-config">
++ <element name="resource_config">
++ <externalRef href="resources-2.4.rng" />
++ <element name="xml"> <text/> </element>
++ </element>
++ </define>
++
++ <define name="resource-check">
++ <element name="check">
++ <attribute name="id"> <text/> </attribute>
++ <optional>
++ <choice>
++ <attribute name="remain_stopped"><value>true</value></attribute>
++ <attribute name="promotable"><value>false</value></attribute>
++ </choice>
++ </optional>
++ <optional>
++ <attribute name="unmanaged"><value>true</value></attribute>
++ </optional>
++ <optional>
++ <attribute name="locked-to"> <text/> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="resources-list">
++ <element name="resources">
++ <zeroOrMore>
++ <externalRef href="resources-2.4.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="rsc-colocation">
++ <element name="rsc_colocation">
++ <attribute name="id"> <text/> </attribute>
++ <attribute name="rsc"> <text/> </attribute>
++ <attribute name="with-rsc"> <text/> </attribute>
++ <externalRef href="../score.rng"/>
++ <optional>
++ <attribute name="node-attribute"> <text/> </attribute>
++ </optional>
++ <optional>
++ <attribute name="rsc-role">
++ <ref name="attribute-roles"/>
++ </attribute>
++ </optional>
++ <optional>
++ <attribute name="with-rsc-role">
++ <ref name="attribute-roles"/>
++ </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-operation-list">
++ <element name="operation">
++ <optional>
++ <group>
++ <attribute name="rsc"> <text/> </attribute>
++ <attribute name="agent"> <text/> </attribute>
++ </group>
++ </optional>
++ <attribute name="op"> <text/> </attribute>
++ <attribute name="node"> <text/> </attribute>
++ <attribute name="call"> <data type="integer" /> </attribute>
++ <attribute name="rc"> <data type="nonNegativeInteger" /> </attribute>
++ <optional>
++ <attribute name="last-rc-change"> <text/> </attribute>
++ <attribute name="exec-time"> <data type="nonNegativeInteger" /> </attribute>
++ </optional>
++ <attribute name="status"> <text/> </attribute>
++ </element>
++ </define>
++
++ <define name="attribute-roles">
++ <choice>
++ <value>Stopped</value>
++ <value>Started</value>
++ <value>Master</value>
++ <value>Slave</value>
++ </choice>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From 1bbdf2149a111e9e19c388834f82001e0d31c427 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 24 May 2021 12:23:55 -0400
+Subject: [PATCH 03/10] Feature: xml: Update the crm_resource schema for XML
+ output.
+
+See: rhbz#1644628
+---
+ xml/api/crm_resource-2.11.rng | 50 +++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+diff --git a/xml/api/crm_resource-2.11.rng b/xml/api/crm_resource-2.11.rng
+index 8e386db..aaa54d6 100644
+--- a/xml/api/crm_resource-2.11.rng
++++ b/xml/api/crm_resource-2.11.rng
+@@ -20,6 +20,7 @@
+ <ref name="resource-check" />
+ <ref name="resource-config" />
+ <ref name="resources-list" />
++ <ref name="resource-agent-action" />
+ </choice>
+ </define>
+
+@@ -227,6 +228,55 @@
+ </element>
+ </define>
+
++ <define name="resource-agent-action">
++ <element name="resource-agent-action">
++ <attribute name="action"> <text/> </attribute>
++ <optional>
++ <attribute name="rsc"> <text/> </attribute>
++ </optional>
++ <attribute name="class"> <text/> </attribute>
++ <attribute name="type"> <text/> </attribute>
++ <optional>
++ <attribute name="provider"> <text/> </attribute>
++ </optional>
++ <optional>
++ <ref name="overrides-list"/>
++ </optional>
++ <ref name="agent-status"/>
++ <optional>
++ <choice>
++ <element name="command">
++ <text />
++ </element>
++ <externalRef href="command-output-1.0.rng"/>
++ </choice>
++ </optional>
++ </element>
++ </define>
++
++ <define name="overrides-list">
++ <element name="overrides">
++ <zeroOrMore>
++ <element name="override">
++ <optional>
++ <attribute name="rsc"> <text/> </attribute>
++ </optional>
++ <attribute name="name"> <text/> </attribute>
++ <attribute name="value"> <text/> </attribute>
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="agent-status">
++ <element name="agent-status">
++ <attribute name="code"> <data type="integer" /> </attribute>
++ <optional>
++ <attribute name="message"> <text/> </attribute>
++ </optional>
++ </element>
++ </define>
++
+ <define name="attribute-roles">
+ <choice>
+ <value>Stopped</value>
+--
+1.8.3.1
+
+
+From d89f5bc7fec856fdcd32fa14edbd0019507d5d15 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Tue, 1 Jun 2021 15:26:58 -0400
+Subject: [PATCH 04/10] Low: libcrmcommon: Increase PCMK__API_VERSION for new
+ crm_resource output.
+
+See: rhbz#1644628
+---
+ include/crm/common/output_internal.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
+index 10b315b..0436cde 100644
+--- a/include/crm/common/output_internal.h
++++ b/include/crm/common/output_internal.h
+@@ -27,7 +27,7 @@ extern "C" {
+ # include <glib.h>
+ # include <crm/common/results.h>
+
+-# define PCMK__API_VERSION "2.9"
++# define PCMK__API_VERSION "2.11"
+
+ #if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS)
+ # define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS)))
+--
+1.8.3.1
+
+
+From 30bd2ddf43ee2a911681e51f40ed9ba20ec250b0 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 27 May 2021 13:57:12 -0400
+Subject: [PATCH 05/10] Low: tools: Pass NULL to
+ cli_resource_execute_from_params...
+
+if no resource name is given. This happens if we are validating based
+on the --class/--agent/--provider command line options instead.
+---
+ tools/crm_resource.c | 2 +-
+ tools/crm_resource_runtime.c | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/tools/crm_resource.c b/tools/crm_resource.c
+index 24f1121..37a0bb0 100644
+--- a/tools/crm_resource.c
++++ b/tools/crm_resource.c
+@@ -1840,7 +1840,7 @@ main(int argc, char **argv)
+
+ case cmd_execute_agent:
+ if (options.cmdline_config) {
+- exit_code = cli_resource_execute_from_params(out, "test",
++ exit_code = cli_resource_execute_from_params(out, NULL,
+ options.v_class, options.v_provider, options.v_agent,
+ "validate-all", options.cmdline_params,
+ options.override_params, options.timeout_ms,
+diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
+index 48a4b40..ebf48bb 100644
+--- a/tools/crm_resource_runtime.c
++++ b/tools/crm_resource_runtime.c
+@@ -1717,14 +1717,14 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ */
+ params_copy = pcmk__str_table_dup(params);
+
+- op = resources_action_create(rsc_name, rsc_class, rsc_prov, rsc_type, action, 0,
+- timeout_ms, params_copy, 0);
++ op = resources_action_create(rsc_name ? rsc_name : "test", rsc_class, rsc_prov,
++ rsc_type, action, 0, timeout_ms, params_copy, 0);
+ if (op == NULL) {
+ /* Re-run with stderr enabled so we can display a sane error message */
+ crm_enable_stderr(TRUE);
+ params_copy = pcmk__str_table_dup(params);
+- op = resources_action_create(rsc_name, rsc_class, rsc_prov, rsc_type, action, 0,
+- timeout_ms, params_copy, 0);
++ op = resources_action_create(rsc_name ? rsc_name : "test", rsc_class, rsc_prov,
++ rsc_type, action, 0, timeout_ms, params_copy, 0);
+
+ /* Callers of cli_resource_execute expect that the params hash table will
+ * be freed. That function uses this one, so for that reason and for
+--
+1.8.3.1
+
+
+From ee56efd53d14cfc4f902769540b72b3bb6096a73 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 24 May 2021 12:08:52 -0400
+Subject: [PATCH 06/10] Feature: tools: Add an agent-status message for
+ crm_resource.
+
+This moves what was previously only done in an out->info call to its own
+output message, which means it will appear in XML output as well. Also,
+note that if --class/--agent/--provider are given, the resource name
+will be set to "test". In that case, do not display the resource name
+in the output.
+
+This message will be used for --validate and the --force-* command line
+options to crm_resource.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_print.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 53 insertions(+)
+
+diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
+index 9d82cf8..88d5878 100644
+--- a/tools/crm_resource_print.c
++++ b/tools/crm_resource_print.c
+@@ -152,6 +152,57 @@ attribute_list_default(pcmk__output_t *out, va_list args) {
+ return pcmk_rc_ok;
+ }
+
++PCMK__OUTPUT_ARGS("agent-status", "int", "const char *", "const char *", "const char *",
++ "const char *", "const char *", "int")
++static int
++agent_status_default(pcmk__output_t *out, va_list args) {
++ int status = va_arg(args, int);
++ const char *action = va_arg(args, const char *);
++ const char *name = va_arg(args, const char *);
++ const char *class = va_arg(args, const char *);
++ const char *provider = va_arg(args, const char *);
++ const char *type = va_arg(args, const char *);
++ int rc = va_arg(args, int);
++
++ if (status == PCMK_LRM_OP_DONE) {
++ out->info(out, "Operation %s%s%s (%s%s%s:%s) returned: '%s' (%d)",
++ action, name ? " for " : "", name ? name : "",
++ class, provider ? ":" : "", provider ? provider : "", type,
++ services_ocf_exitcode_str(rc), rc);
++ } else {
++ out->err(out, "Operation %s%s%s (%s%s%s:%s) failed: '%s' (%d)",
++ action, name ? " for " : "", name ? name : "",
++ class, provider ? ":" : "", provider ? provider : "", type,
++ services_lrm_status_str(status), status);
++ }
++
++ return pcmk_rc_ok;
++}
++
++PCMK__OUTPUT_ARGS("agent-status", "int", "const char *", "const char *", "const char *",
++ "const char *", "const char *", "int")
++static int
++agent_status_xml(pcmk__output_t *out, va_list args) {
++ int status G_GNUC_UNUSED = va_arg(args, int);
++ const char *action G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *name G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *class G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *provider G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *type G_GNUC_UNUSED = va_arg(args, const char *);
++ int rc = va_arg(args, int);
++
++ char *status_str = pcmk__itoa(rc);
++
++ pcmk__output_create_xml_node(out, "agent-status",
++ "code", status_str,
++ "message", services_ocf_exitcode_str(rc),
++ NULL);
++
++ free(status_str);
++
++ return pcmk_rc_ok;
++}
++
+ PCMK__OUTPUT_ARGS("attribute-list", "pe_resource_t *", "char *", "GHashTable *")
+ static int
+ attribute_list_text(pcmk__output_t *out, va_list args) {
+@@ -562,6 +613,8 @@ resource_names(pcmk__output_t *out, va_list args) {
+ }
+
+ static pcmk__message_entry_t fmt_functions[] = {
++ { "agent-status", "default", agent_status_default },
++ { "agent-status", "xml", agent_status_xml },
+ { "attribute-list", "default", attribute_list_default },
+ { "attribute-list", "text", attribute_list_text },
+ { "property-list", "default", property_list_default },
+--
+1.8.3.1
+
+
+From 85cb6b6bff96b18c5174d11e4de4d49cbfb20bb7 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Tue, 1 Jun 2021 14:47:30 -0400
+Subject: [PATCH 07/10] Feature: tools: Add an overridden params output
+ message.
+
+This also replaces what was previously being done in an out->info call
+with an output message. This means it shows up in XML output as well.
+Also, note that if --class/--agent/--provider are given, the resource
+name will be set to "test". In that case, do not display the resource
+name in the output.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_print.c | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
+index 88d5878..119d83f 100644
+--- a/tools/crm_resource_print.c
++++ b/tools/crm_resource_print.c
+@@ -224,6 +224,43 @@ attribute_list_text(pcmk__output_t *out, va_list args) {
+ return pcmk_rc_ok;
+ }
+
++PCMK__OUTPUT_ARGS("override", "const char *", "const char *", "const char *")
++static int
++override_default(pcmk__output_t *out, va_list args) {
++ const char *rsc_name = va_arg(args, const char *);
++ const char *name = va_arg(args, const char *);
++ const char *value = va_arg(args, const char *);
++
++ if (rsc_name == NULL) {
++ out->list_item(out, NULL, "Overriding the cluster configuration with '%s' = '%s'",
++ name, value);
++ } else {
++ out->list_item(out, NULL, "Overriding the cluster configuration for '%s' with '%s' = '%s'",
++ rsc_name, name, value);
++ }
++
++ return pcmk_rc_ok;
++}
++
++PCMK__OUTPUT_ARGS("override", "const char *", "const char *", "const char *")
++static int
++override_xml(pcmk__output_t *out, va_list args) {
++ const char *rsc_name = va_arg(args, const char *);
++ const char *name = va_arg(args, const char *);
++ const char *value = va_arg(args, const char *);
++
++ xmlNodePtr node = pcmk__output_create_xml_node(out, "override",
++ "name", name,
++ "value", value,
++ NULL);
++
++ if (rsc_name != NULL) {
++ crm_xml_add(node, "rsc", rsc_name);
++ }
++
++ return pcmk_rc_ok;
++}
++
+ PCMK__OUTPUT_ARGS("property-list", "pe_resource_t *", "char *")
+ static int
+ property_list_default(pcmk__output_t *out, va_list args) {
+@@ -617,6 +654,8 @@ static pcmk__message_entry_t fmt_functions[] = {
+ { "agent-status", "xml", agent_status_xml },
+ { "attribute-list", "default", attribute_list_default },
+ { "attribute-list", "text", attribute_list_text },
++ { "override", "default", override_default },
++ { "override", "xml", override_xml },
+ { "property-list", "default", property_list_default },
+ { "property-list", "text", property_list_text },
+ { "resource-check-list", "default", resource_check_list_default },
+--
+1.8.3.1
+
+
+From e5e24592c7c3231c619fb5253e7925ffbc634a99 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 4 Jun 2021 10:24:51 -0400
+Subject: [PATCH 08/10] Low: tools: Use simple XML lists for resource actions
+ as well.
+
+See: rhbz#1644628
+---
+ tools/crm_resource.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tools/crm_resource.c b/tools/crm_resource.c
+index 37a0bb0..e957011 100644
+--- a/tools/crm_resource.c
++++ b/tools/crm_resource.c
+@@ -1643,6 +1643,7 @@ main(int argc, char **argv)
+ * saves from having to write custom messages to build the lists around all these things
+ */
+ switch (options.rsc_cmd) {
++ case cmd_execute_agent:
+ case cmd_list_resources:
+ case cmd_query_xml:
+ case cmd_query_raw_xml:
+--
+1.8.3.1
+
+
+From 3e75174d0bc31b261adb1994214a5878b79da85b Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 4 Jun 2021 10:30:10 -0400
+Subject: [PATCH 09/10] Feature: tools: Add an output message for resource
+ actions.
+
+This wraps up the override and agent-status messages into a single
+message, along with any stdout/stderr from the resource action. This
+message should be called after taking the action.
+
+This also implements handling XML output from resource actions. Check
+to see if the validate-all action returns XML. If so, output it as a
+CDATA block under a "command" element. If not, treat it as plain text
+and output it as stdout/stderr from a command.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_print.c | 122 +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 122 insertions(+)
+
+diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
+index 119d83f..19a366d 100644
+--- a/tools/crm_resource_print.c
++++ b/tools/crm_resource_print.c
+@@ -293,6 +293,126 @@ property_list_text(pcmk__output_t *out, va_list args) {
+ return pcmk_rc_ok;
+ }
+
++PCMK__OUTPUT_ARGS("resource-agent-action", "int", "const char *", "const char *",
++ "const char *", "const char *", "const char *", "GHashTable *",
++ "int", "int", "char *", "char *")
++static int
++resource_agent_action_default(pcmk__output_t *out, va_list args) {
++ int verbose = va_arg(args, int);
++
++ const char *class = va_arg(args, const char *);
++ const char *provider = va_arg(args, const char *);
++ const char *type = va_arg(args, const char *);
++ const char *rsc_name = va_arg(args, const char *);
++ const char *action = va_arg(args, const char *);
++ GHashTable *overrides = va_arg(args, GHashTable *);
++ int rc = va_arg(args, int);
++ int status = va_arg(args, int);
++ char *stdout_data = va_arg(args, char *);
++ char *stderr_data = va_arg(args, char *);
++
++ if (overrides) {
++ GHashTableIter iter;
++ char *name = NULL;
++ char *value = NULL;
++
++ out->begin_list(out, NULL, NULL, "overrides");
++
++ g_hash_table_iter_init(&iter, overrides);
++ while (g_hash_table_iter_next(&iter, (gpointer *) &name, (gpointer *) &value)) {
++ out->message(out, "override", rsc_name, name, value);
++ }
++
++ out->end_list(out);
++ }
++
++ out->message(out, "agent-status", status, action, rsc_name, class, provider,
++ type, rc);
++
++ /* hide output for validate-all if not in verbose */
++ if (verbose == 0 && pcmk__str_eq(action, "validate-all", pcmk__str_casei)) {
++ return pcmk_rc_ok;
++ }
++
++ if (stdout_data || stderr_data) {
++ xmlNodePtr doc = string2xml(stdout_data);
++
++ if (doc != NULL) {
++ out->output_xml(out, "command", stdout_data);
++ xmlFreeNode(doc);
++ } else {
++ out->subprocess_output(out, rc, stdout_data, stderr_data);
++ }
++ }
++
++ return pcmk_rc_ok;
++}
++
++PCMK__OUTPUT_ARGS("resource-agent-action", "int", "const char *", "const char *",
++ "const char *", "const char *", "const char *", "GHashTable *",
++ "int", "int", "char *", "char *")
++static int
++resource_agent_action_xml(pcmk__output_t *out, va_list args) {
++ int verbose G_GNUC_UNUSED = va_arg(args, int);
++
++ const char *class = va_arg(args, const char *);
++ const char *provider = va_arg(args, const char *);
++ const char *type = va_arg(args, const char *);
++ const char *rsc_name = va_arg(args, const char *);
++ const char *action = va_arg(args, const char *);
++ GHashTable *overrides = va_arg(args, GHashTable *);
++ int rc = va_arg(args, int);
++ int status = va_arg(args, int);
++ char *stdout_data = va_arg(args, char *);
++ char *stderr_data = va_arg(args, char *);
++
++ xmlNodePtr node = pcmk__output_xml_create_parent(out, "resource-agent-action",
++ "action", action,
++ "class", class,
++ "type", type,
++ NULL);
++
++ if (rsc_name) {
++ crm_xml_add(node, "rsc", rsc_name);
++ }
++
++ if (provider) {
++ crm_xml_add(node, "provider", provider);
++ }
++
++ if (overrides) {
++ GHashTableIter iter;
++ char *name = NULL;
++ char *value = NULL;
++
++ out->begin_list(out, NULL, NULL, "overrides");
++
++ g_hash_table_iter_init(&iter, overrides);
++ while (g_hash_table_iter_next(&iter, (gpointer *) &name, (gpointer *) &value)) {
++ out->message(out, "override", rsc_name, name, value);
++ }
++
++ out->end_list(out);
++ }
++
++ out->message(out, "agent-status", status, action, rsc_name, class, provider,
++ type, rc);
++
++ if (stdout_data || stderr_data) {
++ xmlNodePtr doc = string2xml(stdout_data);
++
++ if (doc != NULL) {
++ out->output_xml(out, "command", stdout_data);
++ xmlFreeNode(doc);
++ } else {
++ out->subprocess_output(out, rc, stdout_data, stderr_data);
++ }
++ }
++
++ pcmk__output_xml_pop_parent(out);
++ return pcmk_rc_ok;
++}
++
+ PCMK__OUTPUT_ARGS("resource-check-list", "resource_checks_t *")
+ static int
+ resource_check_list_default(pcmk__output_t *out, va_list args) {
+@@ -658,6 +778,8 @@ static pcmk__message_entry_t fmt_functions[] = {
+ { "override", "xml", override_xml },
+ { "property-list", "default", property_list_default },
+ { "property-list", "text", property_list_text },
++ { "resource-agent-action", "default", resource_agent_action_default },
++ { "resource-agent-action", "xml", resource_agent_action_xml },
+ { "resource-check-list", "default", resource_check_list_default },
+ { "resource-check-list", "xml", resource_check_list_xml },
+ { "resource-search-list", "default", resource_search_list_default },
+--
+1.8.3.1
+
+
+From b50b2418e1e997b42f5370b4672a3f105d74634f Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 4 Jun 2021 10:40:16 -0400
+Subject: [PATCH 10/10] Feature: tools: Use the new resource-agent-action
+ message.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_runtime.c | 21 +++------------------
+ 1 file changed, 3 insertions(+), 18 deletions(-)
+
+diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
+index ebf48bb..755be9f 100644
+--- a/tools/crm_resource_runtime.c
++++ b/tools/crm_resource_runtime.c
+@@ -1765,28 +1765,13 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ if (services_action_sync(op)) {
+ exit_code = op->rc;
+
+- if (op->status == PCMK_LRM_OP_DONE) {
+- out->info(out, "Operation %s for %s (%s:%s:%s) returned: '%s' (%d)",
+- action, rsc_name, rsc_class, rsc_prov ? rsc_prov : "", rsc_type,
+- services_ocf_exitcode_str(op->rc), op->rc);
+- } else {
+- out->err(out, "Operation %s for %s (%s:%s:%s) failed: '%s' (%d)",
+- action, rsc_name, rsc_class, rsc_prov ? rsc_prov : "", rsc_type,
+- services_lrm_status_str(op->status), op->status);
+- }
+-
+- /* hide output for validate-all if not in verbose */
+- if (resource_verbose == 0 && pcmk__str_eq(action, "validate-all", pcmk__str_casei))
+- goto done;
+-
+- if (op->stdout_data || op->stderr_data) {
+- out->subprocess_output(out, op->rc, op->stdout_data, op->stderr_data);
+- }
++ out->message(out, "resource-agent-action", resource_verbose, rsc_class,
++ rsc_prov, rsc_type, rsc_name, action, override_hash, op->rc,
++ op->status, op->stdout_data, op->stderr_data);
+ } else {
+ exit_code = op->rc == 0 ? CRM_EX_ERROR : op->rc;
+ }
+
+-done:
+ services_action_free(op);
+ /* See comment above about why we free params here. */
+ g_hash_table_destroy(params);
+--
+1.8.3.1
+
diff --git a/006-crm_simulate.patch b/006-crm_simulate.patch
new file mode 100644
index 0000000..c8d4e3f
--- /dev/null
+++ b/006-crm_simulate.patch
@@ -0,0 +1,896 @@
+From 97571e6ccc9b7fa339a7e27d9b0b9ab782ff3003 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Wed, 16 Jun 2021 13:54:10 -0400
+Subject: [PATCH 1/5] Low: schemas: Copy crm_mon.rng in preparation for
+ changes.
+
+---
+ xml/api/crm_mon-2.12.rng | 243 +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 243 insertions(+)
+ create mode 100644 xml/api/crm_mon-2.12.rng
+
+diff --git a/xml/api/crm_mon-2.12.rng b/xml/api/crm_mon-2.12.rng
+new file mode 100644
+index 0000000..ffec923
+--- /dev/null
++++ b/xml/api/crm_mon-2.12.rng
+@@ -0,0 +1,243 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-crm-mon"/>
++ </start>
++
++ <define name="element-crm-mon">
++ <optional>
++ <ref name="element-summary" />
++ </optional>
++ <optional>
++ <ref name="nodes-list" />
++ </optional>
++ <optional>
++ <ref name="resources-list" />
++ </optional>
++ <optional>
++ <ref name="node-attributes-list" />
++ </optional>
++ <optional>
++ <ref name="node-history-list" />
++ </optional>
++ <optional>
++ <ref name="failures-list" />
++ </optional>
++ <optional>
++ <ref name="fence-event-list" />
++ </optional>
++ <optional>
++ <ref name="tickets-list" />
++ </optional>
++ <optional>
++ <ref name="bans-list" />
++ </optional>
++ </define>
++
++ <define name="element-summary">
++ <element name="summary">
++ <optional>
++ <element name="stack">
++ <attribute name="type"> <text /> </attribute>
++ </element>
++ </optional>
++ <optional>
++ <element name="current_dc">
++ <attribute name="present"> <data type="boolean" /> </attribute>
++ <optional>
++ <group>
++ <attribute name="version"> <text /> </attribute>
++ <attribute name="name"> <text /> </attribute>
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="with_quorum"> <data type="boolean" /> </attribute>
++ </group>
++ </optional>
++ </element>
++ </optional>
++ <optional>
++ <element name="last_update">
++ <attribute name="time"> <text /> </attribute>
++ </element>
++ <element name="last_change">
++ <attribute name="time"> <text /> </attribute>
++ <attribute name="user"> <text /> </attribute>
++ <attribute name="client"> <text /> </attribute>
++ <attribute name="origin"> <text /> </attribute>
++ </element>
++ </optional>
++ <optional>
++ <element name="nodes_configured">
++ <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
++ </element>
++ <element name="resources_configured">
++ <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
++ <attribute name="disabled"> <data type="nonNegativeInteger" /> </attribute>
++ <attribute name="blocked"> <data type="nonNegativeInteger" /> </attribute>
++ </element>
++ </optional>
++ <optional>
++ <element name="cluster_options">
++ <attribute name="stonith-enabled"> <data type="boolean" /> </attribute>
++ <attribute name="symmetric-cluster"> <data type="boolean" /> </attribute>
++ <attribute name="no-quorum-policy"> <text /> </attribute>
++ <attribute name="maintenance-mode"> <data type="boolean" /> </attribute>
++ <attribute name="stop-all-resources"> <data type="boolean" /> </attribute>
++ </element>
++ </optional>
++ </element>
++ </define>
++
++ <define name="resources-list">
++ <element name="resources">
++ <zeroOrMore>
++ <externalRef href="resources-2.4.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="nodes-list">
++ <element name="nodes">
++ <zeroOrMore>
++ <externalRef href="nodes-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="node-attributes-list">
++ <element name="node_attributes">
++ <zeroOrMore>
++ <externalRef href="node-attrs-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="node-history-list">
++ <element name="node_history">
++ <zeroOrMore>
++ <ref name="element-node-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="failures-list">
++ <element name="failures">
++ <zeroOrMore>
++ <externalRef href="failure-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="fence-event-list">
++ <element name="fence_history">
++ <optional>
++ <attribute name="status"> <data type="integer" /> </attribute>
++ </optional>
++ <zeroOrMore>
++ <externalRef href="fence-event-2.0.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="tickets-list">
++ <element name="tickets">
++ <zeroOrMore>
++ <ref name="element-ticket" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="bans-list">
++ <element name="bans">
++ <zeroOrMore>
++ <ref name="element-ban" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-node-history">
++ <element name="node">
++ <attribute name="name"> <text /> </attribute>
++ <zeroOrMore>
++ <ref name="element-resource-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-resource-history">
++ <element name="resource_history">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="orphan"> <data type="boolean" /> </attribute>
++ <optional>
++ <group>
++ <attribute name="migration-threshold"> <data type="nonNegativeInteger" /> </attribute>
++ <optional>
++ <attribute name="fail-count"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-failure"> <text /> </attribute>
++ </optional>
++ </group>
++ </optional>
++ <zeroOrMore>
++ <ref name="element-operation-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-operation-history">
++ <element name="operation_history">
++ <attribute name="call"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="interval"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-rc-change"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-run"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="exec-time"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="queue-time"> <text /> </attribute>
++ </optional>
++ <attribute name="rc"> <data type="integer" /> </attribute>
++ <attribute name="rc_text"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-ticket">
++ <element name="ticket">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="status">
++ <choice>
++ <value>granted</value>
++ <value>revoked</value>
++ </choice>
++ </attribute>
++ <attribute name="standby"> <data type="boolean" /> </attribute>
++ <optional>
++ <attribute name="last-granted"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-ban">
++ <element name="ban">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="weight"> <data type="integer" /> </attribute>
++ <attribute name="promoted-only"> <data type="boolean" /> </attribute>
++ <!-- DEPRECATED: master_only is a duplicate of promoted-only that is
++ provided solely for API backward compatibility. It will be
++ removed in a future release. Check promoted-only instead.
++ -->
++ <attribute name="master_only"> <data type="boolean" /> </attribute>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From da394983f106f974274ddd94675a04c85086010e Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 18 Jun 2021 15:06:34 -0400
+Subject: [PATCH 2/5] Refactor: Split node history out into its own XML schema.
+
+This allows for sharing it between crm_mon and crm_simulate.
+---
+ xml/Makefile.am | 2 +-
+ xml/api/crm_mon-2.12.rng | 64 +--------------------------------------
+ xml/api/node-history-2.12.rng | 70 +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 72 insertions(+), 64 deletions(-)
+ create mode 100644 xml/api/node-history-2.12.rng
+
+diff --git a/xml/Makefile.am b/xml/Makefile.am
+index b9448d4..8e7b6d3 100644
+--- a/xml/Makefile.am
++++ b/xml/Makefile.am
+@@ -64,7 +64,7 @@ API_request_base = command-output \
+ CIB_cfg_base = options nodes resources constraints fencing acls tags alerts
+
+ # Names of all schemas (including top level and those included by others)
+-API_base = $(API_request_base) fence-event failure generic-list item node-attrs nodes resources status
++API_base = $(API_request_base) fence-event failure generic-list item node-attrs node-history nodes resources status
+ CIB_base = cib $(CIB_cfg_base) status score rule nvset
+
+ # Static schema files and transforms (only CIB has transforms)
+diff --git a/xml/api/crm_mon-2.12.rng b/xml/api/crm_mon-2.12.rng
+index ffec923..be14412 100644
+--- a/xml/api/crm_mon-2.12.rng
++++ b/xml/api/crm_mon-2.12.rng
+@@ -20,7 +20,7 @@
+ <ref name="node-attributes-list" />
+ </optional>
+ <optional>
+- <ref name="node-history-list" />
++ <externalRef href="node-history-2.12.rng"/>
+ </optional>
+ <optional>
+ <ref name="failures-list" />
+@@ -113,14 +113,6 @@
+ </element>
+ </define>
+
+- <define name="node-history-list">
+- <element name="node_history">
+- <zeroOrMore>
+- <ref name="element-node-history" />
+- </zeroOrMore>
+- </element>
+- </define>
+-
+ <define name="failures-list">
+ <element name="failures">
+ <zeroOrMore>
+@@ -156,60 +148,6 @@
+ </element>
+ </define>
+
+- <define name="element-node-history">
+- <element name="node">
+- <attribute name="name"> <text /> </attribute>
+- <zeroOrMore>
+- <ref name="element-resource-history" />
+- </zeroOrMore>
+- </element>
+- </define>
+-
+- <define name="element-resource-history">
+- <element name="resource_history">
+- <attribute name="id"> <text /> </attribute>
+- <attribute name="orphan"> <data type="boolean" /> </attribute>
+- <optional>
+- <group>
+- <attribute name="migration-threshold"> <data type="nonNegativeInteger" /> </attribute>
+- <optional>
+- <attribute name="fail-count"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="last-failure"> <text /> </attribute>
+- </optional>
+- </group>
+- </optional>
+- <zeroOrMore>
+- <ref name="element-operation-history" />
+- </zeroOrMore>
+- </element>
+- </define>
+-
+- <define name="element-operation-history">
+- <element name="operation_history">
+- <attribute name="call"> <text /> </attribute>
+- <attribute name="task"> <text /> </attribute>
+- <optional>
+- <attribute name="interval"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="last-rc-change"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="last-run"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="exec-time"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="queue-time"> <text /> </attribute>
+- </optional>
+- <attribute name="rc"> <data type="integer" /> </attribute>
+- <attribute name="rc_text"> <text /> </attribute>
+- </element>
+- </define>
+-
+ <define name="element-ticket">
+ <element name="ticket">
+ <attribute name="id"> <text /> </attribute>
+diff --git a/xml/api/node-history-2.12.rng b/xml/api/node-history-2.12.rng
+new file mode 100644
+index 0000000..9628000
+--- /dev/null
++++ b/xml/api/node-history-2.12.rng
+@@ -0,0 +1,70 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="node-history-list" />
++ </start>
++
++ <define name="node-history-list">
++ <element name="node_history">
++ <zeroOrMore>
++ <ref name="element-node-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-node-history">
++ <element name="node">
++ <attribute name="name"> <text /> </attribute>
++ <zeroOrMore>
++ <ref name="element-resource-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-resource-history">
++ <element name="resource_history">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="orphan"> <data type="boolean" /> </attribute>
++ <optional>
++ <group>
++ <attribute name="migration-threshold"> <data type="nonNegativeInteger" /> </attribute>
++ <optional>
++ <attribute name="fail-count"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-failure"> <text /> </attribute>
++ </optional>
++ </group>
++ </optional>
++ <zeroOrMore>
++ <ref name="element-operation-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-operation-history">
++ <element name="operation_history">
++ <attribute name="call"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="interval"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-rc-change"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-run"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="exec-time"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="queue-time"> <text /> </attribute>
++ </optional>
++ <attribute name="rc"> <data type="integer" /> </attribute>
++ <attribute name="rc_text"> <text /> </attribute>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From bf72b2615630eef7876e443d60b34d5a316de847 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Wed, 16 Jun 2021 14:09:31 -0400
+Subject: [PATCH 3/5] Low: schemas: Copy crm_simulate.rng in preparation for
+ changes.
+
+---
+ xml/api/crm_simulate-2.12.rng | 335 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 335 insertions(+)
+ create mode 100644 xml/api/crm_simulate-2.12.rng
+
+diff --git a/xml/api/crm_simulate-2.12.rng b/xml/api/crm_simulate-2.12.rng
+new file mode 100644
+index 0000000..9a7612d
+--- /dev/null
++++ b/xml/api/crm_simulate-2.12.rng
+@@ -0,0 +1,335 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-crm-simulate"/>
++ </start>
++
++ <define name="element-crm-simulate">
++ <choice>
++ <ref name="timings-list" />
++ <group>
++ <ref name="cluster-status" />
++ <optional>
++ <ref name="modifications-list" />
++ </optional>
++ <optional>
++ <ref name="allocations-utilizations-list" />
++ </optional>
++ <optional>
++ <ref name="action-list" />
++ </optional>
++ <optional>
++ <ref name="cluster-injected-actions-list" />
++ <ref name="revised-cluster-status" />
++ </optional>
++ </group>
++ </choice>
++ </define>
++
++ <define name="allocations-utilizations-list">
++ <choice>
++ <element name="allocations">
++ <zeroOrMore>
++ <choice>
++ <ref name="element-allocation" />
++ <ref name="element-promotion" />
++ </choice>
++ </zeroOrMore>
++ </element>
++ <element name="utilizations">
++ <zeroOrMore>
++ <choice>
++ <ref name="element-capacity" />
++ <ref name="element-utilization" />
++ </choice>
++ </zeroOrMore>
++ </element>
++ <element name="allocations_utilizations">
++ <zeroOrMore>
++ <choice>
++ <ref name="element-allocation" />
++ <ref name="element-promotion" />
++ <ref name="element-capacity" />
++ <ref name="element-utilization" />
++ </choice>
++ </zeroOrMore>
++ </element>
++ </choice>
++ </define>
++
++ <define name="cluster-status">
++ <element name="cluster_status">
++ <ref name="nodes-list" />
++ <ref name="resources-list" />
++ <optional>
++ <ref name="node-attributes-list" />
++ </optional>
++ <optional>
++ <ref name="failures-list" />
++ </optional>
++ </element>
++ </define>
++
++ <define name="modifications-list">
++ <element name="modifications">
++ <optional>
++ <attribute name="quorum"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="watchdog"> <text /> </attribute>
++ </optional>
++ <zeroOrMore>
++ <ref name="element-inject-modify-node" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-inject-modify-ticket" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-inject-spec" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-inject-attr" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="revised-cluster-status">
++ <element name="revised_cluster_status">
++ <ref name="nodes-list" />
++ <ref name="resources-list" />
++ <optional>
++ <ref name="node-attributes-list" />
++ </optional>
++ <optional>
++ <ref name="failures-list" />
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-inject-attr">
++ <element name="inject_attr">
++ <attribute name="cib_node"> <text /> </attribute>
++ <attribute name="name"> <text /> </attribute>
++ <attribute name="node_path"> <text /> </attribute>
++ <attribute name="value"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-inject-modify-node">
++ <element name="modify_node">
++ <attribute name="action"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-inject-spec">
++ <element name="inject_spec">
++ <attribute name="spec"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-inject-modify-ticket">
++ <element name="modify_ticket">
++ <attribute name="action"> <text /> </attribute>
++ <attribute name="ticket"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="cluster-injected-actions-list">
++ <element name="transition">
++ <zeroOrMore>
++ <ref name="element-injected-actions" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="node-attributes-list">
++ <element name="node_attributes">
++ <zeroOrMore>
++ <externalRef href="node-attrs-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="failures-list">
++ <element name="failures">
++ <zeroOrMore>
++ <externalRef href="failure-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="nodes-list">
++ <element name="nodes">
++ <zeroOrMore>
++ <externalRef href="nodes-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="resources-list">
++ <element name="resources">
++ <zeroOrMore>
++ <externalRef href="resources-2.4.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="timings-list">
++ <element name="timings">
++ <zeroOrMore>
++ <ref name="element-timing" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="action-list">
++ <element name="actions">
++ <zeroOrMore>
++ <ref name="element-node-action" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-rsc-action" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-allocation">
++ <element name="node_weight">
++ <attribute name="function"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <externalRef href="../score.rng" />
++ <optional>
++ <attribute name="id"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-capacity">
++ <element name="capacity">
++ <attribute name="comment"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <zeroOrMore>
++ <element>
++ <anyName />
++ <text />
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-inject-cluster-action">
++ <element name="cluster_action">
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="id"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-injected-actions">
++ <choice>
++ <ref name="element-inject-cluster-action" />
++ <ref name="element-inject-fencing-action" />
++ <ref name="element-inject-pseudo-action" />
++ <ref name="element-inject-rsc-action" />
++ </choice>
++ </define>
++
++ <define name="element-inject-fencing-action">
++ <element name="fencing_action">
++ <attribute name="op"> <text /> </attribute>
++ <attribute name="target"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-node-action">
++ <element name="node_action">
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="reason"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-promotion">
++ <element name="promotion_score">
++ <attribute name="id"> <text /> </attribute>
++ <externalRef href="../score.rng" />
++ <optional>
++ <attribute name="node"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-inject-pseudo-action">
++ <element name="pseudo_action">
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="node"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-inject-rsc-action">
++ <element name="rsc_action">
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="op"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <optional>
++ <attribute name="interval"> <data type="integer" /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-timing">
++ <element name="timing">
++ <attribute name="file"> <text /> </attribute>
++ <attribute name="duration"> <data type="double" /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-rsc-action">
++ <element name="rsc_action">
++ <attribute name="action"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <optional>
++ <attribute name="blocked"> <data type="boolean" /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="dest"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="next-role"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="node"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="reason"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="role"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="source"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-utilization">
++ <element name="utilization">
++ <attribute name="function"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <zeroOrMore>
++ <element>
++ <anyName />
++ <text />
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From c46e07788788acf5669e3f89b9344190a91c7331 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 18 Jun 2021 15:10:19 -0400
+Subject: [PATCH 4/5] Feature: tools: Add the node-summary to crm_simulate
+ output.
+
+If --show-failcounts is given to crm_simulate, it should also display
+the node-summary message.
+
+See: rhbz#1686426
+---
+ tools/crm_simulate.c | 7 +++++--
+ xml/api/crm_simulate-2.12.rng | 3 +++
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c
+index b4aa9d1..2ea292c 100644
+--- a/tools/crm_simulate.c
++++ b/tools/crm_simulate.c
+@@ -409,11 +409,14 @@ print_cluster_status(pe_working_set_t * data_set, unsigned int print_opts)
+ FALSE, FALSE, all, all, FALSE);
+
+ if (options.show_attrs) {
+- out->message(out, "node-attribute-list", data_set,
+- 0, rc == pcmk_rc_ok, FALSE, FALSE, FALSE, all, all);
++ rc = out->message(out, "node-attribute-list", data_set,
++ 0, rc == pcmk_rc_ok, FALSE, FALSE, FALSE, all, all);
+ }
+
+ if (options.show_failcounts) {
++ rc = out->message(out, "node-summary", data_set, all, all,
++ 0, print_opts, FALSE, FALSE, FALSE, FALSE, rc == pcmk_rc_ok);
++
+ out->message(out, "failed-action-list", data_set, all, all,
+ rc == pcmk_rc_ok);
+ }
+diff --git a/xml/api/crm_simulate-2.12.rng b/xml/api/crm_simulate-2.12.rng
+index 9a7612d..f90bd36 100644
+--- a/xml/api/crm_simulate-2.12.rng
++++ b/xml/api/crm_simulate-2.12.rng
+@@ -67,6 +67,9 @@
+ <ref name="node-attributes-list" />
+ </optional>
+ <optional>
++ <externalRef href="node-history-2.12.rng" />
++ </optional>
++ <optional>
+ <ref name="failures-list" />
+ </optional>
+ </element>
+--
+1.8.3.1
+
+
+From bac50336e0264604716e5997b87ee7e65311b982 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 18 Jun 2021 15:21:52 -0400
+Subject: [PATCH 5/5] Low: libcrmcommon: Increase PCMK__API_VERSION for new
+ crm_resource output.
+
+See: rhbz#1686426
+---
+ include/crm/common/output_internal.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
+index 0436cde..ba9c423 100644
+--- a/include/crm/common/output_internal.h
++++ b/include/crm/common/output_internal.h
+@@ -27,7 +27,7 @@ extern "C" {
+ # include <glib.h>
+ # include <crm/common/results.h>
+
+-# define PCMK__API_VERSION "2.11"
++# define PCMK__API_VERSION "2.12"
+
+ #if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS)
+ # define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS)))
+--
+1.8.3.1
+
diff --git a/007-unfencing-loop.patch b/007-unfencing-loop.patch
new file mode 100644
index 0000000..d4950c8
--- /dev/null
+++ b/007-unfencing-loop.patch
@@ -0,0 +1,733 @@
+From 6dcd6b51d7d3993bc483588d6ed75077518ed600 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 4 Jun 2021 16:30:55 -0500
+Subject: [PATCH 01/11] Low: controller: check whether unfenced node was remote
+ node
+
+... so the controller can indicate the node is remote (if known at that point,
+which is not guaranteed) when setting unfencing-related node attributes.
+---
+ daemons/controld/controld_fencing.c | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/daemons/controld/controld_fencing.c b/daemons/controld/controld_fencing.c
+index 23dff28..0fba661 100644
+--- a/daemons/controld/controld_fencing.c
++++ b/daemons/controld/controld_fencing.c
+@@ -757,15 +757,30 @@ tengine_stonith_callback(stonith_t *stonith, stonith_callback_data_t *data)
+ if (pcmk__str_eq("on", op, pcmk__str_casei)) {
+ const char *value = NULL;
+ char *now = pcmk__ttoa(time(NULL));
++ gboolean is_remote_node = FALSE;
++
++ /* This check is not 100% reliable, since this node is not
++ * guaranteed to have the remote node cached. However, it
++ * doesn't have to be reliable, since the attribute manager can
++ * learn a node's "remoteness" by other means sooner or later.
++ * This allows it to learn more quickly if this node does have
++ * the information.
++ */
++ if (g_hash_table_lookup(crm_remote_peer_cache, uuid) != NULL) {
++ is_remote_node = TRUE;
++ }
+
+- update_attrd(target, CRM_ATTR_UNFENCED, now, NULL, FALSE);
++ update_attrd(target, CRM_ATTR_UNFENCED, now, NULL,
++ is_remote_node);
+ free(now);
+
+ value = crm_meta_value(action->params, XML_OP_ATTR_DIGESTS_ALL);
+- update_attrd(target, CRM_ATTR_DIGESTS_ALL, value, NULL, FALSE);
++ update_attrd(target, CRM_ATTR_DIGESTS_ALL, value, NULL,
++ is_remote_node);
+
+ value = crm_meta_value(action->params, XML_OP_ATTR_DIGESTS_SECURE);
+- update_attrd(target, CRM_ATTR_DIGESTS_SECURE, value, NULL, FALSE);
++ update_attrd(target, CRM_ATTR_DIGESTS_SECURE, value, NULL,
++ is_remote_node);
+
+ } else if (action->sent_update == FALSE) {
+ send_stonith_update(action, target, uuid);
+--
+1.8.3.1
+
+
+From 3ef6d9403f68ab8559c45cc99f5a8da05ca6420b Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 10:50:36 -0500
+Subject: [PATCH 02/11] Refactor: pacemaker-attrd: functionize adding remote
+ node to cache
+
+... for future reuse
+---
+ daemons/attrd/attrd_commands.c | 34 +++++++++++++++++++++++-----------
+ 1 file changed, 23 insertions(+), 11 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 731c243..93a165b 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -102,6 +102,28 @@ free_attribute(gpointer data)
+ }
+ }
+
++/*!
++ * \internal
++ * \brief Ensure a Pacemaker Remote node is in the correct peer cache
++ *
++ * \param[in]
++ */
++static void
++cache_remote_node(const char *node_name)
++{
++ /* If we previously assumed this node was an unseen cluster node,
++ * remove its entry from the cluster peer cache.
++ */
++ crm_node_t *dup = pcmk__search_cluster_node_cache(0, node_name);
++
++ if (dup && (dup->uuid == NULL)) {
++ reap_crm_member(0, node_name);
++ }
++
++ // Ensure node is in the remote peer cache
++ CRM_ASSERT(crm_remote_peer_get(node_name) != NULL);
++}
++
+ static xmlNode *
+ build_attribute_xml(
+ xmlNode *parent, const char *name, const char *set, const char *uuid, unsigned int timeout_ms, const char *user,
+@@ -709,17 +731,7 @@ attrd_lookup_or_create_value(GHashTable *values, const char *host, xmlNode *xml)
+
+ crm_element_value_int(xml, PCMK__XA_ATTR_IS_REMOTE, &is_remote);
+ if (is_remote) {
+- /* If we previously assumed this node was an unseen cluster node,
+- * remove its entry from the cluster peer cache.
+- */
+- crm_node_t *dup = pcmk__search_cluster_node_cache(0, host);
+-
+- if (dup && (dup->uuid == NULL)) {
+- reap_crm_member(0, host);
+- }
+-
+- /* Ensure this host is in the remote peer cache */
+- CRM_ASSERT(crm_remote_peer_get(host) != NULL);
++ cache_remote_node(host);
+ }
+
+ if (v == NULL) {
+--
+1.8.3.1
+
+
+From 6fac2c71bc2c56870ac828d7cd7b7c799279c47e Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 10:39:34 -0500
+Subject: [PATCH 03/11] Refactor: pacemaker-attrd: don't try to remove votes
+ for remote nodes
+
+Remote nodes never vote.
+
+This has no effect in practice since the removal would simply do nothing,
+but we might as well not waste time trying.
+---
+ daemons/attrd/attrd_commands.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 93a165b..dbe777e 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -976,7 +976,8 @@ attrd_election_cb(gpointer user_data)
+ void
+ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *data)
+ {
+- bool remove_voter = FALSE;
++ bool gone = false;
++ bool is_remote = pcmk_is_set(peer->flags, crm_remote_node);
+
+ switch (kind) {
+ case crm_status_uname:
+@@ -984,7 +985,7 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+
+ case crm_status_processes:
+ if (!pcmk_is_set(peer->processes, crm_get_cluster_proc())) {
+- remove_voter = TRUE;
++ gone = true;
+ }
+ break;
+
+@@ -1000,13 +1001,13 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+ } else {
+ // Remove all attribute values associated with lost nodes
+ attrd_peer_remove(peer->uname, FALSE, "loss");
+- remove_voter = TRUE;
++ gone = true;
+ }
+ break;
+ }
+
+- // In case an election is in progress, remove any vote by the node
+- if (remove_voter) {
++ // Remove votes from cluster nodes that leave, in case election in progress
++ if (gone && !is_remote) {
+ attrd_remove_voter(peer);
+ }
+ }
+--
+1.8.3.1
+
+
+From 54089fc663d6aaf10ca164c6c94b3b17237788de Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 10:40:06 -0500
+Subject: [PATCH 04/11] Low: pacemaker-attrd: check for remote nodes in peer
+ update callback
+
+If a remote node was started before the local cluster node joined the cluster,
+the cluster node will assume its node attributes are for a cluster node until
+it learns otherwise. Check for remoteness in the peer update callback, to have
+another way we can learn it.
+---
+ daemons/attrd/attrd_commands.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index dbe777e..5f6a754 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -1009,6 +1009,10 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+ // Remove votes from cluster nodes that leave, in case election in progress
+ if (gone && !is_remote) {
+ attrd_remove_voter(peer);
++
++ // Ensure remote nodes that come up are in the remote node cache
++ } else if (!gone && is_remote) {
++ cache_remote_node(peer->uname);
+ }
+ }
+
+--
+1.8.3.1
+
+
+From 8c048df0312d0d9c857d87b570a352429a710928 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 11:29:12 -0500
+Subject: [PATCH 05/11] Log: pacemaker-attrd: log peer status changes
+
+---
+ daemons/attrd/attrd_commands.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 5f6a754..d6d179b 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -972,6 +972,7 @@ attrd_election_cb(gpointer user_data)
+ return FALSE;
+ }
+
++#define state_text(state) ((state)? (const char *)(state) : "in unknown state")
+
+ void
+ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *data)
+@@ -981,15 +982,23 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+
+ switch (kind) {
+ case crm_status_uname:
++ crm_debug("%s node %s is now %s",
++ (is_remote? "Remote" : "Cluster"),
++ peer->uname, state_text(peer->state));
+ break;
+
+ case crm_status_processes:
+ if (!pcmk_is_set(peer->processes, crm_get_cluster_proc())) {
+ gone = true;
+ }
++ crm_debug("Node %s is %s a peer",
++ peer->uname, (gone? "no longer" : "now"));
+ break;
+
+ case crm_status_nstate:
++ crm_debug("%s node %s is now %s (was %s)",
++ (is_remote? "Remote" : "Cluster"),
++ peer->uname, state_text(peer->state), state_text(data));
+ if (pcmk__str_eq(peer->state, CRM_NODE_MEMBER, pcmk__str_casei)) {
+ /* If we're the writer, send new peers a list of all attributes
+ * (unless it's a remote node, which doesn't run its own attrd)
+--
+1.8.3.1
+
+
+From 1dcc8dee4990cf0dbdec0e14db6d9a3ad67a41d5 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 11:13:53 -0500
+Subject: [PATCH 06/11] Low: pacemaker-attrd: ensure node ID is only set for
+ attributes when known
+
+In most cases, attribute updates contained the node ID, and the node ID was
+used by other code, only if known (i.e. positive). However a couple places did
+not check this, so add that.
+
+I am unsure whether the missing check caused problems in practice, but there
+appears to be the possibility that a remote node would wrongly be added to the
+cluster node cache.
+---
+ daemons/attrd/attrd_commands.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index d6d179b..b3f441c 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -136,7 +136,9 @@ build_attribute_xml(
+ crm_xml_add(xml, PCMK__XA_ATTR_UUID, uuid);
+ crm_xml_add(xml, PCMK__XA_ATTR_USER, user);
+ crm_xml_add(xml, PCMK__XA_ATTR_NODE_NAME, peer);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, peerid);
++ if (peerid > 0) {
++ crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, peerid);
++ }
+ crm_xml_add(xml, PCMK__XA_ATTR_VALUE, value);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, timeout_ms/1000);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, is_private);
+@@ -937,7 +939,7 @@ attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter)
+ /* If this is a cluster node whose node ID we are learning, remember it */
+ if ((v->nodeid == 0) && (v->is_remote == FALSE)
+ && (crm_element_value_int(xml, PCMK__XA_ATTR_NODE_ID,
+- (int*)&v->nodeid) == 0)) {
++ (int*)&v->nodeid) == 0) && (v->nodeid > 0)) {
+
+ crm_node_t *known_peer = crm_get_peer(v->nodeid, host);
+
+--
+1.8.3.1
+
+
+From 8d12490e88b558d01db37a38f7d35175c6d2d69a Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Thu, 10 Jun 2021 17:25:57 -0500
+Subject: [PATCH 07/11] Refactor: pacemaker-attrd: functionize processing a
+ sync response
+
+... for code isolation, and because we need to add more to it
+---
+ daemons/attrd/attrd_commands.c | 59 ++++++++++++++++++++++++++++--------------
+ 1 file changed, 39 insertions(+), 20 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index b3f441c..d02d3e6 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -572,6 +572,43 @@ attrd_peer_clear_failure(crm_node_t *peer, xmlNode *xml)
+ }
+
+ /*!
++ * \internal
++ * \brief Load attributes from a peer sync response
++ *
++ * \param[in] peer Peer that sent clear request
++ * \param[in] peer_won Whether peer is the attribute writer
++ * \param[in] xml Request XML
++ */
++static void
++process_peer_sync_response(crm_node_t *peer, bool peer_won, xmlNode *xml)
++{
++ crm_info("Processing " PCMK__ATTRD_CMD_SYNC_RESPONSE " from %s",
++ peer->uname);
++
++ if (peer_won) {
++ /* Initialize the "seen" flag for all attributes to cleared, so we can
++ * detect attributes that local node has but the writer doesn't.
++ */
++ clear_attribute_value_seen();
++ }
++
++ // Process each attribute update in the sync response
++ for (xmlNode *child = pcmk__xml_first_child(xml); child != NULL;
++ child = pcmk__xml_next(child)) {
++ attrd_peer_update(peer, child,
++ crm_element_value(child, PCMK__XA_ATTR_NODE_NAME),
++ TRUE);
++ }
++
++ if (peer_won) {
++ /* If any attributes are still not marked as seen, the writer doesn't
++ * know about them, so send all peers an update with them.
++ */
++ attrd_current_only_attribute_update(peer, xml);
++ }
++}
++
++/*!
+ \internal
+ \brief Broadcast private attribute for local node with protocol version
+ */
+@@ -596,7 +633,7 @@ attrd_peer_message(crm_node_t *peer, xmlNode *xml)
+ const char *op = crm_element_value(xml, PCMK__XA_TASK);
+ const char *election_op = crm_element_value(xml, F_CRM_TASK);
+ const char *host = crm_element_value(xml, PCMK__XA_ATTR_NODE_NAME);
+- bool peer_won = FALSE;
++ bool peer_won = false;
+
+ if (election_op) {
+ attrd_handle_election_op(peer, xml);
+@@ -631,25 +668,7 @@ attrd_peer_message(crm_node_t *peer, xmlNode *xml)
+
+ } else if (pcmk__str_eq(op, PCMK__ATTRD_CMD_SYNC_RESPONSE, pcmk__str_casei)
+ && !pcmk__str_eq(peer->uname, attrd_cluster->uname, pcmk__str_casei)) {
+- xmlNode *child = NULL;
+-
+- crm_info("Processing %s from %s", op, peer->uname);
+-
+- /* Clear the seen flag for attribute processing held only in the own node. */
+- if (peer_won) {
+- clear_attribute_value_seen();
+- }
+-
+- for (child = pcmk__xml_first_child(xml); child != NULL;
+- child = pcmk__xml_next(child)) {
+- host = crm_element_value(child, PCMK__XA_ATTR_NODE_NAME);
+- attrd_peer_update(peer, child, host, TRUE);
+- }
+-
+- if (peer_won) {
+- /* Synchronize if there is an attribute held only by own node that Writer does not have. */
+- attrd_current_only_attribute_update(peer, xml);
+- }
++ process_peer_sync_response(peer, peer_won, xml);
+
+ } else if (pcmk__str_eq(op, PCMK__ATTRD_CMD_FLUSH, pcmk__str_casei)) {
+ /* Ignore. The flush command was removed in 2.0.0 but may be
+--
+1.8.3.1
+
+
+From a890a0e5bbbcabf907f51ed0460868035f72464d Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 11 Jun 2021 14:40:39 -0500
+Subject: [PATCH 08/11] Refactor: pacemaker-attrd: functionize broadcasting
+ local override
+
+... for code isolation
+---
+ daemons/attrd/attrd_commands.c | 42 +++++++++++++++++++++++++++++-------------
+ 1 file changed, 29 insertions(+), 13 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index d02d3e6..4783427 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -804,6 +804,34 @@ attrd_current_only_attribute_update(crm_node_t *peer, xmlNode *xml)
+ free_xml(sync);
+ }
+
++/*!
++ * \internal
++ * \brief Override an attribute sync with a local value
++ *
++ * Broadcast the local node's value for an attribute that's different from the
++ * value provided in a peer's attribute synchronization response. This ensures a
++ * node's values for itself take precedence and all peers are kept in sync.
++ *
++ * \param[in] a Attribute entry to override
++ *
++ * \return Local instance of attribute value
++ */
++static attribute_value_t *
++broadcast_local_value(attribute_t *a)
++{
++ attribute_value_t *v = g_hash_table_lookup(a->values, attrd_cluster->uname);
++ xmlNode *sync = create_xml_node(NULL, __func__);
++
++ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
++ build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms,
++ a->user, a->is_private, v->nodename, v->nodeid,
++ v->current, FALSE);
++ attrd_xml_add_writer(sync);
++ send_attrd_message(NULL, sync);
++ free_xml(sync);
++ return v;
++}
++
+ void
+ attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter)
+ {
+@@ -899,21 +927,9 @@ attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter)
+ if (filter && !pcmk__str_eq(v->current, value, pcmk__str_casei)
+ && pcmk__str_eq(host, attrd_cluster->uname, pcmk__str_casei)) {
+
+- xmlNode *sync = create_xml_node(NULL, __func__);
+-
+ crm_notice("%s[%s]: local value '%s' takes priority over '%s' from %s",
+ attr, host, v->current, value, peer->uname);
+-
+- crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
+- v = g_hash_table_lookup(a->values, host);
+- build_attribute_xml(sync, attr, a->set, a->uuid, a->timeout_ms, a->user,
+- a->is_private, v->nodename, v->nodeid, v->current, FALSE);
+-
+- attrd_xml_add_writer(sync);
+-
+- /* Broadcast in case any other nodes had the inconsistent value */
+- send_attrd_message(NULL, sync);
+- free_xml(sync);
++ v = broadcast_local_value(a);
+
+ } else if (!pcmk__str_eq(v->current, value, pcmk__str_casei)) {
+ crm_notice("Setting %s[%s]: %s -> %s " CRM_XS " from %s",
+--
+1.8.3.1
+
+
+From f6f65e3dab070f1bbdf6d1383f4d6173a8840bc9 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 11 Jun 2021 14:50:29 -0500
+Subject: [PATCH 09/11] Log: pacemaker-attrd: improve messages when
+ broadcasting local-only values
+
+The traces aren't necessary since build_attribute_xml() already logs the same
+info at debug. Also, rename function for clarity, and make static.
+---
+ daemons/attrd/attrd_commands.c | 35 ++++++++++++++++-------------------
+ 1 file changed, 16 insertions(+), 19 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 4783427..356defb 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -51,11 +51,12 @@ GHashTable *attributes = NULL;
+
+ void write_attribute(attribute_t *a, bool ignore_delay);
+ void write_or_elect_attribute(attribute_t *a);
+-void attrd_current_only_attribute_update(crm_node_t *peer, xmlNode *xml);
+ void attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter);
+ void attrd_peer_sync(crm_node_t *peer, xmlNode *xml);
+ void attrd_peer_remove(const char *host, gboolean uncache, const char *source);
+
++static void broadcast_unseen_local_values(crm_node_t *peer, xmlNode *xml);
++
+ static gboolean
+ send_attrd_message(crm_node_t * node, xmlNode * data)
+ {
+@@ -604,7 +605,7 @@ process_peer_sync_response(crm_node_t *peer, bool peer_won, xmlNode *xml)
+ /* If any attributes are still not marked as seen, the writer doesn't
+ * know about them, so send all peers an update with them.
+ */
+- attrd_current_only_attribute_update(peer, xml);
++ broadcast_unseen_local_values(peer, xml);
+ }
+ }
+
+@@ -768,40 +769,36 @@ attrd_lookup_or_create_value(GHashTable *values, const char *host, xmlNode *xml)
+ return(v);
+ }
+
+-void
+-attrd_current_only_attribute_update(crm_node_t *peer, xmlNode *xml)
++void
++broadcast_unseen_local_values(crm_node_t *peer, xmlNode *xml)
+ {
+ GHashTableIter aIter;
+ GHashTableIter vIter;
+- attribute_t *a;
++ attribute_t *a = NULL;
+ attribute_value_t *v = NULL;
+- xmlNode *sync = create_xml_node(NULL, __func__);
+- gboolean build = FALSE;
+-
+- crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
++ xmlNode *sync = NULL;
+
+ g_hash_table_iter_init(&aIter, attributes);
+ while (g_hash_table_iter_next(&aIter, NULL, (gpointer *) & a)) {
+ g_hash_table_iter_init(&vIter, a->values);
+ while (g_hash_table_iter_next(&vIter, NULL, (gpointer *) & v)) {
+- if (pcmk__str_eq(v->nodename, attrd_cluster->uname, pcmk__str_casei) && v->seen == FALSE) {
+- crm_trace("Syncing %s[%s] = %s to everyone.(from local only attributes)", a->id, v->nodename, v->current);
+-
+- build = TRUE;
++ if (!(v->seen) && pcmk__str_eq(v->nodename, attrd_cluster->uname,
++ pcmk__str_casei)) {
++ if (sync == NULL) {
++ sync = create_xml_node(NULL, __func__);
++ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
++ }
+ build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms, a->user, a->is_private,
+ v->nodename, v->nodeid, v->current, (a->timeout_ms && a->timer ? TRUE : FALSE));
+- } else {
+- crm_trace("Local attribute(%s[%s] = %s) was ignore.(another host) : [%s]", a->id, v->nodename, v->current, attrd_cluster->uname);
+- continue;
+ }
+ }
+ }
+
+- if (build) {
+- crm_debug("Syncing values to everyone.(from local only attributes)");
++ if (sync != NULL) {
++ crm_debug("Broadcasting local-only values");
+ send_attrd_message(NULL, sync);
++ free_xml(sync);
+ }
+- free_xml(sync);
+ }
+
+ /*!
+--
+1.8.3.1
+
+
+From ab90ffb785ea018556f216b8f540f8c3429a3947 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 11 Jun 2021 15:04:20 -0500
+Subject: [PATCH 10/11] Refactor: pacemaker-attrd: simplify attribute XML
+ creation function
+
+... and rename for clarity
+---
+ daemons/attrd/attrd_commands.c | 48 ++++++++++++++++++++++++------------------
+ 1 file changed, 27 insertions(+), 21 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 356defb..5b32a77 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -125,25 +125,35 @@ cache_remote_node(const char *node_name)
+ CRM_ASSERT(crm_remote_peer_get(node_name) != NULL);
+ }
+
++/*!
++ * \internal
++ * \brief Create an XML representation of an attribute for use in peer messages
++ *
++ * \param[in] parent Create attribute XML as child element of this element
++ * \param[in] a Attribute to represent
++ * \param[in] v Attribute value to represent
++ * \param[in] force_write If true, value should be written even if unchanged
++ *
++ * \return XML representation of attribute
++ */
+ static xmlNode *
+-build_attribute_xml(
+- xmlNode *parent, const char *name, const char *set, const char *uuid, unsigned int timeout_ms, const char *user,
+- gboolean is_private, const char *peer, uint32_t peerid, const char *value, gboolean is_force_write)
++add_attribute_value_xml(xmlNode *parent, attribute_t *a, attribute_value_t *v,
++ bool force_write)
+ {
+ xmlNode *xml = create_xml_node(parent, __func__);
+
+- crm_xml_add(xml, PCMK__XA_ATTR_NAME, name);
+- crm_xml_add(xml, PCMK__XA_ATTR_SET, set);
+- crm_xml_add(xml, PCMK__XA_ATTR_UUID, uuid);
+- crm_xml_add(xml, PCMK__XA_ATTR_USER, user);
+- crm_xml_add(xml, PCMK__XA_ATTR_NODE_NAME, peer);
+- if (peerid > 0) {
+- crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, peerid);
++ crm_xml_add(xml, PCMK__XA_ATTR_NAME, a->id);
++ crm_xml_add(xml, PCMK__XA_ATTR_SET, a->set);
++ crm_xml_add(xml, PCMK__XA_ATTR_UUID, a->uuid);
++ crm_xml_add(xml, PCMK__XA_ATTR_USER, a->user);
++ crm_xml_add(xml, PCMK__XA_ATTR_NODE_NAME, v->nodename);
++ if (v->nodeid > 0) {
++ crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, v->nodeid);
+ }
+- crm_xml_add(xml, PCMK__XA_ATTR_VALUE, value);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, timeout_ms/1000);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, is_private);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_FORCE, is_force_write);
++ crm_xml_add(xml, PCMK__XA_ATTR_VALUE, v->current);
++ crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, a->timeout_ms / 1000);
++ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, a->is_private);
++ crm_xml_add_int(xml, PCMK__XA_ATTR_FORCE, force_write);
+
+ return xml;
+ }
+@@ -695,8 +705,7 @@ attrd_peer_sync(crm_node_t *peer, xmlNode *xml)
+ g_hash_table_iter_init(&vIter, a->values);
+ while (g_hash_table_iter_next(&vIter, NULL, (gpointer *) & v)) {
+ crm_debug("Syncing %s[%s] = %s to %s", a->id, v->nodename, v->current, peer?peer->uname:"everyone");
+- build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms, a->user, a->is_private,
+- v->nodename, v->nodeid, v->current, FALSE);
++ add_attribute_value_xml(sync, a, v, false);
+ }
+ }
+
+@@ -788,8 +797,7 @@ broadcast_unseen_local_values(crm_node_t *peer, xmlNode *xml)
+ sync = create_xml_node(NULL, __func__);
+ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
+ }
+- build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms, a->user, a->is_private,
+- v->nodename, v->nodeid, v->current, (a->timeout_ms && a->timer ? TRUE : FALSE));
++ add_attribute_value_xml(sync, a, v, a->timeout_ms && a->timer);
+ }
+ }
+ }
+@@ -820,9 +828,7 @@ broadcast_local_value(attribute_t *a)
+ xmlNode *sync = create_xml_node(NULL, __func__);
+
+ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
+- build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms,
+- a->user, a->is_private, v->nodename, v->nodeid,
+- v->current, FALSE);
++ add_attribute_value_xml(sync, a, v, false);
+ attrd_xml_add_writer(sync);
+ send_attrd_message(NULL, sync);
+ free_xml(sync);
+--
+1.8.3.1
+
+
+From 540d74130c5c8d9c626d6c50475e4dc4f64234e7 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 4 Jun 2021 16:34:26 -0500
+Subject: [PATCH 11/11] Fix: pacemaker-attrd: avoid repeated unfencing of
+ remote nodes
+
+The attribute manager can't record a remote node's attributes to the CIB until
+it knows the node is remote. Normally, this is learned when the remote node
+starts, because the controller clears the CRM_OP_PROBED attribute and indicates
+that it is for a remote node.
+
+However, if a cluster node is down when a remote node starts, and later comes
+up, it learns the remote node's existing attributes as part of the attribute
+sync. Previously, this did not include whether each value is for a cluster or
+remote node, so the newly joined attribute manager couldn't write out remote
+nodes' attributes until it learned that via some other event -- which might not
+happen before the node becomes DC, in which case its scheduler will not see any
+unfencing-related node attributes and may wrongly schedule unfencing.
+
+The sync response handling already calls attrd_lookup_or_create_value(), which
+checks PCMK__XA_ATTR_IS_REMOTE, so all we need to do is add that to the sync
+response.
+---
+ daemons/attrd/attrd_commands.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 5b32a77..0142383 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -43,8 +43,9 @@
+ * 1 1.1.15 PCMK__ATTRD_CMD_UPDATE_BOTH,
+ * PCMK__ATTRD_CMD_UPDATE_DELAY
+ * 2 1.1.17 PCMK__ATTRD_CMD_CLEAR_FAILURE
++ * 3 2.1.1 PCMK__ATTRD_CMD_SYNC_RESPONSE indicates remote nodes
+ */
+-#define ATTRD_PROTOCOL_VERSION "2"
++#define ATTRD_PROTOCOL_VERSION "3"
+
+ int last_cib_op_done = 0;
+ GHashTable *attributes = NULL;
+@@ -150,6 +151,9 @@ add_attribute_value_xml(xmlNode *parent, attribute_t *a, attribute_value_t *v,
+ if (v->nodeid > 0) {
+ crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, v->nodeid);
+ }
++ if (v->is_remote != 0) {
++ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_REMOTE, 1);
++ }
+ crm_xml_add(xml, PCMK__XA_ATTR_VALUE, v->current);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, a->timeout_ms / 1000);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, a->is_private);
+--
+1.8.3.1
+
diff --git a/gating.yaml b/gating.yaml
index 9e15ced..e8aadb9 100644
--- a/gating.yaml
+++ b/gating.yaml
@@ -5,6 +5,7 @@ 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-*
@@ -13,3 +14,9 @@ subject_type: koji_build
rules:
- !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional}
+--- !Policy
+product_versions:
+ - rhel-*
+decision_context: osci_compose_gate
+rules:
+ - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
diff --git a/pacemaker.spec b/pacemaker.spec
index 8551cc6..cdfcdb2 100644
--- a/pacemaker.spec
+++ b/pacemaker.spec
@@ -1,9 +1,9 @@
-# Globals and defines to control package behavior (configure these as desired)
+# User-configurable globals and defines to control package behavior
+# (these should not test {with X} values, which are declared later)
## User and group to use for nonprivileged services
%global uname hacluster
%global gname haclient
-%global hacluster_id 189
## Where to install Pacemaker documentation
%if 0%{?rhel}
@@ -17,6 +17,13 @@
## Where bug reports should be submitted
## Leave bug_url undefined to use ClusterLabs default, others define it here
+%if 0%{?rhel}
+%global bug_url https://bugzilla.redhat.com/
+%else
+%if 0%{?fedora}
+%global bug_url https://bugz.fedoraproject.org/%{name}
+%endif
+%endif
## What to use as the OCF resource agent root directory
%global ocf_root %{_prefix}/lib/ocf
@@ -25,19 +32,21 @@
## can be incremented to build packages reliably considered "newer"
## than previously built packages with the same pcmkversion)
%global pcmkversion 2.1.0
-%global specversion 3
+%global specversion 6
+
+## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build
+%global commit 7c3f660707a495a1331716ad32cd3ac9d9f8ff58
-## Upstream commit (or git tag, such as "Pacemaker-" plus the
-## {pcmkversion} macro for an official release) to use for this package
-%global commit Pacemaker-2.1.0-rc2
## Since git v2.11, the extent of abbreviation is autoscaled by default
## (used to be constant of 7), so we need to convey it for non-tags, too.
%global commit_abbrev 9
+
# Define conditionals so that "rpmbuild --with <feature>" and
# "rpmbuild --without <feature>" can enable and disable specific features
-## NOTE: skip --with stonithd
+## Add option to enable support for stonith/external fencing agents
+%bcond_with stonithd
## Add option for whether to support storing sensitive information outside CIB
%if (0%{?fedora} && 0%{?fedora} <= 33) || (0%{?rhel} && 0%{?rhel} <= 8)
@@ -52,8 +61,13 @@
## Add option to create binaries with coverage analysis
%bcond_with coverage
-## Add option to skip/enable generating documentation
+## Add option to skip (or enable, on RHEL) generating documentation
+## (the build tools aren't available everywhere)
+%if 0%{?rhel}
+%bcond_with doc
+%else
%bcond_without doc
+%endif
## Add option to default to start-up synchronization with SBD.
##
@@ -66,16 +80,19 @@
## Add option to prefix package version with "0."
## (so later "official" packages will be considered updates)
-%bcond_without pre_release
+%bcond_with pre_release
## NOTE: skip --with upstart_job
## Add option to turn off hardening of libraries and daemon executables
%bcond_without hardening
-## Add option to enable links for legacy daemon names
+## Add option to enable (or disable, on RHEL 8) links for legacy daemon names
+%if 0%{?rhel} && 0%{?rhel} <= 8
+%bcond_without legacy_links
+%else
%bcond_with legacy_links
-
+%endif
## Nagios source control identifiers
%global nagios_name nagios-agents-metadata
@@ -94,29 +111,36 @@
## Portion of export/dist tarball name after "pacemaker-", and release version
%if 0%{tag_release}
-%define archive_version %{commit}
+%define archive_version %(c=%{commit}; echo ${c:10})
%define archive_github_url %{commit}#/%{name}-%{archive_version}.tar.gz
-%define pcmk_release %(c=%{commit}; case $c in *-rc[[:digit:]]*%{rparen}
- echo 0.%{specversion}.${c: -3} ;;
- *%{rparen} echo %{specversion} ;; esac)
%else
%define archive_version %(c=%{commit}; echo ${c:0:%{commit_abbrev}})
%define archive_github_url %{archive_version}#/%{name}-%{archive_version}.tar.gz
-%if %{with pre_release}
-%define pcmk_release 0.%{specversion}.%{archive_version}.git
-%else
-%define pcmk_release %{specversion}.%{archive_version}.git
-%endif
%endif
+### Always use a simple release number
+%define pcmk_release %{specversion}
## Base GnuTLS cipher priorities (presumably only the initial, required keyword)
## overridable with "rpmbuild --define 'pcmk_gnutls_priorities PRIORITY-SPEC'"
%define gnutls_priorities %{?pcmk_gnutls_priorities}%{!?pcmk_gnutls_priorities:@SYSTEM}
+## Different distros name certain packages differently
+## (note: corosync libraries also differ, but all provide corosync-devel)
+%global pkgname_libtool_devel libtool-ltdl-devel
+%global pkgname_libtool_devel_arch libtool-ltdl-devel%{?_isa}
+%global pkgname_bzip2_devel bzip2-devel
+%global pkgname_docbook_xsl docbook-style-xsl
+%global pkgname_gnutls_devel gnutls-devel
+%global pkgname_shadow_utils shadow-utils
+%global pkgname_procps procps-ng
+%global pkgname_glue_libs cluster-glue-libs
+%global pkgname_pcmk_libs %{name}-libs
+%global hacluster_id 189
+
## Distro-specific configuration choices
### Use 2.0-style output when other distro packages don't support current output
-%if 0%{?fedora}
+%if 0%{?fedora} || ( 0%{?rhel} && 0%{?rhel} <= 8 )
%global compat20 --enable-compat-2.0
%endif
@@ -130,6 +154,7 @@
%global resource_stickiness --with-resource-stickiness-default=1
%endif
+
# Python-related definitions
## Turn off auto-compilation of Python files outside Python specific paths,
@@ -145,13 +170,24 @@
sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g'; })
%endif
-## Values that differ by Python major version
+## Prefer Python 3 definitions explicitly, in case 2 is also available
+%if %{defined __python3}
%global python_name python3
-%global python_path %{?__python3}%{!?__python3:/usr/bin/python%{?python3_pkgversion}%{!?python3_pkgversion:3}}
+%global python_path %{__python3}
%define python_site %{?python3_sitelib}%{!?python3_sitelib:%(
%{python_path} -c 'from distutils.sysconfig import get_python_lib as gpl; print(gpl(1))' 2>/dev/null)}
-%global python_min 3.2
-# python_min still required?
+%else
+%if %{defined python_version}
+%global python_name python%(echo %{python_version} | cut -d'.' -f1)
+%define python_path %{?__python}%{!?__python:/usr/bin/%{python_name}}
+%else
+%global python_name python
+%global python_path %{?__python}%{!?__python:/usr/bin/python%{?python_pkgversion}}
+%endif
+%define python_site %{?python_sitelib}%{!?python_sitelib:%(
+ %{python_name} -c 'from distutils.sysconfig import get_python_lib as gpl; print(gpl(1))' 2>/dev/null)}
+%endif
+
# Keep sane profiling data if requested
%if %{with profiling}
@@ -167,23 +203,44 @@ Summary: Scalable High-Availability cluster resource manager
Version: %{pcmkversion}
Release: %{pcmk_release}%{?dist}
License: GPLv2+ and LGPLv2+
-Url: https://www.clusterlabs.org
-
-# Hint: use "spectool -s 0 pacemaker.spec" (rpmdevtools) to check the final URL
+Url: https://www.clusterlabs.org/
+
+# Example: https://codeload.github.com/ClusterLabs/pacemaker/tar.gz/e91769e
+# will download pacemaker-e91769e.tar.gz
+#
+# The ending part starting with '#' is ignored by github but necessary for
+# rpmbuild to know what the tar archive name is. (The downloaded file will be
+# named correctly only for commit IDs, not tagged releases.)
+#
+# You can use "spectool -s 0 pacemaker.spec" (rpmdevtools) to show final URL.
Source0: https://codeload.github.com/%{github_owner}/%{name}/tar.gz/%{archive_gith...
Source1: https://codeload.github.com/%{github_owner}/%{nagios_name}/tar.gz/%{nagio...
-# ---
+
+# upstream commits
+Patch1: 001-ping-agent.patch
+Patch2: 002-pacemakerd-options.patch
+Patch3: 003-pacemakerd-output.patch
+Patch4: 004-check-level.patch
+Patch5: 005-crm_resource.patch
+Patch6: 006-crm_simulate.patch
+Patch7: 007-unfencing-loop.patch
Requires: resource-agents
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cluster-libs%{?_isa} = %{version}-%{release}
Requires: %{name}-cli = %{version}-%{release}
%{?systemd_requires}
-# Pacemaker requires a minimum Python functionality
-Requires: %{python_name} >= %{python_min}
-BuildRequires: make
-BuildRequires: %{python_name}-devel >= %{python_min}
+%if %{defined centos}
+ExclusiveArch: aarch64 i686 ppc64le s390x x86_64 %{arm}
+%else
+%if 0%{?rhel}
+ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
+%endif
+%endif
+
+Requires: %{python_path}
+BuildRequires: %{python_name}-devel
# Pacemaker requires a minimum libqb functionality
Requires: libqb >= 0.17.0
@@ -192,37 +249,41 @@ BuildRequires: libqb-devel >= 0.17.0
# Required basic build tools
BuildRequires: coreutils findutils grep sed
BuildRequires: autoconf automake gcc make pkgconfig
-BuildRequires: libtool libtool-ltdl-devel
+BuildRequires: libtool %{?pkgname_libtool_devel}
# Required for core functionality
BuildRequires: pkgconfig(glib-2.0) >= 2.42
BuildRequires: libxml2-devel libxslt-devel libuuid-devel
-BuildRequires: bzip2-devel
+BuildRequires: %{pkgname_bzip2_devel}
# Enables optional functionality
-BuildRequires: ncurses-devel docbook-style-xsl
-BuildRequires: help2man gnutls-devel pam-devel pkgconfig(dbus-1)
+BuildRequires: ncurses-devel %{pkgname_docbook_xsl}
+BuildRequires: help2man %{pkgname_gnutls_devel} pam-devel pkgconfig(dbus-1)
BuildRequires: pkgconfig(systemd)
+# RH patches are created by git, so we need git to apply them
+BuildRequires: git
+
Requires: corosync >= 2.0.0
BuildRequires: corosync-devel >= 2.0.0
-#XXX
-#BuildRequires: pkgconfig(libcpg)
-#BuildRequires: pkgconfig(libcfg)
+
+%if %{with stonithd}
+BuildRequires: %{pkgname_glue_libs}-devel
+%endif
%if %{with doc}
BuildRequires: asciidoc inkscape %{python_name}-sphinx
%endif
-# git-style patch application
-#BuildRequires: git
-
Provides: pcmk-cluster-manager = %{version}-%{release}
Provides: pcmk-cluster-manager%{?_isa} = %{version}-%{release}
-# Pacemaker uses the crypto/md5 module from gnulib
+# Bundled bits
+## Pacemaker uses the crypto/md5-buffer module from gnulib
+%if 0%{?fedora} || 0%{?rhel}
Provides: bundled(gnulib)
+%endif
%description
Pacemaker is an advanced, scalable High-Availability cluster resource
@@ -236,18 +297,18 @@ when related resources fail and can be configured to periodically check
resource health.
Available rpmbuild rebuild options:
- --with(out) : cibsecrets coverage doc hardening pre_release profiling
+ --with(out) : cibsecrets coverage doc hardening pre_release profiling stonithd
%package cli
License: GPLv2+ and LGPLv2+
Summary: Command line tools for controlling Pacemaker clusters
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Recommends: pcmk-cluster-manager = %{version}-%{release}
# For crm_report
Recommends: tar
Recommends: bzip2
Requires: perl-TimeDate
-Requires: procps-ng
+Requires: %{pkgname_procps}
Requires: psmisc
Requires(post):coreutils
@@ -259,28 +320,29 @@ The %{name}-cli package contains command line tools that can be used
to query and control the cluster from machines that may, or may not,
be part of the cluster.
-%package libs
+%package -n %{pkgname_pcmk_libs}
License: GPLv2+ and LGPLv2+
Summary: Core Pacemaker libraries
-Requires(pre): shadow-utils
+Requires(pre): %{pkgname_shadow_utils}
Requires: %{name}-schemas = %{version}-%{release}
# sbd 1.4.0+ supports the libpe_status API for pe_working_set_t
# sbd 1.4.2+ supports startup/shutdown handshake via pacemakerd-api
# and handshake defaults to enabled for rhel builds
-# sbd 1.4.3+ handshake defaults to enabled for fedora builds
-Conflicts: sbd < 1.4.3
+# sbd 1.5.0+ handshake defaults to enabled with upstream sbd-release
+# implicitly supports handshake defaults to enabled in this spec
+Conflicts: sbd < 1.5.0
-%description libs
+%description -n %{pkgname_pcmk_libs}
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
-The %{name}-libs package contains shared libraries needed for cluster
+The %{pkgname_pcmk_libs} package contains shared libraries needed for cluster
nodes and those just running the CLI tools.
%package cluster-libs
License: GPLv2+ and LGPLv2+
Summary: Cluster Libraries used by Pacemaker
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
%description cluster-libs
Pacemaker is an advanced, scalable High-Availability cluster resource
@@ -292,7 +354,7 @@ libraries needed for nodes that will form part of the cluster nodes.
%package remote
License: GPLv2+ and LGPLv2+
Summary: Pacemaker remote executor daemon for non-cluster nodes
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cli = %{version}-%{release}
Requires: resource-agents
# -remote can be fully independent of systemd
@@ -308,35 +370,40 @@ The %{name}-remote package contains the Pacemaker Remote daemon
which is capable of extending pacemaker functionality to remote
nodes not running the full corosync/cluster stack.
-%package libs-devel
+%package -n %{pkgname_pcmk_libs}-devel
License: GPLv2+ and LGPLv2+
Summary: Pacemaker development package
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cluster-libs%{?_isa} = %{version}-%{release}
-Requires: libtool-ltdl-devel%{?_isa} libuuid-devel%{?_isa}
+Requires: %{?pkgname_libtool_devel_arch} libuuid-devel%{?_isa}
Requires: libxml2-devel%{?_isa} libxslt-devel%{?_isa}
-Requires: bzip2-devel%{?_isa} glib2-devel%{?_isa}
+Requires: %{pkgname_bzip2_devel}%{?_isa} glib2-devel%{?_isa}
Requires: libqb-devel%{?_isa}
Requires: corosync-devel%{?_isa} >= 2.0.0
-%description libs-devel
+%description -n %{pkgname_pcmk_libs}-devel
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
-The %{name}-libs-devel package contains headers and shared libraries
+The %{pkgname_pcmk_libs}-devel package contains headers and shared libraries
for developing tools for Pacemaker.
%package cts
License: GPLv2+ and LGPLv2+
Summary: Test framework for cluster-related technologies like Pacemaker
Requires: %{python_path}
-Requires: %{python_name} >= %{python_min}
-Requires: %{name}-libs = %{version}-%{release}
-Requires: procps-ng
+Requires: %{pkgname_pcmk_libs} = %{version}-%{release}
+Requires: %{name}-cli = %{version}-%{release}
+Requires: %{pkgname_procps}
Requires: psmisc
BuildArch: noarch
+# systemd Python bindings are a separate package in some distros
+%if %{defined systemd_requires}
+%if %{defined fedora} || %{defined rhel}
Requires: %{python_name}-systemd
+%endif
+%endif
%description cts
Test framework for cluster-related technologies like Pacemaker
@@ -382,7 +449,10 @@ The metadata files required for Pacemaker to execute the nagios plugin
monitor resources.
%prep
-%setup -q -a 1 -n %{name}-%{archive_version}
+%autosetup -a 1 -n %{name}-%{archive_version} -S git_am -p 1
+# in f33 s390x complains but shouldn't hurt globally
+# as configure.ac is checking for support
+sed -i configure.ac -e "s/-Wall/-Wall -Wno-format-truncation/"
%build
@@ -420,11 +490,10 @@ export LDFLAGS_HARDENED_LIB="%{?_hardening_ldflags}"
--with-initdir=%{_initrddir} \
--with-runstatedir=%{_rundir} \
--localstatedir=%{_var} \
- --with-version=%{version}-%{release} \
- --with-bug-url=https://bugz.fedoraproject.org/%{name} \
- --with-nagios \
- --with-nagios-metadata-dir=%{_datadir}/pacemaker/nagios/plugins-metadata/ \
- --with-nagios-plugin-dir=%{_libdir}/nagios/plugins/
+ --with-nagios \
+ --with-nagios-metadata-dir=%{_datadir}/pacemaker/nagios/plugins-metadata/ \
+ --with-nagios-plugin-dir=%{_libdir}/nagios/plugins/ \
+ --with-version=%{version}-%{release}
make %{_smp_mflags} V=1
@@ -453,11 +522,7 @@ done
mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/lib/rpm-state/%{name}
-# These are not actually scripts
-find %{buildroot} -name '*.xml' -type f -print0 | xargs -0 chmod a-x
-
-# Don't package static libs
-find %{buildroot} -name '*.a' -type f -print0 | xargs -0 rm -f
+# Don't package libtool archives
find %{buildroot} -name '*.la' -type f -print0 | xargs -0 rm -f
# Do not package these either
@@ -475,7 +540,7 @@ rm -f %{buildroot}/%{_initrddir}/pacemaker
rm -f %{buildroot}/%{_initrddir}/pacemaker_remote
# Byte-compile Python sources where suitable and the distro procedures known
-%if %{defined py_byte_compile} && %{defined python_path}
+%if %{defined py_byte_compile}
%{py_byte_compile %{python_path} %{buildroot}%{_datadir}/pacemaker/tests}
%if !%{defined _python_bytecompile_extra}
%{py_byte_compile %{python_path} %{buildroot}%{python_site}/cts}
@@ -552,15 +617,14 @@ fi
%postun cli
%systemd_postun_with_restart crm_mon.service
-%pre libs
-# XXX keep an eye on https://fedoraproject.org/wiki/Changes/SystemdSysusers
-# reopened recently:
-# https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.o...
+%pre -n %{pkgname_pcmk_libs}
+# @TODO Use sysusers.d:
+# https://fedoraproject.org/wiki/Changes/Adopting_sysusers.d_format
getent group %{gname} >/dev/null || groupadd -r %{gname} -g %{hacluster_id}
getent passwd %{uname} >/dev/null || useradd -r -g %{gname} -u %{hacluster_id} -s /sbin/nologin -c "cluster user" %{uname}
exit 0
-%ldconfig_scriptlets libs
+%ldconfig_scriptlets -n %{pkgname_pcmk_libs}
%ldconfig_scriptlets cluster-libs
%files
@@ -667,7 +731,7 @@ exit 0
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker/bundles
-%files libs
+%files -n %{pkgname_pcmk_libs}
%{_libdir}/libcib.so.*
%{_libdir}/liblrmd.so.*
%{_libdir}/libcrmservice.so.*
@@ -716,7 +780,7 @@ exit 0
%doc COPYING
%doc ChangeLog
-%files libs-devel
+%files -n %{pkgname_pcmk_libs}-devel
%{_includedir}/pacemaker
%{_libdir}/*.so
%if %{with coverage}
@@ -742,7 +806,24 @@ exit 0
%license %{nagios_name}-%{nagios_hash}/COPYING
%changelog
-* Tue Jun 1 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-0.3.rc2
+* Mon Jul 5 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-6
+- synced/merged with CS9 spec-file for current 2.1.0-release build
+
+* Tue Jun 8 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-0.5.rc3
+- silence f33 s390x build complaining about possible format-trucation
+
+* Mon Jun 07 2021 Python Maint <python-maint(a)redhat.com> - 2.1.0-0.4.rc3.1
+- Rebuilt for Python 3.10
+
+* Mon Jun 07 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-0.4.rc3
+- Update for new upstream tarball for release candidate: Pacemaker-2.1.0-rc3,
+ for full details, see included ChangeLog file or
+ https://github.com/ClusterLabs/pacemaker/releases/tag/Pacemaker-2.1.0-rc3
+
+* Fri Jun 04 2021 Python Maint <python-maint(a)redhat.com> - 2.1.0-0.3.rc2.1
+- Rebuilt for Python 3.10
+
+* Mon May 31 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-0.3.rc2
- Update for new upstream tarball for release candidate: Pacemaker-2.1.0-rc2,
for full details, see included ChangeLog file or
https://github.com/ClusterLabs/pacemaker/releases/tag/Pacemaker-2.1.0-rc2
diff --git a/sources b/sources
index 76e3c9a..2ab7f32 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
SHA512 (nagios-agents-metadata-105ab8a7b2c16b9a29cf1c1596b80136eeef332b.tar.gz) = 11ddeb48a4929e7642b6dfa9c7962aa1d7a1af1c569830f55ed6cd6773abac13377317327bc1db8411c8077884f83f81cc54d746c834b63a99fa6dc219b5caad
-SHA512 (pacemaker-Pacemaker-2.1.0-rc2.tar.gz) = 01396cd23b0cb49cab40b870e227b132f1e0c9b94cf6ac29d58e61bd3ff4ee4ea95fa6509c9a4a09179284b8fdbdba8319ceb46e8f94ce9cea92cf13832f9f4d
+SHA512 (pacemaker-7c3f66070.tar.gz) = e1c53d019c965395affc1bd78358927617c9bc8572c405ee884737a8213455c5e85102e6f58bb5239ab23ebe5aa794f72c9cc0746900b7a6cc14fd3cf1879064
2 years, 9 months
[Report] Packages Restricting Arches
by root
New package excluding arches (1)
============================
- pacemaker
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64 %{arm}
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
List of packages currently excluding arches (2157)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- GoldenCheetah
ExclusiveArch: %{qt5_qtwebengine_arches}
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- OpenImageIO
ExclusiveArch: x86_64 ppc64le
- OpenMolcas
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- R-V8
ExclusiveArch: %{nodejs_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- RediSearch
ExclusiveArch: x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aboot
ExclusiveArch: alpha
- accel-config
ExclusiveArch: %{ix86} x86_64
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- algobox
ExclusiveArch: %{qt5_qtwebengine_arches}
- alleyoop
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x %{arm} aarch64
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64
- anet
ExclusiveArch: %{GPRbuild_arches}
- anki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: %{ldc_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- aunit
ExclusiveArch: %GPRbuild_arches
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
- bcm283x-firmware
ExclusiveArch: %{arm} aarch64
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- blender
ExclusiveArch: x86_64 aarch64 ppc64le
- bless
ExclusiveArch: %mono_arches
- bpftrace
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- calamares
ExclusiveArch: %{ix86} x86_64
- calibre
ExclusiveArch: %{qt5_qtwebengine_arches}
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- ceph
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- chromium
ExclusiveArch: x86_64 i686
ExclusiveArch: x86_64 i686 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- clevis-pin-tpm2
ExclusiveArch: %{rust_arches}
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- coffee-script
ExclusiveArch: %{nodejs_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- cpu-x
ExclusiveArch: i686 x86_64
- cpufetch
ExclusiveArch: %{arm} aarch64 x86_64
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- crash-gcore-command
ExclusiveArch: aarch64 ppc64le x86_64
- crash-trace-command
ExclusiveArch: aarch64 ppc64le s390x x86_64
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- cryptlib
ExclusiveArch: x86_64 %{ix86} aarch64 ppc64 ppc64le
- cryptobone
ExclusiveArch: x86_64 %{ix86} ppc64 ppc64le aarch64
- daq
ExclusiveArch: x86_64 aarch64
- darktable
ExclusiveArch: x86_64 aarch64
ExclusiveArch: x86_64 ppc64le
- dbus-parsec
ExclusiveArch: %{rust_arches}
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- dbxtool
ExclusiveArch: i386 x86_64 aarch64
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-desktop-schemas
ExclusiveArch: %{go_arches}
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- dmtcp
ExclusiveArch: x86_64 aarch64
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- dolphin-emu
ExclusiveArch: x86_64 aarch64
- dotnet-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet3.1
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- doublecmd
ExclusiveArch: %{ix86} x86_64
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
- e3
ExclusiveArch: %{ix86} x86_64
- edk2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efifs
ExclusiveArch: %{efi}
- efitools
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- emacs-slime
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- enki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- eric
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- eth-tools
ExclusiveArch: x86_64
- extlinux-bootloader
ExclusiveArch: %{arm} aarch64
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- fes
ExclusiveArch: %{ix86} x86_64
- fkill-cli
ExclusiveArch: %{nodejs_arches} noarch
- florist
ExclusiveArch: %{GPRbuild_arches}
- fpc
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
- frescobaldi
ExclusiveArch: %{qt5_qtwebengine_arches}
- frysk
ExclusiveArch: %{ix86} x86_64 ppc64
- fwts
ExclusiveArch: x86_64 %{arm} aarch64 s390x riscv64 %{power64}
- fwupd-efi
ExclusiveArch: x86_64 aarch64
- fx
ExclusiveArch: %{nodejs_arches} noarch
- ga
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- gbrainy
ExclusiveArch: %mono_arches
- gdata-sharp
ExclusiveArch: %mono_arches
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gearhead1
ExclusiveArch: %{fpc_arches}
- gela-asis
ExclusiveArch: %GPRbuild_arches
- ghdl
ExclusiveArch: %{GNAT_arches}
- ghostwriter
ExclusiveArch: %{qt5_qtwebengine_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- gitqlient
ExclusiveArch: %{qt5_qtwebengine_arches}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- glibc32
ExclusiveArch: x86_64
- glibd
ExclusiveArch: %{ldc_arches}
- gmqcc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- gnatcoll
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-bindings
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-db
ExclusiveArch: %{GPRbuild_arches}
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- go-compilers
ExclusiveArch: %{go_arches}
- go-rpm-macros
ExclusiveArch: %{golang_arches} %{gccgo_arches}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang
ExclusiveArch: %{golang_arches}
- gomtree
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- goverlay
ExclusiveArch: %{fpc_arches}
- gprbuild
ExclusiveArch: %{GPRbuild_arches} %{bootstrap_arch}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha
- grafana
ExclusiveArch: %{grafana_arches}
- grafana-pcp
ExclusiveArch: %{grafanapcp_arches}
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- gudev-sharp
ExclusiveArch: %mono_arches
- guestfs-tools
ExclusiveArch: %{kernel_arches}
- hedgewars
ExclusiveArch: %{fpc_arches}
- hsakmt
ExclusiveArch: x86_64 aarch64
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64
- i3status-rs
ExclusiveArch: %{rust_arches}
- icaro
ExclusiveArch: %{ix86} x86_64 noarch
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-gmmlib
ExclusiveArch: x86_64 i686
- intel-ipp-crypto-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-ipsec-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-mediasdk
ExclusiveArch: x86_64
- intel-undervolt
ExclusiveArch: i386 x86_64
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ipw2100-firmware
ExclusiveArch: noarch i386 x86_64
- ipw2200-firmware
ExclusiveArch: noarch i386 x86_64
- ispc
ExclusiveArch: x86_64 aarch64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- iyfct
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- kchmviewer
ExclusiveArch: %{qt5_qtwebengine_arches}
- keepass
ExclusiveArch: %{mono_arches}
- kernel
ExclusiveArch: x86_64 s390x %{arm} aarch64 ppc64le
ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le
- keyring-ima-signer
ExclusiveArch: %{rust_arches}
- kf5-akonadi-search
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-audiocd-kio
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kalarmcal
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kblog
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarcore
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarutils
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kitinerary
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-ktnef
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-libkdcraw
ExclusiveArch: x86_64 ppc64le %{arm}
- kicad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- kiwix-desktop
ExclusiveArch: %{qt5_qtwebengine_arches}
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- knotes
ExclusiveArch: x86_64 %{arm}
- kompose
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 s390x
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- lazarus
ExclusiveArch: %{fpc_arches}
- lazpaint
ExclusiveArch: %{fpc_arches}
- ldc
ExclusiveArch: %{ldc_arches}
- libbsr
ExclusiveArch: %{power64}
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdfp
ExclusiveArch: ppc ppc64 ppc64le s390 s390x x86_64
- libdispatch
ExclusiveArch: x86_64 aarch64
- libguestfs
ExclusiveArch: %{kernel_arches}
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libnxz
ExclusiveArch: ppc64le
- libocxl
ExclusiveArch: ppc64le
- libpmemobj-cpp
ExclusiveArch: x86_64
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- libretro-desmume2015
ExclusiveArch: i686 x86_64
- librtas
ExclusiveArch: %{power64}
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} s390x %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvma
ExclusiveArch: x86_64 ppc64le ppc64 aarch64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzfcphbaapi
ExclusiveArch: s390 s390x
- lightdm
ExclusiveArch: x86_64 ppc64le
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 s390x ppc64le
- luxcorerender
ExclusiveArch: x86_64
- mactel-boot
ExclusiveArch: x86_64
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- mantle
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mbpfan
ExclusiveArch: x86_64
- mcelog
ExclusiveArch: i686 x86_64
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- memtest86+
ExclusiveArch: %{ix86} x86_64
- mesos
ExclusiveArch: x86_64
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} %{ix86} x86_64
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-libidn2
ExclusiveArch: %{ix86} x86_64 %{arm}
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mirrorlist-server
ExclusiveArch: %{rust_arches}
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- mod_mono
ExclusiveArch: %mono_arches
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64 %{arm}
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monobristol
ExclusiveArch: %{mono_arches}
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- monosim
ExclusiveArch: %mono_arches
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- msr-tools
ExclusiveArch: %{ix86} x86_64
- mustache-d
ExclusiveArch: %{ldc_arches}
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- nant
ExclusiveArch: %mono_arches
- nativejit
ExclusiveArch: x86_64
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- newsflash
ExclusiveArch: %{rust_arches}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nispor
ExclusiveArch: %{rust_arches}
- nodejs
ExclusiveArch: %{nodejs_arches}
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nodemon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supervisor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-svgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- npm-name-cli
ExclusiveArch: %{nodejs_arches} noarch
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: x86_64 ppc64le
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64 ppc64le
- nwchem
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- obs-service-rust2rpm
ExclusiveArch: %{rust_arches} noarch
- oci-kvm-hook
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- oci-seccomp-bpf-hook
ExclusiveArch: x86_64 %%{power64} aarch64 s390x armv7hl
- oci-umount
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- oidn
ExclusiveArch: x86_64
- olpc-kbdshim
ExclusiveArch: %{ix86} %{arm}
- olpc-netutils
ExclusiveArch: %{ix86} %{arm}
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- onednn
ExclusiveArch: x86_64 aarch64 ppc64le
- onedrive
ExclusiveArch: %{ldc_arches}
- opae
ExclusiveArch: x86_64
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 aarch64
- openblas
ExclusiveArch: %{openblas_arches}
- openjfx
ExclusiveArch: x86_64
- openjfx8
ExclusiveArch: x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openshadinglanguage
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- openssl-ibmca
ExclusiveArch: s390 s390x
- origin
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- orion
ExclusiveArch: %{qt5_qtwebengine_arches}
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- pacemaker
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64 %{arm}
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- paflib
ExclusiveArch: ppc %{power64}
- parsec
ExclusiveArch: %{rust_arches}
- parsec-tool
ExclusiveArch: %{rust_arches}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcm
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdbg
ExclusiveArch: ppc64le
- pdfmod
ExclusiveArch: %mono_arches
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: x86_64
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- playonlinux
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- pmdk-convert
ExclusiveArch: x86_64
- pmemkv
ExclusiveArch: x86_64
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- pveclib
ExclusiveArch: ppc %{power64}
- pvs-sbcl
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- pyqtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- python-cryptography
ExclusiveArch: %{rust_arches}
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-healpy
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-javabridge
ExclusiveArch: i686 x86_64
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-rpi-gpio
ExclusiveArch: %{arm} aarch64
- python-setuptools-rust
ExclusiveArch: %{rust_arches}
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qemu-sanity-check
ExclusiveArch: %{kernel_arches}
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- quantum-espresso
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- renderdoc
ExclusiveArch: x86_64
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm}
- rescene
ExclusiveArch: %{mono_arches}
- restsharp
ExclusiveArch: %{mono_arches}
- rhythmbox-alternative-toolbar
ExclusiveArch: %{ix86} %{arm} x86_64 ppc64 ppc64le
- rocm-runtime
ExclusiveArch: x86_64 aarch64
- rocminfo
ExclusiveArch: x86_64 aarch64
- rpg-cli
ExclusiveArch: %{rust_arches}
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rr
ExclusiveArch: %{ix86} x86_64
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- rubygem-childprocess
ExclusiveArch: %{ix86} x86_64 noarch
- runc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le %{mips} s390x
- rust
ExclusiveArch: %{rust_arches}
- rust-Inflector
ExclusiveArch: %{rust_arches}
- rust-ab_glyph_rasterizer
ExclusiveArch: %{rust_arches}
- rust-abomonation
ExclusiveArch: %{rust_arches}
- rust-actix
ExclusiveArch: %{rust_arches}
- rust-actix-codec
ExclusiveArch: %{rust_arches}
- rust-actix-connect
ExclusiveArch: %{rust_arches}
- rust-actix-files
ExclusiveArch: %{rust_arches}
- rust-actix-http
ExclusiveArch: %{rust_arches}
- rust-actix-macros
ExclusiveArch: %{rust_arches}
- rust-actix-macros0.1
ExclusiveArch: %{rust_arches}
- rust-actix-router
ExclusiveArch: %{rust_arches}
- rust-actix-rt
ExclusiveArch: %{rust_arches}
- rust-actix-rt1
ExclusiveArch: %{rust_arches}
- rust-actix-server
ExclusiveArch: %{rust_arches}
- rust-actix-server-config
ExclusiveArch: %{rust_arches}
- rust-actix-service
ExclusiveArch: %{rust_arches}
- rust-actix-testing
ExclusiveArch: %{rust_arches}
- rust-actix-threadpool
ExclusiveArch: %{rust_arches}
- rust-actix-tls
ExclusiveArch: %{rust_arches}
- rust-actix-utils
ExclusiveArch: %{rust_arches}
- rust-actix-web
ExclusiveArch: %{rust_arches}
- rust-actix-web-codegen
ExclusiveArch: %{rust_arches}
- rust-actix0.10
ExclusiveArch: %{rust_arches}
- rust-actix_derive
ExclusiveArch: %{rust_arches}
- rust-actix_derive0.5
ExclusiveArch: %{rust_arches}
- rust-addr2line
ExclusiveArch: %{rust_arches}
- rust-adler
ExclusiveArch: %{rust_arches}
- rust-adler32
ExclusiveArch: %{rust_arches}
- rust-aead
ExclusiveArch: %{rust_arches}
- rust-aes
ExclusiveArch: %{rust_arches}
- rust-aes-gcm
ExclusiveArch: %{rust_arches}
- rust-aes-soft
ExclusiveArch: %{rust_arches}
- rust-afterburn
ExclusiveArch: %{rust_arches}
- rust-ahash
ExclusiveArch: %{rust_arches}
- rust-ahash0.4
ExclusiveArch: %{rust_arches}
- rust-aho-corasick
ExclusiveArch: %{rust_arches}
- rust-alacritty
ExclusiveArch: %{rust_arches}
- rust-alacritty_config_derive
ExclusiveArch: %{rust_arches}
- rust-alacritty_terminal
ExclusiveArch: %{rust_arches}
- rust-alga
ExclusiveArch: %{rust_arches}
- rust-alga_derive
ExclusiveArch: %{rust_arches}
- rust-alloc-no-stdlib
ExclusiveArch: %{rust_arches}
- rust-alloc-stdlib
ExclusiveArch: %{rust_arches}
- rust-alphanumeric-sort
ExclusiveArch: %{rust_arches}
- rust-ambient-authority
ExclusiveArch: %{rust_arches}
- rust-ammonia
ExclusiveArch: %{rust_arches}
- rust-ansi_colours
ExclusiveArch: %{rust_arches}
- rust-ansi_term
ExclusiveArch: %{rust_arches}
- rust-ansi_term0.11
ExclusiveArch: %{rust_arches}
- rust-antidote
ExclusiveArch: %{rust_arches}
- rust-anyhow
ExclusiveArch: %{rust_arches}
- rust-anymap
ExclusiveArch: %{rust_arches}
- rust-aom-sys
ExclusiveArch: %{rust_arches}
- rust-app_dirs
ExclusiveArch: %{rust_arches}
- rust-approx
ExclusiveArch: %{rust_arches}
- rust-ar
ExclusiveArch: %{rust_arches}
- rust-arbitrary
ExclusiveArch: %{rust_arches}
- rust-arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-arc-swap
ExclusiveArch: %{rust_arches}
- rust-arg_enum_proc_macro
ExclusiveArch: %{rust_arches}
- rust-argparse
ExclusiveArch: %{rust_arches}
- rust-array-init
ExclusiveArch: %{rust_arches}
- rust-arraydeque
ExclusiveArch: %{rust_arches}
- rust-arrayref
ExclusiveArch: %{rust_arches}
- rust-arrayvec
ExclusiveArch: %{rust_arches}
- rust-article_scraper
ExclusiveArch: %{rust_arches}
- rust-ascii
ExclusiveArch: %{rust_arches}
- rust-ascii-canvas
ExclusiveArch: %{rust_arches}
- rust-askalono
ExclusiveArch: %{rust_arches}
- rust-askalono-cli
ExclusiveArch: %{rust_arches}
- rust-askama
ExclusiveArch: %{rust_arches}
- rust-askama_derive
ExclusiveArch: %{rust_arches}
- rust-askama_escape
ExclusiveArch: %{rust_arches}
- rust-askama_shared
ExclusiveArch: %{rust_arches}
- rust-asn1
ExclusiveArch: %{rust_arches}
- rust-asn1_derive
ExclusiveArch: %{rust_arches}
- rust-assert-json-diff
ExclusiveArch: %{rust_arches}
- rust-assert_approx_eq
ExclusiveArch: %{rust_arches}
- rust-assert_cli
ExclusiveArch: %{rust_arches}
- rust-assert_cmd
ExclusiveArch: %{rust_arches}
- rust-assert_fs
ExclusiveArch: %{rust_arches}
- rust-assert_matches
ExclusiveArch: %{rust_arches}
- rust-assign
ExclusiveArch: %{rust_arches}
- rust-async-attributes
ExclusiveArch: %{rust_arches}
- rust-async-channel
ExclusiveArch: %{rust_arches}
- rust-async-compression
ExclusiveArch: %{rust_arches}
- rust-async-executor
ExclusiveArch: %{rust_arches}
- rust-async-global-executor
ExclusiveArch: %{rust_arches}
- rust-async-io
ExclusiveArch: %{rust_arches}
- rust-async-lock
ExclusiveArch: %{rust_arches}
- rust-async-mutex
ExclusiveArch: %{rust_arches}
- rust-async-process
ExclusiveArch: %{rust_arches}
- rust-async-std
ExclusiveArch: %{rust_arches}
- rust-async-stream
ExclusiveArch: %{rust_arches}
- rust-async-stream-impl
ExclusiveArch: %{rust_arches}
- rust-async-task
ExclusiveArch: %{rust_arches}
- rust-async-trait
ExclusiveArch: %{rust_arches}
- rust-asyncgit
ExclusiveArch: %{rust_arches}
- rust-atk
ExclusiveArch: %{rust_arches}
- rust-atk-sys
ExclusiveArch: %{rust_arches}
- rust-atom
ExclusiveArch: %{rust_arches}
- rust-atomic-waker
ExclusiveArch: %{rust_arches}
- rust-atomicwrites
ExclusiveArch: %{rust_arches}
- rust-attohttpc
ExclusiveArch: %{rust_arches}
- rust-atty
ExclusiveArch: %{rust_arches}
- rust-autocfg
ExclusiveArch: %{rust_arches}
- rust-av-metrics
ExclusiveArch: %{rust_arches}
- rust-average
ExclusiveArch: %{rust_arches}
- rust-awc
ExclusiveArch: %{rust_arches}
- rust-az
ExclusiveArch: %{rust_arches}
- rust-backtrace
ExclusiveArch: %{rust_arches}
- rust-backtrace-sys
ExclusiveArch: %{rust_arches}
- rust-base100
ExclusiveArch: %{rust_arches}
- rust-base64
ExclusiveArch: %{rust_arches}
- rust-base64-0.10
ExclusiveArch: %{rust_arches}
- rust-base64-0.11
ExclusiveArch: %{rust_arches}
- rust-base64_0.12
ExclusiveArch: %{rust_arches}
- rust-bat
ExclusiveArch: %{rust_arches}
- rust-battery
ExclusiveArch: %{rust_arches}
- rust-beef
ExclusiveArch: %{rust_arches}
- rust-below
ExclusiveArch: %{rust_arches}
- rust-below-common
ExclusiveArch: %{rust_arches}
- rust-below-dump
ExclusiveArch: %{rust_arches}
- rust-below-model
ExclusiveArch: %{rust_arches}
- rust-below-render
ExclusiveArch: %{rust_arches}
- rust-below-store
ExclusiveArch: %{rust_arches}
- rust-below-view
ExclusiveArch: %{rust_arches}
- rust-below_derive
ExclusiveArch: %{rust_arches}
- rust-bencher
ExclusiveArch: %{rust_arches}
- rust-better-panic
ExclusiveArch: %{rust_arches}
- rust-bincode
ExclusiveArch: %{rust_arches}
- rust-bincode0.8
ExclusiveArch: %{rust_arches}
- rust-bindgen
ExclusiveArch: %{rust_arches}
- rust-binfarce
ExclusiveArch: %{rust_arches}
- rust-biscuit
ExclusiveArch: %{rust_arches}
- rust-bit-set
ExclusiveArch: %{rust_arches}
- rust-bit-vec
ExclusiveArch: %{rust_arches}
- rust-bitfield
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bitmaps
ExclusiveArch: %{rust_arches}
- rust-bitstream-io
ExclusiveArch: %{rust_arches}
- rust-bitvec
ExclusiveArch: %{rust_arches}
- rust-blake2
ExclusiveArch: %{rust_arches}
- rust-blobby
ExclusiveArch: %{rust_arches}
- rust-blobby0.1
ExclusiveArch: %{rust_arches}
- rust-block-buffer
ExclusiveArch: %{rust_arches}
- rust-block-buffer0.7
ExclusiveArch: %{rust_arches}
- rust-block-modes
ExclusiveArch: %{rust_arches}
- rust-block-padding
ExclusiveArch: %{rust_arches}
- rust-blocking
ExclusiveArch: %{rust_arches}
- rust-blsctl
ExclusiveArch: %{rust_arches}
- rust-bodhi
ExclusiveArch: %{rust_arches}
- rust-bodhi-cli
ExclusiveArch: %{rust_arches}
- rust-bootupd
ExclusiveArch: x86_64 aarch64
- rust-box_drawing
ExclusiveArch: %{rust_arches}
- rust-boxfnonce
ExclusiveArch: %{rust_arches}
- rust-brev
ExclusiveArch: %{rust_arches}
- rust-brotli
ExclusiveArch: %{rust_arches}
- rust-brotli-decompressor
ExclusiveArch: %{rust_arches}
- rust-brotli-sys
ExclusiveArch: %{rust_arches}
- rust-brotli2
ExclusiveArch: %{rust_arches}
- rust-bstr
ExclusiveArch: %{rust_arches}
- rust-buf-min
ExclusiveArch: %{rust_arches}
- rust-buf_redux
ExclusiveArch: %{rust_arches}
- rust-buffered-reader
ExclusiveArch: %{rust_arches}
- rust-bufsize
ExclusiveArch: %{rust_arches}
- rust-bufstream
ExclusiveArch: %{rust_arches}
- rust-build-env
ExclusiveArch: %{rust_arches}
- rust-build_const
ExclusiveArch: %{rust_arches}
- rust-bumpalo
ExclusiveArch: %{rust_arches}
- rust-byte-tools
ExclusiveArch: %{rust_arches}
- rust-byte-unit
ExclusiveArch: %{rust_arches}
- rust-byte-unit3
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-bytelines
ExclusiveArch: %{rust_arches}
- rust-bytemuck
ExclusiveArch: %{rust_arches}
- rust-bytemuck_derive
ExclusiveArch: %{rust_arches}
- rust-byteorder
ExclusiveArch: %{rust_arches}
- rust-bytes
ExclusiveArch: %{rust_arches}
- rust-bytes0.4
ExclusiveArch: %{rust_arches}
- rust-bytes0.5
ExclusiveArch: %{rust_arches}
- rust-bytes0.6
ExclusiveArch: %{rust_arches}
- rust-bytesize
ExclusiveArch: %{rust_arches}
- rust-bytestring
ExclusiveArch: %{rust_arches}
- rust-bzip2
ExclusiveArch: %{rust_arches}
- rust-bzip2-sys
ExclusiveArch: %{rust_arches}
- rust-c_vec
ExclusiveArch: %{rust_arches}
- rust-cache-padded
ExclusiveArch: %{rust_arches}
- rust-cairo-rs
ExclusiveArch: %{rust_arches}
- rust-cairo-sys-rs
ExclusiveArch: %{rust_arches}
- rust-calloop
ExclusiveArch: %{rust_arches}
- rust-cap-primitives
ExclusiveArch: %{rust_arches}
- rust-cap-rand
ExclusiveArch: %{rust_arches}
- rust-cap-std
ExclusiveArch: %{rust_arches}
- rust-capnp
ExclusiveArch: %{rust_arches}
- rust-capnp-futures
ExclusiveArch: %{rust_arches}
- rust-capnp-rpc
ExclusiveArch: %{rust_arches}
- rust-caps
ExclusiveArch: %{rust_arches}
- rust-cargo
ExclusiveArch: %{rust_arches}
- rust-cargo-bloat
ExclusiveArch: %{rust_arches}
- rust-cargo-c
ExclusiveArch: %{rust_arches}
- rust-cargo-husky
ExclusiveArch: %{rust_arches}
- rust-cargo-insta
ExclusiveArch: %{rust_arches}
- rust-cargo-platform
ExclusiveArch: %{rust_arches}
- rust-cargo-readme
ExclusiveArch: %{rust_arches}
- rust-cargo_metadata
ExclusiveArch: %{rust_arches}
- rust-case
ExclusiveArch: %{rust_arches}
- rust-cassowary
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cbindgen
ExclusiveArch: %{rust_arches}
- rust-cc
ExclusiveArch: %{rust_arches}
- rust-cedarwood
ExclusiveArch: %{rust_arches}
- rust-cexpr
ExclusiveArch: %{rust_arches}
- rust-cfg-if
ExclusiveArch: %{rust_arches}
- rust-cfg-if0.1
ExclusiveArch: %{rust_arches}
- rust-cgmath
ExclusiveArch: %{rust_arches}
- rust-cgroupfs
ExclusiveArch: %{rust_arches}
- rust-chainerror
ExclusiveArch: %{rust_arches}
- rust-charset
ExclusiveArch: %{rust_arches}
- rust-chbs
ExclusiveArch: %{rust_arches}
- rust-checked_int_cast
ExclusiveArch: %{rust_arches}
- rust-chlorine
ExclusiveArch: %{rust_arches}
- rust-choosier
ExclusiveArch: %{rust_arches}
- rust-chrono
ExclusiveArch: %{rust_arches}
- rust-chrono-humanize
ExclusiveArch: %{rust_arches}
- rust-chrono-tz
ExclusiveArch: %{rust_arches}
- rust-chunked_transfer
ExclusiveArch: %{rust_arches}
- rust-cipher
ExclusiveArch: %{rust_arches}
- rust-clang-ast
ExclusiveArch: %{rust_arches}
- rust-clang-sys
ExclusiveArch: %{rust_arches}
- rust-clap
ExclusiveArch: %{rust_arches}
- rust-clap2
ExclusiveArch: %{rust_arches}
- rust-clap_derive
ExclusiveArch: %{rust_arches}
- rust-clicolors-control
ExclusiveArch: %{rust_arches}
- rust-clipboard
ExclusiveArch: %{rust_arches}
- rust-cloudflare-zlib
ExclusiveArch: x86_64 aarch64
- rust-cloudflare-zlib-sys
ExclusiveArch: x86_64 aarch64
- rust-cmake
ExclusiveArch: %{rust_arches}
- rust-codespan-reporting
ExclusiveArch: %{rust_arches}
- rust-codicon
ExclusiveArch: %{rust_arches}
- rust-color-backtrace
ExclusiveArch: %{rust_arches}
- rust-color_quant
ExclusiveArch: %{rust_arches}
- rust-colored
ExclusiveArch: %{rust_arches}
- rust-colored1
ExclusiveArch: %{rust_arches}
- rust-colored_json
ExclusiveArch: %{rust_arches}
- rust-colorful
ExclusiveArch: %{rust_arches}
- rust-compiletest_rs
ExclusiveArch: %{rust_arches}
- rust-comrak
ExclusiveArch: %{rust_arches}
- rust-concurrent-queue
ExclusiveArch: %{rust_arches}
- rust-config
ExclusiveArch: %{rust_arches}
- rust-configparser
ExclusiveArch: %{rust_arches}
- rust-confy
ExclusiveArch: %{rust_arches}
- rust-console
ExclusiveArch: %{rust_arches}
- rust-console0.11
ExclusiveArch: %{rust_arches}
- rust-console0.12
ExclusiveArch: %{rust_arches}
- rust-console0.13
ExclusiveArch: %{rust_arches}
- rust-console0.9
ExclusiveArch: %{rust_arches}
- rust-console_error_panic_hook
ExclusiveArch: %{rust_arches}
- rust-const-cstr
ExclusiveArch: %{rust_arches}
- rust-const-random
ExclusiveArch: %{rust_arches}
- rust-const-random-macro
ExclusiveArch: %{rust_arches}
- rust-const_fn
ExclusiveArch: %{rust_arches}
- rust-constant_time_eq
ExclusiveArch: %{rust_arches}
- rust-content_inspector
ExclusiveArch: %{rust_arches}
- rust-conv
ExclusiveArch: %{rust_arches}
- rust-convert_case
ExclusiveArch: %{rust_arches}
- rust-cookie
ExclusiveArch: %{rust_arches}
- rust-cookie_store
ExclusiveArch: %{rust_arches}
- rust-copydeps
ExclusiveArch: %{rust_arches}
- rust-copyless
ExclusiveArch: %{rust_arches}
- rust-copypasta
ExclusiveArch: %{rust_arches}
- rust-cordic
ExclusiveArch: %{rust_arches}
- rust-coreos-installer
ExclusiveArch: %{rust_arches}
- rust-counted-array
ExclusiveArch: %{rust_arches}
- rust-cpio
ExclusiveArch: %{rust_arches}
- rust-cpp_demangle
ExclusiveArch: %{rust_arches}
- rust-cpuid-bool
ExclusiveArch: %{rust_arches}
- rust-cpython
ExclusiveArch: %{rust_arches}
- rust-cranelift-bforest
ExclusiveArch: %{rust_arches}
- rust-cranelift-codegen
ExclusiveArch: %{rust_arches}
- rust-cranelift-codegen-meta
ExclusiveArch: %{rust_arches}
- rust-cranelift-codegen-shared
ExclusiveArch: %{rust_arches}
- rust-cranelift-entity
ExclusiveArch: %{rust_arches}
- rust-cranelift-frontend
ExclusiveArch: %{rust_arches}
- rust-cranelift-native
ExclusiveArch: %{rust_arches}
- rust-cranelift-wasm
ExclusiveArch: %{rust_arches}
- rust-crates-io
ExclusiveArch: %{rust_arches}
- rust-crc
ExclusiveArch: %{rust_arches}
- rust-crc-any
ExclusiveArch: %{rust_arches}
- rust-crc-core
ExclusiveArch: %{rust_arches}
- rust-crc32fast
ExclusiveArch: %{rust_arches}
- rust-criterion
ExclusiveArch: %{rust_arches}
- rust-criterion-plot
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel0.4
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch0.8
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue0.2
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam0.7
ExclusiveArch: %{rust_arches}
- rust-crossfont
ExclusiveArch: %{rust_arches}
- rust-crossterm
ExclusiveArch: %{rust_arches}
- rust-crossterm0.17
ExclusiveArch: %{rust_arches}
- rust-crossterm0.18
ExclusiveArch: %{rust_arches}
- rust-crosstermion
ExclusiveArch: %{rust_arches}
- rust-crunchy
ExclusiveArch: %{rust_arches}
- rust-crypto-hash
ExclusiveArch: %{rust_arches}
- rust-crypto-mac
ExclusiveArch: %{rust_arches}
- rust-crypto-mac0.8
ExclusiveArch: %{rust_arches}
- rust-cryptoki
ExclusiveArch: %{rust_arches}
- rust-cryptoki-sys
ExclusiveArch: %{rust_arches}
- rust-cryptovec
ExclusiveArch: %{rust_arches}
- rust-cssparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-cstr-argument
ExclusiveArch: %{rust_arches}
- rust-csv
ExclusiveArch: %{rust_arches}
- rust-csv-core
ExclusiveArch: %{rust_arches}
- rust-ct-logs
ExclusiveArch: %{rust_arches}
- rust-ctor
ExclusiveArch: %{rust_arches}
- rust-ctr
ExclusiveArch: %{rust_arches}
- rust-ctrlc
ExclusiveArch: %{rust_arches}
- rust-cty
ExclusiveArch: %{rust_arches}
- rust-curl
ExclusiveArch: %{rust_arches}
- rust-curl-sys
ExclusiveArch: %{rust_arches}
- rust-cursive
ExclusiveArch: %{rust_arches}
- rust-cursive_buffered_backend
ExclusiveArch: %{rust_arches}
- rust-cursive_core
ExclusiveArch: %{rust_arches}
- rust-custom_derive
ExclusiveArch: %{rust_arches}
- rust-cxx
ExclusiveArch: %{rust_arches}
- rust-cxx-build
ExclusiveArch: %{rust_arches}
- rust-cxx-gen
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-flags
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-macro
ExclusiveArch: %{rust_arches}
- rust-darling
ExclusiveArch: %{rust_arches}
- rust-darling_core
ExclusiveArch: %{rust_arches}
- rust-darling_macro
ExclusiveArch: %{rust_arches}
- rust-dashmap
ExclusiveArch: %{rust_arches}
- rust-dashmap3
ExclusiveArch: %{rust_arches}
- rust-data-encoding
ExclusiveArch: %{rust_arches}
- rust-data-url
ExclusiveArch: %{rust_arches}
- rust-datetime
ExclusiveArch: %{rust_arches}
- rust-dav1d-sys
ExclusiveArch: %{rust_arches}
- rust-dbus
ExclusiveArch: %{rust_arches}
- rust-dbus-codegen
ExclusiveArch: %{rust_arches}
- rust-dbus-crossroads
ExclusiveArch: %{rust_arches}
- rust-dbus-tokio
ExclusiveArch: %{rust_arches}
- rust-dbus-tree
ExclusiveArch: %{rust_arches}
- rust-dbus0.8
ExclusiveArch: %{rust_arches}
- rust-debug-helper
ExclusiveArch: %{rust_arches}
- rust-decimal
ExclusiveArch: %{rust_arches}
- rust-defer-drop
ExclusiveArch: %{rust_arches}
- rust-deflate
ExclusiveArch: %{rust_arches}
- rust-defmac
ExclusiveArch: %{rust_arches}
- rust-delta_e
ExclusiveArch: %{rust_arches}
- rust-derivative
ExclusiveArch: %{rust_arches}
- rust-derive-new
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-derive_builder
ExclusiveArch: %{rust_arches}
- rust-derive_builder0.9
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core0.9
ExclusiveArch: %{rust_arches}
- rust-derive_builder_macro
ExclusiveArch: %{rust_arches}
- rust-derive_more
ExclusiveArch: %{rust_arches}
- rust-des
ExclusiveArch: %{rust_arches}
- rust-desed
ExclusiveArch: %{rust_arches}
- rust-deunicode
ExclusiveArch: %{rust_arches}
- rust-devicemapper
ExclusiveArch: %{rust_arches}
- rust-dialoguer
ExclusiveArch: %{rust_arches}
- rust-diesel
ExclusiveArch: %{rust_arches}
- rust-diesel_derives
ExclusiveArch: %{rust_arches}
- rust-diesel_migrations
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-difference
ExclusiveArch: %{rust_arches}
- rust-diffus
ExclusiveArch: %{rust_arches}
- rust-diffus-derive
ExclusiveArch: %{rust_arches}
- rust-digest
ExclusiveArch: %{rust_arches}
- rust-digest0.8
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-directories-next
ExclusiveArch: %{rust_arches}
- rust-dirs
ExclusiveArch: %{rust_arches}
- rust-dirs-next
ExclusiveArch: %{rust_arches}
- rust-dirs-sys
ExclusiveArch: %{rust_arches}
- rust-dirs-sys-next
ExclusiveArch: %{rust_arches}
- rust-dirs2
ExclusiveArch: %{rust_arches}
- rust-diskonaut
ExclusiveArch: %{rust_arches}
- rust-dissimilar
ExclusiveArch: %{rust_arches}
- rust-dlib
ExclusiveArch: %{rust_arches}
- rust-dlib0.4
ExclusiveArch: %{rust_arches}
- rust-dlv-list
ExclusiveArch: %{rust_arches}
- rust-dns-lookup
ExclusiveArch: %{rust_arches}
- rust-dns-parser
ExclusiveArch: %{rust_arches}
- rust-doc-comment
ExclusiveArch: %{rust_arches}
- rust-docmatic
ExclusiveArch: %{rust_arches}
- rust-docopt
ExclusiveArch: %{rust_arches}
- rust-dotenv
ExclusiveArch: %{rust_arches}
- rust-downcast-rs
ExclusiveArch: %{rust_arches}
- rust-drg
ExclusiveArch: %{rust_arches}
- rust-dtoa
ExclusiveArch: %{rust_arches}
- rust-dtoa-short
ExclusiveArch: %{rust_arches}
- rust-dua-cli
ExclusiveArch: %{rust_arches}
- rust-duct
ExclusiveArch: %{rust_arches}
- rust-dummy
ExclusiveArch: %{rust_arches}
- rust-dunce
ExclusiveArch: %{rust_arches}
- rust-dutree
ExclusiveArch: %{rust_arches}
- rust-dyn-clone
ExclusiveArch: %{rust_arches}
- rust-easy-cast
ExclusiveArch: %{rust_arches}
- rust-easy-parallel
ExclusiveArch: %{rust_arches}
- rust-edit
ExclusiveArch: %{rust_arches}
- rust-edit-distance
ExclusiveArch: %{rust_arches}
- rust-either
ExclusiveArch: %{rust_arches}
- rust-elasticlunr-rs
ExclusiveArch: %{rust_arches}
- rust-ena
ExclusiveArch: %{rust_arches}
- rust-encode_unicode
ExclusiveArch: %{rust_arches}
- rust-encoding
ExclusiveArch: %{rust_arches}
- rust-encoding-index-japanese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-korean
ExclusiveArch: %{rust_arches}
- rust-encoding-index-simpchinese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-singlebyte
ExclusiveArch: %{rust_arches}
- rust-encoding-index-tradchinese
ExclusiveArch: %{rust_arches}
- rust-encoding_index_tests
ExclusiveArch: %{rust_arches}
- rust-encoding_rs
ExclusiveArch: %{rust_arches}
- rust-encoding_rs_io
ExclusiveArch: %{rust_arches}
- rust-endian-type
ExclusiveArch: %{rust_arches}
- rust-entities
ExclusiveArch: %{rust_arches}
- rust-enum-as-inner
ExclusiveArch: %{rust_arches}
- rust-enum-map
ExclusiveArch: %{rust_arches}
- rust-enum-map-derive
ExclusiveArch: %{rust_arches}
- rust-enum-repr
ExclusiveArch: %{rust_arches}
- rust-enum_primitive
ExclusiveArch: %{rust_arches}
- rust-enumflags2
ExclusiveArch: %{rust_arches}
- rust-enumflags2_derive
ExclusiveArch: %{rust_arches}
- rust-enumset
ExclusiveArch: %{rust_arches}
- rust-enumset_derive
ExclusiveArch: %{rust_arches}
- rust-env_logger
ExclusiveArch: %{rust_arches}
- rust-env_logger0.4
ExclusiveArch: %{rust_arches}
- rust-env_logger0.5
ExclusiveArch: %{rust_arches}
- rust-env_logger0.6
ExclusiveArch: %{rust_arches}
- rust-env_logger0.7
ExclusiveArch: %{rust_arches}
- rust-environment
ExclusiveArch: %{rust_arches}
- rust-envsubst
ExclusiveArch: %{rust_arches}
- rust-epoll
ExclusiveArch: %{rust_arches}
- rust-erased-serde
ExclusiveArch: %{rust_arches}
- rust-err-derive
ExclusiveArch: %{rust_arches}
- rust-errln
ExclusiveArch: %{rust_arches}
- rust-errno
ExclusiveArch: %{rust_arches}
- rust-error-chain
ExclusiveArch: %{rust_arches}
- rust-escaper
ExclusiveArch: %{rust_arches}
- rust-escargot
ExclusiveArch: %{rust_arches}
- rust-euclid
ExclusiveArch: %{rust_arches}
- rust-event-listener
ExclusiveArch: %{rust_arches}
- rust-exa
ExclusiveArch: %{rust_arches}
- rust-expat-sys
ExclusiveArch: %{rust_arches}
- rust-extend
ExclusiveArch: %{rust_arches}
- rust-extprim
ExclusiveArch: %{rust_arches}
- rust-extprim_literals_macros
ExclusiveArch: %{rust_arches}
- rust-fail
ExclusiveArch: %{rust_arches}
- rust-failure
ExclusiveArch: %{rust_arches}
- rust-failure-tools
ExclusiveArch: %{rust_arches}
- rust-failure_derive
ExclusiveArch: %{rust_arches}
- rust-fake
ExclusiveArch: %{rust_arches}
- rust-fake-simd
ExclusiveArch: %{rust_arches}
- rust-fake_clock
ExclusiveArch: %{rust_arches}
- rust-fallible-iterator
ExclusiveArch: %{rust_arches}
- rust-fallible-streaming-iterator
ExclusiveArch: %{rust_arches}
- rust-fastrand
ExclusiveArch: %{rust_arches}
- rust-fb_procfs
ExclusiveArch: %{rust_arches}
- rust-fbthrift_codegen_includer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-fd-find
ExclusiveArch: %{rust_arches}
- rust-fd-lock
ExclusiveArch: %{rust_arches}
- rust-fdlimit
ExclusiveArch: %{rust_arches}
- rust-fedora
ExclusiveArch: %{rust_arches}
- rust-fedora-coreos-pinger
ExclusiveArch: %{rust_arches}
- rust-fedora-update-feedback
ExclusiveArch: %{rust_arches}
- rust-feed-rs
ExclusiveArch: %{rust_arches}
- rust-feedbin_api
ExclusiveArch: %{rust_arches}
- rust-feedly_api
ExclusiveArch: %{rust_arches}
- rust-femme
ExclusiveArch: %{rust_arches}
- rust-fern
ExclusiveArch: %{rust_arches}
- rust-fever_api
ExclusiveArch: %{rust_arches}
- rust-ffsend
ExclusiveArch: %{rust_arches}
- rust-ffsend-api
ExclusiveArch: %{rust_arches}
- rust-file-per-thread-logger
ExclusiveArch: %{rust_arches}
- rust-filedescriptor
ExclusiveArch: %{rust_arches}
- rust-filesize
ExclusiveArch: %{rust_arches}
- rust-filetime
ExclusiveArch: %{rust_arches}
- rust-findshlibs
ExclusiveArch: %{rust_arches}
- rust-fixed
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-flame
ExclusiveArch: %{rust_arches}
- rust-flate2
ExclusiveArch: %{rust_arches}
- rust-float-cmp
ExclusiveArch: %{rust_arches}
- rust-float-cmp0.6
ExclusiveArch: %{rust_arches}
- rust-float-ord
ExclusiveArch: %{rust_arches}
- rust-flume
ExclusiveArch: %{rust_arches}
- rust-fn-error-context
ExclusiveArch: %{rust_arches}
- rust-fnv
ExclusiveArch: %{rust_arches}
- rust-font-kit
ExclusiveArch: %{rust_arches}
- rust-foreign-types
ExclusiveArch: %{rust_arches}
- rust-foreign-types-macros
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared0.1
ExclusiveArch: %{rust_arches}
- rust-foreign-types0.3
ExclusiveArch: %{rust_arches}
- rust-form_urlencoded
ExclusiveArch: %{rust_arches}
- rust-fragile
ExclusiveArch: %{rust_arches}
- rust-freetype
ExclusiveArch: %{rust_arches}
- rust-freetype-rs
ExclusiveArch: %{rust_arches}
- rust-freetype-sys
ExclusiveArch: %{rust_arches}
- rust-fs-set-times
ExclusiveArch: %{rust_arches}
- rust-fs2
ExclusiveArch: %{rust_arches}
- rust-fs_extra
ExclusiveArch: %{rust_arches}
- rust-funty
ExclusiveArch: %{rust_arches}
- rust-fuse
ExclusiveArch: %{rust_arches}
- rust-futf
ExclusiveArch: %{rust_arches}
- rust-futures
ExclusiveArch: %{rust_arches}
- rust-futures-channel
ExclusiveArch: %{rust_arches}
- rust-futures-core
ExclusiveArch: %{rust_arches}
- rust-futures-cpupool
ExclusiveArch: %{rust_arches}
- rust-futures-executor
ExclusiveArch: %{rust_arches}
- rust-futures-io
ExclusiveArch: %{rust_arches}
- rust-futures-lite
ExclusiveArch: %{rust_arches}
- rust-futures-macro
ExclusiveArch: %{rust_arches}
- rust-futures-sink
ExclusiveArch: %{rust_arches}
- rust-futures-task
ExclusiveArch: %{rust_arches}
- rust-futures-test
ExclusiveArch: %{rust_arches}
- rust-futures-timer
ExclusiveArch: %{rust_arches}
- rust-futures-util
ExclusiveArch: %{rust_arches}
- rust-futures0.1
ExclusiveArch: %{rust_arches}
- rust-fuzzy-matcher
ExclusiveArch: %{rust_arches}
- rust-fxhash
ExclusiveArch: %{rust_arches}
- rust-gcsf
ExclusiveArch: %{rust_arches}
- rust-gdk
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf-sys
ExclusiveArch: %{rust_arches}
- rust-gdk-sys
ExclusiveArch: %{rust_arches}
- rust-generic-array
ExclusiveArch: %{rust_arches}
- rust-generic-array0.12
ExclusiveArch: %{rust_arches}
- rust-genmesh
ExclusiveArch: %{rust_arches}
- rust-getch
ExclusiveArch: %{rust_arches}
- rust-gethostname
ExclusiveArch: %{rust_arches}
- rust-getopts
ExclusiveArch: %{rust_arches}
- rust-getrandom
ExclusiveArch: %{rust_arches}
- rust-getrandom0.1
ExclusiveArch: %{rust_arches}
- rust-gettext-rs
ExclusiveArch: %{rust_arches}
- rust-gettext-sys
ExclusiveArch: %{rust_arches}
- rust-ghash
ExclusiveArch: %{rust_arches}
- rust-ghost
ExclusiveArch: %{rust_arches}
- rust-gif
ExclusiveArch: %{rust_arches}
- rust-gif0.10
ExclusiveArch: %{rust_arches}
- rust-gimli
ExclusiveArch: %{rust_arches}
- rust-gio
ExclusiveArch: %{rust_arches}
- rust-gio-sys
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git-delta
ExclusiveArch: %{rust_arches}
- rust-git2
ExclusiveArch: %{rust_arches}
- rust-git2-curl
ExclusiveArch: %{rust_arches}
- rust-gitui
ExclusiveArch: %{rust_arches}
- rust-gl_generator
ExclusiveArch: %{rust_arches}
- rust-glam
ExclusiveArch: %{rust_arches}
- rust-glib
ExclusiveArch: %{rust_arches}
- rust-glib-macros
ExclusiveArch: %{rust_arches}
- rust-glib-sys
ExclusiveArch: %{rust_arches}
- rust-glob
ExclusiveArch: %{rust_arches}
- rust-globset
ExclusiveArch: %{rust_arches}
- rust-globwalk
ExclusiveArch: %{rust_arches}
- rust-glutin
ExclusiveArch: %{rust_arches}
- rust-glutin_egl_sys
ExclusiveArch: %{rust_arches}
- rust-glutin_glx_sys
ExclusiveArch: %{rust_arches}
- rust-gobject-sys
ExclusiveArch: %{rust_arches}
- rust-goblin
ExclusiveArch: %{rust_arches}
- rust-google-drive3-fork
ExclusiveArch: %{rust_arches}
- rust-gptman
ExclusiveArch: %{rust_arches}
- rust-grep
ExclusiveArch: %{rust_arches}
- rust-grep-cli
ExclusiveArch: %{rust_arches}
- rust-grep-matcher
ExclusiveArch: %{rust_arches}
- rust-grep-pcre2
ExclusiveArch: %{rust_arches}
- rust-grep-printer
ExclusiveArch: %{rust_arches}
- rust-grep-regex
ExclusiveArch: %{rust_arches}
- rust-grep-searcher
ExclusiveArch: %{rust_arches}
- rust-groupable
ExclusiveArch: %{rust_arches}
- rust-gspell
ExclusiveArch: %{rust_arches}
- rust-gspell-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video-sys
ExclusiveArch: %{rust_arches}
- rust-gtk
ExclusiveArch: %{rust_arches}
- rust-gtk-macros
ExclusiveArch: %{rust_arches}
- rust-gtk-rs-lgpl-docs
ExclusiveArch: %{rust_arches}
- rust-gtk-source-sys
ExclusiveArch: %{rust_arches}
- rust-gtk-sys
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-h2
ExclusiveArch: %{rust_arches}
- rust-h2_0.2
ExclusiveArch: %{rust_arches}
- rust-half
ExclusiveArch: %{rust_arches}
- rust-hamcrest
ExclusiveArch: %{rust_arches}
- rust-hamcrest2
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-hashbrown
ExclusiveArch: %{rust_arches}
- rust-hashlink
ExclusiveArch: %{rust_arches}
- rust-headers
ExclusiveArch: %{rust_arches}
- rust-headers-core
ExclusiveArch: %{rust_arches}
- rust-headers-derive
ExclusiveArch: %{rust_arches}
- rust-heapsize
ExclusiveArch: %{rust_arches}
- rust-heatseeker
ExclusiveArch: %{rust_arches}
- rust-heck
ExclusiveArch: %{rust_arches}
- rust-hex
ExclusiveArch: %{rust_arches}
- rust-hex-literal
ExclusiveArch: %{rust_arches}
- rust-hex-literal-impl
ExclusiveArch: %{rust_arches}
- rust-hex-literal0.2
ExclusiveArch: %{rust_arches}
- rust-hexyl
ExclusiveArch: %{rust_arches}
- rust-hkdf
ExclusiveArch: %{rust_arches}
- rust-hmac
ExclusiveArch: %{rust_arches}
- rust-home
ExclusiveArch: %{rust_arches}
- rust-horrorshow
ExclusiveArch: %{rust_arches}
- rust-hostname
ExclusiveArch: %{rust_arches}
- rust-hostname-validator
ExclusiveArch: %{rust_arches}
- rust-html2pango
ExclusiveArch: %{rust_arches}
- rust-html5ever
ExclusiveArch: %{rust_arches}
- rust-http
ExclusiveArch: %{rust_arches}
- rust-http-body
ExclusiveArch: %{rust_arches}
- rust-http-body0.3
ExclusiveArch: %{rust_arches}
- rust-http0.1
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-httpdate
ExclusiveArch: %{rust_arches}
- rust-human-sort
ExclusiveArch: %{rust_arches}
- rust-humansize
ExclusiveArch: %{rust_arches}
- rust-humantime
ExclusiveArch: %{rust_arches}
- rust-humantime-serde
ExclusiveArch: %{rust_arches}
- rust-humantime1
ExclusiveArch: %{rust_arches}
- rust-hyper
ExclusiveArch: %{rust_arches}
- rust-hyper-native-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-rustls
ExclusiveArch: %{rust_arches}
- rust-hyper-staticfile
ExclusiveArch: %{rust_arches}
- rust-hyper-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-tls0.4
ExclusiveArch: %{rust_arches}
- rust-hyper0.10
ExclusiveArch: %{rust_arches}
- rust-hyper0.13
ExclusiveArch: %{rust_arches}
- rust-hyperfine
ExclusiveArch: %{rust_arches}
- rust-i3ipc
ExclusiveArch: %{rust_arches}
- rust-id_tree
ExclusiveArch: %{rust_arches}
- rust-ident_case
ExclusiveArch: %{rust_arches}
- rust-idna
ExclusiveArch: %{rust_arches}
- rust-idna0.1
ExclusiveArch: %{rust_arches}
- rust-ignore
ExclusiveArch: %{rust_arches}
- rust-im-rc
ExclusiveArch: %{rust_arches}
- rust-image
ExclusiveArch: %{rust_arches}
- rust-image-roll
ExclusiveArch: %{rust_arches}
- rust-imgref
ExclusiveArch: %{rust_arches}
- rust-imgui
ExclusiveArch: %{rust_arches}
- rust-imgui-sys
ExclusiveArch: %{rust_arches}
- rust-imgui-winit-support
ExclusiveArch: %{rust_arches}
- rust-indexmap
ExclusiveArch: %{rust_arches}
- rust-indicatif
ExclusiveArch: %{rust_arches}
- rust-indoc
ExclusiveArch: %{rust_arches}
- rust-inflate
ExclusiveArch: %{rust_arches}
- rust-inotify
ExclusiveArch: %{rust_arches}
- rust-inotify-sys
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-insta
ExclusiveArch: %{rust_arches}
- rust-instant
ExclusiveArch: %{rust_arches}
- rust-interpolate_name
ExclusiveArch: %{rust_arches}
- rust-intervaltree
ExclusiveArch: %{rust_arches}
- rust-invalidstring
ExclusiveArch: %{rust_arches}
- rust-inventory
ExclusiveArch: %{rust_arches}
- rust-inventory-impl
ExclusiveArch: %{rust_arches}
- rust-ioctl-rs
ExclusiveArch: %{rust_arches}
- rust-iocuddle
ExclusiveArch: %{rust_arches}
- rust-iovec
ExclusiveArch: %{rust_arches}
- rust-ipnet
ExclusiveArch: %{rust_arches}
- rust-ipnetwork
ExclusiveArch: %{rust_arches}
- rust-iron
ExclusiveArch: %{rust_arches}
- rust-isahc
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-iter-read
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-itertools-num
ExclusiveArch: %{rust_arches}
- rust-itertools0.8
ExclusiveArch: %{rust_arches}
- rust-itertools0.9
ExclusiveArch: %{rust_arches}
- rust-itoa
ExclusiveArch: %{rust_arches}
- rust-ivf
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs-sys
ExclusiveArch: %{rust_arches}
- rust-jetscii
ExclusiveArch: %{rust_arches}
- rust-jieba-rs
ExclusiveArch: %{rust_arches}
- rust-jobserver
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder
ExclusiveArch: %{rust_arches}
- rust-jql
ExclusiveArch: %{rust_arches}
- rust-js-sys
ExclusiveArch: %{rust_arches}
- rust-js_int
ExclusiveArch: %{rust_arches}
- rust-json
ExclusiveArch: %{rust_arches}
- rust-jwalk
ExclusiveArch: %{rust_arches}
- rust-k9
ExclusiveArch: %{rust_arches}
- rust-keccak
ExclusiveArch: %{rust_arches}
- rust-khronos_api
ExclusiveArch: %{rust_arches}
- rust-kstring
ExclusiveArch: %{rust_arches}
- rust-kv-log-macro
ExclusiveArch: %{rust_arches}
- rust-lab
ExclusiveArch: %{rust_arches}
- rust-lalrpop
ExclusiveArch: %{rust_arches}
- rust-lalrpop-util
ExclusiveArch: %{rust_arches}
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lazy-init
ExclusiveArch: %{rust_arches}
- rust-lazy_static
ExclusiveArch: %{rust_arches}
- rust-lazycell
ExclusiveArch: %{rust_arches}
- rust-leb128
ExclusiveArch: %{rust_arches}
- rust-letter-avatar
ExclusiveArch: %{rust_arches}
- rust-lexical-core
ExclusiveArch: %{rust_arches}
- rust-libbpf-cargo
ExclusiveArch: %{rust_arches}
- rust-libbpf-rs
ExclusiveArch: %{rust_arches}
- rust-libbpf-sys
ExclusiveArch: %{rust_arches}
- rust-libc
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs-sys
ExclusiveArch: %{rust_arches}
- rust-libdbus-sys
ExclusiveArch: %{rust_arches}
- rust-libdeflate-sys
ExclusiveArch: %{rust_arches}
- rust-libdeflater
ExclusiveArch: %{rust_arches}
- rust-libflate
ExclusiveArch: %{rust_arches}
- rust-libflate_lz77
ExclusiveArch: %{rust_arches}
- rust-libgit2-sys
ExclusiveArch: %{rust_arches}
- rust-libhandy
ExclusiveArch: %{rust_arches}
- rust-libhandy-sys
ExclusiveArch: %{rust_arches}
- rust-libloading
ExclusiveArch: %{rust_arches}
- rust-libloading0.6
ExclusiveArch: %{rust_arches}
- rust-libm
ExclusiveArch: %{rust_arches}
- rust-libmount
ExclusiveArch: %{rust_arches}
- rust-libnotcurses-sys
ExclusiveArch: %{rust_arches}
- rust-liboverdrop
ExclusiveArch: %{rust_arches}
- rust-libpulse-binding
ExclusiveArch: %{rust_arches}
- rust-libpulse-sys
ExclusiveArch: %{rust_arches}
- rust-libslirp
ExclusiveArch: %{rust_arches}
- rust-libslirp-sys
ExclusiveArch: %{rust_arches}
- rust-libsqlite3-sys
ExclusiveArch: %{rust_arches}
- rust-libssh2-sys
ExclusiveArch: %{rust_arches}
- rust-libsystemd
ExclusiveArch: %{rust_arches}
- rust-libsystemd-sys
ExclusiveArch: %{rust_arches}
- rust-libudev
ExclusiveArch: %{rust_arches}
- rust-libudev-sys
ExclusiveArch: %{rust_arches}
- rust-libwebp
ExclusiveArch: %{rust_arches}
- rust-libwebp-sys2
ExclusiveArch: %{rust_arches}
- rust-libxml
ExclusiveArch: %{rust_arches}
- rust-libz-sys
ExclusiveArch: %{rust_arches}
- rust-line-wrap
ExclusiveArch: %{rust_arches}
- rust-line_drawing
ExclusiveArch: %{rust_arches}
- rust-link-cplusplus
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-linkify
ExclusiveArch: %{rust_arches}
- rust-lipsum
ExclusiveArch: %{rust_arches}
- rust-liquid
ExclusiveArch: %{rust_arches}
- rust-liquid-core
ExclusiveArch: %{rust_arches}
- rust-liquid-derive
ExclusiveArch: %{rust_arches}
- rust-liquid-lib
ExclusiveArch: %{rust_arches}
- rust-listenfd
ExclusiveArch: %{rust_arches}
- rust-lmdb
ExclusiveArch: %{rust_arches}
- rust-lmdb-sys
ExclusiveArch: %{rust_arches}
- rust-locale
ExclusiveArch: %{rust_arches}
- rust-locale_config
ExclusiveArch: %{rust_arches}
- rust-lock_api
ExclusiveArch: %{rust_arches}
- rust-lockfree
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-log-mdc
ExclusiveArch: %{rust_arches}
- rust-log-panics
ExclusiveArch: %{rust_arches}
- rust-log0.3
ExclusiveArch: %{rust_arches}
- rust-log4rs
ExclusiveArch: %{rust_arches}
- rust-loggerv
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lru-cache
ExclusiveArch: %{rust_arches}
- rust-lru_time_cache
ExclusiveArch: %{rust_arches}
- rust-lscolors
ExclusiveArch: %{rust_arches}
- rust-lsd
ExclusiveArch: %{rust_arches}
- rust-lzma-sys
ExclusiveArch: %{rust_arches}
- rust-lzw
ExclusiveArch: %{rust_arches}
- rust-mac
ExclusiveArch: %{rust_arches}
- rust-macro-attr
ExclusiveArch: %{rust_arches}
- rust-magic-crypt
ExclusiveArch: %{rust_arches}
- rust-maildir
ExclusiveArch: %{rust_arches}
- rust-mailparse
ExclusiveArch: %{rust_arches}
- rust-man
ExclusiveArch: %{rust_arches}
- rust-maplit
ExclusiveArch: %{rust_arches}
- rust-markup5ever
ExclusiveArch: %{rust_arches}
- rust-markup5ever_rcdom
ExclusiveArch: %{rust_arches}
- rust-match_cfg
ExclusiveArch: %{rust_arches}
- rust-matches
ExclusiveArch: %{rust_arches}
- rust-matrixcompare
ExclusiveArch: %{rust_arches}
- rust-matrixcompare-core
ExclusiveArch: %{rust_arches}
- rust-matrixcompare-mock
ExclusiveArch: %{rust_arches}
- rust-matrixmultiply
ExclusiveArch: %{rust_arches}
- rust-maxminddb
ExclusiveArch: %{rust_arches}
- rust-maybe-owned
ExclusiveArch: %{rust_arches}
- rust-maybe-uninit
ExclusiveArch: %{rust_arches}
- rust-mbox
ExclusiveArch: %{rust_arches}
- rust-mbrman
ExclusiveArch: %{rust_arches}
- rust-md-5
ExclusiveArch: %{rust_arches}
- rust-md5
ExclusiveArch: %{rust_arches}
- rust-mdl
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-memmap
ExclusiveArch: %{rust_arches}
- rust-memmap2
ExclusiveArch: %{rust_arches}
- rust-memmap2_0.1
ExclusiveArch: %{rust_arches}
- rust-memoffset
ExclusiveArch: %{rust_arches}
- rust-memoffset0.5
ExclusiveArch: %{rust_arches}
- rust-memsec
ExclusiveArch: %{rust_arches}
- rust-metadeps
ExclusiveArch: %{rust_arches}
- rust-migrations_internals
ExclusiveArch: %{rust_arches}
- rust-migrations_macros
ExclusiveArch: %{rust_arches}
- rust-mime
ExclusiveArch: %{rust_arches}
- rust-mime-sniffer
ExclusiveArch: %{rust_arches}
- rust-mime0.2
ExclusiveArch: %{rust_arches}
- rust-mime_guess
ExclusiveArch: %{rust_arches}
- rust-mime_guess1
ExclusiveArch: %{rust_arches}
- rust-miniflux_api
ExclusiveArch: %{rust_arches}
- rust-minify-html
ExclusiveArch: %{rust_arches}
- rust-miniz-sys
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide0.3
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide_c_api
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mio
ExclusiveArch: %{rust_arches}
- rust-mio-extras
ExclusiveArch: %{rust_arches}
- rust-mio-uds
ExclusiveArch: %{rust_arches}
- rust-mio0.6
ExclusiveArch: %{rust_arches}
- rust-mktemp
ExclusiveArch: %{rust_arches}
- rust-mnt
ExclusiveArch: %{rust_arches}
- rust-mockito
ExclusiveArch: %{rust_arches}
- rust-modifier
ExclusiveArch: %{rust_arches}
- rust-more-asserts
ExclusiveArch: %{rust_arches}
- rust-msgbox
ExclusiveArch: %{rust_arches}
- rust-muldiv
ExclusiveArch: %{rust_arches}
- rust-multimap
ExclusiveArch: %{rust_arches}
- rust-multipart
ExclusiveArch: %{rust_arches}
- rust-mustache
ExclusiveArch: %{rust_arches}
- rust-nalgebra-macros
ExclusiveArch: %{rust_arches}
- rust-nasm-rs
ExclusiveArch: %{rust_arches}
- rust-native-tls
ExclusiveArch: %{rust_arches}
- rust-natord
ExclusiveArch: %{rust_arches}
- rust-navi
ExclusiveArch: %{rust_arches}
- rust-nb-connect
ExclusiveArch: %{rust_arches}
- rust-ncurses
ExclusiveArch: %{rust_arches}
- rust-net2
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-core
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-route
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-utils
ExclusiveArch: %{rust_arches}
- rust-netlink-proto
ExclusiveArch: %{rust_arches}
- rust-netlink-sys
ExclusiveArch: %{rust_arches}
- rust-netmap_sys
ExclusiveArch: %{rust_arches}
- rust-nettle
ExclusiveArch: %{rust_arches}
- rust-nettle-sys
ExclusiveArch: %{rust_arches}
- rust-new_debug_unreachable
ExclusiveArch: %{rust_arches}
- rust-news-flash
ExclusiveArch: %{rust_arches}
- rust-newsblur_api
ExclusiveArch: %{rust_arches}
- rust-newtype_derive
ExclusiveArch: %{rust_arches}
- rust-nibble_vec
ExclusiveArch: %{rust_arches}
- rust-nickel
ExclusiveArch: %{rust_arches}
- rust-nix
ExclusiveArch: %{rust_arches}
- rust-nix0.14
ExclusiveArch: %{rust_arches}
- rust-nix0.17
ExclusiveArch: %{rust_arches}
- rust-nix0.18
ExclusiveArch: %{rust_arches}
- rust-no-panic
ExclusiveArch: %{rust_arches}
- rust-nodrop
ExclusiveArch: %{rust_arches}
- rust-nom
ExclusiveArch: %{rust_arches}
- rust-nom4
ExclusiveArch: %{rust_arches}
- rust-nom5
ExclusiveArch: %{rust_arches}
- rust-noop_proc_macro
ExclusiveArch: %{rust_arches}
- rust-normalize-line-endings
ExclusiveArch: %{rust_arches}
- rust-notify
ExclusiveArch: %{rust_arches}
- rust-notify-rust
ExclusiveArch: %{rust_arches}
- rust-num
ExclusiveArch: %{rust_arches}
- rust-num-bigint
ExclusiveArch: %{rust_arches}
- rust-num-bigint-dig
ExclusiveArch: %{rust_arches}
- rust-num-complex
ExclusiveArch: %{rust_arches}
- rust-num-complex0.3
ExclusiveArch: %{rust_arches}
- rust-num-derive
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-num-traits0.1
ExclusiveArch: %{rust_arches}
- rust-num_cpus
ExclusiveArch: %{rust_arches}
- rust-num_enum
ExclusiveArch: %{rust_arches}
- rust-num_enum_derive
ExclusiveArch: %{rust_arches}
- rust-number_prefix
ExclusiveArch: %{rust_arches}
- rust-numtoa
ExclusiveArch: %{rust_arches}
- rust-oauth2
ExclusiveArch: %{rust_arches}
- rust-obfstr
ExclusiveArch: %{rust_arches}
- rust-obj
ExclusiveArch: %{rust_arches}
- rust-object
ExclusiveArch: %{rust_arches}
- rust-odds
ExclusiveArch: %{rust_arches}
- rust-oid
ExclusiveArch: %{rust_arches}
- rust-once_cell
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-onig_sys
ExclusiveArch: %{rust_arches}
- rust-oorandom
ExclusiveArch: %{rust_arches}
- rust-opaque-debug
ExclusiveArch: %{rust_arches}
- rust-open
ExclusiveArch: %{rust_arches}
- rust-openat
ExclusiveArch: %{rust_arches}
- rust-openat-ext
ExclusiveArch: %{rust_arches}
- rust-opener
ExclusiveArch: %{rust_arches}
- rust-openssh-keys
ExclusiveArch: %{rust_arches}
- rust-openssl
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-openssl-sys
ExclusiveArch: %{rust_arches}
- rust-ord_subset
ExclusiveArch: %{rust_arches}
- rust-ordered-float
ExclusiveArch: %{rust_arches}
- rust-ordered-multimap
ExclusiveArch: %{rust_arches}
- rust-os_info
ExclusiveArch: %{rust_arches}
- rust-os_pipe
ExclusiveArch: %{rust_arches}
- rust-os_str_bytes
ExclusiveArch: %{rust_arches}
- rust-osmesa-sys
ExclusiveArch: %{rust_arches}
- rust-osstrtools
ExclusiveArch: %{rust_arches}
- rust-ostree
ExclusiveArch: %{rust_arches}
- rust-ostree-sys
ExclusiveArch: %{rust_arches}
- rust-ouroboros
ExclusiveArch: %{rust_arches}
- rust-ouroboros_macro
ExclusiveArch: %{rust_arches}
- rust-owned-alloc
ExclusiveArch: %{rust_arches}
- rust-owned_ttf_parser
ExclusiveArch: %{rust_arches}
- rust-owning_ref
ExclusiveArch: %{rust_arches}
- rust-oxipng
ExclusiveArch: %{rust_arches}
- rust-packaging
ExclusiveArch: %{rust_arches}
- rust-pad
ExclusiveArch: %{rust_arches}
- rust-page_size
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-palette
ExclusiveArch: %{rust_arches}
- rust-palette_derive
ExclusiveArch: %{rust_arches}
- rust-pam
ExclusiveArch: %{rust_arches}
- rust-pam-client
ExclusiveArch: %{rust_arches}
- rust-pam-sys
ExclusiveArch: %{rust_arches}
- rust-pancurses
ExclusiveArch: %{rust_arches}
- rust-pango
ExclusiveArch: %{rust_arches}
- rust-pango-sys
ExclusiveArch: %{rust_arches}
- rust-pangocairo
ExclusiveArch: %{rust_arches}
- rust-pangocairo-sys
ExclusiveArch: %{rust_arches}
- rust-parity-wasm
ExclusiveArch: %{rust_arches}
- rust-parking
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot_core
ExclusiveArch: %{rust_arches}
- rust-parse-zoneinfo
ExclusiveArch: %{rust_arches}
- rust-parse_cfg
ExclusiveArch: %{rust_arches}
- rust-parsec-client
ExclusiveArch: %{rust_arches}
- rust-parsec-interface
ExclusiveArch: %{rust_arches}
- rust-partial-io
ExclusiveArch: %{rust_arches}
- rust-paste
ExclusiveArch: %{rust_arches}
- rust-paste-impl
ExclusiveArch: %{rust_arches}
- rust-path-absolutize
ExclusiveArch: %{rust_arches}
- rust-path-dedot
ExclusiveArch: %{rust_arches}
- rust-path-slash
ExclusiveArch: %{rust_arches}
- rust-pathdiff
ExclusiveArch: %{rust_arches}
- rust-pathfinder_geometry
ExclusiveArch: %{rust_arches}
- rust-pathfinder_simd
ExclusiveArch: %{rust_arches}
- rust-pbr
ExclusiveArch: %{rust_arches}
- rust-pcap
ExclusiveArch: %{rust_arches}
- rust-pcre2
ExclusiveArch: %{rust_arches}
- rust-pcre2-sys
ExclusiveArch: %{rust_arches}
- rust-peeking_take_while
ExclusiveArch: %{rust_arches}
- rust-peg
ExclusiveArch: %{rust_arches}
- rust-peg-macros
ExclusiveArch: %{rust_arches}
- rust-peg-runtime
ExclusiveArch: %{rust_arches}
- rust-peg0.5
ExclusiveArch: %{rust_arches}
- rust-pem
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-percent-encoding1
ExclusiveArch: %{rust_arches}
- rust-peresil
ExclusiveArch: %{rust_arches}
- rust-permutate
ExclusiveArch: %{rust_arches}
- rust-permutohedron
ExclusiveArch: %{rust_arches}
- rust-pest
ExclusiveArch: %{rust_arches}
- rust-pest_derive
ExclusiveArch: %{rust_arches}
- rust-pest_generator
ExclusiveArch: %{rust_arches}
- rust-pest_meta
ExclusiveArch: %{rust_arches}
- rust-petgraph
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf0.7
ExclusiveArch: %{rust_arches}
- rust-phf_codegen
ExclusiveArch: %{rust_arches}
- rust-phf_codegen0.7
ExclusiveArch: %{rust_arches}
- rust-phf_generator
ExclusiveArch: %{rust_arches}
- rust-phf_generator0.7
ExclusiveArch: %{rust_arches}
- rust-phf_macros
ExclusiveArch: %{rust_arches}
- rust-phf_macros0.7
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-phf_shared0.7
ExclusiveArch: %{rust_arches}
- rust-picky-asn1
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-der
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-x509
ExclusiveArch: %{rust_arches}
- rust-pico-args
ExclusiveArch: %{rust_arches}
- rust-pin-project
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal0.4
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite0.1
ExclusiveArch: %{rust_arches}
- rust-pin-project0.4
ExclusiveArch: %{rust_arches}
- rust-pin-utils
ExclusiveArch: %{rust_arches}
- rust-pipe
ExclusiveArch: %{rust_arches}
- rust-piper
ExclusiveArch: %{rust_arches}
- rust-pkcs11
ExclusiveArch: %{rust_arches}
- rust-pkg-config
ExclusiveArch: %{rust_arches}
- rust-plain
ExclusiveArch: %{rust_arches}
- rust-platform-dirs
ExclusiveArch: %{rust_arches}
- rust-platforms
ExclusiveArch: %{rust_arches}
- rust-pleaser
ExclusiveArch: %{rust_arches}
- rust-plist
ExclusiveArch: %{rust_arches}
- rust-plotters
ExclusiveArch: %{rust_arches}
- rust-plotters-backend
ExclusiveArch: %{rust_arches}
- rust-plotters-bitmap
ExclusiveArch: %{rust_arches}
- rust-plotters-svg
ExclusiveArch: %{rust_arches}
- rust-plugin
ExclusiveArch: %{rust_arches}
- rust-pnet_base
ExclusiveArch: %{rust_arches}
- rust-pnet_datalink
ExclusiveArch: %{rust_arches}
- rust-pnet_sys
ExclusiveArch: %{rust_arches}
- rust-png
ExclusiveArch: %{rust_arches}
- rust-podio
ExclusiveArch: %{rust_arches}
- rust-polling
ExclusiveArch: %{rust_arches}
- rust-polyval
ExclusiveArch: %{rust_arches}
- rust-pom
ExclusiveArch: %{rust_arches}
- rust-pommes
ExclusiveArch: %{rust_arches}
- rust-posish
ExclusiveArch: %{rust_arches}
- rust-ppv-lite86
ExclusiveArch: %{rust_arches}
- rust-pq-sys
ExclusiveArch: %{rust_arches}
- rust-precomputed-hash
ExclusiveArch: %{rust_arches}
- rust-predicates
ExclusiveArch: %{rust_arches}
- rust-predicates-core
ExclusiveArch: %{rust_arches}
- rust-predicates-tree
ExclusiveArch: %{rust_arches}
- rust-pretty-git-prompt
ExclusiveArch: %{rust_arches}
- rust-pretty-hex
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions0.6
ExclusiveArch: %{rust_arches}
- rust-pretty_env_logger
ExclusiveArch: %{rust_arches}
- rust-prettytable-rs
ExclusiveArch: %{rust_arches}
- rust-proc-macro-crate
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error-attr
ExclusiveArch: %{rust_arches}
- rust-proc-macro-hack
ExclusiveArch: %{rust_arches}
- rust-proc-macro-nested
ExclusiveArch: %{rust_arches}
- rust-proc-macro2
ExclusiveArch: %{rust_arches}
- rust-proc-macro2-0.4
ExclusiveArch: %{rust_arches}
- rust-proc-quote
ExclusiveArch: %{rust_arches}
- rust-proc-quote-impl
ExclusiveArch: %{rust_arches}
- rust-procedural-masquerade
ExclusiveArch: %{rust_arches}
- rust-process_control
ExclusiveArch: %{rust_arches}
- rust-process_path
ExclusiveArch: %{rust_arches}
- rust-procfs
ExclusiveArch: %{rust_arches}
- rust-procs
ExclusiveArch: %{rust_arches}
- rust-progress-streams
ExclusiveArch: %{rust_arches}
- rust-prometheus
ExclusiveArch: %{rust_arches}
- rust-proptest
ExclusiveArch: %{rust_arches}
- rust-proptest-derive
ExclusiveArch: %{rust_arches}
- rust-proptest0.10
ExclusiveArch: %{rust_arches}
- rust-prost
ExclusiveArch: %{rust_arches}
- rust-prost-build
ExclusiveArch: %{rust_arches}
- rust-prost-derive
ExclusiveArch: %{rust_arches}
- rust-prost-types
ExclusiveArch: %{rust_arches}
- rust-protobuf
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen-pure
ExclusiveArch: %{rust_arches}
- rust-protoc
ExclusiveArch: %{rust_arches}
- rust-protoc-rust
ExclusiveArch: %{rust_arches}
- rust-psa-crypto
ExclusiveArch: %{rust_arches}
- rust-psa-crypto-sys
ExclusiveArch: %{rust_arches}
- rust-psd
ExclusiveArch: %{rust_arches}
- rust-psm
ExclusiveArch: %{rust_arches}
- rust-psutil
ExclusiveArch: %{rust_arches}
- rust-publicsuffix
ExclusiveArch: %{rust_arches}
- rust-pulldown-cmark
ExclusiveArch: %{rust_arches}
- rust-pulse
ExclusiveArch: %{rust_arches}
- rust-pure-rust-locales
ExclusiveArch: %{rust_arches}
- rust-pyo3
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros-backend
ExclusiveArch: %{rust_arches}
- rust-python3-sys
ExclusiveArch: %{rust_arches}
- rust-qr2term
ExclusiveArch: %{rust_arches}
- rust-qrcode
ExclusiveArch: %{rust_arches}
- rust-qstring
ExclusiveArch: %{rust_arches}
- rust-quad-rand
ExclusiveArch: %{rust_arches}
- rust-quick-error
ExclusiveArch: %{rust_arches}
- rust-quick-error1
ExclusiveArch: %{rust_arches}
- rust-quick-xml
ExclusiveArch: %{rust_arches}
- rust-quick-xml0.20
ExclusiveArch: %{rust_arches}
- rust-quickcheck
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.6
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.9
ExclusiveArch: %{rust_arches}
- rust-quickcheck_macros
ExclusiveArch: %{rust_arches}
- rust-quickersort
ExclusiveArch: %{rust_arches}
- rust-quote
ExclusiveArch: %{rust_arches}
- rust-quote0.3
ExclusiveArch: %{rust_arches}
- rust-quote0.6
ExclusiveArch: %{rust_arches}
- rust-quoted_printable
ExclusiveArch: %{rust_arches}
- rust-r2d2
ExclusiveArch: %{rust_arches}
- rust-radium
ExclusiveArch: %{rust_arches}
- rust-radix_trie
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand0.4
ExclusiveArch: %{rust_arches}
- rust-rand0.5
ExclusiveArch: %{rust_arches}
- rust-rand0.6
ExclusiveArch: %{rust_arches}
- rust-rand0.7
ExclusiveArch: %{rust_arches}
- rust-rand_chacha
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.1
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.2
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rand_core0.3
ExclusiveArch: %{rust_arches}
- rust-rand_core0.4
ExclusiveArch: %{rust_arches}
- rust-rand_core0.5
ExclusiveArch: %{rust_arches}
- rust-rand_distr
ExclusiveArch: %{rust_arches}
- rust-rand_distr0.2
ExclusiveArch: %{rust_arches}
- rust-rand_hc
ExclusiveArch: %{rust_arches}
- rust-rand_hc0.1
ExclusiveArch: %{rust_arches}
- rust-rand_isaac
ExclusiveArch: %{rust_arches}
- rust-rand_isaac0.1
ExclusiveArch: %{rust_arches}
- rust-rand_jitter
ExclusiveArch: %{rust_arches}
- rust-rand_jitter0.1
ExclusiveArch: %{rust_arches}
- rust-rand_os
ExclusiveArch: %{rust_arches}
- rust-rand_os0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.2
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift0.1
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift0.2
ExclusiveArch: %{rust_arches}
- rust-rand_xoshiro
ExclusiveArch: %{rust_arches}
- rust-random-fast-rng
ExclusiveArch: %{rust_arches}
- rust-random-trait
ExclusiveArch: %{rust_arches}
- rust-randomize
ExclusiveArch: %{rust_arches}
- rust-rav1e
ExclusiveArch: %{rust_arches}
- rust-raw-window-handle
ExclusiveArch: %{rust_arches}
- rust-rawpointer
ExclusiveArch: %{rust_arches}
- rust-rawslice
ExclusiveArch: %{rust_arches}
- rust-rayon
ExclusiveArch: %{rust_arches}
- rust-rayon-core
ExclusiveArch: %{rust_arches}
- rust-read_input
ExclusiveArch: %{rust_arches}
- rust-readability-fork
ExclusiveArch: %{rust_arches}
- rust-readwrite
ExclusiveArch: %{rust_arches}
- rust-recycler
ExclusiveArch: %{rust_arches}
- rust-ref-cast
ExclusiveArch: %{rust_arches}
- rust-ref-cast-impl
ExclusiveArch: %{rust_arches}
- rust-regalloc
ExclusiveArch: %{rust_arches}
- rust-regex
ExclusiveArch: %{rust_arches}
- rust-regex-automata
ExclusiveArch: %{rust_arches}
- rust-regex-syntax
ExclusiveArch: %{rust_arches}
- rust-region
ExclusiveArch: %{rust_arches}
- rust-relative-path
ExclusiveArch: %{rust_arches}
- rust-relay
ExclusiveArch: %{rust_arches}
- rust-remove_dir_all
ExclusiveArch: %{rust_arches}
- rust-reqwest
ExclusiveArch: %{rust_arches}
- rust-reqwest0.10
ExclusiveArch: %{rust_arches}
- rust-resize
ExclusiveArch: %{rust_arches}
- rust-resolv-conf
ExclusiveArch: %{rust_arches}
- rust-restson
ExclusiveArch: %{rust_arches}
- rust-retry
ExclusiveArch: %{rust_arches}
- rust-rgb
ExclusiveArch: %{rust_arches}
- rust-ring
ExclusiveArch: %{rust_arches}
- rust-ripgrep
ExclusiveArch: %{rust_arches}
- rust-rle-decode-fast
ExclusiveArch: %{rust_arches}
- rust-rmp
ExclusiveArch: %{rust_arches}
- rust-rmp-serde
ExclusiveArch: %{rust_arches}
- rust-roff
ExclusiveArch: %{rust_arches}
- rust-ron
ExclusiveArch: %{rust_arches}
- rust-roxmltree
ExclusiveArch: %{rust_arches}
- rust-rpassword
ExclusiveArch: %{rust_arches}
- rust-rpick
ExclusiveArch: %{rust_arches}
- rust-rsa
ExclusiveArch: %{rust_arches}
- rust-rspec
ExclusiveArch: %{rust_arches}
- rust-rtnetlink
ExclusiveArch: %{rust_arches}
- rust-rudo
ExclusiveArch: %{rust_arches}
- rust-ruma
ExclusiveArch: %{rust_arches}
- rust-ruma-api
ExclusiveArch: %{rust_arches}
- rust-ruma-api-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-appservice-api
ExclusiveArch: %{rust_arches}
- rust-ruma-client-api
ExclusiveArch: %{rust_arches}
- rust-ruma-common
ExclusiveArch: %{rust_arches}
- rust-ruma-events
ExclusiveArch: %{rust_arches}
- rust-ruma-events-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-federation-api
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-validation
ExclusiveArch: %{rust_arches}
- rust-ruma-identity-service-api
ExclusiveArch: %{rust_arches}
- rust-ruma-push-gateway-api
ExclusiveArch: %{rust_arches}
- rust-ruma-serde
ExclusiveArch: %{rust_arches}
- rust-ruma-serde-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-signatures
ExclusiveArch: %{rust_arches}
- rust-rusqlite
ExclusiveArch: %{rust_arches}
- rust-rust-embed
ExclusiveArch: %{rust_arches}
- rust-rust-embed-impl
ExclusiveArch: %{rust_arches}
- rust-rust-embed-utils
ExclusiveArch: %{rust_arches}
- rust-rust-ini
ExclusiveArch: %{rust_arches}
- rust-rust-stemmers
ExclusiveArch: %{rust_arches}
- rust-rust_decimal
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_normal_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_sys
ExclusiveArch: %{rust_arches}
- rust-rustc-demangle
ExclusiveArch: %{rust_arches}
- rust-rustc-hash
ExclusiveArch: %{rust_arches}
- rust-rustc-serialize
ExclusiveArch: %{rust_arches}
- rust-rustc-test
ExclusiveArch: %{rust_arches}
- rust-rustc_tools_util
ExclusiveArch: %{rust_arches}
- rust-rustc_version
ExclusiveArch: %{rust_arches}
- rust-rustdoc-stripper
ExclusiveArch: %{rust_arches}
- rust-rustfilt
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-rustio
ExclusiveArch: %{rust_arches}
- rust-rustls
ExclusiveArch: %{rust_arches}
- rust-rustls-native-certs
ExclusiveArch: %{rust_arches}
- rust-rustversion
ExclusiveArch: %{rust_arches}
- rust-rusty-fork
ExclusiveArch: %{rust_arches}
- rust-rustyline
ExclusiveArch: %{rust_arches}
- rust-rustyline-derive
ExclusiveArch: %{rust_arches}
- rust-ryu
ExclusiveArch: %{rust_arches}
- rust-safe-transmute
ExclusiveArch: %{rust_arches}
- rust-safemem
ExclusiveArch: %{rust_arches}
- rust-same-file
ExclusiveArch: %{rust_arches}
- rust-sapp-kms
ExclusiveArch: %{rust_arches}
- rust-sapp-linux
ExclusiveArch: %{rust_arches}
- rust-sass-rs
ExclusiveArch: %{rust_arches}
- rust-sass-sys
ExclusiveArch: %{rust_arches}
- rust-scan_fmt
ExclusiveArch: %{rust_arches}
- rust-scheduled-thread-pool
ExclusiveArch: %{rust_arches}
- rust-scoped-tls
ExclusiveArch: %{rust_arches}
- rust-scoped-tls-hkt
ExclusiveArch: %{rust_arches}
- rust-scoped_threadpool
ExclusiveArch: %{rust_arches}
- rust-scopeguard
ExclusiveArch: %{rust_arches}
- rust-scopetime
ExclusiveArch: %{rust_arches}
- rust-scratch
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-scroll_derive
ExclusiveArch: %{rust_arches}
- rust-sct
ExclusiveArch: %{rust_arches}
- rust-sd
ExclusiveArch: %{rust_arches}
- rust-sd-notify
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-seahash3
ExclusiveArch: %{rust_arches}
- rust-secrecy
ExclusiveArch: %{rust_arches}
- rust-secret-service
ExclusiveArch: %{rust_arches}
- rust-semver
ExclusiveArch: %{rust_arches}
- rust-semver-parser
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.7
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.9
ExclusiveArch: %{rust_arches}
- rust-semver0.10
ExclusiveArch: %{rust_arches}
- rust-semver0.9
ExclusiveArch: %{rust_arches}
- rust-sequoia-autocrypt
ExclusiveArch: %{rust_arches}
- rust-sequoia-ipc
ExclusiveArch: %{rust_arches}
- rust-sequoia-keyring-linter
ExclusiveArch: %{rust_arches}
- rust-sequoia-net
ExclusiveArch: %{rust_arches}
- rust-sequoia-octopus-librnp
ExclusiveArch: %{rust_arches}
- rust-sequoia-openpgp
ExclusiveArch: %{rust_arches}
- rust-sequoia-sop
ExclusiveArch: %{rust_arches}
- rust-sequoia-sq
ExclusiveArch: %{rust_arches}
- rust-sequoia-sqv
ExclusiveArch: %{rust_arches}
- rust-serde
ExclusiveArch: %{rust_arches}
- rust-serde-big-array
ExclusiveArch: %{rust_arches}
- rust-serde-pickle
ExclusiveArch: %{rust_arches}
- rust-serde-value
ExclusiveArch: %{rust_arches}
- rust-serde-xml-rs
ExclusiveArch: %{rust_arches}
- rust-serde_bytes
ExclusiveArch: %{rust_arches}
- rust-serde_cbor
ExclusiveArch: %{rust_arches}
- rust-serde_derive
ExclusiveArch: %{rust_arches}
- rust-serde_fmt
ExclusiveArch: %{rust_arches}
- rust-serde_ignored
ExclusiveArch: %{rust_arches}
- rust-serde_json
ExclusiveArch: %{rust_arches}
- rust-serde_repr
ExclusiveArch: %{rust_arches}
- rust-serde_stacker
ExclusiveArch: %{rust_arches}
- rust-serde_test
ExclusiveArch: %{rust_arches}
- rust-serde_url_params
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded0.6
ExclusiveArch: %{rust_arches}
- rust-serde_with_macros
ExclusiveArch: %{rust_arches}
- rust-serde_yaml
ExclusiveArch: %{rust_arches}
- rust-serial-core
ExclusiveArch: %{rust_arches}
- rust-serial_test
ExclusiveArch: %{rust_arches}
- rust-serial_test_derive
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig-sys
ExclusiveArch: %{rust_arches}
- rust-sev
ExclusiveArch: %{rust_arches}
- rust-sevctl
ExclusiveArch: %{rust_arches}
- rust-sha-1
ExclusiveArch: %{rust_arches}
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-sha1collisiondetection
ExclusiveArch: %{rust_arches}
- rust-sha2
ExclusiveArch: %{rust_arches}
- rust-sha3
ExclusiveArch: %{rust_arches}
- rust-shadow-rs
ExclusiveArch: %{rust_arches}
- rust-shared_child
ExclusiveArch: %{rust_arches}
- rust-shared_library
ExclusiveArch: %{rust_arches}
- rust-shell-escape
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shellexpand
ExclusiveArch: %{rust_arches}
- rust-shellwords
ExclusiveArch: %{rust_arches}
- rust-shlex
ExclusiveArch: %{rust_arches}
- rust-signal-hook
ExclusiveArch: %{rust_arches}
- rust-signal-hook-registry
ExclusiveArch: %{rust_arches}
- rust-signal-hook0.1
ExclusiveArch: %{rust_arches}
- rust-silver
ExclusiveArch: %{rust_arches}
- rust-simba
ExclusiveArch: %{rust_arches}
- rust-simd_helpers
ExclusiveArch: %{rust_arches}
- rust-simple_asn1
ExclusiveArch: %{rust_arches}
- rust-simple_logger
ExclusiveArch: %{rust_arches}
- rust-simplelog
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-size
ExclusiveArch: %{rust_arches}
- rust-sized-chunks
ExclusiveArch: %{rust_arches}
- rust-skeptic
ExclusiveArch: %{rust_arches}
- rust-skim
ExclusiveArch: %{rust_arches}
- rust-slab
ExclusiveArch: %{rust_arches}
- rust-slash-formatter
ExclusiveArch: %{rust_arches}
- rust-slice-deque
ExclusiveArch: %{rust_arches}
- rust-slog
ExclusiveArch: %{rust_arches}
- rust-slog-async
ExclusiveArch: %{rust_arches}
- rust-slog-scope
ExclusiveArch: %{rust_arches}
- rust-slog-term
ExclusiveArch: %{rust_arches}
- rust-slotmap
ExclusiveArch: %{rust_arches}
- rust-slug
ExclusiveArch: %{rust_arches}
- rust-sluice
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-smart-default
ExclusiveArch: %{rust_arches}
- rust-smawk
ExclusiveArch: %{rust_arches}
- rust-smithay-client-toolkit
ExclusiveArch: %{rust_arches}
- rust-smithay-clipboard
ExclusiveArch: %{rust_arches}
- rust-snafu
ExclusiveArch: %{rust_arches}
- rust-snafu-derive
ExclusiveArch: %{rust_arches}
- rust-snake_case
ExclusiveArch: %{rust_arches}
- rust-snowflake
ExclusiveArch: %{rust_arches}
- rust-socket2
ExclusiveArch: %{rust_arches}
- rust-socket2_0.3
ExclusiveArch: %{rust_arches}
- rust-sop
ExclusiveArch: %{rust_arches}
- rust-soup-sys
ExclusiveArch: %{rust_arches}
- rust-sourceview
ExclusiveArch: %{rust_arches}
- rust-spin
ExclusiveArch: %{rust_arches}
- rust-spin_on
ExclusiveArch: %{rust_arches}
- rust-spinning_top
ExclusiveArch: %{rust_arches}
- rust-spmc
ExclusiveArch: %{rust_arches}
- rust-ssh-key-dir
ExclusiveArch: %{rust_arches}
- rust-stable_deref_trait
ExclusiveArch: %{rust_arches}
- rust-stacker
ExclusiveArch: %{rust_arches}
- rust-standback
ExclusiveArch: %{rust_arches}
- rust-starship
ExclusiveArch: %{rust_arches}
- rust-starship_module_config_derive
ExclusiveArch: %{rust_arches}
- rust-static_assertions
ExclusiveArch: %{rust_arches}
- rust-statistical
ExclusiveArch: %{rust_arches}
- rust-stb_truetype
ExclusiveArch: %{rust_arches}
- rust-stderrlog
ExclusiveArch: %{rust_arches}
- rust-streaming-stats
ExclusiveArch: %{rust_arches}
- rust-string
ExclusiveArch: %{rust_arches}
- rust-string_cache
ExclusiveArch: %{rust_arches}
- rust-string_cache_codegen
ExclusiveArch: %{rust_arches}
- rust-string_cache_shared
ExclusiveArch: %{rust_arches}
- rust-strings
ExclusiveArch: %{rust_arches}
- rust-strip-ansi-escapes
ExclusiveArch: %{rust_arches}
- rust-strong-xml
ExclusiveArch: %{rust_arches}
- rust-strong-xml-derive
ExclusiveArch: %{rust_arches}
- rust-strsim
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-structopt-derive
ExclusiveArch: %{rust_arches}
- rust-structopt-derive0.2
ExclusiveArch: %{rust_arches}
- rust-structopt0.2
ExclusiveArch: %{rust_arches}
- rust-strum
ExclusiveArch: %{rust_arches}
- rust-strum_macros
ExclusiveArch: %{rust_arches}
- rust-subtle
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin-sys
ExclusiveArch: %{rust_arches}
- rust-sval
ExclusiveArch: %{rust_arches}
- rust-sval_derive
ExclusiveArch: %{rust_arches}
- rust-sval_json
ExclusiveArch: %{rust_arches}
- rust-svg_metadata
ExclusiveArch: %{rust_arches}
- rust-svgtypes
ExclusiveArch: %{rust_arches}
- rust-sxd-document
ExclusiveArch: %{rust_arches}
- rust-syn
ExclusiveArch: %{rust_arches}
- rust-syn-mid
ExclusiveArch: %{rust_arches}
- rust-syn0.15
ExclusiveArch: %{rust_arches}
- rust-synom
ExclusiveArch: %{rust_arches}
- rust-synstructure
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-sys-info
ExclusiveArch: %{rust_arches}
- rust-sysinfo
ExclusiveArch: %{rust_arches}
- rust-syslog
ExclusiveArch: %{rust_arches}
- rust-system-deps
ExclusiveArch: %{rust_arches}
- rust-systemd
ExclusiveArch: %{rust_arches}
- rust-tabular
ExclusiveArch: %{rust_arches}
- rust-tabwriter
ExclusiveArch: %{rust_arches}
- rust-take
ExclusiveArch: %{rust_arches}
- rust-take_mut
ExclusiveArch: %{rust_arches}
- rust-takeable
ExclusiveArch: %{rust_arches}
- rust-tap
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-target
ExclusiveArch: %{rust_arches}
- rust-target-lexicon
ExclusiveArch: %{rust_arches}
- rust-tealdeer
ExclusiveArch: %{rust_arches}
- rust-teloxide
ExclusiveArch: %{rust_arches}
- rust-teloxide-macros
ExclusiveArch: %{rust_arches}
- rust-tempdir
ExclusiveArch: %{rust_arches}
- rust-tempfile
ExclusiveArch: %{rust_arches}
- rust-tendril
ExclusiveArch: %{rust_arches}
- rust-tera
ExclusiveArch: %{rust_arches}
- rust-term
ExclusiveArch: %{rust_arches}
- rust-term_grid
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termcolor
ExclusiveArch: %{rust_arches}
- rust-terminal_size
ExclusiveArch: %{rust_arches}
- rust-terminfo
ExclusiveArch: %{rust_arches}
- rust-termion
ExclusiveArch: %{rust_arches}
- rust-termios
ExclusiveArch: %{rust_arches}
- rust-test-assembler
ExclusiveArch: %{rust_arches}
- rust-tester
ExclusiveArch: %{rust_arches}
- rust-testing_logger
ExclusiveArch: %{rust_arches}
- rust-textwrap
ExclusiveArch: %{rust_arches}
- rust-textwrap0.11
ExclusiveArch: %{rust_arches}
- rust-textwrap0.12
ExclusiveArch: %{rust_arches}
- rust-thiserror
ExclusiveArch: %{rust_arches}
- rust-thiserror-impl
ExclusiveArch: %{rust_arches}
- rust-thread-id
ExclusiveArch: %{rust_arches}
- rust-thread-scoped
ExclusiveArch: %{rust_arches}
- rust-thread_local
ExclusiveArch: %{rust_arches}
- rust-threadpool
ExclusiveArch: %{rust_arches}
- rust-tiff
ExclusiveArch: %{rust_arches}
- rust-tiger-digest
ExclusiveArch: %{rust_arches}
- rust-time
ExclusiveArch: %{rust_arches}
- rust-time-macros
ExclusiveArch: %{rust_arches}
- rust-time-macros-impl
ExclusiveArch: %{rust_arches}
- rust-time0.1
ExclusiveArch: %{rust_arches}
- rust-timebomb
ExclusiveArch: %{rust_arches}
- rust-timer
ExclusiveArch: %{rust_arches}
- rust-timerfd
ExclusiveArch: %{rust_arches}
- rust-tiny-keccak
ExclusiveArch: %{rust_arches}
- rust-tiny_http
ExclusiveArch: %{rust_arches}
- rust-tinyfiledialogs
ExclusiveArch: %{rust_arches}
- rust-tinytemplate
ExclusiveArch: %{rust_arches}
- rust-tinyvec
ExclusiveArch: %{rust_arches}
- rust-tinyvec_macros
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio
ExclusiveArch: %{rust_arches}
- rust-tokio-codec
ExclusiveArch: %{rust_arches}
- rust-tokio-core
ExclusiveArch: %{rust_arches}
- rust-tokio-current-thread
ExclusiveArch: %{rust_arches}
- rust-tokio-executor
ExclusiveArch: %{rust_arches}
- rust-tokio-fs
ExclusiveArch: %{rust_arches}
- rust-tokio-io
ExclusiveArch: %{rust_arches}
- rust-tokio-io-pool
ExclusiveArch: %{rust_arches}
- rust-tokio-macros
ExclusiveArch: %{rust_arches}
- rust-tokio-macros0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-mock-task
ExclusiveArch: %{rust_arches}
- rust-tokio-native-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl0.4
ExclusiveArch: %{rust_arches}
- rust-tokio-reactor
ExclusiveArch: %{rust_arches}
- rust-tokio-rustls
ExclusiveArch: %{rust_arches}
- rust-tokio-socks
ExclusiveArch: %{rust_arches}
- rust-tokio-socks0.3
ExclusiveArch: %{rust_arches}
- rust-tokio-stream
ExclusiveArch: %{rust_arches}
- rust-tokio-sync
ExclusiveArch: %{rust_arches}
- rust-tokio-tcp
ExclusiveArch: %{rust_arches}
- rust-tokio-test
ExclusiveArch: %{rust_arches}
- rust-tokio-threadpool
ExclusiveArch: %{rust_arches}
- rust-tokio-timer
ExclusiveArch: %{rust_arches}
- rust-tokio-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-tls0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-tungstenite
ExclusiveArch: %{rust_arches}
- rust-tokio-udp
ExclusiveArch: %{rust_arches}
- rust-tokio-uds
ExclusiveArch: %{rust_arches}
- rust-tokio-util
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.3
ExclusiveArch: %{rust_arches}
- rust-tokio0.1
ExclusiveArch: %{rust_arches}
- rust-tokio0.2
ExclusiveArch: %{rust_arches}
- rust-toml
ExclusiveArch: %{rust_arches}
- rust-toml0.4
ExclusiveArch: %{rust_arches}
- rust-tower-layer
ExclusiveArch: %{rust_arches}
- rust-tower-service
ExclusiveArch: %{rust_arches}
- rust-tower-test
ExclusiveArch: %{rust_arches}
- rust-tower-util
ExclusiveArch: %{rust_arches}
- rust-tpm2-policy
ExclusiveArch: %{rust_arches}
- rust-tracing
ExclusiveArch: %{rust_arches}
- rust-tracing-attributes
ExclusiveArch: %{rust_arches}
- rust-tracing-core
ExclusiveArch: %{rust_arches}
- rust-tracing-futures
ExclusiveArch: %{rust_arches}
- rust-traitobject
ExclusiveArch: %{rust_arches}
- rust-treebitmap
ExclusiveArch: %{rust_arches}
- rust-treeline
ExclusiveArch: %{rust_arches}
- rust-trust-dns-https
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-rustls
ExclusiveArch: %{rust_arches}
- rust-try-lock
ExclusiveArch: %{rust_arches}
- rust-try_from
ExclusiveArch: %{rust_arches}
- rust-try_or
ExclusiveArch: %{rust_arches}
- rust-trybuild
ExclusiveArch: %{rust_arches}
- rust-tss-esapi
ExclusiveArch: %{rust_arches}
- rust-tss-esapi-sys
ExclusiveArch: %{rust_arches}
- rust-ttf-parser
ExclusiveArch: %{rust_arches}
- rust-tui
ExclusiveArch: %{rust_arches}
- rust-tui-react
ExclusiveArch: %{rust_arches}
- rust-tui0.11
ExclusiveArch: %{rust_arches}
- rust-tui0.9
ExclusiveArch: %{rust_arches}
- rust-tuikit
ExclusiveArch: %{rust_arches}
- rust-tungstenite
ExclusiveArch: %{rust_arches}
- rust-twoway
ExclusiveArch: %{rust_arches}
- rust-typeable
ExclusiveArch: %{rust_arches}
- rust-typed-arena
ExclusiveArch: %{rust_arches}
- rust-typemap
ExclusiveArch: %{rust_arches}
- rust-typenum
ExclusiveArch: %{rust_arches}
- rust-typetag
ExclusiveArch: %{rust_arches}
- rust-typetag-impl
ExclusiveArch: %{rust_arches}
- rust-tzfile
ExclusiveArch: %{rust_arches}
- rust-ucd-parse
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-ucd-util
ExclusiveArch: %{rust_arches}
- rust-unchecked-index
ExclusiveArch: %{rust_arches}
- rust-unescape
ExclusiveArch: %{rust_arches}
- rust-unic-char-property
ExclusiveArch: %{rust_arches}
- rust-unic-char-range
ExclusiveArch: %{rust_arches}
- rust-unic-common
ExclusiveArch: %{rust_arches}
- rust-unic-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-category
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-common
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-version
ExclusiveArch: %{rust_arches}
- rust-unicase
ExclusiveArch: %{rust_arches}
- rust-unicase1
ExclusiveArch: %{rust_arches}
- rust-unicode-bidi
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-segmentation
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-unicode-xid0.1
ExclusiveArch: %{rust_arches}
- rust-unicode_categories
ExclusiveArch: %{rust_arches}
- rust-unindent
ExclusiveArch: %{rust_arches}
- rust-universal-hash
ExclusiveArch: %{rust_arches}
- rust-unix_socket
ExclusiveArch: %{rust_arches}
- rust-unreachable
ExclusiveArch: %{rust_arches}
- rust-unsafe-any
ExclusiveArch: %{rust_arches}
- rust-unsafe-io
ExclusiveArch: %{rust_arches}
- rust-untrusted
ExclusiveArch: %{rust_arches}
- rust-uom
ExclusiveArch: %{rust_arches}
- rust-url
ExclusiveArch: %{rust_arches}
- rust-url1
ExclusiveArch: %{rust_arches}
- rust-url_serde
ExclusiveArch: %{rust_arches}
- rust-urlencoding
ExclusiveArch: %{rust_arches}
- rust-urlocator
ExclusiveArch: %{rust_arches}
- rust-urlshortener
ExclusiveArch: %{rust_arches}
- rust-users
ExclusiveArch: %{rust_arches}
- rust-users0.10
ExclusiveArch: %{rust_arches}
- rust-utf-8
ExclusiveArch: %{rust_arches}
- rust-utf8-cstr
ExclusiveArch: %{rust_arches}
- rust-utf8-ranges
ExclusiveArch: %{rust_arches}
- rust-utf8-width
ExclusiveArch: %{rust_arches}
- rust-utf8parse
ExclusiveArch: %{rust_arches}
- rust-uuid
ExclusiveArch: %{rust_arches}
- rust-uuid0.7
ExclusiveArch: %{rust_arches}
- rust-v_escape
ExclusiveArch: %{rust_arches}
- rust-v_escape_derive
ExclusiveArch: %{rust_arches}
- rust-v_frame
ExclusiveArch: %{rust_arches}
- rust-v_htmlescape
ExclusiveArch: %{rust_arches}
- rust-value-bag
ExclusiveArch: %{rust_arches}
- rust-varlink
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-varlink_stdinterfaces
ExclusiveArch: %{rust_arches}
- rust-vcpkg
ExclusiveArch: %{rust_arches}
- rust-vec-arena
ExclusiveArch: %{rust_arches}
- rust-vec_map
ExclusiveArch: %{rust_arches}
- rust-vergen
ExclusiveArch: %{rust_arches}
- rust-version
ExclusiveArch: %{rust_arches}
- rust-version-compare
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version-sync0.8
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-versions
ExclusiveArch: %{rust_arches}
- rust-virtio-bindings
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vm-memory
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vmm-sys-util
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vmw_backdoor
ExclusiveArch: %{rust_arches}
- rust-void
ExclusiveArch: %{rust_arches}
- rust-vsprintf
ExclusiveArch: %{rust_arches}
- rust-vte
ExclusiveArch: %{rust_arches}
- rust-vte0.3
ExclusiveArch: %{rust_arches}
- rust-vte_generate_state_changes
ExclusiveArch: %{rust_arches}
- rust-wait-timeout
ExclusiveArch: %{rust_arches}
- rust-waker-fn
ExclusiveArch: %{rust_arches}
- rust-walkdir
ExclusiveArch: %{rust_arches}
- rust-want
ExclusiveArch: %{rust_arches}
- rust-warp
ExclusiveArch: %{rust_arches}
- rust-warp0.2
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-backend
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-futures
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro-support
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-shared
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-test
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-test-macro
ExclusiveArch: %{rust_arches}
- rust-wasmer_enumset
ExclusiveArch: %{rust_arches}
- rust-wasmer_enumset_derive
ExclusiveArch: %{rust_arches}
- rust-wasmparser
ExclusiveArch: %{rust_arches}
- rust-wasmtime-cache
ExclusiveArch: %{rust_arches}
- rust-wasmtime-environ
ExclusiveArch: %{rust_arches}
- rust-wasmtime-fiber
ExclusiveArch: %{rust_arches}
- rust-wast
ExclusiveArch: %{rust_arches}
- rust-wat
ExclusiveArch: %{rust_arches}
- rust-wayland-client
ExclusiveArch: %{rust_arches}
- rust-wayland-commons
ExclusiveArch: %{rust_arches}
- rust-wayland-cursor
ExclusiveArch: %{rust_arches}
- rust-wayland-egl
ExclusiveArch: %{rust_arches}
- rust-wayland-protocols
ExclusiveArch: %{rust_arches}
- rust-wayland-scanner
ExclusiveArch: %{rust_arches}
- rust-wayland-server
ExclusiveArch: %{rust_arches}
- rust-wayland-sys
ExclusiveArch: %{rust_arches}
- rust-web-sys
ExclusiveArch: %{rust_arches}
- rust-webbrowser
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk-sys
ExclusiveArch: %{rust_arches}
- rust-webpki
ExclusiveArch: %{rust_arches}
- rust-webpki-roots
ExclusiveArch: %{rust_arches}
- rust-websocket
ExclusiveArch: %{rust_arches}
- rust-websocket-base
ExclusiveArch: %{rust_arches}
- rust-weezl
ExclusiveArch: %{rust_arches}
- rust-which
ExclusiveArch: %{rust_arches}
- rust-wild
ExclusiveArch: %{rust_arches}
- rust-wildmatch
ExclusiveArch: %{rust_arches}
- rust-winit
ExclusiveArch: %{rust_arches}
- rust-witx
ExclusiveArch: %{rust_arches}
- rust-ws
ExclusiveArch: %{rust_arches}
- rust-wyz
ExclusiveArch: %{rust_arches}
- rust-x11
ExclusiveArch: %{rust_arches}
- rust-x11-clipboard
ExclusiveArch: %{rust_arches}
- rust-x11-dl
ExclusiveArch: %{rust_arches}
- rust-xattr
ExclusiveArch: %{rust_arches}
- rust-xcb
ExclusiveArch: %{rust_arches}
- rust-xcursor
ExclusiveArch: %{rust_arches}
- rust-xdg
ExclusiveArch: %{rust_arches}
- rust-xi-unicode
ExclusiveArch: %{rust_arches}
- rust-xkbcommon
ExclusiveArch: %{rust_arches}
- rust-xml-rs
ExclusiveArch: %{rust_arches}
- rust-xml5ever
ExclusiveArch: %{rust_arches}
- rust-xmlparser
ExclusiveArch: %{rust_arches}
- rust-xmltree
ExclusiveArch: %{rust_arches}
- rust-xmlwriter
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-y4m
ExclusiveArch: %{rust_arches}
- rust-yaml-rust
ExclusiveArch: %{rust_arches}
- rust-yaml-rust0.3
ExclusiveArch: %{rust_arches}
- rust-ybaas
ExclusiveArch: %{rust_arches}
- rust-ytop
ExclusiveArch: %{rust_arches}
- rust-yubibomb
ExclusiveArch: %{rust_arches}
- rust-yup-oauth2
ExclusiveArch: %{rust_arches}
- rust-zbase32
ExclusiveArch: %{rust_arches}
- rust-zbus
ExclusiveArch: %{rust_arches}
- rust-zbus_macros
ExclusiveArch: %{rust_arches}
- rust-zcomponents
ExclusiveArch: %{rust_arches}
- rust-zeroize
ExclusiveArch: %{rust_arches}
- rust-zeroize_derive
ExclusiveArch: %{rust_arches}
- rust-zincati
ExclusiveArch: %{rust_arches}
- rust-zip
ExclusiveArch: %{rust_arches}
- rust-zoneinfo_compiled
ExclusiveArch: %{rust_arches}
- rust-zopfli
ExclusiveArch: %{rust_arches}
- rust-zoxide
ExclusiveArch: %{rust_arches}
- rust-zram-generator
ExclusiveArch: %{rust_arches}
- rust-zstd
ExclusiveArch: %{rust_arches}
- rust-zstd-safe
ExclusiveArch: %{rust_arches}
- rust-zstd-sys
ExclusiveArch: %{rust_arches}
- rust-zvariant
ExclusiveArch: %{rust_arches}
- rust-zvariant_derive
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- sagemath
ExclusiveArch: aarch64 %{ix86} x86_64 ppc sparcv9
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x aarch64 ppc64le
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- seabios
ExclusiveArch: x86_64
- seadrive-gui
ExclusiveArch: %{qt5_qtwebengine_arches}
- seafile-client
ExclusiveArch: %{qt5_qtwebengine_arches}
- seamonkey
ExclusiveArch: x86_64
- seqan3
ExclusiveArch: %{power64} x86_64 aarch64
- servicelog
ExclusiveArch: ppc %{power64}
- sgabios
ExclusiveArch: %{ix86} x86_64
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- skychart
ExclusiveArch: %{fpc_arches}
- snapd
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- soup-sharp
ExclusiveArch: %{mono_arches}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- springlobby
ExclusiveArch: %{ix86} x86_64
- squeekboard
ExclusiveArch: %{rust_arches}
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stratisd
ExclusiveArch: %{rust_arches}
ExclusiveArch: ${rust_arches}
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- supercollider
ExclusiveArch: %{qt5_qtwebengine_arches}
- supermin
ExclusiveArch: %{kernel_arches}
- svt-av1
ExclusiveArch: x86_64
- svt-vp9
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64 aarch64
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64le s390x
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tarantool
ExclusiveArch: %{ix86} x86_64
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: x86_64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- ternimal
ExclusiveArch: %{rust_arches}
- testcloud
ExclusiveArch: %{kernel_arches} noarch
- themonospot-base
ExclusiveArch: %mono_arches
- themonospot-console
ExclusiveArch: %mono_arches
- themonospot-gui-gtk
ExclusiveArch: %mono_arches
- themonospot-plugin-avi
ExclusiveArch: %mono_arches
- themonospot-plugin-mkv
ExclusiveArch: %mono_arches
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tmux-top
ExclusiveArch: %{go_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- topojson-client
ExclusiveArch: %{nodejs_arches} noarch
- topojson-server
ExclusiveArch: %{nodejs_arches} noarch
- topojson-simplify
ExclusiveArch: %{nodejs_arches} noarch
- torbrowser-launcher
ExclusiveArch: %{ix86} x86_64
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- ugene
ExclusiveArch: %{ix86} x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
- uglify-js1
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- unetbootin
ExclusiveArch: %{ix86} x86_64
- ursa-major
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- usd
ExclusiveArch: x86_64
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- valgrind
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- virt-p2v
ExclusiveArch: x86_64
- virt-v2v
ExclusiveArch: x86_64
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- vkd3d
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- vmaf
ExclusiveArch: x86_64
- vmem
ExclusiveArch: x86_64
- vmemcache
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- vrq
ExclusiveArch: %{ix86} x86_64
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- webkit2-sharp
ExclusiveArch: %mono_arches
- wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: %{ix86} %{arm}
- wine-dxvk
ExclusiveArch: %{ix86} x86_64
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- xe-guest-utilities-latest
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: %{ix86} x86_64 armv7hl aarch64
- xmlada
ExclusiveArch: %{GPRbuild_arches}
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- yarnpkg
ExclusiveArch: %{nodejs_arches} noarch
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zig
ExclusiveArch: %{zig_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ng
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- zola
ExclusiveArch: %{rust_arches}
2 years, 9 months
Architecture specific change in rpms/pacemaker.git
by githook-noreply@fedoraproject.org
The package rpms/pacemaker.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/pacemaker.git/commit/?id=ff659f33....
Change:
+ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
Thanks.
Full change:
============
commit ff659f33b1a10be0fc84be2f519a2af514080094
Author: Klaus Wenninger <klaus.wenninger(a)aon.at>
Date: Mon Jul 5 18:38:43 2021 +0200
* Mon Jul 5 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-6
- synced/merged with CS9 spec-file for current 2.1.0-release build
diff --git a/001-ping-agent.patch b/001-ping-agent.patch
new file mode 100644
index 0000000..89fe41a
--- /dev/null
+++ b/001-ping-agent.patch
@@ -0,0 +1,225 @@
+From c6ee0973522268ed7b3241cf0ec2e06398444114 Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 4 May 2021 12:02:17 -0400
+Subject: [PATCH 1/4] Remove deprecated attrd_options
+
+---
+ extra/resources/ping | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index 3cf8dfe..2e93f22 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -178,7 +178,7 @@ ping_stop() {
+
+ rm -f "${OCF_RESKEY_pidfile}"
+
+- attrd_updater -D -n "$OCF_RESKEY_name" -d "$OCF_RESKEY_dampen" $attrd_options
++ attrd_updater -D -n "$OCF_RESKEY_name" -d "$OCF_RESKEY_dampen"
+
+ return $OCF_SUCCESS
+ }
+@@ -302,9 +302,9 @@ ping_update() {
+
+ score=$(expr $active \* $OCF_RESKEY_multiplier)
+ if [ "$__OCF_ACTION" = "start" ] ; then
+- attrd_updater -n "$OCF_RESKEY_name" -B "$score" -d "$OCF_RESKEY_dampen" $attrd_options
++ attrd_updater -n "$OCF_RESKEY_name" -B "$score" -d "$OCF_RESKEY_dampen"
+ else
+- attrd_updater -n "$OCF_RESKEY_name" -v "$score" -d "$OCF_RESKEY_dampen" $attrd_options
++ attrd_updater -n "$OCF_RESKEY_name" -v "$score" -d "$OCF_RESKEY_dampen"
+ fi
+ rc=$?
+ case $rc in
+@@ -396,11 +396,6 @@ case "${OCF_RESKEY_debug}" in
+ ;;
+ esac
+
+-attrd_options='-q'
+-if [ "${OCF_RESKEY_debug}" = "true" ]; then
+- attrd_options=''
+-fi
+-
+ case "$__OCF_ACTION" in
+ meta-data) meta_data
+ exit $OCF_SUCCESS
+--
+1.8.3.1
+
+
+From 6d6c4691cf0970059689856c354daf9e098b4451 Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 4 May 2021 14:50:37 -0400
+Subject: [PATCH 2/4] Replace debug values, true and false, with 0 and 1
+
+---
+ extra/resources/ping | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index 2e93f22..fee019b 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -24,7 +24,7 @@
+ : ${OCF_RESKEY_dampen:="5s"}
+ : ${OCF_RESKEY_attempts:="3"}
+ : ${OCF_RESKEY_multiplier:="1"}
+-: ${OCF_RESKEY_debug:="false"}
++: ${OCF_RESKEY_debug:="0"}
+ : ${OCF_RESKEY_failure_score:="0"}
+ : ${OCF_RESKEY_use_fping:="1"}
+ : ${OCF_RESKEY_host_list:=""}
+@@ -152,7 +152,7 @@ END
+
+ ping_conditional_log() {
+ level="$1"; shift
+- if [ "${OCF_RESKEY_debug}" = "true" ]; then
++ if [ $OCF_RESKEY_debug -gt 0 ]; then
+ ocf_log "$level" "$*"
+ fi
+ }
+@@ -388,8 +388,8 @@ fi
+
+ # Check the debug option
+ case "${OCF_RESKEY_debug}" in
+- true|True|TRUE|1) OCF_RESKEY_debug=true;;
+- false|False|FALSE|0) OCF_RESKEY_debug=false;;
++ true|True|TRUE|1) OCF_RESKEY_debug=0;;
++ false|False|FALSE|0) OCF_RESKEY_debug=1;;
+ *)
+ ocf_log warn "Value for 'debug' is incorrect. Please specify 'true' or 'false' not: ${OCF_RESKEY_debug}"
+ OCF_RESKEY_debug=false
+--
+1.8.3.1
+
+
+From a886a31056b6aca764c6911f5432af2c5ebf51df Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 11 May 2021 11:04:50 -0400
+Subject: [PATCH 3/4] Add verbose debug mode which logs ping and fping output
+ when set
+
+---
+ extra/resources/ping | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index fee019b..cc796af 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -249,10 +249,13 @@ fping_check() {
+
+ case $rc in
+ 0)
++ if [ $OCF_RESKEY_debug -gt 1 ]; then
++ ping_conditional_log info "$output"
++ fi
+ ;;
+ 1)
+ for h in $(echo "$output" | grep "is unreachable" | awk '{print $1}'); do
+- ping_conditional_log warn "$h is inactive"
++ ping_conditional_log warn "$h is inactive: $output"
+ done
+ ;;
+ *)
+@@ -282,7 +285,12 @@ ping_check() {
+ p_out=$($p_exe $p_args $OCF_RESKEY_options $host 2>&1); rc=$?
+
+ case $rc in
+- 0) active=$(expr $active + 1);;
++ 0)
++ active=$(expr $active + 1)
++ if [ $OCF_RESKEY_debug -gt 1 ]; then
++ ping_conditional_log info "$p_out"
++ fi
++ ;;
+ 1) ping_conditional_log warn "$host is inactive: $p_out";;
+ *) ocf_log err "Unexpected result for '$p_exe $p_args $OCF_RESKEY_options $host' $rc: $p_out";;
+ esac
+@@ -388,10 +396,11 @@ fi
+
+ # Check the debug option
+ case "${OCF_RESKEY_debug}" in
+- true|True|TRUE|1) OCF_RESKEY_debug=0;;
+- false|False|FALSE|0) OCF_RESKEY_debug=1;;
++ true|True|TRUE|1) OCF_RESKEY_debug=1;;
++ false|False|FALSE|0) OCF_RESKEY_debug=0;;
++ verbose|Verbose|VERBOSE|2) OCF_RESKEY_debug=2;;
+ *)
+- ocf_log warn "Value for 'debug' is incorrect. Please specify 'true' or 'false' not: ${OCF_RESKEY_debug}"
++ ocf_log warn "Value for 'debug' is incorrect. Please specify 'true', 'false', or 'verbose', not: ${OCF_RESKEY_debug}"
+ OCF_RESKEY_debug=false
+ ;;
+ esac
+--
+1.8.3.1
+
+
+From 460043f133ced80e923b1290af70502a72deb7f8 Mon Sep 17 00:00:00 2001
+From: Grace Chin <gchin(a)redhat.com>
+Date: Tue, 11 May 2021 11:07:05 -0400
+Subject: [PATCH 4/4] Improve variable names
+
+---
+ extra/resources/ping | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/extra/resources/ping b/extra/resources/ping
+index cc796af..9763b60 100755
+--- a/extra/resources/ping
++++ b/extra/resources/ping
+@@ -244,22 +244,22 @@ fping_check() {
+ timeout=$(expr $OCF_RESKEY_timeout \* 1000 / $OCF_RESKEY_attempts)
+
+ cmd="$p_exe -r $OCF_RESKEY_attempts -t $timeout -B 1.0 $OCF_RESKEY_options $OCF_RESKEY_host_list"
+- output=$($cmd 2>&1); rc=$?
+- active=$(echo "$output" | grep "is alive" | wc -l)
++ fping_output=$($cmd 2>&1); rc=$?
++ active=$(echo "$fping_output" | grep "is alive" | wc -l)
+
+ case $rc in
+ 0)
+ if [ $OCF_RESKEY_debug -gt 1 ]; then
+- ping_conditional_log info "$output"
++ ping_conditional_log info "$fping_output"
+ fi
+ ;;
+ 1)
+- for h in $(echo "$output" | grep "is unreachable" | awk '{print $1}'); do
+- ping_conditional_log warn "$h is inactive: $output"
++ for h in $(echo "$fping_output" | grep "is unreachable" | awk '{print $1}'); do
++ ping_conditional_log warn "$h is inactive: $fping_output"
+ done
+ ;;
+ *)
+- ocf_log err "Unexpected result for '$cmd' $rc: $(echo "$output" | tr '\n' ';')"
++ ocf_log err "Unexpected result for '$cmd' $rc: $(echo "$fping_output" | tr '\n' ';')"
+ ;;
+ esac
+
+@@ -282,17 +282,17 @@ ping_check() {
+ *:*) p_exe=ping6
+ esac
+
+- p_out=$($p_exe $p_args $OCF_RESKEY_options $host 2>&1); rc=$?
++ ping_output=$($p_exe $p_args $OCF_RESKEY_options $host 2>&1); rc=$?
+
+ case $rc in
+ 0)
+ active=$(expr $active + 1)
+ if [ $OCF_RESKEY_debug -gt 1 ]; then
+- ping_conditional_log info "$p_out"
++ ping_conditional_log info "$ping_output"
+ fi
+ ;;
+- 1) ping_conditional_log warn "$host is inactive: $p_out";;
+- *) ocf_log err "Unexpected result for '$p_exe $p_args $OCF_RESKEY_options $host' $rc: $p_out";;
++ 1) ping_conditional_log warn "$host is inactive: $ping_output";;
++ *) ocf_log err "Unexpected result for '$p_exe $p_args $OCF_RESKEY_options $host' $rc: $ping_output";;
+ esac
+ done
+ return $active
+--
+1.8.3.1
+
diff --git a/002-pacemakerd-options.patch b/002-pacemakerd-options.patch
new file mode 100644
index 0000000..56941ec
--- /dev/null
+++ b/002-pacemakerd-options.patch
@@ -0,0 +1,451 @@
+From 0d40ebf10b1794ece2c5c9768ea7222d3834d3b3 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 11:42:18 -0400
+Subject: [PATCH 1/4] Build: Use a different variable to find man page
+ includes.
+
+With other programs outside of the tools directory being converted to
+use glib for command line handling, their includes are not going to be
+in tools/. So we need to use a different autoconf variable to find
+them.
+---
+ mk/common.mk | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/mk/common.mk b/mk/common.mk
+index b247670..aa59feb 100644
+--- a/mk/common.mk
++++ b/mk/common.mk
+@@ -1,5 +1,5 @@
+ #
+-# Copyright 2014-2020 the Pacemaker project contributors
++# Copyright 2014-2021 the Pacemaker project contributors
+ #
+ # The version control history for this file may have further details.
+ #
+@@ -68,11 +68,11 @@ HELP2MAN_ARGS = -N --section 8 --name "Part of the Pacemaker cluster resource ma
+ # and all wrappers to C code.
+ %.8: % $(MAN8DEPS)
+ $(AM_V_at)chmod a+x $(abs_builddir)/$<
+- $(AM_V_MAN)if [ -f $(top_srcdir)/tools/$@.inc ]; then \
++ $(AM_V_MAN)if [ -f $(abs_srcdir)/$@.inc ]; then \
+ PATH=$(abs_builddir):$$PATH $(HELP2MAN) $(HELP2MAN_ARGS) \
+ -h --help-all \
+ --no-discard-stderr \
+- -i $(top_srcdir)/tools/$@.inc $(abs_builddir)/$< \
++ -i $(abs_srcdir)/$@.inc $(abs_builddir)/$< \
+ | sed -f $(top_srcdir)/tools/fix-manpages > $@ ; \
+ else \
+ PATH=$(abs_builddir):$$PATH $(HELP2MAN) $(HELP2MAN_ARGS) \
+--
+1.8.3.1
+
+
+From c7ab1d901bcbbf0137277e783e072777ca2f82d9 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 11:44:16 -0400
+Subject: [PATCH 2/4] Refactor: daemons: Remove the pid_file variable from
+ pacemakerd.
+
+It's never used anywhere.
+---
+ daemons/pacemakerd/pacemakerd.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index 8ec9708..03d688e 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -27,8 +27,7 @@
+
+ static crm_trigger_t *shutdown_trigger = NULL;
+ static crm_trigger_t *startup_trigger = NULL;
+-static const char *pid_file = PCMK_RUN_DIR "/pacemaker.pid";
+
+ /* state we report when asked via pacemakerd-api status-ping */
+ static const char *pacemakerd_state = XML_PING_ATTR_PACEMAKERDSTATE_INIT;
+ static gboolean running_with_sbd = FALSE; /* local copy */
+@@ -224,7 +222,6 @@ main(int argc, char **argv)
+ /* Legacy */
+ break;
+ case 'p':
+- pid_file = optarg;
+ break;
+ case 's':
+ pcmk__set_env_option("node_start_state", "standby");
+--
+1.8.3.1
+
+
+From 98990eed9f6a5dbde7c8a5aa0783e93d5479295b Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 13:14:38 -0400
+Subject: [PATCH 3/4] Refactor: daemons: Use glib for command line handling in
+ pacemakerd.
+
+---
+ daemons/pacemakerd/Makefile.am | 2 +
+ daemons/pacemakerd/pacemakerd.8.inc | 5 +
+ daemons/pacemakerd/pacemakerd.c | 195 ++++++++++++++++++------------------
+ 3 files changed, 102 insertions(+), 100 deletions(-)
+ create mode 100644 daemons/pacemakerd/pacemakerd.8.inc
+
+diff --git a/daemons/pacemakerd/Makefile.am b/daemons/pacemakerd/Makefile.am
+index cc657f5..84517a3 100644
+--- a/daemons/pacemakerd/Makefile.am
++++ b/daemons/pacemakerd/Makefile.am
+@@ -15,6 +15,8 @@ if BUILD_SYSTEMD
+ systemdsystemunit_DATA = pacemaker.service
+ endif
+
++EXTRA_DIST = pacemakerd.8.inc
++
+ ## SOURCES
+
+ noinst_HEADERS = pacemakerd.h
+diff --git a/daemons/pacemakerd/pacemakerd.8.inc b/daemons/pacemakerd/pacemakerd.8.inc
+new file mode 100644
+index 0000000..902af4e
+--- /dev/null
++++ b/daemons/pacemakerd/pacemakerd.8.inc
+@@ -0,0 +1,5 @@
++[synopsis]
++pacemakerd [options]
++
++/subsidiary Pacemaker daemons/
++.SH OPTIONS
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index 03d688e..ce194bf 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -23,12 +23,54 @@
+ #include <crm/msg_xml.h>
+ #include <crm/common/ipc_internal.h>
+ #include <crm/common/mainloop.h>
++#include <crm/common/cmdline_internal.h>
+ #include <crm/cluster/internal.h>
+ #include <crm/cluster.h>
+
+ #include <dirent.h>
+ #include <ctype.h>
+
++#define SUMMARY "pacemakerd - primary Pacemaker daemon that launches and monitors all subsidiary Pacemaker daemons"
++
++struct {
++ gboolean features;
++ gboolean foreground;
++ gboolean shutdown;
++ gboolean standby;
++} options;
++
++static gboolean
++pid_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
++ return TRUE;
++}
++
++static gboolean
++standby_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
++ options.standby = TRUE;
++ pcmk__set_env_option("node_start_state", "standby");
++ return TRUE;
++}
++
++static GOptionEntry entries[] = {
++ { "features", 'F', 0, G_OPTION_ARG_NONE, &options.features,
++ "Display full version and list of features Pacemaker was built with",
++ NULL },
++ { "foreground", 'f', 0, G_OPTION_ARG_NONE, &options.foreground,
++ "(Ignored) Pacemaker always runs in the foreground",
++ NULL },
++ { "pid-file", 'p', 0, G_OPTION_ARG_CALLBACK, pid_cb,
++ "(Ignored) Daemon pid file location",
++ "FILE" },
++ { "shutdown", 'S', 0, G_OPTION_ARG_NONE, &options.shutdown,
++ "Instruct Pacemaker to shutdown on this machine",
++ NULL },
++ { "standby", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, standby_cb,
++ "Start node in standby state",
++ NULL },
++
++ { NULL }
++};
++
+ static gboolean fatal_error = FALSE;
+ static GMainLoop *mainloop = NULL;
+ static bool global_keep_tracking = false;
+@@ -642,49 +685,6 @@ pcmk_sigquit(int nsig)
+ .connection_destroyed = pcmk_ipc_destroy
+ };
+
+-static pcmk__cli_option_t long_options[] = {
+- // long option, argument type, storage, short option, description, flags
+- {
+- "help", no_argument, NULL, '?',
+- "\tThis text", pcmk__option_default
+- },
+- {
+- "version", no_argument, NULL, '$',
+- "\tVersion information", pcmk__option_default
+- },
+- {
+- "verbose", no_argument, NULL, 'V',
+- "\tIncrease debug output", pcmk__option_default
+- },
+- {
+- "shutdown", no_argument, NULL, 'S',
+- "\tInstruct Pacemaker to shutdown on this machine", pcmk__option_default
+- },
+- {
+- "features", no_argument, NULL, 'F',
+- "\tDisplay full version and list of features Pacemaker was built with",
+- pcmk__option_default
+- },
+- {
+- "-spacer-", no_argument, NULL, '-',
+- "\nAdditional Options:", pcmk__option_default
+- },
+- {
+- "foreground", no_argument, NULL, 'f',
+- "\t(Ignored) Pacemaker always runs in the foreground",
+- pcmk__option_default
+- },
+- {
+- "pid-file", required_argument, NULL, 'p',
+- "\t(Ignored) Daemon pid file location", pcmk__option_default
+- },
+- {
+- "standby", no_argument, NULL, 's',
+- "\tStart node in standby state", pcmk__option_default
+- },
+- { 0, 0, 0, 0 }
+-};
+-
+ static void
+ mcp_chown(const char *path, uid_t uid, gid_t gid)
+ {
+@@ -1168,83 +1211,66 @@ request_shutdown(crm_ipc_t *ipc)
+ return status;
+ }
+
++static GOptionContext *
++build_arg_context(pcmk__common_args_t *args) {
++ GOptionContext *context = NULL;
++
++ context = pcmk__build_arg_context(args, NULL, NULL, NULL);
++ pcmk__add_main_args(context, entries);
++ return context;
++}
++
+ int
+ main(int argc, char **argv)
+ {
+- int flag;
+- int argerr = 0;
++ crm_exit_t exit_code = CRM_EX_OK;
++
++ GError *error = NULL;
++
++ pcmk__common_args_t *args = pcmk__new_common_args(SUMMARY);
++ gchar **processed_args = pcmk__cmdline_preproc(argv, "p");
++ GOptionContext *context = build_arg_context(args);
+
+- int option_index = 0;
+ bool old_instance_connected = false;
+- gboolean shutdown = FALSE;
+
+ crm_ipc_t *old_instance = NULL;
+ qb_ipcs_service_t *ipcs = NULL;
+
+ crm_log_preinit(NULL, argc, argv);
+- pcmk__set_cli_options(NULL, "[options]", long_options,
+- "primary Pacemaker daemon that launches and "
+- "monitors all subsidiary Pacemaker daemons");
+ mainloop_add_signal(SIGHUP, pcmk_ignore);
+ mainloop_add_signal(SIGQUIT, pcmk_sigquit);
+
+- while (1) {
+- flag = pcmk__next_cli_option(argc, argv, &option_index, NULL);
+- if (flag == -1)
+- break;
+-
+- switch (flag) {
+- case 'V':
+- crm_bump_log_level(argc, argv);
+- break;
+- case 'f':
+- /* Legacy */
+- break;
+- case 'p':
+- break;
+- case 's':
+- pcmk__set_env_option("node_start_state", "standby");
+- break;
+- case '$':
+- case '?':
+- pcmk__cli_help(flag, CRM_EX_OK);
+- break;
+- case 'S':
+- shutdown = TRUE;
+- break;
+- case 'F':
+- printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
+- CRM_FEATURE_SET, CRM_FEATURES);
+- crm_exit(CRM_EX_OK);
+- default:
+- printf("Argument code 0%o (%c) is not (?yet?) supported\n", flag, flag);
+- ++argerr;
+- break;
+- }
++ if (!g_option_context_parse_strv(context, &processed_args, &error)) {
++ exit_code = CRM_EX_USAGE;
++ goto done;
+ }
+
+- if (optind < argc) {
+- printf("non-option ARGV-elements: ");
+- while (optind < argc)
+- printf("%s ", argv[optind++]);
+- printf("\n");
+- }
+- if (argerr) {
+- pcmk__cli_help('?', CRM_EX_USAGE);
++ if (options.features) {
++ printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
++ CRM_FEATURE_SET, CRM_FEATURES);
++ exit_code = CRM_EX_OK;
++ goto done;
+ }
+
++ if (args->version) {
++ g_strfreev(processed_args);
++ pcmk__free_arg_context(context);
++ /* FIXME: When pacemakerd is converted to use formatted output, this can go. */
++ pcmk__cli_help('v', CRM_EX_USAGE);
++ }
+
+ setenv("LC_ALL", "C", 1);
+
+ pcmk__set_env_option("mcp", "true");
+
++ pcmk__cli_init_logging("pacemakerd", args->verbosity);
+ crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
+
+ crm_debug("Checking for existing Pacemaker instance");
+ old_instance = crm_ipc_new(CRM_SYSTEM_MCP, 0);
+ old_instance_connected = crm_ipc_connect(old_instance);
+
+- if (shutdown) {
++ if (options.shutdown) {
+ if (old_instance_connected) {
+ crm_exit(request_shutdown(old_instance));
+ } else {
+@@ -1253,22 +1279,25 @@ main(int argc, char **argv)
+ "Pacemaker instance: %s", strerror(errno));
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+- crm_exit(CRM_EX_DISCONNECT);
++ exit_code = CRM_EX_DISCONNECT;
++ goto done;
+ }
+
+ } else if (old_instance_connected) {
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+ crm_err("Aborting start-up because active Pacemaker instance found");
+- crm_exit(CRM_EX_FATAL);
++ exit_code = CRM_EX_FATAL;
++ goto done;
+ }
+
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+
+ #ifdef SUPPORT_COROSYNC
+ if (mcp_read_config() == FALSE) {
+- crm_exit(CRM_EX_UNAVAILABLE);
++ exit_code = CRM_EX_UNAVAILABLE;
++ goto done;
+ }
+ #endif
+
+@@ -1292,7 +1321,8 @@ main(int argc, char **argv)
+ #ifdef SUPPORT_COROSYNC
+ /* Allows us to block shutdown */
+ if (!cluster_connect_cfg()) {
+- crm_exit(CRM_EX_PROTOCOL);
++ exit_code = CRM_EX_PROTOCOL;
++ goto done;
+ }
+ #endif
+
+@@ -1307,9 +1337,11 @@ main(int argc, char **argv)
+ case pcmk_rc_ok:
+ break;
+ case pcmk_rc_ipc_unauthorized:
+- crm_exit(CRM_EX_CANTCREAT);
++ exit_code = CRM_EX_CANTCREAT;
++ goto done;
+ default:
+- crm_exit(CRM_EX_FATAL);
++ exit_code = CRM_EX_FATAL;
++ goto done;
+ };
+
+ mainloop_add_signal(SIGTERM, pcmk_shutdown);
+@@ -1342,5 +1374,11 @@ main(int argc, char **argv)
+ #ifdef SUPPORT_COROSYNC
+ cluster_disconnect_cfg();
+ #endif
+- crm_exit(CRM_EX_OK);
++
++done:
++ g_strfreev(processed_args);
++ pcmk__free_arg_context(context);
++
++ pcmk__output_and_clear_error(error, NULL);
++ crm_exit(exit_code);
+ }
+--
+1.8.3.1
+
+
+From 8f7924fbb2a012bedcad59335b7bebc5020b26e3 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 13 May 2021 13:27:13 -0400
+Subject: [PATCH 4/4] Low: pacemaker.service: Don't start pacemakerd with -f.
+
+This option is completely ignored by pacemakerd.
+---
+ daemons/pacemakerd/pacemaker.service.in | 2 +-
+ doc/sphinx/Clusters_from_Scratch/verification.rst | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemaker.service.in b/daemons/pacemakerd/pacemaker.service.in
+index b128ddc..0363a22 100644
+--- a/daemons/pacemakerd/pacemaker.service.in
++++ b/daemons/pacemakerd/pacemaker.service.in
+@@ -44,7 +44,7 @@ EnvironmentFile=-@CONFIGDIR@/pacemaker
+ EnvironmentFile=-@CONFIGDIR@/sbd
+ SuccessExitStatus=100
+
+-ExecStart=@sbindir@/pacemakerd -f
++ExecStart=@sbindir@/pacemakerd
+
+ # Systemd v227 and above can limit the number of processes spawned by a
+ # service. That is a bad idea for an HA cluster resource manager, so disable it
+diff --git a/doc/sphinx/Clusters_from_Scratch/verification.rst b/doc/sphinx/Clusters_from_Scratch/verification.rst
+index 9d647f8..b7fa20e 100644
+--- a/doc/sphinx/Clusters_from_Scratch/verification.rst
++++ b/doc/sphinx/Clusters_from_Scratch/verification.rst
+@@ -103,7 +103,7 @@ the necessary processes are running:
+ 2 ? S 0:00 [kthreadd]
+ ...lots of processes...
+ 17121 ? SLsl 0:01 /usr/sbin/corosync -f
+- 17133 ? Ss 0:00 /usr/sbin/pacemakerd -f
++ 17133 ? Ss 0:00 /usr/sbin/pacemakerd
+ 17134 ? Ss 0:00 \_ /usr/libexec/pacemaker/pacemaker-based
+ 17135 ? Ss 0:00 \_ /usr/libexec/pacemaker/pacemaker-fenced
+ 17136 ? Ss 0:00 \_ /usr/libexec/pacemaker/pacemaker-execd
+--
+1.8.3.1
+
diff --git a/003-pacemakerd-output.patch b/003-pacemakerd-output.patch
new file mode 100644
index 0000000..167e22b
--- /dev/null
+++ b/003-pacemakerd-output.patch
@@ -0,0 +1,343 @@
+From 7c35387a9896cb968cf4087b5cbed94af44e1ea5 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 14 May 2021 12:03:46 -0400
+Subject: [PATCH 1/5] Feature: daemons: Convert pacemakerd to formatted output.
+
+The main purpose of this is to finish getting pacemakerd moved off the
+existing command line handling code (pcmk__cli_help in particular) so
+that code can eventually be deprecated or removed. pacemakerd itself
+does fairly little printing.
+---
+ daemons/pacemakerd/pacemakerd.c | 58 ++++++++++++++++++++++++++++++-----------
+ 1 file changed, 43 insertions(+), 15 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index ce194bf..bd59729 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -25,6 +25,7 @@
+ #include <crm/common/ipc_internal.h>
+ #include <crm/common/mainloop.h>
+ #include <crm/common/cmdline_internal.h>
++#include <crm/common/output_internal.h>
+ #include <crm/cluster/internal.h>
+ #include <crm/cluster.h>
+
+@@ -37,6 +38,14 @@ struct {
+ gboolean standby;
+ } options;
+
++static pcmk__output_t *out = NULL;
++
++static pcmk__supported_format_t formats[] = {
++ PCMK__SUPPORTED_FORMAT_NONE,
++ PCMK__SUPPORTED_FORMAT_TEXT,
++ { NULL, NULL, NULL }
++};
++
+ static gboolean
+ pid_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
+ return TRUE;
+@@ -1167,10 +1176,10 @@ pacemakerd_event_cb(pcmk_ipc_api_t *pacemakerd_api,
+ }
+
+ static GOptionContext *
+-build_arg_context(pcmk__common_args_t *args) {
++build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
+ GOptionContext *context = NULL;
+
+- context = pcmk__build_arg_context(args, NULL, NULL, NULL);
++ context = pcmk__build_arg_context(args, "text", group, NULL);
+ pcmk__add_main_args(context, entries);
+ return context;
+ }
+@@ -1182,9 +1191,11 @@ main(int argc, char **argv)
+
+ GError *error = NULL;
+
++ int rc = pcmk_rc_ok;
++ GOptionGroup *output_group = NULL;
+ pcmk__common_args_t *args = pcmk__new_common_args(SUMMARY);
+ gchar **processed_args = pcmk__cmdline_preproc(argv, "p");
+- GOptionContext *context = build_arg_context(args);
++ GOptionContext *context = build_arg_context(args, &output_group);
+
+ bool old_instance_connected = false;
+
+@@ -1195,23 +1205,30 @@ main(int argc, char **argv)
+ mainloop_add_signal(SIGHUP, pcmk_ignore);
+ mainloop_add_signal(SIGQUIT, pcmk_sigquit);
+
++ pcmk__register_formats(output_group, formats);
+ if (!g_option_context_parse_strv(context, &processed_args, &error)) {
+ exit_code = CRM_EX_USAGE;
+ goto done;
+ }
+
++ rc = pcmk__output_new(&out, args->output_ty, args->output_dest, argv);
++ if (rc != pcmk_rc_ok) {
++ exit_code = CRM_EX_ERROR;
++ g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Error creating output format %s: %s",
++ args->output_ty, pcmk_rc_str(rc));
++ goto done;
++ }
++
+ if (options.features) {
+- printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
+- CRM_FEATURE_SET, CRM_FEATURES);
++ out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
++ BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
+ exit_code = CRM_EX_OK;
+ goto done;
+ }
+
+ if (args->version) {
+- g_strfreev(processed_args);
+- pcmk__free_arg_context(context);
+- /* FIXME: When pacemakerd is converted to use formatted output, this can go. */
+- pcmk__cli_help('v', CRM_EX_USAGE);
++ out->version(out, false);
++ goto done;
+ }
+
+ setenv("LC_ALL", "C", 1);
+@@ -1248,6 +1265,13 @@ main(int argc, char **argv)
+ crm_ipc_close(old_instance);
+ crm_ipc_destroy(old_instance);
+
++ /* Don't allow any accidental output after this point. */
++ if (out != NULL) {
++ out->finish(out, exit_code, true, NULL);
++ pcmk__output_free(out);
++ out = NULL;
++ }
++
+ #ifdef SUPPORT_COROSYNC
+ if (mcp_read_config() == FALSE) {
+ exit_code = CRM_EX_UNAVAILABLE;
+@@ -1333,6 +1357,11 @@ done:
+ g_strfreev(processed_args);
+ pcmk__free_arg_context(context);
+
+- pcmk__output_and_clear_error(error, NULL);
++ pcmk__output_and_clear_error(error, out);
++
++ if (out != NULL) {
++ out->finish(out, exit_code, true, NULL);
++ pcmk__output_free(out);
++ }
+ crm_exit(exit_code);
+ }
+--
+1.8.3.1
+
+
+From 35e6da64381fcb092d81ce16835cc28670b077cb Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 10:04:04 -0400
+Subject: [PATCH 2/5] Features: daemons: Output the pacemakerd feature list in
+ XML.
+
+---
+ daemons/pacemakerd/pacemakerd.c | 45 ++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 42 insertions(+), 3 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index bd59729..93cf743 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -43,6 +43,42 @@ static pcmk__output_t *out = NULL;
+ static pcmk__supported_format_t formats[] = {
+ PCMK__SUPPORTED_FORMAT_NONE,
+ PCMK__SUPPORTED_FORMAT_TEXT,
++ PCMK__SUPPORTED_FORMAT_XML,
++ { NULL, NULL, NULL }
++};
++
++static int
++pacemakerd_features(pcmk__output_t *out, va_list args) {
++ out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
++ BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
++ return pcmk_rc_ok;
++}
++
++static int
++pacemakerd_features_xml(pcmk__output_t *out, va_list args) {
++ gchar **feature_list = g_strsplit(CRM_FEATURES, " ", 0);
++
++ pcmk__output_xml_create_parent(out, "pacemakerd",
++ "version", PACEMAKER_VERSION,
++ "build", BUILD_VERSION,
++ "feature_set", CRM_FEATURE_SET,
++ NULL);
++ out->begin_list(out, NULL, NULL, "features");
++
++ for (char **s = feature_list; *s != NULL; s++) {
++ pcmk__output_create_xml_text_node(out, "feature", *s);
++ }
++
++ out->end_list(out);
++
++ g_strfreev(feature_list);
++ return pcmk_rc_ok;
++}
++
++static pcmk__message_entry_t fmt_functions[] = {
++ { "features", "default", pacemakerd_features },
++ { "features", "xml", pacemakerd_features_xml },
++
+ { NULL, NULL, NULL }
+ };
+
+@@ -200,7 +236,7 @@ static GOptionContext *
+ build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
+ GOptionContext *context = NULL;
+
+- context = pcmk__build_arg_context(args, "text", group, NULL);
++ context = pcmk__build_arg_context(args, "text (default), xml", group, NULL);
+ pcmk__add_main_args(context, entries);
+ return context;
+ }
+@@ -241,9 +277,12 @@ main(int argc, char **argv)
+ goto done;
+ }
+
++ pcmk__force_args(context, &error, "%s --xml-simple-list", g_get_prgname());
++
++ pcmk__register_messages(out, fmt_functions);
++
+ if (options.features) {
+- out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
+- BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
++ out->message(out, "features");
+ exit_code = CRM_EX_OK;
+ goto done;
+ }
+--
+1.8.3.1
+
+
+From 5b7f5eb35b025b59805cf3c7c3dcb6a3cf4b71b3 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 11:09:53 -0400
+Subject: [PATCH 3/5] Low: daemons: Conditionally enable logging in pacemakerd.
+
+If we're doing an interactive command-line call, use
+pcmk__cli_init_logging. At the moment, all command line calls except
+for --shutdown do their work before logging would even come up, so we
+really only need to do this for --shutdown.
+
+If we're doing a daemon call, use crm_log_init.
+---
+ daemons/pacemakerd/pacemakerd.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
+index 93cf743..c20bde7 100644
+--- a/daemons/pacemakerd/pacemakerd.c
++++ b/daemons/pacemakerd/pacemakerd.c
+@@ -296,8 +296,11 @@ main(int argc, char **argv)
+
+ pcmk__set_env_option("mcp", "true");
+
+- pcmk__cli_init_logging("pacemakerd", args->verbosity);
+- crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
++ if (options.shutdown) {
++ pcmk__cli_init_logging("pacemakerd", args->verbosity);
++ } else {
++ crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
++ }
+
+ crm_debug("Checking for existing Pacemaker instance");
+ old_instance = crm_ipc_new(CRM_SYSTEM_MCP, 0);
+--
+1.8.3.1
+
+
+From 2393362bb7489e86d937ed46a1c5cfb93d9bf3ab Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 11:58:06 -0400
+Subject: [PATCH 4/5] Fix: include: Bump CRM_FEATURE_SET for new pacemakerd
+ args.
+
+---
+ include/crm/crm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/crm.h b/include/crm/crm.h
+index fdfc825..92a98fa 100644
+--- a/include/crm/crm.h
++++ b/include/crm/crm.h
+@@ -66,7 +66,7 @@ extern "C" {
+ * >=3.0.13: Fail counts include operation name and interval
+ * >=3.2.0: DC supports PCMK_LRM_OP_INVALID and PCMK_LRM_OP_NOT_CONNECTED
+ */
+-# define CRM_FEATURE_SET "3.10.0"
++# define CRM_FEATURE_SET "3.10.1"
+
+ /* Pacemaker's CPG protocols use fixed-width binary fields for the sender and
+ * recipient of a CPG message. This imposes an arbitrary limit on cluster node
+--
+1.8.3.1
+
+
+From 3ad8edbd91631b87ef5f53fa2d68f0c8bbb9ee2b Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 17 May 2021 11:57:09 -0400
+Subject: [PATCH 5/5] Feature: xml: Add schema for pacemakerd.
+
+---
+ xml/Makefile.am | 1 +
+ xml/api/pacemakerd-2.10.rng | 28 ++++++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+)
+ create mode 100644 xml/api/pacemakerd-2.10.rng
+
+diff --git a/xml/Makefile.am b/xml/Makefile.am
+index 12a51c5..b9448d4 100644
+--- a/xml/Makefile.am
++++ b/xml/Makefile.am
+@@ -56,6 +56,7 @@ API_request_base = command-output \
+ crm_simulate \
+ crmadmin \
+ digests \
++ pacemakerd \
+ stonith_admin \
+ version
+
+diff --git a/xml/api/pacemakerd-2.10.rng b/xml/api/pacemakerd-2.10.rng
+new file mode 100644
+index 0000000..41a11e7
+--- /dev/null
++++ b/xml/api/pacemakerd-2.10.rng
+@@ -0,0 +1,28 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-pacemakerd"/>
++ </start>
++
++ <define name="element-pacemakerd">
++ <element name="pacemakerd">
++ <attribute name="version"> <text /> </attribute>
++ <attribute name="build"> <text /> </attribute>
++ <attribute name="feature_set"> <text /> </attribute>
++
++ <optional>
++ <ref name="feature-list" />
++ </optional>
++ </element>
++ </define>
++
++ <define name="feature-list">
++ <element name="features">
++ <oneOrMore>
++ <element name="feature"> <text/> </element>
++ </oneOrMore>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
diff --git a/004-check-level.patch b/004-check-level.patch
new file mode 100644
index 0000000..f2abb5f
--- /dev/null
+++ b/004-check-level.patch
@@ -0,0 +1,199 @@
+From 3905e7eac11298fc20efd567a773666f948edf61 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 3 May 2021 11:19:04 -0400
+Subject: [PATCH 1/2] Feature: tools: Add OCF_CHECK_LEVEL to crm_resource
+ environment.
+
+If --validate= or --force-check= are given with a level, pass that along
+as OCF_CHECK_LEVEL. This argument is optional, and if no value is given
+then the environment variable will not be set and whatever's the default
+on the resource agent will be used.
+
+See: rhbz#1955792.
+---
+ tools/crm_resource.c | 29 +++++++++++++++++++++--------
+ tools/crm_resource.h | 4 ++--
+ tools/crm_resource_runtime.c | 13 ++++++++++---
+ 3 files changed, 33 insertions(+), 13 deletions(-)
+
+diff --git a/tools/crm_resource.c b/tools/crm_resource.c
+index 45db2b2..6ca96f8 100644
+--- a/tools/crm_resource.c
++++ b/tools/crm_resource.c
+@@ -100,6 +100,7 @@ struct {
+ int timeout_ms; // Parsed from --timeout value
+ char *agent_spec; // Standard and/or provider and/or agent
+ gchar *xml_file; // Value of (deprecated) --xml-file
++ int check_level; // Optional value of --validate or --force-check
+
+ // Resource configuration specified via command-line arguments
+ gboolean cmdline_config; // Resource configuration was via arguments
+@@ -113,6 +114,7 @@ struct {
+ GHashTable *override_params; // Resource parameter values that override config
+ } options = {
+ .attr_set_type = XML_TAG_ATTR_SETS,
++ .check_level = -1,
+ .cib_options = cib_sync_call,
+ .require_cib = TRUE,
+ .require_dataset = TRUE,
+@@ -402,14 +404,15 @@ static GOptionEntry query_entries[] = {
+ };
+
+ static GOptionEntry command_entries[] = {
+- { "validate", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
++ { "validate", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ validate_or_force_cb,
+ "Validate resource configuration by calling agent's validate-all\n"
+ INDENT "action. The configuration may be specified either by giving an\n"
+ INDENT "existing resource name with -r, or by specifying --class,\n"
+ INDENT "--agent, and --provider arguments, along with any number of\n"
+- INDENT "--option arguments.",
+- NULL },
++ INDENT "--option arguments. An optional LEVEL argument can be given\n"
++ INDENT "to control the level of checking performed.",
++ "LEVEL" },
+ { "cleanup", 'C', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, cleanup_refresh_cb,
+ "If resource has any past failures, clear its history and fail\n"
+ INDENT "count. Optionally filtered by --resource, --node, --operation\n"
+@@ -546,11 +549,12 @@ static GOptionEntry advanced_entries[] = {
+ INDENT "the cluster believes the resource is a clone instance already\n"
+ INDENT "running on the local node.",
+ NULL },
+- { "force-check", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
++ { "force-check", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ validate_or_force_cb,
+ "(Advanced) Bypass the cluster and check the state of a resource on\n"
+- INDENT "the local node",
+- NULL },
++ INDENT "the local node. An optional LEVEL argument can be given\n"
++ INDENT "to control the level of checking performed.",
++ "LEVEL" },
+
+ { NULL }
+ };
+@@ -910,6 +914,15 @@ validate_or_force_cb(const gchar *option_name, const gchar *optarg,
+ if (options.override_params == NULL) {
+ options.override_params = pcmk__strkey_table(free, free);
+ }
++
++ if (optarg != NULL) {
++ if (pcmk__scan_min_int(optarg, &options.check_level, 0) != pcmk_rc_ok) {
++ g_set_error(error, G_OPTION_ERROR, CRM_EX_INVALID_PARAM,
++ "Invalid check level setting: %s", optarg);
++ return FALSE;
++ }
++ }
++
+ return TRUE;
+ }
+
+@@ -1826,12 +1839,12 @@ main(int argc, char **argv)
+ options.v_class, options.v_provider, options.v_agent,
+ "validate-all", options.cmdline_params,
+ options.override_params, options.timeout_ms,
+- args->verbosity, options.force);
++ args->verbosity, options.force, options.check_level);
+ } else {
+ exit_code = cli_resource_execute(rsc, options.rsc_id,
+ options.operation, options.override_params,
+ options.timeout_ms, cib_conn, data_set,
+- args->verbosity, options.force);
++ args->verbosity, options.force, options.check_level);
+ }
+ goto done;
+
+diff --git a/tools/crm_resource.h b/tools/crm_resource.h
+index 3560377..5ab10d6 100644
+--- a/tools/crm_resource.h
++++ b/tools/crm_resource.h
+@@ -88,11 +88,11 @@ crm_exit_t cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc
+ const char *rsc_type, const char *rsc_action,
+ GHashTable *params, GHashTable *override_hash,
+ int timeout_ms, int resource_verbose,
+- gboolean force);
++ gboolean force, int check_level);
+ crm_exit_t cli_resource_execute(pe_resource_t *rsc, const char *requested_name,
+ const char *rsc_action, GHashTable *override_hash,
+ int timeout_ms, cib_t *cib, pe_working_set_t *data_set,
+- int resource_verbose, gboolean force);
++ int resource_verbose, gboolean force, int check_level);
+
+ int cli_resource_update_attribute(pe_resource_t *rsc, const char *requested_name,
+ const char *attr_set, const char *attr_set_type,
+diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
+index fe0ec98..bde83b6 100644
+--- a/tools/crm_resource_runtime.c
++++ b/tools/crm_resource_runtime.c
+@@ -1679,7 +1679,8 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ const char *rsc_class, const char *rsc_prov,
+ const char *rsc_type, const char *action,
+ GHashTable *params, GHashTable *override_hash,
+- int timeout_ms, int resource_verbose, gboolean force)
++ int timeout_ms, int resource_verbose, gboolean force,
++ int check_level)
+ {
+ GHashTable *params_copy = NULL;
+ crm_exit_t exit_code = CRM_EX_OK;
+@@ -1703,6 +1704,12 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ /* add crm_feature_set env needed by some resource agents */
+ g_hash_table_insert(params, strdup(XML_ATTR_CRM_VERSION), strdup(CRM_FEATURE_SET));
+
++ if (check_level >= 0) {
++ char *level = crm_strdup_printf("%d", check_level);
++ setenv("OCF_CHECK_LEVEL", level, 1);
++ free(level);
++ }
++
+ /* resources_action_create frees the params hash table it's passed, but we
+ * may need to reuse it in a second call to resources_action_create. Thus
+ * we'll make a copy here so that gets freed and the original remains for
+@@ -1790,7 +1797,7 @@ crm_exit_t
+ cli_resource_execute(pe_resource_t *rsc, const char *requested_name,
+ const char *rsc_action, GHashTable *override_hash,
+ int timeout_ms, cib_t * cib, pe_working_set_t *data_set,
+- int resource_verbose, gboolean force)
++ int resource_verbose, gboolean force, int check_level)
+ {
+ pcmk__output_t *out = data_set->priv;
+ crm_exit_t exit_code = CRM_EX_OK;
+@@ -1856,7 +1863,7 @@ cli_resource_execute(pe_resource_t *rsc, const char *requested_name,
+
+ exit_code = cli_resource_execute_from_params(out, rid, rclass, rprov, rtype, action,
+ params, override_hash, timeout_ms,
+- resource_verbose, force);
++ resource_verbose, force, check_level);
+ return exit_code;
+ }
+
+--
+1.8.3.1
+
+
+From d13ba4bd6defe0dd81fdf8ab39ae5b889513c0c0 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 20 May 2021 10:59:23 -0400
+Subject: [PATCH 2/2] Fix: include: Bump feature set to 3.10.2.
+
+This is for the OCF_CHECK_LEVEL environment variable.
+
+See: rhbz#1955792.
+---
+ include/crm/crm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/crm.h b/include/crm/crm.h
+index 92a98fa..ee52c36 100644
+--- a/include/crm/crm.h
++++ b/include/crm/crm.h
+@@ -66,7 +66,7 @@ extern "C" {
+ * >=3.0.13: Fail counts include operation name and interval
+ * >=3.2.0: DC supports PCMK_LRM_OP_INVALID and PCMK_LRM_OP_NOT_CONNECTED
+ */
+-# define CRM_FEATURE_SET "3.10.1"
++# define CRM_FEATURE_SET "3.10.2"
+
+ /* Pacemaker's CPG protocols use fixed-width binary fields for the sender and
+ * recipient of a CPG message. This imposes an arbitrary limit on cluster node
+--
+1.8.3.1
+
diff --git a/005-crm_resource.patch b/005-crm_resource.patch
new file mode 100644
index 0000000..1683026
--- /dev/null
+++ b/005-crm_resource.patch
@@ -0,0 +1,866 @@
+From a5a507d4e1abf242903472719a19977811e6f164 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 20 May 2021 11:59:36 -0400
+Subject: [PATCH 01/10] Feature: libcrmcommon: Add OCF_OUTPUT_FORMAT to
+ crm_resource environment.
+
+See: rhbz#1644628
+---
+ lib/common/output.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/common/output.c b/lib/common/output.c
+index 6cb49b5..58872e0 100644
+--- a/lib/common/output.c
++++ b/lib/common/output.c
+@@ -71,6 +71,8 @@ pcmk__output_new(pcmk__output_t **out, const char *fmt_name, const char *filenam
+ return ENOMEM;
+ }
+
++ setenv("OCF_OUTPUT_FORMAT", (*out)->fmt_name, 1);
++
+ return pcmk_rc_ok;
+ }
+
+--
+1.8.3.1
+
+
+From acc6ecdbfb797d69794e68f75a734d6252434e01 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 21 May 2021 14:20:30 -0400
+Subject: [PATCH 02/10] Feature: schemas: Copy crm_resource schema in
+ preparation for changes.
+
+See: rhbz#1644628
+---
+ xml/api/crm_resource-2.11.rng | 238 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 238 insertions(+)
+ create mode 100644 xml/api/crm_resource-2.11.rng
+
+diff --git a/xml/api/crm_resource-2.11.rng b/xml/api/crm_resource-2.11.rng
+new file mode 100644
+index 0000000..8e386db
+--- /dev/null
++++ b/xml/api/crm_resource-2.11.rng
+@@ -0,0 +1,238 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-crm-resource"/>
++ </start>
++
++ <define name="element-crm-resource">
++ <choice>
++ <ref name="agents-list" />
++ <ref name="alternatives-list" />
++ <ref name="constraints-list" />
++ <externalRef href="generic-list-2.4.rng"/>
++ <element name="metadata"> <text/> </element>
++ <ref name="locate-list" />
++ <ref name="operations-list" />
++ <ref name="providers-list" />
++ <ref name="reasons-list" />
++ <ref name="resource-check" />
++ <ref name="resource-config" />
++ <ref name="resources-list" />
++ </choice>
++ </define>
++
++ <define name="agents-list">
++ <element name="agents">
++ <attribute name="standard"> <text/> </attribute>
++ <optional>
++ <attribute name="provider"> <text/> </attribute>
++ </optional>
++ <zeroOrMore>
++ <element name="agent"> <text/> </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="alternatives-list">
++ <element name="providers">
++ <attribute name="for"> <text/> </attribute>
++ <zeroOrMore>
++ <element name="provider"> <text/> </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="constraints-list">
++ <element name="constraints">
++ <interleave>
++ <zeroOrMore>
++ <ref name="rsc-location" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="rsc-colocation" />
++ </zeroOrMore>
++ </interleave>
++ </element>
++ </define>
++
++ <define name="locate-list">
++ <element name="nodes">
++ <attribute name="resource"> <text/> </attribute>
++ <zeroOrMore>
++ <element name="node">
++ <optional>
++ <attribute name="state"><value>promoted</value></attribute>
++ </optional>
++ <text/>
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="rsc-location">
++ <element name="rsc_location">
++ <attribute name="node"> <text/> </attribute>
++ <attribute name="rsc"> <text/> </attribute>
++ <attribute name="id"> <text/> </attribute>
++ <externalRef href="../score.rng"/>
++ </element>
++ </define>
++
++ <define name="operations-list">
++ <element name="operations">
++ <oneOrMore>
++ <ref name="element-operation-list" />
++ </oneOrMore>
++ </element>
++ </define>
++
++ <define name="providers-list">
++ <element name="providers">
++ <attribute name="standard"> <value>ocf</value> </attribute>
++ <optional>
++ <attribute name="agent"> <text/> </attribute>
++ </optional>
++ <zeroOrMore>
++ <element name="provider"> <text/> </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="reasons-list">
++ <choice>
++ <ref name="no-resource-or-uname"/>
++ <ref name="resource-and-uname"/>
++ <ref name="no-resource-but-uname"/>
++ <ref name="resource-but-no-uname"/>
++ </choice>
++ </define>
++
++ <define name="no-resource-or-uname">
++ <element name="reason">
++ <element name="resources">
++ <zeroOrMore>
++ <element name="resource">
++ <attribute name="id"> <text/> </attribute>
++ <attribute name="running"> <data type="boolean"/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </zeroOrMore>
++ </element>
++ </element>
++ </define>
++
++ <define name="resource-and-uname">
++ <element name="reason">
++ <attribute name="running_on"> <text/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </define>
++
++ <define name="no-resource-but-uname">
++ <element name="reason">
++ <element name="resources">
++ <zeroOrMore>
++ <element name="resource">
++ <attribute name="id"> <text/> </attribute>
++ <attribute name="running"> <data type="boolean"/> </attribute>
++ <attribute name="host"> <text/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </zeroOrMore>
++ </element>
++ </element>
++ </define>
++
++ <define name="resource-but-no-uname">
++ <element name="reason">
++ <attribute name="running"> <data type="boolean"/> </attribute>
++ <ref name="resource-check"/>
++ </element>
++ </define>
++
++ <define name="resource-config">
++ <element name="resource_config">
++ <externalRef href="resources-2.4.rng" />
++ <element name="xml"> <text/> </element>
++ </element>
++ </define>
++
++ <define name="resource-check">
++ <element name="check">
++ <attribute name="id"> <text/> </attribute>
++ <optional>
++ <choice>
++ <attribute name="remain_stopped"><value>true</value></attribute>
++ <attribute name="promotable"><value>false</value></attribute>
++ </choice>
++ </optional>
++ <optional>
++ <attribute name="unmanaged"><value>true</value></attribute>
++ </optional>
++ <optional>
++ <attribute name="locked-to"> <text/> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="resources-list">
++ <element name="resources">
++ <zeroOrMore>
++ <externalRef href="resources-2.4.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="rsc-colocation">
++ <element name="rsc_colocation">
++ <attribute name="id"> <text/> </attribute>
++ <attribute name="rsc"> <text/> </attribute>
++ <attribute name="with-rsc"> <text/> </attribute>
++ <externalRef href="../score.rng"/>
++ <optional>
++ <attribute name="node-attribute"> <text/> </attribute>
++ </optional>
++ <optional>
++ <attribute name="rsc-role">
++ <ref name="attribute-roles"/>
++ </attribute>
++ </optional>
++ <optional>
++ <attribute name="with-rsc-role">
++ <ref name="attribute-roles"/>
++ </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-operation-list">
++ <element name="operation">
++ <optional>
++ <group>
++ <attribute name="rsc"> <text/> </attribute>
++ <attribute name="agent"> <text/> </attribute>
++ </group>
++ </optional>
++ <attribute name="op"> <text/> </attribute>
++ <attribute name="node"> <text/> </attribute>
++ <attribute name="call"> <data type="integer" /> </attribute>
++ <attribute name="rc"> <data type="nonNegativeInteger" /> </attribute>
++ <optional>
++ <attribute name="last-rc-change"> <text/> </attribute>
++ <attribute name="exec-time"> <data type="nonNegativeInteger" /> </attribute>
++ </optional>
++ <attribute name="status"> <text/> </attribute>
++ </element>
++ </define>
++
++ <define name="attribute-roles">
++ <choice>
++ <value>Stopped</value>
++ <value>Started</value>
++ <value>Master</value>
++ <value>Slave</value>
++ </choice>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From 1bbdf2149a111e9e19c388834f82001e0d31c427 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 24 May 2021 12:23:55 -0400
+Subject: [PATCH 03/10] Feature: xml: Update the crm_resource schema for XML
+ output.
+
+See: rhbz#1644628
+---
+ xml/api/crm_resource-2.11.rng | 50 +++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+diff --git a/xml/api/crm_resource-2.11.rng b/xml/api/crm_resource-2.11.rng
+index 8e386db..aaa54d6 100644
+--- a/xml/api/crm_resource-2.11.rng
++++ b/xml/api/crm_resource-2.11.rng
+@@ -20,6 +20,7 @@
+ <ref name="resource-check" />
+ <ref name="resource-config" />
+ <ref name="resources-list" />
++ <ref name="resource-agent-action" />
+ </choice>
+ </define>
+
+@@ -227,6 +228,55 @@
+ </element>
+ </define>
+
++ <define name="resource-agent-action">
++ <element name="resource-agent-action">
++ <attribute name="action"> <text/> </attribute>
++ <optional>
++ <attribute name="rsc"> <text/> </attribute>
++ </optional>
++ <attribute name="class"> <text/> </attribute>
++ <attribute name="type"> <text/> </attribute>
++ <optional>
++ <attribute name="provider"> <text/> </attribute>
++ </optional>
++ <optional>
++ <ref name="overrides-list"/>
++ </optional>
++ <ref name="agent-status"/>
++ <optional>
++ <choice>
++ <element name="command">
++ <text />
++ </element>
++ <externalRef href="command-output-1.0.rng"/>
++ </choice>
++ </optional>
++ </element>
++ </define>
++
++ <define name="overrides-list">
++ <element name="overrides">
++ <zeroOrMore>
++ <element name="override">
++ <optional>
++ <attribute name="rsc"> <text/> </attribute>
++ </optional>
++ <attribute name="name"> <text/> </attribute>
++ <attribute name="value"> <text/> </attribute>
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="agent-status">
++ <element name="agent-status">
++ <attribute name="code"> <data type="integer" /> </attribute>
++ <optional>
++ <attribute name="message"> <text/> </attribute>
++ </optional>
++ </element>
++ </define>
++
+ <define name="attribute-roles">
+ <choice>
+ <value>Stopped</value>
+--
+1.8.3.1
+
+
+From d89f5bc7fec856fdcd32fa14edbd0019507d5d15 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Tue, 1 Jun 2021 15:26:58 -0400
+Subject: [PATCH 04/10] Low: libcrmcommon: Increase PCMK__API_VERSION for new
+ crm_resource output.
+
+See: rhbz#1644628
+---
+ include/crm/common/output_internal.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
+index 10b315b..0436cde 100644
+--- a/include/crm/common/output_internal.h
++++ b/include/crm/common/output_internal.h
+@@ -27,7 +27,7 @@ extern "C" {
+ # include <glib.h>
+ # include <crm/common/results.h>
+
+-# define PCMK__API_VERSION "2.9"
++# define PCMK__API_VERSION "2.11"
+
+ #if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS)
+ # define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS)))
+--
+1.8.3.1
+
+
+From 30bd2ddf43ee2a911681e51f40ed9ba20ec250b0 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Thu, 27 May 2021 13:57:12 -0400
+Subject: [PATCH 05/10] Low: tools: Pass NULL to
+ cli_resource_execute_from_params...
+
+if no resource name is given. This happens if we are validating based
+on the --class/--agent/--provider command line options instead.
+---
+ tools/crm_resource.c | 2 +-
+ tools/crm_resource_runtime.c | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/tools/crm_resource.c b/tools/crm_resource.c
+index 24f1121..37a0bb0 100644
+--- a/tools/crm_resource.c
++++ b/tools/crm_resource.c
+@@ -1840,7 +1840,7 @@ main(int argc, char **argv)
+
+ case cmd_execute_agent:
+ if (options.cmdline_config) {
+- exit_code = cli_resource_execute_from_params(out, "test",
++ exit_code = cli_resource_execute_from_params(out, NULL,
+ options.v_class, options.v_provider, options.v_agent,
+ "validate-all", options.cmdline_params,
+ options.override_params, options.timeout_ms,
+diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
+index 48a4b40..ebf48bb 100644
+--- a/tools/crm_resource_runtime.c
++++ b/tools/crm_resource_runtime.c
+@@ -1717,14 +1717,14 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ */
+ params_copy = pcmk__str_table_dup(params);
+
+- op = resources_action_create(rsc_name, rsc_class, rsc_prov, rsc_type, action, 0,
+- timeout_ms, params_copy, 0);
++ op = resources_action_create(rsc_name ? rsc_name : "test", rsc_class, rsc_prov,
++ rsc_type, action, 0, timeout_ms, params_copy, 0);
+ if (op == NULL) {
+ /* Re-run with stderr enabled so we can display a sane error message */
+ crm_enable_stderr(TRUE);
+ params_copy = pcmk__str_table_dup(params);
+- op = resources_action_create(rsc_name, rsc_class, rsc_prov, rsc_type, action, 0,
+- timeout_ms, params_copy, 0);
++ op = resources_action_create(rsc_name ? rsc_name : "test", rsc_class, rsc_prov,
++ rsc_type, action, 0, timeout_ms, params_copy, 0);
+
+ /* Callers of cli_resource_execute expect that the params hash table will
+ * be freed. That function uses this one, so for that reason and for
+--
+1.8.3.1
+
+
+From ee56efd53d14cfc4f902769540b72b3bb6096a73 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Mon, 24 May 2021 12:08:52 -0400
+Subject: [PATCH 06/10] Feature: tools: Add an agent-status message for
+ crm_resource.
+
+This moves what was previously only done in an out->info call to its own
+output message, which means it will appear in XML output as well. Also,
+note that if --class/--agent/--provider are given, the resource name
+will be set to "test". In that case, do not display the resource name
+in the output.
+
+This message will be used for --validate and the --force-* command line
+options to crm_resource.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_print.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 53 insertions(+)
+
+diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
+index 9d82cf8..88d5878 100644
+--- a/tools/crm_resource_print.c
++++ b/tools/crm_resource_print.c
+@@ -152,6 +152,57 @@ attribute_list_default(pcmk__output_t *out, va_list args) {
+ return pcmk_rc_ok;
+ }
+
++PCMK__OUTPUT_ARGS("agent-status", "int", "const char *", "const char *", "const char *",
++ "const char *", "const char *", "int")
++static int
++agent_status_default(pcmk__output_t *out, va_list args) {
++ int status = va_arg(args, int);
++ const char *action = va_arg(args, const char *);
++ const char *name = va_arg(args, const char *);
++ const char *class = va_arg(args, const char *);
++ const char *provider = va_arg(args, const char *);
++ const char *type = va_arg(args, const char *);
++ int rc = va_arg(args, int);
++
++ if (status == PCMK_LRM_OP_DONE) {
++ out->info(out, "Operation %s%s%s (%s%s%s:%s) returned: '%s' (%d)",
++ action, name ? " for " : "", name ? name : "",
++ class, provider ? ":" : "", provider ? provider : "", type,
++ services_ocf_exitcode_str(rc), rc);
++ } else {
++ out->err(out, "Operation %s%s%s (%s%s%s:%s) failed: '%s' (%d)",
++ action, name ? " for " : "", name ? name : "",
++ class, provider ? ":" : "", provider ? provider : "", type,
++ services_lrm_status_str(status), status);
++ }
++
++ return pcmk_rc_ok;
++}
++
++PCMK__OUTPUT_ARGS("agent-status", "int", "const char *", "const char *", "const char *",
++ "const char *", "const char *", "int")
++static int
++agent_status_xml(pcmk__output_t *out, va_list args) {
++ int status G_GNUC_UNUSED = va_arg(args, int);
++ const char *action G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *name G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *class G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *provider G_GNUC_UNUSED = va_arg(args, const char *);
++ const char *type G_GNUC_UNUSED = va_arg(args, const char *);
++ int rc = va_arg(args, int);
++
++ char *status_str = pcmk__itoa(rc);
++
++ pcmk__output_create_xml_node(out, "agent-status",
++ "code", status_str,
++ "message", services_ocf_exitcode_str(rc),
++ NULL);
++
++ free(status_str);
++
++ return pcmk_rc_ok;
++}
++
+ PCMK__OUTPUT_ARGS("attribute-list", "pe_resource_t *", "char *", "GHashTable *")
+ static int
+ attribute_list_text(pcmk__output_t *out, va_list args) {
+@@ -562,6 +613,8 @@ resource_names(pcmk__output_t *out, va_list args) {
+ }
+
+ static pcmk__message_entry_t fmt_functions[] = {
++ { "agent-status", "default", agent_status_default },
++ { "agent-status", "xml", agent_status_xml },
+ { "attribute-list", "default", attribute_list_default },
+ { "attribute-list", "text", attribute_list_text },
+ { "property-list", "default", property_list_default },
+--
+1.8.3.1
+
+
+From 85cb6b6bff96b18c5174d11e4de4d49cbfb20bb7 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Tue, 1 Jun 2021 14:47:30 -0400
+Subject: [PATCH 07/10] Feature: tools: Add an overridden params output
+ message.
+
+This also replaces what was previously being done in an out->info call
+with an output message. This means it shows up in XML output as well.
+Also, note that if --class/--agent/--provider are given, the resource
+name will be set to "test". In that case, do not display the resource
+name in the output.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_print.c | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
+index 88d5878..119d83f 100644
+--- a/tools/crm_resource_print.c
++++ b/tools/crm_resource_print.c
+@@ -224,6 +224,43 @@ attribute_list_text(pcmk__output_t *out, va_list args) {
+ return pcmk_rc_ok;
+ }
+
++PCMK__OUTPUT_ARGS("override", "const char *", "const char *", "const char *")
++static int
++override_default(pcmk__output_t *out, va_list args) {
++ const char *rsc_name = va_arg(args, const char *);
++ const char *name = va_arg(args, const char *);
++ const char *value = va_arg(args, const char *);
++
++ if (rsc_name == NULL) {
++ out->list_item(out, NULL, "Overriding the cluster configuration with '%s' = '%s'",
++ name, value);
++ } else {
++ out->list_item(out, NULL, "Overriding the cluster configuration for '%s' with '%s' = '%s'",
++ rsc_name, name, value);
++ }
++
++ return pcmk_rc_ok;
++}
++
++PCMK__OUTPUT_ARGS("override", "const char *", "const char *", "const char *")
++static int
++override_xml(pcmk__output_t *out, va_list args) {
++ const char *rsc_name = va_arg(args, const char *);
++ const char *name = va_arg(args, const char *);
++ const char *value = va_arg(args, const char *);
++
++ xmlNodePtr node = pcmk__output_create_xml_node(out, "override",
++ "name", name,
++ "value", value,
++ NULL);
++
++ if (rsc_name != NULL) {
++ crm_xml_add(node, "rsc", rsc_name);
++ }
++
++ return pcmk_rc_ok;
++}
++
+ PCMK__OUTPUT_ARGS("property-list", "pe_resource_t *", "char *")
+ static int
+ property_list_default(pcmk__output_t *out, va_list args) {
+@@ -617,6 +654,8 @@ static pcmk__message_entry_t fmt_functions[] = {
+ { "agent-status", "xml", agent_status_xml },
+ { "attribute-list", "default", attribute_list_default },
+ { "attribute-list", "text", attribute_list_text },
++ { "override", "default", override_default },
++ { "override", "xml", override_xml },
+ { "property-list", "default", property_list_default },
+ { "property-list", "text", property_list_text },
+ { "resource-check-list", "default", resource_check_list_default },
+--
+1.8.3.1
+
+
+From e5e24592c7c3231c619fb5253e7925ffbc634a99 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 4 Jun 2021 10:24:51 -0400
+Subject: [PATCH 08/10] Low: tools: Use simple XML lists for resource actions
+ as well.
+
+See: rhbz#1644628
+---
+ tools/crm_resource.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tools/crm_resource.c b/tools/crm_resource.c
+index 37a0bb0..e957011 100644
+--- a/tools/crm_resource.c
++++ b/tools/crm_resource.c
+@@ -1643,6 +1643,7 @@ main(int argc, char **argv)
+ * saves from having to write custom messages to build the lists around all these things
+ */
+ switch (options.rsc_cmd) {
++ case cmd_execute_agent:
+ case cmd_list_resources:
+ case cmd_query_xml:
+ case cmd_query_raw_xml:
+--
+1.8.3.1
+
+
+From 3e75174d0bc31b261adb1994214a5878b79da85b Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 4 Jun 2021 10:30:10 -0400
+Subject: [PATCH 09/10] Feature: tools: Add an output message for resource
+ actions.
+
+This wraps up the override and agent-status messages into a single
+message, along with any stdout/stderr from the resource action. This
+message should be called after taking the action.
+
+This also implements handling XML output from resource actions. Check
+to see if the validate-all action returns XML. If so, output it as a
+CDATA block under a "command" element. If not, treat it as plain text
+and output it as stdout/stderr from a command.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_print.c | 122 +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 122 insertions(+)
+
+diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
+index 119d83f..19a366d 100644
+--- a/tools/crm_resource_print.c
++++ b/tools/crm_resource_print.c
+@@ -293,6 +293,126 @@ property_list_text(pcmk__output_t *out, va_list args) {
+ return pcmk_rc_ok;
+ }
+
++PCMK__OUTPUT_ARGS("resource-agent-action", "int", "const char *", "const char *",
++ "const char *", "const char *", "const char *", "GHashTable *",
++ "int", "int", "char *", "char *")
++static int
++resource_agent_action_default(pcmk__output_t *out, va_list args) {
++ int verbose = va_arg(args, int);
++
++ const char *class = va_arg(args, const char *);
++ const char *provider = va_arg(args, const char *);
++ const char *type = va_arg(args, const char *);
++ const char *rsc_name = va_arg(args, const char *);
++ const char *action = va_arg(args, const char *);
++ GHashTable *overrides = va_arg(args, GHashTable *);
++ int rc = va_arg(args, int);
++ int status = va_arg(args, int);
++ char *stdout_data = va_arg(args, char *);
++ char *stderr_data = va_arg(args, char *);
++
++ if (overrides) {
++ GHashTableIter iter;
++ char *name = NULL;
++ char *value = NULL;
++
++ out->begin_list(out, NULL, NULL, "overrides");
++
++ g_hash_table_iter_init(&iter, overrides);
++ while (g_hash_table_iter_next(&iter, (gpointer *) &name, (gpointer *) &value)) {
++ out->message(out, "override", rsc_name, name, value);
++ }
++
++ out->end_list(out);
++ }
++
++ out->message(out, "agent-status", status, action, rsc_name, class, provider,
++ type, rc);
++
++ /* hide output for validate-all if not in verbose */
++ if (verbose == 0 && pcmk__str_eq(action, "validate-all", pcmk__str_casei)) {
++ return pcmk_rc_ok;
++ }
++
++ if (stdout_data || stderr_data) {
++ xmlNodePtr doc = string2xml(stdout_data);
++
++ if (doc != NULL) {
++ out->output_xml(out, "command", stdout_data);
++ xmlFreeNode(doc);
++ } else {
++ out->subprocess_output(out, rc, stdout_data, stderr_data);
++ }
++ }
++
++ return pcmk_rc_ok;
++}
++
++PCMK__OUTPUT_ARGS("resource-agent-action", "int", "const char *", "const char *",
++ "const char *", "const char *", "const char *", "GHashTable *",
++ "int", "int", "char *", "char *")
++static int
++resource_agent_action_xml(pcmk__output_t *out, va_list args) {
++ int verbose G_GNUC_UNUSED = va_arg(args, int);
++
++ const char *class = va_arg(args, const char *);
++ const char *provider = va_arg(args, const char *);
++ const char *type = va_arg(args, const char *);
++ const char *rsc_name = va_arg(args, const char *);
++ const char *action = va_arg(args, const char *);
++ GHashTable *overrides = va_arg(args, GHashTable *);
++ int rc = va_arg(args, int);
++ int status = va_arg(args, int);
++ char *stdout_data = va_arg(args, char *);
++ char *stderr_data = va_arg(args, char *);
++
++ xmlNodePtr node = pcmk__output_xml_create_parent(out, "resource-agent-action",
++ "action", action,
++ "class", class,
++ "type", type,
++ NULL);
++
++ if (rsc_name) {
++ crm_xml_add(node, "rsc", rsc_name);
++ }
++
++ if (provider) {
++ crm_xml_add(node, "provider", provider);
++ }
++
++ if (overrides) {
++ GHashTableIter iter;
++ char *name = NULL;
++ char *value = NULL;
++
++ out->begin_list(out, NULL, NULL, "overrides");
++
++ g_hash_table_iter_init(&iter, overrides);
++ while (g_hash_table_iter_next(&iter, (gpointer *) &name, (gpointer *) &value)) {
++ out->message(out, "override", rsc_name, name, value);
++ }
++
++ out->end_list(out);
++ }
++
++ out->message(out, "agent-status", status, action, rsc_name, class, provider,
++ type, rc);
++
++ if (stdout_data || stderr_data) {
++ xmlNodePtr doc = string2xml(stdout_data);
++
++ if (doc != NULL) {
++ out->output_xml(out, "command", stdout_data);
++ xmlFreeNode(doc);
++ } else {
++ out->subprocess_output(out, rc, stdout_data, stderr_data);
++ }
++ }
++
++ pcmk__output_xml_pop_parent(out);
++ return pcmk_rc_ok;
++}
++
+ PCMK__OUTPUT_ARGS("resource-check-list", "resource_checks_t *")
+ static int
+ resource_check_list_default(pcmk__output_t *out, va_list args) {
+@@ -658,6 +778,8 @@ static pcmk__message_entry_t fmt_functions[] = {
+ { "override", "xml", override_xml },
+ { "property-list", "default", property_list_default },
+ { "property-list", "text", property_list_text },
++ { "resource-agent-action", "default", resource_agent_action_default },
++ { "resource-agent-action", "xml", resource_agent_action_xml },
+ { "resource-check-list", "default", resource_check_list_default },
+ { "resource-check-list", "xml", resource_check_list_xml },
+ { "resource-search-list", "default", resource_search_list_default },
+--
+1.8.3.1
+
+
+From b50b2418e1e997b42f5370b4672a3f105d74634f Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 4 Jun 2021 10:40:16 -0400
+Subject: [PATCH 10/10] Feature: tools: Use the new resource-agent-action
+ message.
+
+See: rhbz#1644628
+---
+ tools/crm_resource_runtime.c | 21 +++------------------
+ 1 file changed, 3 insertions(+), 18 deletions(-)
+
+diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
+index ebf48bb..755be9f 100644
+--- a/tools/crm_resource_runtime.c
++++ b/tools/crm_resource_runtime.c
+@@ -1765,28 +1765,13 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name,
+ if (services_action_sync(op)) {
+ exit_code = op->rc;
+
+- if (op->status == PCMK_LRM_OP_DONE) {
+- out->info(out, "Operation %s for %s (%s:%s:%s) returned: '%s' (%d)",
+- action, rsc_name, rsc_class, rsc_prov ? rsc_prov : "", rsc_type,
+- services_ocf_exitcode_str(op->rc), op->rc);
+- } else {
+- out->err(out, "Operation %s for %s (%s:%s:%s) failed: '%s' (%d)",
+- action, rsc_name, rsc_class, rsc_prov ? rsc_prov : "", rsc_type,
+- services_lrm_status_str(op->status), op->status);
+- }
+-
+- /* hide output for validate-all if not in verbose */
+- if (resource_verbose == 0 && pcmk__str_eq(action, "validate-all", pcmk__str_casei))
+- goto done;
+-
+- if (op->stdout_data || op->stderr_data) {
+- out->subprocess_output(out, op->rc, op->stdout_data, op->stderr_data);
+- }
++ out->message(out, "resource-agent-action", resource_verbose, rsc_class,
++ rsc_prov, rsc_type, rsc_name, action, override_hash, op->rc,
++ op->status, op->stdout_data, op->stderr_data);
+ } else {
+ exit_code = op->rc == 0 ? CRM_EX_ERROR : op->rc;
+ }
+
+-done:
+ services_action_free(op);
+ /* See comment above about why we free params here. */
+ g_hash_table_destroy(params);
+--
+1.8.3.1
+
diff --git a/006-crm_simulate.patch b/006-crm_simulate.patch
new file mode 100644
index 0000000..c8d4e3f
--- /dev/null
+++ b/006-crm_simulate.patch
@@ -0,0 +1,896 @@
+From 97571e6ccc9b7fa339a7e27d9b0b9ab782ff3003 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Wed, 16 Jun 2021 13:54:10 -0400
+Subject: [PATCH 1/5] Low: schemas: Copy crm_mon.rng in preparation for
+ changes.
+
+---
+ xml/api/crm_mon-2.12.rng | 243 +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 243 insertions(+)
+ create mode 100644 xml/api/crm_mon-2.12.rng
+
+diff --git a/xml/api/crm_mon-2.12.rng b/xml/api/crm_mon-2.12.rng
+new file mode 100644
+index 0000000..ffec923
+--- /dev/null
++++ b/xml/api/crm_mon-2.12.rng
+@@ -0,0 +1,243 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-crm-mon"/>
++ </start>
++
++ <define name="element-crm-mon">
++ <optional>
++ <ref name="element-summary" />
++ </optional>
++ <optional>
++ <ref name="nodes-list" />
++ </optional>
++ <optional>
++ <ref name="resources-list" />
++ </optional>
++ <optional>
++ <ref name="node-attributes-list" />
++ </optional>
++ <optional>
++ <ref name="node-history-list" />
++ </optional>
++ <optional>
++ <ref name="failures-list" />
++ </optional>
++ <optional>
++ <ref name="fence-event-list" />
++ </optional>
++ <optional>
++ <ref name="tickets-list" />
++ </optional>
++ <optional>
++ <ref name="bans-list" />
++ </optional>
++ </define>
++
++ <define name="element-summary">
++ <element name="summary">
++ <optional>
++ <element name="stack">
++ <attribute name="type"> <text /> </attribute>
++ </element>
++ </optional>
++ <optional>
++ <element name="current_dc">
++ <attribute name="present"> <data type="boolean" /> </attribute>
++ <optional>
++ <group>
++ <attribute name="version"> <text /> </attribute>
++ <attribute name="name"> <text /> </attribute>
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="with_quorum"> <data type="boolean" /> </attribute>
++ </group>
++ </optional>
++ </element>
++ </optional>
++ <optional>
++ <element name="last_update">
++ <attribute name="time"> <text /> </attribute>
++ </element>
++ <element name="last_change">
++ <attribute name="time"> <text /> </attribute>
++ <attribute name="user"> <text /> </attribute>
++ <attribute name="client"> <text /> </attribute>
++ <attribute name="origin"> <text /> </attribute>
++ </element>
++ </optional>
++ <optional>
++ <element name="nodes_configured">
++ <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
++ </element>
++ <element name="resources_configured">
++ <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
++ <attribute name="disabled"> <data type="nonNegativeInteger" /> </attribute>
++ <attribute name="blocked"> <data type="nonNegativeInteger" /> </attribute>
++ </element>
++ </optional>
++ <optional>
++ <element name="cluster_options">
++ <attribute name="stonith-enabled"> <data type="boolean" /> </attribute>
++ <attribute name="symmetric-cluster"> <data type="boolean" /> </attribute>
++ <attribute name="no-quorum-policy"> <text /> </attribute>
++ <attribute name="maintenance-mode"> <data type="boolean" /> </attribute>
++ <attribute name="stop-all-resources"> <data type="boolean" /> </attribute>
++ </element>
++ </optional>
++ </element>
++ </define>
++
++ <define name="resources-list">
++ <element name="resources">
++ <zeroOrMore>
++ <externalRef href="resources-2.4.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="nodes-list">
++ <element name="nodes">
++ <zeroOrMore>
++ <externalRef href="nodes-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="node-attributes-list">
++ <element name="node_attributes">
++ <zeroOrMore>
++ <externalRef href="node-attrs-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="node-history-list">
++ <element name="node_history">
++ <zeroOrMore>
++ <ref name="element-node-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="failures-list">
++ <element name="failures">
++ <zeroOrMore>
++ <externalRef href="failure-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="fence-event-list">
++ <element name="fence_history">
++ <optional>
++ <attribute name="status"> <data type="integer" /> </attribute>
++ </optional>
++ <zeroOrMore>
++ <externalRef href="fence-event-2.0.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="tickets-list">
++ <element name="tickets">
++ <zeroOrMore>
++ <ref name="element-ticket" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="bans-list">
++ <element name="bans">
++ <zeroOrMore>
++ <ref name="element-ban" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-node-history">
++ <element name="node">
++ <attribute name="name"> <text /> </attribute>
++ <zeroOrMore>
++ <ref name="element-resource-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-resource-history">
++ <element name="resource_history">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="orphan"> <data type="boolean" /> </attribute>
++ <optional>
++ <group>
++ <attribute name="migration-threshold"> <data type="nonNegativeInteger" /> </attribute>
++ <optional>
++ <attribute name="fail-count"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-failure"> <text /> </attribute>
++ </optional>
++ </group>
++ </optional>
++ <zeroOrMore>
++ <ref name="element-operation-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-operation-history">
++ <element name="operation_history">
++ <attribute name="call"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="interval"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-rc-change"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-run"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="exec-time"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="queue-time"> <text /> </attribute>
++ </optional>
++ <attribute name="rc"> <data type="integer" /> </attribute>
++ <attribute name="rc_text"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-ticket">
++ <element name="ticket">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="status">
++ <choice>
++ <value>granted</value>
++ <value>revoked</value>
++ </choice>
++ </attribute>
++ <attribute name="standby"> <data type="boolean" /> </attribute>
++ <optional>
++ <attribute name="last-granted"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-ban">
++ <element name="ban">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="weight"> <data type="integer" /> </attribute>
++ <attribute name="promoted-only"> <data type="boolean" /> </attribute>
++ <!-- DEPRECATED: master_only is a duplicate of promoted-only that is
++ provided solely for API backward compatibility. It will be
++ removed in a future release. Check promoted-only instead.
++ -->
++ <attribute name="master_only"> <data type="boolean" /> </attribute>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From da394983f106f974274ddd94675a04c85086010e Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 18 Jun 2021 15:06:34 -0400
+Subject: [PATCH 2/5] Refactor: Split node history out into its own XML schema.
+
+This allows for sharing it between crm_mon and crm_simulate.
+---
+ xml/Makefile.am | 2 +-
+ xml/api/crm_mon-2.12.rng | 64 +--------------------------------------
+ xml/api/node-history-2.12.rng | 70 +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 72 insertions(+), 64 deletions(-)
+ create mode 100644 xml/api/node-history-2.12.rng
+
+diff --git a/xml/Makefile.am b/xml/Makefile.am
+index b9448d4..8e7b6d3 100644
+--- a/xml/Makefile.am
++++ b/xml/Makefile.am
+@@ -64,7 +64,7 @@ API_request_base = command-output \
+ CIB_cfg_base = options nodes resources constraints fencing acls tags alerts
+
+ # Names of all schemas (including top level and those included by others)
+-API_base = $(API_request_base) fence-event failure generic-list item node-attrs nodes resources status
++API_base = $(API_request_base) fence-event failure generic-list item node-attrs node-history nodes resources status
+ CIB_base = cib $(CIB_cfg_base) status score rule nvset
+
+ # Static schema files and transforms (only CIB has transforms)
+diff --git a/xml/api/crm_mon-2.12.rng b/xml/api/crm_mon-2.12.rng
+index ffec923..be14412 100644
+--- a/xml/api/crm_mon-2.12.rng
++++ b/xml/api/crm_mon-2.12.rng
+@@ -20,7 +20,7 @@
+ <ref name="node-attributes-list" />
+ </optional>
+ <optional>
+- <ref name="node-history-list" />
++ <externalRef href="node-history-2.12.rng"/>
+ </optional>
+ <optional>
+ <ref name="failures-list" />
+@@ -113,14 +113,6 @@
+ </element>
+ </define>
+
+- <define name="node-history-list">
+- <element name="node_history">
+- <zeroOrMore>
+- <ref name="element-node-history" />
+- </zeroOrMore>
+- </element>
+- </define>
+-
+ <define name="failures-list">
+ <element name="failures">
+ <zeroOrMore>
+@@ -156,60 +148,6 @@
+ </element>
+ </define>
+
+- <define name="element-node-history">
+- <element name="node">
+- <attribute name="name"> <text /> </attribute>
+- <zeroOrMore>
+- <ref name="element-resource-history" />
+- </zeroOrMore>
+- </element>
+- </define>
+-
+- <define name="element-resource-history">
+- <element name="resource_history">
+- <attribute name="id"> <text /> </attribute>
+- <attribute name="orphan"> <data type="boolean" /> </attribute>
+- <optional>
+- <group>
+- <attribute name="migration-threshold"> <data type="nonNegativeInteger" /> </attribute>
+- <optional>
+- <attribute name="fail-count"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="last-failure"> <text /> </attribute>
+- </optional>
+- </group>
+- </optional>
+- <zeroOrMore>
+- <ref name="element-operation-history" />
+- </zeroOrMore>
+- </element>
+- </define>
+-
+- <define name="element-operation-history">
+- <element name="operation_history">
+- <attribute name="call"> <text /> </attribute>
+- <attribute name="task"> <text /> </attribute>
+- <optional>
+- <attribute name="interval"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="last-rc-change"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="last-run"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="exec-time"> <text /> </attribute>
+- </optional>
+- <optional>
+- <attribute name="queue-time"> <text /> </attribute>
+- </optional>
+- <attribute name="rc"> <data type="integer" /> </attribute>
+- <attribute name="rc_text"> <text /> </attribute>
+- </element>
+- </define>
+-
+ <define name="element-ticket">
+ <element name="ticket">
+ <attribute name="id"> <text /> </attribute>
+diff --git a/xml/api/node-history-2.12.rng b/xml/api/node-history-2.12.rng
+new file mode 100644
+index 0000000..9628000
+--- /dev/null
++++ b/xml/api/node-history-2.12.rng
+@@ -0,0 +1,70 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="node-history-list" />
++ </start>
++
++ <define name="node-history-list">
++ <element name="node_history">
++ <zeroOrMore>
++ <ref name="element-node-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-node-history">
++ <element name="node">
++ <attribute name="name"> <text /> </attribute>
++ <zeroOrMore>
++ <ref name="element-resource-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-resource-history">
++ <element name="resource_history">
++ <attribute name="id"> <text /> </attribute>
++ <attribute name="orphan"> <data type="boolean" /> </attribute>
++ <optional>
++ <group>
++ <attribute name="migration-threshold"> <data type="nonNegativeInteger" /> </attribute>
++ <optional>
++ <attribute name="fail-count"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-failure"> <text /> </attribute>
++ </optional>
++ </group>
++ </optional>
++ <zeroOrMore>
++ <ref name="element-operation-history" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-operation-history">
++ <element name="operation_history">
++ <attribute name="call"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="interval"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-rc-change"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="last-run"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="exec-time"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="queue-time"> <text /> </attribute>
++ </optional>
++ <attribute name="rc"> <data type="integer" /> </attribute>
++ <attribute name="rc_text"> <text /> </attribute>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From bf72b2615630eef7876e443d60b34d5a316de847 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Wed, 16 Jun 2021 14:09:31 -0400
+Subject: [PATCH 3/5] Low: schemas: Copy crm_simulate.rng in preparation for
+ changes.
+
+---
+ xml/api/crm_simulate-2.12.rng | 335 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 335 insertions(+)
+ create mode 100644 xml/api/crm_simulate-2.12.rng
+
+diff --git a/xml/api/crm_simulate-2.12.rng b/xml/api/crm_simulate-2.12.rng
+new file mode 100644
+index 0000000..9a7612d
+--- /dev/null
++++ b/xml/api/crm_simulate-2.12.rng
+@@ -0,0 +1,335 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<grammar xmlns="http://relaxng.org/ns/structure/1.0"
++ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
++
++ <start>
++ <ref name="element-crm-simulate"/>
++ </start>
++
++ <define name="element-crm-simulate">
++ <choice>
++ <ref name="timings-list" />
++ <group>
++ <ref name="cluster-status" />
++ <optional>
++ <ref name="modifications-list" />
++ </optional>
++ <optional>
++ <ref name="allocations-utilizations-list" />
++ </optional>
++ <optional>
++ <ref name="action-list" />
++ </optional>
++ <optional>
++ <ref name="cluster-injected-actions-list" />
++ <ref name="revised-cluster-status" />
++ </optional>
++ </group>
++ </choice>
++ </define>
++
++ <define name="allocations-utilizations-list">
++ <choice>
++ <element name="allocations">
++ <zeroOrMore>
++ <choice>
++ <ref name="element-allocation" />
++ <ref name="element-promotion" />
++ </choice>
++ </zeroOrMore>
++ </element>
++ <element name="utilizations">
++ <zeroOrMore>
++ <choice>
++ <ref name="element-capacity" />
++ <ref name="element-utilization" />
++ </choice>
++ </zeroOrMore>
++ </element>
++ <element name="allocations_utilizations">
++ <zeroOrMore>
++ <choice>
++ <ref name="element-allocation" />
++ <ref name="element-promotion" />
++ <ref name="element-capacity" />
++ <ref name="element-utilization" />
++ </choice>
++ </zeroOrMore>
++ </element>
++ </choice>
++ </define>
++
++ <define name="cluster-status">
++ <element name="cluster_status">
++ <ref name="nodes-list" />
++ <ref name="resources-list" />
++ <optional>
++ <ref name="node-attributes-list" />
++ </optional>
++ <optional>
++ <ref name="failures-list" />
++ </optional>
++ </element>
++ </define>
++
++ <define name="modifications-list">
++ <element name="modifications">
++ <optional>
++ <attribute name="quorum"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="watchdog"> <text /> </attribute>
++ </optional>
++ <zeroOrMore>
++ <ref name="element-inject-modify-node" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-inject-modify-ticket" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-inject-spec" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-inject-attr" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="revised-cluster-status">
++ <element name="revised_cluster_status">
++ <ref name="nodes-list" />
++ <ref name="resources-list" />
++ <optional>
++ <ref name="node-attributes-list" />
++ </optional>
++ <optional>
++ <ref name="failures-list" />
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-inject-attr">
++ <element name="inject_attr">
++ <attribute name="cib_node"> <text /> </attribute>
++ <attribute name="name"> <text /> </attribute>
++ <attribute name="node_path"> <text /> </attribute>
++ <attribute name="value"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-inject-modify-node">
++ <element name="modify_node">
++ <attribute name="action"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-inject-spec">
++ <element name="inject_spec">
++ <attribute name="spec"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-inject-modify-ticket">
++ <element name="modify_ticket">
++ <attribute name="action"> <text /> </attribute>
++ <attribute name="ticket"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="cluster-injected-actions-list">
++ <element name="transition">
++ <zeroOrMore>
++ <ref name="element-injected-actions" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="node-attributes-list">
++ <element name="node_attributes">
++ <zeroOrMore>
++ <externalRef href="node-attrs-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="failures-list">
++ <element name="failures">
++ <zeroOrMore>
++ <externalRef href="failure-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="nodes-list">
++ <element name="nodes">
++ <zeroOrMore>
++ <externalRef href="nodes-2.8.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="resources-list">
++ <element name="resources">
++ <zeroOrMore>
++ <externalRef href="resources-2.4.rng" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="timings-list">
++ <element name="timings">
++ <zeroOrMore>
++ <ref name="element-timing" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="action-list">
++ <element name="actions">
++ <zeroOrMore>
++ <ref name="element-node-action" />
++ </zeroOrMore>
++ <zeroOrMore>
++ <ref name="element-rsc-action" />
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-allocation">
++ <element name="node_weight">
++ <attribute name="function"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <externalRef href="../score.rng" />
++ <optional>
++ <attribute name="id"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-capacity">
++ <element name="capacity">
++ <attribute name="comment"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <zeroOrMore>
++ <element>
++ <anyName />
++ <text />
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++
++ <define name="element-inject-cluster-action">
++ <element name="cluster_action">
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="id"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-injected-actions">
++ <choice>
++ <ref name="element-inject-cluster-action" />
++ <ref name="element-inject-fencing-action" />
++ <ref name="element-inject-pseudo-action" />
++ <ref name="element-inject-rsc-action" />
++ </choice>
++ </define>
++
++ <define name="element-inject-fencing-action">
++ <element name="fencing_action">
++ <attribute name="op"> <text /> </attribute>
++ <attribute name="target"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-node-action">
++ <element name="node_action">
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="reason"> <text /> </attribute>
++ <attribute name="task"> <text /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-promotion">
++ <element name="promotion_score">
++ <attribute name="id"> <text /> </attribute>
++ <externalRef href="../score.rng" />
++ <optional>
++ <attribute name="node"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-inject-pseudo-action">
++ <element name="pseudo_action">
++ <attribute name="task"> <text /> </attribute>
++ <optional>
++ <attribute name="node"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-inject-rsc-action">
++ <element name="rsc_action">
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="op"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <optional>
++ <attribute name="interval"> <data type="integer" /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-timing">
++ <element name="timing">
++ <attribute name="file"> <text /> </attribute>
++ <attribute name="duration"> <data type="double" /> </attribute>
++ </element>
++ </define>
++
++ <define name="element-rsc-action">
++ <element name="rsc_action">
++ <attribute name="action"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <optional>
++ <attribute name="blocked"> <data type="boolean" /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="dest"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="next-role"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="node"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="reason"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="role"> <text /> </attribute>
++ </optional>
++ <optional>
++ <attribute name="source"> <text /> </attribute>
++ </optional>
++ </element>
++ </define>
++
++ <define name="element-utilization">
++ <element name="utilization">
++ <attribute name="function"> <text /> </attribute>
++ <attribute name="node"> <text /> </attribute>
++ <attribute name="resource"> <text /> </attribute>
++ <zeroOrMore>
++ <element>
++ <anyName />
++ <text />
++ </element>
++ </zeroOrMore>
++ </element>
++ </define>
++</grammar>
+--
+1.8.3.1
+
+
+From c46e07788788acf5669e3f89b9344190a91c7331 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 18 Jun 2021 15:10:19 -0400
+Subject: [PATCH 4/5] Feature: tools: Add the node-summary to crm_simulate
+ output.
+
+If --show-failcounts is given to crm_simulate, it should also display
+the node-summary message.
+
+See: rhbz#1686426
+---
+ tools/crm_simulate.c | 7 +++++--
+ xml/api/crm_simulate-2.12.rng | 3 +++
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c
+index b4aa9d1..2ea292c 100644
+--- a/tools/crm_simulate.c
++++ b/tools/crm_simulate.c
+@@ -409,11 +409,14 @@ print_cluster_status(pe_working_set_t * data_set, unsigned int print_opts)
+ FALSE, FALSE, all, all, FALSE);
+
+ if (options.show_attrs) {
+- out->message(out, "node-attribute-list", data_set,
+- 0, rc == pcmk_rc_ok, FALSE, FALSE, FALSE, all, all);
++ rc = out->message(out, "node-attribute-list", data_set,
++ 0, rc == pcmk_rc_ok, FALSE, FALSE, FALSE, all, all);
+ }
+
+ if (options.show_failcounts) {
++ rc = out->message(out, "node-summary", data_set, all, all,
++ 0, print_opts, FALSE, FALSE, FALSE, FALSE, rc == pcmk_rc_ok);
++
+ out->message(out, "failed-action-list", data_set, all, all,
+ rc == pcmk_rc_ok);
+ }
+diff --git a/xml/api/crm_simulate-2.12.rng b/xml/api/crm_simulate-2.12.rng
+index 9a7612d..f90bd36 100644
+--- a/xml/api/crm_simulate-2.12.rng
++++ b/xml/api/crm_simulate-2.12.rng
+@@ -67,6 +67,9 @@
+ <ref name="node-attributes-list" />
+ </optional>
+ <optional>
++ <externalRef href="node-history-2.12.rng" />
++ </optional>
++ <optional>
+ <ref name="failures-list" />
+ </optional>
+ </element>
+--
+1.8.3.1
+
+
+From bac50336e0264604716e5997b87ee7e65311b982 Mon Sep 17 00:00:00 2001
+From: Chris Lumens <clumens(a)redhat.com>
+Date: Fri, 18 Jun 2021 15:21:52 -0400
+Subject: [PATCH 5/5] Low: libcrmcommon: Increase PCMK__API_VERSION for new
+ crm_resource output.
+
+See: rhbz#1686426
+---
+ include/crm/common/output_internal.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
+index 0436cde..ba9c423 100644
+--- a/include/crm/common/output_internal.h
++++ b/include/crm/common/output_internal.h
+@@ -27,7 +27,7 @@ extern "C" {
+ # include <glib.h>
+ # include <crm/common/results.h>
+
+-# define PCMK__API_VERSION "2.11"
++# define PCMK__API_VERSION "2.12"
+
+ #if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS)
+ # define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS)))
+--
+1.8.3.1
+
diff --git a/007-unfencing-loop.patch b/007-unfencing-loop.patch
new file mode 100644
index 0000000..d4950c8
--- /dev/null
+++ b/007-unfencing-loop.patch
@@ -0,0 +1,733 @@
+From 6dcd6b51d7d3993bc483588d6ed75077518ed600 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 4 Jun 2021 16:30:55 -0500
+Subject: [PATCH 01/11] Low: controller: check whether unfenced node was remote
+ node
+
+... so the controller can indicate the node is remote (if known at that point,
+which is not guaranteed) when setting unfencing-related node attributes.
+---
+ daemons/controld/controld_fencing.c | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/daemons/controld/controld_fencing.c b/daemons/controld/controld_fencing.c
+index 23dff28..0fba661 100644
+--- a/daemons/controld/controld_fencing.c
++++ b/daemons/controld/controld_fencing.c
+@@ -757,15 +757,30 @@ tengine_stonith_callback(stonith_t *stonith, stonith_callback_data_t *data)
+ if (pcmk__str_eq("on", op, pcmk__str_casei)) {
+ const char *value = NULL;
+ char *now = pcmk__ttoa(time(NULL));
++ gboolean is_remote_node = FALSE;
++
++ /* This check is not 100% reliable, since this node is not
++ * guaranteed to have the remote node cached. However, it
++ * doesn't have to be reliable, since the attribute manager can
++ * learn a node's "remoteness" by other means sooner or later.
++ * This allows it to learn more quickly if this node does have
++ * the information.
++ */
++ if (g_hash_table_lookup(crm_remote_peer_cache, uuid) != NULL) {
++ is_remote_node = TRUE;
++ }
+
+- update_attrd(target, CRM_ATTR_UNFENCED, now, NULL, FALSE);
++ update_attrd(target, CRM_ATTR_UNFENCED, now, NULL,
++ is_remote_node);
+ free(now);
+
+ value = crm_meta_value(action->params, XML_OP_ATTR_DIGESTS_ALL);
+- update_attrd(target, CRM_ATTR_DIGESTS_ALL, value, NULL, FALSE);
++ update_attrd(target, CRM_ATTR_DIGESTS_ALL, value, NULL,
++ is_remote_node);
+
+ value = crm_meta_value(action->params, XML_OP_ATTR_DIGESTS_SECURE);
+- update_attrd(target, CRM_ATTR_DIGESTS_SECURE, value, NULL, FALSE);
++ update_attrd(target, CRM_ATTR_DIGESTS_SECURE, value, NULL,
++ is_remote_node);
+
+ } else if (action->sent_update == FALSE) {
+ send_stonith_update(action, target, uuid);
+--
+1.8.3.1
+
+
+From 3ef6d9403f68ab8559c45cc99f5a8da05ca6420b Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 10:50:36 -0500
+Subject: [PATCH 02/11] Refactor: pacemaker-attrd: functionize adding remote
+ node to cache
+
+... for future reuse
+---
+ daemons/attrd/attrd_commands.c | 34 +++++++++++++++++++++++-----------
+ 1 file changed, 23 insertions(+), 11 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 731c243..93a165b 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -102,6 +102,28 @@ free_attribute(gpointer data)
+ }
+ }
+
++/*!
++ * \internal
++ * \brief Ensure a Pacemaker Remote node is in the correct peer cache
++ *
++ * \param[in]
++ */
++static void
++cache_remote_node(const char *node_name)
++{
++ /* If we previously assumed this node was an unseen cluster node,
++ * remove its entry from the cluster peer cache.
++ */
++ crm_node_t *dup = pcmk__search_cluster_node_cache(0, node_name);
++
++ if (dup && (dup->uuid == NULL)) {
++ reap_crm_member(0, node_name);
++ }
++
++ // Ensure node is in the remote peer cache
++ CRM_ASSERT(crm_remote_peer_get(node_name) != NULL);
++}
++
+ static xmlNode *
+ build_attribute_xml(
+ xmlNode *parent, const char *name, const char *set, const char *uuid, unsigned int timeout_ms, const char *user,
+@@ -709,17 +731,7 @@ attrd_lookup_or_create_value(GHashTable *values, const char *host, xmlNode *xml)
+
+ crm_element_value_int(xml, PCMK__XA_ATTR_IS_REMOTE, &is_remote);
+ if (is_remote) {
+- /* If we previously assumed this node was an unseen cluster node,
+- * remove its entry from the cluster peer cache.
+- */
+- crm_node_t *dup = pcmk__search_cluster_node_cache(0, host);
+-
+- if (dup && (dup->uuid == NULL)) {
+- reap_crm_member(0, host);
+- }
+-
+- /* Ensure this host is in the remote peer cache */
+- CRM_ASSERT(crm_remote_peer_get(host) != NULL);
++ cache_remote_node(host);
+ }
+
+ if (v == NULL) {
+--
+1.8.3.1
+
+
+From 6fac2c71bc2c56870ac828d7cd7b7c799279c47e Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 10:39:34 -0500
+Subject: [PATCH 03/11] Refactor: pacemaker-attrd: don't try to remove votes
+ for remote nodes
+
+Remote nodes never vote.
+
+This has no effect in practice since the removal would simply do nothing,
+but we might as well not waste time trying.
+---
+ daemons/attrd/attrd_commands.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 93a165b..dbe777e 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -976,7 +976,8 @@ attrd_election_cb(gpointer user_data)
+ void
+ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *data)
+ {
+- bool remove_voter = FALSE;
++ bool gone = false;
++ bool is_remote = pcmk_is_set(peer->flags, crm_remote_node);
+
+ switch (kind) {
+ case crm_status_uname:
+@@ -984,7 +985,7 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+
+ case crm_status_processes:
+ if (!pcmk_is_set(peer->processes, crm_get_cluster_proc())) {
+- remove_voter = TRUE;
++ gone = true;
+ }
+ break;
+
+@@ -1000,13 +1001,13 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+ } else {
+ // Remove all attribute values associated with lost nodes
+ attrd_peer_remove(peer->uname, FALSE, "loss");
+- remove_voter = TRUE;
++ gone = true;
+ }
+ break;
+ }
+
+- // In case an election is in progress, remove any vote by the node
+- if (remove_voter) {
++ // Remove votes from cluster nodes that leave, in case election in progress
++ if (gone && !is_remote) {
+ attrd_remove_voter(peer);
+ }
+ }
+--
+1.8.3.1
+
+
+From 54089fc663d6aaf10ca164c6c94b3b17237788de Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 10:40:06 -0500
+Subject: [PATCH 04/11] Low: pacemaker-attrd: check for remote nodes in peer
+ update callback
+
+If a remote node was started before the local cluster node joined the cluster,
+the cluster node will assume its node attributes are for a cluster node until
+it learns otherwise. Check for remoteness in the peer update callback, to have
+another way we can learn it.
+---
+ daemons/attrd/attrd_commands.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index dbe777e..5f6a754 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -1009,6 +1009,10 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+ // Remove votes from cluster nodes that leave, in case election in progress
+ if (gone && !is_remote) {
+ attrd_remove_voter(peer);
++
++ // Ensure remote nodes that come up are in the remote node cache
++ } else if (!gone && is_remote) {
++ cache_remote_node(peer->uname);
+ }
+ }
+
+--
+1.8.3.1
+
+
+From 8c048df0312d0d9c857d87b570a352429a710928 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 11:29:12 -0500
+Subject: [PATCH 05/11] Log: pacemaker-attrd: log peer status changes
+
+---
+ daemons/attrd/attrd_commands.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 5f6a754..d6d179b 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -972,6 +972,7 @@ attrd_election_cb(gpointer user_data)
+ return FALSE;
+ }
+
++#define state_text(state) ((state)? (const char *)(state) : "in unknown state")
+
+ void
+ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *data)
+@@ -981,15 +982,23 @@ attrd_peer_change_cb(enum crm_status_type kind, crm_node_t *peer, const void *da
+
+ switch (kind) {
+ case crm_status_uname:
++ crm_debug("%s node %s is now %s",
++ (is_remote? "Remote" : "Cluster"),
++ peer->uname, state_text(peer->state));
+ break;
+
+ case crm_status_processes:
+ if (!pcmk_is_set(peer->processes, crm_get_cluster_proc())) {
+ gone = true;
+ }
++ crm_debug("Node %s is %s a peer",
++ peer->uname, (gone? "no longer" : "now"));
+ break;
+
+ case crm_status_nstate:
++ crm_debug("%s node %s is now %s (was %s)",
++ (is_remote? "Remote" : "Cluster"),
++ peer->uname, state_text(peer->state), state_text(data));
+ if (pcmk__str_eq(peer->state, CRM_NODE_MEMBER, pcmk__str_casei)) {
+ /* If we're the writer, send new peers a list of all attributes
+ * (unless it's a remote node, which doesn't run its own attrd)
+--
+1.8.3.1
+
+
+From 1dcc8dee4990cf0dbdec0e14db6d9a3ad67a41d5 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Mon, 7 Jun 2021 11:13:53 -0500
+Subject: [PATCH 06/11] Low: pacemaker-attrd: ensure node ID is only set for
+ attributes when known
+
+In most cases, attribute updates contained the node ID, and the node ID was
+used by other code, only if known (i.e. positive). However a couple places did
+not check this, so add that.
+
+I am unsure whether the missing check caused problems in practice, but there
+appears to be the possibility that a remote node would wrongly be added to the
+cluster node cache.
+---
+ daemons/attrd/attrd_commands.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index d6d179b..b3f441c 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -136,7 +136,9 @@ build_attribute_xml(
+ crm_xml_add(xml, PCMK__XA_ATTR_UUID, uuid);
+ crm_xml_add(xml, PCMK__XA_ATTR_USER, user);
+ crm_xml_add(xml, PCMK__XA_ATTR_NODE_NAME, peer);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, peerid);
++ if (peerid > 0) {
++ crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, peerid);
++ }
+ crm_xml_add(xml, PCMK__XA_ATTR_VALUE, value);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, timeout_ms/1000);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, is_private);
+@@ -937,7 +939,7 @@ attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter)
+ /* If this is a cluster node whose node ID we are learning, remember it */
+ if ((v->nodeid == 0) && (v->is_remote == FALSE)
+ && (crm_element_value_int(xml, PCMK__XA_ATTR_NODE_ID,
+- (int*)&v->nodeid) == 0)) {
++ (int*)&v->nodeid) == 0) && (v->nodeid > 0)) {
+
+ crm_node_t *known_peer = crm_get_peer(v->nodeid, host);
+
+--
+1.8.3.1
+
+
+From 8d12490e88b558d01db37a38f7d35175c6d2d69a Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Thu, 10 Jun 2021 17:25:57 -0500
+Subject: [PATCH 07/11] Refactor: pacemaker-attrd: functionize processing a
+ sync response
+
+... for code isolation, and because we need to add more to it
+---
+ daemons/attrd/attrd_commands.c | 59 ++++++++++++++++++++++++++++--------------
+ 1 file changed, 39 insertions(+), 20 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index b3f441c..d02d3e6 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -572,6 +572,43 @@ attrd_peer_clear_failure(crm_node_t *peer, xmlNode *xml)
+ }
+
+ /*!
++ * \internal
++ * \brief Load attributes from a peer sync response
++ *
++ * \param[in] peer Peer that sent clear request
++ * \param[in] peer_won Whether peer is the attribute writer
++ * \param[in] xml Request XML
++ */
++static void
++process_peer_sync_response(crm_node_t *peer, bool peer_won, xmlNode *xml)
++{
++ crm_info("Processing " PCMK__ATTRD_CMD_SYNC_RESPONSE " from %s",
++ peer->uname);
++
++ if (peer_won) {
++ /* Initialize the "seen" flag for all attributes to cleared, so we can
++ * detect attributes that local node has but the writer doesn't.
++ */
++ clear_attribute_value_seen();
++ }
++
++ // Process each attribute update in the sync response
++ for (xmlNode *child = pcmk__xml_first_child(xml); child != NULL;
++ child = pcmk__xml_next(child)) {
++ attrd_peer_update(peer, child,
++ crm_element_value(child, PCMK__XA_ATTR_NODE_NAME),
++ TRUE);
++ }
++
++ if (peer_won) {
++ /* If any attributes are still not marked as seen, the writer doesn't
++ * know about them, so send all peers an update with them.
++ */
++ attrd_current_only_attribute_update(peer, xml);
++ }
++}
++
++/*!
+ \internal
+ \brief Broadcast private attribute for local node with protocol version
+ */
+@@ -596,7 +633,7 @@ attrd_peer_message(crm_node_t *peer, xmlNode *xml)
+ const char *op = crm_element_value(xml, PCMK__XA_TASK);
+ const char *election_op = crm_element_value(xml, F_CRM_TASK);
+ const char *host = crm_element_value(xml, PCMK__XA_ATTR_NODE_NAME);
+- bool peer_won = FALSE;
++ bool peer_won = false;
+
+ if (election_op) {
+ attrd_handle_election_op(peer, xml);
+@@ -631,25 +668,7 @@ attrd_peer_message(crm_node_t *peer, xmlNode *xml)
+
+ } else if (pcmk__str_eq(op, PCMK__ATTRD_CMD_SYNC_RESPONSE, pcmk__str_casei)
+ && !pcmk__str_eq(peer->uname, attrd_cluster->uname, pcmk__str_casei)) {
+- xmlNode *child = NULL;
+-
+- crm_info("Processing %s from %s", op, peer->uname);
+-
+- /* Clear the seen flag for attribute processing held only in the own node. */
+- if (peer_won) {
+- clear_attribute_value_seen();
+- }
+-
+- for (child = pcmk__xml_first_child(xml); child != NULL;
+- child = pcmk__xml_next(child)) {
+- host = crm_element_value(child, PCMK__XA_ATTR_NODE_NAME);
+- attrd_peer_update(peer, child, host, TRUE);
+- }
+-
+- if (peer_won) {
+- /* Synchronize if there is an attribute held only by own node that Writer does not have. */
+- attrd_current_only_attribute_update(peer, xml);
+- }
++ process_peer_sync_response(peer, peer_won, xml);
+
+ } else if (pcmk__str_eq(op, PCMK__ATTRD_CMD_FLUSH, pcmk__str_casei)) {
+ /* Ignore. The flush command was removed in 2.0.0 but may be
+--
+1.8.3.1
+
+
+From a890a0e5bbbcabf907f51ed0460868035f72464d Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 11 Jun 2021 14:40:39 -0500
+Subject: [PATCH 08/11] Refactor: pacemaker-attrd: functionize broadcasting
+ local override
+
+... for code isolation
+---
+ daemons/attrd/attrd_commands.c | 42 +++++++++++++++++++++++++++++-------------
+ 1 file changed, 29 insertions(+), 13 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index d02d3e6..4783427 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -804,6 +804,34 @@ attrd_current_only_attribute_update(crm_node_t *peer, xmlNode *xml)
+ free_xml(sync);
+ }
+
++/*!
++ * \internal
++ * \brief Override an attribute sync with a local value
++ *
++ * Broadcast the local node's value for an attribute that's different from the
++ * value provided in a peer's attribute synchronization response. This ensures a
++ * node's values for itself take precedence and all peers are kept in sync.
++ *
++ * \param[in] a Attribute entry to override
++ *
++ * \return Local instance of attribute value
++ */
++static attribute_value_t *
++broadcast_local_value(attribute_t *a)
++{
++ attribute_value_t *v = g_hash_table_lookup(a->values, attrd_cluster->uname);
++ xmlNode *sync = create_xml_node(NULL, __func__);
++
++ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
++ build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms,
++ a->user, a->is_private, v->nodename, v->nodeid,
++ v->current, FALSE);
++ attrd_xml_add_writer(sync);
++ send_attrd_message(NULL, sync);
++ free_xml(sync);
++ return v;
++}
++
+ void
+ attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter)
+ {
+@@ -899,21 +927,9 @@ attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter)
+ if (filter && !pcmk__str_eq(v->current, value, pcmk__str_casei)
+ && pcmk__str_eq(host, attrd_cluster->uname, pcmk__str_casei)) {
+
+- xmlNode *sync = create_xml_node(NULL, __func__);
+-
+ crm_notice("%s[%s]: local value '%s' takes priority over '%s' from %s",
+ attr, host, v->current, value, peer->uname);
+-
+- crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
+- v = g_hash_table_lookup(a->values, host);
+- build_attribute_xml(sync, attr, a->set, a->uuid, a->timeout_ms, a->user,
+- a->is_private, v->nodename, v->nodeid, v->current, FALSE);
+-
+- attrd_xml_add_writer(sync);
+-
+- /* Broadcast in case any other nodes had the inconsistent value */
+- send_attrd_message(NULL, sync);
+- free_xml(sync);
++ v = broadcast_local_value(a);
+
+ } else if (!pcmk__str_eq(v->current, value, pcmk__str_casei)) {
+ crm_notice("Setting %s[%s]: %s -> %s " CRM_XS " from %s",
+--
+1.8.3.1
+
+
+From f6f65e3dab070f1bbdf6d1383f4d6173a8840bc9 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 11 Jun 2021 14:50:29 -0500
+Subject: [PATCH 09/11] Log: pacemaker-attrd: improve messages when
+ broadcasting local-only values
+
+The traces aren't necessary since build_attribute_xml() already logs the same
+info at debug. Also, rename function for clarity, and make static.
+---
+ daemons/attrd/attrd_commands.c | 35 ++++++++++++++++-------------------
+ 1 file changed, 16 insertions(+), 19 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 4783427..356defb 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -51,11 +51,12 @@ GHashTable *attributes = NULL;
+
+ void write_attribute(attribute_t *a, bool ignore_delay);
+ void write_or_elect_attribute(attribute_t *a);
+-void attrd_current_only_attribute_update(crm_node_t *peer, xmlNode *xml);
+ void attrd_peer_update(crm_node_t *peer, xmlNode *xml, const char *host, bool filter);
+ void attrd_peer_sync(crm_node_t *peer, xmlNode *xml);
+ void attrd_peer_remove(const char *host, gboolean uncache, const char *source);
+
++static void broadcast_unseen_local_values(crm_node_t *peer, xmlNode *xml);
++
+ static gboolean
+ send_attrd_message(crm_node_t * node, xmlNode * data)
+ {
+@@ -604,7 +605,7 @@ process_peer_sync_response(crm_node_t *peer, bool peer_won, xmlNode *xml)
+ /* If any attributes are still not marked as seen, the writer doesn't
+ * know about them, so send all peers an update with them.
+ */
+- attrd_current_only_attribute_update(peer, xml);
++ broadcast_unseen_local_values(peer, xml);
+ }
+ }
+
+@@ -768,40 +769,36 @@ attrd_lookup_or_create_value(GHashTable *values, const char *host, xmlNode *xml)
+ return(v);
+ }
+
+-void
+-attrd_current_only_attribute_update(crm_node_t *peer, xmlNode *xml)
++void
++broadcast_unseen_local_values(crm_node_t *peer, xmlNode *xml)
+ {
+ GHashTableIter aIter;
+ GHashTableIter vIter;
+- attribute_t *a;
++ attribute_t *a = NULL;
+ attribute_value_t *v = NULL;
+- xmlNode *sync = create_xml_node(NULL, __func__);
+- gboolean build = FALSE;
+-
+- crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
++ xmlNode *sync = NULL;
+
+ g_hash_table_iter_init(&aIter, attributes);
+ while (g_hash_table_iter_next(&aIter, NULL, (gpointer *) & a)) {
+ g_hash_table_iter_init(&vIter, a->values);
+ while (g_hash_table_iter_next(&vIter, NULL, (gpointer *) & v)) {
+- if (pcmk__str_eq(v->nodename, attrd_cluster->uname, pcmk__str_casei) && v->seen == FALSE) {
+- crm_trace("Syncing %s[%s] = %s to everyone.(from local only attributes)", a->id, v->nodename, v->current);
+-
+- build = TRUE;
++ if (!(v->seen) && pcmk__str_eq(v->nodename, attrd_cluster->uname,
++ pcmk__str_casei)) {
++ if (sync == NULL) {
++ sync = create_xml_node(NULL, __func__);
++ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
++ }
+ build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms, a->user, a->is_private,
+ v->nodename, v->nodeid, v->current, (a->timeout_ms && a->timer ? TRUE : FALSE));
+- } else {
+- crm_trace("Local attribute(%s[%s] = %s) was ignore.(another host) : [%s]", a->id, v->nodename, v->current, attrd_cluster->uname);
+- continue;
+ }
+ }
+ }
+
+- if (build) {
+- crm_debug("Syncing values to everyone.(from local only attributes)");
++ if (sync != NULL) {
++ crm_debug("Broadcasting local-only values");
+ send_attrd_message(NULL, sync);
++ free_xml(sync);
+ }
+- free_xml(sync);
+ }
+
+ /*!
+--
+1.8.3.1
+
+
+From ab90ffb785ea018556f216b8f540f8c3429a3947 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 11 Jun 2021 15:04:20 -0500
+Subject: [PATCH 10/11] Refactor: pacemaker-attrd: simplify attribute XML
+ creation function
+
+... and rename for clarity
+---
+ daemons/attrd/attrd_commands.c | 48 ++++++++++++++++++++++++------------------
+ 1 file changed, 27 insertions(+), 21 deletions(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 356defb..5b32a77 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -125,25 +125,35 @@ cache_remote_node(const char *node_name)
+ CRM_ASSERT(crm_remote_peer_get(node_name) != NULL);
+ }
+
++/*!
++ * \internal
++ * \brief Create an XML representation of an attribute for use in peer messages
++ *
++ * \param[in] parent Create attribute XML as child element of this element
++ * \param[in] a Attribute to represent
++ * \param[in] v Attribute value to represent
++ * \param[in] force_write If true, value should be written even if unchanged
++ *
++ * \return XML representation of attribute
++ */
+ static xmlNode *
+-build_attribute_xml(
+- xmlNode *parent, const char *name, const char *set, const char *uuid, unsigned int timeout_ms, const char *user,
+- gboolean is_private, const char *peer, uint32_t peerid, const char *value, gboolean is_force_write)
++add_attribute_value_xml(xmlNode *parent, attribute_t *a, attribute_value_t *v,
++ bool force_write)
+ {
+ xmlNode *xml = create_xml_node(parent, __func__);
+
+- crm_xml_add(xml, PCMK__XA_ATTR_NAME, name);
+- crm_xml_add(xml, PCMK__XA_ATTR_SET, set);
+- crm_xml_add(xml, PCMK__XA_ATTR_UUID, uuid);
+- crm_xml_add(xml, PCMK__XA_ATTR_USER, user);
+- crm_xml_add(xml, PCMK__XA_ATTR_NODE_NAME, peer);
+- if (peerid > 0) {
+- crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, peerid);
++ crm_xml_add(xml, PCMK__XA_ATTR_NAME, a->id);
++ crm_xml_add(xml, PCMK__XA_ATTR_SET, a->set);
++ crm_xml_add(xml, PCMK__XA_ATTR_UUID, a->uuid);
++ crm_xml_add(xml, PCMK__XA_ATTR_USER, a->user);
++ crm_xml_add(xml, PCMK__XA_ATTR_NODE_NAME, v->nodename);
++ if (v->nodeid > 0) {
++ crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, v->nodeid);
+ }
+- crm_xml_add(xml, PCMK__XA_ATTR_VALUE, value);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, timeout_ms/1000);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, is_private);
+- crm_xml_add_int(xml, PCMK__XA_ATTR_FORCE, is_force_write);
++ crm_xml_add(xml, PCMK__XA_ATTR_VALUE, v->current);
++ crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, a->timeout_ms / 1000);
++ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, a->is_private);
++ crm_xml_add_int(xml, PCMK__XA_ATTR_FORCE, force_write);
+
+ return xml;
+ }
+@@ -695,8 +705,7 @@ attrd_peer_sync(crm_node_t *peer, xmlNode *xml)
+ g_hash_table_iter_init(&vIter, a->values);
+ while (g_hash_table_iter_next(&vIter, NULL, (gpointer *) & v)) {
+ crm_debug("Syncing %s[%s] = %s to %s", a->id, v->nodename, v->current, peer?peer->uname:"everyone");
+- build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms, a->user, a->is_private,
+- v->nodename, v->nodeid, v->current, FALSE);
++ add_attribute_value_xml(sync, a, v, false);
+ }
+ }
+
+@@ -788,8 +797,7 @@ broadcast_unseen_local_values(crm_node_t *peer, xmlNode *xml)
+ sync = create_xml_node(NULL, __func__);
+ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
+ }
+- build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms, a->user, a->is_private,
+- v->nodename, v->nodeid, v->current, (a->timeout_ms && a->timer ? TRUE : FALSE));
++ add_attribute_value_xml(sync, a, v, a->timeout_ms && a->timer);
+ }
+ }
+ }
+@@ -820,9 +828,7 @@ broadcast_local_value(attribute_t *a)
+ xmlNode *sync = create_xml_node(NULL, __func__);
+
+ crm_xml_add(sync, PCMK__XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE);
+- build_attribute_xml(sync, a->id, a->set, a->uuid, a->timeout_ms,
+- a->user, a->is_private, v->nodename, v->nodeid,
+- v->current, FALSE);
++ add_attribute_value_xml(sync, a, v, false);
+ attrd_xml_add_writer(sync);
+ send_attrd_message(NULL, sync);
+ free_xml(sync);
+--
+1.8.3.1
+
+
+From 540d74130c5c8d9c626d6c50475e4dc4f64234e7 Mon Sep 17 00:00:00 2001
+From: Ken Gaillot <kgaillot(a)redhat.com>
+Date: Fri, 4 Jun 2021 16:34:26 -0500
+Subject: [PATCH 11/11] Fix: pacemaker-attrd: avoid repeated unfencing of
+ remote nodes
+
+The attribute manager can't record a remote node's attributes to the CIB until
+it knows the node is remote. Normally, this is learned when the remote node
+starts, because the controller clears the CRM_OP_PROBED attribute and indicates
+that it is for a remote node.
+
+However, if a cluster node is down when a remote node starts, and later comes
+up, it learns the remote node's existing attributes as part of the attribute
+sync. Previously, this did not include whether each value is for a cluster or
+remote node, so the newly joined attribute manager couldn't write out remote
+nodes' attributes until it learned that via some other event -- which might not
+happen before the node becomes DC, in which case its scheduler will not see any
+unfencing-related node attributes and may wrongly schedule unfencing.
+
+The sync response handling already calls attrd_lookup_or_create_value(), which
+checks PCMK__XA_ATTR_IS_REMOTE, so all we need to do is add that to the sync
+response.
+---
+ daemons/attrd/attrd_commands.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/daemons/attrd/attrd_commands.c b/daemons/attrd/attrd_commands.c
+index 5b32a77..0142383 100644
+--- a/daemons/attrd/attrd_commands.c
++++ b/daemons/attrd/attrd_commands.c
+@@ -43,8 +43,9 @@
+ * 1 1.1.15 PCMK__ATTRD_CMD_UPDATE_BOTH,
+ * PCMK__ATTRD_CMD_UPDATE_DELAY
+ * 2 1.1.17 PCMK__ATTRD_CMD_CLEAR_FAILURE
++ * 3 2.1.1 PCMK__ATTRD_CMD_SYNC_RESPONSE indicates remote nodes
+ */
+-#define ATTRD_PROTOCOL_VERSION "2"
++#define ATTRD_PROTOCOL_VERSION "3"
+
+ int last_cib_op_done = 0;
+ GHashTable *attributes = NULL;
+@@ -150,6 +151,9 @@ add_attribute_value_xml(xmlNode *parent, attribute_t *a, attribute_value_t *v,
+ if (v->nodeid > 0) {
+ crm_xml_add_int(xml, PCMK__XA_ATTR_NODE_ID, v->nodeid);
+ }
++ if (v->is_remote != 0) {
++ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_REMOTE, 1);
++ }
+ crm_xml_add(xml, PCMK__XA_ATTR_VALUE, v->current);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, a->timeout_ms / 1000);
+ crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, a->is_private);
+--
+1.8.3.1
+
diff --git a/gating.yaml b/gating.yaml
index 9e15ced..e8aadb9 100644
--- a/gating.yaml
+++ b/gating.yaml
@@ -5,6 +5,7 @@ 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-*
@@ -13,3 +14,9 @@ subject_type: koji_build
rules:
- !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional}
+--- !Policy
+product_versions:
+ - rhel-*
+decision_context: osci_compose_gate
+rules:
+ - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
diff --git a/pacemaker.spec b/pacemaker.spec
index 9742377..1d85eaf 100644
--- a/pacemaker.spec
+++ b/pacemaker.spec
@@ -1,9 +1,9 @@
-# Globals and defines to control package behavior (configure these as desired)
+# User-configurable globals and defines to control package behavior
+# (these should not test {with X} values, which are declared later)
## User and group to use for nonprivileged services
%global uname hacluster
%global gname haclient
-%global hacluster_id 189
## Where to install Pacemaker documentation
%if 0%{?rhel}
@@ -17,6 +17,13 @@
## Where bug reports should be submitted
## Leave bug_url undefined to use ClusterLabs default, others define it here
+%if 0%{?rhel}
+%global bug_url https://bugzilla.redhat.com/
+%else
+%if 0%{?fedora}
+%global bug_url https://bugz.fedoraproject.org/%{name}
+%endif
+%endif
## What to use as the OCF resource agent root directory
%global ocf_root %{_prefix}/lib/ocf
@@ -25,19 +32,21 @@
## can be incremented to build packages reliably considered "newer"
## than previously built packages with the same pcmkversion)
%global pcmkversion 2.1.0
-%global specversion 5
+%global specversion 6
+
+## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build
+%global commit 7c3f660707a495a1331716ad32cd3ac9d9f8ff58
-## Upstream commit (or git tag, such as "Pacemaker-" plus the
-## {pcmkversion} macro for an official release) to use for this package
-%global commit Pacemaker-2.1.0-rc3
## Since git v2.11, the extent of abbreviation is autoscaled by default
## (used to be constant of 7), so we need to convey it for non-tags, too.
%global commit_abbrev 9
+
# Define conditionals so that "rpmbuild --with <feature>" and
# "rpmbuild --without <feature>" can enable and disable specific features
-## NOTE: skip --with stonithd
+## Add option to enable support for stonith/external fencing agents
+%bcond_with stonithd
## Add option for whether to support storing sensitive information outside CIB
%if (0%{?fedora} && 0%{?fedora} <= 33) || (0%{?rhel} && 0%{?rhel} <= 8)
@@ -52,8 +61,13 @@
## Add option to create binaries with coverage analysis
%bcond_with coverage
-## Add option to skip/enable generating documentation
+## Add option to skip (or enable, on RHEL) generating documentation
+## (the build tools aren't available everywhere)
+%if 0%{?rhel}
+%bcond_with doc
+%else
%bcond_without doc
+%endif
## Add option to default to start-up synchronization with SBD.
##
@@ -66,16 +80,19 @@
## Add option to prefix package version with "0."
## (so later "official" packages will be considered updates)
-%bcond_without pre_release
+%bcond_with pre_release
## NOTE: skip --with upstart_job
## Add option to turn off hardening of libraries and daemon executables
%bcond_without hardening
-## Add option to enable links for legacy daemon names
+## Add option to enable (or disable, on RHEL 8) links for legacy daemon names
+%if 0%{?rhel} && 0%{?rhel} <= 8
+%bcond_without legacy_links
+%else
%bcond_with legacy_links
-
+%endif
## Nagios source control identifiers
%global nagios_name nagios-agents-metadata
@@ -94,29 +111,36 @@
## Portion of export/dist tarball name after "pacemaker-", and release version
%if 0%{tag_release}
-%define archive_version %{commit}
+%define archive_version %(c=%{commit}; echo ${c:10})
%define archive_github_url %{commit}#/%{name}-%{archive_version}.tar.gz
-%define pcmk_release %(c=%{commit}; case $c in *-rc[[:digit:]]*%{rparen}
- echo 0.%{specversion}.${c: -3} ;;
- *%{rparen} echo %{specversion} ;; esac)
%else
%define archive_version %(c=%{commit}; echo ${c:0:%{commit_abbrev}})
%define archive_github_url %{archive_version}#/%{name}-%{archive_version}.tar.gz
-%if %{with pre_release}
-%define pcmk_release 0.%{specversion}.%{archive_version}.git
-%else
-%define pcmk_release %{specversion}.%{archive_version}.git
-%endif
%endif
+### Always use a simple release number
+%define pcmk_release %{specversion}
## Base GnuTLS cipher priorities (presumably only the initial, required keyword)
## overridable with "rpmbuild --define 'pcmk_gnutls_priorities PRIORITY-SPEC'"
%define gnutls_priorities %{?pcmk_gnutls_priorities}%{!?pcmk_gnutls_priorities:@SYSTEM}
+## Different distros name certain packages differently
+## (note: corosync libraries also differ, but all provide corosync-devel)
+%global pkgname_libtool_devel libtool-ltdl-devel
+%global pkgname_libtool_devel_arch libtool-ltdl-devel%{?_isa}
+%global pkgname_bzip2_devel bzip2-devel
+%global pkgname_docbook_xsl docbook-style-xsl
+%global pkgname_gnutls_devel gnutls-devel
+%global pkgname_shadow_utils shadow-utils
+%global pkgname_procps procps-ng
+%global pkgname_glue_libs cluster-glue-libs
+%global pkgname_pcmk_libs %{name}-libs
+%global hacluster_id 189
+
## Distro-specific configuration choices
### Use 2.0-style output when other distro packages don't support current output
-%if 0%{?fedora}
+%if 0%{?fedora} || ( 0%{?rhel} && 0%{?rhel} <= 8 )
%global compat20 --enable-compat-2.0
%endif
@@ -130,6 +154,7 @@
%global resource_stickiness --with-resource-stickiness-default=1
%endif
+
# Python-related definitions
## Turn off auto-compilation of Python files outside Python specific paths,
@@ -145,13 +170,24 @@
sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g'; })
%endif
-## Values that differ by Python major version
+## Prefer Python 3 definitions explicitly, in case 2 is also available
+%if %{defined __python3}
%global python_name python3
-%global python_path %{?__python3}%{!?__python3:/usr/bin/python%{?python3_pkgversion}%{!?python3_pkgversion:3}}
+%global python_path %{__python3}
%define python_site %{?python3_sitelib}%{!?python3_sitelib:%(
%{python_path} -c 'from distutils.sysconfig import get_python_lib as gpl; print(gpl(1))' 2>/dev/null)}
-%global python_min 3.2
-# python_min still required?
+%else
+%if %{defined python_version}
+%global python_name python%(echo %{python_version} | cut -d'.' -f1)
+%define python_path %{?__python}%{!?__python:/usr/bin/%{python_name}}
+%else
+%global python_name python
+%global python_path %{?__python}%{!?__python:/usr/bin/python%{?python_pkgversion}}
+%endif
+%define python_site %{?python_sitelib}%{!?python_sitelib:%(
+ %{python_name} -c 'from distutils.sysconfig import get_python_lib as gpl; print(gpl(1))' 2>/dev/null)}
+%endif
+
# Keep sane profiling data if requested
%if %{with profiling}
@@ -167,22 +203,44 @@ Summary: Scalable High-Availability cluster resource manager
Version: %{pcmkversion}
Release: %{pcmk_release}%{?dist}
License: GPLv2+ and LGPLv2+
-Url: https://www.clusterlabs.org
-
-# Hint: use "spectool -s 0 pacemaker.spec" (rpmdevtools) to check the final URL
+Url: https://www.clusterlabs.org/
+
+# Example: https://codeload.github.com/ClusterLabs/pacemaker/tar.gz/e91769e
+# will download pacemaker-e91769e.tar.gz
+#
+# The ending part starting with '#' is ignored by github but necessary for
+# rpmbuild to know what the tar archive name is. (The downloaded file will be
+# named correctly only for commit IDs, not tagged releases.)
+#
+# You can use "spectool -s 0 pacemaker.spec" (rpmdevtools) to show final URL.
Source0: https://codeload.github.com/%{github_owner}/%{name}/tar.gz/%{archive_gith...
Source1: https://codeload.github.com/%{github_owner}/%{nagios_name}/tar.gz/%{nagio...
-# ---
+
+# upstream commits
+Patch1: 001-ping-agent.patch
+Patch2: 002-pacemakerd-options.patch
+Patch3: 003-pacemakerd-output.patch
+Patch4: 004-check-level.patch
+Patch5: 005-crm_resource.patch
+Patch6: 006-crm_simulate.patch
+Patch7: 007-unfencing-loop.patch
Requires: resource-agents
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cluster-libs%{?_isa} = %{version}-%{release}
Requires: %{name}-cli = %{version}-%{release}
%{?systemd_requires}
-# Pacemaker requires a minimum Python functionality
-Requires: %{python_name} >= %{python_min}
-BuildRequires: %{python_name}-devel >= %{python_min}
+%if %{defined centos}
+ExclusiveArch: aarch64 i686 ppc64le s390x x86_64 %{arm}
+%else
+%if 0%{?rhel}
+ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
+%endif
+%endif
+
+Requires: %{python_path}
+BuildRequires: %{python_name}-devel
# Pacemaker requires a minimum libqb functionality
Requires: libqb >= 0.17.0
@@ -191,37 +249,41 @@ BuildRequires: libqb-devel >= 0.17.0
# Required basic build tools
BuildRequires: coreutils findutils grep sed
BuildRequires: autoconf automake gcc make pkgconfig
-BuildRequires: libtool libtool-ltdl-devel
+BuildRequires: libtool %{?pkgname_libtool_devel}
# Required for core functionality
BuildRequires: pkgconfig(glib-2.0) >= 2.42
BuildRequires: libxml2-devel libxslt-devel libuuid-devel
-BuildRequires: bzip2-devel
+BuildRequires: %{pkgname_bzip2_devel}
# Enables optional functionality
-BuildRequires: ncurses-devel docbook-style-xsl
-BuildRequires: help2man gnutls-devel pam-devel pkgconfig(dbus-1)
+BuildRequires: ncurses-devel %{pkgname_docbook_xsl}
+BuildRequires: help2man %{pkgname_gnutls_devel} pam-devel pkgconfig(dbus-1)
BuildRequires: pkgconfig(systemd)
+# RH patches are created by git, so we need git to apply them
+BuildRequires: git
+
Requires: corosync >= 2.0.0
BuildRequires: corosync-devel >= 2.0.0
-#XXX
-#BuildRequires: pkgconfig(libcpg)
-#BuildRequires: pkgconfig(libcfg)
+
+%if %{with stonithd}
+BuildRequires: %{pkgname_glue_libs}-devel
+%endif
%if %{with doc}
BuildRequires: asciidoc inkscape %{python_name}-sphinx
%endif
-# git-style patch application
-#BuildRequires: git
-
Provides: pcmk-cluster-manager = %{version}-%{release}
Provides: pcmk-cluster-manager%{?_isa} = %{version}-%{release}
-# Pacemaker uses the crypto/md5 module from gnulib
+# Bundled bits
+## Pacemaker uses the crypto/md5-buffer module from gnulib
+%if 0%{?fedora} || 0%{?rhel}
Provides: bundled(gnulib)
+%endif
%description
Pacemaker is an advanced, scalable High-Availability cluster resource
@@ -235,18 +297,18 @@ when related resources fail and can be configured to periodically check
resource health.
Available rpmbuild rebuild options:
- --with(out) : cibsecrets coverage doc hardening pre_release profiling
+ --with(out) : cibsecrets coverage doc hardening pre_release profiling stonithd
%package cli
License: GPLv2+ and LGPLv2+
Summary: Command line tools for controlling Pacemaker clusters
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Recommends: pcmk-cluster-manager = %{version}-%{release}
# For crm_report
Recommends: tar
Recommends: bzip2
Requires: perl-TimeDate
-Requires: procps-ng
+Requires: %{pkgname_procps}
Requires: psmisc
Requires(post):coreutils
@@ -258,28 +320,29 @@ The %{name}-cli package contains command line tools that can be used
to query and control the cluster from machines that may, or may not,
be part of the cluster.
-%package libs
+%package -n %{pkgname_pcmk_libs}
License: GPLv2+ and LGPLv2+
Summary: Core Pacemaker libraries
-Requires(pre): shadow-utils
+Requires(pre): %{pkgname_shadow_utils}
Requires: %{name}-schemas = %{version}-%{release}
# sbd 1.4.0+ supports the libpe_status API for pe_working_set_t
# sbd 1.4.2+ supports startup/shutdown handshake via pacemakerd-api
# and handshake defaults to enabled for rhel builds
-# sbd 1.4.3+ handshake defaults to enabled for fedora builds
-Conflicts: sbd < 1.4.3
+# sbd 1.5.0+ handshake defaults to enabled with upstream sbd-release
+# implicitly supports handshake defaults to enabled in this spec
+Conflicts: sbd < 1.5.0
-%description libs
+%description -n %{pkgname_pcmk_libs}
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
-The %{name}-libs package contains shared libraries needed for cluster
+The %{pkgname_pcmk_libs} package contains shared libraries needed for cluster
nodes and those just running the CLI tools.
%package cluster-libs
License: GPLv2+ and LGPLv2+
Summary: Cluster Libraries used by Pacemaker
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
%description cluster-libs
Pacemaker is an advanced, scalable High-Availability cluster resource
@@ -291,7 +354,7 @@ libraries needed for nodes that will form part of the cluster nodes.
%package remote
License: GPLv2+ and LGPLv2+
Summary: Pacemaker remote executor daemon for non-cluster nodes
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cli = %{version}-%{release}
Requires: resource-agents
# -remote can be fully independent of systemd
@@ -307,35 +370,40 @@ The %{name}-remote package contains the Pacemaker Remote daemon
which is capable of extending pacemaker functionality to remote
nodes not running the full corosync/cluster stack.
-%package libs-devel
+%package -n %{pkgname_pcmk_libs}-devel
License: GPLv2+ and LGPLv2+
Summary: Pacemaker development package
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{pkgname_pcmk_libs}%{?_isa} = %{version}-%{release}
Requires: %{name}-cluster-libs%{?_isa} = %{version}-%{release}
-Requires: libtool-ltdl-devel%{?_isa} libuuid-devel%{?_isa}
+Requires: %{?pkgname_libtool_devel_arch} libuuid-devel%{?_isa}
Requires: libxml2-devel%{?_isa} libxslt-devel%{?_isa}
-Requires: bzip2-devel%{?_isa} glib2-devel%{?_isa}
+Requires: %{pkgname_bzip2_devel}%{?_isa} glib2-devel%{?_isa}
Requires: libqb-devel%{?_isa}
Requires: corosync-devel%{?_isa} >= 2.0.0
-%description libs-devel
+%description -n %{pkgname_pcmk_libs}-devel
Pacemaker is an advanced, scalable High-Availability cluster resource
manager.
-The %{name}-libs-devel package contains headers and shared libraries
+The %{pkgname_pcmk_libs}-devel package contains headers and shared libraries
for developing tools for Pacemaker.
%package cts
License: GPLv2+ and LGPLv2+
Summary: Test framework for cluster-related technologies like Pacemaker
Requires: %{python_path}
-Requires: %{python_name} >= %{python_min}
-Requires: %{name}-libs = %{version}-%{release}
-Requires: procps-ng
+Requires: %{pkgname_pcmk_libs} = %{version}-%{release}
+Requires: %{name}-cli = %{version}-%{release}
+Requires: %{pkgname_procps}
Requires: psmisc
BuildArch: noarch
+# systemd Python bindings are a separate package in some distros
+%if %{defined systemd_requires}
+%if %{defined fedora} || %{defined rhel}
Requires: %{python_name}-systemd
+%endif
+%endif
%description cts
Test framework for cluster-related technologies like Pacemaker
@@ -381,10 +449,11 @@ The metadata files required for Pacemaker to execute the nagios plugin
monitor resources.
%prep
-%setup -q -a 1 -n %{name}-%{archive_version}
+%autosetup -a 1 -n %{name}-%{archive_version} -S git_am -p 1
# in f33 s390x complains but shouldn't hurt globally
# as configure.ac is checking for support
sed -i configure.ac -e "s/-Wall/-Wall -Wno-format-truncation/"
+
%build
export systemdsystemunitdir=%{?_unitdir}%{!?_unitdir:no}
@@ -421,11 +490,10 @@ export LDFLAGS_HARDENED_LIB="%{?_hardening_ldflags}"
--with-initdir=%{_initrddir} \
--with-runstatedir=%{_rundir} \
--localstatedir=%{_var} \
- --with-version=%{version}-%{release} \
- --with-bug-url=https://bugz.fedoraproject.org/%{name} \
- --with-nagios \
- --with-nagios-metadata-dir=%{_datadir}/pacemaker/nagios/plugins-metadata/ \
- --with-nagios-plugin-dir=%{_libdir}/nagios/plugins/
+ --with-nagios \
+ --with-nagios-metadata-dir=%{_datadir}/pacemaker/nagios/plugins-metadata/ \
+ --with-nagios-plugin-dir=%{_libdir}/nagios/plugins/ \
+ --with-version=%{version}-%{release}
make %{_smp_mflags} V=1
@@ -454,11 +522,7 @@ done
mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/lib/rpm-state/%{name}
-# These are not actually scripts
-find %{buildroot} -name '*.xml' -type f -print0 | xargs -0 chmod a-x
-
-# Don't package static libs
-find %{buildroot} -name '*.a' -type f -print0 | xargs -0 rm -f
+# Don't package libtool archives
find %{buildroot} -name '*.la' -type f -print0 | xargs -0 rm -f
# Do not package these either
@@ -476,7 +540,7 @@ rm -f %{buildroot}/%{_initrddir}/pacemaker
rm -f %{buildroot}/%{_initrddir}/pacemaker_remote
# Byte-compile Python sources where suitable and the distro procedures known
-%if %{defined py_byte_compile} && %{defined python_path}
+%if %{defined py_byte_compile}
%{py_byte_compile %{python_path} %{buildroot}%{_datadir}/pacemaker/tests}
%if !%{defined _python_bytecompile_extra}
%{py_byte_compile %{python_path} %{buildroot}%{python_site}/cts}
@@ -553,15 +617,14 @@ fi
%postun cli
%systemd_postun_with_restart crm_mon.service
-%pre libs
-# XXX keep an eye on https://fedoraproject.org/wiki/Changes/SystemdSysusers
-# reopened recently:
-# https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.o...
+%pre -n %{pkgname_pcmk_libs}
+# @TODO Use sysusers.d:
+# https://fedoraproject.org/wiki/Changes/Adopting_sysusers.d_format
getent group %{gname} >/dev/null || groupadd -r %{gname} -g %{hacluster_id}
getent passwd %{uname} >/dev/null || useradd -r -g %{gname} -u %{hacluster_id} -s /sbin/nologin -c "cluster user" %{uname}
exit 0
-%ldconfig_scriptlets libs
+%ldconfig_scriptlets -n %{pkgname_pcmk_libs}
%ldconfig_scriptlets cluster-libs
%files
@@ -668,7 +731,7 @@ exit 0
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker/bundles
-%files libs
+%files -n %{pkgname_pcmk_libs}
%{_libdir}/libcib.so.*
%{_libdir}/liblrmd.so.*
%{_libdir}/libcrmservice.so.*
@@ -717,7 +780,7 @@ exit 0
%doc COPYING
%doc ChangeLog
-%files libs-devel
+%files -n %{pkgname_pcmk_libs}-devel
%{_includedir}/pacemaker
%{_libdir}/*.so
%if %{with coverage}
@@ -743,9 +806,15 @@ exit 0
%license %{nagios_name}-%{nagios_hash}/COPYING
%changelog
+* Mon Jul 5 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-6
+- synced/merged with CS9 spec-file for current 2.1.0-release build
+
* Tue Jun 8 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-0.5.rc3
- silence f33 s390x build complaining about possible format-trucation
+* Mon Jun 07 2021 Python Maint <python-maint(a)redhat.com> - 2.1.0-0.4.rc3.1
+- Rebuilt for Python 3.10
+
* Mon Jun 7 2021 Klaus Wenninger <kwenning(a)redhat.com> - 2.1.0-0.4.rc3
- Update for new upstream tarball for release candidate: Pacemaker-2.1.0-rc3,
for full details, see included ChangeLog file or
diff --git a/sources b/sources
index af5cd77..2ab7f32 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
SHA512 (nagios-agents-metadata-105ab8a7b2c16b9a29cf1c1596b80136eeef332b.tar.gz) = 11ddeb48a4929e7642b6dfa9c7962aa1d7a1af1c569830f55ed6cd6773abac13377317327bc1db8411c8077884f83f81cc54d746c834b63a99fa6dc219b5caad
-SHA512 (pacemaker-Pacemaker-2.1.0-rc3.tar.gz) = eb17566e079d313394dab509b055e326b642508844d974a21cde62509a3a526e44977a57c65f80d5094f085fec8ad92eda0deed4f4dfd32ecf0c3b80722e5504
+SHA512 (pacemaker-7c3f66070.tar.gz) = e1c53d019c965395affc1bd78358927617c9bc8572c405ee884737a8213455c5e85102e6f58bb5239ab23ebe5aa794f72c9cc0746900b7a6cc14fd3cf1879064
2 years, 9 months