diff --git a/.gitignore b/.gitignore index 950eee8..a14ff71 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,6 @@ /pcs-0.9.159.tar.gz /rack-protection-1.5.3.gem /pcs-0.9.160.tar.gz +/pcs-0.9.163.tar.gz +/pyagentx-0.4.pcs.2.tar.gz +/sinatra-contrib-2.0.0.gem diff --git a/fedfix.patch b/fedfix.patch index 37588b9..9a6c38d 100644 --- a/fedfix.patch +++ b/fedfix.patch @@ -1,18 +1,23 @@ -From ba42a3a6f9d11e9d156971fc3297119d77fb6340 Mon Sep 17 00:00:00 2001 -From: Ondrej Mular -Date: Wed, 18 Oct 2017 12:11:51 +0200 +From f9f4b3cb4566c854263044ab3fc3f9968dd5758d Mon Sep 17 00:00:00 2001 +From: Ivan Devat +Date: Mon, 19 Feb 2018 17:54:35 +0100 Subject: [PATCH] fedfix +Gems for fedora was adapted. +Codebase was adapted for sinatra 2 and rack 2. --- - pcs/pcs | 2 +- - pcs/test/suite.py | 2 +- - pcsd/Makefile | 30 +++--------------------------- - pcsd/pcsd.rb | 1 + - pcsd/pcsd.service-runner | 3 ++- - 5 files changed, 8 insertions(+), 30 deletions(-) + pcs/pcs | 2 +- + pcs/test/suite.py | 2 +- + pcsd/Makefile | 39 ++++++++------------------------------- + pcsd/pcsd.rb | 18 +++++------------- + pcsd/pcsd.service-runner | 3 ++- + pcsd/session.rb | 25 ++++++++++++------------- + pcsd/ssl.rb | 1 - + pcsd/test/test_session.rb | 37 +++++++++++++++++++------------------ + 8 files changed, 48 insertions(+), 79 deletions(-) diff --git a/pcs/pcs b/pcs/pcs -index 4585fd57..d35933e4 100755 +index 736f9cd..3dff69a 100755 --- a/pcs/pcs +++ b/pcs/pcs @@ -1,4 +1,4 @@ @@ -22,7 +27,7 @@ index 4585fd57..d35933e4 100755 from __future__ import absolute_import import os.path diff --git a/pcs/test/suite.py b/pcs/test/suite.py -index cce2d006..68972555 100755 +index 809596b..98c5a26 100755 --- a/pcs/test/suite.py +++ b/pcs/test/suite.py @@ -1,4 +1,4 @@ @@ -32,10 +37,10 @@ index cce2d006..68972555 100755 absolute_import, division, diff --git a/pcsd/Makefile b/pcsd/Makefile -index d452ac06..ff60370f 100644 +index d452ac0..c83bd95 100644 --- a/pcsd/Makefile +++ b/pcsd/Makefile -@@ -1,36 +1,12 @@ +@@ -1,36 +1,13 @@ -FFI_VERSION="1.9.18" -FFI_C_DIR=vendor/bundle/ruby/gems/ffi-${FFI_VERSION}/ext/ffi_c - @@ -53,6 +58,10 @@ index d452ac06..ff60370f 100644 -# RHEL6 needs special rpam-ruby19 gem to work with 1.8.7 -# also bundler is not available on RHEL6 in rpm -build_gems_rhel6: ++# Comment from specfile from distgit 9b7a65231 Mamoru TASAKA: ++# So it seems that with rubygems 2.7.3 --install-dir option always ++# needs --no-user-install??? ++# tld;dr; added flag --no-user-install, details in the commit +build_gems: mkdir -p vendor/bundle/ruby - gem install --verbose --no-rdoc --no-ri -l -i vendor/bundle/ruby \ @@ -62,30 +71,58 @@ index d452ac06..ff60370f 100644 - vendor/cache/json-2.0.3.gem \ - vendor/cache/multi_json-1.12.1.gem \ - vendor/cache/open4-1.3.4.gem \ -+ gem install --force --verbose --no-rdoc --no-ri -l -i vendor/bundle/ruby \ ++ gem install --force --verbose --no-rdoc --no-ri -l --no-user-install -i vendor/bundle/ruby \ vendor/cache/orderedhash-0.0.6.gem \ - vendor/cache/rack-1.6.4.gem \ - vendor/cache/rack-protection-1.5.3.gem \ +- vendor/cache/rack-1.6.4.gem \ +- vendor/cache/rack-protection-1.5.3.gem \ - vendor/cache/rack-test-0.6.3.gem \ - vendor/cache/rpam-ruby19-feist-1.2.1.1.gem \ -+ vendor/cache/rpam-ruby19-1.2.1.gem \ - vendor/cache/sinatra-1.4.8.gem \ - vendor/cache/sinatra-contrib-1.4.7.gem \ +- vendor/cache/sinatra-1.4.8.gem \ +- vendor/cache/sinatra-contrib-1.4.7.gem \ - vendor/cache/tilt-2.0.6.gem \ ++ vendor/cache/rpam-ruby19-1.2.1.gem \ ++ vendor/cache/sinatra-contrib-2.0.0.gem \ -- '--with-ldflags="-Wl,-z,now -Wl,-z,relro"' get_gems: diff --git a/pcsd/pcsd.rb b/pcsd/pcsd.rb -index ad0370c1..bde1230b 100644 +index 01f2f5c..1d51b5e 100644 --- a/pcsd/pcsd.rb +++ b/pcsd/pcsd.rb -@@ -1,3 +1,4 @@ -+gem 'sinatra', '= 1.4.8' - require 'sinatra' - require 'sinatra/reloader' if development? - require 'sinatra/cookies' +@@ -83,6 +83,11 @@ before do + $session_storage = env[:__session_storage] + $session_storage_env = env + end ++ begin ++ $session_storage.drop_expired(request) ++ rescue => e ++ $logger.warn("Exception while removing expired sessions: #{e}") ++ end + + # urls which are accesible for everybody including not logged in users + always_accessible = [ +@@ -156,19 +161,6 @@ $thread_cfgsync = Thread.new { + end + } + +-$thread_session_expired = Thread.new { +- while true +- sleep(60 * 5) +- begin +- if $session_storage +- $session_storage.drop_expired($session_storage_env) +- end +- rescue => e +- $logger.warn("Exception while removing expired sessions: #{e}") +- end +- end +-} +- + helpers do + def is_ajax? + return request.env['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' diff --git a/pcsd/pcsd.service-runner b/pcsd/pcsd.service-runner -index 883d2908..712913ea 100644 +index 883d290..712913e 100644 --- a/pcsd/pcsd.service-runner +++ b/pcsd/pcsd.service-runner @@ -3,8 +3,9 @@ @@ -99,6 +136,179 @@ index 883d2908..712913ea 100644 $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir) # change current directory (ruby -C) +diff --git a/pcsd/session.rb b/pcsd/session.rb +index 8b09ed8..f42bf73 100644 +--- a/pcsd/session.rb ++++ b/pcsd/session.rb +@@ -1,4 +1,3 @@ +-gem 'rack', '< 2.0.0' + require 'rack/session/pool' + + class SessionPoolLifetime < Rack::Session::Pool +@@ -14,14 +13,14 @@ class SessionPoolLifetime < Rack::Session::Pool + super + end + +- def get_session(env, sid) +- with_lock(env) do ++ def find_session(req, sid) ++ with_lock(req) do + now = Time.now() + # delete the session if expired + if @default_options[:expire_after] and sid and @pool_timestamp[sid] and + @pool_timestamp[sid] < (now - @default_options[:expire_after]) + then +- delete_session(sid) ++ remove_session(sid) + end + # create new session if nonexistent + unless sid and session = @pool[sid] +@@ -34,8 +33,8 @@ class SessionPoolLifetime < Rack::Session::Pool + end + end + +- def set_session(env, session_id, new_session, options) +- with_lock(env) do ++ def write_session(req, session_id, new_session, options) ++ with_lock(req) do + @pool.store session_id, new_session + # bump session's access time + @pool_timestamp[session_id] = Time.now() +@@ -43,30 +42,30 @@ class SessionPoolLifetime < Rack::Session::Pool + end + end + +- def destroy_session(env, session_id, options) +- with_lock(env) do +- delete_session(session_id) ++ def delete_session(req, session_id, options) ++ with_lock(req) do ++ remove_session(session_id) + generate_sid unless options[:drop] + end + end + +- def drop_expired(env) ++ def drop_expired(req) + return unless lifetime = @default_options[:expire_after] +- with_lock(env) { ++ with_lock(req) { + threshold = Time.now() - lifetime + sid_to_delete = [] + @pool_timestamp.each { |sid, timestamp| + sid_to_delete << sid if timestamp < threshold + } + sid_to_delete.each { |sid| +- delete_session(sid) ++ remove_session(sid) + } + } + end + + private + +- def delete_session(sid) ++ def remove_session(sid) + @pool.delete(sid) + @pool_timestamp.delete(sid) + end +diff --git a/pcsd/ssl.rb b/pcsd/ssl.rb +index eaf2cbf..2668c95 100644 +--- a/pcsd/ssl.rb ++++ b/pcsd/ssl.rb +@@ -2,7 +2,6 @@ require 'rubygems' + require 'webrick' + require 'webrick/https' + require 'openssl' +-gem 'rack', '< 2.0.0' + require 'rack' + require 'socket' + +diff --git a/pcsd/test/test_session.rb b/pcsd/test/test_session.rb +index e72bf01..c212b1a 100644 +--- a/pcsd/test/test_session.rb ++++ b/pcsd/test/test_session.rb +@@ -2,18 +2,19 @@ require 'test/unit' + + require 'pcsd_test_utils.rb' + require 'session.rb' ++require 'sinatra' + + class TestSessionPool < Test::Unit::TestCase + + def setup() +- @env = { ++ @request = Sinatra::Request.new({ + 'rack.multithread' => true, +- } ++ }) + end + + def fixture_get_pool(lifetime) + pool = SessionPoolLifetime.new(nil, {:expire_after => lifetime,}) +- (1..3).each { |i| pool.set_session(@env, "sid#{i}", {'value' => i}, {}) } ++ (1..3).each { |i| pool.write_session(@request, "sid#{i}", {'value' => i}, {}) } + return pool + end + +@@ -23,14 +24,14 @@ class TestSessionPool < Test::Unit::TestCase + # touch sessions each second + lifetime.times { + sleep(1) +- assert_equal({'value' => 1}, pool.get_session(@env, 'sid1')[1]) +- assert_equal({'value' => 3}, pool.get_session(@env, 'sid3')[1]) ++ assert_equal({'value' => 1}, pool.find_session(@request, 'sid1')[1]) ++ assert_equal({'value' => 3}, pool.find_session(@request, 'sid3')[1]) + } + # after @lifetime passes the unused session gets removed on access + sleep(1) +- assert_equal({'value' => 1}, pool.get_session(@env, 'sid1')[1]) +- assert_equal({'value' => 3}, pool.get_session(@env, 'sid3')[1]) +- assert_equal({}, pool.get_session(@env, 'sid2')[1]) ++ assert_equal({'value' => 1}, pool.find_session(@request, 'sid1')[1]) ++ assert_equal({'value' => 3}, pool.find_session(@request, 'sid3')[1]) ++ assert_equal({}, pool.find_session(@request, 'sid2')[1]) + end + + def test_drop_expired_explicit() +@@ -39,12 +40,12 @@ class TestSessionPool < Test::Unit::TestCase + # touch sessions each second (otherwise they will be removed on access) + lifetime.times { + sleep(1) +- pool.get_session(@env, 'sid2') +- pool.set_session(@env, 'sid3', {'value' => 33}, {}) ++ pool.find_session(@request, 'sid2') ++ pool.write_session(@request, 'sid3', {'value' => 33}, {}) + } + sleep(1) + +- pool.drop_expired(@env) ++ pool.drop_expired(@request) + assert_equal( + { + 'sid2' => {'value' => 2,}, +@@ -57,14 +58,14 @@ class TestSessionPool < Test::Unit::TestCase + def test_no_lifetime() + pool = fixture_get_pool(nil) + sleep(1) +- assert_equal({'value' => 1}, pool.get_session(@env, 'sid1')[1]) +- assert_equal({'value' => 2}, pool.get_session(@env, 'sid2')[1]) +- assert_equal({'value' => 3}, pool.get_session(@env, 'sid3')[1]) ++ assert_equal({'value' => 1}, pool.find_session(@request, 'sid1')[1]) ++ assert_equal({'value' => 2}, pool.find_session(@request, 'sid2')[1]) ++ assert_equal({'value' => 3}, pool.find_session(@request, 'sid3')[1]) + sleep(1) +- pool.drop_expired(@env) +- assert_equal({'value' => 1}, pool.get_session(@env, 'sid1')[1]) +- assert_equal({'value' => 2}, pool.get_session(@env, 'sid2')[1]) +- assert_equal({'value' => 3}, pool.get_session(@env, 'sid3')[1]) ++ pool.drop_expired(@request) ++ assert_equal({'value' => 1}, pool.find_session(@request, 'sid1')[1]) ++ assert_equal({'value' => 2}, pool.find_session(@request, 'sid2')[1]) ++ assert_equal({'value' => 3}, pool.find_session(@request, 'sid3')[1]) + end + + end -- -2.13.6 +1.8.3.1 diff --git a/pcs.spec b/pcs.spec index 369bef1..faede08 100644 --- a/pcs.spec +++ b/pcs.spec @@ -1,22 +1,27 @@ Name: pcs -Version: 0.9.160 -Release: 5%{?dist} +Version: 0.9.163 +Release: 1%{?dist} License: GPLv2 URL: https://github.com/ClusterLabs/pcs Group: System Environment/Base Summary: Pacemaker Configuration System + +%global pcs_snmp_pkg_name pcs-snmp +%global pyagentx_version 0.4.pcs.2 +%global bundled_lib_dir pcs/bundled +%global pyagentx_dir %{bundled_lib_dir}/pyagentx + #part after last slash is recognized as filename in look-aside repository #desired name is achived by trick with hash anchor Source0: %{url}/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: pcsd-bundle-config-1 Source11: https://rubygems.org/downloads/orderedhash-0.0.6.gem -Source12: https://rubygems.org/downloads/rack-1.6.4.gem -Source13: https://rubygems.org/downloads/rpam-ruby19-1.2.1.gem -Source14: https://rubygems.org/downloads/sinatra-1.4.8.gem -Source15: https://rubygems.org/downloads/sinatra-contrib-1.4.7.gem -Source16: https://rubygems.org/downloads/rack-protection-1.5.3.gem +Source12: https://rubygems.org/downloads/rpam-ruby19-1.2.1.gem +Source13: https://rubygems.org/downloads/sinatra-contrib-2.0.0.gem + +Source41: https://github.com/ondrejmular/pyagentx/archive/v%{pyagentx_version}.tar.gz#/pyagentx-%{pyagentx_version}.tar.gz Patch0: fedfix.patch @@ -44,7 +49,10 @@ BuildRequires: rubygem-io-console BuildRequires: rubygem-json BuildRequires: rubygem-multi_json BuildRequires: rubygem-open4 +BuildRequires: rubygem-rack +BuildRequires: rubygem-rack-protection BuildRequires: rubygem-rack-test +BuildRequires: rubygem-sinatra BuildRequires: rubygem-tilt # ruby libraries for tests BuildRequires: rubygem-test-unit @@ -81,7 +89,10 @@ Requires: rubygem-ffi Requires: rubygem-json Requires: rubygem-multi_json Requires: rubygem-open4 +Requires: rubygem-rack +Requires: rubygem-rack-protection Requires: rubygem-rack-test +Requires: rubygem-sinatra Requires: rubygem-tilt # pcsd fonts Requires: liberation-sans-fonts @@ -101,21 +112,32 @@ Requires(preun): systemd Requires(postun): systemd Provides: bundled(rubygem-orderedhash) = 0.0.6 -# fedora provides version 2.0.1 which is not compatible with pcsd currently -Provides: bundled(rubygem-rack) = 1.6.4 Provides: bundled(rubygem-rpam-ruby19) = 1.2.1 -# fedora provides a patched verison of sinatra which works with rack 2.0.1 but -# doesn't work with rack 1.6.4 -Provides: bundled(rubygem-sinatra) = 1.4.8 -Provides: bundled(rubygem-sinatra-contrib) = 1.4.7 -Provides: bundled(rubygem-tilt) = 2.0.6 -# fedora provides version 2.0.0 which is not compatible with pcsd currently -Provides: bundled(rubygem-rack-protection) = 1.5.3 +Provides: bundled(rubygem-sinatra-contrib) = 2.0.0 %description pcs is a corosync and pacemaker configuration tool. It permits users to easily view, modify and create pacemaker based clusters. +# pcs-snmp package definition +%package -n %{pcs_snmp_pkg_name} +Group: System Environment/Base +Summary: Pacemaker cluster SNMP agent +License: GPLv2, BSD 2-clause +URL: https://github.com/ClusterLabs/pcs + +# tar for unpacking pyagetx source tar ball +BuildRequires: tar + +Requires: pcs = %{version}-%{release} +Requires: pacemaker +Requires: net-snmp + +Provides: bundled(pyagentx) = %{pyagentx_version} + +%description -n %{pcs_snmp_pkg_name} +SNMP agent that provides information about pacemaker cluster to the master agent (snmpd) + %define PCS_PREFIX /usr %prep %setup -q @@ -144,15 +166,15 @@ mkdir -p pcsd/vendor/cache cp -f %SOURCE11 pcsd/vendor/cache cp -f %SOURCE12 pcsd/vendor/cache cp -f %SOURCE13 pcsd/vendor/cache -cp -f %SOURCE14 pcsd/vendor/cache -cp -f %SOURCE15 pcsd/vendor/cache -cp -f %SOURCE16 pcsd/vendor/cache #ruby gems copied -# So it seems that with rubygems 2.7.3 --install-dir option always -# needs --no-user-install??? -sed -i pcsd/Makefile \ - -e '\@gem install@s| -l -i | --no-user-install -i |' + +mkdir -p %{bundled_lib_dir} +tar -xzf %SOURCE41 -C %{bundled_lib_dir} +mv %{bundled_lib_dir}/pyagentx-%{pyagentx_version} %{pyagentx_dir} +cp %{pyagentx_dir}/LICENSE.txt pyagentx_LICENSE.txt +cp %{pyagentx_dir}/CONTRIBUTORS.txt pyagentx_CONTRIBUTORS.txt +cp %{pyagentx_dir}/README.md pyagentx_README.md %build %define debug_package %{nil} @@ -166,7 +188,9 @@ make install \ PYTHON=%{__python3} \ PYTHON_SITELIB=%{python3_sitelib} \ SYSTEMCTL_OVERRIDE=true \ - BASH_COMPLETION_DIR=$RPM_BUILD_ROOT/usr/share/bash-completion/completions + BASH_COMPLETION_DIR=$RPM_BUILD_ROOT/usr/share/bash-completion/completions \ + PYAGENTX_DIR=`readlink -f %{pyagentx_dir}` \ + SYSTEMCTL_OVERRIDE=true make install_pcsd \ DESTDIR=$RPM_BUILD_ROOT \ PREFIX=%{PCS_PREFIX} \ @@ -259,6 +283,9 @@ end %post %systemd_post pcsd.service +%post -n %{pcs_snmp_pkg_name} +%systemd_post pcs_snmp_agent.service + %preun %systemd_preun pcsd.service @@ -278,8 +305,8 @@ end /usr/share/bash-completion/completions/pcs /var/lib/pcsd /etc/pam.d/pcsd -/etc/logrotate.d/pcsd %dir /var/log/pcsd +%config(noreplace) /etc/logrotate.d/pcsd %config(noreplace) /etc/sysconfig/pcsd %ghost %config(noreplace) /var/lib/pcsd/cfgsync_ctl %ghost %config(noreplace) /var/lib/pcsd/pcsd.cookiesecret @@ -298,7 +325,25 @@ end %exclude %{python3_sitelib}/pcs/pcs.8 %exclude %{python3_sitelib}/pcs/pcs +%files -n %{pcs_snmp_pkg_name} +/usr/lib/pcs/pcs_snmp_agent +/usr/lib/pcs/bundled/packages/pyagentx* +/usr/lib/systemd/system/pcs_snmp_agent.service +/usr/share/snmp/mibs/PCMK-PCS*-MIB.txt +%{_mandir}/man8/pcs_snmp_agent.* +%config(noreplace) /etc/sysconfig/pcs_snmp_agent +%dir /var/log/pcs +%doc COPYING +%doc CHANGELOG.md +%doc pyagentx_LICENSE.txt +%doc pyagentx_CONTRIBUTORS.txt +%doc pyagentx_README.md + %changelog +* Tue Feb 20 2018 Ivan Devát - 0.9.163-1 +- Rebased to latest upstream sources (see CHANGELOG.md) +- Adapted for Rack 2 and Sinatra 2 + * Fri Feb 09 2018 Igor Gnatenko - 0.9.160-5 - Escape macros in %%changelog diff --git a/sources b/sources index 17c37c4..9860512 100644 --- a/sources +++ b/sources @@ -1,9 +1,6 @@ -SHA512 (pcs-0.9.160.tar.gz) = 522a7f97fcd8cb65dcbbebf893bd8a83be3a1778ed0352d6be2e637ebd0c5159cff9ef7d8d33c89f9d2d9a0fae1ea53b17bca8703f9d31d48a51603e52cb8b1f +SHA512 (pcs-0.9.163.tar.gz) = 6f3f5b4f7135f598c4448a6d36b366557c109550bbb672081da39c450a1c70a5e749729682c51aa485076a35db3ee5517b09606780463743e16eaf11ca777b7e SHA512 (pcsd-bundle-config-1) = f2a2df2dab39c2012cc6a91517716dde8f5a48788d1069c4addf619bc4dc45a98fd48f0f7964b5400e43e84fe96f942a550d2762553fea97e63dc7ad9b8be823 SHA512 (orderedhash-0.0.6.gem) = b2dae648187437ea7d9d9be47b9ff8d0e1a96bc2ff9e50117033d5bd4cf09cfff3c0740c99c322910138cac90f33b425705ee7a30be84aa193e6afd9f576f64a -SHA512 (rack-1.6.4.gem) = 304a6ae21bfd38008fd7d147f82c44397f3a1d2e689bd01de689aedc6ea0e8784605207fd314bc796974edc5dfcab81636664ea2becb0489302999f99501d41a SHA512 (rpam-ruby19-1.2.1.gem) = b403964295e96a6247289518ff46e59bbae6c78bcfb647e12b7dbb247698642b4a1ee04492521b782fb3c594c2ede8143c765819fecde087e2ec850e3aea3503 -SHA512 (sinatra-1.4.8.gem) = e56a5a6d7ceb0be4bc537feb6ada2956f1fd64b452dee347b259837aa02041dfa53d9808531cdd0a02a91093ba92f7c505c39f0dd990dfbc6e872681f40bc5e9 -SHA512 (sinatra-contrib-1.4.7.gem) = dbb4deaed6844a70352e4fbe0f7b71d000acd525a3f6a20c2dc66d3ddc87b93a3b9c33ac315a0a5f4e30b82631c14196fefc9b6fe29c0aee29ea6db4d000361c -SHA512 (tilt-2.0.6.gem) = 173245f5edd8cf2d31edccd36d375530448e58da1fd744bdf471818ee9b306317f52ecfb9aa8c39ec7746ea3900e600ebfc5f96dfa66724d3e8a4386bd9da260 -SHA512 (rack-protection-1.5.3.gem) = 9f94f9f25197c3f8227f5c9c9fd2e896e35bfc08d4a20f4dded9c42772f348d16dceda6916429833b498b29c4dbba4dbb31b1a3cf90de597fb6df2de145d655a +SHA512 (sinatra-contrib-2.0.0.gem) = 2e9c1fccfee050af8ef93ce0fe92504930ee41db3ff5aec3c2260ab49f334474386787057011adcb6cfa7de62f9e24ea228944d25bdf8af316b0b7614008ce03 +SHA512 (pyagentx-0.4.pcs.2.tar.gz) = d4194fec9a3e5fefe3793d49b7fec1feafef294c7e613a06046c2993daeefc5cb39d7c5b2b402ff83e49b2d976953f862264288c758c0be09d997b5323cc558a