rubysl-drb 1.0.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 +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/drb.rb +1 -0
- data/lib/drb/acl.rb +146 -0
- data/lib/drb/drb.rb +1783 -0
- data/lib/drb/eq.rb +16 -0
- data/lib/drb/extserv.rb +64 -0
- data/lib/drb/extservm.rb +89 -0
- data/lib/drb/gw.rb +122 -0
- data/lib/drb/invokemethod.rb +34 -0
- data/lib/drb/observer.rb +22 -0
- data/lib/drb/ssl.rb +190 -0
- data/lib/drb/timeridconv.rb +91 -0
- data/lib/drb/unix.rb +108 -0
- data/lib/rubysl/drb.rb +2 -0
- data/lib/rubysl/drb/drb.rb +2 -0
- data/lib/rubysl/drb/version.rb +5 -0
- data/rubysl-drb.gemspec +23 -0
- data/spec/config_spec.rb +4 -0
- data/spec/current_server_spec.rb +4 -0
- data/spec/drbarray/_dump_spec.rb +6 -0
- data/spec/drbarray/_load_spec.rb +6 -0
- data/spec/drbconn/alive_spec.rb +6 -0
- data/spec/drbconn/close_spec.rb +6 -0
- data/spec/drbconn/open_spec.rb +6 -0
- data/spec/drbconn/send_message_spec.rb +6 -0
- data/spec/drbconn/uri_spec.rb +6 -0
- data/spec/drbidconv/to_id_spec.rb +6 -0
- data/spec/drbidconv/to_obj_spec.rb +6 -0
- data/spec/drbmessage/dump_spec.rb +6 -0
- data/spec/drbmessage/load_spec.rb +6 -0
- data/spec/drbmessage/recv_reply_spec.rb +6 -0
- data/spec/drbmessage/recv_request_spec.rb +6 -0
- data/spec/drbmessage/send_reply_spec.rb +6 -0
- data/spec/drbmessage/send_request_spec.rb +6 -0
- data/spec/drbobject/__drbref_spec.rb +4 -0
- data/spec/drbobject/__drburi_spec.rb +4 -0
- data/spec/drbobject/_dump_spec.rb +4 -0
- data/spec/drbobject/_load_spec.rb +4 -0
- data/spec/drbobject/eql_spec.rb +4 -0
- data/spec/drbobject/equal_value_spec.rb +4 -0
- data/spec/drbobject/hash_spec.rb +4 -0
- data/spec/drbobject/method_missing_spec.rb +4 -0
- data/spec/drbobject/new_spec.rb +0 -0
- data/spec/drbobject/new_with_spec.rb +4 -0
- data/spec/drbobject/new_with_uri_spec.rb +4 -0
- data/spec/drbobject/prepare_backtrace_spec.rb +4 -0
- data/spec/drbobject/pretty_print_cycle_spec.rb +4 -0
- data/spec/drbobject/pretty_print_spec.rb +4 -0
- data/spec/drbobject/respond_to_spec.rb +4 -0
- data/spec/drbobject/with_friend_spec.rb +4 -0
- data/spec/drbprotocol/add_protocol_spec.rb +6 -0
- data/spec/drbprotocol/auto_load_spec.rb +6 -0
- data/spec/drbprotocol/open_server_spec.rb +6 -0
- data/spec/drbprotocol/open_spec.rb +6 -0
- data/spec/drbprotocol/uri_option_spec.rb +6 -0
- data/spec/drbserver/alive_spec.rb +6 -0
- data/spec/drbserver/check_insecure_method_spec.rb +6 -0
- data/spec/drbserver/config_spec.rb +6 -0
- data/spec/drbserver/default_acl_spec.rb +6 -0
- data/spec/drbserver/default_argc_limit_spec.rb +6 -0
- data/spec/drbserver/default_id_conv_spec.rb +6 -0
- data/spec/drbserver/default_load_limit_spec.rb +6 -0
- data/spec/drbserver/default_safe_level_spec.rb +6 -0
- data/spec/drbserver/front_spec.rb +6 -0
- data/spec/drbserver/invokemethod/perform_spec.rb +6 -0
- data/spec/drbserver/invokemethod18mixin/block_yield_spec.rb +6 -0
- data/spec/drbserver/invokemethod18mixin/perform_with_block_spec.rb +6 -0
- data/spec/drbserver/make_config_spec.rb +6 -0
- data/spec/drbserver/safe_level_spec.rb +6 -0
- data/spec/drbserver/stop_service_spec.rb +6 -0
- data/spec/drbserver/thread_spec.rb +6 -0
- data/spec/drbserver/to_id_spec.rb +6 -0
- data/spec/drbserver/to_obj_spec.rb +6 -0
- data/spec/drbserver/uri_spec.rb +6 -0
- data/spec/drbserver/verbose_spec.rb +18 -0
- data/spec/drbtcpsocket/accept_spec.rb +6 -0
- data/spec/drbtcpsocket/alive_spec.rb +6 -0
- data/spec/drbtcpsocket/close_spec.rb +6 -0
- data/spec/drbtcpsocket/getservername_spec.rb +6 -0
- data/spec/drbtcpsocket/open_server_inaddr_any_spec.rb +6 -0
- data/spec/drbtcpsocket/open_server_spec.rb +6 -0
- data/spec/drbtcpsocket/open_spec.rb +6 -0
- data/spec/drbtcpsocket/parse_uri_spec.rb +6 -0
- data/spec/drbtcpsocket/peeraddr_spec.rb +6 -0
- data/spec/drbtcpsocket/recv_reply_spec.rb +6 -0
- data/spec/drbtcpsocket/recv_request_spec.rb +6 -0
- data/spec/drbtcpsocket/send_reply_spec.rb +6 -0
- data/spec/drbtcpsocket/send_request_spec.rb +6 -0
- data/spec/drbtcpsocket/set_sockopt_spec.rb +6 -0
- data/spec/drbtcpsocket/stream_spec.rb +6 -0
- data/spec/drbtcpsocket/uri_option_spec.rb +6 -0
- data/spec/drbtcpsocket/uri_spec.rb +6 -0
- data/spec/drbundumped/_dump_spec.rb +6 -0
- data/spec/drbunknown/_dump_spec.rb +6 -0
- data/spec/drbunknown/_load_spec.rb +6 -0
- data/spec/drbunknown/buf_spec.rb +6 -0
- data/spec/drbunknown/exception_spec.rb +6 -0
- data/spec/drbunknown/name_spec.rb +6 -0
- data/spec/drbunknown/reload_spec.rb +6 -0
- data/spec/drburioption/eql_spec.rb +6 -0
- data/spec/drburioption/equal_value_spec.rb +6 -0
- data/spec/drburioption/hash_spec.rb +6 -0
- data/spec/drburioption/option_spec.rb +6 -0
- data/spec/drburioption/to_s_spec.rb +6 -0
- data/spec/exception/_dump_spec.rb +6 -0
- data/spec/exception/_load_spec.rb +6 -0
- data/spec/exception/reason_spec.rb +6 -0
- data/spec/exception/unknown_spec.rb +6 -0
- data/spec/fetch_server_spec.rb +4 -0
- data/spec/fixtures/test_server.rb +8 -0
- data/spec/front_spec.rb +4 -0
- data/spec/here_spec.rb +4 -0
- data/spec/install_acl_spec.rb +4 -0
- data/spec/install_id_conv_spec.rb +4 -0
- data/spec/mutex_spec.rb +6 -0
- data/spec/primary_server_spec.rb +8 -0
- data/spec/regist_server_spec.rb +4 -0
- data/spec/remove_server_spec.rb +4 -0
- data/spec/start_service_spec.rb +36 -0
- data/spec/stop_service_spec.rb +24 -0
- data/spec/thread_spec.rb +4 -0
- data/spec/to_id_spec.rb +4 -0
- data/spec/to_obj_spec.rb +4 -0
- data/spec/uri_spec.rb +4 -0
- metadata +336 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'drb/drb'
|
|
2
|
+
require 'monitor'
|
|
3
|
+
|
|
4
|
+
module DRb
|
|
5
|
+
class TimerIdConv < DRbIdConv
|
|
6
|
+
class TimerHolder2
|
|
7
|
+
include MonitorMixin
|
|
8
|
+
|
|
9
|
+
class InvalidIndexError < RuntimeError; end
|
|
10
|
+
|
|
11
|
+
def initialize(timeout=600)
|
|
12
|
+
super()
|
|
13
|
+
@sentinel = Object.new
|
|
14
|
+
@gc = {}
|
|
15
|
+
@curr = {}
|
|
16
|
+
@renew = {}
|
|
17
|
+
@timeout = timeout
|
|
18
|
+
@keeper = keeper
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def add(obj)
|
|
22
|
+
synchronize do
|
|
23
|
+
key = obj.__id__
|
|
24
|
+
@curr[key] = obj
|
|
25
|
+
return key
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def fetch(key, dv=@sentinel)
|
|
30
|
+
synchronize do
|
|
31
|
+
obj = peek(key)
|
|
32
|
+
if obj == @sentinel
|
|
33
|
+
return dv unless dv == @sentinel
|
|
34
|
+
raise InvalidIndexError
|
|
35
|
+
end
|
|
36
|
+
@renew[key] = obj # KeepIt
|
|
37
|
+
return obj
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def include?(key)
|
|
42
|
+
synchronize do
|
|
43
|
+
obj = peek(key)
|
|
44
|
+
return false if obj == @sentinel
|
|
45
|
+
true
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def peek(key)
|
|
50
|
+
synchronize do
|
|
51
|
+
return @curr.fetch(key, @renew.fetch(key, @gc.fetch(key, @sentinel)))
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
def alternate
|
|
57
|
+
synchronize do
|
|
58
|
+
@gc = @curr # GCed
|
|
59
|
+
@curr = @renew
|
|
60
|
+
@renew = {}
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def keeper
|
|
65
|
+
Thread.new do
|
|
66
|
+
loop do
|
|
67
|
+
size = alternate
|
|
68
|
+
sleep(@timeout)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def initialize(timeout=600)
|
|
75
|
+
@holder = TimerHolder2.new(timeout)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def to_obj(ref)
|
|
79
|
+
return super if ref.nil?
|
|
80
|
+
@holder.fetch(ref)
|
|
81
|
+
rescue TimerHolder2::InvalidIndexError
|
|
82
|
+
raise "invalid reference"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def to_id(obj)
|
|
86
|
+
return @holder.add(obj)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# DRb.install_id_conv(TimerIdConv.new)
|
data/lib/drb/unix.rb
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require 'socket'
|
|
2
|
+
require 'drb/drb'
|
|
3
|
+
require 'tmpdir'
|
|
4
|
+
|
|
5
|
+
raise(LoadError, "UNIXServer is required") unless defined?(UNIXServer)
|
|
6
|
+
|
|
7
|
+
module DRb
|
|
8
|
+
|
|
9
|
+
class DRbUNIXSocket < DRbTCPSocket
|
|
10
|
+
def self.parse_uri(uri)
|
|
11
|
+
if /^drbunix:(.*?)(\?(.*))?$/ =~ uri
|
|
12
|
+
filename = $1
|
|
13
|
+
option = $3
|
|
14
|
+
[filename, option]
|
|
15
|
+
else
|
|
16
|
+
raise(DRbBadScheme, uri) unless uri =~ /^drbunix:/
|
|
17
|
+
raise(DRbBadURI, 'can\'t parse uri:' + uri)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.open(uri, config)
|
|
22
|
+
filename, option = parse_uri(uri)
|
|
23
|
+
filename.untaint
|
|
24
|
+
soc = UNIXSocket.open(filename)
|
|
25
|
+
self.new(uri, soc, config)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.open_server(uri, config)
|
|
29
|
+
filename, option = parse_uri(uri)
|
|
30
|
+
if filename.size == 0
|
|
31
|
+
soc = temp_server
|
|
32
|
+
filename = soc.path
|
|
33
|
+
uri = 'drbunix:' + soc.path
|
|
34
|
+
else
|
|
35
|
+
soc = UNIXServer.open(filename)
|
|
36
|
+
end
|
|
37
|
+
owner = config[:UNIXFileOwner]
|
|
38
|
+
group = config[:UNIXFileGroup]
|
|
39
|
+
if owner || group
|
|
40
|
+
require 'etc'
|
|
41
|
+
owner = Etc.getpwnam( owner ).uid if owner
|
|
42
|
+
group = Etc.getgrnam( group ).gid if group
|
|
43
|
+
File.chown owner, group, filename
|
|
44
|
+
end
|
|
45
|
+
mode = config[:UNIXFileMode]
|
|
46
|
+
File.chmod(mode, filename) if mode
|
|
47
|
+
|
|
48
|
+
self.new(uri, soc, config, true)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.uri_option(uri, config)
|
|
52
|
+
filename, option = parse_uri(uri)
|
|
53
|
+
return "drbunix:#{filename}", option
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def initialize(uri, soc, config={}, server_mode = false)
|
|
57
|
+
super(uri, soc, config)
|
|
58
|
+
set_sockopt(@socket)
|
|
59
|
+
@server_mode = server_mode
|
|
60
|
+
@acl = nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# import from tempfile.rb
|
|
64
|
+
Max_try = 10
|
|
65
|
+
private
|
|
66
|
+
def self.temp_server
|
|
67
|
+
tmpdir = Dir::tmpdir
|
|
68
|
+
n = 0
|
|
69
|
+
while true
|
|
70
|
+
begin
|
|
71
|
+
tmpname = sprintf('%s/druby%d.%d', tmpdir, $$, n)
|
|
72
|
+
lock = tmpname + '.lock'
|
|
73
|
+
unless File.exist?(tmpname) or File.exist?(lock)
|
|
74
|
+
Dir.mkdir(lock)
|
|
75
|
+
break
|
|
76
|
+
end
|
|
77
|
+
rescue
|
|
78
|
+
raise "cannot generate tempfile `%s'" % tmpname if n >= Max_try
|
|
79
|
+
#sleep(1)
|
|
80
|
+
end
|
|
81
|
+
n += 1
|
|
82
|
+
end
|
|
83
|
+
soc = UNIXServer.new(tmpname)
|
|
84
|
+
Dir.rmdir(lock)
|
|
85
|
+
soc
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
public
|
|
89
|
+
def close
|
|
90
|
+
return unless @socket
|
|
91
|
+
path = @socket.path if @server_mode
|
|
92
|
+
@socket.close
|
|
93
|
+
File.unlink(path) if @server_mode
|
|
94
|
+
@socket = nil
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def accept
|
|
98
|
+
s = @socket.accept
|
|
99
|
+
self.class.new(nil, s, @config)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def set_sockopt(soc)
|
|
103
|
+
soc.fcntl(Fcntl::F_SETFL, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
DRbProtocol.add_protocol(DRbUNIXSocket)
|
|
108
|
+
end
|
data/lib/rubysl/drb.rb
ADDED
data/rubysl-drb.gemspec
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
require './lib/rubysl/drb/version'
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |spec|
|
|
5
|
+
spec.name = "rubysl-drb"
|
|
6
|
+
spec.version = RubySL::DRb::VERSION
|
|
7
|
+
spec.authors = ["Brian Shirai"]
|
|
8
|
+
spec.email = ["brixen@gmail.com"]
|
|
9
|
+
spec.description = %q{Ruby standard library drb.}
|
|
10
|
+
spec.summary = %q{Ruby standard library drb.}
|
|
11
|
+
spec.homepage = "https://github.com/rubysl/rubysl-drb"
|
|
12
|
+
spec.license = "BSD"
|
|
13
|
+
|
|
14
|
+
spec.files = `git ls-files`.split($/)
|
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
17
|
+
spec.require_paths = ["lib"]
|
|
18
|
+
|
|
19
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
|
20
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
|
21
|
+
spec.add_development_dependency "mspec", "~> 1.5"
|
|
22
|
+
spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
|
|
23
|
+
end
|
data/spec/config_spec.rb
ADDED
|
File without changes
|