kryten 0.1.0 → 0.2.0
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 +4 -4
- data/README.md +9 -14
- data/bin/console +12 -3
- data/bin/kryten +24 -0
- data/kryten.gemspec +1 -0
- data/lib/kryten/lawger.rb +11 -2
- data/lib/kryten/runner.rb +36 -15
- data/lib/kryten/summoner.rb +118 -4
- data/lib/kryten/version.rb +1 -1
- data/lib/kryten/weaver.rb +56 -0
- data/lib/kryten.rb +13 -8
- metadata +18 -3
- data/lib/reddwarf.rb +0 -115
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9f5b08989dcf2d7dbe11eda53457a0fccef4cc5
|
4
|
+
data.tar.gz: 8ea02ee22eb5de93bb27154c96b29486735ca2d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b92828d495df7fe6e490c90ab96eeadc8f97f50215413ff159965e0f1b6b6256c9623cb1e4439110d888e83fb79195942f0795a8932b1b54b6feec6cbbfde099
|
7
|
+
data.tar.gz: 4f8316267b0dcd2671f6d0b21dc4b00a4ef94eb5127a268027cf5174dbe02fa237ea2c30d0c74a0afc66ec47c63594607cb306c22013d0d9aa17b1f778f50ce2
|
data/README.md
CHANGED
@@ -23,11 +23,12 @@ Or install it yourself as:
|
|
23
23
|
```ruby
|
24
24
|
|
25
25
|
require 'kryten'
|
26
|
+
include Kryten
|
26
27
|
|
27
28
|
# define work to be done in a class with a run method
|
28
29
|
|
29
30
|
class Work
|
30
|
-
include
|
31
|
+
include ThreadedTask
|
31
32
|
|
32
33
|
def run
|
33
34
|
log "working..."
|
@@ -35,25 +36,19 @@ Or install it yourself as:
|
|
35
36
|
|
36
37
|
end
|
37
38
|
|
38
|
-
# The worker can run on it's own
|
39
|
+
# The worker can run on it's own and responds to the interrupt signal.
|
39
40
|
Work.new.start # loop run method in foreground
|
40
|
-
Work.new.
|
41
|
+
Work.new.start_worker # loop run method in a thread
|
41
42
|
|
42
|
-
#
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
RedDwarf.power_down
|
43
|
+
# Two or more workers can be managed by the Supervisor
|
44
|
+
tasks = []
|
45
|
+
tasks << FirstTask.new
|
46
|
+
tasks << SecondTask.new
|
47
|
+
Supervisor.start(tasks)
|
48
48
|
|
49
49
|
|
50
50
|
```
|
51
51
|
|
52
|
-
## Development
|
53
|
-
|
54
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
55
|
-
|
56
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
57
52
|
|
58
53
|
## Contributing
|
59
54
|
|
data/bin/console
CHANGED
@@ -2,7 +2,16 @@
|
|
2
2
|
|
3
3
|
require "bundler/setup"
|
4
4
|
require "kryten"
|
5
|
-
require "reddwarf"
|
6
|
-
|
7
5
|
require "pry"
|
8
|
-
|
6
|
+
|
7
|
+
include Kryten
|
8
|
+
|
9
|
+
class Work
|
10
|
+
include ThreadedTask
|
11
|
+
end
|
12
|
+
|
13
|
+
w1 = Work.new('work1')
|
14
|
+
w2 = Work.new('work2')
|
15
|
+
w3 = Work.new('work3')
|
16
|
+
|
17
|
+
binding.pry
|
data/bin/kryten
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "kryten"
|
5
|
+
require "pry"
|
6
|
+
|
7
|
+
include Kryten
|
8
|
+
|
9
|
+
class Work
|
10
|
+
include ThreadedTask
|
11
|
+
end
|
12
|
+
|
13
|
+
workers = []
|
14
|
+
workers << Work.new('work1')
|
15
|
+
workers << Work.new('work2')
|
16
|
+
w3 = Work.new('work3').workers do
|
17
|
+
[Work.new('work3sub1'),
|
18
|
+
Work.new('work3sub2')]
|
19
|
+
end
|
20
|
+
workers << w3
|
21
|
+
|
22
|
+
Supervisor.start(workers)
|
23
|
+
|
24
|
+
sleep 10
|
data/kryten.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
24
|
spec.add_development_dependency "minitest"
|
25
25
|
spec.add_development_dependency "pry"
|
26
|
+
spec.add_development_dependency "awesome_print"
|
26
27
|
|
27
28
|
spec.add_dependency "daemons", "~> 1.2.0"
|
28
29
|
spec.add_dependency "logger"
|
data/lib/kryten/lawger.rb
CHANGED
@@ -1,14 +1,23 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
3
|
module Kryten::Lawger
|
4
|
+
attr_accessor :logger
|
4
5
|
|
5
6
|
def log_path
|
6
|
-
"
|
7
|
+
"log/#{name}.log"
|
7
8
|
end
|
8
9
|
|
9
10
|
def log message
|
11
|
+
default_log_format
|
12
|
+
logger.debug(name) { message }
|
13
|
+
end
|
14
|
+
|
15
|
+
def logger
|
10
16
|
@logger ||= Logger.new(log_path)
|
11
|
-
|
17
|
+
end
|
18
|
+
|
19
|
+
def default_log_format
|
20
|
+
nil
|
12
21
|
end
|
13
22
|
|
14
23
|
end
|
data/lib/kryten/runner.rb
CHANGED
@@ -1,48 +1,69 @@
|
|
1
1
|
module Kryten::Runner
|
2
|
+
attr_accessor :timer
|
3
|
+
attr_reader :running, :started
|
4
|
+
|
5
|
+
def initialize title=nil
|
6
|
+
@name, @running, @started = title, false, false
|
7
|
+
log "initializing"
|
8
|
+
Signal.trap("INT", proc { stop_running })
|
9
|
+
end
|
2
10
|
|
3
11
|
def start
|
4
|
-
log "starting #{name}"
|
5
12
|
setup
|
13
|
+
log "starting"
|
14
|
+
@started = true
|
6
15
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
while @running do
|
12
|
-
sleep @timer || 4
|
16
|
+
while started do
|
17
|
+
sleep timer
|
18
|
+
@running = true
|
13
19
|
run
|
20
|
+
@running = false
|
14
21
|
end
|
15
22
|
|
16
|
-
log "stopped
|
23
|
+
log "stopped"
|
24
|
+
true
|
17
25
|
rescue => e
|
18
26
|
log "error #{e}"
|
19
27
|
#raise
|
20
28
|
end
|
21
29
|
|
22
30
|
def run
|
23
|
-
log "running
|
31
|
+
log "running"
|
32
|
+
end
|
33
|
+
|
34
|
+
def timer
|
35
|
+
@timer || 4
|
24
36
|
end
|
25
37
|
|
26
38
|
def stop_running
|
27
|
-
|
28
|
-
@running = false
|
39
|
+
@started = false
|
29
40
|
end
|
30
41
|
|
31
42
|
def setup
|
32
|
-
log "setting up
|
43
|
+
log "setting up"
|
33
44
|
end
|
34
45
|
|
35
46
|
def debug
|
36
|
-
log "debugging
|
47
|
+
log "debugging"
|
37
48
|
setup
|
38
49
|
2.times do
|
39
50
|
run
|
40
|
-
sleep
|
51
|
+
sleep timer
|
41
52
|
end
|
42
53
|
end
|
43
54
|
|
44
55
|
def log message
|
45
|
-
puts message
|
56
|
+
puts [name, message].join(': ')
|
57
|
+
end
|
58
|
+
|
59
|
+
def name
|
60
|
+
@name || self.class.to_s.gsub('::','-').downcase
|
61
|
+
end
|
62
|
+
|
63
|
+
def status
|
64
|
+
log [started ? 'on and ' : 'off and ',
|
65
|
+
running ? 'running' : 'sleeping'].join
|
66
|
+
started
|
46
67
|
end
|
47
68
|
|
48
69
|
end
|
data/lib/kryten/summoner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# WARNING: Legacy Code
|
2
|
+
|
1
3
|
require 'daemons'
|
2
4
|
|
3
5
|
module Daemons
|
@@ -19,10 +21,6 @@ end
|
|
19
21
|
|
20
22
|
module Kryten::Summoner
|
21
23
|
|
22
|
-
def name
|
23
|
-
self.class.to_s.gsub('::','_').downcase
|
24
|
-
end
|
25
|
-
|
26
24
|
def init_daemon
|
27
25
|
options = {
|
28
26
|
log_output: false,
|
@@ -61,3 +59,119 @@ module Kryten::Summoner
|
|
61
59
|
end
|
62
60
|
|
63
61
|
end
|
62
|
+
|
63
|
+
module Kryten::RedDwarf
|
64
|
+
|
65
|
+
def self.start
|
66
|
+
|
67
|
+
unless self.daemons.empty?
|
68
|
+
puts "BackgroundFactory is already running"
|
69
|
+
return
|
70
|
+
end
|
71
|
+
|
72
|
+
raise "No Block Given" unless block_given?
|
73
|
+
|
74
|
+
puts "starting all daemons"
|
75
|
+
@@daemons = []
|
76
|
+
@@daemons << yield
|
77
|
+
@@daemons = @@daemons.flatten
|
78
|
+
@@daemons.each { |d| d.init_daemon }
|
79
|
+
|
80
|
+
self.can_shutdown = true
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.daemons
|
85
|
+
(@@daemons ||= [])
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.daemon name
|
89
|
+
self.daemons.detect { |d| d.name == name }
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.alive
|
93
|
+
self.daemons.select(&:pid)
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.dead
|
97
|
+
self.daemons - self.alive
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.monitor
|
101
|
+
self.start unless self.running?
|
102
|
+
self.status
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.status
|
106
|
+
status = proc do |job|
|
107
|
+
{
|
108
|
+
name: job.daemon.pid.progname,
|
109
|
+
pid: job.daemon.pid,
|
110
|
+
pid_dir: job.daemon.pidfile_dir,
|
111
|
+
logfile: job.daemon.logfile,
|
112
|
+
output: job.daemon.output_logfile,
|
113
|
+
status: job.status,
|
114
|
+
object: job
|
115
|
+
}
|
116
|
+
end
|
117
|
+
alive = self.alive.map(&status)
|
118
|
+
dead = self.dead.map(&status)
|
119
|
+
#puts "#{alive.count} running daemons"
|
120
|
+
#puts "#{dead.count} dead daemons"
|
121
|
+
{ alive: alive, dead: dead }
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.run job
|
125
|
+
self.can_shutdown = false
|
126
|
+
daemon = self.daemon job
|
127
|
+
if daemon.pid
|
128
|
+
puts "daemon #{daemon} is still running"
|
129
|
+
else
|
130
|
+
daemon.start_daemon
|
131
|
+
end
|
132
|
+
self.can_shutdown = true
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.halt job
|
136
|
+
daemon = self.daemon job
|
137
|
+
if daemon.pid
|
138
|
+
daemon.stop
|
139
|
+
else
|
140
|
+
puts "daemon #{daemon} was not running"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.can_shutdown= bool
|
145
|
+
@sd = bool
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.can_shutdown
|
149
|
+
@sd
|
150
|
+
end
|
151
|
+
|
152
|
+
def self.stop
|
153
|
+
|
154
|
+
return unless self.can_shutdown
|
155
|
+
|
156
|
+
if self.running?
|
157
|
+
puts "stopping all daemons"
|
158
|
+
@@daemons.count.times do
|
159
|
+
daemon = @@daemons.pop
|
160
|
+
if daemon.pid
|
161
|
+
pid = Process.fork { daemon.stop }
|
162
|
+
Process.detach(pid)
|
163
|
+
else
|
164
|
+
puts "daemon #{daemon} was not running"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
else
|
168
|
+
puts "BackgroundFactory has not been started yet"
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.running?
|
174
|
+
!self.daemons.empty?
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
data/lib/kryten/version.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
module Kryten::Weaver
|
2
|
+
attr_reader :worker
|
3
|
+
attr_accessor :workers
|
4
|
+
|
5
|
+
def start_work
|
6
|
+
workers.each(&:start_work) if workers
|
7
|
+
|
8
|
+
if worker && worker.alive?
|
9
|
+
log 'worker already running'
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
@worker = Thread.new { start }
|
13
|
+
end
|
14
|
+
|
15
|
+
def stop_work
|
16
|
+
workers.each(&:stop_work) if workers
|
17
|
+
stop_running
|
18
|
+
end
|
19
|
+
|
20
|
+
def workers
|
21
|
+
if block_given?
|
22
|
+
@workers = Array(yield)
|
23
|
+
return self
|
24
|
+
end
|
25
|
+
@workers
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
class Kryten::Supervisor
|
31
|
+
def self.start(workers)
|
32
|
+
start_workers(workers)
|
33
|
+
sleep 1 while @started
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.start_workers(workers)
|
37
|
+
@workers = workers
|
38
|
+
@started = true
|
39
|
+
Signal.trap("INT", proc { self.stop })
|
40
|
+
workers.each(&:start_work)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.stop
|
44
|
+
if @started
|
45
|
+
@workers.each(&:stop_work)
|
46
|
+
sleep 1 while self.running?
|
47
|
+
@started = false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.running?
|
52
|
+
@workers.detect(&:running)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
data/lib/kryten.rb
CHANGED
@@ -1,18 +1,23 @@
|
|
1
1
|
require "kryten/version"
|
2
2
|
require "kryten/summoner"
|
3
|
+
require "kryten/weaver"
|
3
4
|
require "kryten/lawger"
|
4
5
|
require "kryten/runner"
|
5
6
|
require "kryten/helper"
|
6
7
|
require "kryten/environment"
|
7
8
|
|
8
|
-
module Kryten
|
9
|
-
include
|
10
|
-
include Runner
|
11
|
-
include Lawger
|
12
|
-
include Helper
|
13
|
-
end
|
14
|
-
|
15
|
-
module Kryten::Worker
|
9
|
+
module Kryten::Task
|
10
|
+
include Kryten::Runner
|
16
11
|
include Kryten::Lawger
|
17
12
|
include Kryten::Helper
|
18
13
|
end
|
14
|
+
|
15
|
+
module Kryten::DaemonTask
|
16
|
+
include Kryten::Task
|
17
|
+
include Kryten::Summoner
|
18
|
+
end
|
19
|
+
|
20
|
+
module Kryten::ThreadedTask
|
21
|
+
include Kryten::Task
|
22
|
+
include Kryten::Weaver
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kryten
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zsolt Fekete
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: awesome_print
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: daemons
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,7 @@ files:
|
|
108
122
|
- README.md
|
109
123
|
- Rakefile
|
110
124
|
- bin/console
|
125
|
+
- bin/kryten
|
111
126
|
- bin/setup
|
112
127
|
- kryten.gemspec
|
113
128
|
- lib/kryten.rb
|
@@ -117,7 +132,7 @@ files:
|
|
117
132
|
- lib/kryten/runner.rb
|
118
133
|
- lib/kryten/summoner.rb
|
119
134
|
- lib/kryten/version.rb
|
120
|
-
- lib/
|
135
|
+
- lib/kryten/weaver.rb
|
121
136
|
homepage: https://github.com/zsoltf/kryten
|
122
137
|
licenses:
|
123
138
|
- MIT
|
data/lib/reddwarf.rb
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
module RedDwarf
|
2
|
-
|
3
|
-
def self.power_up
|
4
|
-
|
5
|
-
unless self.daemons.empty?
|
6
|
-
puts "RedDwarf is already running"
|
7
|
-
return
|
8
|
-
end
|
9
|
-
|
10
|
-
raise "No Block Given" unless block_given?
|
11
|
-
|
12
|
-
puts "starting all daemons"
|
13
|
-
@@daemons = []
|
14
|
-
@@daemons << yield
|
15
|
-
@@daemons = @@daemons.flatten
|
16
|
-
@@daemons.each { |d| d.init_daemon }
|
17
|
-
|
18
|
-
self.can_shutdown = true
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.daemons
|
23
|
-
(@@daemons ||= [])
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.daemon name
|
27
|
-
self.daemons.detect { |d| d.name == name }
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.alive
|
31
|
-
self.daemons.select(&:pid)
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.dead
|
35
|
-
self.daemons - self.alive
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.monitor
|
39
|
-
self.power_up unless self.running?
|
40
|
-
self.status
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.status
|
44
|
-
status = proc do |replicant|
|
45
|
-
{
|
46
|
-
name: replicant.daemon.pid.progname,
|
47
|
-
pid: replicant.daemon.pid,
|
48
|
-
pid_dir: replicant.daemon.pidfile_dir,
|
49
|
-
logfile: replicant.daemon.logfile,
|
50
|
-
output: replicant.daemon.output_logfile,
|
51
|
-
status: replicant.status,
|
52
|
-
object: replicant
|
53
|
-
}
|
54
|
-
end
|
55
|
-
alive = self.alive.map(&status)
|
56
|
-
dead = self.dead.map(&status)
|
57
|
-
#puts "#{alive.count} running daemons"
|
58
|
-
#puts "#{dead.count} dead daemons"
|
59
|
-
{ alive: alive, dead: dead }
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.start replicant
|
63
|
-
self.can_shutdown = false
|
64
|
-
daemon = self.daemon replicant
|
65
|
-
if daemon.pid
|
66
|
-
puts "daemon #{daemon} is still running"
|
67
|
-
else
|
68
|
-
daemon.start_daemon
|
69
|
-
end
|
70
|
-
self.can_shutdown = true
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.stop replicant
|
74
|
-
daemon = self.daemon replicant
|
75
|
-
if daemon.pid
|
76
|
-
daemon.stop
|
77
|
-
else
|
78
|
-
puts "daemon #{daemon} was not running"
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.can_shutdown= bool
|
83
|
-
@sd = bool
|
84
|
-
end
|
85
|
-
|
86
|
-
def self.can_shutdown
|
87
|
-
@sd
|
88
|
-
end
|
89
|
-
|
90
|
-
def self.power_down
|
91
|
-
|
92
|
-
return unless self.can_shutdown
|
93
|
-
|
94
|
-
if self.running?
|
95
|
-
puts "stopping all daemons"
|
96
|
-
@@daemons.count.times do
|
97
|
-
daemon = @@daemons.pop
|
98
|
-
if daemon.pid
|
99
|
-
pid = Process.fork { daemon.stop }
|
100
|
-
Process.detach(pid)
|
101
|
-
else
|
102
|
-
puts "daemon #{daemon} was not running"
|
103
|
-
end
|
104
|
-
end
|
105
|
-
else
|
106
|
-
puts "RedDwarf has not been started yet"
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|
110
|
-
|
111
|
-
def self.running?
|
112
|
-
!self.daemons.empty?
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|