1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
require 'fileutils'
module LeapCli; module Commands
desc 'Creates a new provider instance in the specified directory, creating it if necessary.'
arg_name 'DIRECTORY'
skips_pre
command :new do |c|
c.flag 'name', :desc => "The name of the provider." #, :default_value => 'Example'
c.flag 'domain', :desc => "The primary domain of the provider." #, :default_value => 'example.org'
c.flag 'platform', :desc => "File path of the leap_platform directory." #, :default_value => '../leap_platform'
c.flag 'contacts', :desc => "Default email address contacts." #, :default_value => 'root'
c.action do |global, options, args|
directory = File.expand_path(args.first)
create_provider_directory(global, directory)
options[:domain] ||= ask("The primary domain of the provider: ") {|q| q.default = 'example.org'}
options[:name] ||= ask("The name of the provider: ") {|q| q.default = 'Example'}
options[:platform] ||= ask("File path of the leap_platform directory: ") {|q| q.default = File.expand_path('../leap_platform', directory)}
options[:contacts] ||= ask("Default email address contacts: ") {|q| q.default = 'root@' + options[:domain]}
options[:platform] = relative_path(options[:platform])
create_initial_provider_files(directory, global, options)
end
end
private
DEFAULT_REPO = 'git://leap.se/leap_platform' # TODO: use https
#
# creates a new provider directory
#
def create_provider_directory(global, directory)
unless directory && directory.any?
help! "Directory name is required."
end
unless File.exists?(directory)
if global[:yes] || agree("Create directory #{directory}? ")
ensure_dir directory
else
bail! { log :missing, "directory #{directory}" }
end
end
Path.set_provider_path(directory)
end
#
# see provider with initial files
#
def create_initial_provider_files(directory, global, options)
Dir.chdir(directory) do
assert_files_missing! 'provider.json', 'common.json', 'Leapfile', :base => directory
platform_dir = File.expand_path(options[:platform], "./")
unless File.symlink?(platform_dir) || File.directory?(platform_dir)
if global[:yes] || agree("The platform directory \"#{platform_dir}\" does not exist.\nDo you want me to create it by cloning from the\ngit repository #{DEFAULT_REPO}? ")
assert_bin! 'git'
ensure_dir platform_dir
Dir.chdir(platform_dir) do
log :cloning, "leap_platform into #{platform_dir}"
pty_run "git clone --branch master #{DEFAULT_REPO} ."
pty_run 'git submodule update --init'
end
else
bail!
end
end
write_file! '.gitignore', GITIGNORE_CONTENT
write_file! 'provider.json', provider_content(options)
write_file! 'common.json', COMMON_CONTENT
write_file! 'Leapfile', leapfile_content(options)
["nodes", "services", "tags"].each do |dir|
ensure_dir dir
end
log :completed, 'initialization'
end
end
def relative_path(path)
Pathname.new(path).relative_path_from(Pathname.new(Path.provider)).to_s
end
def leapfile_content(options)
%[@platform_directory_path = "#{options[:platform]}"\n# see https://leap.se/en/docs/platform/config for more options]
end
GITIGNORE_CONTENT = <<EOS
test/Vagrantfile
test/.vagrant
test/openvpn
test/cert
EOS
def provider_content(options)
%[//
// General service provider configuration.
//
{
"domain": "#{options[:domain]}",
"name": {
"en": "#{options[:name]}"
},
"description": {
"en": "You really should change this text"
},
"contacts": {
"default": "#{options[:contacts]}"
},
"languages": ["en"],
"default_language": "en",
"enrollment_policy": "open"
}
]
end
COMMON_CONTENT = <<EOS
//
// Options put here are inherited by all nodes.
//
{
}
EOS
end; end
|