leap_cli 1.5.6 → 1.6.2

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 (62) hide show
  1. data/bin/leap +29 -6
  2. data/lib/leap/platform.rb +36 -1
  3. data/lib/leap_cli/commands/ca.rb +97 -20
  4. data/lib/leap_cli/commands/compile.rb +49 -8
  5. data/lib/leap_cli/commands/db.rb +13 -4
  6. data/lib/leap_cli/commands/deploy.rb +138 -29
  7. data/lib/leap_cli/commands/env.rb +76 -0
  8. data/lib/leap_cli/commands/facts.rb +10 -3
  9. data/lib/leap_cli/commands/inspect.rb +2 -2
  10. data/lib/leap_cli/commands/list.rb +10 -10
  11. data/lib/leap_cli/commands/node.rb +7 -132
  12. data/lib/leap_cli/commands/node_init.rb +169 -0
  13. data/lib/leap_cli/commands/pre.rb +4 -27
  14. data/lib/leap_cli/commands/ssh.rb +152 -0
  15. data/lib/leap_cli/commands/test.rb +22 -13
  16. data/lib/leap_cli/commands/user.rb +12 -4
  17. data/lib/leap_cli/commands/vagrant.rb +4 -4
  18. data/lib/leap_cli/config/filter.rb +175 -0
  19. data/lib/leap_cli/config/manager.rb +130 -61
  20. data/lib/leap_cli/config/node.rb +32 -0
  21. data/lib/leap_cli/config/object.rb +69 -44
  22. data/lib/leap_cli/config/object_list.rb +44 -39
  23. data/lib/leap_cli/config/secrets.rb +24 -12
  24. data/lib/leap_cli/config/tag.rb +7 -0
  25. data/lib/{core_ext → leap_cli/core_ext}/boolean.rb +0 -0
  26. data/lib/{core_ext → leap_cli/core_ext}/hash.rb +0 -0
  27. data/lib/{core_ext → leap_cli/core_ext}/json.rb +0 -0
  28. data/lib/{core_ext → leap_cli/core_ext}/nil.rb +0 -0
  29. data/lib/{core_ext → leap_cli/core_ext}/string.rb +0 -0
  30. data/lib/leap_cli/core_ext/yaml.rb +29 -0
  31. data/lib/leap_cli/exceptions.rb +24 -0
  32. data/lib/leap_cli/leapfile.rb +60 -10
  33. data/lib/{lib_ext → leap_cli/lib_ext}/capistrano_connections.rb +0 -0
  34. data/lib/{lib_ext → leap_cli/lib_ext}/gli.rb +0 -0
  35. data/lib/leap_cli/log.rb +1 -1
  36. data/lib/leap_cli/logger.rb +18 -1
  37. data/lib/leap_cli/markdown_document_listener.rb +1 -1
  38. data/lib/leap_cli/override/json.rb +11 -0
  39. data/lib/leap_cli/path.rb +20 -6
  40. data/lib/leap_cli/remote/leap_plugin.rb +2 -2
  41. data/lib/leap_cli/remote/puppet_plugin.rb +1 -1
  42. data/lib/leap_cli/remote/rsync_plugin.rb +1 -1
  43. data/lib/leap_cli/remote/tasks.rb +1 -1
  44. data/lib/leap_cli/ssh_key.rb +63 -1
  45. data/lib/leap_cli/util/remote_command.rb +19 -2
  46. data/lib/leap_cli/util/secret.rb +1 -1
  47. data/lib/leap_cli/util/x509.rb +3 -2
  48. data/lib/leap_cli/util.rb +11 -3
  49. data/lib/leap_cli/version.rb +2 -2
  50. data/lib/leap_cli.rb +24 -14
  51. data/vendor/certificate_authority/lib/certificate_authority/certificate.rb +85 -29
  52. data/vendor/certificate_authority/lib/certificate_authority/distinguished_name.rb +5 -0
  53. data/vendor/certificate_authority/lib/certificate_authority/extensions.rb +406 -41
  54. data/vendor/certificate_authority/lib/certificate_authority/key_material.rb +0 -34
  55. data/vendor/certificate_authority/lib/certificate_authority/serial_number.rb +6 -0
  56. data/vendor/certificate_authority/lib/certificate_authority/signing_request.rb +36 -1
  57. metadata +25 -24
  58. data/lib/leap_cli/commands/shell.rb +0 -89
  59. data/lib/leap_cli/config/macros.rb +0 -430
  60. data/lib/leap_cli/constants.rb +0 -7
  61. data/lib/leap_cli/requirements.rb +0 -19
  62. data/lib/lib_ext/markdown_document_listener.rb +0 -122
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,29 @@
1
+ class Object
2
+ #
3
+ # ya2yaml will output hash keys in sorted order, but it outputs arrays
4
+ # in natural order. This new method, sorted_ya2yaml(), is the same as
5
+ # ya2yaml but ensures that arrays are sorted.
6
+ #
7
+ # This is important so that the .yaml files don't change each time you recompile.
8
+ #
9
+ # see https://github.com/afunai/ya2yaml/blob/master/lib/ya2yaml.rb
10
+ #
11
+ def sorted_ya2yaml(options = {})
12
+ # modify array
13
+ Array.class_eval do
14
+ alias_method :collect_without_sort, :collect
15
+ def collect(&block)
16
+ sorted = sort {|a,b| a.to_s <=> b.to_s}
17
+ sorted.collect_without_sort(&block)
18
+ end
19
+ end
20
+
21
+ # generate yaml
22
+ yaml_str = self.ya2yaml(options)
23
+
24
+ # restore array
25
+ Array.class_eval {alias_method :collect, :collect_without_sort}
26
+
27
+ return yaml_str
28
+ end
29
+ end
@@ -6,6 +6,30 @@ module LeapCli
6
6
  @node = node
7
7
  super(msg)
8
8
  end
9
+ def log
10
+ Util.log(0, :error, "in node `#{@node.name}`: " + self.message)
11
+ end
12
+ end
13
+
14
+ class FileMissing < StandardError
15
+ attr_accessor :path, :options
16
+ def initialize(path, options={})
17
+ @path = path
18
+ @options = options
19
+ end
20
+ def to_s
21
+ @path
22
+ end
23
+ end
24
+
25
+ class AssertionFailed < StandardError
26
+ attr_accessor :assertion
27
+ def initialize(assertion)
28
+ @assertion = assertion
29
+ end
30
+ def to_s
31
+ @assertion
32
+ end
9
33
  end
10
34
 
11
35
  end
@@ -16,13 +16,28 @@ module LeapCli
16
16
  attr_accessor :leap_version
17
17
  attr_accessor :log
18
18
  attr_accessor :vagrant_network
19
- attr_accessor :platform_branch
20
- attr_accessor :allow_production_deploy
19
+ attr_accessor :environment
21
20
 
22
21
  def initialize
23
22
  @vagrant_network = '10.5.5.0/24'
24
23
  end
25
24
 
25
+ #
26
+ # The way the Leapfile handles pinning of environment (self.environment) is a little tricky.
27
+ # If self.environment is nil, then there is no pin. If self.environment is 'default', then
28
+ # there is a pin to the default environment. The problem is that an environment of nil
29
+ # is used to indicate the default environment in node properties.
30
+ #
31
+ # This method returns the environment tag as needed when filtering nodes.
32
+ #
33
+ def environment_filter
34
+ if self.environment == 'default'
35
+ nil
36
+ else
37
+ self.environment
38
+ end
39
+ end
40
+
26
41
  def load(search_directory=nil)
27
42
  directory = File.expand_path(find_in_directory_tree('Leapfile', search_directory))
28
43
  if directory == '/'
@@ -33,7 +48,7 @@ module LeapCli
33
48
  #
34
49
  @provider_directory_path = directory
35
50
  read_settings(directory + '/Leapfile')
36
- read_settings(ENV['HOME'] + '/.leaprc')
51
+ read_settings(leaprc_path)
37
52
  @platform_directory_path = File.expand_path(@platform_directory_path || '../leap_platform', @provider_directory_path)
38
53
 
39
54
  #
@@ -51,20 +66,55 @@ module LeapCli
51
66
  "You need platform version #{LeapCli::COMPATIBLE_PLATFORM_VERSION.first} to #{LeapCli::COMPATIBLE_PLATFORM_VERSION.last}."
52
67
  end
53
68
 
54
- #
55
- # set defaults
56
- #
57
- if @allow_production_deploy.nil?
58
- # by default, only allow production deploys from 'master' or if not a git repo
59
- @allow_production_deploy = !LeapCli::Util.is_git_directory?(@provider_directory_path) ||
60
- LeapCli::Util.current_git_branch(@provider_directory_path) == 'master'
69
+ unless @allow_production_deploy.nil?
70
+ Util::log 0, :warning, "in Leapfile: @allow_production_deploy is no longer supported."
71
+ end
72
+ unless @platform_branch.nil?
73
+ Util::log 0, :warning, "in Leapfile: @platform_branch is no longer supported."
61
74
  end
62
75
  return true
63
76
  end
64
77
  end
65
78
 
79
+ def set(property, value)
80
+ edit_leaprc(property, value)
81
+ end
82
+
83
+ def unset(property)
84
+ edit_leaprc(property)
85
+ end
86
+
66
87
  private
67
88
 
89
+ #
90
+ # adds or removes a line to .leaprc for this particular provider directory.
91
+ # if value is nil, the line is removed. if not nil, it is added or replaced.
92
+ #
93
+ def edit_leaprc(property, value=nil)
94
+ file_path = leaprc_path
95
+ lines = []
96
+ if File.exists?(file_path)
97
+ regexp = /self\.#{Regexp.escape(property)} = .*? if @provider_directory_path == '#{Regexp.escape(@provider_directory_path)}'/
98
+ File.readlines(file_path).each do |line|
99
+ unless line =~ regexp
100
+ lines << line
101
+ end
102
+ end
103
+ end
104
+ unless value.nil?
105
+ lines << "self.#{property} = #{value.inspect} if @provider_directory_path == '#{@provider_directory_path}'\n"
106
+ end
107
+ File.open(file_path, 'w') do |f|
108
+ f.write(lines.join)
109
+ end
110
+ rescue Errno::EACCES, IOError => exc
111
+ Util::bail! :error, "trying to save ~/.leaprc (#{exc})."
112
+ end
113
+
114
+ def leaprc_path
115
+ File.join(ENV['HOME'], '.leaprc')
116
+ end
117
+
68
118
  def read_settings(file)
69
119
  if File.exists? file
70
120
  Util::log 2, :read, file
File without changes
data/lib/leap_cli/log.rb CHANGED
@@ -15,7 +15,7 @@ module LeapCli
15
15
  def log_level
16
16
  @log_level ||= 1
17
17
  end
18
- def log_level=(value)
18
+ def set_log_level(value)
19
19
  @log_level = value
20
20
  end
21
21
 
@@ -84,6 +84,19 @@ module LeapCli
84
84
  ## FORMATTING
85
85
  ##
86
86
 
87
+ #
88
+ # options for formatters:
89
+ #
90
+ # :match => regexp for matching a log line
91
+ # :color => what color the line should be
92
+ # :style => what style the line should be
93
+ # :priority => what order the formatters are applied in. higher numbers first.
94
+ # :match_level => only apply filter at the specified log level
95
+ # :level => make this line visible at this log level or higher
96
+ # :replace => replace the matched text
97
+ # :exit => force the exit code to be this (does not interrupt program, just
98
+ # ensures a specific exit code when the program eventually exits)
99
+ #
87
100
  @formatters = [
88
101
  # TRACE
89
102
  { :match => /command finished/, :color => :white, :style => :dim, :match_level => 3, :priority => -10 },
@@ -138,8 +151,12 @@ module LeapCli
138
151
  # TESTS
139
152
  { :match => /^PASS: /, :color => :green, :priority => -20},
140
153
  { :match => /^(FAIL|ERROR): /, :color => :red, :priority => -20},
141
- { :match => /^SKIP: /, :color => :yellow, :priority => -20}
154
+ { :match => /^(SKIP|WARN): /, :color => :yellow, :priority => -20},
155
+ { :match => /\d+ tests: \d+ passes, \d+ skips, 0 warnings, 0 failures, 0 errors/, :color => :blue, :priority => -20},
142
156
 
157
+ # LOG SUPPRESSION
158
+ { :match => /^warning: You cannot collect without storeconfigs being set/, :level => 2, :priority => 10},
159
+ { :match => /^warning: You cannot collect exported resources without storeconfigs being set/, :level => 2, :priority => 10}
143
160
  ]
144
161
 
145
162
  def self.sorted_formatters
@@ -11,7 +11,7 @@ require 'gli/commands/help_modules/arg_name_formatter'
11
11
  module LeapCli
12
12
  class MarkdownDocumentListener
13
13
 
14
- def initialize(global_options,options,arguments)
14
+ def initialize(global_options,options,arguments,app)
15
15
  @io = File.new(File.basename($0) + ".md",'w')
16
16
  @nest = ''
17
17
  @commands = [File.basename($0)]
@@ -0,0 +1,11 @@
1
+ #
2
+ # This exists solely to prevent other gems we depend on from
3
+ # importing json/ext (e.g. require 'json').
4
+ #
5
+ # If json/ext is imported, json/pure cannot work, and we heavily
6
+ # rely on the specific behavior of json/pure.
7
+ #
8
+ # This trick only works if this directory is early in the
9
+ # include path.
10
+ #
11
+ require 'json/pure'
data/lib/leap_cli/path.rb CHANGED
@@ -26,15 +26,29 @@ module LeapCli; module Path
26
26
  end
27
27
 
28
28
  #
29
- # tries to find a file somewhere
29
+ # Tries to find a file somewhere.
30
+ # Path can be a named path or a relative path.
31
+ #
32
+ # relative paths are checked against
33
+ # provider/<path>
34
+ # provider/files/<path>
35
+ # provider_base/<path>
36
+ # provider_base/files/<path>
37
+ #
30
38
  #
31
39
  def self.find_file(arg)
32
40
  [Path.provider, Path.provider_base].each do |base|
33
- file_path = named_path(arg, base)
34
- return file_path if File.exists?(file_path)
35
- if arg.is_a? String
36
- file_path = base + '/files/' + arg
37
- return file_path if File.exists?(file_path)
41
+ if arg.is_a?(Symbol) || arg.is_a?(Array)
42
+ named_path(arg, base).tap {|path|
43
+ return path if File.exists?(path)
44
+ }
45
+ else
46
+ File.join(base, arg).tap {|path|
47
+ return path if File.exists?(path)
48
+ }
49
+ File.join(base, 'files', arg).tap {|path|
50
+ return path if File.exists?(path)
51
+ }
38
52
  end
39
53
  end
40
54
  return nil
@@ -26,7 +26,7 @@ module LeapCli; module Remote; module LeapPlugin
26
26
  #
27
27
  def assert_initialized
28
28
  begin
29
- test_initialized_file = "test -f #{INITIALIZED_FILE}"
29
+ test_initialized_file = "test -f #{Leap::Platform.init_path}"
30
30
  check_required_packages = "! dpkg-query -W --showformat='${Status}\n' #{required_packages} 2>&1 | grep -q -E '(deinstall|no packages)'"
31
31
  run "#{test_initialized_file} && #{check_required_packages} && echo ok"
32
32
  rescue Capistrano::CommandError => exc
@@ -57,7 +57,7 @@ module LeapCli; module Remote; module LeapPlugin
57
57
  end
58
58
 
59
59
  def mark_initialized
60
- run "touch #{INITIALIZED_FILE}"
60
+ run "touch #{Leap::Platform.init_path}"
61
61
  end
62
62
 
63
63
  #
@@ -6,7 +6,7 @@
6
6
  module LeapCli; module Remote; module PuppetPlugin
7
7
 
8
8
  def apply(options)
9
- run "#{PUPPET_DESTINATION}/bin/puppet_command set_hostname apply #{flagize(options)}"
9
+ run "#{Leap::Platform.leap_dir}/bin/puppet_command set_hostname apply #{flagize(options)}"
10
10
  end
11
11
 
12
12
  private
@@ -3,7 +3,7 @@
3
3
  # (see RemoteCommand::new_capistrano)
4
4
  #
5
5
 
6
- require 'rsync_command'
6
+ autoload :RsyncCommand, 'rsync_command'
7
7
 
8
8
  module LeapCli; module Remote; module RsyncPlugin
9
9
 
@@ -34,7 +34,7 @@ BAD_APT_GET_UPDATE = /(BADSIG|NO_PUBKEY|KEYEXPIRED|REVKEYSIG|NODATA)/
34
34
 
35
35
  task :install_prerequisites, :max_hosts => MAX_HOSTS do
36
36
  apt_get = "DEBIAN_FRONTEND=noninteractive apt-get -q -y -o DPkg::Options::=--force-confold"
37
- leap.mkdirs LeapCli::PUPPET_DESTINATION
37
+ leap.mkdirs Leap::Platform.leap_dir
38
38
  run "echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen"
39
39
  leap.log :updating, "package list" do
40
40
  run "apt-get update" do |channel, stream, data|
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # A wrapper around OpenSSL::PKey::RSA instances to provide a better api for dealing with SSH keys.
3
3
  #
4
+ # cipher 'ssh-ed25519' not supported yet because we are waiting for support in Net::SSH
4
5
  #
5
6
 
6
7
  require 'net/ssh'
@@ -13,6 +14,10 @@ module LeapCli
13
14
  attr_accessor :filename
14
15
  attr_accessor :comment
15
16
 
17
+ # supported ssh key types, in order of preference
18
+ SUPPORTED_TYPES = ['ssh-rsa', 'ecdsa-sha2-nistp256']
19
+ SUPPORTED_TYPES_RE = /(#{SUPPORTED_TYPES.join('|')})/
20
+
16
21
  ##
17
22
  ## CLASS METHODS
18
23
  ##
@@ -33,6 +38,7 @@ module LeapCli
33
38
  end
34
39
  end
35
40
  return key
41
+ rescue StandardError => exc
36
42
  end
37
43
 
38
44
  def self.load_from_file(filename)
@@ -63,6 +69,61 @@ module LeapCli
63
69
  public_key || private_key
64
70
  end
65
71
 
72
+ #
73
+ # Picks one key out of an array of keys that we think is the "best",
74
+ # based on the order of preference in SUPPORTED_TYPES
75
+ #
76
+ # Currently, this does not take bitsize into account.
77
+ #
78
+ def self.pick_best_key(keys)
79
+ keys.select {|k|
80
+ SUPPORTED_TYPES.include?(k.type)
81
+ }.sort {|a,b|
82
+ SUPPORTED_TYPES.index(a.type) <=> SUPPORTED_TYPES.index(b.type)
83
+ }.first
84
+ end
85
+
86
+ #
87
+ # takes a string with one or more ssh keys, one key per line,
88
+ # and returns an array of SshKey objects.
89
+ #
90
+ # the lines should be in one of these formats:
91
+ #
92
+ # 1. <hostname> <key-type> <key>
93
+ # 2. <key-type> <key>
94
+ #
95
+ def self.parse_keys(string)
96
+ keys = []
97
+ lines = string.split("\n").grep(/^[^#]/)
98
+ lines.each do |line|
99
+ if line =~ / #{SshKey::SUPPORTED_TYPES_RE} /
100
+ # <hostname> <key-type> <key>
101
+ keys << line.split(' ')[1..2]
102
+ elsif line =~ /^#{SshKey::SUPPORTED_TYPES_RE} /
103
+ # <key-type> <key>
104
+ keys << line.split(' ')
105
+ end
106
+ end
107
+ return keys.map{|k| SshKey.load(k[1], k[0])}
108
+ end
109
+
110
+ #
111
+ # takes a string with one or more ssh keys, one key per line,
112
+ # and returns a string that specified the ssh key algorithms
113
+ # that are supported by the keys, in order of preference.
114
+ #
115
+ # eg: ecdsa-sha2-nistp256,ssh-rsa,ssh-ed25519
116
+ #
117
+ def self.supported_host_key_algorithms(string)
118
+ if string
119
+ self.parse_keys(string).map {|key|
120
+ key.type
121
+ }.join(',')
122
+ else
123
+ ""
124
+ end
125
+ end
126
+
66
127
  ##
67
128
  ## INSTANCE METHODS
68
129
  ##
@@ -100,7 +161,8 @@ module LeapCli
100
161
  end
101
162
 
102
163
  def summary
103
- "%s %s %s (%s)" % [self.type, self.bits, self.fingerprint, self.filename || self.comment || '']
164
+ #"%s %s %s (%s)" % [self.type, self.bits, self.fingerprint, self.filename || self.comment || '']
165
+ "%s %s %s" % [self.type, self.bits, self.fingerprint]
104
166
  end
105
167
 
106
168
  def to_s
@@ -78,10 +78,24 @@ module LeapCli; module Util; module RemoteCommand
78
78
  :keys_only => false, # Don't you dare change this.
79
79
  :global_known_hosts_file => path(:known_hosts),
80
80
  :user_known_hosts_file => '/dev/null',
81
- :paranoid => true
81
+ :paranoid => true,
82
+ :verbose => net_ssh_log_level
82
83
  }
83
84
  end
84
85
 
86
+ def net_ssh_log_level
87
+ if DEBUG
88
+ case LeapCli.log_level
89
+ when 1 then 3
90
+ when 2 then 2
91
+ when 3 then 1
92
+ else 0
93
+ end
94
+ else
95
+ nil
96
+ end
97
+ end
98
+
85
99
  #
86
100
  # For notes on advanced ways to set server-specific options, see
87
101
  # http://railsware.com/blog/2011/11/02/advanced-server-definitions-in-capistrano/
@@ -106,7 +120,7 @@ module LeapCli; module Util; module RemoteCommand
106
120
  @capistrano_enabled ||= begin
107
121
  require 'capistrano'
108
122
  require 'capistrano/cli'
109
- require 'lib_ext/capistrano_connections'
123
+ require 'leap_cli/lib_ext/capistrano_connections'
110
124
  require 'leap_cli/remote/leap_plugin'
111
125
  require 'leap_cli/remote/puppet_plugin'
112
126
  require 'leap_cli/remote/rsync_plugin'
@@ -135,6 +149,9 @@ module LeapCli; module Util; module RemoteCommand
135
149
  opts[:verbose] = :error # suppress all the warnings about adding host keys to known_hosts, since it is not actually doing that.
136
150
  end
137
151
  end
152
+ if !node.supported_ssh_host_key_algorithms.empty?
153
+ opts[:host_key] = node.supported_ssh_host_key_algorithms
154
+ end
138
155
  return opts
139
156
  end
140
157
 
@@ -4,7 +4,7 @@
4
4
  #
5
5
  # Uses OpenSSL random number generator instead of Ruby's rand function
6
6
  #
7
- require 'openssl'
7
+ autoload :OpenSSL, 'openssl'
8
8
 
9
9
  module LeapCli; module Util
10
10
  class Secret
@@ -1,5 +1,6 @@
1
- require 'openssl'
2
- require 'certificate_authority'
1
+ autoload :OpenSSL, 'openssl'
2
+ autoload :CertificateAuthority, 'certificate_authority'
3
+
3
4
  require 'digest'
4
5
  require 'digest/md5'
5
6
  require 'digest/sha1'
data/lib/leap_cli/util.rb CHANGED
@@ -8,13 +8,21 @@ module LeapCli
8
8
  module Util
9
9
  extend self
10
10
 
11
+ @@exit_status = nil
12
+
11
13
  ##
12
14
  ## QUITTING
13
15
  ##
14
16
 
15
17
  def exit_status(code=nil)
16
- @exit_status = code if code
17
- @exit_status
18
+ if !code.nil?
19
+ if code == 0 && @@exit_status.nil?
20
+ @@exit_status = 0
21
+ else
22
+ @@exit_status = code
23
+ end
24
+ end
25
+ @@exit_status
18
26
  end
19
27
 
20
28
  #
@@ -30,7 +38,7 @@ module LeapCli
30
38
  #
31
39
  def bail!(*message)
32
40
  if block_given?
33
- LeapCli.log_level = 3
41
+ LeapCli.set_log_level(3)
34
42
  yield
35
43
  elsif message
36
44
  log 0, *message
@@ -1,7 +1,7 @@
1
1
  module LeapCli
2
2
  unless defined?(LeapCli::VERSION)
3
- VERSION = '1.5.6'
4
- COMPATIBLE_PLATFORM_VERSION = '0.5.2'..'1.99'
3
+ VERSION = '1.6.2'
4
+ COMPATIBLE_PLATFORM_VERSION = '0.6.0'..'1.99'
5
5
  SUMMARY = 'Command line interface to the LEAP platform'
6
6
  DESCRIPTION = 'The command "leap" can be used to manage a bevy of servers running the LEAP platform from the comfort of your own home.'
7
7
  LOAD_PATHS = ['lib', 'vendor/certificate_authority/lib', 'vendor/rsync_command/lib']
data/lib/leap_cli.rb CHANGED
@@ -1,20 +1,31 @@
1
- module LeapCli; end
1
+ module LeapCli
2
+ module Commands; end # for commands in leap_cli/commands
3
+ module Macro; end # for macros in leap_platform/provider_base/lib/macros
4
+ end
2
5
 
3
6
  $ruby_version = RUBY_VERSION.split('.').collect{ |i| i.to_i }.extend(Comparable)
4
7
 
5
- require 'leap/platform.rb'
8
+ # ensure lib/leap_cli/overrides has the highest priority
9
+ $:.unshift(File.expand_path('../leap_cli/override',__FILE__))
10
+
11
+ # for a few gems, things will break if using earlier versions.
12
+ # enforce the compatible versions here:
13
+ require 'rubygems'
14
+ gem 'net-ssh', '~> 2.7.0'
15
+ gem 'gli', '~> 2.12.0'
6
16
 
7
- require 'leap_cli/version.rb'
8
- require 'leap_cli/constants.rb'
9
- require 'leap_cli/requirements.rb'
10
- require 'leap_cli/exceptions.rb'
17
+ require 'leap/platform'
11
18
 
12
- require 'leap_cli/leapfile.rb'
13
- require 'core_ext/hash'
14
- require 'core_ext/boolean'
15
- require 'core_ext/nil'
16
- require 'core_ext/string'
17
- require 'core_ext/json'
19
+ require 'leap_cli/version'
20
+ require 'leap_cli/exceptions'
21
+
22
+ require 'leap_cli/leapfile'
23
+ require 'leap_cli/core_ext/hash'
24
+ require 'leap_cli/core_ext/boolean'
25
+ require 'leap_cli/core_ext/nil'
26
+ require 'leap_cli/core_ext/string'
27
+ require 'leap_cli/core_ext/json'
28
+ require 'leap_cli/core_ext/yaml'
18
29
 
19
30
  require 'leap_cli/log'
20
31
  require 'leap_cli/path'
@@ -31,12 +42,11 @@ require 'leap_cli/config/tag'
31
42
  require 'leap_cli/config/provider'
32
43
  require 'leap_cli/config/secrets'
33
44
  require 'leap_cli/config/object_list'
45
+ require 'leap_cli/config/filter'
34
46
  require 'leap_cli/config/manager'
35
47
 
36
48
  require 'leap_cli/markdown_document_listener'
37
49
 
38
- module LeapCli::Commands; end
39
-
40
50
  #
41
51
  # allow everyone easy access to log() command.
42
52
  #