knife-zero 0.3.0.pre → 1.0.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: 78eea0a45dc96971a8ca19c4ad4adca6c958d749
4
- data.tar.gz: 2ca8b1ddc35e0030c18f28944759027030622e5b
3
+ metadata.gz: 5b49630ab7f49b0d6124a0a36f17b15c486832c0
4
+ data.tar.gz: 0062f6d3d584a135c438865e71df980a18986604
5
5
  SHA512:
6
- metadata.gz: a6de703db7970fb788c970886555256d2c8b9ade52f1754b7d43e31c7dc0dcdd8364f8f05324c158e737cdd6615314b2014d8cab1834f8fe9185bfdd1ac1b0de
7
- data.tar.gz: be6bcb9912982792b319a31169be2713c64006173f25ffaf84f8413f309f436ec5137d08ceb1f6a4b76851981038e71e8655f4a4ae4afe2b92b0572bdcac6c44
6
+ metadata.gz: 3b57450d3140a1d518e4908bf8d8419956cd41cc6bbf5b6cad62450cc2bfef2af1c3824e5ae6a871557a53e221da3e82e0367044223e7b98ebf1c5a7bdb7b9b9
7
+ data.tar.gz: ab553ebadbc9e3c9608d0916e9e36c90e2b92b222c490bb3182e6855a68ebd4b9ce2282659e21cf473c1397a6313fa08724968228f05931932d1293c5b427c90
data/CHANGELOG.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # Changelog of knife-zero
2
2
 
3
- ## v0.3.0.pre
3
+ ## v1.0.0
4
4
 
5
- - Feature: chef_client run parallel.
5
+ - Code cleanup: use Chef::Knife::SSH framework. HT: @Yasushi
6
+ - Patch: Support forwarding in Net::SSH::Multi::PendingConnection. HT: @Yasushi
6
7
 
7
8
  ## v0.2.0
8
9
 
data/README.md CHANGED
@@ -44,12 +44,7 @@ knife zero chef_client QUERY (options)
44
44
  Install Chef to remote node and run chef-client under chef-zero via tcp-forward.
45
45
 
46
46
  Supported options are mostly the same as `knife bootstrap`.
47
-
48
- #### Specific options(s)
49
-
50
- ```
51
- -W, --why-run Enable whyrun mode on chef-client run at remote node.
52
- ```
47
+ And it supports why-run(`-W, --why-run`).
53
48
 
54
49
  #### Example
55
50
 
@@ -120,13 +115,7 @@ xxx.xxx.xxx.xxx 08:41:37 up 143 days, 2:32, 4 users, load average: 0.00, 0.0
120
115
  Search nodes from local chef-repo directory, and run command at remote node.
121
116
 
122
117
  Supported options are mostly the same as `knife ssh`.
123
-
124
- #### Specific options(s)
125
-
126
- ```
127
- -W, --why-run Enable whyrun mode on chef-client run at remote node.
128
- -C, --concurrency NUMBER (0.3.0 or later) Number of concurrency. (default: 1) ; not avaiable on some platforms like Windows and NetBSD 4.
129
- ```
118
+ And it supports why-run(`-W, --why-run`).
130
119
 
131
120
  #### Example
132
121
 
@@ -1,24 +1,24 @@
1
1
  require 'chef/knife'
2
2
  require 'chef/knife/zero_base'
3
- require 'knife-zero/helper'
3
+ require 'knife-zero/bootstrap_ssh'
4
4
 
5
5
  class Chef
6
6
  class Knife
7
- class ZeroChefClient < Chef::Knife::Ssh
7
+ class ZeroChefClient < Chef::Knife::BootstrapSsh
8
8
  include Chef::Knife::ZeroBase
9
- include ::Knife::Zero::Helper
10
-
11
9
  deps do
12
- require 'chef/node'
13
- require 'chef/environment'
14
- require 'chef/api_client'
15
- require 'chef/search/query'
16
- require 'knife-zero/bootstrap_ssh'
17
10
  Chef::Knife::BootstrapSsh.load_deps
18
11
  end
19
12
 
20
13
  banner "knife zero chef_client QUERY (options)"
21
14
 
15
+ option :concurrency,
16
+ :short => "-C NUM",
17
+ :long => "--concurrency NUM",
18
+ :description => "The number of concurrent connections",
19
+ :default => nil,
20
+ :proc => lambda { |o| o.to_i }
21
+
22
22
  option :attribute,
23
23
  :short => "-a ATTR",
24
24
  :long => "--attribute ATTR",
@@ -30,48 +30,14 @@ class Chef
30
30
  :description => "execute the chef-client via sudo",
31
31
  :boolean => true
32
32
 
33
- option :concurrency,
34
- :short => "-C NUMBER",
35
- :long => "--concurrency NUMBER",
36
- :description => "Number of concurrency. (default: 1) ; not avaiable on some platforms like Windows and NetBSD 4.",
37
- :proc => lambda { |s| s.to_i },
38
- :default => 1
39
-
40
- def run
41
- configure_attribute
42
- configure_user
43
- configure_password
44
- configure_identity_file
45
- list = search_nodes
46
-
47
- pids = []
48
- list.each do |n|
49
- # Note: fork(2) is not avaiable on some platforms like Windows and NetBSD 4.
50
- if (Process.respond_to?(:fork) && !Chef::Platform.windows?)
51
- pids << Process.fork {
52
- Chef::Log.debug("Start session for #{n}")
53
- session = knife_ssh
54
- session.configure_session(n)
55
- session.ssh_command(start_chef_client)
56
- }
57
- until count_alive_pids(pids) < @config[:concurrency]
58
- sleep 1
59
- end
60
- else
61
- Chef::Log.debug("Start session for #{n}")
62
- session = knife_ssh
63
- session.configure_session(n)
64
- session.ssh_command(start_chef_client)
65
- end
66
- end
67
-
68
- result = Process.waitall
69
- ## NOTE: should report if includes fail...?
33
+ def initialize(argv=[])
34
+ super
35
+ @name_args = [@name_args[0], start_chef_client]
70
36
  end
71
37
 
72
38
  def start_chef_client
73
39
  client_path = @config[:use_sudo] ? 'sudo ' : ''
74
- client_path = @config[:chef_client_path] ? "#{client_path}#{@config[:chef_client_path]}" : "#{client_path}chef-client"
40
+ client_path = @config[:chef_client_path] ? "#{client_path}#{@config[:chef_client_path]}" : "#{client_path}chef-client"
75
41
  s = "#{client_path}"
76
42
  s << ' -l debug' if @config[:verbosity] and @config[:verbosity] >= 2
77
43
  s << " -S http://127.0.0.1:8889"
@@ -7,11 +7,6 @@ class Chef
7
7
  includer.class_eval do
8
8
  deps do
9
9
  Chef::Config[:local_mode] = true
10
- require 'knife-zero/core/bootstrap_context'
11
- require 'chef/json_compat'
12
- require 'tempfile'
13
- require 'highline'
14
- require 'net/ssh'
15
10
  Chef::Knife::Ssh.load_deps
16
11
  end
17
12
 
@@ -64,22 +59,6 @@ class Chef
64
59
  end
65
60
  end
66
61
 
67
- def knife_ssh
68
- ssh = Chef::Knife::BootstrapSsh.new
69
- ssh.ui = ui
70
- ssh.name_args = [ server_name, ssh_command ] unless ssh.name_args.empty?
71
- ssh.config[:ssh_user] = Chef::Config[:knife][:ssh_user] || config[:ssh_user]
72
- ssh.config[:ssh_password] = config[:ssh_password]
73
- ssh.config[:ssh_port] = Chef::Config[:knife][:ssh_port] || config[:ssh_port]
74
- ssh.config[:ssh_gateway] = Chef::Config[:knife][:ssh_gateway] || config[:ssh_gateway]
75
- ssh.config[:forward_agent] = Chef::Config[:knife][:forward_agent] || config[:forward_agent]
76
- ssh.config[:identity_file] = Chef::Config[:knife][:identity_file] || config[:identity_file]
77
- ssh.config[:manual] = true
78
- ssh.config[:host_key_verify] = Chef::Config[:knife][:host_key_verify] || config[:host_key_verify]
79
- ssh.config[:on_error] = :raise
80
- ssh
81
- end
82
-
83
62
  private
84
63
 
85
64
  def locate_config_value(key)
@@ -7,6 +7,7 @@ class Chef
7
7
  class ZeroBootstrap < Chef::Knife::Bootstrap
8
8
  include Chef::Knife::ZeroBase
9
9
  deps do
10
+ require 'knife-zero/core/bootstrap_context'
10
11
  require 'knife-zero/bootstrap_ssh'
11
12
  Chef::Knife::BootstrapSsh.load_deps
12
13
  end
@@ -127,11 +128,6 @@ class Chef
127
128
  ssh.config[:on_error] = :raise
128
129
  ssh
129
130
  end
130
-
131
- alias :default_run :run
132
- def run
133
- default_run
134
- end
135
131
  end
136
132
  end
137
133
  end
@@ -3,38 +3,11 @@ require 'chef/knife/ssh'
3
3
  class Chef
4
4
  class Knife
5
5
  class BootstrapSsh < Chef::Knife::Ssh
6
- def configure_session(args = @name_args)
7
- host, ssh_port = args[0].split(" ")
8
- @longest = host.length
9
-
10
- Chef::Log.debug("Configration for #{host}")
11
- session_opts = {}
12
-
13
- ssh_config = Net::SSH.configuration_for(host)
14
-
15
- # Chef::Config[:knife][:ssh_user] is parsed in #configure_user and written to config[:ssh_user]
16
- user = config[:ssh_user] || ssh_config[:user]
17
- hostspec = user ? "#{user}@#{host}" : host
18
- session_opts[:keys] = File.expand_path(config[:identity_file]) if config[:identity_file]
19
- session_opts[:keys_only] = true if config[:identity_file]
20
- session_opts[:password] = config[:ssh_password] if config[:ssh_password]
21
- session_opts[:forward_agent] = config[:forward_agent]
22
- session_opts[:port] = config[:ssh_port] ||
23
- ssh_port || # Use cloud port if available
24
- Chef::Config[:knife][:ssh_port] ||
25
- ssh_config[:port]
26
- session_opts[:logger] = Chef::Log.logger if Chef::Log.level == :debug
27
-
28
- if !config[:host_key_verify]
29
- session_opts[:paranoid] = false
30
- session_opts[:user_known_hosts_file] = "/dev/null"
31
- end
32
-
33
- ## use nomal Net::SSH instead of Net::SSH::Multi for simply tcpforward.
34
- @session ||= Net::SSH.start(host, user, session_opts)
6
+ deps do
7
+ Chef::Knife::Ssh.load_deps
8
+ require "knife-zero/net-ssh-multi-patch"
35
9
  end
36
10
 
37
-
38
11
  def ssh_command(command, subsession=nil)
39
12
  chef_zero_port = config[:chef_zero_port] ||
40
13
  Chef::Config[:knife][:chef_zero_port] ||
@@ -42,35 +15,12 @@ class Chef
42
15
  chef_zero_host = config[:chef_zero_host] ||
43
16
  Chef::Config[:knife][:chef_zero_host] ||
44
17
  '127.0.0.1'
45
-
46
- exit_status = 0
47
- subsession ||= session
48
- command = fixup_sudo(command)
49
- command.force_encoding('binary') if command.respond_to?(:force_encoding)
50
-
51
- Chef::Log.debug("Creating tcp-foward channel to #{chef_zero_host}:#{chef_zero_port}")
52
- session.forward.remote(8889, chef_zero_host, chef_zero_port)
53
- subsession.open_channel do |ch|
54
- ch.request_pty
55
- ch.exec command do |ch, success|
56
- raise ArgumentError, "Cannot execute #{command}" unless success
57
- ch.on_data do |ichannel, data|
58
- ## Patched
59
- print_data(ichannel.connection.host, data)
60
- if data =~ /^knife sudo password: /
61
- print_data(ichannel.connection.host, "\n")
62
- ichannel.send_data("#{get_password}\n")
63
- end
64
- end
65
- ch.on_request "exit-status" do |ichannel, data|
66
- exit_status = [exit_status, data.read_long].max
67
- end
68
- end
18
+ (subsession || session).servers.each do |server|
19
+ session = server.session(true)
20
+ session.forward.remote(8889, chef_zero_host, chef_zero_port)
69
21
  end
70
- session.loop
71
- exit_status
22
+ super
72
23
  end
73
24
  end
74
25
  end
75
26
  end
76
-
@@ -0,0 +1,7 @@
1
+ module Knife
2
+ module Zero
3
+ module Helper
4
+ ## Some Helper..
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ require 'net/ssh/multi/version'
2
+
3
+ if Net::SSH::Multi::Version::STRING == "1.1.0" || Net::SSH::Multi::Version::STRING == "1.2.0"
4
+
5
+ require 'net/ssh/multi'
6
+
7
+ module Net::SSH::Multi
8
+ class PendingConnection
9
+ class ForwardRecording
10
+ def initialize
11
+ @recordings = []
12
+ end
13
+
14
+ def remote(port, host, remote_port, remote_host="127.0.0.1")
15
+ @recordings << [:remote, port, host, remote_port, remote_host]
16
+ end
17
+
18
+ def replay_on(session)
19
+ forward = session.forward
20
+ @recordings.each {|args| forward.send *args}
21
+ end
22
+ end
23
+
24
+ def forward
25
+ forward = ForwardRecording.new
26
+ @recordings << forward
27
+ forward
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,6 +1,6 @@
1
1
  module Knife
2
2
  module Zero
3
- VERSION = "0.3.0.pre"
3
+ VERSION = "1.0.0"
4
4
  MAJOR, MINOR, TINY = VERSION.split('.')
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.pre
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - sawanoboly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-17 00:00:00.000000000 Z
11
+ date: 2014-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,8 +72,9 @@ files:
72
72
  - lib/chef/knife/zero_base.rb
73
73
  - lib/chef/knife/zero_bootstrap.rb
74
74
  - lib/knife-zero/bootstrap_ssh.rb
75
+ - lib/knife-zero/common.rb
75
76
  - lib/knife-zero/core/bootstrap_context.rb
76
- - lib/knife-zero/helper.rb
77
+ - lib/knife-zero/net-ssh-multi-patch.rb
77
78
  - lib/knife-zero/version.rb
78
79
  homepage: ''
79
80
  licenses:
@@ -90,9 +91,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
91
  version: '0'
91
92
  required_rubygems_version: !ruby/object:Gem::Requirement
92
93
  requirements:
93
- - - ">"
94
+ - - ">="
94
95
  - !ruby/object:Gem::Version
95
- version: 1.3.1
96
+ version: '0'
96
97
  requirements: []
97
98
  rubyforge_project:
98
99
  rubygems_version: 2.2.2
@@ -1,18 +0,0 @@
1
- module Knife
2
- module Zero
3
- module Helper
4
- def count_alive_pids(pids)
5
- alive = 0
6
- pids.each do |pid|
7
- begin
8
- Process.getpgid pid
9
- alive +=1
10
- rescue
11
- next
12
- end
13
- end
14
- alive
15
- end
16
- end
17
- end
18
- end