ro_daemon 0.0.4

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
+ SHA1:
3
+ metadata.gz: 664d505f80465c4138d376b6b975cdf3bc8ccd2d
4
+ data.tar.gz: 88bf4d5bffa691aa145e8c0cae2a0b58eb88cda2
5
+ SHA512:
6
+ metadata.gz: d92895f89bdc6786e6901fb9b3345909326271750cde3a9e26b7e5021f829cb0dd5a12794824657936736f27f620319ea27977cb9afb2dc2791080ef902f7ebe
7
+ data.tar.gz: e3c9729487cbb41e728eceea100be2a11b03c9d862c59d34ae1c4f447ca09722c10055a9b0112953cd737c1264e55668152aa0c0c49cbc0d76bf59f0e1962c5b
data/bin/ro_daemonize ADDED
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../../lib/ro_daemon/daemon', __FILE__)
2
+
3
+ RoDaemon::Daemon.st(*([:daemonize] + ARGV))
@@ -0,0 +1,95 @@
1
+ require File.expand_path('../../../conf/ro_daemon', __FILE__)
2
+
3
+ require 'ro_thor'
4
+ require 'sqlite3'
5
+ require_relative 'data'
6
+ require_relative 'helper'
7
+
8
+ module RoDaemon
9
+ class Daemon < RoThor
10
+ include Helper
11
+
12
+ usg :daemonize
13
+
14
+ def daemonize(cmd, *args, &blk)
15
+ logs = Dir["#{logs_dir}/*.log"]
16
+ ms_cnn_db
17
+
18
+ d = Data::Daemon.new(cmd: cmd)
19
+
20
+ stdout, stderr = d.stdout, d.stderr
21
+ pid = spawn_daemon(cmd, stdout, stderr)
22
+ fix_db_err do
23
+ d.save
24
+ end
25
+
26
+ pid
27
+ end
28
+
29
+ def spawn_daemon(cmd, stdout, stderr)
30
+ pid = spawn(cmd, out: stdout, err: stderr)
31
+ puts
32
+ puts "spawn pid:#{pid} cmd:#{cmd}\nstdout: #{stdout}\nstderr: #{stderr}"
33
+ puts
34
+ pid
35
+ end
36
+
37
+ def fix_db_err(*args, &blk)
38
+ begin
39
+ yield
40
+ rescue ActiveRecord::StatementInvalid => e
41
+ if e.to_s.match(%r{Could not find table})
42
+ Data::Mg.st
43
+ yield
44
+ else
45
+ raise e
46
+ end
47
+ end
48
+ end
49
+
50
+ def get_stdout_stderr(logs)
51
+ logs.select do |log|
52
+ Time.now - File.mtime(log) > 60.days and Data::Daemon.first(stdout: log).closed?
53
+ end.each do |f|
54
+ FileUtils.rm_f(f)
55
+ end
56
+
57
+ if Data::Daemon.count > 0
58
+ (1.. Data::Daemon.all.last.id)
59
+ end
60
+
61
+ unless test(?d, logs_dir)
62
+ FileUtils.mkdir(logs_dir)
63
+ end
64
+
65
+ stdout = File.open logs_dir("#{stdout_fn}.log"), 'w+'
66
+ stderr = File.open logs_dir("#{stdout_fn}_err.log"), "w+"
67
+ return stderr, stdout
68
+ end
69
+
70
+ def ms_cnn_db(*args, &blk)
71
+ @cnn ||= ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: db)
72
+ end
73
+
74
+ def db(*args, &blk)
75
+ _db = logs_dir('manager.sqlite')
76
+
77
+ if File.exist?(_db)
78
+ return _db
79
+ end
80
+
81
+ begin
82
+ sh "sqlite3 dbname.sqlite .dump"
83
+ rescue ShErr => e
84
+ if e.to_s.match(%r{command not found})
85
+ sh "sudo apt-get install sqlite3 -y"
86
+ sh "sqlite3 dbname.sqlite .dump"
87
+ else
88
+ raise e
89
+ end
90
+ end
91
+ _db
92
+ end
93
+
94
+ end
95
+ end
@@ -0,0 +1,48 @@
1
+ require 'active_record'
2
+ require_relative 'mg'
3
+ require 'ro_thor'
4
+ require 'ro_thor/sh'
5
+ require_relative 'helper'
6
+
7
+ module RoDaemon
8
+ module Data
9
+ class Daemon < ActiveRecord::Base
10
+
11
+ class << self
12
+ include RoDaemon::Helper
13
+ def new(*args, &blk)
14
+ r = super
15
+ r.stdout = logs_dir("#{r.id}.log")
16
+ r.stderr = logs_dir("#{r.id}_err.log")
17
+ r
18
+ end
19
+
20
+ def create(*args, &blk)
21
+ r = super
22
+ puts "create #{self}"
23
+ r
24
+ end
25
+ end
26
+ include RoThor::Sh
27
+
28
+ def closed?(*args, &blk)
29
+ begin
30
+ sh "ps --pid #{pid}"
31
+ true
32
+ rescue ShErr => e
33
+ if e.stdout.match(%r{PID TTY TIME CMD\n})
34
+ false
35
+ else
36
+ raise e
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ class Mg < RoDaemon::Mg
43
+ def up(*args, &blk)
44
+ ms_tab(:daemons, pid: :integer, cmd: :string, stdout: :string, stderr: :string)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,7 @@
1
+ module RoDaemon
2
+ module Helper
3
+ def logs_dir(*args, &blk)
4
+ File.join '/tmp/ro_daemonize/', *args, &blk
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,67 @@
1
+ require 'active_record'
2
+ require 'ro_thor'
3
+ module RoDaemon
4
+ class Mg < ::ActiveRecord::Migration
5
+ class << self
6
+ def st(*args, &blk)
7
+ if block_given?
8
+ kls = Class.new(self)
9
+ kls.class_eval &blk
10
+ kls.st
11
+ else
12
+ migrate(:up)
13
+ end
14
+ end
15
+ end
16
+
17
+ def mst(*args, &blk)
18
+ ms_tab(*args, &blk)
19
+ end
20
+
21
+ def ms_tab(tab, attr_name_types=nil, *args, &blk)
22
+ attr_name_types ||= {}
23
+ unless exist?(tab)
24
+ create :"#{tab}" do |t|
25
+ t.timestamps null: false
26
+ end
27
+ end
28
+
29
+ attr_name_types.each do |name, type|
30
+ unless exist_col?(tab, name)
31
+ add_col(tab, name, type)
32
+ end
33
+ end
34
+ end
35
+
36
+ def add_col(*args, &blk)
37
+ add_column(*args, &blk)
38
+ end
39
+
40
+ def change_col(*args, &blk)
41
+ change_column(*args, &blk)
42
+ end
43
+
44
+ def exist_col?(*args, &blk)
45
+ column_exists?(*args, &blk)
46
+ end
47
+
48
+ def rm_col(*args, &blk)
49
+ remove_column(*args, &blk)
50
+ end
51
+
52
+ def create(*args, &blk)
53
+ create_table(*args, &blk)
54
+ end
55
+
56
+ def exist?(*args, &blk)
57
+ table_exists?(*args, &blk)
58
+ end
59
+
60
+ def del(name, *args, &blk)
61
+ if exist?(name)
62
+ drop_table(name, *args, &blk)
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,12 @@
1
+ require 'rails_helper'
2
+
3
+ describe "RoDaemon::Daemon.new" do
4
+ let(:o) do
5
+ RoDaemon::Daemon.new
6
+ end
7
+
8
+ it :daemonize do
9
+ pid = o.daemonize RoDaemon.rt('spec/try.rb')
10
+ Sh.wait(pid)
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ require_relative 'spec_helper'
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'spork'
3
+
4
+
5
+ Spork.prefork do
6
+
7
+
8
+ require 'pj'
9
+ Pj.set_test
10
+
11
+ require 'ro_rspec_helpers_plus'
12
+
13
+ RoRspec.spec = __dir__
14
+
15
+ require File.expand_path("../../conf/ro_daemon", __FILE__)
16
+
17
+ module RoDaemon
18
+ extend PjHelper
19
+ autoload_all "ro_daemon"
20
+ end
21
+ end
data/spec/try.rb ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ puts "puts at #{Time.now}"
4
+ raise "raise at #{Time.now}"
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ro_daemon
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - ''
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ro_thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: ''
56
+ email:
57
+ - ''
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - bin/ro_daemonize
63
+ - lib/ro_daemon/daemon.rb
64
+ - lib/ro_daemon/data.rb
65
+ - lib/ro_daemon/helper.rb
66
+ - lib/ro_daemon/mg.rb
67
+ - spec/lib/ro_daemon/daemon_spec.rb
68
+ - spec/rails_helper.rb
69
+ - spec/spec_helper.rb
70
+ - spec/try.rb
71
+ homepage: ''
72
+ licenses: []
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.4.5
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: ''
94
+ test_files:
95
+ - spec/lib/ro_daemon/daemon_spec.rb
96
+ - spec/spec_helper.rb
97
+ - spec/rails_helper.rb
98
+ - spec/try.rb