Completed
Push — master ( fde2ba...d387dd )
by Fike
01:07
created

ResourceHelpers.get_user_home_directory()   A

Complexity

Conditions 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
dl 0
loc 10
rs 9.4285
1
# frozen_string_literal: true
2
3
require_relative 'model/private_key'
4
require_relative 'model/public_key'
5
require_relative 'generator'
6
7
module AMA
8
  module Chef
9
    module SSHPrivateKeys
10
      # Just a bunch of methods to put dirty work out of resource definition
11
      module ResourceHelpers
12
        def guess_user_home_directory(user)
13
          "/home/#{user}"
14
        end
15
16
        def user_home_directory(user)
17
          Etc.getpwnam(user).dir
18
        rescue ArgumentError
19
          guess_user_home_directory(user).tap do |directory|
20
            ::Chef::Log.warn(
21
              "User #{user} hasn't been found at compile time, " \
22
              "using #{directory} as user home directory"
23
            )
24
          end
25
        end
26
27
        def ssh_directory(user)
28
          "#{user_home_directory(user)}/.ssh"
29
        end
30
31
        # @param [String] content
32
        # @param [String] passphrase
33
        # @return [AMA::Chef::SSHPrivateKeys::Model::PrivateKey]
34
        def new_private_key(content, passphrase)
35
          klass = ::AMA::Chef::SSHPrivateKeys::Model::PrivateKey
36
          klass.new(content, passphrase)
37
        end
38
39
        # @param [String] type
40
        # @param [String] content
41
        # @param [String] comment
42
        # @return [AMA::Chef::SSHPrivateKeys::Model::PublicKey]
43
        def new_public_key(type, content, comment = nil)
44
          klass = ::AMA::Chef::SSHPrivateKeys::Model::PublicKey
45
          klass.new(type, content, comment)
46
        end
47
48
        # @param [AMA::Chef::SSHPrivateKeys::Model::PrivateKey] private_key
49
        # @param [String, NilClass] comment
50
        # @return [AMA::Chef::SSHPrivateKeys::Model::PublicKey]
51
        def generate_public_key!(private_key, comment = nil)
52
          binary = Generator.locate_binary!
53
          Generator.new(binary).generate_public_key(private_key, comment)
54
        end
55
56
        # new_resource-aware methods
57
58
        def create_key_directory(directory = nil)
59
          user = new_resource.user
60
          directory = key_directory unless directory
61
          return if ::File.exist?(directory)
62
          begin
63
            resources(directory: directory)
64
          rescue ::Chef::Exceptions::ResourceNotFound
65
            self.directory directory do
66
              owner user
67
              mode '0700'
68
              recursive true
69
            end
70
          end
71
        end
72
73
        def provided_public_key
74
          return nil unless new_resource.public_key
75
          new_public_key(
76
            new_resource.type,
77
            new_resource.public_key,
78
            new_resource.public_key_comment
79
          )
80
        end
81
82
        def provided_private_key
83
          new_private_key(new_resource.content, new_resource.passphrase)
84
        end
85
86
        def provided_key_pair
87
          ::AMA::Chef::SSHPrivateKeys::Model::KeyPair.new.tap do |pair|
88
            pair.type = new_resource.type
89
            pair.private_key = new_resource.content
90
            pair.public_key = new_resource.public_key
91
            pair.passphrase = new_resource.passphrase
92
            pair.comment = new_resource.comment
93
          end
94
        end
95
96
        def generated_public_key!
97
          generate_public_key!(provided_private_key, new_resource.comment)
98
        end
99
100
        def key_directory
101
          return @key_directory if instance_variable_defined?(:@key_directory)
102
          data = new_resource
103
          @key_directory = data.parent_directory || ssh_directory(data.user)
104
        end
105
106
        def private_key_path
107
          "#{key_directory}/#{new_resource.id}"
108
        end
109
110
        def public_key_path
111
          "#{private_key_path}#{new_resource.public_key_suffix}"
112
        end
113
      end
114
    end
115
  end
116
end
117