module Stax::Keypair

Public Class Methods

included(thor) click to toggle source
# File lib/stax/keypair.rb, line 7
def self.included(thor)
  thor.class_eval do

    no_commands do
      def key_pair_name
        @_key_pair_name ||= stack_name
      end

      ## parameter store name to store private key
      def key_pair_store_name
        "#{key_pair_name}.key_pair"
      end

      def key_pair_describe
        keypair(:ls, [key_pair_name], long: true)
      rescue Aws::EC2::Errors::InvalidKeyPairNotFound => e
        warn(e.message)
      end

      ## create a new key pair and return private key
      def key_pair_create
        keypair(:create, [key_pair_name], quiet: true).key_material
      rescue Aws::EC2::Errors::InvalidKeyPairDuplicate => e
        warn(e.message)
        nil
      end

      ## create a key and store it in parameter store
      def key_pair_store
        key = key_pair_create or return
        param(:put, [key_pair_store_name], value: key, type: 'SecureString', key_id: try(:kms_id), overwrite: true)
      end

      ## get private key from store and write to a tempfile for ssh to find; return file object
      def key_pair_get
        Tempfile.new(stack_name).tap do |file|
          key = param(:get, [key_pair_store_name], decrypt: true, quiet: true).first
          File.chmod(0400, file.path) # ssh needs this mode
          file.write(key.value)
          file.close
        end
      end

      ## delete the key pair and the parameter store
      def key_pair_delete
        keypair(:delete, [key_pair_name], yes: true)
        param(:delete, [key_pair_store_name], yes: true)
      rescue Aws::SSM::Errors::ParameterNotFound
        warn("Parameter #{key_pair_store_name} does not exist")
      end
    end

    desc 'key', 'key pair tasks'
    method_option :create, type: :boolean, default: false, desc: 'create a new key pair'
    method_option :delete, type: :boolean, default: false, desc: 'delete key pair'
    def key
      if options[:create]
        key_pair_store
      elsif options[:delete]
        key_pair_delete
      else
        key_pair_describe
      end
    end

  end
end

Public Instance Methods

key() click to toggle source
# File lib/stax/keypair.rb, line 62
def key
  if options[:create]
    key_pair_store
  elsif options[:delete]
    key_pair_delete
  else
    key_pair_describe
  end
end
key_pair_create() click to toggle source

create a new key pair and return private key

# File lib/stax/keypair.rb, line 27
def key_pair_create
  keypair(:create, [key_pair_name], quiet: true).key_material
rescue Aws::EC2::Errors::InvalidKeyPairDuplicate => e
  warn(e.message)
  nil
end
key_pair_delete() click to toggle source

delete the key pair and the parameter store

# File lib/stax/keypair.rb, line 51
def key_pair_delete
  keypair(:delete, [key_pair_name], yes: true)
  param(:delete, [key_pair_store_name], yes: true)
rescue Aws::SSM::Errors::ParameterNotFound
  warn("Parameter #{key_pair_store_name} does not exist")
end
key_pair_describe() click to toggle source
# File lib/stax/keypair.rb, line 20
def key_pair_describe
  keypair(:ls, [key_pair_name], long: true)
rescue Aws::EC2::Errors::InvalidKeyPairNotFound => e
  warn(e.message)
end
key_pair_get() click to toggle source

get private key from store and write to a tempfile for ssh to find; return file object

# File lib/stax/keypair.rb, line 41
def key_pair_get
  Tempfile.new(stack_name).tap do |file|
    key = param(:get, [key_pair_store_name], decrypt: true, quiet: true).first
    File.chmod(0400, file.path) # ssh needs this mode
    file.write(key.value)
    file.close
  end
end
key_pair_name() click to toggle source
# File lib/stax/keypair.rb, line 11
def key_pair_name
  @_key_pair_name ||= stack_name
end
key_pair_store() click to toggle source

create a key and store it in parameter store

# File lib/stax/keypair.rb, line 35
def key_pair_store
  key = key_pair_create or return
  param(:put, [key_pair_store_name], value: key, type: 'SecureString', key_id: try(:kms_id), overwrite: true)
end
key_pair_store_name() click to toggle source

parameter store name to store private key

# File lib/stax/keypair.rb, line 16
def key_pair_store_name
  "#{key_pair_name}.key_pair"
end
keypair_create() click to toggle source
# File lib/stax/mixin/keypair.rb, line 10
def keypair_create
  Aws::Keypair.create(stack_name).key_material
rescue ::Aws::EC2::Errors::InvalidKeyPairDuplicate => e
  fail_task(e.message)
end
keypair_delete() click to toggle source
# File lib/stax/mixin/keypair.rb, line 16
def keypair_delete
  Aws::Keypair.delete(stack_name)
end