io_daemonizer 1 → 5

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