312 lines
9.9 KiB
Diff
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
|
|
|