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 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