leap_cli 1.7.4 → 1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/leap +6 -13
- data/lib/leap/platform.rb +2 -0
- data/lib/leap_cli.rb +2 -1
- data/lib/leap_cli/bootstrap.rb +197 -0
- data/lib/leap_cli/commands/common.rb +61 -0
- data/lib/leap_cli/commands/new.rb +5 -1
- data/lib/leap_cli/commands/pre.rb +1 -66
- data/lib/leap_cli/config/environment.rb +180 -0
- data/lib/leap_cli/config/manager.rb +100 -197
- data/lib/leap_cli/config/node.rb +2 -2
- data/lib/leap_cli/config/object.rb +56 -43
- data/lib/leap_cli/config/object_list.rb +6 -3
- data/lib/leap_cli/config/provider.rb +11 -0
- data/lib/leap_cli/config/secrets.rb +14 -1
- data/lib/leap_cli/config/tag.rb +2 -2
- data/lib/leap_cli/leapfile.rb +1 -0
- data/lib/leap_cli/log.rb +1 -0
- data/lib/leap_cli/logger.rb +16 -12
- data/lib/leap_cli/markdown_document_listener.rb +3 -1
- data/lib/leap_cli/path.rb +12 -0
- data/lib/leap_cli/remote/leap_plugin.rb +9 -34
- data/lib/leap_cli/remote/puppet_plugin.rb +0 -40
- data/lib/leap_cli/remote/tasks.rb +9 -34
- data/lib/leap_cli/ssh_key.rb +5 -2
- data/lib/leap_cli/version.rb +2 -2
- metadata +5 -18
- data/lib/leap_cli/commands/ca.rb +0 -518
- data/lib/leap_cli/commands/clean.rb +0 -16
- data/lib/leap_cli/commands/compile.rb +0 -340
- data/lib/leap_cli/commands/db.rb +0 -65
- data/lib/leap_cli/commands/deploy.rb +0 -368
- data/lib/leap_cli/commands/env.rb +0 -76
- data/lib/leap_cli/commands/facts.rb +0 -100
- data/lib/leap_cli/commands/inspect.rb +0 -144
- data/lib/leap_cli/commands/list.rb +0 -132
- data/lib/leap_cli/commands/node.rb +0 -165
- data/lib/leap_cli/commands/node_init.rb +0 -169
- data/lib/leap_cli/commands/ssh.rb +0 -220
- data/lib/leap_cli/commands/test.rb +0 -74
- data/lib/leap_cli/commands/user.rb +0 -136
- data/lib/leap_cli/commands/util.rb +0 -50
- data/lib/leap_cli/commands/vagrant.rb +0 -197
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1517e12ad3324944287a8639f98cc6783c1945c
|
4
|
+
data.tar.gz: d7357d37b347982b7ea5b08f0e26fd9b30c8bc80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c650e4c2ce659cebd34582d7873d4d553ba948ca021751642082d65e22b2367c863f5fb2e2cc95314e3e2f5f11aece4d01e325655218fbb09734f0b69a463a8b
|
7
|
+
data.tar.gz: 2db42b92689dea62189b5a4b801f68e3d93205bb41e5a7a333d659d117a96d4a7ec0d23400a0558b5f997769c748a140e971cf15f2e204812527712d1d61cc11
|
data/bin/leap
CHANGED
@@ -11,11 +11,11 @@ if ARGV.include?('--debug') || ARGV.include?('-d')
|
|
11
11
|
rescue LoadError
|
12
12
|
end
|
13
13
|
else
|
14
|
+
$VERBOSE=nil
|
14
15
|
DEBUG=false
|
15
16
|
end
|
16
17
|
|
17
18
|
LEAP_CLI_BASE_DIR = File.expand_path('..', File.dirname(File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__))
|
18
|
-
ORIGINAL_ARGV = ARGV.dup
|
19
19
|
|
20
20
|
begin
|
21
21
|
# First, try to load the leap_cli code that is local to this `leap` command.
|
@@ -74,17 +74,13 @@ module LeapCli::Commands
|
|
74
74
|
program_desc LeapCli::SUMMARY
|
75
75
|
program_long_desc LeapCli::DESCRIPTION
|
76
76
|
|
77
|
+
LeapCli::Bootstrap::setup(ARGV)
|
78
|
+
|
77
79
|
# handle --version ourselves (and not GLI)
|
78
80
|
if ARGV.grep(/--version/).any?
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
initialize_leap_cli(false, {:verbose => 2})
|
83
|
-
rescue StandardError => exc
|
84
|
-
puts exc.to_s
|
85
|
-
raise exc if DEBUG
|
86
|
-
end
|
87
|
-
exit(0)
|
81
|
+
LeapCli::Bootstrap::handle_version(self)
|
82
|
+
else
|
83
|
+
LeapCli::Bootstrap::load_libraries(self)
|
88
84
|
end
|
89
85
|
|
90
86
|
# disable GLI error catching
|
@@ -92,9 +88,6 @@ module LeapCli::Commands
|
|
92
88
|
def error_message(msg)
|
93
89
|
end
|
94
90
|
|
95
|
-
# load commands
|
96
|
-
commands_from('leap_cli/commands')
|
97
|
-
|
98
91
|
# run command
|
99
92
|
begin
|
100
93
|
exit_status = run(ARGV)
|
data/lib/leap/platform.rb
CHANGED
@@ -14,6 +14,7 @@ module Leap
|
|
14
14
|
attr_accessor :monitor_username
|
15
15
|
attr_accessor :reserved_usernames
|
16
16
|
|
17
|
+
attr_accessor :hiera_dir
|
17
18
|
attr_accessor :hiera_path
|
18
19
|
attr_accessor :files_dir
|
19
20
|
attr_accessor :leap_dir
|
@@ -24,6 +25,7 @@ module Leap
|
|
24
25
|
def define(&block)
|
25
26
|
# some defaults:
|
26
27
|
@reserved_usernames = []
|
28
|
+
@hiera_dir = '/etc/leap'
|
27
29
|
@hiera_path = '/etc/leap/hiera.yaml'
|
28
30
|
@leap_dir = '/srv/leap'
|
29
31
|
@files_dir = '/srv/leap/files'
|
data/lib/leap_cli.rb
CHANGED
@@ -36,6 +36,7 @@ require 'leap_cli/util/secret'
|
|
36
36
|
require 'leap_cli/util/remote_command'
|
37
37
|
require 'leap_cli/util/x509'
|
38
38
|
require 'leap_cli/logger'
|
39
|
+
require 'leap_cli/bootstrap'
|
39
40
|
|
40
41
|
require 'leap_cli/ssh_key'
|
41
42
|
require 'leap_cli/config/object'
|
@@ -45,6 +46,7 @@ require 'leap_cli/config/provider'
|
|
45
46
|
require 'leap_cli/config/secrets'
|
46
47
|
require 'leap_cli/config/object_list'
|
47
48
|
require 'leap_cli/config/filter'
|
49
|
+
require 'leap_cli/config/environment'
|
48
50
|
require 'leap_cli/config/manager'
|
49
51
|
|
50
52
|
require 'leap_cli/markdown_document_listener'
|
@@ -54,7 +56,6 @@ require 'leap_cli/markdown_document_listener'
|
|
54
56
|
#
|
55
57
|
module LeapCli
|
56
58
|
Util.send(:extend, LeapCli::Log)
|
57
|
-
Commands.send(:extend, LeapCli::Log)
|
58
59
|
Config::Manager.send(:include, LeapCli::Log)
|
59
60
|
extend LeapCli::Log
|
60
61
|
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
#
|
2
|
+
# Initial bootstrap loading of all the necessary things that needed
|
3
|
+
# for the `leap` command.
|
4
|
+
#
|
5
|
+
|
6
|
+
module LeapCli
|
7
|
+
module Bootstrap
|
8
|
+
extend LeapCli::Log
|
9
|
+
extend self
|
10
|
+
|
11
|
+
#
|
12
|
+
# the argument leapfile_path is only used for tests
|
13
|
+
#
|
14
|
+
def setup(argv, leapfile_path=nil)
|
15
|
+
setup_logging(argv)
|
16
|
+
setup_leapfile(argv, leapfile_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# print out the version string and exit.
|
21
|
+
# called from leap executable.
|
22
|
+
#
|
23
|
+
def handle_version(app)
|
24
|
+
puts "leap #{LeapCli::VERSION}, ruby #{RUBY_VERSION}"
|
25
|
+
begin
|
26
|
+
log_version
|
27
|
+
rescue StandardError => exc
|
28
|
+
puts exc.to_s
|
29
|
+
raise exc if DEBUG
|
30
|
+
end
|
31
|
+
exit(0)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# load the commands.
|
36
|
+
# called from leap executable.
|
37
|
+
#
|
38
|
+
def load_libraries(app)
|
39
|
+
if LeapCli.log_level >= 2
|
40
|
+
log_version
|
41
|
+
end
|
42
|
+
load_commands(app)
|
43
|
+
load_macros
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# initialize the global options.
|
48
|
+
# called from pre.rb
|
49
|
+
#
|
50
|
+
def setup_global_options(app, global)
|
51
|
+
if global[:force]
|
52
|
+
global[:yes] = true
|
53
|
+
end
|
54
|
+
if Process::Sys.getuid == 0
|
55
|
+
Util.bail! "`leap` should not be run as root."
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
#
|
62
|
+
# Initial logging
|
63
|
+
#
|
64
|
+
# This is called very early by leap executable, because
|
65
|
+
# everything depends on the log file and log options
|
66
|
+
# being set correctly before any work is done.
|
67
|
+
#
|
68
|
+
# The Leapfile might later load additional logging
|
69
|
+
# options.
|
70
|
+
#
|
71
|
+
def setup_logging(argv)
|
72
|
+
options = parse_logging_options(argv)
|
73
|
+
verbose = (options[:verbose] || 1).to_i
|
74
|
+
if verbose
|
75
|
+
LeapCli.set_log_level(verbose)
|
76
|
+
end
|
77
|
+
if options[:log]
|
78
|
+
LeapCli.log_file = options[:log]
|
79
|
+
LeapCli::Util.log_raw(:log) { $0 + ' ' + argv.join(' ')}
|
80
|
+
end
|
81
|
+
unless options[:color].nil?
|
82
|
+
LeapCli.log_in_color = options[:color]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# load the leapfile and set the Path variables.
|
88
|
+
#
|
89
|
+
def setup_leapfile(argv, leapfile_path)
|
90
|
+
LeapCli.leapfile.load(leapfile_path)
|
91
|
+
if LeapCli.leapfile.valid?
|
92
|
+
Path.set_platform_path(LeapCli.leapfile.platform_directory_path)
|
93
|
+
Path.set_provider_path(LeapCli.leapfile.provider_directory_path)
|
94
|
+
if !Path.provider || !File.directory?(Path.provider)
|
95
|
+
bail! { log :missing, "provider directory '#{Path.provider}'" }
|
96
|
+
end
|
97
|
+
if !Path.platform || !File.directory?(Path.platform)
|
98
|
+
bail! { log :missing, "platform directory '#{Path.platform}'" }
|
99
|
+
end
|
100
|
+
if LeapCli.log_file.nil? && LeapCli.leapfile.log
|
101
|
+
LeapCli.log_file = LeapCli.leapfile.log
|
102
|
+
end
|
103
|
+
elsif !leapfile_optional?(argv)
|
104
|
+
puts
|
105
|
+
puts " ="
|
106
|
+
log :note, "There is no `Leapfile` in this directory, or any parent directory.\n"+
|
107
|
+
" = "+
|
108
|
+
"Without this file, most commands will not be available."
|
109
|
+
puts " ="
|
110
|
+
puts
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
#
|
115
|
+
# Add a log entry for the leap command and leap platform versions.
|
116
|
+
#
|
117
|
+
def log_version(force=false)
|
118
|
+
str = "leap command v#{LeapCli::VERSION}"
|
119
|
+
if Util.is_git_directory?(LEAP_CLI_BASE_DIR)
|
120
|
+
str << " (%s %s)" % [Util.current_git_branch(LEAP_CLI_BASE_DIR),
|
121
|
+
Util.current_git_commit(LEAP_CLI_BASE_DIR)]
|
122
|
+
else
|
123
|
+
str << " (%s)" % LEAP_CLI_BASE_DIR
|
124
|
+
end
|
125
|
+
log str
|
126
|
+
if LeapCli.leapfile.valid?
|
127
|
+
str = "leap platform v#{Leap::Platform.version}"
|
128
|
+
if Util.is_git_directory?(Path.platform)
|
129
|
+
str << " (%s %s)" % [Util.current_git_branch(Path.platform), Util.current_git_commit(Path.platform)]
|
130
|
+
end
|
131
|
+
log str
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def parse_logging_options(argv)
|
136
|
+
argv = argv.dup
|
137
|
+
options = {:color => true, :verbose => 1}
|
138
|
+
loop do
|
139
|
+
current = argv.shift
|
140
|
+
case current
|
141
|
+
when '--verbose' then options[:verbose] = argv.shift;
|
142
|
+
when /-v[0-9]/ then options[:verbose] = current[-1];
|
143
|
+
when '--log' then options[:log] = argv.shift;
|
144
|
+
when '--no-color' then options[:color] = false;
|
145
|
+
when nil then break;
|
146
|
+
end
|
147
|
+
end
|
148
|
+
options
|
149
|
+
end
|
150
|
+
|
151
|
+
#
|
152
|
+
# Returns true if loading the Leapfile is optional.
|
153
|
+
#
|
154
|
+
# We could make the 'new' command skip the 'pre' command, and then load Leapfile
|
155
|
+
# from 'pre', but for various reasons we want the Leapfile loaded even earlier
|
156
|
+
# than that. So, we need a way to test to see if loading the leapfile is optional
|
157
|
+
# before any of the commands are loaded and the argument list is parsed by GLI.
|
158
|
+
# Yes, hacky.
|
159
|
+
#
|
160
|
+
def leapfile_optional?(argv)
|
161
|
+
if argv.include?('--version')
|
162
|
+
return true
|
163
|
+
else
|
164
|
+
without_flags = argv.select {|i| i !~ /^-/}
|
165
|
+
if without_flags.first == 'new'
|
166
|
+
return true
|
167
|
+
end
|
168
|
+
end
|
169
|
+
return false
|
170
|
+
end
|
171
|
+
|
172
|
+
#
|
173
|
+
# loads the GLI command definition files
|
174
|
+
#
|
175
|
+
def load_commands(app)
|
176
|
+
app.commands_from('leap_cli/commands')
|
177
|
+
if Path.platform
|
178
|
+
app.commands_from(Path.platform + '/lib/leap_cli/commands')
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
#
|
183
|
+
# loads the platform's macro definition files
|
184
|
+
#
|
185
|
+
def load_macros
|
186
|
+
if Path.platform
|
187
|
+
platform_macro_files = Dir[Path.platform + '/lib/leap_cli/macros/*.rb']
|
188
|
+
if platform_macro_files.any?
|
189
|
+
platform_macro_files.each do |macro_file|
|
190
|
+
require macro_file
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#
|
2
|
+
# Some common helpers available to all LeapCli::Commands
|
3
|
+
#
|
4
|
+
# This also includes utility methods, and makes all instance
|
5
|
+
# methods available as class methods.
|
6
|
+
#
|
7
|
+
|
8
|
+
module LeapCli
|
9
|
+
module Commands
|
10
|
+
|
11
|
+
extend self
|
12
|
+
extend LeapCli::Log
|
13
|
+
extend LeapCli::Util
|
14
|
+
extend LeapCli::Util::RemoteCommand
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def path(name)
|
19
|
+
Path.named_path(name)
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# keeps prompting the user for a numbered choice, until they pick a good one or bail out.
|
24
|
+
#
|
25
|
+
# block is yielded and is responsible for rendering the choices.
|
26
|
+
#
|
27
|
+
def numbered_choice_menu(msg, items, &block)
|
28
|
+
while true
|
29
|
+
say("\n" + msg + ':')
|
30
|
+
items.each_with_index &block
|
31
|
+
say("q. quit")
|
32
|
+
index = ask("number 1-#{items.length}> ")
|
33
|
+
if index.empty?
|
34
|
+
next
|
35
|
+
elsif index =~ /q/
|
36
|
+
bail!
|
37
|
+
else
|
38
|
+
i = index.to_i - 1
|
39
|
+
if i < 0 || i >= items.length
|
40
|
+
bail!
|
41
|
+
else
|
42
|
+
return i
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse_node_list(nodes)
|
49
|
+
if nodes.is_a? Config::Object
|
50
|
+
Config::ObjectList.new(nodes)
|
51
|
+
elsif nodes.is_a? Config::ObjectList
|
52
|
+
nodes
|
53
|
+
elsif nodes.is_a? String
|
54
|
+
manager.filter!(nodes)
|
55
|
+
else
|
56
|
+
bail! "argument error"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -4,7 +4,7 @@ module LeapCli; module Commands
|
|
4
4
|
|
5
5
|
desc 'Creates a new provider instance in the specified directory, creating it if necessary.'
|
6
6
|
arg_name 'DIRECTORY'
|
7
|
-
skips_pre
|
7
|
+
#skips_pre
|
8
8
|
command :new do |c|
|
9
9
|
c.flag 'name', :desc => "The name of the provider." #, :default_value => 'Example'
|
10
10
|
c.flag 'domain', :desc => "The primary domain of the provider." #, :default_value => 'example.org'
|
@@ -12,6 +12,10 @@ module LeapCli; module Commands
|
|
12
12
|
c.flag 'contacts', :desc => "Default email address contacts." #, :default_value => 'root'
|
13
13
|
|
14
14
|
c.action do |global, options, args|
|
15
|
+
unless args.first
|
16
|
+
# this should not be needed, but GLI is not making it required.
|
17
|
+
bail! "Argument DIRECTORY is required."
|
18
|
+
end
|
15
19
|
directory = File.expand_path(args.first)
|
16
20
|
create_provider_directory(global, directory)
|
17
21
|
options[:domain] ||= ask_string("The primary domain of the provider: ") {|q| q.default = 'example.org'}
|
@@ -31,73 +31,8 @@ module LeapCli; module Commands
|
|
31
31
|
switch 'color', :negatable => true
|
32
32
|
|
33
33
|
pre do |global,command,options,args|
|
34
|
-
|
35
|
-
global[:yes] = true
|
36
|
-
end
|
37
|
-
initialize_leap_cli(true, global)
|
34
|
+
Bootstrap.setup_global_options(self, global)
|
38
35
|
true
|
39
36
|
end
|
40
37
|
|
41
|
-
protected
|
42
|
-
|
43
|
-
#
|
44
|
-
# available options:
|
45
|
-
# :verbose -- integer log verbosity level
|
46
|
-
# :log -- log file path
|
47
|
-
# :color -- true or false, to log in color or not.
|
48
|
-
#
|
49
|
-
def initialize_leap_cli(require_provider, options={})
|
50
|
-
if Process::Sys.getuid == 0
|
51
|
-
bail! "`leap` should not be run as root."
|
52
|
-
end
|
53
|
-
|
54
|
-
# set verbosity
|
55
|
-
options[:verbose] ||= 1
|
56
|
-
LeapCli.set_log_level(options[:verbose].to_i)
|
57
|
-
|
58
|
-
# load Leapfile
|
59
|
-
LeapCli.leapfile.load
|
60
|
-
if LeapCli.leapfile.valid?
|
61
|
-
Path.set_platform_path(LeapCli.leapfile.platform_directory_path)
|
62
|
-
Path.set_provider_path(LeapCli.leapfile.provider_directory_path)
|
63
|
-
if !Path.provider || !File.directory?(Path.provider)
|
64
|
-
bail! { log :missing, "provider directory '#{Path.provider}'" }
|
65
|
-
end
|
66
|
-
if !Path.platform || !File.directory?(Path.platform)
|
67
|
-
bail! { log :missing, "platform directory '#{Path.platform}'" }
|
68
|
-
end
|
69
|
-
elsif require_provider
|
70
|
-
bail! { log :missing, 'Leapfile in directory tree' }
|
71
|
-
end
|
72
|
-
|
73
|
-
# set log file
|
74
|
-
LeapCli.log_file = options[:log] || LeapCli.leapfile.log
|
75
|
-
LeapCli::Util.log_raw(:log) { $0 + ' ' + ORIGINAL_ARGV.join(' ')}
|
76
|
-
log_version
|
77
|
-
LeapCli.log_in_color = options[:color]
|
78
|
-
end
|
79
|
-
|
80
|
-
#
|
81
|
-
# add a log entry for the leap command and leap platform versions
|
82
|
-
#
|
83
|
-
def log_version
|
84
|
-
if LeapCli.log_level >= 2
|
85
|
-
str = "leap command v#{LeapCli::VERSION}"
|
86
|
-
if Util.is_git_directory?(LEAP_CLI_BASE_DIR)
|
87
|
-
str << " (%s %s)" % [Util.current_git_branch(LEAP_CLI_BASE_DIR),
|
88
|
-
Util.current_git_commit(LEAP_CLI_BASE_DIR)]
|
89
|
-
else
|
90
|
-
str << " (%s)" % LEAP_CLI_BASE_DIR
|
91
|
-
end
|
92
|
-
log 2, str
|
93
|
-
if LeapCli.leapfile.valid?
|
94
|
-
str = "leap platform v#{Leap::Platform.version}"
|
95
|
-
if Util.is_git_directory?(Path.platform)
|
96
|
-
str << " (%s %s)" % [Util.current_git_branch(Path.platform), Util.current_git_commit(Path.platform)]
|
97
|
-
end
|
98
|
-
log 2, str
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
38
|
end; end
|