diff --git a/.gitignore b/.gitignore
index 99144f3..fbe8060 100644
--- a/.gitignore
+++ b/.gitignore
@@ -115,3 +115,13 @@
/pcs-0.11.7.tar.gz
/pcs-web-ui-0.1.18.tar.gz
/pcs-web-ui-node-modules-0.1.18.tar.xz
+/pcs-0.11.8.tar.gz
+/pcs-web-ui-0.1.20.tar.gz
+/pcs-web-ui-node-modules-0.1.20.tar.xz
+/pcs-0.12.0.tar.gz
+/pcs-web-ui-0.1.22.tar.gz
+/pcs-web-ui-node-modules-0.1.22.tar.xz
+/dacite-1.9.2.tar.gz
+/pcs-0.12.1.tar.gz
+/pcs-web-ui-0.1.23.tar.gz
+/pcs-web-ui-node-modules-0.1.23.tar.xz
diff --git a/do-not-require-wheel.patch b/do-not-require-wheel.patch
new file mode 100644
index 0000000..2aab9ce
--- /dev/null
+++ b/do-not-require-wheel.patch
@@ -0,0 +1,63 @@
+From 72588f150e89b6f06810321245a13157b7e00b09 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Miro=20Hron=C4=8Dok?=
+Date: Tue, 29 Jul 2025 23:42:00 +0200
+Subject: [PATCH] Do not require wheel when setuptools is new enough
+
+Current version of setuptools creates wheels on its own.
+---
+ README.md | 2 +-
+ configure.ac | 7 +++++--
+ rpm/pcs.spec.in | 2 +-
+ 3 files changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/README.md b/README.md
+index a06143eba..636485be6 100644
+--- a/README.md
++++ b/README.md
+@@ -47,7 +47,7 @@ Apart from the dependencies listed above, these are also required for
+ installation:
+
+ * python development files (packages python3-devel, python3-setuptools 66.1+,
+- python3-pip, python3-wheel)
++ python3-pip, python3-wheel if python3-setuptools < 71)
+ * ruby development files (package ruby-devel)
+ * rubygems
+ * rubygem bundler (package rubygem-bundler or ruby-bundler or bundler)
+diff --git a/configure.ac b/configure.ac
+index 4e7d36599..0a782bfa7 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -347,12 +347,15 @@ AC_SUBST([PYAGENTX_VERSION])
+
+ # pip 19.0 required for PEP517 support
+ PCS_CHECK_PYMOD([pip], [>= 23.0])
+-# pip builds a wheel first
+-PCS_CHECK_PYMOD([wheel])
+
+ if test "x$tests_only" != "xyes"; then
+ # setuptools 61.0.0 required for PEP621 support
+ PCS_CHECK_PYMOD([setuptools], [>= 66.1])
++ # wheel is required if setuptools < 71
++ AC_PIP_MODULE([setuptools], [>= 71], [], [], [need_wheel=yes])
++ if test "x$need_wheel" = "xyes"; then
++ PCS_CHECK_PYMOD([wheel])
++ fi
+ PCS_CHECK_PYMOD([cryptography])
+ PCS_CHECK_PYMOD([lxml])
+ PCS_CHECK_PYMOD([pyparsing], [>= 3.0.0])
+diff --git a/rpm/pcs.spec.in b/rpm/pcs.spec.in
+index 55881a398..639a3e974 100644
+--- a/rpm/pcs.spec.in
++++ b/rpm/pcs.spec.in
+@@ -86,7 +86,7 @@ BuildRequires: python%{python3_version}-pip >= 23
+ BuildRequires: python%{python3_version}-setuptools >= 66.1
+
+ # for building wheel during make install
+-BuildRequires: python%{python3_version}-wheel
++BuildRequires: (python%{python3_version}-wheel if python%{python3_version}-setuptools < 71)
+
+ # for bundling dateutil
+ %if "@cirpmworkarounds@" != "yes"
+--
+2.50.1
+
diff --git a/fix-pcsd-not-starting-with-older-rack.patch b/fix-pcsd-not-starting-with-older-rack.patch
new file mode 100644
index 0000000..e18f4ef
--- /dev/null
+++ b/fix-pcsd-not-starting-with-older-rack.patch
@@ -0,0 +1,32 @@
+From a2899ef0e20bb638f47e74077281e73f4f18faf3 Mon Sep 17 00:00:00 2001
+From: Miroslav Lisik
+Date: Thu, 10 Jul 2025 19:48:28 +0200
+Subject: [PATCH 2/2] fix ruby NameError exception in pcsd/pcsd.rb occuring
+ with older rack
+
+---
+ pcsd/pcsd.rb | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/pcsd/pcsd.rb b/pcsd/pcsd.rb
+index e8ae9f106..c9f668851 100644
+--- a/pcsd/pcsd.rb
++++ b/pcsd/pcsd.rb
+@@ -74,9 +74,11 @@ configure do
+ CAPABILITIES_PCSD = capabilities_pcsd.freeze
+ end
+
+-error Rack::QueryParser::QueryLimitError do
+- $logger.warn(env['sinatra.error'].message)
+- return 400, env['sinatra.error'].message
++if Rack.const_defined?(:QueryParser) and Rack::QueryParser.const_defined?(:QueryLimitError)
++ error Rack::QueryParser::QueryLimitError do
++ $logger.warn(env['sinatra.error'].message)
++ return 400, env['sinatra.error'].message
++ end
+ end
+
+ get '/remote/?:command?' do
+--
+2.50.1
+
diff --git a/gating.fmf b/gating.fmf
deleted file mode 100644
index f452957..0000000
--- a/gating.fmf
+++ /dev/null
@@ -1,48 +0,0 @@
-summary: PCS gating test plan
-description: Runs upstream tier0, tier1 and smoke tests
-
-discover:
- how: shell
- dist-git-source: true
- tests:
- # Workaround until tmt supports patching sources
- - name: Patch sources and run autotools
- test: ./prepare-env.sh
- duration: 30m
- - name: Tier 0 tests
- test: ./builddir/pcs-*/pcs_test/suite --tier0 -v --vanilla --installed
- duration: 10m
- - name: Tier 1 tests
- test: ./builddir/pcs-*/pcs_test/suite --tier1 -v --vanilla --installed
- duration: 2h
- - name: Smoke tests
- test: |
- systemctl start pcsd
- ./builddir/pcs-*/pcs_test/smoke.sh
- duration: 10m
-prepare:
- - name: Install packages
- how: install
- package:
- - autoconf
- - automake
- - make
- - rpm-build
- - ruby-devel
- - git-core
- - booth-site
- - fence-agents-apc
- - fence-agents-ipmilan
- - fence-agents-scsi
- - fence-virt
- - openssl
- - pcs
- - pcs-snmp
- - python3-pip
- - python3-setuptools_scm
- - python3-wheel
- - rubygem-json
- - rubygem-test-unit
- - wget
-execute:
- how: tmt
diff --git a/make-AppStream-metainfo-more-descriptive.patch b/make-AppStream-metainfo-more-descriptive.patch
deleted file mode 100644
index f9dd2a2..0000000
--- a/make-AppStream-metainfo-more-descriptive.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 9923d48095ac7a1376b108a0a3e722d3090fcea6 Mon Sep 17 00:00:00 2001
-From: Michal Pospisil
-Date: Thu, 18 Jan 2024 16:52:59 +0100
-Subject: [PATCH] make AppStream metainfo more descriptive
-
----
- ...g.clusterlabs.cockpit_pcs_web_ui.metainfo.xml | 16 ++++++++++++++++
- .../app/org.clusterlabs.pcs_web_ui.metainfo.xml | 16 ----------------
- packages/app/package-lock.json | 4 ++--
- 3 files changed, 18 insertions(+), 18 deletions(-)
- create mode 100644 packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
- delete mode 100644 packages/app/org.clusterlabs.pcs_web_ui.metainfo.xml
-
-diff --git a/packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml b/packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
-new file mode 100644
-index 00000000..a27525a9
---- /dev/null
-+++ b/packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
-@@ -0,0 +1,16 @@
-+
-+
-+ org.clusterlabs.cockpit_pcs_web_ui
-+ CC0-1.0
-+ HA Cluster Management
-+ Manage Pacemaker based clusters
-+
-+
-+ Application for managing Pacemaker based clusters. Uses Pacemaker/Corosync
-+ Configuration System (pcs) in the background.
-+
-+
-+ cockpit.desktop
-+ ha-cluster
-+ https://github.com/ClusterLabs/pcs-web-ui
-+
-diff --git a/packages/app/org.clusterlabs.pcs_web_ui.metainfo.xml b/packages/app/org.clusterlabs.pcs_web_ui.metainfo.xml
-deleted file mode 100644
-index 83add879..00000000
---- a/packages/app/org.clusterlabs.pcs_web_ui.metainfo.xml
-+++ /dev/null
-@@ -1,16 +0,0 @@
--
--
-- org.clusterlabs.pcs_web_ui
-- CC0-1.0
-- Pcs Web UI
-- Manage pacemaker based clusters.
--
--
-- Pcs Web UI is an application that allows you to easily view, modify and
-- create pacemaker based clusters.
--
--
-- cockpit.desktop
-- ha-cluster
--
--
-diff --git a/packages/app/package-lock.json b/packages/app/package-lock.json
-index 4bf1e89e..2f4049a5 100644
---- a/packages/app/package-lock.json
-+++ b/packages/app/package-lock.json
-@@ -3830,7 +3830,7 @@
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001563",
-- "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz",
-+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz",
- "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==",
- "dev": true,
- "funding": [
-@@ -12590,7 +12590,7 @@
- },
- "caniuse-lite": {
- "version": "1.0.30001563",
-- "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz",
-+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz",
- "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==",
- "dev": true
- },
---
-2.43.0
-
diff --git a/metainfo-fix-outdated-extends-id.patch b/metainfo-fix-outdated-extends-id.patch
deleted file mode 100644
index a9e2106..0000000
--- a/metainfo-fix-outdated-extends-id.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From c55cac8220da78b87b7c84c4049280bc05bf1753 Mon Sep 17 00:00:00 2001
-From: Michal Pospisil
-Date: Fri, 2 Feb 2024 18:47:54 +0100
-Subject: [PATCH] metainfo: fix outdated extends id
-
----
- packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml b/packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
-index a27525a9..0924545c 100644
---- a/packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
-+++ b/packages/app/org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
-@@ -10,7 +10,7 @@
- Configuration System (pcs) in the background.
-
-
-- cockpit.desktop
-+ org.cockpit_project.cockpit
- ha-cluster
- https://github.com/ClusterLabs/pcs-web-ui
-
---
-2.43.0
-
diff --git a/pcs.spec b/pcs.spec
index 26e73ce..aa227b2 100644
--- a/pcs.spec
+++ b/pcs.spec
@@ -1,6 +1,6 @@
Name: pcs
-Version: 0.11.7
-Release: 3%{?dist}
+Version: 0.12.1
+Release: 5%{?dist}
# https://docs.fedoraproject.org/en-US/packaging-guidelines/LicensingGuidelines/
# https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
# GPL-2.0-only: pcs
@@ -11,33 +11,52 @@ Group: System Environment/Base
Summary: Pacemaker/Corosync Configuration System
BuildArch: noarch
-# When specifying a commit, use its long hash
-%global version_or_commit %{version}
-# %%global version_or_commit 10069ca47e5c9f4ac1abd8bc4cd99281ead047b7
+# Remove a tilde used by RPM to get the correct upstream version
+%global clean_version %(echo %{version} | sed 's/~//')
+
+# To build an official pcs release, comment out branch_or_commit
+# Use long commit hash or branch name to build an unreleased version
+# %%global branch_or_commit 1353dfbb3af82d77f4de17a3fa4cbde185bb2b2d
+%global version_or_commit %{clean_version}
+%if 0%{?branch_or_commit:1}
+ %global version_or_commit %{branch_or_commit}
+ %global tarball_version %{clean_version}+%(echo %{branch_or_commit} | head -c 8)
+%endif
%global pcs_source_name %{name}-%{version_or_commit}
-# ui_commit can be determined by hash, tag or branch
-%global ui_commit 0.1.18
-%global ui_modules_version 0.1.18
-%global ui_src_name pcs-web-ui-%{ui_commit}
+# To build an official pcs-web-ui release, comment out ui_branch_or_commit
+# Last tagged version, also used as fallback version for untagged tarballs
+%global ui_version 0.1.23
+%global ui_modules_version 0.1.23
+# Use long commit hash or branch name to build an unreleased version
+# %%global ui_branch_or_commit 34372d1268f065ed186546f55216aaa2d7e76b54
+%global ui_version_or_commit %{ui_version}
+%if 0%{?ui_branch_or_commit:1}
+ %global ui_version_or_commit %{ui_branch_or_commit}
+ %global ui_tarball_version %{ui_version}-%(echo %{ui_branch_or_commit} | head -c 8)
+%endif
+%global ui_src_name pcs-web-ui-%{ui_version_or_commit}
+
%global pyagentx_version 0.4.pcs.2
-%global dacite_version 1.8.1
+%global dacite_version 1.9.2
-%global required_pacemaker_version 2.1.0
+%global required_pacemaker_version 3.0.0
%global pcs_bundled_dir pcs_bundled
-%global pcsd_public_dir pcsd/public
-%global ui_build_dir_standalone build_standalone
-%global ui_build_dir_cockpit build_cockpit
-%global ui_cockpit_dest ha-cluster
-%global ui_appstream_metainfo org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
+%global pcsd_webui_dir %{_prefix}/lib/pcsd/public/ui
+
+%global cockpit_dir %{_datadir}/cockpit/
+%global metainfo_dir %{_datadir}/metainfo
+%global ui_metainfo_name org.clusterlabs.cockpit_pcs_web_ui.metainfo.xml
+%global ui_metainfo %{metainfo_dir}/%{ui_metainfo_name}
%global pkg_pcs_snmp pcs-snmp
+%global pkg_pcs_web_ui pcs-web-ui
%global pkg_cockpit_ha_cluster cockpit-ha-cluster
# prepend v for folder in GitHub link when using tagged tarball
-%if "%{version}" == "%{version_or_commit}"
+%if "%{clean_version}" == "%{version_or_commit}"
%global v_prefix v
%endif
@@ -47,24 +66,42 @@ Source0: %{url}/archive/%{?v_prefix}%{version_or_commit}/%{pcs_source_name}.tar.
Source41: https://github.com/ondrejmular/pyagentx/archive/v%{pyagentx_version}/pyagentx-%{pyagentx_version}.tar.gz
Source42: https://github.com/konradhalas/dacite/archive/v%{dacite_version}/dacite-%{dacite_version}.tar.gz
-Source100: https://github.com/ClusterLabs/pcs-web-ui/archive/%{ui_commit}/%{ui_src_name}.tar.gz
-Source101: https://github.com/ClusterLabs/pcs-web-ui/releases/download/%{ui_commit}/pcs-web-ui-node-modules-%{ui_modules_version}.tar.xz
+Source100: https://github.com/ClusterLabs/pcs-web-ui/archive/%{ui_version_or_commit}/%{ui_src_name}.tar.gz
+Source101: https://github.com/ClusterLabs/pcs-web-ui/releases/download/%{ui_version_or_commit}/pcs-web-ui-node-modules-%{ui_modules_version}.tar.xz
+
# pcs patches: <= 200
-# Patch0: name.patch
+# Patch1: name.patch
+Patch1: show-info-page-instead-of-webui.patch
+Patch2: fix-pcsd-not-starting-with-older-rack.patch
+Patch3: do-not-require-wheel.patch
# ui patches: >200
# Patch201: name-web-ui.patch
-Patch201: make-AppStream-metainfo-more-descriptive.patch
-Patch202: metainfo-fix-outdated-extends-id.patch
+
+
+# Split pcs to pcs and pcs-web-ui, all packages that replace pcs must obsolete
+# the old monolithic package
+# https://docs.fedoraproject.org/en-US/packaging-guidelines/#_one_to_many_replacement
+Obsoletes: pcs < 0.12.0
+# Web UI is an add-on that doesn't need to be installed for pcs to function.
+# Upgrades from before 0.12 will install it thanks to Obsoletes. But it will
+# be possible to uninstall web UI to disable it and then it will not be
+# installed during upgrades because it is a weak dependency.
+Recommends: %{pkg_pcs_web_ui} == %{version}-%{release}
+
# git for patches
BuildRequires: git-core
+# for building pcs tarballs
+BuildRequires: autoconf
+BuildRequires: automake
BuildRequires: make
# printf from coreutils is used in makefile, head is used in spec
BuildRequires: coreutils
+# find is used in Makefile and also somewhere else
+BuildRequires: findutils
# python for pcs
-BuildRequires: python3 >= 3.9
BuildRequires: python3-dateutil >= 2.7.0
BuildRequires: python3-devel
BuildRequires: python3-setuptools
@@ -75,10 +112,8 @@ BuildRequires: python3-tornado
BuildRequires: python3-cryptography
BuildRequires: python3-lxml
# for building bundled python packages
-BuildRequires: python3-wheel
-# for bundled python dateutil
-# dateutil was unbundled in Fedora but our autotools still check for it
-BuildRequires: python3-setuptools_scm
+# setuptools 71+ builds wheels by itself
+BuildRequires: (python3-wheel if python3-setuptools < 71)
# ruby and gems for pcsd
BuildRequires: ruby >= 2.5.0
BuildRequires: ruby-devel
@@ -89,53 +124,52 @@ BuildRequires: rubygem-ffi
BuildRequires: rubygem-json
BuildRequires: rubygem-mustermann
BuildRequires: rubygem-puma
-BuildRequires: rubygem-rack
+BuildRequires: (rubygem(rack) < 3 or (rubygem(rack) >= 3 and rubygem(rackup)))
BuildRequires: rubygem-rack-protection
BuildRequires: rubygem-rack-test
BuildRequires: rubygem-sinatra
BuildRequires: rubygem-tilt
-%if 0%{?fedora} || 0%{?eln} || 0%{?rhel} >= 9
+%if 0%{?fedora} || 0%{?rhel} >= 9
BuildRequires: rubygem(rexml)
%endif
# ruby libraries for tests
BuildRequires: rubygem-test-unit
# for touching patch files (sanitization function)
BuildRequires: diffstat
-# for post, preun and postun macros
-BuildRequires: systemd
+# for systemd scriptlet macros
+BuildRequires: systemd-rpm-macros
# pam is used for authentication inside daemon (python ctypes)
# needed for tier0 tests during build
BuildRequires: pam
# for working with qdevice certificates (certutil) - used in configure.ac
BuildRequires: nss-tools
+# pcs now provides a pc file
+BuildRequires: pkgconfig
-# for building web ui
-BuildRequires: nodejs-npm
# cluster stack packages for pkg-config
-BuildRequires: booth
-BuildRequires: corosync-qdevice-devel
-BuildRequires: corosynclib-devel >= 3.0
-BuildRequires: fence-agents-common
+# corosync has different package names on distributions but all provide
+# corosync-devel
+# corosync and pacemaker need versions and it's not working in virtual provides
+BuildRequires: corosync-devel >= 3.0
BuildRequires: pacemaker-libs-devel >= %{required_pacemaker_version}
-BuildRequires: resource-agents
-BuildRequires: sbd
+BuildRequires: pkgconfig(booth)
+BuildRequires: pkgconfig(corosync-qdevice)
+BuildRequires: pkgconfig(sbd)
# for validating cockpit-ha-cluster metainfo
BuildRequires: libappstream-glib
# python and libraries for pcs, setuptools for pcs entrypoint
-Requires: python3 >= 3.9
Requires: python3-cryptography
Requires: python3-dateutil >= 2.7.0
Requires: python3-lxml
-Requires: python3-setuptools
Requires: python3-pycurl
Requires: python3-pyparsing
Requires: python3-tornado
# ruby and gems for pcsd
-Requires: ruby >= 2.5.0
+Requires: ruby >= 3.3.0
Requires: rubygem-backports
Requires: rubygem-childprocess
Requires: rubygem-ethon
@@ -143,12 +177,11 @@ Requires: rubygem-ffi
Requires: rubygem-json
Requires: rubygem-mustermann
Requires: rubygem-puma
-Requires: rubygem-rack
+Requires: (rubygem(rack) < 3 or (rubygem(rack) >= 3 and rubygem(rackup)))
Requires: rubygem-rack-protection
-Requires: rubygem-rack-test
Requires: rubygem-sinatra
Requires: rubygem-tilt
-%if 0%{?fedora} || 0%{?eln} || 0%{?rhel} >= 9
+%if 0%{?fedora} || 0%{?rhel} >= 9
Requires: rubygem(rexml)
%endif
# for killall
@@ -160,10 +193,6 @@ Requires: (corosync >= 3.0 if pacemaker)
# pcs enables corosync encryption by default so we require libknet1-plugins-all
Requires: (libknet1-plugins-all if corosync)
Requires: pacemaker-cli >= %{required_pacemaker_version}
-# for post, preun and postun macros
-Requires(post): systemd
-Requires(preun): systemd
-Requires(postun): systemd
# pam is used for authentication inside daemon (python ctypes)
# more details: https://bugzilla.redhat.com/show_bug.cgi?id=1717113
Requires: pam
@@ -175,7 +204,6 @@ Requires: nss-tools
Provides: bundled(dacite) = %{dacite_version}
-
# pcs-snmp subpackage definition
%package -n %{pkg_pcs_snmp}
Group: System Environment/Base
@@ -196,6 +224,24 @@ Requires: net-snmp
Provides: bundled(pyagentx) = %{pyagentx_version}
+# pcs-web-ui subpackage definition
+%package -n %{pkg_pcs_web_ui}
+Summary: Standalone web UI for Pacemaker/Corosync Configuration System
+# https://docs.fedoraproject.org/en-US/packaging-guidelines/LicensingGuidelines/
+# https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
+# GPL-2.0-only: pcs
+License: GPL-2.0-only
+URL: https://github.com/ClusterLabs/pcs-web-ui
+
+# Split pcs to pcs and pcs-web-ui, all packages that replace pcs must obsolete
+# the old monolithic package
+# https://docs.fedoraproject.org/en-US/packaging-guidelines/#_one_to_many_replacement
+Obsoletes: pcs < 0.12.0
+
+Requires: pcs = %{version}-%{release}
+
+Provides: bundled(pcs-web-ui) = %{!?ui_tarball_version:%{ui_version}}%{?ui_tarball_version}
+
# cockpit-ha-cluster subpackage definition
%package -n %{pkg_cockpit_ha_cluster}
Group: System Environment/Base
@@ -204,26 +250,34 @@ License: GPL-2.0-only AND CC0-1.0
URL: https://github.com/ClusterLabs/pcs-web-ui
BuildRequires: make
-BuildRequires: npm
+BuildRequires: nodejs-npm
Requires: pcs = %{version}-%{release}
Requires: cockpit-bridge
+Provides: bundled(pcs-web-ui) = %{!?ui_tarball_version:%{ui_version}}%{?ui_tarball_version}
+
+
%description
-pcs is a corosync and pacemaker configuration tool. It permits users to
-easily view, modify and create pacemaker based clusters.
+pcs is a configuration tool for Corosync and Pacemaker. It permits users to
+easily view, modify and create high availability clusters based on Pacemaker.
+This package contains the pcs command-line utility and its server pcsd.
+
+%description -n %{pkg_pcs_web_ui}
+Provides standalone web UI for Pacemaker/Corosync Configuration System (pcs).
%description -n %{pkg_pcs_snmp}
-SNMP agent that provides information about pacemaker cluster to the master agent
+SNMP agent that provides information about Pacemaker cluster to the main agent
(snmpd).
%description -n %{pkg_cockpit_ha_cluster}
Cockpit application for managing Pacemaker based clusters. Uses
Pacemaker/Corosync Configuration System (pcs) in the background.
-%prep
+
+%prep
# -- following is inspired by python-simplejon.el5 --
# Update timestamps on the files touched by a patch, to avoid non-equal
# .pyc/.pyo files across the multilib peers within a build
@@ -267,21 +321,35 @@ update_times_patch(){
# * http://ftp.rpm.org/max-rpm/s1-rpm-inside-macros.html
# * https://rpm-software-management.github.io/rpm/manual/autosetup.html
# patch web-ui sources
-%autosetup -D -T -b 100 -a 101 -S git -n %{ui_src_name} -N
+# -n — Set Name of Build Directory
+# -T — Do Not Perform Default Archive Unpacking
+# -b — Unpack The nth Sources Before Changing Directory
+# -a — Unpack The nth Sources After Changing Directory
+# -N — disables automatic patch application, use autopatch to apply patches
+#
+# 1. unpack sources (-b 0)
+# 2. then cd into sources tree (the setup macro itself)
+# 3. then unpack node_modules into sources tree (-a 1).
+%autosetup -T -b 100 -a 101 -N -n %{ui_src_name}
%autopatch -p1 -m 201
# update_times_patch %%{PATCH201}
-update_times_patch %%{PATCH201}
-update_times_patch %%{PATCH202}
# patch pcs sources
%autosetup -S git -n %{pcs_source_name} -N
%autopatch -p1 -M 200
-# update_times_patch %%{PATCH0}
+# update_times_patch %%{PATCH1}
+update_times_patch %{PATCH1}
+update_times_patch %{PATCH2}
+update_times_patch %{PATCH3}
# generate .tarball-version if building from an untagged commit, not a released version
# autogen uses git-version-gen which uses .tarball-version for generating version number
-%if "%{version}" != "%{version_or_commit}"
- echo "%version+$(echo "%{version_or_commit}" | head -c 8)" > %{_builddir}/%{pcs_source_name}/.tarball-version
+%if 0%{?tarball_version:1}
+ echo %{tarball_version} > %{_builddir}/%{pcs_source_name}/.tarball-version
+%endif
+
+%if 0%{?ui_tarball_version:1}
+ echo %{ui_tarball_version} > %{_builddir}/%{ui_src_name}/.tarball-version
%endif
# prepare dirs/files necessary for building python bundles
@@ -290,54 +358,57 @@ cp -f %SOURCE41 rpm/
cp -f %SOURCE42 rpm/
+
%build
%define debug_package %{nil}
-# Booth authfile fix support
-# Fedora 37, 38, ELN = RHEL10: unset only
-# Fedora 39+: no booth build options
-%if 0%{?fedora} <= 38 || 0%{?eln}
- %define booth_build_options --enable-booth-enable-authfile-unset
-%endif
-
+# We left off by setting up pcs, so we are in its directory now
./autogen.sh
%{configure} --enable-local-build --enable-use-local-cache-only \
- --enable-individual-bundling %{?booth_build_options} \
+ --enable-individual-bundling --enable-webui \
--with-pcsd-default-cipherlist='PROFILE=SYSTEM' \
--with-pcs-lib-dir="%{_prefix}/lib" PYTHON=%{__python3}
make all
-# build pcs-web-ui
-export BUILD_USE_CURRENT_NODE_MODULES=true
+# Web UI installation
+# Switch to web ui folder first
+cd ../%{ui_src_name}
+./autogen.sh
+%{configure} \
+ --with-pcsd-webui-dir=%{pcsd_webui_dir} \
+ --with-cockpit-dir=%{cockpit_dir} \
+ --with-metainfo-dir=%{metainfo_dir}
+make all
-## standalone
-export BUILD_DIR=%{_builddir}/%{ui_src_name}/%{ui_build_dir_standalone}
-make -C %{_builddir}/%{ui_src_name} build
-
-## cockpit
-export BUILD_DIR=%{_builddir}/%{ui_src_name}/%{ui_build_dir_cockpit}
-export BUILD_FOR_COCKPIT=true
-make -C %{_builddir}/%{ui_src_name} build
%install
-rm -rf $RPM_BUILD_ROOT
+rm -rf %{buildroot}
pwd
-
+# Install cockpit pcs-web-ui
+cd ../%{ui_src_name}
%make_install
-# install standalone pcs-web-ui
-cp -r %{_builddir}/%{ui_src_name}/%{ui_build_dir_standalone} \
- ${RPM_BUILD_ROOT}%{_prefix}/lib/%{pcsd_public_dir}/ui
-# install cockpit pcs-web-ui
-mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/cockpit/%{ui_cockpit_dest}
-mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/metainfo
-cp -r %{_builddir}/%{ui_src_name}/%{ui_build_dir_cockpit}/* \
- ${RPM_BUILD_ROOT}%{_datadir}/cockpit/%{ui_cockpit_dest}
+# prepare pcs-web-ui files (not needed for pcs as pcs installs them in Makefile)
+mkdir -p %{buildroot}/%{_defaultlicensedir}/%{pkg_cockpit_ha_cluster}
+mkdir -p %{buildroot}/%{_defaultlicensedir}/%{pkg_pcs_web_ui}
-cp -r %{_builddir}/%{ui_src_name}/packages/app/%{ui_appstream_metainfo} \
- ${RPM_BUILD_ROOT}%{_datadir}/metainfo/
+cp COPYING %{buildroot}/%{_defaultlicensedir}/%{pkg_cockpit_ha_cluster}/COPYING_WUI.md
+mv COPYING %{buildroot}/%{_defaultlicensedir}/%{pkg_pcs_web_ui}/COPYING_WUI.md
+
+mkdir -p %{buildroot}/%{_docdir}/%{pkg_cockpit_ha_cluster}
+mkdir -p %{buildroot}/%{_docdir}/%{pkg_pcs_web_ui}
+
+cp CHANGELOG.md %{buildroot}/%{_docdir}/%{pkg_cockpit_ha_cluster}/CHANGELOG_WUI.md
+mv CHANGELOG.md %{buildroot}/%{_docdir}/%{pkg_pcs_web_ui}/CHANGELOG_WUI.md
+
+cp README.md %{buildroot}/%{_docdir}/%{pkg_cockpit_ha_cluster}/README_WUI.md
+mv README.md %{buildroot}/%{_docdir}/%{pkg_pcs_web_ui}/README_WUI.md
+
+# Install pcs
+cd ../%{pcs_source_name}
+%make_install
# prepare license files
cp %{pcs_bundled_dir}/src/pyagentx-*/LICENSE.txt pyagentx_LICENSE.txt
@@ -348,9 +419,10 @@ cp %{pcs_bundled_dir}/src/dacite-*/LICENSE dacite_LICENSE
cp %{pcs_bundled_dir}/src/dacite-*/README.md dacite_README.md
+
%check
# Run validation of cockpit metainfo
-appstream-util validate-relax --nonet ${RPM_BUILD_ROOT}%{_datadir}/metainfo/%{ui_appstream_metainfo}
+appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/%{ui_metainfo_name}
# In the building environment LC_CTYPE is set to C which causes tests to fail
# due to python prints a warning about it to stderr. The following environment
@@ -375,7 +447,7 @@ run_all_tests(){
#run pcsd tests and remove them
ruby \
- -I$RPM_BUILD_ROOT%{_prefix}/lib/pcsd \
+ -I%{buildroot}%{_prefix}/lib/pcsd \
-Ipcsd/test \
pcsd/test/test_all_suite.rb
test_result_ruby=$?
@@ -388,34 +460,31 @@ run_all_tests(){
run_all_tests
+
+# Mark pcsd and pcs_snmp_agent for restart after upgrade
%posttrans
-# Make sure the new version of the daemon is running.
-# Also, make sure to start pcsd-ruby if it hasn't been started or even
-# installed before. This is done by restarting pcsd.service.
-%{_bindir}/systemctl daemon-reload
-%{_bindir}/systemctl try-restart pcsd.service
+%systemd_posttrans_with_restart pcsd.service
+
+%posttrans -n %{pkg_pcs_snmp}
+%systemd_posttrans_with_restart pcs_snmp_agent.service
+
+# Restart pcsd if it is running to reload the Tornado app so it detects
+# presence or absence of the webui backend handler on install/update
+# of pcs-web-ui that contains it
+# Systemd will not pick-up on this change because pcs-web-ui doesn't contain
+# a unit file that would mark it for restart
+# https://fedoraproject.org/wiki/Changes/Restart_services_at_end_of_rpm_transaction
+%posttrans -n %{pkg_pcs_web_ui}
+systemctl try-restart pcsd.service
+
+# Runs only on pcs-web-ui uninstall
+# https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/
+%postun -n %{pkg_pcs_web_ui}
+if [ $1 -eq 0 ] ; then
+ systemctl try-restart pcsd.service
+fi
-%post
-%systemd_post pcsd.service
-%systemd_post pcsd-ruby.service
-
-%post -n %{pkg_pcs_snmp}
-%systemd_post pcs_snmp_agent.service
-
-%preun
-%systemd_preun pcsd.service
-%systemd_preun pcsd-ruby.service
-
-%preun -n %{pkg_pcs_snmp}
-%systemd_preun pcs_snmp_agent.service
-
-%postun
-%systemd_postun_with_restart pcsd.service
-%systemd_postun_with_restart pcsd-ruby.service
-
-%postun -n %{pkg_pcs_snmp}
-%systemd_postun_with_restart pcs_snmp_agent.service
%files
%doc CHANGELOG.md
@@ -424,9 +493,10 @@ run_all_tests
%license dacite_LICENSE
%license COPYING
%{python3_sitelib}/*
-%{_sbindir}/pcs
-%{_sbindir}/pcsd
+%{_bindir}/pcs
+%{_bindir}/pcsd
%{_prefix}/lib/pcs/*
+%{_prefix}/lib/pkgconfig/pcs.pc
%{_prefix}/lib/pcsd/*
%{_unitdir}/pcsd.service
%{_unitdir}/pcsd-ruby.service
@@ -447,8 +517,19 @@ run_all_tests
%{_mandir}/man8/pcsd.*
%exclude %{_prefix}/lib/pcs/pcs_snmp_agent
%exclude %{_prefix}/lib/pcs/%{pcs_bundled_dir}/packages/pyagentx*
-%exclude %{_datadir}/cockpit
-%exclude %{_datadir}/metainfo/%{ui_appstream_metainfo}
+%exclude %{cockpit_dir}
+%exclude %{ui_metainfo}
+%exclude %{python3_sitelib}/pcs/daemon/app/webui
+%exclude %{pcsd_webui_dir}
+
+%files -n %{pkg_pcs_web_ui}
+%doc CHANGELOG.md
+%doc %{_docdir}/%{pkg_pcs_web_ui}/CHANGELOG_WUI.md
+%doc %{_docdir}/%{pkg_pcs_web_ui}/README_WUI.md
+%license COPYING
+%license %{_defaultlicensedir}/%{pkg_pcs_web_ui}/COPYING_WUI.md
+%{python3_sitelib}/pcs/daemon/app/webui
+%{pcsd_webui_dir}
%files -n %{pkg_pcs_snmp}
%{_prefix}/lib/pcs/pcs_snmp_agent
@@ -464,11 +545,61 @@ run_all_tests
%license pyagentx_LICENSE.txt
%files -n %{pkg_cockpit_ha_cluster}
-%{_datadir}/cockpit/%{ui_cockpit_dest}
-%{_datadir}/metainfo/%{ui_appstream_metainfo}
+%doc %{_docdir}/%{pkg_cockpit_ha_cluster}/CHANGELOG_WUI.md
+%doc %{_docdir}/%{pkg_cockpit_ha_cluster}/README_WUI.md
+%license %{_defaultlicensedir}/%{pkg_cockpit_ha_cluster}/COPYING_WUI.md
+%{cockpit_dir}
+%{ui_metainfo}
+
%changelog
+* Fri Sep 19 2025 Python Maint - 0.12.1-5
+- Rebuilt for Python 3.14.0rc3 bytecode
+
+* Fri Aug 15 2025 Python Maint - 0.12.1-4
+- Rebuilt for Python 3.14.0rc2 bytecode
+
+* Wed Jul 30 2025 Michal Pospíšil - 0.12.1-3
+- Remove BuildRequires: python3-wheel when using setuptools 71+
+
+* Fri Jul 25 2025 Fedora Release Engineering - 0.12.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
+
+* Fri Jul 18 2025 Michal Pospíšil - 0.12.1-1
+- Rebased pcs to the newest major version (see CHANGELOG.md)
+ Resolves: rhbz#2371770
+- Updated standalone web UI and HA Cluster Management Cockpit application to pcs-web-ui 0.1.23 (see CHANGELOG_WUI.md)
+- There is now a changelog for the HA Cluster Management Cockpit application and the standalone web UI in both packages
+- The upstream version of pcs-web-ui can now be queried through RPM in both packages - see bundled(pcs-web-ui)
+- Updated bundled Python dependency dacite
+- Compatibility with rubygem-rack >= 3
+ Resolves: rhbz#2372462
+
+* Tue Jun 03 2025 Python Maint - 0.12.0-2
+- Rebuilt for Python 3.14
+
+* Mon Jan 27 2025 Michal Pospíšil - 0.12.0-1
+- Rebased pcs to the newest major version (see CHANGELOG.md)
+ Resolves: rhbz#2341012
+- New subpackage pcs-web-ui - enables standalone web UI when the subpackage is installed on the system (default), uninstall the subpackage to disable the web UI
+- Updated standalone web UI and HA Cluster Management Cockpit application to pcs-web-ui 0.1.22
+- Fixes for compatibility with Ruby 3.4
+ Resolves: rhbz#2331005
+
+* Fri Jan 17 2025 Fedora Release Engineering - 0.11.8-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
+
+* Tue Aug 6 2024 Michal Pospíšil - 0.11.8-1
+- Rebased to the latest sources (see CHANGELOG.md)
+- Updated pcs-web-ui to 0.1.20
+
+* Thu Jul 18 2024 Fedora Release Engineering - 0.11.7-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
+
+* Sun Jun 09 2024 Python Maint - 0.11.7-4
+- Rebuilt for Python 3.13
+
* Mon Feb 5 2024 Michal Pospisil - 0.11.7-3
- Fixed a bug preventing the Cockpit Application from being installed from Cockpit
diff --git a/plan-gating.fmf b/plan-gating.fmf
new file mode 100644
index 0000000..78d1116
--- /dev/null
+++ b/plan-gating.fmf
@@ -0,0 +1,32 @@
+summary: PCS gating test plan
+description: Runs upstream tier0, tier1 and smoke tests
+
+discover:
+ dist-git-source: true
+ dist-git-install-builddeps: true
+ how: shell
+ tests:
+ - name: tier0
+ test: |
+ ./prepare-tests.sh
+ $TMT_SOURCE_DIR/pcs-*/pcs_test/suite --tier0 -v --vanilla --installed
+ duration: 10m
+ tier: 0
+ tag: fast
+ - name: tier1
+ test: |
+ ./prepare-tests.sh
+ $TMT_SOURCE_DIR/pcs-*/pcs_test/suite --tier1 -v --vanilla --installed
+ duration: 2h
+ tier: 1
+ - name: smoke
+ test: |
+ systemctl start pcsd
+ ./prepare-tests.sh
+ $TMT_SOURCE_DIR/pcs-*/pcs_test/smoke.sh
+ duration: 10m
+ tier: smoke
+ tag: fast
+
+execute:
+ how: tmt
diff --git a/prepare-env.sh b/prepare-env.sh
deleted file mode 100755
index a0405b7..0000000
--- a/prepare-env.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-set -eo xtrace
-# Rpmbuild expects patches in the _sourcedir
-find *.patch &> /dev/null && mv *.patch $TMT_SOURCE_DIR
-mkdir builddir
-rpmbuild -bp pcs.spec --nodeps --define "_sourcedir $TMT_SOURCE_DIR" \
- --define "_builddir $(pwd)/builddir"
-# Remove *SPECPARTS folders generated by rpmbuild
-rm -rfv builddir/*SPECPARTS
-# Remove pcs-web-ui in builddir for "cd pcs-*" to have exactly one match
-rm -rf builddir/pcs-web-ui-*
-cd builddir/pcs-*
-# Run autotools, use bundled dependencies from the system
-export PYTHONPATH=/usr/lib/pcs/pcs_bundled/packages/
-export GEM_HOME=/usr/lib/pcsd/vendor/bundle/
-./autogen.sh
-./configure --with-pcs-lib-dir=/usr/lib --with-distro=fedora
-# Remove pcs sources to make sure tests are not using any of those files
-rm -rf pcs
diff --git a/prepare-tests.sh b/prepare-tests.sh
new file mode 100755
index 0000000..aeb9a8b
--- /dev/null
+++ b/prepare-tests.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+set -eo xtrace
+cd $TMT_SOURCE_DIR
+# Use stamp file to abort if this script already ran
+if [ -e tests-prepared-stamp ]; then exit 0; fi
+# RPM 4.20 changed the builddir structure - unpacked sources go to *-build but
+# tmt copies them back to pcs-*, so the pcs-*-build folder is empty
+# Remove pcs-web-ui, pcs-*-build for "cd pcs-*" to have exactly one match
+rm -rf pcs-web-ui-* pcs-*-build
+cd pcs-*/
+# Run autotools, use bundled dependencies from the system
+export PYTHONPATH=/usr/lib/pcs/pcs_bundled/packages/
+export GEM_HOME=/usr/lib/pcsd/vendor/bundle/
+# We need to use cd pcs-* because when pcs-web-ui starts using autotools, running
+# autogen and configure with expanded TMT_SOURCE_DIR will match that too
+./autogen.sh
+./configure --enable-webui --enable-local-build --enable-use-local-cache-only \
+ --enable-individual-bundling --with-pcs-lib-dir=/usr/lib
+# Remove pcs sources to make sure tests are not using any of those files
+rm -rf pcs
+touch ../tests-prepared-stamp
diff --git a/show-info-page-instead-of-webui.patch b/show-info-page-instead-of-webui.patch
new file mode 100644
index 0000000..9125cd1
--- /dev/null
+++ b/show-info-page-instead-of-webui.patch
@@ -0,0 +1,148 @@
+From e7fa056f582c992d3d2b289911be20440fb839ac Mon Sep 17 00:00:00 2001
+From: Ivan Devat
+Date: Tue, 5 Nov 2024 16:35:02 +0100
+Subject: [PATCH 1/2] show info page instead of webui
+
+---
+ pcs/Makefile.am | 1 +
+ pcs/daemon/app/webui_info_handler.py | 31 ++++++++++++++++++++++++++++
+ pcs/daemon/run.py | 4 +++-
+ pcs_test/smoke.sh.in | 4 ++--
+ pcsd/public/ui_instructions.html | 24 ++++++++++-----------
+ 5 files changed, 48 insertions(+), 16 deletions(-)
+ create mode 100644 pcs/daemon/app/webui_info_handler.py
+
+diff --git a/pcs/Makefile.am b/pcs/Makefile.am
+index 1297473ff..8d4b93073 100644
+--- a/pcs/Makefile.am
++++ b/pcs/Makefile.am
+@@ -219,6 +219,7 @@ EXTRA_DIST = \
+ daemon/app/webui/core.py \
+ daemon/app/webui/session.py \
+ daemon/app/webui/sinatra_ui.py \
++ daemon/app/webui_info_handler.py \
+ daemon/async_tasks/__init__.py \
+ daemon/async_tasks/scheduler.py \
+ daemon/async_tasks/task.py \
+diff --git a/pcs/daemon/app/webui_info_handler.py b/pcs/daemon/app/webui_info_handler.py
+new file mode 100644
+index 000000000..3ab8275bf
+--- /dev/null
++++ b/pcs/daemon/app/webui_info_handler.py
+@@ -0,0 +1,31 @@
++from pcs.daemon.app.common import (
++ BaseHandler,
++ RoutesType,
++)
++
++
++class _WebuiInfoHandler(BaseHandler):
++ __path = None
++
++ def initialize(self, path):
++ self.__path = path
++
++ def get(self):
++ self.set_status(404)
++ self.render(self.__path)
++
++
++def get_routes(path: str) -> RoutesType:
++ return [
++ # The following two rules can be compressed into one: r"/(ui/?)?".
++ # However, the content of the parentheses used here should be captured
++ # and passed in to the handler’s get method as an argument.
++ # Unfortunately, it seems that tornado version 6.4.1 don't pass this
++ # argument (unlike version 6.3.3). Maybe it's a bug (it needs further
++ # inspection). These rules are a safe way to avoid surprises.
++ # Moreover, the captured parameter is irrelevant to the functionality
++ # of the handler.
++ (r"/", _WebuiInfoHandler, dict(path=path)),
++ (r"/ui/?", _WebuiInfoHandler, dict(path=path)),
++ (r"/ui/.*", _WebuiInfoHandler, dict(path=path)),
++ ]
+diff --git a/pcs/daemon/run.py b/pcs/daemon/run.py
+index 558315c23..cfe9999fc 100644
+--- a/pcs/daemon/run.py
++++ b/pcs/daemon/run.py
+@@ -33,6 +33,7 @@ from pcs.daemon.app import (
+ auth,
+ sinatra_remote,
+ sinatra_ui,
++ webui_info_handler,
+ )
+ from pcs.daemon.app import capabilities as capabilities_app
+
+@@ -168,7 +169,8 @@ def configure_app( # noqa: PLR0913
+ # Even with disabled (standalone) webui the following routes must be
+ # provided because they can be used via unix socket from cockpit.
+ routes.extend(
+- sinatra_ui.get_routes(auth_provider, ruby_pcsd_wrapper)
++ webui_info_handler.get_routes(webui_fallback)
++ + sinatra_ui.get_routes(auth_provider, ruby_pcsd_wrapper)
+ )
+
+ return Application(
+diff --git a/pcs_test/smoke.sh.in b/pcs_test/smoke.sh.in
+index fdfe8be2c..a9bb83447 100755
+--- a/pcs_test/smoke.sh.in
++++ b/pcs_test/smoke.sh.in
+@@ -71,10 +71,10 @@ if [ "$webui_http_code_response" = "200" ]; then
+ curl --insecure --cookie ${cookie_file} --header "X-Requested-With: XMLHttpRequest" --data "hidden[hidden_input]=&config[stonith-enabled]=false" https://localhost:2224/managec/${cluster_name}/update_cluster_settings > "${output_file}"
+ cat "${output_file}"; echo ""
+ [ "$(cat ${output_file})" = "Update Successful" ]
+-elif [ "$webui_http_code_response" = "401" ]; then
++elif [ "$webui_http_code_response" = "404" ]; then
+ curl --insecure https://localhost:2224/ui/ > "${output_file}"
+ cat "${output_file}"; echo ""
+- [ "$(cat "${output_file}")" = '{"notauthorized":"true"}' ]
++ grep "HA cluster management has been moved" "${output_file}"
+ else
+ echo "Unexpected response from https://localhost:2224/ui/ - http code: '${webui_http_code_response}'"
+ exit 1
+diff --git a/pcsd/public/ui_instructions.html b/pcsd/public/ui_instructions.html
+index a120ed3d4..b9c1c3152 100644
+--- a/pcsd/public/ui_instructions.html
++++ b/pcsd/public/ui_instructions.html
+@@ -1,27 +1,25 @@
+
+
+
+- Pcs WebUI instructions
++ Web UI is disabled
+
+
+
+- Pcs WebUI instructions
++ Package pcs-web-ui is not installed
+
+- WebUI is not a part of pcs repository but it has its own
+- repository.
++ Since Fedora 42, pcsd web UI is distributed with pcs as pcs-web-ui
++ package. This
package can be uninstalled to disable the web UI.
+
+
+- You can clone WebUI repository
+- and build the web application into pcs by:
++ To re-enable pcsd web UI, install the pcs-web-ui RPM package.
+
+-
+- $ npm install
+- $ npm run build
+- $ mv ./build [/path/to/]pcs/pcsd/public/ui
+-
+
+- For more details, see instructions in
+- README.md.
++ Another option is to try pcsd web UI as an application for
++ Cockpit
++ - a web-based
graphical interface for servers. The HA Cluster Management
++ application can be
installed from within the Applications pane in
++ Cockpit or by installing the
cockpit-ha-cluster RPM
++ package.
+
+
+
+--
+2.50.1
+
diff --git a/sources b/sources
index 27bf1eb..c6784fc 100644
--- a/sources
+++ b/sources
@@ -1,5 +1,5 @@
SHA512 (pyagentx-0.4.pcs.2.tar.gz) = d4194fec9a3e5fefe3793d49b7fec1feafef294c7e613a06046c2993daeefc5cb39d7c5b2b402ff83e49b2d976953f862264288c758c0be09d997b5323cc558a
-SHA512 (dacite-1.8.1.tar.gz) = 4b40c0bdcf5490bcc77de9e7f04b7267642bcfd41e4168607a5457f38abe3ad4b3041d8a23cb43af76de14eabee45f900ad5ddf7af8f70a2be4850bccc2d3af1
-SHA512 (pcs-0.11.7.tar.gz) = 29d61bb945b25ced67e3a05f742ab6f557da8c4d3e8ee04db8caa9a51bb1c64e64cd5382f801173d95e9d62c53a52ad86f823c475ba790cb86b777a1eff658cc
-SHA512 (pcs-web-ui-0.1.18.tar.gz) = edbe88d113e967b2d3f345e74e8c4409b013fb8474fe70a8813a1aba5ea8b4deb61a3bb8c4cd4b4d1a9dc9e67216e518ee5bf832a25188e95173317533d7bf69
-SHA512 (pcs-web-ui-node-modules-0.1.18.tar.xz) = 237ff976d67a7bf881e45334261af1da32c6330fbf9e7436dcf33e63c9373f85f36db52622676f77e27bb6a853c046223cfe0cca25de68bd004c6535aa077fd7
+SHA512 (dacite-1.9.2.tar.gz) = 69513bc1acd43e45a208ce4b4186072f92d9057a6a88c77d56f21405fbed7964d94fe4f6a37c99754a793caa2bd0584664dfab69169ef0d3564bb09d37769e59
+SHA512 (pcs-0.12.1.tar.gz) = 4f17a8d9c15b8c9208c94a264f5f79f03abc451e3f4ae4ba0fb338055a26407d4961466dd8f3565f6882c2c00f1d6a1ec8fd15dadcb0cf1a5586d37c56c77238
+SHA512 (pcs-web-ui-0.1.23.tar.gz) = 6bc709926f26a02d33fb3865d15a1cf15db51a07dd9b25c63f33277c427c3403c189e2ac5e7adc795b254ad0bdb50f1bc4be70f1385bc8522ca502142d41fc26
+SHA512 (pcs-web-ui-node-modules-0.1.23.tar.xz) = f39dd1fd391f10b874b5fec34da1a2f2496d66b31af736ee1dfc2ef6e0b518efd03053fd00312c84e10a33ffda492e12d48a898a21efb6241e5459828e500e80