pec2 0.4.1 → 0.5.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 +4 -4
- data/lib/pec2.rb +2 -1
- data/lib/pec2/cli.rb +24 -28
- data/lib/pec2/{core.rb → ec2.rb} +1 -1
- data/lib/pec2/pssh.rb +42 -0
- data/lib/pec2/version.rb +1 -1
- data/spec/cli_spec.rb +1 -0
- data/spec/{core_spec.rb → ec2_spec.rb} +1 -2
- data/spec/pssh_spec.rb +76 -0
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 221b02cfeb12fc1307eba9f1d8d4e267af138a10
|
4
|
+
data.tar.gz: 684b5a45a8bd2e3ebb4121230bf7a380622487ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef6ddb6106717e08eff3e48e2675159e922cc60ad4851d286816247d5cc62f6fa08007bc699aaaf817ef413a9aabf880ea6d035af3fa4492cd8b6d8cb4242758
|
7
|
+
data.tar.gz: cb6b3ae20f18033ea181a1c0130b957681cb8a9072a56981617d90ce4f13eac716edc35a7a71f9e06d69ccea7cda3699e820fd8dc66aec88090135732c0b1c93
|
data/lib/pec2.rb
CHANGED
data/lib/pec2/cli.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require "thor"
|
2
2
|
require "tempfile"
|
3
3
|
require "logger"
|
4
|
-
require 'shellwords'
|
5
4
|
|
6
5
|
module Pec2
|
7
6
|
class CLI < Thor
|
@@ -12,22 +11,28 @@ module Pec2
|
|
12
11
|
def initialize(args = [], options = {}, config = {})
|
13
12
|
super(args, options, config)
|
14
13
|
@global_options = config[:shell].base.options
|
15
|
-
@core =
|
16
|
-
@pssh_path = File.expand_path('../../../exe/bin/pssh', __FILE__)
|
14
|
+
@core = Ec2.new
|
17
15
|
@logger = Logger.new(STDOUT)
|
18
16
|
end
|
19
17
|
|
20
18
|
desc 'run_command', 'run command'
|
21
|
-
option :command, aliases: '-c', type: :string,
|
19
|
+
option :command, aliases: '-c', type: :string, desc: 'command'
|
22
20
|
option :sudo_password, aliases: '-s', type: :string, desc: 'sudo_password'
|
23
21
|
option :tag, aliases: '-t', type: :hash, default: {}, desc: 'tag'
|
24
22
|
option :user, aliases: '-u', type: :string, desc: 'user'
|
25
23
|
option :log, aliases: '-o', type: :string, desc: 'log'
|
26
24
|
option :parallel, aliases: '-p', type: :numeric, desc: 'parallel'
|
27
25
|
option :print, aliases: '-P', type: :boolean, default: false, desc: 'print stdout.'
|
26
|
+
option :resolve, aliases: '--resolve', type: :string, default: 'private_ip_address', enum: ['private_ip_address', 'public_ip_address', 'name_tag'], desc: 'resolve'
|
28
27
|
def run_command
|
29
28
|
addresses = @core.instances_hash(options[:tag]).map do |instance|
|
30
|
-
|
29
|
+
if options[:resolve] == 'private_ip_address'
|
30
|
+
instance.private_ip_address
|
31
|
+
elsif options[:resolve] == 'public_ip_address'
|
32
|
+
instance.public_ip_address
|
33
|
+
elsif options[:resolve] == 'name_tag'
|
34
|
+
instance.tags.select{|tag| tag["key"] == "Name" }.first["value"]
|
35
|
+
end
|
31
36
|
end
|
32
37
|
|
33
38
|
if addresses.empty?
|
@@ -35,37 +40,28 @@ module Pec2
|
|
35
40
|
exit
|
36
41
|
end
|
37
42
|
|
43
|
+
@logger.info(%Q{listing connection to #{addresses.join(', ')}.})
|
44
|
+
|
38
45
|
tf = Tempfile.open("pec2") { |fp|
|
39
46
|
fp.puts(addresses.join("\n"))
|
40
47
|
fp
|
41
48
|
}
|
42
49
|
|
43
|
-
|
44
|
-
if options[:print]
|
45
|
-
cmd = "#{cmd} -P"
|
46
|
-
end
|
50
|
+
pssh = Pssh.new(options, tf.path)
|
47
51
|
|
48
|
-
|
49
|
-
cmd = "#{cmd} -l #{options[:user]}"
|
50
|
-
end
|
51
|
-
|
52
|
-
if options[:log]
|
53
|
-
cmd = "#{cmd} -o #{options[:log]}"
|
54
|
-
end
|
52
|
+
interactive = options[:command] ? false : true
|
55
53
|
|
56
|
-
if
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
cmd = %Q{(echo #{options[:sudo_password]}) | #{cmd} -I #{Shellwords.escape(options[:command])}}
|
54
|
+
if interactive
|
55
|
+
while true
|
56
|
+
command = ask(">:")
|
57
|
+
pssh.exec_pssh_command(command)
|
58
|
+
end
|
62
59
|
else
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
exit 1
|
60
|
+
ret = pssh.exec_pssh_command(options[:command])
|
61
|
+
unless ret
|
62
|
+
tf.close
|
63
|
+
exit 1
|
64
|
+
end
|
69
65
|
end
|
70
66
|
tf.close
|
71
67
|
end
|
data/lib/pec2/{core.rb → ec2.rb}
RENAMED
data/lib/pec2/pssh.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module Pec2
|
4
|
+
class Pssh
|
5
|
+
|
6
|
+
PSSH_PATH = File.expand_path('../../../exe/bin/pssh', __FILE__)
|
7
|
+
|
8
|
+
def initialize(options, hosts_file)
|
9
|
+
@pssh_command = "#{PSSH_PATH} -t 0 -x '-tt' -h #{hosts_file} -O StrictHostKeyChecking=no"
|
10
|
+
if options[:print]
|
11
|
+
@pssh_command = "#{@pssh_command} -P"
|
12
|
+
end
|
13
|
+
|
14
|
+
if options[:user]
|
15
|
+
@pssh_command = "#{@pssh_command} -l #{options[:user]}"
|
16
|
+
end
|
17
|
+
|
18
|
+
if options[:log]
|
19
|
+
@pssh_command = "#{@pssh_command} -o #{options[:log]}"
|
20
|
+
end
|
21
|
+
|
22
|
+
if options[:parallel]
|
23
|
+
@pssh_command = "#{@pssh_command} -p #{options[:parallel]}"
|
24
|
+
end
|
25
|
+
@sudo_password = options[:sudo_password]
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_pssh_command(command)
|
29
|
+
if @sudo_password
|
30
|
+
%Q{(echo #{@sudo_password}) | #{@pssh_command} -I #{Shellwords.escape(command)}}
|
31
|
+
else
|
32
|
+
%Q{#{@pssh_command} -i #{Shellwords.escape(command)}}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def exec_pssh_command(command)
|
37
|
+
return false if command.nil? || command.empty?
|
38
|
+
build_command = build_pssh_command(command)
|
39
|
+
system(build_command)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/pec2/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
data/spec/pssh_spec.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pec2'
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
describe Pec2::Pssh do
|
6
|
+
before do
|
7
|
+
@tf = Tempfile.open("pec2") { |fp|
|
8
|
+
fp.puts("127.0.0.1")
|
9
|
+
fp
|
10
|
+
}
|
11
|
+
@pssh = Pssh.new({}, @tf.path)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "test exec_pssh_command empty" do
|
15
|
+
ret = @pssh.exec_pssh_command('')
|
16
|
+
|
17
|
+
expect(ret).to eq(false)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "test exec_pssh_command nil" do
|
21
|
+
ret = @pssh.exec_pssh_command(nil)
|
22
|
+
|
23
|
+
expect(ret).to eq(false)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "test build_pssh_command empty" do
|
27
|
+
pssh_command = @pssh.build_pssh_command('')
|
28
|
+
|
29
|
+
expect(pssh_command).to include(%Q{-O StrictHostKeyChecking=no})
|
30
|
+
expect(pssh_command).to include(%Q{-t 0 -x '-tt'})
|
31
|
+
expect(pssh_command).to include(%Q{-i ''})
|
32
|
+
end
|
33
|
+
|
34
|
+
it "test build_pssh_command" do
|
35
|
+
pssh_command = @pssh.build_pssh_command('hostname')
|
36
|
+
|
37
|
+
expect(pssh_command).not_to start_with(%Q{(echo password) |})
|
38
|
+
expect(pssh_command).to include(%Q{-O StrictHostKeyChecking=no})
|
39
|
+
expect(pssh_command).to include(%Q{-t 0 -x '-tt'})
|
40
|
+
expect(pssh_command).to include(%Q{-i hostname})
|
41
|
+
end
|
42
|
+
|
43
|
+
it "test build_pssh_command with user option" do
|
44
|
+
pssh = Pssh.new({ user: 'app' }, @tf.path)
|
45
|
+
pssh_command = pssh.build_pssh_command('hostname')
|
46
|
+
expect(pssh_command).to include(%Q{ -l app})
|
47
|
+
end
|
48
|
+
|
49
|
+
it "test build_pssh_command with log option" do
|
50
|
+
pssh = Pssh.new({ log: 'hoge.log' }, @tf.path)
|
51
|
+
pssh_command = pssh.build_pssh_command('hostname')
|
52
|
+
expect(pssh_command).to include(%Q{ -o hoge.log})
|
53
|
+
end
|
54
|
+
|
55
|
+
it "test build_pssh_command with parallel option" do
|
56
|
+
pssh = Pssh.new({ parallel: 10 }, @tf.path)
|
57
|
+
pssh_command = pssh.build_pssh_command('hostname')
|
58
|
+
expect(pssh_command).to include(%Q{ -p 10})
|
59
|
+
end
|
60
|
+
|
61
|
+
it "test build_pssh_command with print option" do
|
62
|
+
pssh = Pssh.new({ print: true }, @tf.path)
|
63
|
+
pssh_command = pssh.build_pssh_command('hostname')
|
64
|
+
expect(pssh_command).to include(%Q{ -P})
|
65
|
+
end
|
66
|
+
|
67
|
+
it "test build_pssh_command with sudo_password option" do
|
68
|
+
pssh = Pssh.new({ sudo_password: 'password' }, @tf.path)
|
69
|
+
pssh_command = pssh.build_pssh_command('hostname')
|
70
|
+
expect(pssh_command).to start_with(%Q{(echo password) |})
|
71
|
+
end
|
72
|
+
|
73
|
+
after do
|
74
|
+
@tf.close
|
75
|
+
end
|
76
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pec2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- toyama0919
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -190,12 +190,14 @@ files:
|
|
190
190
|
- lib/pec2.rb
|
191
191
|
- lib/pec2/cli.rb
|
192
192
|
- lib/pec2/constants.rb
|
193
|
-
- lib/pec2/
|
193
|
+
- lib/pec2/ec2.rb
|
194
|
+
- lib/pec2/pssh.rb
|
194
195
|
- lib/pec2/version.rb
|
195
196
|
- pec2.gemspec
|
196
197
|
- spec/cli_spec.rb
|
197
|
-
- spec/
|
198
|
+
- spec/ec2_spec.rb
|
198
199
|
- spec/pec2_spec.rb
|
200
|
+
- spec/pssh_spec.rb
|
199
201
|
- spec/spec_helper.rb
|
200
202
|
homepage: https://github.com/toyama0919/pec2
|
201
203
|
licenses:
|
@@ -223,6 +225,7 @@ specification_version: 4
|
|
223
225
|
summary: run parallel ssh command. ec2 tag base operation.
|
224
226
|
test_files:
|
225
227
|
- spec/cli_spec.rb
|
226
|
-
- spec/
|
228
|
+
- spec/ec2_spec.rb
|
227
229
|
- spec/pec2_spec.rb
|
230
|
+
- spec/pssh_spec.rb
|
228
231
|
- spec/spec_helper.rb
|