capricorn 0.2.25 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/README.md +1 -0
- data/bin/capricorn-app-scaffolder +27 -0
- data/bin/capricorn-gem-spec +33 -0
- data/bin/capricornctl +12 -0
- data/bin/capricornd +31 -0
- data/erlang/lib/bert/doc/overview.edoc +4 -0
- data/erlang/lib/bert/ebin/bert.app +9 -0
- data/erlang/lib/bert/rebar.config +3 -0
- data/erlang/lib/bert/src/bert.erl +69 -0
- data/erlang/lib/bertio/doc/overview.edoc +4 -0
- data/erlang/lib/bertio/ebin/bertio.app +9 -0
- data/erlang/lib/bertio/rebar.config +3 -0
- data/erlang/lib/bertio/src/bertio.erl +28 -0
- data/erlang/lib/bertrpc/doc/overview.edoc +4 -0
- data/erlang/lib/bertrpc/ebin/bertrpc.app +12 -0
- data/erlang/lib/bertrpc/include/bertrpc.hrl +1 -0
- data/erlang/lib/bertrpc/rebar.config +5 -0
- data/erlang/lib/bertrpc/src/bertrpc.erl +471 -0
- data/erlang/lib/bertrpc/src/bertrpc_hello_world.erl +148 -0
- data/erlang/lib/bertrpc/src/fd_tcp.erl +376 -0
- data/erlang/lib/capricorn/doc/overview.edoc +4 -0
- data/erlang/lib/capricorn/ebin/capricorn.app +56 -0
- data/erlang/lib/capricorn/include/capricorn.hrl +76 -0
- data/erlang/lib/capricorn/rebar.config +3 -0
- data/erlang/lib/capricorn/src/cap_application.erl +170 -0
- data/erlang/lib/capricorn/src/cap_cluster.erl +121 -0
- data/erlang/lib/capricorn/src/cap_cluster_gems.erl +422 -0
- data/erlang/lib/capricorn/src/cap_config.erl +25 -0
- data/erlang/lib/capricorn/src/cap_dets_updater.erl +26 -0
- data/erlang/lib/capricorn/src/cap_event_sup.erl +35 -0
- data/erlang/lib/capricorn/src/cap_events.erl +24 -0
- data/erlang/lib/capricorn/src/cap_external_api.erl +87 -0
- data/erlang/lib/capricorn/src/cap_external_apps_api.erl +125 -0
- data/erlang/lib/capricorn/src/cap_external_gems_api.erl +85 -0
- data/erlang/lib/capricorn/src/cap_external_machines_api.erl +18 -0
- data/erlang/lib/capricorn/src/cap_gem_utils.erl +111 -0
- data/erlang/lib/capricorn/src/cap_internal_api.erl +69 -0
- data/erlang/lib/capricorn/src/cap_internal_apps_api.erl +38 -0
- data/erlang/lib/capricorn/src/cap_log.erl +113 -0
- data/erlang/lib/capricorn/src/cap_machine.erl +338 -0
- data/erlang/lib/capricorn/src/cap_machine_apps.erl +410 -0
- data/erlang/lib/capricorn/src/cap_machine_apps_sup.erl +57 -0
- data/erlang/lib/capricorn/src/cap_sup.erl +200 -0
- data/erlang/lib/capricorn/src/cap_util.erl +278 -0
- data/erlang/lib/capricorn/src/capricorn.erl +45 -0
- data/erlang/lib/capricorn/src/capricorn_app.erl +36 -0
- data/erlang/lib/emq/ebin/emq.app +17 -0
- data/erlang/lib/emq/src/emq.erl +261 -0
- data/erlang/lib/emq/src/emq_app.erl +11 -0
- data/erlang/lib/emq/src/emq_pool.erl +178 -0
- data/erlang/lib/emq/src/emq_queue.erl +332 -0
- data/erlang/lib/emq/src/emq_status.erl +148 -0
- data/erlang/lib/emq/src/emq_sup.erl +132 -0
- data/erlang/lib/gcd/ebin/gcd.app +18 -0
- data/erlang/lib/gcd/include/gcd.hrl +5 -0
- data/erlang/lib/gcd/rebar.config +3 -0
- data/erlang/lib/gcd/src/gcd.erl +51 -0
- data/erlang/lib/gcd/src/gcd_app.erl +13 -0
- data/erlang/lib/gcd/src/gcd_event.erl +39 -0
- data/erlang/lib/gcd/src/gcd_server.erl +30 -0
- data/erlang/lib/gcd/src/gcd_srv.erl +186 -0
- data/erlang/lib/gcd/src/gcd_sup.erl +18 -0
- data/erlang/rebar +0 -0
- data/erlang/rebar.config +9 -0
- data/erlang/rel/overlay/bin/capricornd +146 -0
- data/erlang/rel/overlay/erts-vsn/bin/erl +34 -0
- data/erlang/rel/overlay/erts-vsn/bin/nodetool +80 -0
- data/erlang/rel/overlay/etc/capricorn/app.config +59 -0
- data/erlang/rel/overlay/etc/capricorn/cluster-vm.args +21 -0
- data/erlang/rel/overlay/etc/capricorn/machine-vm.args +21 -0
- data/erlang/rel/reltool.config +43 -0
- data/ext/Makefile +2 -0
- data/ext/extconf.rb +1 -0
- data/lib/capricorn-client.rb +86 -0
- data/lib/capricorn-client/cli/applications.rb +256 -0
- data/lib/capricorn-client/cli/gems.rb +57 -0
- data/lib/capricorn-client/cli/machines.rb +9 -0
- data/lib/capricorn-client/helpers.rb +62 -0
- data/lib/capricorn.rb +5 -99
- data/lib/capricorn/driver.rb +86 -0
- data/lib/capricorn/recipes/apache-debian.rb +112 -0
- data/lib/capricorn/recipes/centos-plesk.rb +162 -0
- data/lib/capricorn/recipes/macports.rb +54 -0
- data/lib/capricorn/system_context.rb +49 -0
- data/lib/capricorn/version.rb +5 -0
- metadata +233 -74
- data/app_generators/engine/engine_generator.rb +0 -40
- data/app_generators/engine/templates/Gmfile +0 -20
- data/app_generators/engine/templates/MIT-LICENSE.txt +0 -20
- data/app_generators/engine/templates/README.rdoc +0 -7
- data/app_generators/engine/templates/config/initializers/rails_init.rb +0 -1
- data/app_generators/engine/templates/config/routes.rb +0 -2
- data/app_generators/engine/templates/gitignore +0 -9
- data/app_generators/engine/templates/init.rb +0 -1
- data/app_generators/engine/templates/lib/engine.rb +0 -4
- data/app_generators/engine/templates/rails/init.rb +0 -1
- data/app_generators/engine/templates/tasks/engine_tasks.rake +0 -4
- data/bin/capricorn +0 -20
- data/lib/capricorn/actor.rb +0 -23
- data/lib/capricorn/actor/actions.rb +0 -76
- data/lib/capricorn/actors/apache_actor.rb +0 -56
- data/lib/capricorn/actors/base_actor.rb +0 -335
- data/lib/capricorn/actors/host_file_actor.rb +0 -77
- data/lib/capricorn/actors/mysql_actor.rb +0 -20
- data/lib/capricorn/actors/passenger_actor.rb +0 -28
- data/lib/capricorn/actors/plesk_actor.rb +0 -228
- data/lib/capricorn/actors/sqlite3_actor.rb +0 -44
- data/lib/capricorn/app_runner.rb +0 -108
- data/lib/capricorn/apps/dev.rb +0 -15
- data/lib/capricorn/apps/engines.rb +0 -33
- data/lib/capricorn/apps/jobs.rb +0 -35
- data/lib/capricorn/apps/satellite.rb +0 -68
- data/lib/capricorn/apps/server.rb +0 -73
- data/lib/capricorn/client.rb +0 -48
- data/lib/capricorn/client/auth_token.rb +0 -98
- data/lib/capricorn/daemon.rb +0 -81
- data/lib/capricorn/exception_handler.rb +0 -79
- data/lib/capricorn/extentions/rubygems_plugin.rb +0 -27
- data/lib/capricorn/extentions/thor_extentions.rb +0 -32
- data/lib/capricorn/job_queue.rb +0 -203
- data/lib/capricorn/satellite.rb +0 -52
- data/lib/capricorn/satellite/actions.rb +0 -55
- data/lib/capricorn/satellite/dependency_loader.rb +0 -82
- data/lib/capricorn/satellite/persistence.rb +0 -50
- data/lib/capricorn/server.rb +0 -144
- data/lib/capricorn/server/daemon.rb +0 -83
- data/lib/capricorn/server/proxy.rb +0 -25
- data/lib/capricorn/server/security.rb +0 -120
- data/lib/capricorn/system.rb +0 -218
- data/lib/capricorn/system/config.rb +0 -49
- data/lib/capricorn/system/helper.rb +0 -21
- data/lib/capricorn/system/options.rb +0 -79
- data/lib/capricorn/system/process_user.rb +0 -73
- data/lib/capricorn/system/satellites.rb +0 -44
- data/lib/capricorn/system/shell.rb +0 -80
- data/lib/rubygems_plugin.rb +0 -1
- data/spec/actor/actions_spec.rb +0 -13
- data/spec/spec_helper.rb +0 -1
data/ext/Makefile
ADDED
data/ext/extconf.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# see Makefile
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Capricorn
|
2
|
+
require 'thor'
|
3
|
+
require 'yaml'
|
4
|
+
require 'bertrpc'
|
5
|
+
require 'highline'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
require 'capricorn-client/helpers'
|
9
|
+
|
10
|
+
module CLI
|
11
|
+
require 'capricorn-client/cli/applications'
|
12
|
+
require 'capricorn-client/cli/gems'
|
13
|
+
require 'capricorn-client/cli/machines'
|
14
|
+
end
|
15
|
+
|
16
|
+
module Runner
|
17
|
+
|
18
|
+
HELP = <<-EOH
|
19
|
+
Topics:
|
20
|
+
CLUSTER applications
|
21
|
+
# manage applications
|
22
|
+
|
23
|
+
CLUSTER gems
|
24
|
+
# manage gems
|
25
|
+
|
26
|
+
CLUSTER machines
|
27
|
+
# manage machines
|
28
|
+
EOH
|
29
|
+
|
30
|
+
DEFAULT_CONFIG = <<-EOH
|
31
|
+
cluster_name:
|
32
|
+
host: localhost
|
33
|
+
port: 3457
|
34
|
+
username: dummy
|
35
|
+
password: dummy
|
36
|
+
EOH
|
37
|
+
|
38
|
+
def start
|
39
|
+
cluster_name = ARGV.shift
|
40
|
+
unless cluster_name
|
41
|
+
help
|
42
|
+
exit 1
|
43
|
+
end
|
44
|
+
|
45
|
+
@cluster = config[cluster_name]
|
46
|
+
unless @cluster
|
47
|
+
puts "I don't know this cluster"
|
48
|
+
exit 1
|
49
|
+
end
|
50
|
+
|
51
|
+
case ARGV.shift
|
52
|
+
when 'applications'
|
53
|
+
Capricorn::CLI::Applications.start
|
54
|
+
when 'gems'
|
55
|
+
Capricorn::CLI::Gems.start
|
56
|
+
when 'machines'
|
57
|
+
Capricorn::CLI::Machines.start
|
58
|
+
else
|
59
|
+
help
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def help
|
64
|
+
puts HELP
|
65
|
+
end
|
66
|
+
|
67
|
+
def cluster
|
68
|
+
@cluster
|
69
|
+
end
|
70
|
+
|
71
|
+
def config
|
72
|
+
@config ||= begin
|
73
|
+
config_path = File.expand_path('~/.capricorn/config.yml')
|
74
|
+
unless File.file?(config_path)
|
75
|
+
FileUtils.mkdir_p(File.dirname(config_path))
|
76
|
+
File.open(config_path, 'w+', 0600) { |file| file.write DEFAULT_CONFIG }
|
77
|
+
puts "Please edit your config file in ~/.capricorn/config.yml"
|
78
|
+
exit 2
|
79
|
+
end
|
80
|
+
YAML.load_file(config_path)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
extend self
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,256 @@
|
|
1
|
+
class Capricorn::CLI::Applications < Thor
|
2
|
+
include Capricorn::Helpers
|
3
|
+
|
4
|
+
desc "list", "list all applications on MACHINE"
|
5
|
+
def list
|
6
|
+
machine = select_machine
|
7
|
+
|
8
|
+
apps = client.call.applications.all(machine.to_sym).last || []
|
9
|
+
apps.collect! do |app|
|
10
|
+
[app[1], app[3]]
|
11
|
+
end
|
12
|
+
apps.flatten!
|
13
|
+
|
14
|
+
ui.table %w( Id Name ), apps, :columns_across, 2
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "info", "get info of an application on MACHINE"
|
18
|
+
def info
|
19
|
+
machine, id = *select_application
|
20
|
+
app = find_app(machine, id)
|
21
|
+
show_app(app)
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "create", "create an application on MACHINE"
|
25
|
+
def create
|
26
|
+
machine = select_machine
|
27
|
+
name = ui.ask("name: ") do |q|
|
28
|
+
q.validate = /^.+$/
|
29
|
+
end
|
30
|
+
environment = ui.choose do |q|
|
31
|
+
q.choices(*%w( production development staging testing ))
|
32
|
+
q.prompt = "environment: "
|
33
|
+
q.default = 'production'
|
34
|
+
end
|
35
|
+
domains = []
|
36
|
+
domains << ui.ask("domain: ") do |q|
|
37
|
+
q.validate = /^[\w\d]+(\.[\w\d]+)*$/
|
38
|
+
end
|
39
|
+
loop do
|
40
|
+
domain = ui.ask("more: ") do |q|
|
41
|
+
q.validate = /^([\w\d]+(\.[\w\d]+)*)?$/
|
42
|
+
end
|
43
|
+
break if domain.strip.empty?
|
44
|
+
domains << domain
|
45
|
+
end
|
46
|
+
|
47
|
+
domains = domains.flatten.compact
|
48
|
+
domains = domains.collect { |d| d.downcase.sub(/^www\./, '') }
|
49
|
+
domains = domains.uniq
|
50
|
+
|
51
|
+
environment = environment.to_sym
|
52
|
+
|
53
|
+
p client.call.applications.create(machine.to_sym, name, domains, environment)
|
54
|
+
end
|
55
|
+
|
56
|
+
desc "import", "import an application on MACHINE (only use this from an application dir)"
|
57
|
+
def import
|
58
|
+
root = File.expand_path(Dir.pwd)
|
59
|
+
|
60
|
+
unless File.file?(File.join(root, "host/config/milkshake.yml"))
|
61
|
+
puts ui.color('This doesn\'t appear to be a milkshake app!', :red)
|
62
|
+
puts ui.color('no milkshake config was found', :red)
|
63
|
+
exit 1
|
64
|
+
end
|
65
|
+
|
66
|
+
unless File.directory?(File.join(root, "shared"))
|
67
|
+
puts ui.color('This doesn\'t appear to be a milkshake app!', :red)
|
68
|
+
puts ui.color('no shared dir was found', :red)
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
|
72
|
+
gems = YAML.load_file(File.join(root, "host/config/milkshake.yml"))
|
73
|
+
gems = (gems['gems'].keys rescue [])
|
74
|
+
if gems.empty?
|
75
|
+
puts ui.color('This doesn\'t appear to be a milkshake app!', :red)
|
76
|
+
puts ui.color('no gems were found', :red)
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
|
80
|
+
stats = (File.stat(File.join(root, "host/config/environment.rb")) rescue nil)
|
81
|
+
unless stats
|
82
|
+
puts ui.color('This doesn\'t appear to be a milkshake app!', :red)
|
83
|
+
puts ui.color('no environment.rb was found', :red)
|
84
|
+
exit 1
|
85
|
+
end
|
86
|
+
|
87
|
+
uid = (Etc.getpwuid(stats.uid).name rescue nil)
|
88
|
+
unless uid
|
89
|
+
puts ui.color('This doesn\'t appear to be a milkshake app!', :red)
|
90
|
+
puts ui.color('no uid was found', :red)
|
91
|
+
exit 1
|
92
|
+
end
|
93
|
+
|
94
|
+
gid = (Etc.getgrgid(stats.gid).name rescue nil)
|
95
|
+
unless gid
|
96
|
+
puts ui.color('This doesn\'t appear to be a milkshake app!', :red)
|
97
|
+
puts ui.color('no gid was found', :red)
|
98
|
+
exit 1
|
99
|
+
end
|
100
|
+
|
101
|
+
machine = select_machine
|
102
|
+
name = ui.ask("name: ") do |q|
|
103
|
+
q.validate = /^.+$/
|
104
|
+
end
|
105
|
+
environment = ui.choose do |q|
|
106
|
+
q.choices(*%w( production development staging testing ))
|
107
|
+
q.prompt = "environment: "
|
108
|
+
q.default = 'production'
|
109
|
+
end
|
110
|
+
domains = []
|
111
|
+
domains << ui.ask("domain: ") do |q|
|
112
|
+
q.validate = /^[\w\d]+(\.[\w\d]+)*$/
|
113
|
+
end
|
114
|
+
loop do
|
115
|
+
domain = ui.ask("more: ") do |q|
|
116
|
+
q.validate = /^([\w\d]+(\.[\w\d]+)*)?$/
|
117
|
+
end
|
118
|
+
break if domain.strip.empty?
|
119
|
+
domains << domain
|
120
|
+
end
|
121
|
+
|
122
|
+
domains = domains.flatten.compact
|
123
|
+
domains = domains.collect { |d| d.downcase.sub(/^www\./, '') }
|
124
|
+
domains = domains.uniq
|
125
|
+
|
126
|
+
environment = environment.to_sym
|
127
|
+
|
128
|
+
p client.call.applications.import(machine.to_sym, name, domains, environment, root, gems, uid, gid)
|
129
|
+
end
|
130
|
+
|
131
|
+
desc "update", "update an application on MACHINE"
|
132
|
+
def update
|
133
|
+
machine, id = *select_application
|
134
|
+
app = find_app(machine, id)
|
135
|
+
|
136
|
+
app[4] ||= []
|
137
|
+
app[9] ||= []
|
138
|
+
app[10] ||= []
|
139
|
+
|
140
|
+
loop do
|
141
|
+
print "\e[H\e[2J" ; $stdout.flush
|
142
|
+
|
143
|
+
show_app(app)
|
144
|
+
|
145
|
+
puts
|
146
|
+
|
147
|
+
ui.choose do |q|
|
148
|
+
q.header = "Actions"
|
149
|
+
q.prompt = 'What do you wan to do? '
|
150
|
+
|
151
|
+
q.choice('gem-add') do
|
152
|
+
name = ui.ask("enter a gem name: ") do |q|
|
153
|
+
q.validate = /^([a-zA-Z0-9_-]+)?$/
|
154
|
+
end
|
155
|
+
app[10] << name unless name.strip.empty?
|
156
|
+
end
|
157
|
+
|
158
|
+
q.choice('gem-remove') do
|
159
|
+
g = ui.choose do |q|
|
160
|
+
q.header = "Gems"
|
161
|
+
q.prompt = 'choose a gem to remove: '
|
162
|
+
q.choices(*app[10])
|
163
|
+
end
|
164
|
+
app[10].delete(g)
|
165
|
+
end
|
166
|
+
|
167
|
+
q.choice('domain-add') do
|
168
|
+
domain = ui.ask("enter a domain: ") do |q|
|
169
|
+
q.validate = /^([\w\d]+(\.[\w\d]+)*)?$/
|
170
|
+
end
|
171
|
+
app[4] << domain unless domain.strip.empty?
|
172
|
+
end
|
173
|
+
|
174
|
+
q.choice('domain-remove') do
|
175
|
+
domain = ui.choose do |q|
|
176
|
+
q.header = "Domains"
|
177
|
+
q.prompt = 'choose a domain to remove: '
|
178
|
+
q.choices(*app[4])
|
179
|
+
end
|
180
|
+
app[4].delete(domain)
|
181
|
+
end
|
182
|
+
|
183
|
+
q.choice('abort') do
|
184
|
+
exit(0)
|
185
|
+
end
|
186
|
+
|
187
|
+
q.choice('commit') do
|
188
|
+
p client.call.applications.update(machine.to_sym, id, app[4], app[10])
|
189
|
+
exit(0)
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
desc "fupdate", "force update an application on MACHINE"
|
197
|
+
def fupdate
|
198
|
+
machine, id = *select_application
|
199
|
+
p client.call.applications.fupdate(machine.to_sym, id)
|
200
|
+
end
|
201
|
+
|
202
|
+
desc "relink", "relink an application on MACHINE"
|
203
|
+
def relink
|
204
|
+
machine, id = *select_application
|
205
|
+
p client.call.applications.relink(machine.to_sym, id)
|
206
|
+
end
|
207
|
+
|
208
|
+
desc "restart", "restart an application on MACHINE"
|
209
|
+
def restart
|
210
|
+
machine, id = *select_application
|
211
|
+
p client.call.applications.restart(machine.to_sym, id)
|
212
|
+
end
|
213
|
+
|
214
|
+
desc "start", "start an application on MACHINE"
|
215
|
+
def start
|
216
|
+
machine, id = *select_application
|
217
|
+
p client.call.applications.start(machine.to_sym, id)
|
218
|
+
end
|
219
|
+
|
220
|
+
desc "stop", "stop an application on MACHINE"
|
221
|
+
def stop
|
222
|
+
machine, id = *select_application
|
223
|
+
p client.call.applications.stop(machine.to_sym, id)
|
224
|
+
end
|
225
|
+
|
226
|
+
private
|
227
|
+
|
228
|
+
def find_app(machine ,id)
|
229
|
+
apps = client.call.applications.all(machine.to_sym).last || []
|
230
|
+
app = apps.detect do |app|
|
231
|
+
app[1] == id
|
232
|
+
end
|
233
|
+
|
234
|
+
unless app
|
235
|
+
puts ui.color('Application not found!', :red)
|
236
|
+
exit(1)
|
237
|
+
end
|
238
|
+
|
239
|
+
app
|
240
|
+
end
|
241
|
+
|
242
|
+
def show_app(app)
|
243
|
+
app = app.to_a.dup
|
244
|
+
app.shift
|
245
|
+
app.pop
|
246
|
+
app.collect! do |v|
|
247
|
+
case v
|
248
|
+
when Array then v.join(', ')
|
249
|
+
else v.to_s
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
ui.table %w( Id Machine Name Domains Environment User Group Root Installed\ Gems Requested\ Gems ), app, :columns_down, 2
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Capricorn::CLI::Gems < Thor
|
2
|
+
include Capricorn::Helpers
|
3
|
+
|
4
|
+
desc "push PATHS...", "push gems to capricorn"
|
5
|
+
def push(*paths)
|
6
|
+
paths = paths.flatten.collect do |path|
|
7
|
+
Dir.glob(path)
|
8
|
+
end.flatten
|
9
|
+
paths.each do |path|
|
10
|
+
begin
|
11
|
+
client.call(:stream => path).gems.push
|
12
|
+
puts ui.color("Pushed: #{File.basename(path)}", :green)
|
13
|
+
rescue BERTRPC::UserError => e
|
14
|
+
puts ui.color(e.message, :red)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "missing", "list missing gems"
|
20
|
+
def missing
|
21
|
+
ui.table %w( Gem Requirements ), clean_missing(client.call.gems.missing), :columns_across, 2
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "all", "list all gems"
|
25
|
+
def all
|
26
|
+
ui.table %w( Gem Versions ), clean_all(client.call.gems.all), :columns_across, 2
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def clean_all(gems)
|
32
|
+
gems = gems.last
|
33
|
+
gems.inject(Hash.new { |h,k| h[k] = [] }) do |m, g|
|
34
|
+
header, name, version = *(g.to_ary)
|
35
|
+
version = version.last.join('.')
|
36
|
+
m[name.to_s] << version
|
37
|
+
m
|
38
|
+
end.collect do |name, versions|
|
39
|
+
[name, versions.join(', ')]
|
40
|
+
end.flatten
|
41
|
+
end
|
42
|
+
|
43
|
+
def clean_missing(deps)
|
44
|
+
deps = deps.last if deps and deps.first == :ok
|
45
|
+
return [] if deps.nil? or deps.empty?
|
46
|
+
deps.sort! { |a,b| a.first <=> b.first }
|
47
|
+
deps.collect do |dep|
|
48
|
+
reqs = dep.last.collect do |req|
|
49
|
+
op = req.shift
|
50
|
+
version = req.shift.to_a.last.join('.')
|
51
|
+
"#{op} #{version}"
|
52
|
+
end.join(', ')
|
53
|
+
[dep.first, reqs]
|
54
|
+
end.flatten
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Capricorn::Helpers
|
2
|
+
|
3
|
+
def select_machine
|
4
|
+
if self.machines.size > 1
|
5
|
+
ui.choose(*self.machines)
|
6
|
+
elsif self.machines.size == 1 and ui.agree("Use machine #{self.machines.first}? ")
|
7
|
+
self.machines.first
|
8
|
+
else
|
9
|
+
puts ui.color('No machines found!!!', :red)
|
10
|
+
exit(1)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def select_application
|
15
|
+
machine = select_machine
|
16
|
+
|
17
|
+
apps = client.call.applications.all(machine.to_sym).last || []
|
18
|
+
apps.collect! do |app|
|
19
|
+
app[1]
|
20
|
+
end
|
21
|
+
apps.flatten!
|
22
|
+
|
23
|
+
if apps.size > 1
|
24
|
+
[machine, ui.choose(*apps)]
|
25
|
+
elsif apps.size == 1 and ui.agree("Use application #{apps.first}? ")
|
26
|
+
[machine, apps.first]
|
27
|
+
else
|
28
|
+
puts ui.color('No application found!!!', :red)
|
29
|
+
exit(1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def machines
|
34
|
+
@machines ||= (client.call.machines.all || []).collect do |machine|
|
35
|
+
machine.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def client
|
40
|
+
cluster = Capricorn::Runner.cluster
|
41
|
+
host = (cluster['host'] || 'localhost').to_s
|
42
|
+
port = (cluster['port'] || 3457).to_i
|
43
|
+
@client ||= BERTRPC::Service.new(host, port)
|
44
|
+
end
|
45
|
+
|
46
|
+
def ui
|
47
|
+
@ui ||= begin
|
48
|
+
@ui = HighLine.new
|
49
|
+
@ui.extend UI
|
50
|
+
@ui
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module UI
|
55
|
+
|
56
|
+
def table(headers, items, mode=:rows, option=nil)
|
57
|
+
headers = [headers].flatten.collect { |h| color(h, :green) }
|
58
|
+
@output.puts list(headers+items, mode, option)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|