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