io_daemonizer 1 → 5

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/io_daemonizer.rb +37 -24
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05df686f5b42a98c8dbacff27b10217d676674fa330598ba54cc22faf039b63a
4
- data.tar.gz: 4d85aa2e8ddc312820d2814d772cd1c5ffc5c06b5adf8a8cd9a813ba0d4988de
3
+ metadata.gz: 80b48adc5074a3057dd995bd6111fffcaecaf14436d94aa781c822eef10fd95b
4
+ data.tar.gz: 1f816e2e331f8132844a4fcc1a8da7731d4d08d70165f89ac34c3f985a969466
5
5
  SHA512:
6
- metadata.gz: 867eb556dc205e46c1af6c1e6efaa479ae6f98e6a67d280d8cbda40b20ccb775aabe56d00b9ed30a4890acaf02d739563ee12812f5beadfe27e98cebc00dbb87
7
- data.tar.gz: aae1d0c1d888ed618811f9711f70a4481f2f755d636136735860e3b5cb582fd2302b49a5b9eb848760d62521f23a06cc7970686e2cd5a3af3b9c95fccb01a516
6
+ metadata.gz: f531743fc395f854ed431ee7e2f283a206995df75367fe5fe871d8d7d1e238a482b0baf0ea132c8b384055377169870122e443c2840f51b2da092d25c2472dd2
7
+ data.tar.gz: fe64289f1d5b86e12f52c157e46cb1d8e5d93ac9f95be18aa46e51f34a81f4a42f77a7ca0d193dc22fca2b0636f4f10349e342a97e6f3c0dd36d783ac1f2ee7b
data/io_daemonizer.rb CHANGED
@@ -1,51 +1,61 @@
1
- # io_daemonizer v.1 https://github.com/joeyschoblaska/io_daemonizer
1
+ # io_daemonizer v.5 https://github.com/joeyschoblaska/io_daemonizer
2
2
 
3
3
  require "shellwords"
4
4
  require "socket"
5
+ require "stringio"
5
6
 
6
7
  class IODaemonizer
7
- PORT = ENV["IO_DAEMONIZER_PORT"] || 5289
8
-
9
- def self.wrap(setup: -> {}, run: -> {})
8
+ def self.wrap(port:, setup:, run:, autostart: true)
10
9
  case ARGV[0]
11
10
  when "start"
12
- puts "starting server... "
13
- Daemon.run(setup: setup, run: run)
11
+ puts "starting server..."
12
+ Daemon.run(port: port, setup: setup, run: run)
14
13
  when "stop"
15
- puts "stopping server... "
16
- send_request(ARGV)
14
+ puts "stopping server..."
15
+ send_request(port: port, args: ARGV)
17
16
  else
18
- send_request(ARGV)
17
+ begin
18
+ send_request(port: port, args: ARGV)
19
+ rescue Errno::ECONNREFUSED => e
20
+ raise(e) unless autostart
21
+ daemon = Daemon.new(port: port, setup: setup, run: run)
22
+ daemon.setup
23
+ fork { daemon.start }
24
+ sleep 0.1
25
+ send_request(port: port, args: ARGV)
26
+ end
19
27
  end
20
28
  rescue Errno::ECONNREFUSED
21
29
  puts "server not running or not responding"
22
30
  end
23
31
 
24
- def self.send_request(args)
25
- TCPSocket.open("127.0.0.1", PORT) do |socket|
26
- socket.write args.shelljoin
32
+ def self.send_request(port:, args:)
33
+ TCPSocket.open("127.0.0.1", port) do |socket|
34
+ socket.puts args.shelljoin
35
+ socket.write $stdin.tty? ? "" : $stdin.read
27
36
  socket.close_write
28
37
  STDOUT.write(socket.read(4096)) until socket.eof?
29
38
  end
30
39
  end
31
40
 
32
- def self.redirect(stdout: $stdout, stderr: $stderr)
33
- old_stdout, old_stderr = $stdout.dup, $stderr.dup
34
- $stdout, $stderr = stdout, stderr
41
+ def self.redirect(stdin: $stdin, stdout: $stdout, stderr: $stderr)
42
+ oldin, oldout, olderr = $stdin.dup, $stdout.dup, $stderr.dup
43
+ $stdin, $stdout, $stderr = stdin, stdout, stderr
35
44
 
36
45
  yield
37
46
  ensure
38
- $stdout, $stderr = old_stdout, old_stderr
47
+ $stdin, $stdout, $stderr = oldin, oldout, olderr
39
48
  end
40
49
 
41
50
  class Daemon
42
- def self.run(setup: -> {}, run: -> {})
43
- daemon = new(setup: setup, run: run)
51
+ def self.run(port:, setup:, run:)
52
+ daemon = new(port: port, setup: setup, run: run)
44
53
  daemon.setup
45
54
  daemon.start
46
55
  end
47
56
 
48
- def initialize(setup: -> {}, run: -> {})
57
+ def initialize(port:, setup:, run:)
58
+ @port = port
49
59
  @setup = setup
50
60
  @run = run
51
61
  @context = Object.new
@@ -56,7 +66,7 @@ class IODaemonizer
56
66
  end
57
67
 
58
68
  def start
59
- @server = TCPServer.open("127.0.0.1", PORT)
69
+ @server = TCPServer.open("127.0.0.1", @port)
60
70
  Process.daemon(true)
61
71
  read_socket(@server.accept) until @server.closed?
62
72
  end
@@ -64,14 +74,17 @@ class IODaemonizer
64
74
  private
65
75
 
66
76
  def read_socket(socket)
67
- args = socket.read.shellsplit
77
+ raw_args, *body = socket.read.lines
78
+ args = raw_args.shellsplit
68
79
 
69
80
  if args[0] == "stop"
70
81
  @server.close
71
82
  else
72
- IODaemonizer.redirect(stdout: socket, stderr: socket) do
73
- @context.instance_exec args, &@run
74
- end
83
+ IODaemonizer.redirect(
84
+ stdin: StringIO.new(body.join),
85
+ stdout: socket,
86
+ stderr: socket
87
+ ) { @context.instance_exec args, &@run }
75
88
  end
76
89
  rescue => e
77
90
  socket.write e.inspect
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io_daemonizer
3
3
  version: !ruby/object:Gem::Version
4
- version: '1'
4
+ version: '5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joey Schoblaska
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-05 00:00:00.000000000 Z
11
+ date: 2022-09-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Wrap a Ruby script that speaks IO in a daemon so that you only pay the
14
14
  startup overhead once.