riser 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|