require 'catfish' require 'thor' module Catfish class CLI < Thor include Thor::Actions def initialize(*args) super rescue UnknownArgumentError => e raise InvalidOption, e.message ensure self.options ||= {} end def self.source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates')) end desc 'init [OPTIONS]', 'Generates a templated catfish repo in the current working directory' long_desc <<-D TODO: Long description D method_option 'provisioners', type: :array, banner: 'A list of vagrant provisiners to use' method_option 'local', type: :boolean, default: true, banner: 'Set up a local vm for use with vagrant' method_option 'local-box', type: :string, banner: 'Vagrant box for use with local VM' method_option 'local-box-url', type: :string, banner: 'Vagrant box url for use with local VM' method_option 'managed', type: :boolean, default: false, banner: 'Set up capability for vagrant-managed-servers' method_option 'managed-servers', type: :array, banner: 'Initial list of servers to include in Catfishfile' method_option 'communicator', type: :string, banner: 'The communicator. ssh (default) or winrm' method_option 'windows', type: :boolean, banner: 'Shorthand for --communicator=winrm' method_option 'winrm-username', type: :string, banner: 'Username for winrm. Used with --communicator=winrm' method_option 'winrm-password', type: :string, banner: 'Password for winrm. Used with --communicator=winrm' method_option 'shell', type: :boolean, banner: 'Shorthand for provisioners=shell' method_option 'shell-paths', type: :array, banner: 'A list of paths to use if shell provisioning is selected' method_option 'ssh-username', type: :string, banner: 'SSH username' method_option 'ssh-private-key-path', type: :string, banner: 'Path to SSH private key' method_option 'puppet', type: :boolean, banner: 'Shorthand for provisioners=puppet' method_option 'puppet-librarian-puppet', type: :boolean, default: true, banner: 'Whether or not to include a default Puppetfile and librarian puppet plugin' method_option 'puppet-hiera', type: :boolean, default: true, banner: 'Include hiera templates. Only applies to puppet provisioner' method_option 'plugins', type: :array, banner: 'Vagrant plugins to be installed' def init require 'catfish/cli/init' Init.new(options.dup, self).run end desc 'resolve', 'Resolves the servers listed in Catfishfile to .lock' def resolve require 'catfish/cli/resolve' Resolve.new(options.dup).run end desc 'plugin', 'Install plugins defined in Catfishfile' def plugin require 'catfish/cli/plugin' Plugin.new(options.dup).run end desc 'clean', 'Clean Catfishfile.lock' def clean require 'catfish/cli/clean' Clean.new.run end desc 'provision [OPTIONS]', 'Provision to the servers specified in Catfishfile.lock' method_option 'provider', type: :string, default: 'managed', banner: 'Vagrant provider to use.' method_option 'parallel', type: :boolean, default: false, banner: 'Run provisioning in parallel' def provision exists_before_resolve = File.exist?('Catfishfile.lock') resolve plugin require 'catfish/cli/provision' Provision.new(options.dup).run # If the Catfishfile.lock existed before the start of the run, then # we should leave it there. Otherwise, we should clean it up. clean unless exists_before_resolve end end end