linux_admin 0.17.0 → 0.18.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6162494c6bbe50d72eb1ba5f6102b51ad3fef53d
4
- data.tar.gz: 4a33bb3aa96008c3ca5b21f70456215d368077ed
3
+ metadata.gz: a90ef3973da3f00152bf552f74cab0baa544af95
4
+ data.tar.gz: f296bf3c99266062abc2cc1f67d987aa0e974ec2
5
5
  SHA512:
6
- metadata.gz: b318a87324409d59dd08155db3bff3e4c076fc1ea289f21e8b449c3c670f1a96466d3d4d62003eeec33d8889c6b257080db0ceb64bfba2ed7c62f3a703235246
7
- data.tar.gz: ac2029fe7890c370a2c30d2a5b46cfafb94bb5aa55838d9798632c870d20d42d3e2835ac25c3d9d4edef533bc65090447fe112fa983e8707f9348d777bd2e217
6
+ metadata.gz: c010a5739c54682ca620bfb4b0851d28e785e063225230c0e848472dfb1359876e27ea7880881838e6c93cf1de30a31a470e4b605e301e8af3c642023e9e953b
7
+ data.tar.gz: f1f10c4d2bb146033cb405a35b7f510618b7c6cde0d5226b81ea4daa52d6bd44c6a40642ed504f427cebf655ee6784aa4752304c7fed5ed773420a5002c6c942
data/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
  [![Code Climate](http://img.shields.io/codeclimate/github/ManageIQ/linux_admin.svg)](https://codeclimate.com/github/ManageIQ/linux_admin)
6
6
  [![Coverage Status](http://img.shields.io/coveralls/ManageIQ/linux_admin.svg)](https://coveralls.io/r/ManageIQ/linux_admin)
7
7
  [![Dependency Status](https://gemnasium.com/ManageIQ/linux_admin.svg)](https://gemnasium.com/ManageIQ/linux_admin)
8
+ [![Security](https://hakiri.io/github/ManageIQ/linux_admin/master.svg)](https://hakiri.io/github/ManageIQ/linux_admin/master)
9
+
8
10
 
9
11
  LinuxAdmin is a module to simplify management of linux systems.
10
12
  It should be a single place to manage various system level configurations,
data/lib/linux_admin.rb CHANGED
@@ -11,7 +11,8 @@ require 'linux_admin/rpm'
11
11
  require 'linux_admin/deb'
12
12
  require 'linux_admin/version'
13
13
  require 'linux_admin/yum'
14
-
14
+ require 'linux_admin/ssh'
15
+ require 'linux_admin/ssh_agent'
15
16
  require 'linux_admin/service'
16
17
  require 'linux_admin/mountable'
17
18
  require 'linux_admin/disk'
@@ -0,0 +1,88 @@
1
+ module LinuxAdmin
2
+ class SSH
3
+ attr_reader :ip
4
+ attr_reader :username
5
+ attr_reader :private_key
6
+ attr_reader :agent
7
+
8
+ def initialize(ip, username, private_key = nil, password = nil)
9
+ @ip = ip
10
+ @private_key = private_key
11
+ @username = username
12
+ @password = password
13
+ end
14
+
15
+ def perform_commands(commands = [], agent_socket = nil, stdin = nil)
16
+ require 'net/ssh'
17
+ if block_given?
18
+ execute_commands(commands, agent_socket, stdin, &Proc.new)
19
+ else
20
+ execute_commands(commands, agent_socket, stdin)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def execute_commands(commands, agent_socket, stdin)
27
+ result = nil
28
+ args = {:paranoid => false}
29
+ if agent_socket
30
+ args.merge!(:forward_agent => true,
31
+ :number_of_password_prompts => 0,
32
+ :agent_socket_factory => -> { UNIXSocket.open(agent_socket) })
33
+ elsif @private_key
34
+ args[:key_data] = [@private_key]
35
+ elsif @password
36
+ args[:password] = @password
37
+ end
38
+ Net::SSH.start(@ip, @username, args) do |ssh|
39
+ if block_given?
40
+ result = yield ssh
41
+ else
42
+ commands.each do |cmd|
43
+ result = ssh_exec!(ssh, cmd, stdin)
44
+ result[:last_command] = cmd
45
+ break if result[:exit_status] != 0
46
+ end
47
+ end
48
+ end
49
+ result
50
+ end
51
+
52
+ def ssh_exec!(ssh, command, stdin)
53
+ stdout_data = ''
54
+ stderr_data = ''
55
+ exit_status = nil
56
+ exit_signal = nil
57
+
58
+ ssh.open_channel do |channel|
59
+ channel.request_pty unless stdin
60
+ channel.exec(command) do |_, success|
61
+ channel.send_data(stdin) if stdin
62
+ channel.eof!
63
+ raise StandardError, "Command \"#{command}\" was unable to execute" unless success
64
+ channel.on_data do |_, data|
65
+ stdout_data << data
66
+ end
67
+ channel.on_extended_data do |_, _, data|
68
+ stderr_data << data
69
+ end
70
+ channel.on_request('exit-status') do |_, data|
71
+ exit_status = data.read_long
72
+ end
73
+
74
+ channel.on_request('exit-signal') do |_, data|
75
+ exit_signal = data.read_long
76
+ end
77
+ end
78
+ end
79
+ ssh.loop
80
+ {
81
+ :stdout => stdout_data,
82
+ :stderr => stderr_data,
83
+ :exit_status => exit_status,
84
+ :exit_signal => exit_signal
85
+ }
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,61 @@
1
+ require 'fileutils'
2
+ module LinuxAdmin
3
+ class SSHAgent
4
+ attr_accessor :pid
5
+ attr_reader :socket
6
+
7
+ def initialize(ssh_private_key, agent_socket = nil)
8
+ @socket = agent_socket
9
+ @private_key = ssh_private_key
10
+ end
11
+
12
+ def start
13
+ if @socket
14
+ FileUtils.mkdir_p(File.dirname(@socket))
15
+ agent_details = `ssh-agent -a #{@socket}`
16
+ else
17
+ agent_details = `ssh-agent`
18
+ @socket = parse_ssh_agent_socket(agent_details)
19
+ end
20
+ @pid = parse_ssh_agent_pid(agent_details)
21
+ IO.popen({'SSH_AUTH_SOCK' => @socket, 'SSH_AGENT_PID' => @pid}, ['ssh-add', '-'], :mode => 'w') do |f|
22
+ f.puts(@private_key)
23
+ end
24
+ raise StandardError, "Couldn't add key to agent" if $CHILD_STATUS.to_i != 0
25
+ end
26
+
27
+ def with_service
28
+ start
29
+ yield @socket
30
+ ensure
31
+ stop
32
+ end
33
+
34
+ def stop
35
+ system({'SSH_AGENT_PID' => @pid}, '(ssh-agent -k) &> /dev/null') if process_exists?(@pid)
36
+ File.delete(@socket) if File.exist?(@socket)
37
+ @socket = nil
38
+ @pid = nil
39
+ end
40
+
41
+ private
42
+
43
+ def process_exists?(process_pid)
44
+ Process.kill(0, process_pid) == 1
45
+ rescue
46
+ false
47
+ end
48
+
49
+ def parse_ssh_agent_socket(output)
50
+ parse_ssh_agent_output(output, 1)
51
+ end
52
+
53
+ def parse_ssh_agent_pid(output)
54
+ parse_ssh_agent_output(output, 2)
55
+ end
56
+
57
+ def parse_ssh_agent_output(output, index)
58
+ output.split('=')[index].split(' ')[0].chop
59
+ end
60
+ end
61
+ end
@@ -1,3 +1,3 @@
1
1
  module LinuxAdmin
2
- VERSION = "0.17.0"
2
+ VERSION = "0.18.0"
3
3
  end
data/spec/ssh_spec.rb ADDED
@@ -0,0 +1,53 @@
1
+ describe LinuxAdmin::SSH do
2
+ before(:each) do
3
+ require 'net/ssh'
4
+ @example_ssh_key = <<-eos
5
+ -----BEGIN RSA PRIVATE KEY-----
6
+ MIIEowIBAAKCAQEAasdvkMNteq7hjnqNE61ESnEHnaOtHxZffdsQ33R7BXcu9eCH
7
+ ncZadHmmfRZgMPQnHGX0NzboVKfdpdF40o+iGQKyy3wKqdgGnTAWqx/hxrsdsdgh
8
+ f/g7AABNjoWp1OiTX2Dn99SH9xPQtpdnwGlBmtPplV2wNcKouQwGbwb/u1EHHxnO
9
+ aSQk2tvKHRMgroLsyuM5ay7TrK5cip2QTMn9fieHIepH0qd8ETG+1Uf+XmZxhdMN
10
+ QsuiSbAAmuU9qwlXh6QOg1spJ97B/ZY6Ci4d5cdBCCtfjGDBm8CzbrfhYVNhGcNx
11
+ c3Y43ld6MJoE+hMuBrBSuZyBmf63AAMqJ8KeQwIDAQABAoIBAFMFXBoSWOy1V9z3
12
+ IkoY1ilBp5WKRvaPEMCgeCfZIjIG0Nmt5Knbkp2b3A8YWnGQlDHqdYz53t9RHaaU
13
+ KdCnJ9vUSYeeeNElMsCwMYVoZvA5Xpv9cw2YOeTrOzssX1VZv9WW1zHd0Srz9N3r
14
+ 719MgpyK4dZACw6ODeD/gh8+OH5OAN9sVbIGniApHZENxJrZzL22qE2asf8vVfgu
15
+ 9XNx3WhsdL6ktoeJWLKxTLwVP6xRK/ixvsayUFeMBC4E1+sBuz1z7p27kd8cEC5o
16
+ AEHSwF6nr+ix0JctbAYqPVFZi5zFH10WgxyF3asAiQPYrCrY9gT8OQSRDhhKyIXE
17
+ rHlLIfkCgYEA+RuY4vsqeU69APFXRCy9s/dcy8tS0Pslq/fq4KsdC4qRu39RjotN
18
+ /OXOtVMPRfjTiRHXi/0fvSfyMVgstCtfYpOcoz98tw2AX34AgAH6h57I29rVxk5q
19
+ OomgcauRYlmO9ge3429pvECL5EzBbRKwfwuMKHMNetLHdVMc7d165f0CgYEAzdGf
20
+ 6VMnZkK66XP/RzMvwUwvdhy+vIUjXFMjotQXYcYcLZadiZET7riOSRyVRvlNg0va
21
+ CexWtX+0yOZOrXCvLzSpO8Z91VnkHbRhnpy4bvW/qcFpwIvYeaMgr5C1lBHCIvZS
22
+ wSojNrdjAbdQoqab9X7Mxj2ubYGxUSSg715wqT8CgYBaY20iT0imI6/o+6lSj3l2
23
+ J7eAKxKtybNtptOPF6RVq74dbqFFO77cmPZcTPspxJPdFKBFp18w36G9zeTKq0I9
24
+ HpqjkZHLShbej3XW/ODO/Qqc29bd0e4xt2aEWGC0cxKwqzRKTk7rg/A+sqsszK9G
25
+ KgZ9VuH5QyokpDfHB6pkcQKBgChsq8PgGTT0llGT/ue1HgQROqEwNCZC4BcaHT21
26
+ +oGxr4cktfx3Cjsw9IFXo9o0zQyksUaRrNYpJxDuazWVlFLpPPQIoF5vMWbELwhA
27
+ L9lbWzG0U1kGHpaFe73/5ioW8tJ7HvXhmNj+W+vSXXwUzT0CkqW9J61Kc9FEKHfb
28
+ TLVxAoGBAM8WKsTfEMxuv5pabGTo8BC1ruz4c5qLJGLGnH4kWJm5o6ippugFsOlK
29
+ rDUWive4uLSKi3Fsb2kPw6gHuRGerFN1CBpCENLib3xG5Bd4XhmKZMDxqU2bO0gd
30
+ sV1Tr/acrE0aWBkD9RYrR2/UwG1zfXuIJeufdWf8c0SY3X6J7jJN
31
+ -----END RSA PRIVATE KEY-----
32
+ eos
33
+ end
34
+
35
+ it "should create a call using agent" do
36
+ expect(Net::SSH).to receive(:start).with("127.0.0.1", "root", :paranoid => false, :forward_agent => true, :number_of_password_prompts => 0, :agent_socket_factory => Proc).and_return(true)
37
+ ssh_agent = LinuxAdmin::SSHAgent.new(@example_ssh_key)
38
+ ssh_agent.with_service do |socket|
39
+ ssh = LinuxAdmin::SSH.new("127.0.0.1", "root")
40
+ ssh.perform_commands(%w("ls", "pwd"), socket)
41
+ end
42
+ end
43
+
44
+ it "should preform command using private key" do
45
+ expect(Net::SSH).to receive(:start).with("127.0.0.1", "root", :paranoid => false, :key_data => [@example_ssh_key]).and_return(true)
46
+ LinuxAdmin::SSH.new("127.0.0.1", "root", @example_ssh_key).perform_commands(%w("ls", "pwd"))
47
+ end
48
+
49
+ it "should preform command using password" do
50
+ expect(Net::SSH).to receive(:start).with("127.0.0.1", "root", :paranoid => false, :password => "password").and_return(true)
51
+ LinuxAdmin::SSH.new("127.0.0.1", "root", nil, "password").perform_commands(%w("ls", "pwd"))
52
+ end
53
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linux_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Dunne
@@ -13,10 +13,12 @@ authors:
13
13
  - Nick Carboni
14
14
  - Martin Hradil
15
15
  - Yuri Rudman
16
+ - Oleg Barenboim
17
+ - Alon Goldboim
16
18
  autorequire:
17
19
  bindir: bin
18
20
  cert_chain: []
19
- date: 2016-07-08 00:00:00.000000000 Z
21
+ date: 2016-07-25 00:00:00.000000000 Z
20
22
  dependencies:
21
23
  - !ruby/object:Gem::Dependency
22
24
  name: bundler
@@ -158,6 +160,20 @@ dependencies:
158
160
  - - ">="
159
161
  - !ruby/object:Gem::Version
160
162
  version: '0'
163
+ - !ruby/object:Gem::Dependency
164
+ name: net-ssh
165
+ requirement: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: 3.2.0
170
+ type: :runtime
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: 3.2.0
161
177
  description: |2
162
178
 
163
179
  LinuxAdmin is a module to simplify management of linux systems.
@@ -173,6 +189,8 @@ email:
173
189
  - ncarboni@redhat.com
174
190
  - mhradil@redhat.com
175
191
  - yrudman@redhat.com
192
+ - chessbyte@gmail.com
193
+ - alongoldboim@gmail.com
176
194
  executables: []
177
195
  extensions: []
178
196
  extra_rdoc_files: []
@@ -210,6 +228,8 @@ files:
210
228
  - lib/linux_admin/service.rb
211
229
  - lib/linux_admin/service/sys_v_init_service.rb
212
230
  - lib/linux_admin/service/systemd_service.rb
231
+ - lib/linux_admin/ssh.rb
232
+ - lib/linux_admin/ssh_agent.rb
213
233
  - lib/linux_admin/system.rb
214
234
  - lib/linux_admin/time_date.rb
215
235
  - lib/linux_admin/version.rb
@@ -261,6 +281,7 @@ files:
261
281
  - spec/service/systemd_service_spec.rb
262
282
  - spec/service_spec.rb
263
283
  - spec/spec_helper.rb
284
+ - spec/ssh_spec.rb
264
285
  - spec/subscription_manager_spec.rb
265
286
  - spec/system_spec.rb
266
287
  - spec/time_date_spec.rb
@@ -286,7 +307,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
307
  version: '0'
287
308
  requirements: []
288
309
  rubyforge_project:
289
- rubygems_version: 2.6.3
310
+ rubygems_version: 2.5.1
290
311
  signing_key:
291
312
  specification_version: 4
292
313
  summary: LinuxAdmin is a module to simplify management of linux systems.
@@ -335,6 +356,7 @@ test_files:
335
356
  - spec/service/systemd_service_spec.rb
336
357
  - spec/service_spec.rb
337
358
  - spec/spec_helper.rb
359
+ - spec/ssh_spec.rb
338
360
  - spec/subscription_manager_spec.rb
339
361
  - spec/system_spec.rb
340
362
  - spec/time_date_spec.rb