thundercat 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -0
- data/bin/thundercat +2 -0
- data/bin/thundercat-upgrade +38 -0
- data/src/monitor/monitor.rb +49 -3
- data/src/rap/thundercat.rap +0 -0
- metadata +4 -2
data/README.md
CHANGED
@@ -4,6 +4,7 @@ ThunderCat is a ruby application container for Rack based applications. It is ve
|
|
4
4
|
There is a web admin panel which lets you upload a .rap archive and also see which webapps are running and start/stop/remove them.
|
5
5
|
|
6
6
|
[![Build Status](https://travis-ci.org/masterthought/thundercat.png?branch=master)](https://travis-ci.org/masterthought/thundercat)
|
7
|
+
[![thundercat Downloads](http://www.gemetric.me/images/thundercat.gif)](https://rubygems.org/gems/thundercat)
|
7
8
|
|
8
9
|
## Background
|
9
10
|
|
data/bin/thundercat
CHANGED
@@ -21,6 +21,8 @@ else
|
|
21
21
|
FileUtils.mkpath("#{target_dir}/webapps")
|
22
22
|
FileUtils.mkpath("#{target_dir}/log")
|
23
23
|
FileUtils.mkpath("#{target_dir}/archive")
|
24
|
+
FileUtils.mkpath("#{target_dir}/standalone")
|
25
|
+
FileUtils.mkpath("#{target_dir}/standalone_archive")
|
24
26
|
FileUtils.cp(rap, "#{target_dir}/webapps")
|
25
27
|
FileUtils.cp(monitor, target_dir)
|
26
28
|
FileUtils.cp(start_script, target_dir)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
name = ARGV[0]
|
5
|
+
|
6
|
+
if name.nil? or name.empty?
|
7
|
+
puts '[ThunderCat] Error you must supply a target directory containing an existing thundercat installation'
|
8
|
+
else
|
9
|
+
|
10
|
+
begin
|
11
|
+
target_dir = "#{name}"
|
12
|
+
|
13
|
+
rap_file = File.open(target_dir + '/webapps/thundercat/rap.yml')
|
14
|
+
existing_version = YAML::load(rap_file)[:version]
|
15
|
+
|
16
|
+
if existing_version < "0.0.256"
|
17
|
+
# create standalone and standalone_archive directories
|
18
|
+
FileUtils.mkpath("#{target_dir}/standalone") unless File.exists?("#{target_dir}/standalone")
|
19
|
+
FileUtils.mkpath("#{target_dir}/standalone_archive") unless File.exists?("#{target_dir}/standalone_archive")
|
20
|
+
rap = File.dirname(File.expand_path(__FILE__)) + '/../src/rap/thundercat.rap'
|
21
|
+
monitor = File.dirname(File.expand_path(__FILE__)) + '/../src/monitor/monitor.rb'
|
22
|
+
|
23
|
+
# remove old monitor and replace with new monitor
|
24
|
+
FileUtils.rm_rf("#{target_dir}/monitor.rb") if File.exists?("#{target_dir}/monitor.rb")
|
25
|
+
FileUtils.cp(monitor, target_dir)
|
26
|
+
|
27
|
+
# drop in new thundercat rap
|
28
|
+
FileUtils.cp(rap, "#{target_dir}/webapps")
|
29
|
+
end
|
30
|
+
|
31
|
+
puts "[ThunderCat] Successfully updated ThunderCat at: #{target_dir}"
|
32
|
+
|
33
|
+
rescue => e
|
34
|
+
puts "[ThunderCat] OOps something went wrong: #{e}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
data/src/monitor/monitor.rb
CHANGED
@@ -24,6 +24,23 @@ class Decision
|
|
24
24
|
`cd #{webapps_dir}/thundercat; ./start.sh`
|
25
25
|
end
|
26
26
|
|
27
|
+
def standalone_decide(option, base, relative, type)
|
28
|
+
zip_file = base + '/' + relative
|
29
|
+
zip_dir = path_without_ext(zip_file, base)
|
30
|
+
if option == :create
|
31
|
+
clean_standalone(zip_dir, zip_file, base) if rap_already_deployed?(zip_dir)
|
32
|
+
deploy_standalone(zip_file, zip_dir, base)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def standalone_initial(standalone_dir)
|
37
|
+
Dir.entries(standalone_dir).each do |entry|
|
38
|
+
if entry.match(/.zip$/)
|
39
|
+
decide(:create, standalone_dir, entry, 'file')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
27
44
|
private
|
28
45
|
|
29
46
|
def deploy_rap(rap_file, rap_dir, base)
|
@@ -45,13 +62,19 @@ class Decision
|
|
45
62
|
end
|
46
63
|
`cd #{rap_dir} ; ./#{start_script}`
|
47
64
|
puts "[ThunderCat] Successfully deployed and started app at: #{rap_file}"
|
48
|
-
archive_rap(rap_file,base)
|
65
|
+
archive_rap(rap_file, base)
|
49
66
|
else
|
50
67
|
puts '[ThunderCat] no rap file found so could not start app'
|
51
68
|
end
|
52
69
|
|
53
70
|
end
|
54
71
|
|
72
|
+
def deploy_standalone(zip_file, zip_dir, base)
|
73
|
+
Rappa.new(:input_archive => zip_file, :output_archive => base).standalone_expand
|
74
|
+
puts "[ThunderCat] Successfully deployed standalone zip archive at: #{zip_file}"
|
75
|
+
archive_zip(zip_file, base)
|
76
|
+
end
|
77
|
+
|
55
78
|
def stop_app(rap_dir)
|
56
79
|
rap_file = rap_dir + '/rap.yml'
|
57
80
|
if File.exists?(rap_file)
|
@@ -68,11 +91,20 @@ class Decision
|
|
68
91
|
FileUtils.mv(rap_dir, "#{base}/../archive/#{file_without_ext(rap_file)}.#{Time.now.to_i}")
|
69
92
|
end
|
70
93
|
|
71
|
-
def
|
94
|
+
def archive_existing_standalone(zip_dir, zip_file, base)
|
95
|
+
FileUtils.mv(zip_dir, "#{base}/../standalone_archive/#{file_without_ext(zip_file)}.#{Time.now.to_i}")
|
96
|
+
end
|
97
|
+
|
98
|
+
def archive_rap(rap_file, base)
|
72
99
|
FileUtils.mv(rap_file, "#{base}/../archive/#{file_without_ext(rap_file)}.#{Time.now.to_i}.rap")
|
73
100
|
puts "[ThunderCat] archived rap file: #{rap_file}"
|
74
101
|
end
|
75
102
|
|
103
|
+
def archive_zip(zip_file, base)
|
104
|
+
FileUtils.mv(zip_file, "#{base}/../standalone_archive/#{file_without_ext(zip_file)}.#{Time.now.to_i}.zip")
|
105
|
+
puts "[ThunderCat] archived standalone zip file: #{zip_file}"
|
106
|
+
end
|
107
|
+
|
76
108
|
def rap_already_deployed?(rap_dir)
|
77
109
|
File.exists?(rap_dir)
|
78
110
|
end
|
@@ -82,6 +114,10 @@ class Decision
|
|
82
114
|
archive_existing_app(rap_dir, rap_file, base)
|
83
115
|
end
|
84
116
|
|
117
|
+
def clean_standalone(zip_dir, zip_file, base)
|
118
|
+
archive_existing_standalone(zip_dir, zip_file, base)
|
119
|
+
end
|
120
|
+
|
85
121
|
def path_without_ext(file, base)
|
86
122
|
base_name = File.basename(file)
|
87
123
|
base + '/' + base_name.chomp(File.extname(base_name))
|
@@ -100,12 +136,22 @@ class Monitor
|
|
100
136
|
def self.go
|
101
137
|
begin
|
102
138
|
webapps_dir = File.dirname(__FILE__) + '/webapps'
|
139
|
+
standalone_dir = File.dirname(__FILE__) + '/standalone'
|
103
140
|
Decision.new.initial(webapps_dir)
|
141
|
+
Decision.new.standalone_initial(standalone_dir)
|
104
142
|
FSSM.monitor(webapps_dir, '**/*.rap', :directories => true) do
|
105
143
|
update { |base, relative, type| puts "updated #{base}, #{relative}, #{type}" }
|
106
|
-
delete { |base, relative, type| puts
|
144
|
+
delete { |base, relative, type| puts "delete #{base}, #{relative}, #{type}" }
|
107
145
|
create { |base, relative, type| Decision.new.decide(:create, base, relative, type) }
|
146
|
+
|
147
|
+
FSSM.monitor(standalone_dir, '**/*.zip', :directories => true) do
|
148
|
+
update { |dir, relative, type| puts "updated #{dir}, #{relative}, #{type}" }
|
149
|
+
delete { |dir, relative, type| puts "delete #{dir}, #{relative}, #{type}" }
|
150
|
+
create { |dir, relative, type| Decision.new.standalone_decide(:create, dir, relative, type) }
|
108
151
|
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
109
155
|
rescue => e
|
110
156
|
puts "[ThunderCat] Monitor encountered an error: #{e}"
|
111
157
|
end
|
data/src/rap/thundercat.rap
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thundercat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -225,6 +225,7 @@ description: ! 'Easy way to deploy and monitor Rack applications as .rap archive
|
|
225
225
|
email: kingsley@masterthought.net
|
226
226
|
executables:
|
227
227
|
- /thundercat
|
228
|
+
- /thundercat-upgrade
|
228
229
|
extensions: []
|
229
230
|
extra_rdoc_files:
|
230
231
|
- README.md
|
@@ -235,6 +236,7 @@ files:
|
|
235
236
|
- src/monitor/stop.sh
|
236
237
|
- README.md
|
237
238
|
- bin/thundercat
|
239
|
+
- bin/thundercat-upgrade
|
238
240
|
homepage: https://github.com/masterthought/thundercat
|
239
241
|
licenses:
|
240
242
|
- Apache 2.0
|