jdc 0.1.2 → 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.
Files changed (151) hide show
  1. data/LICENSE +1277 -24
  2. data/Rakefile +13 -0
  3. data/bin/jdc +12 -2
  4. data/lib/admin/README.md +15 -0
  5. data/lib/admin/curl.rb +60 -0
  6. data/lib/admin/guid.rb +89 -0
  7. data/lib/admin/plugin.rb +6 -0
  8. data/lib/admin/service_auth_token.rb +94 -0
  9. data/lib/admin/service_broker/add.rb +47 -0
  10. data/lib/admin/service_broker/service_brokers.rb +24 -0
  11. data/lib/admin/set_quota.rb +44 -0
  12. data/lib/console/README.md +8 -0
  13. data/lib/console/console.rb +187 -0
  14. data/lib/console/plugin.rb +33 -0
  15. data/lib/jdc/cli/app/app.rb +43 -0
  16. data/lib/jdc/cli/app/apps.rb +87 -0
  17. data/lib/jdc/cli/app/base.rb +72 -0
  18. data/lib/jdc/cli/app/delete.rb +95 -0
  19. data/lib/jdc/cli/app/deprecated.rb +11 -0
  20. data/lib/jdc/cli/app/env.rb +78 -0
  21. data/lib/jdc/cli/app/events.rb +45 -0
  22. data/lib/jdc/cli/app/files.rb +137 -0
  23. data/lib/jdc/cli/app/health.rb +26 -0
  24. data/lib/jdc/cli/app/instances.rb +53 -0
  25. data/lib/jdc/cli/app/logs.rb +76 -0
  26. data/lib/jdc/cli/app/push/create.rb +108 -0
  27. data/lib/jdc/cli/app/push/interactions.rb +86 -0
  28. data/lib/jdc/cli/app/push/sync.rb +57 -0
  29. data/lib/jdc/cli/app/push.rb +103 -0
  30. data/lib/jdc/cli/app/rename.rb +35 -0
  31. data/lib/jdc/cli/app/restart.rb +31 -0
  32. data/lib/jdc/cli/app/scale.rb +63 -0
  33. data/lib/jdc/cli/app/start.rb +161 -0
  34. data/lib/jdc/cli/app/stats.rb +67 -0
  35. data/lib/jdc/cli/app/stop.rb +27 -0
  36. data/lib/jdc/cli/domain/base.rb +9 -0
  37. data/lib/jdc/cli/domain/domains.rb +40 -0
  38. data/lib/jdc/cli/domain/map.rb +55 -0
  39. data/lib/jdc/cli/domain/unmap.rb +56 -0
  40. data/lib/jdc/cli/help.rb +15 -0
  41. data/lib/jdc/cli/interactive.rb +105 -0
  42. data/lib/jdc/cli/login_requirements.rb +15 -0
  43. data/lib/jdc/cli/organization/base.rb +14 -0
  44. data/lib/jdc/cli/organization/create.rb +37 -0
  45. data/lib/jdc/cli/organization/delete.rb +63 -0
  46. data/lib/jdc/cli/organization/org.rb +45 -0
  47. data/lib/jdc/cli/organization/orgs.rb +30 -0
  48. data/lib/jdc/cli/organization/rename.rb +37 -0
  49. data/lib/jdc/cli/populators/base.rb +16 -0
  50. data/lib/jdc/cli/populators/organization.rb +32 -0
  51. data/lib/jdc/cli/populators/populator_methods.rb +64 -0
  52. data/lib/jdc/cli/populators/space.rb +33 -0
  53. data/lib/jdc/cli/populators/target.rb +13 -0
  54. data/lib/jdc/cli/route/base.rb +9 -0
  55. data/lib/jdc/cli/route/delete.rb +28 -0
  56. data/lib/jdc/cli/route/map.rb +68 -0
  57. data/lib/jdc/cli/route/routes.rb +26 -0
  58. data/lib/jdc/cli/route/unmap.rb +56 -0
  59. data/lib/jdc/cli/service/base.rb +9 -0
  60. data/lib/jdc/cli/service/bind.rb +44 -0
  61. data/lib/jdc/cli/service/create.rb +159 -0
  62. data/lib/jdc/cli/service/delete.rb +83 -0
  63. data/lib/jdc/cli/service/rename.rb +36 -0
  64. data/lib/jdc/cli/service/service.rb +42 -0
  65. data/lib/jdc/cli/service/service_instance_helper.rb +99 -0
  66. data/lib/jdc/cli/service/services.rb +111 -0
  67. data/lib/jdc/cli/service/unbind.rb +37 -0
  68. data/lib/jdc/cli/space/base.rb +29 -0
  69. data/lib/jdc/cli/space/create.rb +67 -0
  70. data/lib/jdc/cli/space/delete.rb +56 -0
  71. data/lib/jdc/cli/space/rename.rb +38 -0
  72. data/lib/jdc/cli/space/space.rb +66 -0
  73. data/lib/jdc/cli/space/spaces.rb +57 -0
  74. data/lib/jdc/cli/space/switch.rb +19 -0
  75. data/lib/jdc/cli/start/base.rb +41 -0
  76. data/lib/jdc/cli/start/colors.rb +13 -0
  77. data/lib/jdc/cli/start/target.rb +50 -0
  78. data/lib/jdc/cli/start/target_prettifier.rb +17 -0
  79. data/lib/jdc/cli/start/targets.rb +16 -0
  80. data/lib/jdc/cli/user/base.rb +30 -0
  81. data/lib/jdc/cli/user/create.rb +52 -0
  82. data/lib/jdc/cli/user/passwd.rb +37 -0
  83. data/lib/jdc/cli/user/register.rb +43 -0
  84. data/lib/jdc/cli/user/users.rb +32 -0
  85. data/lib/jdc/cli.rb +544 -0
  86. data/lib/jdc/constants.rb +11 -0
  87. data/lib/jdc/errors.rb +19 -0
  88. data/lib/jdc/object_extensions.rb +15 -0
  89. data/lib/jdc/plugin.rb +56 -0
  90. data/lib/jdc/spacing.rb +89 -0
  91. data/lib/jdc/spec_helper.rb +1 -0
  92. data/lib/jdc/test_support.rb +6 -0
  93. data/lib/jdc/version.rb +3 -0
  94. data/lib/jdc.rb +15 -2
  95. data/lib/manifests/errors.rb +35 -0
  96. data/lib/manifests/loader/builder.rb +39 -0
  97. data/lib/manifests/loader/normalizer.rb +145 -0
  98. data/lib/manifests/loader/resolver.rb +79 -0
  99. data/lib/manifests/loader.rb +31 -0
  100. data/lib/manifests/manifests.rb +344 -0
  101. data/lib/manifests/plugin.rb +140 -0
  102. data/lib/micro/README.md +9 -0
  103. data/lib/micro/errors.rb +4 -0
  104. data/lib/{jdc → micro}/micro.rb +15 -15
  105. data/lib/micro/plugin.rb +197 -0
  106. data/lib/micro/switcher/base.rb +79 -0
  107. data/lib/{jdc/micro → micro}/switcher/darwin.rb +5 -3
  108. data/lib/{jdc/micro → micro}/switcher/dummy.rb +1 -1
  109. data/lib/micro/switcher/linux.rb +16 -0
  110. data/lib/{jdc/micro → micro}/switcher/windows.rb +5 -5
  111. data/lib/{jdc/micro → micro}/vmrun.rb +26 -19
  112. data/lib/tasks/gem_release.rake +42 -0
  113. data/lib/tunnel/README.md +29 -0
  114. data/{config → lib/tunnel/config}/clients.yml +2 -2
  115. data/lib/tunnel/helper-app/Gemfile +10 -0
  116. data/lib/tunnel/helper-app/Gemfile.lock +48 -0
  117. data/{caldecott_helper → lib/tunnel/helper-app}/server.rb +5 -5
  118. data/lib/tunnel/plugin.rb +183 -0
  119. data/lib/tunnel/tunnel.rb +295 -0
  120. metadata +319 -89
  121. data/README.md +0 -102
  122. data/config/micro/paths.yml +0 -22
  123. data/config/micro/refresh_ip.rb +0 -20
  124. data/lib/cli/commands/admin.rb +0 -58
  125. data/lib/cli/commands/apps.rb +0 -1129
  126. data/lib/cli/commands/base.rb +0 -228
  127. data/lib/cli/commands/manifest.rb +0 -56
  128. data/lib/cli/commands/micro.rb +0 -115
  129. data/lib/cli/commands/misc.rb +0 -126
  130. data/lib/cli/commands/services.rb +0 -178
  131. data/lib/cli/commands/user.rb +0 -14
  132. data/lib/cli/config.rb +0 -173
  133. data/lib/cli/console_helper.rb +0 -170
  134. data/lib/cli/core_ext.rb +0 -122
  135. data/lib/cli/errors.rb +0 -19
  136. data/lib/cli/frameworks.rb +0 -265
  137. data/lib/cli/manifest_helper.rb +0 -302
  138. data/lib/cli/runner.rb +0 -505
  139. data/lib/cli/services_helper.rb +0 -84
  140. data/lib/cli/tunnel_helper.rb +0 -332
  141. data/lib/cli/usage.rb +0 -86
  142. data/lib/cli/version.rb +0 -7
  143. data/lib/cli/zip_util.rb +0 -77
  144. data/lib/cli.rb +0 -53
  145. data/lib/jdc/client.rb +0 -457
  146. data/lib/jdc/const.rb +0 -25
  147. data/lib/jdc/micro/switcher/base.rb +0 -97
  148. data/lib/jdc/micro/switcher/linux.rb +0 -16
  149. data/lib/jdc/signature/version.rb +0 -27
  150. data/lib/jdc/signer.rb +0 -13
  151. data/lib/jdc/timer.rb +0 -12
@@ -0,0 +1,344 @@
1
+ require "yaml"
2
+ require "set"
3
+ require "jdc/cli/service/create"
4
+
5
+ require "manifests/loader"
6
+
7
+ module JDCManifests
8
+ MANIFEST_FILE = "manifest.yml"
9
+
10
+ @@showed_manifest_usage = false
11
+ @@manifest = nil
12
+
13
+ def manifest
14
+ return @@manifest if @@manifest
15
+
16
+ if manifest_file && File.exists?(manifest_file)
17
+ @@manifest = load_manifest(manifest_file)
18
+ end
19
+ end
20
+
21
+ def save_manifest(save_to = manifest_file)
22
+ fail "No manifest to save!" unless @@manifest
23
+
24
+ File.open(save_to, "w") do |io|
25
+ YAML.dump(@@manifest, io)
26
+ end
27
+ end
28
+
29
+ # find the manifest file to work with
30
+ def manifest_file
31
+ return @manifest_file if @manifest_file
32
+
33
+ unless path = input[:manifest]
34
+ where = Dir.pwd
35
+ while true
36
+ if File.exists?(File.join(where, MANIFEST_FILE))
37
+ path = File.join(where, MANIFEST_FILE)
38
+ break
39
+ elsif File.basename(where) == "/"
40
+ path = nil
41
+ break
42
+ else
43
+ where = File.expand_path("../", where)
44
+ end
45
+ end
46
+ end
47
+
48
+ return unless path
49
+
50
+ @manifest_file = File.expand_path(path)
51
+ end
52
+
53
+ # load and resolve a given manifest file
54
+ def load_manifest(file)
55
+ check_manifest! Loader.new(file, self).manifest
56
+ end
57
+
58
+ def check_manifest!(manifest_hash, output = $stdout)
59
+ manifest_hash[:applications].each{ |app| check_attributes!(app, output) }
60
+ manifest_hash
61
+ end
62
+
63
+ def check_attributes!(app, output = $stdout)
64
+ app.each do |k, v|
65
+ output.puts error_message_for_attribute(k) unless known_manifest_attributes.include? k
66
+ end
67
+ end
68
+
69
+ def error_message_for_attribute(attribute)
70
+ "\e[31mWarning: #{attribute} is not a valid manifest attribute. Please " +
71
+ "remove this attribute from your manifest to get rid of this warning\e[0m"
72
+ end
73
+
74
+ def known_manifest_attributes
75
+ [:applications, :buildpack, :command, :disk, :domain, :env,
76
+ :host, :inherit, :instances, :mem, :memory, :name,
77
+ :path, :properties, :runtime, :services, :stack]
78
+ end
79
+
80
+ # dynamic symbol resolution
81
+ def resolve_symbol(sym)
82
+ case sym
83
+ when "target-url"
84
+ client_target
85
+
86
+ when "target-base"
87
+ target_base
88
+
89
+ when "random-word"
90
+ sprintf("%04x", rand(0x0100000))
91
+
92
+ when /^ask (.+)/
93
+ ask($1)
94
+ end
95
+ end
96
+
97
+ # find apps by an identifier, which may be either a tag, a name, or a path
98
+ def find_apps(identifier)
99
+ return [] unless manifest
100
+
101
+ apps = apps_by(:name, identifier)
102
+
103
+ if apps.empty?
104
+ apps = apps_by(:path, from_manifest(identifier))
105
+ end
106
+
107
+ apps
108
+ end
109
+
110
+ # return all the apps described by the manifest
111
+ def all_apps
112
+ manifest[:applications]
113
+ end
114
+
115
+ def current_apps
116
+ manifest[:applications].select do |app|
117
+ next unless app[:path]
118
+ from_manifest(app[:path]) == Dir.pwd
119
+ end
120
+ end
121
+
122
+ # splits the user's input, resolving paths with the manifest,
123
+ # into internal/external apps
124
+ #
125
+ # internal apps are returned as their data in the manifest
126
+ #
127
+ # external apps are the strings that the user gave, to be
128
+ # passed along wholesale to the wrapped command
129
+ def apps_in_manifest(input = nil, use_name = true, &blk)
130
+ names_or_paths =
131
+ if input.has?(:apps)
132
+ # names may be given but be [], which will still cause
133
+ # interaction, so use #direct instead of #[] here
134
+ input.direct(:apps)
135
+ elsif input.has?(:app)
136
+ [input.direct(:app)]
137
+ elsif input.has?(:name)
138
+ [input.direct(:name)]
139
+ else
140
+ []
141
+ end
142
+
143
+ internal = []
144
+ external = []
145
+
146
+ names_or_paths.each do |x|
147
+ if x.is_a?(String)
148
+ if x =~ %r([/\\])
149
+ apps = find_apps(File.expand_path(x))
150
+
151
+ if apps.empty?
152
+ fail("Path #{b(x)} is not present in manifest #{b(relative_manifest_file)}.")
153
+ end
154
+ else
155
+ apps = find_apps(x)
156
+ end
157
+
158
+ if !apps.empty?
159
+ internal += apps
160
+ else
161
+ external << x
162
+ end
163
+ else
164
+ external << x
165
+ end
166
+ end
167
+
168
+ [internal, external]
169
+ end
170
+
171
+ def create_manifest_for(app, path)
172
+ meta = {
173
+ "name" => app.name,
174
+ "memory" => human_size(app.memory * 1024 * 1024, 0),
175
+ "instances" => app.total_instances,
176
+ "host" => app.host || "none",
177
+ "domain" => app.domain ? app.domain : "none",
178
+ "path" => path
179
+ }
180
+
181
+ services = app.services
182
+
183
+ unless services.empty?
184
+ meta["services"] = {}
185
+
186
+ services.each do |service_instance|
187
+ if service_instance.is_a?(JFoundry::V2::UserProvidedServiceInstance)
188
+ meta["services"][service_instance.name] = {
189
+ "label" => "user-provided",
190
+ "credentials" => service_instance.credentials.stringify_keys,
191
+ }
192
+ else
193
+ service_plan = service_instance.service_plan
194
+ service = service_plan.service
195
+
196
+ meta["services"][service_instance.name] = {
197
+ "label" => service.label,
198
+ "provider" => service.provider,
199
+ "version" => service.version,
200
+ "plan" => service_plan.name
201
+ }
202
+ end
203
+ end
204
+ end
205
+
206
+ if cmd = app.command
207
+ meta["command"] = cmd
208
+ end
209
+
210
+ if buildpack = app.buildpack
211
+ meta["buildpack"] = buildpack
212
+ end
213
+
214
+ meta
215
+ end
216
+
217
+ private
218
+
219
+ def relative_manifest_file
220
+ Pathname.new(manifest_file).relative_path_from(Pathname.pwd)
221
+ end
222
+
223
+ def show_manifest_usage
224
+ return if @@showed_manifest_usage
225
+
226
+ path = relative_manifest_file
227
+ line "Using manifest file #{c(path, :name)}"
228
+ line
229
+
230
+ @@showed_manifest_usage = true
231
+ end
232
+
233
+ def no_apps
234
+ fail "No applications or manifest to operate on."
235
+ end
236
+
237
+ def warn_reset_changes
238
+ line c("Not applying manifest changes without --reset", :warning)
239
+ line "See `jdc diff` for more details."
240
+ line
241
+ end
242
+
243
+ def apps_by(attr, val)
244
+ manifest[:applications].select do |info|
245
+ info[attr] == val
246
+ end
247
+ end
248
+
249
+ # expand a path relative to the manifest file's directory
250
+ def from_manifest(path)
251
+ File.expand_path(path, File.dirname(manifest_file))
252
+ end
253
+
254
+
255
+ def ask_to_save(input, app)
256
+ return if manifest_file
257
+ return unless ask("Save configuration?", :default => false)
258
+
259
+ manifest = create_manifest_for(app, input[:path])
260
+
261
+ with_progress("Saving to #{c("manifest.yml", :name)}") do
262
+ File.open("manifest.yml", "w") do |io|
263
+ YAML.dump(
264
+ { "applications" => [manifest] },
265
+ io)
266
+ end
267
+ end
268
+ end
269
+
270
+ def env_hash(val)
271
+ if val.is_a?(Hash)
272
+ val
273
+ else
274
+ hash = {}
275
+
276
+ val.each do |pair|
277
+ name, val = pair.split("=", 2)
278
+ hash[name] = val
279
+ end
280
+
281
+ hash
282
+ end
283
+ end
284
+
285
+ def setup_env(app, info)
286
+ return unless info[:env]
287
+ app.env = env_hash(info[:env])
288
+ end
289
+
290
+ def setup_services(app, info)
291
+ return if !info[:services] || info[:services].empty?
292
+
293
+ offerings = client.services
294
+
295
+ to_bind = []
296
+
297
+ info[:services].each do |name, svc|
298
+ name = name.to_s
299
+
300
+ if instance = client.service_instance_by_name(name)
301
+ to_bind << instance
302
+ else
303
+ if svc[:label] == "user-provided"
304
+ invoke :create_service,
305
+ name: name,
306
+ offering: JDC::Service::UPDummy.new,
307
+ app: app,
308
+ credentials: svc[:credentials]
309
+ else
310
+ offering = offerings.find { |o|
311
+ o.label == (svc[:label] || svc[:type] || svc[:vendor]) &&
312
+ (!svc[:version] || o.version == svc[:version]) &&
313
+ (o.provider == (svc[:provider] || "core"))
314
+ }
315
+
316
+ fail "Unknown service offering: #{svc.inspect}." unless offering
317
+
318
+ plan = offering.service_plans.find { |p|
319
+ p.name == (svc[:plan] || "D100")
320
+ }
321
+
322
+ fail "Unknown service plan: #{svc[:plan]}." unless plan
323
+
324
+ invoke :create_service,
325
+ :name => name,
326
+ :offering => offering,
327
+ :plan => plan,
328
+ :app => app
329
+ end
330
+ end
331
+ end
332
+
333
+ to_bind.each do |s|
334
+ next if app.binds?(s)
335
+
336
+ # TODO: splat
337
+ invoke :bind_service, :app => app, :service => s
338
+ end
339
+ end
340
+
341
+ def target_base
342
+ client_target.sub(/^[^\.]+\./, "")
343
+ end
344
+ end
@@ -0,0 +1,140 @@
1
+ require "pathname"
2
+ require "jdc/plugin"
3
+ require "manifests/manifests"
4
+
5
+ class ManifestsPlugin < JDC::App::Base
6
+ include JDCManifests
7
+
8
+ def self.default_to_app_from_manifest(command, fail_without_app)
9
+ name_made_optional = change_argument(command, :app, :optional)
10
+ around(command) do |cmd, input|
11
+ wrap_with_optional_name(name_made_optional, cmd, input, fail_without_app)
12
+ end
13
+ end
14
+
15
+ option :manifest, :aliases => "-m", :value => :file, :desc => "Path to manifest file to use"
16
+
17
+
18
+ [:start, :restart, :instances, :logs, :env, :health, :stats, :scale, :app, :stop, :delete, :events].each do |command|
19
+ ::ManifestsPlugin.default_to_app_from_manifest command, true
20
+ end
21
+
22
+ add_input :push, :reset, :desc => "Reset to values in the manifest", :default => false
23
+
24
+ around(:push) do |push, input|
25
+ wrap_push(push, input)
26
+ end
27
+
28
+ private
29
+
30
+ def wrap_with_optional_name(name_made_optional, cmd, input, fail_without_app)
31
+ return cmd.call if input[:all]
32
+
33
+ unless manifest
34
+ # if the command knows how to handle this
35
+ if input.has?(:app) || !name_made_optional || !fail_without_app
36
+ return cmd.call
37
+ else
38
+ return no_apps
39
+ end
40
+ end
41
+
42
+ internal, external = apps_in_manifest(input)
43
+
44
+ return cmd.call if internal.empty? && !external.empty?
45
+
46
+ show_manifest_usage
47
+
48
+ if internal.empty? && external.empty?
49
+ internal = current_apps if internal.empty?
50
+ internal = all_apps if internal.empty?
51
+ end
52
+
53
+ internal = internal.collect { |app| app[:name] }
54
+
55
+ apps = internal + external
56
+ return no_apps if fail_without_app && apps.empty?
57
+
58
+ apps.each.with_index do |app, num|
59
+ line unless quiet? || num == 0
60
+ cmd.call(input.without(:apps).merge_given(:app => app))
61
+ end
62
+ end
63
+
64
+ def apply_changes(app, input)
65
+ app.memory = megabytes(input[:memory]) if input.has?(:memory)
66
+ app.total_instances = input[:instances] if input.has?(:instances)
67
+ app.command = input[:command] if input.has?(:command)
68
+ app.buildpack = input[:buildpack] if input.has?(:buildpack)
69
+ end
70
+
71
+ def wrap_push(push, input)
72
+ unless manifest
73
+ create_and_save_manifest(push, input)
74
+ return
75
+ end
76
+
77
+ line(c("--path is ignored when using a manifest. Please specify the path in the manifest.", :warning)) if input.has?(:path)
78
+
79
+ particular, external = apps_in_manifest(input)
80
+
81
+ unless external.empty?
82
+ fail "Could not find #{b(external.join(", "))}' in the manifest."
83
+ end
84
+
85
+ apps = particular.empty? ? all_apps : particular
86
+
87
+ show_manifest_usage
88
+
89
+ spaced(apps) do |app_manifest|
90
+ push_with_manifest(app_manifest, push, input)
91
+ end
92
+ end
93
+
94
+ def push_with_manifest(app_manifest, push, input)
95
+ with_filters(
96
+ :push => {
97
+ :create_app => proc { |a|
98
+ setup_env(a, app_manifest)
99
+ a
100
+ },
101
+ :push_app => proc { |a|
102
+ setup_services(a, app_manifest)
103
+ a
104
+ }
105
+ }) do
106
+ app_input = push_input_for(app_manifest, input)
107
+
108
+ push.call(app_input)
109
+ end
110
+ end
111
+
112
+ def push_input_for(app_manifest, input)
113
+ existing_app = client.app_by_name(app_manifest[:name])
114
+ rebased_input = input.rebase_given(app_manifest)
115
+
116
+ if !existing_app || input[:reset]
117
+ input = rebased_input
118
+ else
119
+ warn_reset_changes if manifest_differs?(existing_app, rebased_input)
120
+ end
121
+
122
+ input.merge(
123
+ :path => from_manifest(app_manifest[:path]),
124
+ :name => app_manifest[:name],
125
+ :bind_services => false,
126
+ :create_services => false)
127
+ end
128
+
129
+ def manifest_differs?(app, input)
130
+ apply_changes(app, input)
131
+ app.changed?
132
+ end
133
+
134
+ def create_and_save_manifest(push, input)
135
+ with_filters(
136
+ :push => { :push_app => proc { |a| ask_to_save(input, a); a } }) do
137
+ push.call
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,9 @@
1
+ ### Info
2
+ This plugin allows you to manage your Micro Jing Dong Foundry VM.
3
+
4
+ ### Usage
5
+ ```
6
+ micro-status VMX [PASSWORD] Display Micro Jing Dong Foundry VM status
7
+ micro-offline VMX [PASSWORD] Micro Jing Dong Foundry offline mode
8
+ micro-online VMX [PASSWORD] Micro Jing Dong Foundry online mode
9
+ ```
@@ -0,0 +1,4 @@
1
+ module JDCMicro
2
+ class MCFError < RuntimeError
3
+ end
4
+ end
@@ -1,32 +1,32 @@
1
1
  require 'find'
2
+ require "micro/errors"
2
3
 
3
- module JDC::Micro
4
+ module JDCMicro
4
5
  def config_file(file)
5
- File.join(File.dirname(__FILE__), '..', '..', 'config', 'micro', file)
6
+ File.expand_path("../../../../config/#{file}", __FILE__)
6
7
  end
7
8
 
8
9
  def escape_path(path)
9
10
  path = File.expand_path(path)
10
11
  if RUBY_PLATFORM =~ /mingw|mswin32|cygwin/
11
12
  if path.include?(' ')
12
- return '"' + path + '"'
13
+ '"' + path + '"'
13
14
  else
14
- return path
15
+ path
15
16
  end
16
17
  else
17
- return path.gsub(' ', '\ ')
18
+ path.gsub(' ', '\ ')
18
19
  end
19
20
  end
20
21
 
21
22
  def locate_file(file, directory, search_paths)
22
23
  search_paths.each do |path|
23
24
  expanded_path = File.expand_path(path)
24
- if File.exists?(expanded_path)
25
- Find.find(expanded_path) do |current|
26
- if File.directory?(current) && current.include?(directory)
27
- full_path = File.join(current, file)
28
- return self.escape_path(full_path) if File.exists?(full_path)
29
- end
25
+ next unless File.exists?(expanded_path)
26
+ Find.find(expanded_path) do |current|
27
+ if File.directory?(current) && current.include?(directory)
28
+ full_path = File.join(current, file)
29
+ return escape_path(full_path) if File.exists?(full_path)
30
30
  end
31
31
  end
32
32
  end
@@ -37,14 +37,14 @@ module JDC::Micro
37
37
  def run_command(command, args=nil)
38
38
  # TODO switch to using posix-spawn instead
39
39
  result = %x{#{command} #{args} 2>&1}
40
- unless $?.exitstatus == 0
40
+ if $?.exitstatus == 0
41
+ result.split(/\n/)
42
+ else
41
43
  if block_given?
42
44
  yield
43
45
  else
44
- raise "failed to execute #{command} #{args}:\n#{result}"
46
+ raise JDCMicro::MCFError, "failed to execute #{command} #{args}:\n#{result}"
45
47
  end
46
- else
47
- result.split(/\n/)
48
48
  end
49
49
  end
50
50