pcs/fedfix.patch

312 lines
9.9 KiB
Diff

From f7b706961ce0f51beebe24bdce1d56eb38ec8fca Mon Sep 17 00:00:00 2001
From: Ivan Devat <idevat@redhat.com>
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 | 36 ++++++++----------------------------
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(+), 76 deletions(-)
diff --git a/pcs/pcs b/pcs/pcs
index 736f9cd2..3dff69a5 100755
--- a/pcs/pcs
+++ b/pcs/pcs
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
from __future__ import absolute_import
import os.path
diff --git a/pcs/test/suite.py b/pcs/test/suite.py
index 809596bc..98c5a268 100755
--- a/pcs/test/suite.py
+++ b/pcs/test/suite.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
from __future__ import (
absolute_import,
division,
diff --git a/pcsd/Makefile b/pcsd/Makefile
index d7d98f60..c83bd958 100644
--- a/pcsd/Makefile
+++ b/pcsd/Makefile
@@ -1,33 +1,13 @@
-FFI_VERSION="1.9.18"
-FFI_C_DIR=vendor/bundle/ruby/gems/ffi-${FFI_VERSION}/ext/ffi_c
-
-build_gems: get_gems
- bundle install --local --deployment
- #ffi makes symlink with absolute path. Let's change it to relative path.
- for fname in `ls ${FFI_C_DIR}/libffi-*/include/ffitarget.h`; do \
- if [[ -L "$$fname" ]]; then \
- target=$$(readlink $$fname | sed "s~.*/${FFI_C_DIR}\(/libffi/src/[^/]\+/ffitarget.h\)~../..\1~"); \
- rm $$fname; \
- ln -s $$target $$fname; \
- fi; \
- done;
-
-build_gems_without_bundler:
+# 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 --ignore-dependencies -i vendor/bundle/ruby \
- vendor/cache/backports-3.9.1.gem \
- vendor/cache/ethon-0.10.1.gem \
- vendor/cache/ffi-${FFI_VERSION}.gem \
- vendor/cache/json-2.1.0.gem \
- vendor/cache/multi_json-1.12.2.gem \
- vendor/cache/open4-1.3.4.gem \
- vendor/cache/rack-1.6.4.gem \
- vendor/cache/rack-protection-1.5.5.gem \
- vendor/cache/rack-test-0.7.0.gem \
+ 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/rpam-ruby19-1.2.1.gem \
- vendor/cache/sinatra-1.4.8.gem \
- vendor/cache/sinatra-contrib-1.4.7.gem \
- vendor/cache/tilt-2.0.8.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 61b28044..39c69608 100644
--- a/pcsd/pcsd.rb
+++ b/pcsd/pcsd.rb
@@ -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
--- a/pcsd/pcsd.service-runner
+++ b/pcsd/pcsd.service-runner
@@ -3,8 +3,9 @@
# it also serves as a holder of a selinux context
begin
- # add pcsd to the load path (ruby -I)
+ # add pcsd and bundled gems to the load path (ruby -I)
libdir = File.dirname(__FILE__)
+ $LOAD_PATH.unshift(*Dir[libdir + '/vendor/bundle/ruby/gems/*/lib'])
$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 8b09ed82..f42bf73e 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 eaf2cbf1..2668c958 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 e72bf012..c212b1a0 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