minionizer 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,58 +5,95 @@ module Minionizer
5
5
 
6
6
  describe FileInjection do
7
7
  let(:session) { 'MockSession' }
8
- let(:source_path) { 'data/source_file.txt'}
9
8
  let(:target_path) { '/var/target_file.txt'}
10
- let(:injection) { FileInjection.new(session, options) }
9
+ let(:string_io_creator) { mock('StringIO') }
10
+ let(:injection) { FileInjection.new(session, options.merge(string_io_creator: string_io_creator)) }
11
11
 
12
12
  describe '#call' do
13
13
  let(:source_contents) { 'Source Contents' }
14
+ let(:string_io) { mock('StringIO') }
14
15
 
15
16
  before do
16
- write_file(source_path, source_contents)
17
17
  session.expects(:exec).with(%Q{mkdir --parents #{File.dirname(target_path)}})
18
- session.expects(:exec).with(%Q{echo '#{source_contents}' > #{target_path}})
18
+ session.expects(:scp).with(string_io, target_path)
19
19
  end
20
20
 
21
- describe 'only source and target are provided' do
22
- let(:options) {{ source_path: source_path, target_path: target_path }}
21
+ describe 'provides raw contents instead of source file' do
22
+ let(:options) {{ contents: source_contents, target_path: target_path }}
23
23
 
24
- it 'sends a command to session' do
24
+ it 'writes the contents to the file' do
25
+ string_io_creator.expects(:new).with(source_contents).returns(string_io)
25
26
  injection.call
26
27
  end
27
-
28
28
  end
29
29
 
30
- describe 'mode is provided' do
31
- let(:mode) { '0700' }
32
- let(:options) {{ source_path: source_path, target_path: target_path, mode: mode }}
30
+ describe 'source file is provided' do
33
31
 
34
- it 'sets the file permissions' do
35
- session.expects(:exec).with(%Q{chmod #{mode} #{target_path}})
36
- injection.call
32
+ before do
33
+ write_file(source_path, source_contents)
37
34
  end
38
- end
39
35
 
40
- describe 'owner is provided' do
41
- let(:ownername) { 'otheruser' }
42
- let(:options) {{ source_path: source_path, target_path: target_path, owner: ownername }}
36
+ describe 'source is plain text file' do
37
+ let(:source_path) { 'data/source_file.txt'}
38
+ let(:options) {{ source_path: source_path, target_path: target_path }}
43
39
 
44
- it 'sets the file owner' do
45
- session.expects(:exec).with(%Q{chown #{ownername} #{target_path}})
46
- injection.call
47
- end
48
- end
40
+ before do
41
+ string_io_creator.expects(:new).with(source_contents).returns(string_io)
42
+ end
49
43
 
50
- describe 'group is provided' do
51
- let(:groupname) { 'othergroup' }
52
- let(:options) {{ source_path: source_path, target_path: target_path, group: groupname }}
44
+ it 'sends a command to session' do
45
+ injection.call
46
+ end
47
+
48
+ describe 'mode is provided' do
49
+ let(:mode) { '0700' }
50
+ let(:options) {{ source_path: source_path, target_path: target_path, mode: mode }}
51
+
52
+ it 'sets the file permissions' do
53
+ session.expects(:exec).with(%Q{chmod #{mode} #{target_path}})
54
+ injection.call
55
+ end
56
+ end
57
+
58
+ describe 'owner is provided' do
59
+ let(:ownername) { 'otheruser' }
60
+ let(:options) {{ source_path: source_path, target_path: target_path, owner: ownername }}
61
+
62
+ it 'sets the file owner' do
63
+ session.expects(:exec).with(%Q{chown #{ownername} #{target_path}})
64
+ injection.call
65
+ end
66
+ end
67
+
68
+ describe 'group is provided' do
69
+ let(:groupname) { 'othergroup' }
70
+ let(:options) {{ source_path: source_path, target_path: target_path, group: groupname }}
71
+
72
+ it 'sets the file group' do
73
+ session.expects(:exec).with(%Q{chgrp #{groupname} #{target_path}})
74
+ injection.call
75
+ end
76
+ end
53
77
 
54
- it 'sets the file group' do
55
- session.expects(:exec).with(%Q{chgrp #{groupname} #{target_path}})
56
- injection.call
57
78
  end
79
+
80
+ describe 'source is erb file' do
81
+ let(:source_path) { 'data/source_file.erb'}
82
+ let(:injectable_contents) { 'Successfully Injected Contents' }
83
+ let(:contents_template) { 'Source Contents with ERB: ERB_HERE' }
84
+ let(:source_contents) { contents_template.gsub('ERB_HERE', '<%= injectable_contents %>') }
85
+ let(:expected_contents) { contents_template.gsub('ERB_HERE', injectable_contents) }
86
+ let(:options) {{ source_path: source_path, target_path: target_path }}
87
+
88
+ it 'processes the erb' do
89
+ string_io_creator.expects(:new).with(expected_contents).returns(string_io)
90
+ injection.call
91
+ end
92
+ end
93
+
58
94
  end
59
95
 
96
+
60
97
  end
61
98
 
62
99
  end
@@ -6,35 +6,46 @@ module Minionizer
6
6
  describe PublicSshKeyInjection do
7
7
 
8
8
  describe '#call' do
9
- let(:temp_file_path) { '/tmp/foobar' }
10
- let(:temp_file_pointer) { OpenStruct.new(path: temp_file_path) }
11
- let(:file_injection) { 'MockFileInjection' }
12
- let(:file_injection_creator) { 'MockFileInjectionCreator' }
9
+ let(:key) { 'foobar' }
10
+ let(:file_injection) { mock('file_injecton') }
11
+ let(:folder_creation) { mock('folder_creation') }
12
+ let(:file_injection_creator) { mock('FileInjection') }
13
+ let(:folder_creation_creator) { mock('FolderCreation') }
13
14
  let(:session) { 'MockSession' }
14
15
  let(:username) { 'foouser' }
15
16
  let(:key_injection_options) {{
16
17
  target_username: username,
17
- file_injection_creator: file_injection_creator
18
+ file_injection_creator: file_injection_creator,
19
+ folder_creation_creator: folder_creation_creator
18
20
  }}
19
21
  let(:key_injection) { PublicSshKeyInjection.new(session, key_injection_options) }
22
+ let(:expected_folder_creation_options) {[
23
+ session,
24
+ {
25
+ :path => "/home/#{username}/.ssh",
26
+ :owner => username,
27
+ :group => username,
28
+ mode: 700
29
+ }
30
+ ]}
20
31
  let(:expected_file_injection_options) {[
21
32
  session,
22
33
  {
23
- :source_path => temp_file_path,
24
- :target_path => "~#{username}/.ssh/authorized_keys",
34
+ :contents => key,
35
+ :target_path => "/home/#{username}/.ssh/authorized_keys",
25
36
  :owner => username,
26
- :group => username
37
+ :group => username,
38
+ mode: 600
27
39
  }
28
40
  ]}
29
41
 
30
42
  before do
31
- temp_file_pointer.expects(:unlink)
32
- Tempfile.expects(:new).yields(temp_file_pointer).returns(temp_file_pointer)
33
43
  write_file('data/public_keys/foobar.pubkey', 'foobar')
34
- temp_file_pointer.expects(:puts).with('foobar')
35
44
  end
36
45
 
37
46
  it 'injects the file' do
47
+ folder_creation_creator.expects(:new).with(*expected_folder_creation_options).returns(folder_creation)
48
+ folder_creation.expects(:call)
38
49
  file_injection_creator.expects(:new).with(*expected_file_injection_options).returns(file_injection)
39
50
  file_injection.expects(:call)
40
51
 
@@ -3,7 +3,7 @@ require 'test_helper'
3
3
  module Minionizer
4
4
  class TaskTemplateTest < MiniTest::Test
5
5
  describe TaskTemplate do
6
- let(:session) { 'MockSession' }
6
+ let(:session) { Minitest::Mock.new }
7
7
  let(:template) { TaskTemplate.new(session, :foo => 'bar') }
8
8
 
9
9
  describe '#method_missing' do
@@ -30,6 +30,14 @@ module Minionizer
30
30
  refute(template.respond_to?(:foobar))
31
31
  end
32
32
  end
33
+
34
+ describe '#download_file' do
35
+ it 'downloads a file' do
36
+ session.expect(:exec, true, [/wget/])
37
+ template.download_file('source','destination')
38
+ session.verify
39
+ end
40
+ end
33
41
  end
34
42
  end
35
43
  end
@@ -0,0 +1,145 @@
1
+ require 'test_helper'
2
+
3
+ module Minionizer
4
+ class CryptographerTest < MiniTest::Test
5
+ describe Cryptographer do
6
+ let(:cryptographer) { Cryptographer.new }
7
+ let(:unencrypted_filename) { 'foobar.txt' }
8
+ let(:encrypted_filename) { "#{unencrypted_filename}.enc" }
9
+ let(:path_to_unencrypted_filename) { "#{Cryptographer::SECRET_FOLDER}/#{unencrypted_filename}" }
10
+ let(:path_to_encrypted_filename) { "#{Cryptographer::SAFE_FOLDER}/#{encrypted_filename}" }
11
+ let(:path_to_stored_sha) { "#{Cryptographer::SAFE_FOLDER}/#{unencrypted_filename}.sha" }
12
+
13
+ before do
14
+ Dir.stubs(:foreach).with(Cryptographer::SECRET_FOLDER).yields(unencrypted_filename)
15
+ Dir.stubs(:foreach).with(Cryptographer::SAFE_FOLDER).yields(encrypted_filename)
16
+ @stdout = $stdout
17
+ $stdout = StringIO.new
18
+ end
19
+
20
+ after do
21
+ $stdout = @stdout
22
+ end
23
+
24
+ describe '#generate_key' do
25
+
26
+ it 'generates a key' do
27
+ cryptographer.expects(:system).with() { |c| c.match(/--gen-key/) }
28
+ cryptographer.generate_key
29
+ end
30
+
31
+ end
32
+
33
+ describe '#encrypt_secrets' do
34
+
35
+ describe 'when remote sha does not exist' do
36
+
37
+ before do
38
+ File.expects(:exists?).with(path_to_stored_sha).returns(false)
39
+ cryptographer.stubs(:`).with() { |c| c.match(/--fingerprint/) }.
40
+ returns("fingerprint\n")
41
+ cryptographer.stubs(:system).with() { |c| c.match(/sha512sum/) }
42
+ cryptographer.stubs(:system).with() do |c|
43
+ c.match(/--encrypt #{path_to_unencrypted_filename}/)
44
+ end
45
+ end
46
+
47
+ it 'encrypts the file' do
48
+ cryptographer.expects(:system).with() do |c|
49
+ c.match(/--encrypt #{path_to_unencrypted_filename}/)
50
+ end
51
+ cryptographer.encrypt_secrets
52
+ end
53
+
54
+ it 'generates the stored sha file' do
55
+ cryptographer.expects(:system).
56
+ with("sha512sum #{path_to_unencrypted_filename} > #{path_to_stored_sha}")
57
+ cryptographer.encrypt_secrets
58
+ end
59
+
60
+ end
61
+
62
+ describe 'when remote sha exists' do
63
+
64
+ before do
65
+ File.expects(:exists?).with(path_to_stored_sha).returns(true)
66
+ end
67
+
68
+ describe 'when shas match' do
69
+ before do
70
+ cryptographer.stubs(:`).with("sha512sum #{path_to_unencrypted_filename}").returns('SAMEY')
71
+ cryptographer.stubs(:`).with("cat #{path_to_stored_sha}").returns('SAMEY')
72
+ end
73
+
74
+ it 'does not encrypt the file' do
75
+ cryptographer.expects(:system).with() { |c| c.match(/--encrypt/) }.never
76
+ cryptographer.encrypt_secrets
77
+ end
78
+
79
+ end
80
+
81
+ describe 'when shas do not match' do
82
+ before do
83
+ cryptographer.stubs(:system).with() { |c| c.match(/sha512sum/) }
84
+ cryptographer.stubs(:`).with("sha512sum #{path_to_unencrypted_filename}").
85
+ returns('SAMEY')
86
+ cryptographer.stubs(:`).with("cat #{path_to_stored_sha}").returns('NOTSAMEY')
87
+ cryptographer.stubs(:`).with() { |c| c.match(/--fingerprint/) }.
88
+ returns("fingerprint\n")
89
+ cryptographer.stubs(:system).with() { |c| c.match(/--encrypt/) }
90
+ end
91
+
92
+ it 'encrypts the file' do
93
+ cryptographer.expects(:system).with() do |c|
94
+ c.match(/--encrypt #{path_to_unencrypted_filename}/)
95
+ end
96
+ cryptographer.encrypt_secrets
97
+ end
98
+
99
+ it 'generates the stored sha file' do
100
+ cryptographer.expects(:system).
101
+ with("sha512sum #{path_to_unencrypted_filename} > #{path_to_stored_sha}")
102
+ cryptographer.encrypt_secrets
103
+ end
104
+
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#decrypt_secrets' do
110
+ describe 'when shas match' do
111
+
112
+ before do
113
+ File.expects(:exists?).with(path_to_stored_sha).returns(true)
114
+ cryptographer.stubs(:`).with("sha512sum #{path_to_unencrypted_filename}").
115
+ returns('SAMEY')
116
+ cryptographer.stubs(:`).with("cat #{path_to_stored_sha}").returns('SAMEY')
117
+ end
118
+
119
+ it 'does not excrypt the file' do
120
+ cryptographer.expects(:system).with() { |c| c.match(/--decrypt/) }.never
121
+ cryptographer.decrypt_secrets
122
+ end
123
+ end
124
+
125
+ describe 'when shas do not match' do
126
+
127
+ before do
128
+ cryptographer.stubs(:`).with("sha512sum #{path_to_unencrypted_filename}").
129
+ returns('SAMEY')
130
+ cryptographer.stubs(:`).with("cat #{path_to_stored_sha}").returns('NOTSAMEY')
131
+ end
132
+
133
+ it 'decrypts the file' do
134
+ cryptographer.expects(:system).with() do |c|
135
+ c.match(/--decrypt #{path_to_encrypted_filename}/)
136
+ end
137
+ cryptographer.decrypt_secrets
138
+ end
139
+ end
140
+ end
141
+
142
+ end
143
+ end
144
+ end
145
+
@@ -0,0 +1,113 @@
1
+ require 'test_helper'
2
+
3
+ module Minionizer
4
+ class InitializationTest < MiniTest::Test
5
+
6
+ describe Initialization do
7
+ let(:path) { '/some/path' }
8
+ let(:initialization) { Initialization.new(path) }
9
+
10
+ describe '.create' do
11
+ it 'initializes and saves' do
12
+ Initialization.any_instance.expects(:save)
13
+ Initialization.create('/some/path')
14
+ end
15
+ end
16
+
17
+ describe '#save' do
18
+
19
+ before do
20
+ File.stubs(:readlines).with("#{path}/.gitignore").returns(['data/secrets'])
21
+ initialization.stubs(:system)
22
+ end
23
+
24
+ describe 'directory structure' do
25
+
26
+ before do
27
+ File.stubs(:readlines).with("#{path}/.gitignore").returns([])
28
+ end
29
+
30
+ let(:folders) {[
31
+ '', #root folder
32
+ '/config',
33
+ '/data/encrypted_secrets',
34
+ '/data/public_keys',
35
+ '/data/secrets',
36
+ '/lib',
37
+ '/roles'
38
+ ]}
39
+
40
+ it 'creates it quietly' do
41
+ folders.each do |folder|
42
+ initialization.expects(:system).with("mkdir -p #{path}#{folder}")
43
+ end
44
+ initialization.save
45
+ end
46
+ end
47
+
48
+ describe 'minions.yml' do
49
+
50
+ it 'touches the file' do
51
+ initialization.
52
+ expects(:system).
53
+ with("touch #{path}/config/minions.yml")
54
+ initialization.save
55
+ end
56
+ end
57
+
58
+ describe 'gitignore' do
59
+
60
+ before do
61
+ initialization.
62
+ stubs(:system).
63
+ with("touch #{path}/.gitignore")
64
+ end
65
+
66
+ it 'touches the file' do
67
+ initialization.
68
+ expects(:system).
69
+ with("touch #{path}/.gitignore")
70
+ initialization.save
71
+ end
72
+
73
+ describe 'secrets line already added to file' do
74
+
75
+ it 'does not add it again' do
76
+ #################################################################
77
+ ### Because obj.expects().with().never does not properly fail
78
+ ### when the method is called with the given parameters.
79
+ ### https://github.com/freerange/mocha/issues/82
80
+ ### http://stackoverflow.com/q/17287665/811172
81
+ class NeverError < StandardError; end
82
+ initialization.
83
+ stubs(:system).
84
+ with("echo 'data/secrets' > #{path}/.gitignore").
85
+ raises(NeverError)
86
+ begin
87
+ initialization.save
88
+ rescue NeverError
89
+ assert false
90
+ end
91
+ #################################################################
92
+ end
93
+ end
94
+
95
+ describe 'secrets line is not in file' do
96
+
97
+ before do
98
+ File.stubs(:readlines).with("#{path}/.gitignore").returns(['foo/bar'])
99
+ end
100
+
101
+ it 'adds it to the file' do
102
+ initialization.
103
+ expects(:system).
104
+ with("echo 'data/secrets' > #{path}/.gitignore")
105
+ initialization.save
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ end
113
+ end
@@ -8,22 +8,64 @@ module Minionizer
8
8
  let(:username) { 'foo' }
9
9
  let(:password) { 'bar' }
10
10
  let(:credentials) {{ 'username' => username, 'password' => password }}
11
- let(:connector) { mock('connector') }
11
+ let(:ssh_connector) { mock('ssh_connector') }
12
+ let(:scp_connector) { mock('scp_connector') }
12
13
  let(:command_executor) { mock('CommandExecution') }
13
14
  let(:execution) { mock('execution') }
14
- let(:connection) { mock('connection') }
15
- let(:session) { Session.new(fqdn, credentials, connector, command_executor) }
15
+ let(:ssh_connection) { mock('ssh_connection') }
16
+ let(:scp_connection) { mock('scp_connection') }
17
+ let(:session) { Session.new(fqdn, credentials, ssh_connector, scp_connector, command_executor) }
16
18
  let(:start_args) { [fqdn, username, { password: password }]}
17
19
 
18
20
  it 'instantiates' do
19
21
  assert_kind_of(Session, session)
20
22
  end
21
23
 
24
+ describe '#scp' do
25
+ let(:source_path) { '/source/path' }
26
+ let(:target_path) { '/target/path' }
27
+
28
+ before do
29
+ scp_connector.expects(:start).with(*start_args).returns(scp_connection)
30
+ end
31
+
32
+ describe 'straight scp' do
33
+
34
+ it 'copies the file to the target location' do
35
+ scp_connection.expects(:upload!).with(source_path, target_path)
36
+ session.scp(source_path, target_path)
37
+ end
38
+
39
+ end
40
+
41
+ describe 'within sudo block' do
42
+ let(:hex) { 'securehex' }
43
+ let(:temp_filename) { "#{hex}.minionizer_tempfile" }
44
+
45
+ before do
46
+ ssh_connector.expects(:start).with(*start_args).returns(ssh_connection)
47
+ SecureRandom.expects(:hex).returns(hex)
48
+ end
49
+
50
+ it 'copies the file to temp location and then moves it' do
51
+ scp_connection.expects(:upload!).with(source_path, temp_filename)
52
+ command_executor.
53
+ expects(:new).
54
+ with(ssh_connection, sudoized("mv #{temp_filename} #{target_path}"), {}).
55
+ returns(OpenStruct.new(:call => true))
56
+ session.sudo do |sudo_session|
57
+ sudo_session.scp(source_path, target_path)
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+
22
64
  describe 'running commands' do
23
65
  let(:command) { 'foobar' }
24
66
 
25
67
  before do
26
- connector.expects(:start).with(*start_args).returns(connection)
68
+ ssh_connector.expects(:start).with(*start_args).returns(ssh_connection)
27
69
  end
28
70
 
29
71
  describe '#sudo' do
@@ -33,7 +75,7 @@ module Minionizer
33
75
  it 'prepends sudo onto the command line' do
34
76
  command_executor.
35
77
  expects(:new).
36
- with(connection, sudoized(command)).
78
+ with(ssh_connection, sudoized(command), {}).
37
79
  returns(OpenStruct.new(:call => true))
38
80
  session.sudo do
39
81
  session.exec(command)
@@ -46,7 +88,7 @@ module Minionizer
46
88
  it 'prepends sudo onto the command line' do
47
89
  command_executor.
48
90
  expects(:new).
49
- with(connection, sudoized(command)).
91
+ with(ssh_connection, sudoized(command), {}).
50
92
  returns(OpenStruct.new(:call => true))
51
93
  session.sudo(command)
52
94
  end
@@ -60,7 +102,7 @@ module Minionizer
60
102
  commands.each do |command|
61
103
  command_executor.
62
104
  expects(:new).
63
- with(connection, sudoized(command)).
105
+ with(ssh_connection, sudoized(command), {}).
64
106
  returns(OpenStruct.new(:call => true))
65
107
  end
66
108
  session.sudo(*commands)
@@ -76,7 +118,7 @@ module Minionizer
76
118
  it 'passes the command to the executor' do
77
119
  command_executor.
78
120
  expects(:new).
79
- with(connection, command).
121
+ with(ssh_connection, command, {}).
80
122
  returns(OpenStruct.new(:call => true))
81
123
  session.exec(command)
82
124
  end
@@ -90,7 +132,7 @@ module Minionizer
90
132
  commands.each do |command|
91
133
  command_executor.
92
134
  expects(:new).
93
- with(connection, command).
135
+ with(ssh_connection, command, {}).
94
136
  returns(OpenStruct.new(:call => true))
95
137
  end
96
138
  session.exec(*commands)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minionizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan S. Garvin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-11 00:00:00.000000000 Z
11
+ date: 2014-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: binding_of_caller
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.7'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.7'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: net-ssh
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '2.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: net-scp
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: fakefs
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +94,20 @@ dependencies:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
96
  version: '1.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '5.4'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '5.4'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: rake
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -105,6 +147,8 @@ files:
105
147
  - lib/minionizer.rb
106
148
  - lib/minionizer/command_execution.rb
107
149
  - lib/minionizer/configuration.rb
150
+ - lib/minionizer/cryptographer.rb
151
+ - lib/minionizer/initialization.rb
108
152
  - lib/minionizer/minion.rb
109
153
  - lib/minionizer/minionization.rb
110
154
  - lib/minionizer/role_template.rb
@@ -122,6 +166,8 @@ files:
122
166
  - test/unit/lib/core/user_creation_test.rb
123
167
  - test/unit/lib/minionizer/command_execution_test.rb
124
168
  - test/unit/lib/minionizer/configuration_test.rb
169
+ - test/unit/lib/minionizer/cryptographer_test.rb
170
+ - test/unit/lib/minionizer/initialization_test.rb
125
171
  - test/unit/lib/minionizer/minion_test.rb
126
172
  - test/unit/lib/minionizer/minionization_test.rb
127
173
  - test/unit/lib/minionizer/role_template_test.rb
@@ -161,6 +207,8 @@ test_files:
161
207
  - test/unit/lib/core/user_creation_test.rb
162
208
  - test/unit/lib/minionizer/command_execution_test.rb
163
209
  - test/unit/lib/minionizer/configuration_test.rb
210
+ - test/unit/lib/minionizer/cryptographer_test.rb
211
+ - test/unit/lib/minionizer/initialization_test.rb
164
212
  - test/unit/lib/minionizer/minion_test.rb
165
213
  - test/unit/lib/minionizer/minionization_test.rb
166
214
  - test/unit/lib/minionizer/role_template_test.rb