io_daemonizer 1

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 +7 -0
  2. data/io_daemonizer.rb +82 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 05df686f5b42a98c8dbacff27b10217d676674fa330598ba54cc22faf039b63a
4
+ data.tar.gz: 4d85aa2e8ddc312820d2814d772cd1c5ffc5c06b5adf8a8cd9a813ba0d4988de
5
+ SHA512:
6
+ metadata.gz: 867eb556dc205e46c1af6c1e6efaa479ae6f98e6a67d280d8cbda40b20ccb775aabe56d00b9ed30a4890acaf02d739563ee12812f5beadfe27e98cebc00dbb87
7
+ data.tar.gz: aae1d0c1d888ed618811f9711f70a4481f2f755d636136735860e3b5cb582fd2302b49a5b9eb848760d62521f23a06cc7970686e2cd5a3af3b9c95fccb01a516
data/io_daemonizer.rb ADDED
@@ -0,0 +1,82 @@
1
+ # io_daemonizer v.1 https://github.com/joeyschoblaska/io_daemonizer
2
+
3
+ require "shellwords"
4
+ require "socket"
5
+
6
+ class IODaemonizer
7
+ PORT = ENV["IO_DAEMONIZER_PORT"] || 5289
8
+
9
+ def self.wrap(setup: -> {}, run: -> {})
10
+ case ARGV[0]
11
+ when "start"
12
+ puts "starting server... "
13
+ Daemon.run(setup: setup, run: run)
14
+ when "stop"
15
+ puts "stopping server... "
16
+ send_request(ARGV)
17
+ else
18
+ send_request(ARGV)
19
+ end
20
+ rescue Errno::ECONNREFUSED
21
+ puts "server not running or not responding"
22
+ end
23
+
24
+ def self.send_request(args)
25
+ TCPSocket.open("127.0.0.1", PORT) do |socket|
26
+ socket.write args.shelljoin
27
+ socket.close_write
28
+ STDOUT.write(socket.read(4096)) until socket.eof?
29
+ end
30
+ end
31
+
32
+ def self.redirect(stdout: $stdout, stderr: $stderr)
33
+ old_stdout, old_stderr = $stdout.dup, $stderr.dup
34
+ $stdout, $stderr = stdout, stderr
35
+
36
+ yield
37
+ ensure
38
+ $stdout, $stderr = old_stdout, old_stderr
39
+ end
40
+
41
+ class Daemon
42
+ def self.run(setup: -> {}, run: -> {})
43
+ daemon = new(setup: setup, run: run)
44
+ daemon.setup
45
+ daemon.start
46
+ end
47
+
48
+ def initialize(setup: -> {}, run: -> {})
49
+ @setup = setup
50
+ @run = run
51
+ @context = Object.new
52
+ end
53
+
54
+ def setup
55
+ @context.instance_exec &@setup
56
+ end
57
+
58
+ def start
59
+ @server = TCPServer.open("127.0.0.1", PORT)
60
+ Process.daemon(true)
61
+ read_socket(@server.accept) until @server.closed?
62
+ end
63
+
64
+ private
65
+
66
+ def read_socket(socket)
67
+ args = socket.read.shellsplit
68
+
69
+ if args[0] == "stop"
70
+ @server.close
71
+ else
72
+ IODaemonizer.redirect(stdout: socket, stderr: socket) do
73
+ @context.instance_exec args, &@run
74
+ end
75
+ end
76
+ rescue => e
77
+ socket.write e.inspect
78
+ ensure
79
+ socket.close
80
+ end
81
+ end
82
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: io_daemonizer
3
+ version: !ruby/object:Gem::Version
4
+ version: '1'
5
+ platform: ruby
6
+ authors:
7
+ - Joey Schoblaska
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-09-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Wrap a Ruby script that speaks IO in a daemon so that you only pay the
14
+ startup overhead once.
15
+ email: joey.schoblaska@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - io_daemonizer.rb
21
+ homepage: https://github.com/joeyschoblaska/io_daemonizer
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.2.3
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: IO Daemonizer
44
+ test_files: []