aboutsummaryrefslogtreecommitdiff
path: root/lib/leap_cli/commands/new.rb
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2013-02-08 23:09:47 -0800
committerelijah <elijah@riseup.net>2013-02-08 23:09:47 -0800
commit882a019ce26a045d445c38bdc0f348588a30f465 (patch)
tree5d2ee4ee792376a0f2ebb305a80e74f75e0f4d03 /lib/leap_cli/commands/new.rb
parent6e5289b7df7ff2f1320ba139303018d260c9b9cf (diff)
downloadleap_cli-882a019ce26a045d445c38bdc0f348588a30f465.tar.gz
leap_cli-882a019ce26a045d445c38bdc0f348588a30f465.tar.bz2
changed `leap init` to `leap new`, made more foolproof.
Diffstat (limited to 'lib/leap_cli/commands/new.rb')
-rw-r--r--lib/leap_cli/commands/new.rb133
1 files changed, 133 insertions, 0 deletions
diff --git a/lib/leap_cli/commands/new.rb b/lib/leap_cli/commands/new.rb
new file mode 100644
index 0000000..c4a067e
--- /dev/null
+++ b/lib/leap_cli/commands/new.rb
@@ -0,0 +1,133 @@
+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)
+ # @leap_version = "#{LeapCli::VERSION}"
+ %[## Required:
+@platform_directory_path = "#{options[:platform]}"
+
+## Optional:
+# @custom_vagrant_vm_line = "config.vm.boot_mode = :gui"
+# @log = "/tmp/leap.log"
+]
+ 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
+
+