drab 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +8 -0
- data/Gemfile.lock.bak +38 -0
- data/LICENSE +59 -0
- data/README.md +2 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/drab.gemspec +40 -0
- data/lib/drab.rb +2 -0
- data/lib/drab/acl.rb +232 -0
- data/lib/drab/drab.rb +1499 -0
- data/lib/drab/eq.rb +15 -0
- data/lib/drab/extserv.rb +44 -0
- data/lib/drab/extservm.rb +94 -0
- data/lib/drab/gw.rb +165 -0
- data/lib/drab/invokemethod.rb +35 -0
- data/lib/drab/observer.rb +26 -0
- data/lib/drab/ssl.rb +346 -0
- data/lib/drab/timeridconv.rb +97 -0
- data/lib/drab/unix.rb +118 -0
- data/lib/drab/version.rb +3 -0
- metadata +124 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
require 'drab/drab'
|
3
|
+
require 'monitor'
|
4
|
+
|
5
|
+
module DRab
|
6
|
+
|
7
|
+
# Timer id conversion keeps objects alive for a certain amount of time after
|
8
|
+
# their last access. The default time period is 600 seconds and can be
|
9
|
+
# changed upon initialization.
|
10
|
+
#
|
11
|
+
# To use TimerIdConv:
|
12
|
+
#
|
13
|
+
# DRab.install_id_conv TimerIdConv.new 60 # one minute
|
14
|
+
|
15
|
+
class TimerIdConv < DRabIdConv
|
16
|
+
class TimerHolder2 # :nodoc:
|
17
|
+
include MonitorMixin
|
18
|
+
|
19
|
+
class InvalidIndexError < RuntimeError; end
|
20
|
+
|
21
|
+
def initialize(keeping=600)
|
22
|
+
super()
|
23
|
+
@sentinel = Object.new
|
24
|
+
@gc = {}
|
25
|
+
@renew = {}
|
26
|
+
@keeping = keeping
|
27
|
+
@expires = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def add(obj)
|
31
|
+
synchronize do
|
32
|
+
rotate
|
33
|
+
key = obj.__id__
|
34
|
+
@renew[key] = obj
|
35
|
+
invoke_keeper
|
36
|
+
return key
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def fetch(key)
|
41
|
+
synchronize do
|
42
|
+
rotate
|
43
|
+
obj = peek(key)
|
44
|
+
raise InvalidIndexError if obj == @sentinel
|
45
|
+
@renew[key] = obj # KeepIt
|
46
|
+
return obj
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def peek(key)
|
52
|
+
return @renew.fetch(key) { @gc.fetch(key, @sentinel) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def invoke_keeper
|
56
|
+
return if @expires
|
57
|
+
@expires = Time.now + @keeping
|
58
|
+
on_gc
|
59
|
+
end
|
60
|
+
|
61
|
+
def on_gc
|
62
|
+
return unless Thread.main.alive?
|
63
|
+
return if @expires.nil?
|
64
|
+
Thread.new { rotate } if @expires < Time.now
|
65
|
+
ObjectSpace.define_finalizer(Object.new) {on_gc}
|
66
|
+
end
|
67
|
+
|
68
|
+
def rotate
|
69
|
+
synchronize do
|
70
|
+
if @expires &.< Time.now
|
71
|
+
@gc = @renew # GCed
|
72
|
+
@renew = {}
|
73
|
+
@expires = @gc.empty? ? nil : Time.now + @keeping
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Creates a new TimerIdConv which will hold objects for +keeping+ seconds.
|
80
|
+
def initialize(keeping=600)
|
81
|
+
@holder = TimerHolder2.new(keeping)
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_obj(ref) # :nodoc:
|
85
|
+
return super if ref.nil?
|
86
|
+
@holder.fetch(ref)
|
87
|
+
rescue TimerHolder2::InvalidIndexError
|
88
|
+
raise "invalid reference"
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_id(obj) # :nodoc:
|
92
|
+
return @holder.add(obj)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# DRab.install_id_conv(TimerIdConv.new)
|
data/lib/drab/unix.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
require 'socket'
|
3
|
+
require 'drab/drab'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
raise(LoadError, "UNIXServer is required") unless defined?(UNIXServer)
|
7
|
+
|
8
|
+
module DRab
|
9
|
+
|
10
|
+
# Implements DRab over a UNIX socket
|
11
|
+
#
|
12
|
+
# DRab UNIX socket URIs look like <code>drabunix:<path>?<option></code>. The
|
13
|
+
# option is optional.
|
14
|
+
|
15
|
+
class DRabUNIXSocket < DRabTCPSocket
|
16
|
+
# :stopdoc:
|
17
|
+
def self.parse_uri(uri)
|
18
|
+
if /^drabunix:(.*?)(\?(.*))?$/ =~ uri
|
19
|
+
filename = $1
|
20
|
+
option = $3
|
21
|
+
[filename, option]
|
22
|
+
else
|
23
|
+
raise(DRabBadScheme, uri) unless uri =~ /^drabunix:/
|
24
|
+
raise(DRabBadURI, 'can\'t parse uri:' + uri)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.open(uri, config)
|
29
|
+
filename, = parse_uri(uri)
|
30
|
+
filename.untaint
|
31
|
+
soc = UNIXSocket.open(filename)
|
32
|
+
self.new(uri, soc, config)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.open_server(uri, config)
|
36
|
+
filename, = parse_uri(uri)
|
37
|
+
if filename.size == 0
|
38
|
+
soc = temp_server
|
39
|
+
filename = soc.path
|
40
|
+
uri = 'drabunix:' + soc.path
|
41
|
+
else
|
42
|
+
soc = UNIXServer.open(filename)
|
43
|
+
end
|
44
|
+
owner = config[:UNIXFileOwner]
|
45
|
+
group = config[:UNIXFileGroup]
|
46
|
+
if owner || group
|
47
|
+
require 'etc'
|
48
|
+
owner = Etc.getpwnam( owner ).uid if owner
|
49
|
+
group = Etc.getgrnam( group ).gid if group
|
50
|
+
File.chown owner, group, filename
|
51
|
+
end
|
52
|
+
mode = config[:UNIXFileMode]
|
53
|
+
File.chmod(mode, filename) if mode
|
54
|
+
|
55
|
+
self.new(uri, soc, config, true)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.uri_option(uri, config)
|
59
|
+
filename, option = parse_uri(uri)
|
60
|
+
return "drabunix:#{filename}", option
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize(uri, soc, config={}, server_mode = false)
|
64
|
+
super(uri, soc, config)
|
65
|
+
set_sockopt(@socket)
|
66
|
+
@server_mode = server_mode
|
67
|
+
@acl = nil
|
68
|
+
end
|
69
|
+
|
70
|
+
# import from tempfile.rb
|
71
|
+
Max_try = 10
|
72
|
+
private
|
73
|
+
def self.temp_server
|
74
|
+
tmpdir = Dir::tmpdir
|
75
|
+
n = 0
|
76
|
+
while true
|
77
|
+
begin
|
78
|
+
tmpname = sprintf('%s/druby%d.%d', tmpdir, $$, n)
|
79
|
+
lock = tmpname + '.lock'
|
80
|
+
unless File.exist?(tmpname) or File.exist?(lock)
|
81
|
+
Dir.mkdir(lock)
|
82
|
+
break
|
83
|
+
end
|
84
|
+
rescue
|
85
|
+
raise "cannot generate tempfile `%s'" % tmpname if n >= Max_try
|
86
|
+
#sleep(1)
|
87
|
+
end
|
88
|
+
n += 1
|
89
|
+
end
|
90
|
+
soc = UNIXServer.new(tmpname)
|
91
|
+
Dir.rmdir(lock)
|
92
|
+
soc
|
93
|
+
end
|
94
|
+
|
95
|
+
public
|
96
|
+
def close
|
97
|
+
return unless @socket
|
98
|
+
path = @socket.path if @server_mode
|
99
|
+
@socket.close
|
100
|
+
File.unlink(path) if @server_mode
|
101
|
+
@socket = nil
|
102
|
+
close_shutdown_pipe
|
103
|
+
end
|
104
|
+
|
105
|
+
def accept
|
106
|
+
s = accept_or_shutdown
|
107
|
+
return nil unless s
|
108
|
+
self.class.new(nil, s, @config)
|
109
|
+
end
|
110
|
+
|
111
|
+
def set_sockopt(soc)
|
112
|
+
# no-op for now
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
DRabProtocol.add_protocol(DRabUNIXSocket)
|
117
|
+
# :startdoc:
|
118
|
+
end
|
data/lib/drab/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: drab
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Masatoshi SEKI
|
8
|
+
- Jeff Dileo
|
9
|
+
autorequire:
|
10
|
+
bindir: exe
|
11
|
+
cert_chain: []
|
12
|
+
date: 2017-09-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: marshal-structure
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '2.0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '2.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: bundler
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.13'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.13'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rake
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '10.0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '10.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rspec
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '3.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.0'
|
70
|
+
description: Make DRb great again!
|
71
|
+
email:
|
72
|
+
- jtdileo@gmail.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- Gemfile
|
79
|
+
- Gemfile.lock.bak
|
80
|
+
- LICENSE
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- bin/console
|
84
|
+
- bin/setup
|
85
|
+
- drab.gemspec
|
86
|
+
- lib/drab.rb
|
87
|
+
- lib/drab/acl.rb
|
88
|
+
- lib/drab/drab.rb
|
89
|
+
- lib/drab/eq.rb
|
90
|
+
- lib/drab/extserv.rb
|
91
|
+
- lib/drab/extservm.rb
|
92
|
+
- lib/drab/gw.rb
|
93
|
+
- lib/drab/invokemethod.rb
|
94
|
+
- lib/drab/observer.rb
|
95
|
+
- lib/drab/ssl.rb
|
96
|
+
- lib/drab/timeridconv.rb
|
97
|
+
- lib/drab/unix.rb
|
98
|
+
- lib/drab/version.rb
|
99
|
+
homepage: https://github.com/chaosdata/drab
|
100
|
+
licenses:
|
101
|
+
- Ruby
|
102
|
+
metadata:
|
103
|
+
allowed_push_host: https://rubygems.org
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 1.9.3
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 2.6.11
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: Make DRb great again!
|
124
|
+
test_files: []
|