pec2 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pec2/cli.rb +1 -9
- data/lib/pec2/pssh.rb +58 -28
- data/lib/pec2/version.rb +1 -1
- data/pec2.gemspec +4 -1
- data/spec/cli_spec.rb +0 -1
- data/spec/pssh_spec.rb +1 -54
- metadata +46 -24
- data/exe/bin/pnuke +0 -96
- data/exe/bin/prsync +0 -126
- data/exe/bin/pscp +0 -108
- data/exe/bin/pslurp +0 -129
- data/exe/bin/pssh +0 -118
- data/exe/bin/pssh-askpass +0 -11
- data/exe/man/man1/pnuke.1 +0 -268
- data/exe/man/man1/prsync.1 +0 -299
- data/exe/man/man1/pscp.1 +0 -271
- data/exe/man/man1/pslurp.1 +0 -280
- data/exe/man/man1/pssh.1 +0 -368
- data/exe/psshlib/__init__.py +0 -0
- data/exe/psshlib/askpass_client.py +0 -102
- data/exe/psshlib/askpass_server.py +0 -101
- data/exe/psshlib/cli.py +0 -110
- data/exe/psshlib/color.py +0 -39
- data/exe/psshlib/manager.py +0 -345
- data/exe/psshlib/psshutil.py +0 -108
- data/exe/psshlib/task.py +0 -288
- data/exe/psshlib/version.py +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 550ba6ff5b0de826f866deeafc7d97eb159980b9
|
4
|
+
data.tar.gz: 6fcf46712f036133de9c7c489c8cc30fbb80dc72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6935e5dda4e21de298670ee7c20eff00d7e031db0d92aaaee9bc2d0cb189c7f8c8baefe7592bf9d99de52fe1466e930f4a78aed03949ae822905e8379b2c6816
|
7
|
+
data.tar.gz: 93dd2d07b2852a0729c51f5c7862a337615ac53b40b5a59f8d3509dc55d7efc2cc4f563894132a527c4304f3a17fb2dc167a5233e3f37d7e4f33679a7ed22337
|
data/lib/pec2/cli.rb
CHANGED
@@ -20,7 +20,6 @@ module Pec2
|
|
20
20
|
option :sudo_password, aliases: '-s', type: :string, desc: 'sudo_password'
|
21
21
|
option :tag, aliases: '-t', type: :hash, default: {}, desc: 'tag'
|
22
22
|
option :user, aliases: '-u', type: :string, desc: 'user'
|
23
|
-
option :log, aliases: '-o', type: :string, desc: 'log'
|
24
23
|
option :parallel, aliases: '-p', type: :numeric, desc: 'parallel'
|
25
24
|
option :print, aliases: '-P', type: :boolean, default: false, desc: 'print stdout.'
|
26
25
|
option :resolve, aliases: '--resolve', type: :string, default: 'private_ip_address', enum: ['private_ip_address', 'public_ip_address', 'name_tag'], desc: 'resolve'
|
@@ -43,12 +42,7 @@ module Pec2
|
|
43
42
|
@logger.info(%Q{connection size #{addresses.size}.})
|
44
43
|
@logger.info(%Q{listing connection to #{addresses.join(', ')}.})
|
45
44
|
|
46
|
-
|
47
|
-
fp.puts(addresses.join("\n"))
|
48
|
-
fp
|
49
|
-
}
|
50
|
-
|
51
|
-
pssh = Pssh.new(options, tf.path, addresses.size)
|
45
|
+
pssh = Pssh.new(options, addresses, addresses.size)
|
52
46
|
|
53
47
|
interactive = options[:command] ? false : true
|
54
48
|
|
@@ -60,11 +54,9 @@ module Pec2
|
|
60
54
|
else
|
61
55
|
ret = pssh.exec_pssh_command(options[:command])
|
62
56
|
unless ret
|
63
|
-
tf.close
|
64
57
|
exit 1
|
65
58
|
end
|
66
59
|
end
|
67
|
-
tf.close
|
68
60
|
end
|
69
61
|
|
70
62
|
desc 'version', 'show version'
|
data/lib/pec2/pssh.rb
CHANGED
@@ -1,40 +1,70 @@
|
|
1
|
-
require '
|
1
|
+
require 'net/ssh'
|
2
|
+
require 'parallel'
|
3
|
+
require 'colorize'
|
2
4
|
|
3
5
|
module Pec2
|
4
6
|
class Pssh
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
8
|
+
def initialize(options, servers, parallel = 1)
|
9
|
+
@parallel = parallel
|
10
|
+
color_index = 0
|
11
|
+
colors = String.colors.select{ |color|
|
12
|
+
!color.to_s.start_with?('light_') && !color.to_s.include?('red') && !color.to_s.include?('yellow')
|
13
|
+
}
|
14
|
+
@servers = servers.map { |server|
|
15
|
+
result = {}
|
16
|
+
result[:host] = server
|
17
|
+
result[:color] = colors[color_index]
|
18
|
+
if colors.size == color_index + 1
|
19
|
+
color_index = 0
|
20
|
+
else
|
21
|
+
color_index = color_index + 1
|
22
|
+
end
|
23
|
+
result
|
24
|
+
}
|
25
|
+
@user = options[:user]
|
26
|
+
@print = options[:print]
|
23
27
|
@sudo_password = options[:sudo_password]
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
else
|
30
|
-
%Q{#{@pssh_command} -i #{Shellwords.escape(command)}}
|
31
|
-
end
|
28
|
+
@ssh_options = {
|
29
|
+
verify_host_key: false,
|
30
|
+
user_known_hosts_file: '/dev/null',
|
31
|
+
}
|
32
|
+
@logger = Logger.new(STDOUT)
|
32
33
|
end
|
33
34
|
|
34
35
|
def exec_pssh_command(command)
|
35
36
|
return false if command.nil? || command.empty?
|
36
|
-
|
37
|
-
|
37
|
+
error_servers = []
|
38
|
+
Parallel.each(@servers, in_threads: @parallel) do |server|
|
39
|
+
begin
|
40
|
+
Net::SSH.start(server[:host], @user, @ssh_options) do |ssh|
|
41
|
+
channel = ssh.open_channel do |channel, success|
|
42
|
+
channel.on_data do |channel, data|
|
43
|
+
if data =~ /^\[sudo\] password for /
|
44
|
+
channel.send_data "#{@sudo_password}\n"
|
45
|
+
else
|
46
|
+
data.to_s.lines.each do |line|
|
47
|
+
if @print
|
48
|
+
print %Q{#{server[:host]}:#{line}}.colorize(server[:color])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
channel.request_pty
|
54
|
+
channel.exec(command)
|
55
|
+
channel.wait
|
56
|
+
end
|
57
|
+
channel.wait
|
58
|
+
end
|
59
|
+
rescue => e
|
60
|
+
error_servers << server[:host]
|
61
|
+
puts "\n#{e.message}\n#{e.backtrace.join("\n")}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
if error_servers.size > 0
|
65
|
+
@logger.error "error servers => #{error_servers.join(', ')}".colorize(:red)
|
66
|
+
end
|
67
|
+
return true
|
38
68
|
end
|
39
69
|
end
|
40
70
|
end
|
data/lib/pec2/version.rb
CHANGED
data/pec2.gemspec
CHANGED
@@ -18,8 +18,11 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
|
20
20
|
gem.add_dependency 'thor'
|
21
|
-
gem.add_dependency 'aws-sdk'
|
21
|
+
gem.add_dependency 'aws-sdk', '~> 2.x'
|
22
22
|
gem.add_dependency 'hashie'
|
23
|
+
gem.add_dependency 'net-ssh'
|
24
|
+
gem.add_dependency 'parallel'
|
25
|
+
gem.add_dependency 'colorize'
|
23
26
|
|
24
27
|
gem.add_development_dependency 'bundler'
|
25
28
|
gem.add_development_dependency 'pry'
|
data/spec/cli_spec.rb
CHANGED
@@ -21,7 +21,6 @@ describe Pec2::CLI do
|
|
21
21
|
expect(output).to include('--sudo-password')
|
22
22
|
expect(output).to include('--tag')
|
23
23
|
expect(output).to include('--user')
|
24
|
-
expect(output).to include('--log')
|
25
24
|
expect(output).to include('--parallel')
|
26
25
|
expect(output).to include('--print')
|
27
26
|
end
|
data/spec/pssh_spec.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'pec2'
|
3
|
-
require 'tempfile'
|
4
3
|
|
5
4
|
describe Pec2::Pssh do
|
6
5
|
before do
|
7
|
-
@
|
8
|
-
fp.puts("127.0.0.1")
|
9
|
-
fp
|
10
|
-
}
|
11
|
-
@pssh = Pssh.new({}, @tf.path)
|
6
|
+
@pssh = Pssh.new({}, ["127.0.0.1"])
|
12
7
|
end
|
13
8
|
|
14
9
|
it "test exec_pssh_command empty" do
|
@@ -23,54 +18,6 @@ describe Pec2::Pssh do
|
|
23
18
|
expect(ret).to eq(false)
|
24
19
|
end
|
25
20
|
|
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
21
|
after do
|
74
|
-
@tf.close
|
75
22
|
end
|
76
23
|
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.6.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-
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -26,6 +26,20 @@ dependencies:
|
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: aws-sdk
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.x
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.x
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hashie
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
@@ -39,7 +53,35 @@ dependencies:
|
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: net-ssh
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: parallel
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: colorize
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
44
86
|
requirements:
|
45
87
|
- - ">="
|
@@ -167,26 +209,6 @@ files:
|
|
167
209
|
- README.md
|
168
210
|
- Rakefile
|
169
211
|
- bin/pec2
|
170
|
-
- exe/bin/pnuke
|
171
|
-
- exe/bin/prsync
|
172
|
-
- exe/bin/pscp
|
173
|
-
- exe/bin/pslurp
|
174
|
-
- exe/bin/pssh
|
175
|
-
- exe/bin/pssh-askpass
|
176
|
-
- exe/man/man1/pnuke.1
|
177
|
-
- exe/man/man1/prsync.1
|
178
|
-
- exe/man/man1/pscp.1
|
179
|
-
- exe/man/man1/pslurp.1
|
180
|
-
- exe/man/man1/pssh.1
|
181
|
-
- exe/psshlib/__init__.py
|
182
|
-
- exe/psshlib/askpass_client.py
|
183
|
-
- exe/psshlib/askpass_server.py
|
184
|
-
- exe/psshlib/cli.py
|
185
|
-
- exe/psshlib/color.py
|
186
|
-
- exe/psshlib/manager.py
|
187
|
-
- exe/psshlib/psshutil.py
|
188
|
-
- exe/psshlib/task.py
|
189
|
-
- exe/psshlib/version.py
|
190
212
|
- lib/pec2.rb
|
191
213
|
- lib/pec2/cli.rb
|
192
214
|
- lib/pec2/constants.rb
|
@@ -219,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
241
|
version: '0'
|
220
242
|
requirements: []
|
221
243
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.6.
|
244
|
+
rubygems_version: 2.6.13
|
223
245
|
signing_key:
|
224
246
|
specification_version: 4
|
225
247
|
summary: run parallel ssh command. ec2 tag base operation.
|
data/exe/bin/pnuke
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
# -*- Mode: python -*-
|
3
|
-
|
4
|
-
# Copyright (c) 2009-2012, Andrew McNabb
|
5
|
-
# Copyright (c) 2003-2008, Brent N. Chun
|
6
|
-
|
7
|
-
"""Nukes all processes that match pattern running as user on the set of nodes
|
8
|
-
in hosts.txt.
|
9
|
-
"""
|
10
|
-
|
11
|
-
import os
|
12
|
-
import sys
|
13
|
-
|
14
|
-
parent, bindir = os.path.split(os.path.dirname(os.path.abspath(sys.argv[0])))
|
15
|
-
if os.path.exists(os.path.join(parent, 'psshlib')):
|
16
|
-
sys.path.insert(0, parent)
|
17
|
-
|
18
|
-
from psshlib import psshutil
|
19
|
-
from psshlib.task import Task
|
20
|
-
from psshlib.manager import Manager, FatalError
|
21
|
-
from psshlib.cli import common_parser, common_defaults
|
22
|
-
|
23
|
-
_DEFAULT_TIMEOUT = 60
|
24
|
-
|
25
|
-
def option_parser():
|
26
|
-
parser = common_parser()
|
27
|
-
parser.usage = "%prog [OPTIONS] pattern"
|
28
|
-
parser.epilog = "Example: pnuke -h hosts.txt -l irb2 java"
|
29
|
-
return parser
|
30
|
-
|
31
|
-
def parse_args():
|
32
|
-
parser = option_parser()
|
33
|
-
defaults = common_defaults(timeout=_DEFAULT_TIMEOUT)
|
34
|
-
parser.set_defaults(**defaults)
|
35
|
-
opts, args = parser.parse_args()
|
36
|
-
|
37
|
-
if len(args) < 1:
|
38
|
-
parser.error('Pattern not specified.')
|
39
|
-
|
40
|
-
if len(args) > 1:
|
41
|
-
parser.error('Extra arguments given after the pattern.')
|
42
|
-
|
43
|
-
if not opts.host_files and not opts.host_strings:
|
44
|
-
parser.error('Hosts not specified.')
|
45
|
-
|
46
|
-
return opts, args
|
47
|
-
|
48
|
-
def do_pnuke(hosts, pattern, opts):
|
49
|
-
if opts.outdir and not os.path.exists(opts.outdir):
|
50
|
-
os.makedirs(opts.outdir)
|
51
|
-
if opts.errdir and not os.path.exists(opts.errdir):
|
52
|
-
os.makedirs(opts.errdir)
|
53
|
-
manager = Manager(opts)
|
54
|
-
for host, port, user in hosts:
|
55
|
-
cmd = ['ssh', host, '-o', 'NumberOfPasswordPrompts=1']
|
56
|
-
if opts.options:
|
57
|
-
for opt in opts.options:
|
58
|
-
cmd += ['-o', opt]
|
59
|
-
if user:
|
60
|
-
cmd += ['-l', user]
|
61
|
-
if port:
|
62
|
-
cmd += ['-p', port]
|
63
|
-
if opts.extra:
|
64
|
-
cmd.extend(opts.extra)
|
65
|
-
cmd.append('pkill -9 %s' % pattern)
|
66
|
-
t = Task(host, port, user, cmd, opts)
|
67
|
-
manager.add_task(t)
|
68
|
-
try:
|
69
|
-
statuses = manager.run()
|
70
|
-
except FatalError:
|
71
|
-
sys.exit(1)
|
72
|
-
|
73
|
-
if min(statuses) < 0:
|
74
|
-
# At least one process was killed.
|
75
|
-
sys.exit(3)
|
76
|
-
for status in statuses:
|
77
|
-
if status == 255:
|
78
|
-
sys.exit(4)
|
79
|
-
for status in statuses:
|
80
|
-
if status != 0:
|
81
|
-
sys.exit(5)
|
82
|
-
|
83
|
-
if __name__ == "__main__":
|
84
|
-
opts, args = parse_args()
|
85
|
-
pattern = args[0]
|
86
|
-
try:
|
87
|
-
hosts = psshutil.read_host_files(opts.host_files,
|
88
|
-
default_user=opts.user)
|
89
|
-
except IOError:
|
90
|
-
_, e, _ = sys.exc_info()
|
91
|
-
sys.stderr.write('Could not open hosts file: %s\n' % e.strerror)
|
92
|
-
sys.exit(1)
|
93
|
-
if opts.host_strings:
|
94
|
-
for s in opts.host_strings:
|
95
|
-
hosts.extend(psshutil.parse_host_string(s, default_user=opts.user))
|
96
|
-
do_pnuke(hosts, pattern, opts)
|