riser 0.1.6 → 0.1.7
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 +4 -4
- data/Rakefile +1 -1
- data/lib/riser.rb +1 -0
- data/lib/riser/daemon.rb +162 -146
- data/lib/riser/stream.rb +5 -5
- data/lib/riser/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef14df0b3e4899c0d573754bdc7071bd88ee89103d51d51d547a200bf9d305a5
|
4
|
+
data.tar.gz: f3784e9ec64b88fe4ca68a51ceeffba1af2ba1c4e6fa464a555a76da27c6c98f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 190ba65ce5b250938ebd92ae5cebf8a96b2995a19221e8c8a39ad2024e18f7c24f1cb07570d2c2c60374363572c79083a2ca50d16fb503581192c1b0ee142142
|
7
|
+
data.tar.gz: 97f9c5de7034224540e9c4e118e45a6d99179a143d2cd2ce375f0e4cf53a8c0a641b5ec1a43667da71ad75709a16395059ff69019c8a86f971862f941dbe1ace
|
data/Rakefile
CHANGED
data/lib/riser.rb
CHANGED
@@ -18,6 +18,7 @@ module Riser
|
|
18
18
|
autoload :SocketServer, 'riser/server'
|
19
19
|
autoload :StatusFile, 'riser/daemon'
|
20
20
|
autoload :Stream, 'riser/stream'
|
21
|
+
autoload :SystemOperation, 'riser/daemon'
|
21
22
|
autoload :TemporaryPath, 'riser/temppath'
|
22
23
|
autoload :TimeoutSizedQueue, 'riser/server'
|
23
24
|
autoload :WriteBufferStream, 'riser/stream'
|
data/lib/riser/daemon.rb
CHANGED
@@ -25,6 +25,16 @@ module Riser
|
|
25
25
|
@file.flock(File::LOCK_EX | File::LOCK_NB)
|
26
26
|
end
|
27
27
|
|
28
|
+
def self.locked?(status_file_path)
|
29
|
+
begin
|
30
|
+
File.open(status_file_path, File::WRONLY) {|lock_file|
|
31
|
+
! lock_file.flock(File::LOCK_EX | File::LOCK_NB)
|
32
|
+
}
|
33
|
+
rescue Errno::ENOENT
|
34
|
+
false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
28
38
|
def write(text)
|
29
39
|
@file.truncate(0)
|
30
40
|
@file.seek(0)
|
@@ -34,158 +44,158 @@ module Riser
|
|
34
44
|
end
|
35
45
|
end
|
36
46
|
|
37
|
-
class
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
def get_server_address(sockaddr_get)
|
48
|
-
begin
|
49
|
-
address_config = sockaddr_get.call
|
50
|
-
rescue
|
51
|
-
@logger.error("failed to get server address [#{$!} (#{$!.class})]")
|
52
|
-
@logger.debug($!) if @logger.debug?
|
53
|
-
return
|
54
|
-
end
|
47
|
+
class SystemOperation
|
48
|
+
def initialize(logger, module_FileUtils: FileUtils, module_Process: Process, class_IO: IO, class_File: File)
|
49
|
+
@logger = logger
|
50
|
+
@FileUtils = module_FileUtils
|
51
|
+
@Process = module_Process
|
52
|
+
@IO = class_IO
|
53
|
+
@File = class_File
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
def get_server_address(sockaddr_get)
|
57
|
+
begin
|
58
|
+
address_config = sockaddr_get.call
|
59
|
+
rescue
|
60
|
+
@logger.error("failed to get server address [#{$!} (#{$!.class})]")
|
61
|
+
@logger.debug($!) if @logger.debug?
|
62
|
+
return
|
63
|
+
end
|
63
64
|
|
64
|
-
|
65
|
+
begin
|
66
|
+
server_address = SocketAddress.parse(address_config)
|
67
|
+
rescue
|
68
|
+
@logger.error("failed to parse server address: #{address_config.inspect} [#{$!} (#{$!.class})]")
|
69
|
+
@logger.debug($!) if @logger.debug?
|
70
|
+
return
|
65
71
|
end
|
66
72
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
73
|
+
server_address
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_server_socket(server_address)
|
77
|
+
begin
|
78
|
+
server_address.open_server
|
79
|
+
rescue
|
80
|
+
@logger.error("failed to open server socket: #{server_address} [#{$!} (#{$!.class})]")
|
81
|
+
@logger.debug($!) if @logger.debug?
|
82
|
+
nil
|
75
83
|
end
|
84
|
+
end
|
76
85
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
86
|
+
def get_sockaddr(server_socket)
|
87
|
+
begin
|
88
|
+
server_socket.local_address.inspect_sockaddr
|
89
|
+
rescue
|
90
|
+
@logger.error("failed to get socket address: #{server_socket} [#{$!} (#{$!.class})]")
|
91
|
+
@logger.debug($!) if @logger.debug?
|
92
|
+
nil
|
85
93
|
end
|
94
|
+
end
|
86
95
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
96
|
+
def listen(server_socket, backlog)
|
97
|
+
begin
|
98
|
+
server_socket.listen(backlog)
|
99
|
+
rescue
|
100
|
+
@logger.error("failed to listen(2) server socket with backlog: #{backlog} [#{$!} (#{$!.class})]")
|
101
|
+
@logger.debug($!) if @logger.debug?
|
102
|
+
nil
|
95
103
|
end
|
104
|
+
end
|
96
105
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
end
|
106
|
+
def chmod(mode, path)
|
107
|
+
begin
|
108
|
+
@FileUtils.chmod(mode, path)
|
109
|
+
rescue
|
110
|
+
@logger.error("failed to chmod(2): #{'%04o' % mode} #{path} [#{$!} (#{$!.class})]")
|
111
|
+
@logger.debug($!) if @logger.debug?
|
112
|
+
nil
|
105
113
|
end
|
114
|
+
end
|
106
115
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
116
|
+
def chown(owner, group, path)
|
117
|
+
begin
|
118
|
+
@FileUtils.chown(owner, group, path)
|
119
|
+
rescue
|
120
|
+
@logger.error("failed to chown(2): <#{owner}> <#{group}> <#{path}> [#{$!} (#{$!.class})]")
|
121
|
+
@logger.debug($!) if @logger.debug?
|
122
|
+
nil
|
115
123
|
end
|
124
|
+
end
|
116
125
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
end
|
126
|
+
def send_signal(pid, signal)
|
127
|
+
begin
|
128
|
+
@Process.kill(signal, pid)
|
129
|
+
rescue
|
130
|
+
@logger.error("failed to send signal (#{signal}) to process (pid: #{pid}) [#{$!} (#{$!.class})]")
|
131
|
+
@logger.debug($!) if @logger.debug?
|
132
|
+
nil
|
125
133
|
end
|
134
|
+
end
|
126
135
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
end
|
136
|
+
def wait(pid, flags=0)
|
137
|
+
begin
|
138
|
+
@Process.wait(pid, flags)
|
139
|
+
rescue
|
140
|
+
@logger.error("failed to wait(2) for process (pid: #{pid}) [#{$!} (#{$!.class})]")
|
141
|
+
@logger.debug($!) if @logger.debug?
|
142
|
+
nil
|
135
143
|
end
|
144
|
+
end
|
136
145
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
end
|
146
|
+
def pipe
|
147
|
+
begin
|
148
|
+
@IO.pipe
|
149
|
+
rescue
|
150
|
+
@logger.error("failed to pipe(2) [#{$!} (#{$!.class})]")
|
151
|
+
@logger.debug($!) if @logger.debug?
|
152
|
+
nil
|
145
153
|
end
|
154
|
+
end
|
146
155
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
end
|
156
|
+
def fork
|
157
|
+
begin
|
158
|
+
@Process.fork{ yield }
|
159
|
+
rescue
|
160
|
+
@logger.error("failed to fork(2) [#{$!} (#{$!.class})]")
|
161
|
+
@logger.debug($!) if @logger.debug?
|
162
|
+
nil
|
155
163
|
end
|
164
|
+
end
|
156
165
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
end
|
166
|
+
def gets(io)
|
167
|
+
begin
|
168
|
+
io.gets
|
169
|
+
rescue
|
170
|
+
@logger.error("failed to get line from #{io.inspect} [#{$!} (#{$!.class})]")
|
171
|
+
@logger.debug($!) if @logger.debug?
|
172
|
+
nil
|
165
173
|
end
|
174
|
+
end
|
166
175
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
176
|
+
def close(io)
|
177
|
+
begin
|
178
|
+
io.close
|
179
|
+
io
|
180
|
+
rescue
|
181
|
+
@logger.error("failed to close(2) #{io.inspect} [#{$!} (#{$!.class})]")
|
182
|
+
@logger.debug($!) if @logger.debug?
|
183
|
+
nil
|
176
184
|
end
|
185
|
+
end
|
177
186
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
end
|
187
|
+
def unlink(path)
|
188
|
+
begin
|
189
|
+
File.unlink(path)
|
190
|
+
rescue
|
191
|
+
@logger.error("failed to unlink(2): #{path} [#{$!} (#{$!.class})]")
|
192
|
+
@logger.debug($!) if @logger.debug?
|
193
|
+
nil
|
186
194
|
end
|
187
195
|
end
|
196
|
+
end
|
188
197
|
|
198
|
+
class RootProcess
|
189
199
|
include ServerSignal
|
190
200
|
|
191
201
|
def initialize(logger, sockaddr_get, server_polling_interval_seconds, server_restart_overlap_seconds=0, euid=nil, egid=nil, &block) # :yields: socket_server
|
@@ -590,31 +600,31 @@ module Riser
|
|
590
600
|
end
|
591
601
|
|
592
602
|
module Daemon
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
603
|
+
class << self
|
604
|
+
def get_id(name, id_mod)
|
605
|
+
if (name) then
|
606
|
+
case (name)
|
607
|
+
when Integer
|
608
|
+
name
|
609
|
+
when /\A \d+ \z/x
|
610
|
+
name.to_i
|
611
|
+
else
|
612
|
+
id_mod.from_name(name)
|
613
|
+
end
|
604
614
|
end
|
605
615
|
end
|
606
|
-
|
607
|
-
module_function :get_id
|
616
|
+
private :get_id
|
608
617
|
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
module_function :get_uid
|
618
|
+
def get_uid(user)
|
619
|
+
get_id(user, Process::UID)
|
620
|
+
end
|
613
621
|
|
614
|
-
|
615
|
-
|
622
|
+
def get_gid(group)
|
623
|
+
get_id(group, Process::GID)
|
624
|
+
end
|
616
625
|
end
|
617
|
-
|
626
|
+
|
627
|
+
include ServerSignal
|
618
628
|
|
619
629
|
DEFAULT = {
|
620
630
|
daemonize: true,
|
@@ -637,6 +647,12 @@ module Riser
|
|
637
647
|
signal_restart_forced: SIGNAL_RESTART_FORCED
|
638
648
|
}.freeze
|
639
649
|
|
650
|
+
# set the `status_file' parameter of the `start_daemon' method to
|
651
|
+
# call this method.
|
652
|
+
def self.running?(status_file_path)
|
653
|
+
StatusFile.locked? status_file_path
|
654
|
+
end
|
655
|
+
|
640
656
|
# should be executed on the main thread sharing the stack with
|
641
657
|
# signal(2) handlers
|
642
658
|
def start_daemon(config, &block) # :yields: socket_server
|
@@ -675,8 +691,8 @@ module Riser
|
|
675
691
|
sockaddr_get = proc{ c[:listen_address] }
|
676
692
|
end
|
677
693
|
|
678
|
-
euid = get_uid(c[:server_privileged_user])
|
679
|
-
egid = get_gid(c[:server_privileged_group])
|
694
|
+
euid = Daemon.get_uid(c[:server_privileged_user])
|
695
|
+
egid = Daemon.get_gid(c[:server_privileged_group])
|
680
696
|
|
681
697
|
root_process = RootProcess.new(logger, sockaddr_get, c[:server_polling_interval_seconds], c[:server_restart_overlap_seconds], euid, egid, &block)
|
682
698
|
[ [ :signal_stop_graceful, proc{ root_process.signal_stop_graceful } ],
|
@@ -694,7 +710,7 @@ module Riser
|
|
694
710
|
Signal.trap(:CHLD) { root_process.signal_server_down }
|
695
711
|
|
696
712
|
if (c[:daemonize]) then
|
697
|
-
Process.daemon(c[:daemon_nochdir]
|
713
|
+
Process.daemon(c[:daemon_nochdir])
|
698
714
|
end
|
699
715
|
|
700
716
|
# update after process ID changes in daemonization.
|
data/lib/riser/stream.rb
CHANGED
@@ -81,29 +81,29 @@ module Riser
|
|
81
81
|
|
82
82
|
def gets
|
83
83
|
line = super
|
84
|
-
@logger.info("r #{line.inspect}")
|
84
|
+
@logger.info("r #{line.inspect}") if @logger.info?
|
85
85
|
line
|
86
86
|
end
|
87
87
|
|
88
88
|
def read(size)
|
89
89
|
data = super
|
90
|
-
@logger.info("r #{data.inspect}")
|
90
|
+
@logger.info("r #{data.inspect}") if @logger.info?
|
91
91
|
data
|
92
92
|
end
|
93
93
|
|
94
94
|
def readpartial(maxlen, outbuf=nil)
|
95
95
|
data = super
|
96
|
-
@logger.info("r #{data.inspect}")
|
96
|
+
@logger.info("r #{data.inspect}") if @logger.info?
|
97
97
|
data
|
98
98
|
end
|
99
99
|
|
100
100
|
def write(message)
|
101
|
-
@logger.info("w #{message.inspect}")
|
101
|
+
@logger.info("w #{message.inspect}") if @logger.info?
|
102
102
|
super
|
103
103
|
end
|
104
104
|
|
105
105
|
def close
|
106
|
-
@logger.info('close')
|
106
|
+
@logger.info('close') if @logger.info?
|
107
107
|
super
|
108
108
|
end
|
109
109
|
end
|
data/lib/riser/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TOKI Yoshinori
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|