Chee 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +61 -10
- data/lib/Chee/version.rb +1 -1
- data/lib/Chee.rb +23 -7
- data/spec/files/abc.rb +29 -0
- data/spec/files/input.rb +1 -2
- data/spec/main.rb +11 -0
- data/spec/tests/Chee.rb +53 -4
- metadata +2 -1
data/README.md
CHANGED
@@ -20,9 +20,38 @@ Installation
|
|
20
20
|
|
21
21
|
gem install Chee
|
22
22
|
|
23
|
-
Usage
|
23
|
+
Usage: DSL
|
24
24
|
------
|
25
25
|
|
26
|
+
You could include the DSL into your own object:
|
27
|
+
|
28
|
+
require "Chee"
|
29
|
+
Class My_SSH
|
30
|
+
|
31
|
+
include Chee::DSL
|
32
|
+
|
33
|
+
def ssh cmd
|
34
|
+
super cmd.strip
|
35
|
+
end
|
36
|
+
|
37
|
+
end # === Class My_SSH
|
38
|
+
|
39
|
+
Or you could use Chee directly:
|
40
|
+
|
41
|
+
require "Chee"
|
42
|
+
Chee.server 'my_server'
|
43
|
+
Chee.ssh "uptime"
|
44
|
+
|
45
|
+
`:ssh` returns a `Chee::Result` object:
|
46
|
+
|
47
|
+
result = Chee.ssh( "uptime" )
|
48
|
+
|
49
|
+
result.out # ==> output from STDOUT
|
50
|
+
result.exit_status
|
51
|
+
|
52
|
+
Usage: Single Server
|
53
|
+
-----
|
54
|
+
|
26
55
|
require "Chee"
|
27
56
|
|
28
57
|
# If you configured server using ~/.ssh/config:
|
@@ -39,21 +68,43 @@ Usage
|
|
39
68
|
|
40
69
|
# Send a command
|
41
70
|
Chee.ssh %^ sudo add-apt-repository ppa:nginx/stable ^
|
42
|
-
<!-- sudo apt-get install nginx -->
|
43
|
-
<!-- ^ -->
|
44
71
|
|
45
|
-
Or you could include the DSL into your own object:
|
46
72
|
|
47
|
-
|
73
|
+
Usage: Multiple Servers
|
74
|
+
------
|
48
75
|
|
49
|
-
|
76
|
+
Chee.server 'server_1'
|
77
|
+
Chee.server 'server_2', 'my_username'
|
50
78
|
|
51
|
-
|
52
|
-
|
53
|
-
end
|
79
|
+
Chee.ssh_to_all "uptime"
|
80
|
+
# ---> [ Chee::Result, Chee::Result ]
|
54
81
|
|
55
|
-
|
82
|
+
Usage: Multiple Line Command
|
83
|
+
----
|
84
|
+
|
85
|
+
Single Server, multiple commands:
|
86
|
+
|
87
|
+
Chee.server 'localhost'
|
88
|
+
|
89
|
+
Chee.ssh %^
|
90
|
+
|
91
|
+
sudo add-apt-repository ppa:nginx/stable
|
92
|
+
sudo apt-get install nginx
|
93
|
+
|
94
|
+
^
|
95
|
+
# ---> [ Chee::Result, Chee::Result ]
|
96
|
+
|
97
|
+
Multiple servers, multiple commands:
|
56
98
|
|
99
|
+
Chee.server 'localhost'
|
100
|
+
Chee.server 'my_other_host'
|
101
|
+
|
102
|
+
Chee.ssh_to_all %^
|
103
|
+
echo "a"
|
104
|
+
echo "b"
|
105
|
+
^
|
106
|
+
# ---> [ Chee::Result, Chee::Result, Chee::Result, Chee::Result ]
|
107
|
+
|
57
108
|
Run Tests
|
58
109
|
---------
|
59
110
|
|
data/lib/Chee/version.rb
CHANGED
data/lib/Chee.rb
CHANGED
@@ -18,21 +18,41 @@ class Chee
|
|
18
18
|
|
19
19
|
module DSL
|
20
20
|
|
21
|
+
def server_array
|
22
|
+
@server_array ||= []
|
23
|
+
end
|
24
|
+
|
21
25
|
def server *args
|
22
26
|
return @server if args.empty?
|
27
|
+
server_array << args
|
28
|
+
server_array.uniq!
|
23
29
|
@server = args
|
24
30
|
end
|
25
31
|
|
26
32
|
def print_data &blok
|
27
|
-
|
33
|
+
@print_data ||= proc { |d| print d; STDOUT.flush; }
|
34
|
+
return(@print_data) if blok.nil?
|
28
35
|
@print_data = blok
|
29
36
|
end
|
30
37
|
|
38
|
+
def ssh_to_all command
|
39
|
+
@server_array.map { |opts|
|
40
|
+
server *opts
|
41
|
+
ssh command
|
42
|
+
}.flatten
|
43
|
+
end
|
44
|
+
|
31
45
|
#
|
32
46
|
# Thread technique came from:
|
33
47
|
# http://stackoverflow.com/questions/6942279/ruby-net-ssh-channel-dies
|
34
48
|
#
|
35
|
-
def ssh
|
49
|
+
def ssh raw_cmd
|
50
|
+
command = raw_cmd.strip
|
51
|
+
if command["\n"]
|
52
|
+
return command.split("\n").map(&:strip).map { |s|
|
53
|
+
ssh s
|
54
|
+
}
|
55
|
+
end
|
36
56
|
stdout = ""
|
37
57
|
stderr = ""
|
38
58
|
t = nil # used to store a Thread
|
@@ -144,7 +164,7 @@ class Chee
|
|
144
164
|
result.out stdout
|
145
165
|
|
146
166
|
if !result.err.empty? || result.exit_status != 0
|
147
|
-
e = Exit_Error.new("Exit: #{result.exit_status},
|
167
|
+
e = Exit_Error.new("Exit: #{result.exit_status}, COMMAND: #{command}")
|
148
168
|
e.exit_status result.exit_status
|
149
169
|
e.out result.out
|
150
170
|
e.err result.err
|
@@ -158,9 +178,5 @@ class Chee
|
|
158
178
|
end # === module DSL
|
159
179
|
|
160
180
|
extend DSL
|
161
|
-
print_data { |d|
|
162
|
-
print d
|
163
|
-
STDOUT.flush
|
164
|
-
}
|
165
181
|
|
166
182
|
end # === class Chee
|
data/spec/files/abc.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
def tmp
|
3
|
+
"/tmp/abc.txt"
|
4
|
+
end
|
5
|
+
|
6
|
+
def read
|
7
|
+
File.read(tmp).strip
|
8
|
+
end
|
9
|
+
|
10
|
+
def write txt
|
11
|
+
File.write tmp, txt
|
12
|
+
end
|
13
|
+
|
14
|
+
if File.file?(tmp)
|
15
|
+
case read
|
16
|
+
when "a"
|
17
|
+
write "b"
|
18
|
+
when "b"
|
19
|
+
write "c"
|
20
|
+
else
|
21
|
+
write "a"
|
22
|
+
end
|
23
|
+
else
|
24
|
+
`echo "a" > #{tmp}`
|
25
|
+
end
|
26
|
+
|
27
|
+
puts read
|
28
|
+
|
29
|
+
|
data/spec/files/input.rb
CHANGED
data/spec/main.rb
CHANGED
@@ -5,6 +5,17 @@ require 'Bacon_Colored'
|
|
5
5
|
require 'pry'
|
6
6
|
require 'mocha-on-bacon'
|
7
7
|
|
8
|
+
class My_SSH
|
9
|
+
|
10
|
+
include Chee::DSL
|
11
|
+
|
12
|
+
def print_data
|
13
|
+
@print_data ||= proc {}
|
14
|
+
end
|
15
|
+
|
16
|
+
end # === My_SSH
|
17
|
+
|
18
|
+
File.write("/tmp/abc.txt", "")
|
8
19
|
|
9
20
|
# ======== Include the tests.
|
10
21
|
if ARGV.size > 1 && ARGV[1, ARGV.size - 1].detect { |a| File.exists?(a) }
|
data/spec/tests/Chee.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
describe ":
|
2
|
+
describe "Chee :ssh" do
|
3
3
|
|
4
4
|
before do
|
5
5
|
@localhost = 'localhost'
|
@@ -41,13 +41,19 @@ describe ":ssh_exec" do
|
|
41
41
|
.should == %@Input text: a\nYou entered: "a"@
|
42
42
|
end
|
43
43
|
|
44
|
-
it 'returns a
|
44
|
+
it 'returns a Chee::Result' do
|
45
45
|
Chee.ssh("hostname").should.be.is_a Chee::Result
|
46
46
|
end
|
47
|
+
|
48
|
+
it 'returns an Array of Chee::Result if command has multiple lines' do
|
49
|
+
cmd = "ruby #{File.expand_path 'spec/files/abc.rb'}"
|
50
|
+
Chee.ssh("#{cmd}\n#{cmd}\n#{cmd}")
|
51
|
+
.map(&:class).should == [ Chee::Result, Chee::Result, Chee::Result ]
|
52
|
+
end
|
47
53
|
|
48
54
|
it "strips returned data" do
|
49
|
-
|
50
|
-
|
55
|
+
Chee.ssh("cat ~/.bashrc").out.gsub("\r", '')
|
56
|
+
.should == `cat ~/.bashrc`.strip
|
51
57
|
end
|
52
58
|
|
53
59
|
it 'raises Net::SSH::AuthenticationFailed if login/password are incorrect' do
|
@@ -68,3 +74,46 @@ describe ":ssh_exec" do
|
|
68
74
|
|
69
75
|
end # === describe :ssh_exec
|
70
76
|
|
77
|
+
describe "Chee :server" do
|
78
|
+
|
79
|
+
before { @m = My_SSH.new }
|
80
|
+
|
81
|
+
it "adds server to server list" do
|
82
|
+
@m.server 'local'
|
83
|
+
@m.server_array.should.include ['local']
|
84
|
+
end
|
85
|
+
|
86
|
+
it "adds server to server list only once" do
|
87
|
+
@m.server 'local'
|
88
|
+
@m.server 'local'
|
89
|
+
@m.server_array.should == [ ['local'] ]
|
90
|
+
end
|
91
|
+
|
92
|
+
end # === Chee :server
|
93
|
+
|
94
|
+
describe "Chee :ssh_to_all" do
|
95
|
+
|
96
|
+
before {
|
97
|
+
@m = My_SSH.new
|
98
|
+
@m.server "localhost"
|
99
|
+
@m.server "localhost", nil
|
100
|
+
@m.server "localhost", `whoami`.strip
|
101
|
+
}
|
102
|
+
|
103
|
+
it "sends commands to all servers in :server_array" do
|
104
|
+
list = @m.ssh_to_all "ruby #{File.expand_path 'spec/files/abc.rb'}"
|
105
|
+
list.map { |o| o.out.strip }.should == %w{ a b c }
|
106
|
+
end
|
107
|
+
|
108
|
+
it "returns an Array with all elements Chee::Result" do
|
109
|
+
list = @m.ssh_to_all "uptime"
|
110
|
+
list.map(&:class).should == [ Chee::Result, Chee::Result, Chee::Result]
|
111
|
+
end
|
112
|
+
|
113
|
+
it "returns a flatten Array if command had multiple lines" do
|
114
|
+
list = @m.ssh_to_all "uptime\nuptime"
|
115
|
+
list.map(&:class).should == [ Chee::Result, Chee::Result ] * 3
|
116
|
+
end
|
117
|
+
|
118
|
+
end # === Chee :ssh_to_all
|
119
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Chee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -172,6 +172,7 @@ files:
|
|
172
172
|
- Rakefile
|
173
173
|
- lib/Chee.rb
|
174
174
|
- lib/Chee/version.rb
|
175
|
+
- spec/files/abc.rb
|
175
176
|
- spec/files/errors_with_exit_0.rb
|
176
177
|
- spec/files/exit_with_2.rb
|
177
178
|
- spec/files/input.rb
|