santoku 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/santoku +15 -3
  3. data/lib/santoku.rb +31 -101
  4. metadata +19 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a989d4dded0a7a81d6621f44ec3bb0c78892fdc
4
- data.tar.gz: 1c7f29375f4df5109cbcabeb4492df2d5e9e037d
3
+ metadata.gz: f2d8bfadb34d6d3a3afdfcc83ab1278c9a39e578
4
+ data.tar.gz: df7f809fa31474ab1eef2cbb3b75ce2541e0f903
5
5
  SHA512:
6
- metadata.gz: ba2a6132825146128a3f0ccce31afa5e13fd2cdb368ffeb2dded265e9963e5b5c510d4478b178cdc731ec339ec8a66f914a4a34625a2db3e6cfe5ec8f3d88ce1
7
- data.tar.gz: 8f32f409d780d30494197d19ee36a143fd65351640dfc6b74a9c5238820ca6fde07602ebbfd35e29d96c5f1352728dcd853996b591ed385e8cc04e40e2547256
6
+ metadata.gz: 3bbd5a78c001b6ba734b547c20964020560bf57bb75b5ab99d999946f974e0f8d41e388ad4f3a1430568ec57ad177f730a52d666a2d570888ab05bc63d8ad712
7
+ data.tar.gz: cb620bb5d996f0286047fd59d71ee456615e0241be082013c10a38e68d9e03b81ed6f917fb68f326c777726aa71ffb604733342e811f648136545ea916fc38d8
@@ -1,6 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'santoku'
3
+ require "rubygems"
4
+ require 'thor'
3
5
 
4
- command = ARGV[0]
5
- query = ARGV[1]
6
- Santoku.run(command, query)
6
+ class SantokuCommand < Thor
7
+ map '-t' => :test
8
+
9
+ desc 'test COMMAND [QUERY]', 'Execute command on nodes, scoped on the given query if query is given. Query syntax should be the same as `knife search` syntax.'
10
+ option :invert, type: :boolean, desc: "invert matched results (DOESN'T WORK YET)", default: false
11
+ option :timeout, type: :numeric, desc: 'timeout interval per ssh connection (default: 15)', default: 15
12
+ option :'print-success', type: :boolean, desc: 'prints output of successful commands', default: false
13
+ def test(command, query='name:*')
14
+ Santoku.test(command, query, options[:timeout], options[:'print-success'], options[:'invert'])
15
+ end
16
+ end
17
+
18
+ SantokuCommand.start
@@ -1,112 +1,42 @@
1
- require 'colorize'
2
- require 'net/ssh'
3
1
  require 'peach'
4
- require 'ridley'
5
- require 'yaml'
6
2
 
7
- class Santoku
8
- def self.run(command='uptime', query)
9
- output_stream = Array.new
10
- failed_output_stream = Array.new
11
- timeout_output_stream = Array.new
3
+ require 'santoku/helpers'
4
+ require 'santoku/printers'
12
5
 
13
- ridley.search(:node, query).peach(5) do |node|
14
- begin
15
- timeout 10 do
16
- Net::SSH.start(node.chef_id, 'root', paranoid: false, forward_agent: true) do |ssh|
17
- output = ssh_exec!(ssh, command)
18
- if output[2] != 0
19
- failed_output_stream.push "#{node.chef_id} error #{output[2]}: #{output[1]}"
20
- print 'F'.red
21
- else
22
- output_stream.push "#{node.chef_id}: #{output[0]}"
23
- print '.'.green
6
+ class Santoku
7
+ class << self
8
+ def test(command, query, timeout_interval, verbose_success, invert)
9
+ @verbose_success = verbose_success
10
+ @invert = invert
11
+
12
+ ridley.search(:node, query).peach(5) do |node|
13
+ begin
14
+ timeout timeout_interval do
15
+ Net::SSH.start(node.chef_id, 'root', paranoid: false, forward_agent: true) do |ssh|
16
+ output = ssh_exec!(ssh, command)
17
+ if output[2] == 0 && !invert?
18
+ succeeded "#{node.chef_id}: #{output[0]}"
19
+ elsif output[2] != 0 && invert?
20
+ succeeded "#{node.chef_id} returned #{output[2]}: #{output[1]} #{output[0]}"
21
+ else
22
+ failed "#{node.chef_id} returned #{output[2]}: #{output[1]} #{output[0]}"
23
+ end
24
24
  end
25
25
  end
26
+ rescue TimeoutError
27
+ timed_out "#{node.chef_id}: connection timed out"
28
+ rescue Errno::ETIMEDOUT
29
+ timed_out "#{node.chef_id}: Operation timed out - connect(2)"
30
+ rescue SocketError
31
+ timed_out "#{node.chef_id}: node does not resolve"
32
+ rescue Errno::EHOSTUNREACH
33
+ timed_out "#{node.chef_id}: no route to host"
34
+ rescue Exception => e
35
+ timed_out "#{node.chef_id}: #{e.inspect}"
26
36
  end
27
-
28
- rescue TimeoutError
29
- timeout_output_stream.push "#{node.chef_id}: connection timed out"
30
- print '*'.yellow
31
- rescue SocketError
32
- timeout_output_stream.push "#{node.chef_id}: node does not resolve"
33
- print '*'.yellow
34
- rescue Errno::EHOSTUNREACH
35
- timeout_output_stream.push "#{node.chef_id}: no route to host"
36
- print '*'.yellow
37
- rescue Exception => e
38
- failed_output_stream.push "#{node.chef_id}: #{e.inspect}"
39
- print 'F'.red
40
37
  end
41
- end
42
-
43
- print "\n"
44
-
45
- timeout_output_stream.each do |output|
46
- puts output.yellow
47
- end
48
-
49
- failed_output_stream.each do |output|
50
- puts output.red
51
- end
52
-
53
- output_stream.each do |output|
54
- puts output.green
55
- end
56
-
57
- puts "\n---------------------------------------\n"
58
-
59
- puts "#{'Success'.green}: #{output_stream.count}"
60
- puts "#{'Timed out or does not resolve'.yellow}: #{timeout_output_stream.count}"
61
- puts "#{'Failed'.red}: #{failed_output_stream.count}"
62
- end
63
38
 
64
- private
65
- def self.knife_config
66
- if ::File.exist?(File.expand_path("../knife.rb", __FILE__))
67
- Ridley::Chef::Config.from_file(File.expand_path("../knife.rb", __FILE__))
68
- elsif ::File.exist?("#{ENV['HOME']}/.chef/knife.rb")
69
- Ridley::Chef::Config.from_file("#{ENV['HOME']}/.chef/knife.rb")
70
- else
71
- raise 'Could not find knife.rb in current directory or home '
72
- end
73
- end
74
-
75
- def self.ridley
76
- @ridley ||= Ridley.new(
77
- server_url: knife_config.chef_server_url,
78
- client_name: knife_config.node_name,
79
- client_key: knife_config.client_key
80
- )
81
- end
82
- end
83
-
84
- def ssh_exec!(ssh, command)
85
- # I am not awesome enough to have made this method myself
86
- # I've just modified it a bit
87
- # Originally submitted by 'flitzwald' over here: http://stackoverflow.com/a/3386375
88
- stdout_data = ""
89
- stderr_data = ""
90
- exit_code = nil
91
-
92
- ssh.open_channel do |channel|
93
- channel.exec(command) do |ch, success|
94
- unless success
95
- abort "FAILED: couldn't execute command (ssh.channel.exec)"
96
- end
97
- channel.on_data do |ch,data|
98
- stdout_data+=data
99
- end
100
-
101
- channel.on_extended_data do |ch,type,data|
102
- stderr_data+=data
103
- end
104
-
105
- channel.on_request("exit-status") do |ch,data|
106
- exit_code = data.read_long
107
- end
39
+ print_summary
108
40
  end
109
41
  end
110
- ssh.loop
111
- [stdout_data, stderr_data, exit_code]
112
42
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: santoku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven De Coeyer
8
+ - Mike Morraye
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-10-01 00:00:00.000000000 Z
12
+ date: 2013-11-17 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: colorize
@@ -52,9 +53,23 @@ dependencies:
52
53
  - - '>='
53
54
  - !ruby/object:Gem::Version
54
55
  version: '0'
55
- description: A gem to perform command over parrallel ssh connections on multiple chef
56
+ - !ruby/object:Gem::Dependency
57
+ name: thor
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: A gem to perform command over parallel ssh connections on multiple chef
56
71
  serverspec. Output is rspec-like.
57
- email: steven@banteng.be
72
+ email: tech@openminds.be
58
73
  executables:
59
74
  - santoku
60
75
  extensions: []