ro_daemon 0.0.4

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