edaemon 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 68ec3821de78d554f5253e3691d4d2720336d8fb1a7431e07c0670995d2c7f20
4
+ data.tar.gz: 6e3dd6798afe1b014cf7e3ff7d0a5a705c897f13a568b5f23184161e0bfd455b
5
+ SHA512:
6
+ metadata.gz: 454a6e6088ad5131bd8a471bc742f44dc8ed7e277bf9fa15ae7db795a17f1ed76df3b23f33df90dbaf63c14b53c92a4ba9b7c112373d919d6e7afca9ecda57a6
7
+ data.tar.gz: acea99ffdeae163a610ef89fdbed3c228c0842ef109f7be48f5739a1c09d8897592256bf200e7cffb5b9d1a95b63a9b20aeac6cce7908c85994a769ecaecf5f8
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Edaemon::Helper::Process
4
+ class << self
5
+ # :nocov:
6
+ def list
7
+ `ps ax`.split("\n")
8
+ end
9
+ # :nocov:
10
+
11
+ def pids
12
+ list.map { |row| row.scan(/\A {0,}([0-9]{1,})/) }
13
+ .flatten
14
+ .compact
15
+ .uniq
16
+ .map(&:to_i)
17
+ .sort
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Edaemon::Helper
4
+ require_relative 'helper/process'
5
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Edaemon::Server
4
+ PID_FILE_PATH = './edaemon.pid'
5
+ LOG_FILE_PATH = './edaemon.log'
6
+
7
+ Error = Class.new(StandardError)
8
+ ApplicationAllreadyRunnedError = Class.new(Error)
9
+
10
+ def initialize(block:)
11
+ @block = block
12
+ end
13
+
14
+ # TODO: Конфиг лога
15
+ # TODO: Конфиг пид файла
16
+ def start
17
+ # TODO: simplecov raise почему не подсвечивается
18
+ raise ApplicationAllreadyRunnedError if pid_runned?(pid: saved_pid)
19
+
20
+ pid = fork_block!
21
+ save_pid!(pid: pid)
22
+ pid
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :block
28
+
29
+ def saved_pid
30
+ return unless File.exist?(PID_FILE_PATH)
31
+
32
+ File.open(PID_FILE_PATH).read.to_i
33
+ end
34
+
35
+ def pid_runned?(pid:)
36
+ Edaemon::Helper::Process.pids.include?(pid)
37
+ end
38
+
39
+ def fork_block!
40
+ # TODO: Переделать не на call из блока а на простой вызов переданного метода
41
+ Kernel.fork do
42
+ STDOUT.reopen(File.open(LOG_FILE_PATH, 'a'))
43
+ STDOUT.sync = true
44
+ block.call
45
+ end
46
+ end
47
+
48
+ def save_pid!(pid:)
49
+ File.open(PID_FILE_PATH, 'w') { |f| f.write("#{pid}\n") }
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Edaemon
4
+ VERSION = '0.1'
5
+ end
data/lib/edaemon.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler'
4
+ Bundler.require
5
+
6
+ module Edaemon
7
+ require_relative 'edaemon/helper'
8
+ require_relative 'edaemon/server'
9
+ require_relative 'edaemon/version'
10
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: edaemon
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Vladimir Bardokin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ - mecha@twodev.ru
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/edaemon.rb
21
+ - lib/edaemon/helper.rb
22
+ - lib/edaemon/helper/process.rb
23
+ - lib/edaemon/server.rb
24
+ - lib/edaemon/version.rb
25
+ homepage: https://github.com/Mecha23/edaemon
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: 2.7.1
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubygems_version: 3.1.2
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Easily run script on daemon
48
+ test_files: []