kanrisuru 0.16.12 → 0.16.16

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd3a735e0a70fbbb36f076c0da975dfd3b9088a48d4efc4668de218d7c60f0e3
4
- data.tar.gz: 7b3eb81b6d3f3f1152d96963c0dd24d2effd0b84d7718dc613ae0a610b78544e
3
+ metadata.gz: c72c91f337408d0a7dee545cabeb07ba9fac668baf8d3c3dbb65d0e04a27e347
4
+ data.tar.gz: 28d8387d8081783dfd32031c202ffc5ec66e4a7fea3306e8cb35d117f2193c10
5
5
  SHA512:
6
- metadata.gz: 4c2647a730b53a3ab851e737526bc95f2a8b8f05bf7c4e7325b5a08be1e0bd90cc2c9815850f9f1635a03658566dc28c84e935dd069551ead0fd534ea8d9c78c
7
- data.tar.gz: ab3b397ed40a8b3282178dbb019f336455b9bbbd9d8b0f350695441735dbe65d7e25a3b346409f52c3449e11185c91b496df5384d6ad23b65017e29fda53e3d2
6
+ metadata.gz: 8a0d66db59619c3cb9e69567ef0ed08e564c53ca3171dccc7acd31410288dfa06ebfc5a5daa2ff09aa14cbbacf433175352928b8a6e837f2ba43217de5fb70ac
7
+ data.tar.gz: 8bfc4a39d3bb5ab4c9f180dd4e5682057a7c1fe5c5bd93e25a6d88280a6e12c79831e0c5d9cb05b2b3211b91e3c6161d585fcc20c2d851da100037393dd17752
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## Kanrisuru 0.16.16 (January 08, 2022) ##
2
+ * Fix issue with `download` command when downloading directories from remote server.
3
+
4
+ ## Kanrisuru 0.16.15 (January 07, 2022) ##
5
+ * Add recursive and all_targets opts to `umount` command.
6
+
7
+ ## Kanrisuru 0.16.14 (January 02, 2022) ##
8
+ * Fix `get_user` command by parsing output to get user name if uid is passed in.
9
+
10
+ ## Kanrisuru 0.16.13 (January 01, 2022) ##
11
+ * Add `non_unique` and `system` opts to `create_group` command
12
+
1
13
  ## Kanrisuru 0.16.12 (January 01, 2022) ##
2
14
  * Update date ranges for 2022 on license files.
3
15
  * Add unit test case for `Kanrisuru::Logger`.
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <h1>
2
- <img src="./logo/kanrisuru-logo.png" alt="Kanrisuru" width="400" height="100%"/>
2
+ <img src="https://s3.us-east-2.amazonaws.com/kanrisuru.com/kanrisuru-logo.png" alt="Kanrisuru" width="400" height="100%"/>
3
3
  </h1>
4
4
 
5
5
  <p>
@@ -126,8 +126,7 @@ module Kanrisuru
126
126
  field = field.downcase
127
127
  field = field.gsub(/\s/, '_')
128
128
  field = field.gsub('-', '_')
129
- field = field.gsub(':', '')
130
- field
129
+ field.gsub(':', '')
131
130
  end
132
131
 
133
132
  def dmi_type_to_struct(type)
@@ -8,6 +8,8 @@ module Kanrisuru
8
8
 
9
9
  command = Kanrisuru::Command.new("groupadd #{group}")
10
10
  command.append_arg('-g', gid)
11
+ command.append_flag('-o', opts[:non_unique])
12
+ command.append_flag('-r', opts[:system])
11
13
 
12
14
  execute_shell(command)
13
15
 
@@ -16,6 +16,9 @@ module Kanrisuru
16
16
 
17
17
  command.append_flag('-l', opts[:lazy])
18
18
  command.append_flag('-f', opts[:force])
19
+
20
+ command.append_flag('--all-targets', opts[:all_targets])
21
+ command.append_flag('--recursive', opts[:recursive])
19
22
 
20
23
  if Kanrisuru::Util.present?(all)
21
24
  command.append_flag('-a')
@@ -4,21 +4,41 @@ module Kanrisuru
4
4
  module Core
5
5
  module Transfer
6
6
  def download(remote_path, local_path = nil, opts = {})
7
+ recursive = opts[:recursive] || false
8
+
9
+ remote_path += '/' if !remote_path.end_with?('/') && recursive
10
+ local_path += '/' if !local_path.nil? && !local_path.end_with?('/') && recursive
11
+
7
12
  if local_path.instance_of?(Hash)
8
13
  opts = local_path
9
14
  local_path = nil
10
15
  end
11
16
 
12
- tmp_path = "/tmp/kanrisuru-tmp-#{Time.now.to_i}-#{object_id}"
17
+ tmp_name = "kanrisuru-tmp-#{Time.now.to_i}-#{object_id}"
18
+ tmp_path = "/tmp/#{tmp_name}"
13
19
 
14
20
  begin
15
- result = cp(remote_path, tmp_path, force: true)
21
+ result = cp(remote_path, tmp_path, force: true, follow: true, recursive: recursive)
16
22
  raise 'Unable to copy remote file to temp path' unless result.success?
17
23
 
24
+ result = chown(tmp_path, owner: @username, group: @username, recursive: recursive)
25
+ raise 'Unable to update owner or group for temp path' unless result.success?
26
+
27
+ result = chmod(tmp_path, 'u+r', recursive: true)
28
+ raise 'Unable to update owner permission read access' unless result.success?
29
+
30
+ local_path = ::File.expand_path(local_path) if local_path
18
31
  result = ssh.scp.download!(tmp_path, local_path, opts)
19
- Kanrisuru::Util.blank?(local_path) ? result : local_path
32
+ return false unless result
33
+
34
+ if Kanrisuru::Util.present?(local_path) && recursive
35
+ remote_dirname = remote_path.split('/').last
36
+ FileUtils.mv("#{local_path}/#{tmp_name}", "#{local_path}/#{remote_dirname}")
37
+ else
38
+ result
39
+ end
20
40
  ensure
21
- rm(tmp_path, force: true) if inode?(tmp_path)
41
+ rm(tmp_path, force: true, recursive: recursive) if inode?(tmp_path)
22
42
  end
23
43
  end
24
44
  end
@@ -12,9 +12,7 @@ module Kanrisuru
12
12
 
13
13
  ## Need to copy internal dir contents, not the tmp dir itself
14
14
  if opts[:recursive]
15
- unless dir?(remote_path)
16
- mkdir(remote_path, silent: true)
17
- end
15
+ mkdir(remote_path, silent: true) unless dir?(remote_path)
18
16
 
19
17
  result = cp("#{tmp_path}/*", remote_path, recursive: true)
20
18
  else
@@ -22,6 +20,7 @@ module Kanrisuru
22
20
  end
23
21
 
24
22
  raise "Unable to move file to remote path - #{result.command.raw_result}" unless result.success?
23
+
25
24
  stat(remote_path)
26
25
  ensure
27
26
  rm(tmp_path, force: true) if inode?(tmp_path)
@@ -8,11 +8,16 @@ module Kanrisuru
8
8
  execute_shell(command)
9
9
 
10
10
  Kanrisuru::Result.new(command) do |cmd|
11
- ## Get user id
12
- result = get_uid(user)
13
- break if result.failure?
14
-
15
- uid = result.to_i
11
+ if Kanrisuru::Util.numeric?(user)
12
+ uid = user.to_i
13
+ user = Parser::User.parse(cmd)
14
+ else
15
+ ## Get user id
16
+ result = get_uid(user)
17
+ break if result.failure?
18
+
19
+ uid = result.to_i
20
+ end
16
21
 
17
22
  ## Get all groups for the user, with gid and group name
18
23
  array = Parser::Groups.parse(cmd)
@@ -24,12 +29,12 @@ module Kanrisuru
24
29
  end
25
30
 
26
31
  ## Get home / shell path information
27
- cmd = Kanrisuru::Command.new("getent passwd #{user}")
28
- cmd | "awk -F: '{print $6, $7}'"
32
+ command2 = Kanrisuru::Command.new("getent passwd #{user}")
33
+ command2 | "awk -F: '{print $6, $7}'"
29
34
 
30
- execute(cmd)
35
+ execute(command2)
31
36
 
32
- result = Kanrisuru::Result.new(cmd) do |cmd2|
37
+ result = Kanrisuru::Result.new(command2) do |cmd2|
33
38
  Parser::Getent.parse(cmd2)
34
39
  end
35
40
 
@@ -2,3 +2,4 @@
2
2
 
3
3
  require_relative 'parsers/getent'
4
4
  require_relative 'parsers/groups'
5
+ require_relative 'parsers/user'
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module User
6
+ module Parser
7
+ class User
8
+ def self.parse(command)
9
+ string = command.to_s
10
+ string = string.split[0]
11
+
12
+ matches = string.match(/uid=\d+\((.+)\)/)
13
+ return if !matches || !matches.captures
14
+
15
+ matches.captures.first
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kanrisuru
4
- VERSION = '0.16.12'
4
+ VERSION = '0.16.16'
5
5
  end
@@ -68,7 +68,7 @@ RSpec.describe Kanrisuru::Core::Find do
68
68
  paths: '/dev',
69
69
  iname: 'tty*'
70
70
  ),
71
- "find /dev -iname tty*")
71
+ 'find /dev -iname tty*')
72
72
 
73
73
  expect_command(host.find(
74
74
  paths: '/dev',
@@ -21,7 +21,12 @@ RSpec.describe Kanrisuru::Core::Group do
21
21
 
22
22
  it 'prepares create_group command' do
23
23
  expect_command(host.create_group('admin'), 'groupadd admin')
24
- expect_command(host.create_group('admin', { gid: 9000 }), 'groupadd admin -g 9000')
24
+ expect_command(host.create_group('admin',
25
+ gid: 9000,
26
+ non_unique: true),
27
+ 'groupadd admin -g 9000 -o')
28
+
29
+ expect_command(host.create_group('admin', gid: 12, system: true), 'groupadd admin -g 12 -r')
25
30
  end
26
31
 
27
32
  it 'prepares delete_group command' do
@@ -95,6 +95,8 @@ RSpec.describe Kanrisuru::Core::Mount do
95
95
 
96
96
  it 'prepares umount command' do
97
97
  expect_command(host.umount, 'umount')
98
+ expect_command(host.umount(recursive: true, all_targets: true), 'umount --all-targets --recursive')
99
+
98
100
  expect_command(host.umount(
99
101
  fake: true,
100
102
  no_canonicalize: true,
@@ -85,9 +85,9 @@ RSpec.describe Kanrisuru::Remote::Cluster do
85
85
  expect(command.prepared_command).to eq('sudo -u root /bin/bash -c "ls"')
86
86
  expect(cloned_command.prepared_command).to eq('sudo -u root /bin/bash -c "ls"')
87
87
 
88
- expect {
88
+ expect do
89
89
  cluster.send(:create_command, 1)
90
- }.to raise_error(ArgumentError)
90
+ end.to raise_error(ArgumentError)
91
91
  end
92
92
 
93
93
  it 'runs execute for a command on a cluster' do
@@ -178,8 +178,8 @@ RSpec.describe Kanrisuru::Remote::Cluster do
178
178
 
179
179
  cluster.cd('/etc')
180
180
  cluster.each do |host|
181
- expect(host.instance_variable_get(:@current_dir)).to eq('/etc')
182
- end
181
+ expect(host.instance_variable_get(:@current_dir)).to eq('/etc')
182
+ end
183
183
 
184
184
  StubNetwork.unstub_command!(:pwd)
185
185
  StubNetwork.unstub_command!(:realpath)
@@ -198,18 +198,18 @@ RSpec.describe Kanrisuru::Remote::Cluster do
198
198
 
199
199
  cluster.chdir('/etc')
200
200
  cluster.each do |host|
201
- expect(host.instance_variable_get(:@current_dir)).to eq('/etc')
202
- end
201
+ expect(host.instance_variable_get(:@current_dir)).to eq('/etc')
202
+ end
203
203
 
204
204
  StubNetwork.unstub_command!(:pwd)
205
205
  StubNetwork.unstub_command!(:realpath)
206
206
  end
207
-
207
+
208
208
  it 'fails to remove a host from a cluster' do
209
209
  cluster = described_class.new(host1, host2)
210
210
 
211
- expect {
211
+ expect do
212
212
  cluster.delete(1)
213
- }.to raise_error(ArgumentError)
213
+ end.to raise_error(ArgumentError)
214
214
  end
215
215
  end
@@ -34,6 +34,7 @@ RSpec.shared_examples 'transfer' do |os_name, host_json, spec_dir|
34
34
  keys: [host_json['ssh_key']]
35
35
  )
36
36
 
37
+ FileUtils.rm_rf("../test-output-#{os_name}")
37
38
  host.rmdir(spec_dir)
38
39
  host.disconnect
39
40
  end
@@ -80,7 +81,7 @@ RSpec.shared_examples 'transfer' do |os_name, host_json, spec_dir|
80
81
  src_path = '/etc/hosts'
81
82
 
82
83
  result = host.download(src_path, path)
83
- expect(result).to eq(path)
84
+ expect(result).to be_truthy
84
85
  FileUtils.rm(path)
85
86
  end
86
87
 
@@ -93,6 +94,22 @@ RSpec.shared_examples 'transfer' do |os_name, host_json, spec_dir|
93
94
  expect(lines.length).to be >= 1
94
95
  end
95
96
 
97
+ it 'downloads a dir' do
98
+ remote_path = '/var/log'
99
+ local_path = "../test-output-#{os_name}"
100
+ FileUtils.mkdir(local_path)
101
+
102
+ host.su('root')
103
+ result = host.download(remote_path, local_path, recursive: true)
104
+ expect(result).not_to be nil
105
+
106
+ paths = host.ls(path: '/var/log').map(&:path)
107
+ Dir.glob("#{local_path}/log/*").each do |file|
108
+ name = File.basename(file)
109
+ expect(paths).to include(name)
110
+ end
111
+ end
112
+
96
113
  it 'wgets url' do
97
114
  result = host.wget('https://example.com', directory_prefix: spec_dir)
98
115
  expect(result).to be_success
@@ -35,7 +35,7 @@ RSpec.shared_examples 'user' do |os_name, host_json, _spec_dir|
35
35
  expect(host.get_uid('asdf').to_i).to eq(nil)
36
36
  end
37
37
 
38
- it 'gets a user details' do
38
+ it 'gets a user details by name' do
39
39
  result = host.get_user(host_json['username'])
40
40
  expect(result.uid).to eq(1000)
41
41
  expect(result.name).to eq(host_json['username'])
@@ -49,6 +49,20 @@ RSpec.shared_examples 'user' do |os_name, host_json, _spec_dir|
49
49
  end
50
50
  end
51
51
 
52
+ it 'gets a user details by uid' do
53
+ result = host.get_user(1000)
54
+ expect(result.uid).to eq(1000)
55
+ expect(result.name).to eq(host_json['username'])
56
+ expect(result.home.path).to eq(host_json['home'])
57
+
58
+ case os_name
59
+ when 'opensuse', 'sles'
60
+ expect(result.groups[0]).to have_attributes(gid: 100, name: 'users')
61
+ else
62
+ expect(result.groups[0]).to have_attributes(gid: 1000, name: host_json['username'])
63
+ end
64
+ end
65
+
52
66
  it 'manages a user' do
53
67
  ## Need priviledge escalation to manage group
54
68
  host.su('root')
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.shared_examples 'cluster' do |os_name, host_json, spec_dir|
5
+ RSpec.shared_examples 'cluster' do |os_name, host_json, _spec_dir|
6
6
  context "with #{os_name}" do
7
7
  let(:host1) do
8
8
  Kanrisuru::Remote::Host.new(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kanrisuru
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.12
4
+ version: 0.16.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Mammina
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-01 00:00:00.000000000 Z
11
+ date: 2022-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parallel_tests
@@ -347,6 +347,7 @@ files:
347
347
  - lib/kanrisuru/core/user/parser.rb
348
348
  - lib/kanrisuru/core/user/parsers/getent.rb
349
349
  - lib/kanrisuru/core/user/parsers/groups.rb
350
+ - lib/kanrisuru/core/user/parsers/user.rb
350
351
  - lib/kanrisuru/core/user/types.rb
351
352
  - lib/kanrisuru/core/yum.rb
352
353
  - lib/kanrisuru/core/yum/commands.rb