linux_admin 0.17.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
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