Module: Cfer::Auster::CLI

Defined in:
lib/cfer/auster/cli.rb,
lib/cfer/auster/cli/run.rb,
lib/cfer/auster/cli/json.rb,
lib/cfer/auster/cli/nuke.rb,
lib/cfer/auster/cli/_shared.rb,
lib/cfer/auster/cli/destroy.rb,
lib/cfer/auster/cli/generate.rb,
lib/cfer/auster/cli/generate/repo.rb,
lib/cfer/auster/cli/generate/step.rb

Class Method Summary collapse

Class Method Details

.base_options(cmd) ⇒ Object



8
9
10
11
12
13
14
# File 'lib/cfer/auster/cli/_shared.rb', line 8

def self.base_options(cmd)
  cmd.instance_eval do
    flag :v, :verbose, "sets logging to DEBUG" do |_, _|
      Cfer::Auster::Logging.logger.level = Logger::DEBUG
    end
  end
end

.destroyObject



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/cfer/auster/cli/destroy.rb', line 9

def self.destroy
  Cri::Command.define do
    name "destroy"
    usage "destroy aws-region/config-set count-or-tag"
    description "Destroys this Auster step in your AWS account."

    CLI.standard_options(self)

    run do |opts, args, cmd|
      if args.length < 2
        puts cmd.help
        exit 1
      else
        CLI.repo_from_options(opts) do |repo|
          config_set = repo.config_set(args[0])
          step = repo.step_by_count_or_tag(args[1])

          step.destroy(config_set)
        end
      end
    end
  end
end

.execute(args) ⇒ Object



55
56
57
# File 'lib/cfer/auster/cli.rb', line 55

def self.execute(args)
  CLI.root.run(args)
end

.generateObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/cfer/auster/cli/generate.rb', line 10

def self.generate
  ret = Cri::Command.define do
    name "generate"
    description "Encapsulates generators for Auster."

    CLI.base_options(self)

    flag :h, :help, "show help for this command" do |_, cmd|
      puts cmd.help
      Kernel.exit 0
    end

    run do |_, _, cmd|
      puts cmd.help
      Kernel.exit 0
    end
  end

  ret.add_command(CLI.generate_repo)
  ret.add_command(CLI.generate_step)

  ret
end

.generate_repoObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/cfer/auster/cli/generate/repo.rb', line 7

def self.generate_repo
  Cri::Command.define do
    name "repo"
    usage "repo OUTPUT_PATH"
    description "Generates a new Auster plan repo."

    CLI.base_options(self)

    flag :h, :help, "show help for this command" do |_, cmd|
      puts cmd.help
      Kernel.exit 0
    end

    run do |_, _, cmd|
      raise "TODO: implement"
    end
  end
end

.generate_stepObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/cfer/auster/cli/generate/step.rb', line 7

def self.generate_step
  Cri::Command.define do
    name "step"
    usage "step ##"
    description "Generates a step in the current Auster repo."

    CLI.base_options(self)

    flag :h, :help, "show help for this command" do |_, cmd|
      puts cmd.help
      Kernel.exit 0
    end

    run do |_, _, cmd|
      raise "TODO: implement"
    end
  end
end

.jsonObject



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
# File 'lib/cfer/auster/cli/json.rb', line 9

def self.json
  Cri::Command.define do
    name "json"
    usage "json aws-region/config-set count-or-tag"
    description "Generates the CloudFormation JSON for this step."

    CLI.standard_options(self)

    option :o, :"output-file",
           "Saves the JSON output to a file (otherwise prints to stdout)",
           argument: :required

    run do |opts, args, cmd|
      if args.length < 2
        puts cmd.help
        exit 1
      else
        CLI.repo_from_options(opts) do |repo|
          config_set = repo.config_set(args[0])
          step = repo.step_by_count_or_tag(args[1])

          ret = step.json(config_set)

          if opts[:"output-file"]
            IO.write(opts[:"output-file"], ret)
          else
            puts ret
          end
        end
      end
    end
  end
end

.nukeObject



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
# File 'lib/cfer/auster/cli/nuke.rb', line 9

def self.nuke
  Cri::Command.define do
    extend Cfer::Auster::Logging::Mixin

    name "nuke"
    usage "nuke aws-region/config-set"
    description "Destroys ALL AWS RESOURCES related to this config set."

    CLI.standard_options(self)

    flag nil, :force, "bypasses confirmation - use with care!"

    run do |opts, args, cmd|
      if args.length < 1
        puts cmd.help
        exit 1
      else
        CLI.repo_from_options(opts) do |repo|
          config_set = repo.config_set(args[0])

          accepted = !!opts[:force]

          if !accepted && $stdin.tty?
            $stderr.write "\n\n"
            $stderr.write "!!! YOU ARE ABOUT TO DO SOMETHING VERY DRASTIC! !!!\n"
            $stderr.write "You are requesting to destroy ALL STEPS of the config set '#{config_set.full_name}'.\n"
            $stderr.write "If you are certain you wish to do this, please type CONFIRM: "

            input = $stdin.readline.chomp

            if input != "CONFIRM"
              $stderr.write "\n\nInvalid input. Aborting nuke.\n\n"
              Kernel.exit 1
            end

            accepted = true
          end

          unless accepted
            logger.error "You must pass interactive confirmation or use the --force parameter to nuke."
            Kernel.exit 1
          end

          repo.nuke(config_set)

          logger.warn "I really, really hope you meant to do that."
        end
      end
    end
  end
end

.repo_from_options(opts, &block) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/cfer/auster/cli/_shared.rb', line 35

def self.repo_from_options(opts, &block)
  require "cfer/auster/repo"

  repo =
    if opts[:"plan-path"]
      Cfer::Auster::Repo.new(opts[:"plan-path"])
    else
      Cfer::Auster::Repo.discover_from_cwd
    end

  block.call(repo)
end

.rootObject



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
# File 'lib/cfer/auster/cli.rb', line 17

def self.root
  ret = Cri::Command.define do
    name "auster"
    description "The best way to manage CloudFormation. Ever. (We think.)"

    CLI.base_options(self)

    flag :h, :help, "show help for this command" do |_, cmd|
      puts cmd.help
      Kernel.exit 0
    end

    flag nil, :version, "show version information for this command" do |_, _|
      puts Cfer::Auster::VERSION
      Kernel.exit 0
    end
    flag nil, :"version-json", "show version information for this command in JSON" do |_, _|
      puts JSON.pretty_generate(
        Semantic::Version.new(Cfer::Auster::VERSION).to_h.reject { |_, v| v.nil? }
      )
      Kernel.exit 0
    end

    run do |_, _, cmd|
      puts cmd.help
      Kernel.exit 0
    end
  end

  ret.add_command(CLI.generate)
  ret.add_command(CLI.json)
  ret.add_command(CLI.run)
  ret.add_command(CLI.destroy)
  ret.add_command(CLI.nuke)

  ret
end

.runObject



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/cfer/auster/cli/run.rb', line 9

def self.run
  Cri::Command.define do
    name "run"
    usage "run aws-region/config-set count-or-tag"
    description "Runs this Auster step against your AWS infrastructure."

    CLI.standard_options(self)

    run do |opts, args, cmd|
      if args.length < 2
        puts cmd.help
        exit 1
      else
        CLI.repo_from_options(opts) do |repo|
          config_set = repo.config_set(args[0])
          step = repo.step_by_count_or_tag(args[1])

          step.run(config_set)
        end
      end
    end
  end
end

.standard_options(cmd) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/cfer/auster/cli/_shared.rb', line 16

def self.standard_options(cmd)
  cmd.instance_eval do
    CLI.base_options(cmd)

    flag :h, :help, "show help for this command" do |_, cmd|
      puts cmd.help
      Kernel.exit 0
    end

    option :l, :"log-level",
           "Configures the verbosity of the Auster and Cfer loggers. (default: info)",
           argument: :required

    option :p, :"plan-path",
           "The path to the Auster plan repo that should be used (otherwise searches from pwd)",
           argument: :required
  end
end