drab 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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)
@@ -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
@@ -0,0 +1,3 @@
1
+ module DRab
2
+ VERSION = "0.1.0"
3
+ end
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: []