From f7b706961ce0f51beebe24bdce1d56eb38ec8fca 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 | 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