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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0b5efba40ee7b569c9ed5f5e85f523b6bff9c2fe575d90d975925bcc91db5099
4
- data.tar.gz: 612736390678ea1722e1626d20ad745221a3adfaa3a6461d69da701537ebcc65
3
+ metadata.gz: ef14df0b3e4899c0d573754bdc7071bd88ee89103d51d51d547a200bf9d305a5
4
+ data.tar.gz: f3784e9ec64b88fe4ca68a51ceeffba1af2ba1c4e6fa464a555a76da27c6c98f
5
5
  SHA512:
6
- metadata.gz: 690c6451ebbe725aecfdb21af32da37928ba56c238c72a4c7829624b0a606b7c4600a9a3184e4a6e79eaca6351b945af1f24336a7b504a2b12576dbbb1a8e377
7
- data.tar.gz: 3587661269e1a3eb634c2f5f53d0fb360d7688370165aa3df05d836343d12ee7cd07ce76d05730bca615f40f62fd9c04fa30547c206612b5476de55d294f56f5
6
+ metadata.gz: 190ba65ce5b250938ebd92ae5cebf8a96b2995a19221e8c8a39ad2024e18f7c24f1cb07570d2c2c60374363572c79083a2ca50d16fb503581192c1b0ee142142
7
+ data.tar.gz: 97f9c5de7034224540e9c4e118e45a6d99179a143d2cd2ce375f0e4cf53a8c0a641b5ec1a43667da71ad75709a16395059ff69019c8a86f971862f941dbe1ace
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ Rake::RDocTask.new do |rd|
17
17
  rd.rdoc_files.include('lib/**/*.rb')
18
18
  end
19
19
 
20
- desc 'Build README.html from markdown source.'
20
+ desc 'Build README.html from markdown source'
21
21
  task :readme => %w[ README.html ]
22
22
 
23
23
  file 'README.html' => [ 'README.md' ] do
@@ -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'
@@ -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 RootProcess
38
- class SystemOperation
39
- def initialize(logger, module_FileUtils: FileUtils, module_Process: Process, class_IO: IO, class_File: File)
40
- @logger = logger
41
- @FileUtils = module_FileUtils
42
- @Process = module_Process
43
- @IO = class_IO
44
- @File = class_File
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
- begin
57
- server_address = SocketAddress.parse(address_config)
58
- rescue
59
- @logger.error("failed to parse server address: #{address_config.inspect} [#{$!} (#{$!.class})]")
60
- @logger.debug($!) if @logger.debug?
61
- return
62
- end
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
- server_address
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
- def get_server_socket(server_address)
68
- begin
69
- server_address.open_server
70
- rescue
71
- @logger.error("failed to open server socket: #{server_address} [#{$!} (#{$!.class})]")
72
- @logger.debug($!) if @logger.debug?
73
- nil
74
- end
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
- def get_sockaddr(server_socket)
78
- begin
79
- server_socket.local_address.inspect_sockaddr
80
- rescue
81
- @logger.error("failed to get socket address: #{server_socket} [#{$!} (#{$!.class})]")
82
- @logger.debug($!) if @logger.debug?
83
- nil
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
- def listen(server_socket, backlog)
88
- begin
89
- server_socket.listen(backlog)
90
- rescue
91
- @logger.error("failed to listen(2) server socket with backlog: #{backlog} [#{$!} (#{$!.class})]")
92
- @logger.debug($!) if @logger.debug?
93
- nil
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
- def chmod(mode, path)
98
- begin
99
- @FileUtils.chmod(mode, path)
100
- rescue
101
- @logger.error("failed to chmod(2): #{'%04o' % mode} #{path} [#{$!} (#{$!.class})]")
102
- @logger.debug($!) if @logger.debug?
103
- nil
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
- def chown(owner, group, path)
108
- begin
109
- @FileUtils.chown(owner, group, path)
110
- rescue
111
- @logger.error("failed to chown(2): <#{owner}> <#{group}> <#{path}> [#{$!} (#{$!.class})]")
112
- @logger.debug($!) if @logger.debug?
113
- nil
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
- def send_signal(pid, signal)
118
- begin
119
- @Process.kill(signal, pid)
120
- rescue
121
- @logger.error("failed to send signal (#{signal}) to process (pid: #{pid}) [#{$!} (#{$!.class})]")
122
- @logger.debug($!) if @logger.debug?
123
- nil
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
- def wait(pid, flags=0)
128
- begin
129
- @Process.wait(pid, flags)
130
- rescue
131
- @logger.error("failed to wait(2) for process (pid: #{pid}) [#{$!} (#{$!.class})]")
132
- @logger.debug($!) if @logger.debug?
133
- nil
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
- def pipe
138
- begin
139
- @IO.pipe
140
- rescue
141
- @logger.error("failed to pipe(2) [#{$!} (#{$!.class})]")
142
- @logger.debug($!) if @logger.debug?
143
- nil
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
- def fork
148
- begin
149
- @Process.fork{ yield }
150
- rescue
151
- @logger.error("failed to fork(2) [#{$!} (#{$!.class})]")
152
- @logger.debug($!) if @logger.debug?
153
- nil
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
- def gets(io)
158
- begin
159
- io.gets
160
- rescue
161
- @logger.error("failed to get line from #{io.inspect} [#{$!} (#{$!.class})]")
162
- @logger.debug($!) if @logger.debug?
163
- nil
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
- def close(io)
168
- begin
169
- io.close
170
- io
171
- rescue
172
- @logger.error("failed to close(2) #{io.inspect} [#{$!} (#{$!.class})]")
173
- @logger.debug($!) if @logger.debug?
174
- nil
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
- def unlink(path)
179
- begin
180
- File.unlink(path)
181
- rescue
182
- @logger.error("failed to unlink(2): #{path} [#{$!} (#{$!.class})]")
183
- @logger.debug($!) if @logger.debug?
184
- nil
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
- include ServerSignal
594
-
595
- def get_id(name, id_mod) # :nodoc:
596
- if (name) then
597
- case (name)
598
- when Integer
599
- name
600
- when /\A \d+ \z/x
601
- name.to_i
602
- else
603
- id_mod.from_name(name)
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
- end
607
- module_function :get_id
616
+ private :get_id
608
617
 
609
- def get_uid(user)
610
- get_id(user, Process::UID)
611
- end
612
- module_function :get_uid
618
+ def get_uid(user)
619
+ get_id(user, Process::UID)
620
+ end
613
621
 
614
- def get_gid(group)
615
- get_id(group, Process::GID)
622
+ def get_gid(group)
623
+ get_id(group, Process::GID)
624
+ end
616
625
  end
617
- module_function :get_gid
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], true)
713
+ Process.daemon(c[:daemon_nochdir])
698
714
  end
699
715
 
700
716
  # update after process ID changes in daemonization.
@@ -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
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module Riser
4
- VERSION = '0.1.6'.freeze
4
+ VERSION = '0.1.7'.freeze
5
5
  end
6
6
 
7
7
  # Local Variables:
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.6
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-03-17 00:00:00.000000000 Z
11
+ date: 2019-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler