chef 0.9.12 → 0.9.14.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. data/distro/arch/etc/conf.d/chef-client.conf +5 -0
  2. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  3. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  4. data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -0
  5. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  6. data/distro/arch/etc/rc.d/chef-client +76 -0
  7. data/distro/arch/etc/rc.d/chef-server +82 -0
  8. data/distro/arch/etc/rc.d/chef-server-webui +82 -0
  9. data/distro/arch/etc/rc.d/chef-solr +82 -0
  10. data/distro/arch/etc/rc.d/chef-solr-indexer +82 -0
  11. data/distro/common/markdown/knife.mkd +34 -1
  12. data/distro/debian/etc/default/chef-solr +1 -0
  13. data/distro/debian/etc/init.d/chef-client +1 -1
  14. data/distro/debian/etc/init.d/chef-solr +39 -40
  15. data/distro/debian/etc/init.d/chef-solr-indexer +1 -1
  16. data/distro/redhat/etc/init.d/chef-client +1 -1
  17. data/lib/chef.rb +1 -0
  18. data/lib/chef/api_client.rb +1 -1
  19. data/lib/chef/application/agent.rb +1 -1
  20. data/lib/chef/application/client.rb +1 -1
  21. data/lib/chef/application/solo.rb +1 -1
  22. data/lib/chef/cookbook/metadata.rb +2 -2
  23. data/lib/chef/cookbook/syntax_check.rb +1 -1
  24. data/lib/chef/cookbook_version.rb +5 -1
  25. data/lib/chef/couchdb.rb +1 -1
  26. data/lib/chef/data_bag.rb +1 -1
  27. data/lib/chef/data_bag_item.rb +35 -9
  28. data/lib/chef/exceptions.rb +2 -0
  29. data/lib/chef/file_cache.rb +1 -1
  30. data/lib/chef/handler/json_file.rb +1 -1
  31. data/lib/chef/index_queue/amqp_client.rb +2 -2
  32. data/lib/chef/index_queue/consumer.rb +2 -2
  33. data/lib/chef/json.rb +52 -0
  34. data/lib/chef/knife.rb +6 -6
  35. data/lib/chef/knife/bluebox_images_list.rb +54 -0
  36. data/lib/chef/knife/bluebox_server_create.rb +157 -0
  37. data/lib/chef/knife/bluebox_server_delete.rb +63 -0
  38. data/lib/chef/knife/bluebox_server_list.rb +59 -0
  39. data/lib/chef/knife/bootstrap.rb +3 -1
  40. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  41. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  42. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  43. data/lib/chef/knife/client_bulk_delete.rb +1 -1
  44. data/lib/chef/knife/client_create.rb +1 -1
  45. data/lib/chef/knife/client_delete.rb +1 -1
  46. data/lib/chef/knife/client_edit.rb +1 -1
  47. data/lib/chef/knife/client_list.rb +1 -1
  48. data/lib/chef/knife/client_reregister.rb +1 -1
  49. data/lib/chef/knife/client_show.rb +1 -1
  50. data/lib/chef/knife/cookbook_create.rb +1 -1
  51. data/lib/chef/knife/cookbook_list.rb +1 -1
  52. data/lib/chef/knife/cookbook_metadata.rb +1 -1
  53. data/lib/chef/knife/cookbook_show.rb +10 -18
  54. data/lib/chef/knife/cookbook_site_share.rb +1 -1
  55. data/lib/chef/knife/cookbook_site_vendor.rb +17 -11
  56. data/lib/chef/knife/ec2_instance_data.rb +1 -1
  57. data/lib/chef/knife/ec2_server_create.rb +8 -6
  58. data/lib/chef/knife/ec2_server_delete.rb +5 -8
  59. data/lib/chef/knife/ec2_server_list.rb +5 -4
  60. data/lib/chef/knife/exec.rb +1 -1
  61. data/lib/chef/knife/node_bulk_delete.rb +1 -1
  62. data/lib/chef/knife/node_create.rb +1 -1
  63. data/lib/chef/knife/node_delete.rb +1 -1
  64. data/lib/chef/knife/node_edit.rb +1 -1
  65. data/lib/chef/knife/node_from_file.rb +2 -2
  66. data/lib/chef/knife/node_list.rb +1 -1
  67. data/lib/chef/knife/node_run_list_add.rb +1 -1
  68. data/lib/chef/knife/node_run_list_remove.rb +1 -1
  69. data/lib/chef/knife/node_show.rb +1 -1
  70. data/lib/chef/knife/rackspace_server_create.rb +98 -70
  71. data/lib/chef/knife/rackspace_server_delete.rb +2 -2
  72. data/lib/chef/knife/rackspace_server_list.rb +2 -2
  73. data/lib/chef/knife/role_bulk_delete.rb +1 -1
  74. data/lib/chef/knife/role_create.rb +1 -1
  75. data/lib/chef/knife/role_delete.rb +1 -1
  76. data/lib/chef/knife/role_edit.rb +1 -1
  77. data/lib/chef/knife/role_from_file.rb +2 -2
  78. data/lib/chef/knife/role_list.rb +1 -1
  79. data/lib/chef/knife/role_show.rb +1 -1
  80. data/lib/chef/knife/slicehost_images_list.rb +2 -2
  81. data/lib/chef/knife/slicehost_server_create.rb +2 -2
  82. data/lib/chef/knife/slicehost_server_delete.rb +2 -2
  83. data/lib/chef/knife/slicehost_server_list.rb +2 -2
  84. data/lib/chef/knife/ssh.rb +36 -12
  85. data/lib/chef/knife/status.rb +1 -1
  86. data/lib/chef/knife/terremark_server_create.rb +1 -1
  87. data/lib/chef/knife/terremark_server_delete.rb +1 -1
  88. data/lib/chef/knife/terremark_server_list.rb +1 -1
  89. data/lib/chef/log.rb +31 -4
  90. data/lib/chef/mixin/command.rb +1 -1
  91. data/lib/chef/mixin/create_path.rb +1 -1
  92. data/lib/chef/mixin/recipe_definition_dsl_core.rb +1 -1
  93. data/lib/chef/monkey_patches/numeric.rb +7 -0
  94. data/lib/chef/node.rb +6 -8
  95. data/lib/chef/node/attribute.rb +24 -2
  96. data/lib/chef/openid_registration.rb +1 -1
  97. data/lib/chef/platform.rb +11 -0
  98. data/lib/chef/provider/breakpoint.rb +1 -1
  99. data/lib/chef/provider/cookbook_file.rb +1 -1
  100. data/lib/chef/provider/deploy/revision.rb +1 -1
  101. data/lib/chef/provider/deploy/timestamped.rb +1 -1
  102. data/lib/chef/provider/erl_call.rb +14 -2
  103. data/lib/chef/provider/git.rb +79 -55
  104. data/lib/chef/provider/group/pw.rb +1 -1
  105. data/lib/chef/provider/package/easy_install.rb +35 -13
  106. data/lib/chef/provider/service/debian.rb +65 -40
  107. data/lib/chef/provider/service/insserv.rb +52 -0
  108. data/lib/chef/provider/service/windows.rb +74 -57
  109. data/lib/chef/provider/subversion.rb +45 -10
  110. data/lib/chef/provider/user/pw.rb +1 -1
  111. data/lib/chef/providers.rb +1 -0
  112. data/lib/chef/resource/deploy_revision.rb +1 -1
  113. data/lib/chef/resource/easy_install_package.rb +16 -0
  114. data/lib/chef/resource/file.rb +8 -1
  115. data/lib/chef/resource_collection/stepable_iterator.rb +1 -1
  116. data/lib/chef/rest.rb +7 -7
  117. data/lib/chef/role.rb +2 -2
  118. data/lib/chef/run_status.rb +1 -1
  119. data/lib/chef/shef.rb +2 -2
  120. data/lib/chef/shef/ext.rb +2 -2
  121. data/lib/chef/shef/model_wrapper.rb +1 -1
  122. data/lib/chef/shef/shef_rest.rb +1 -1
  123. data/lib/chef/shef/shef_session.rb +13 -5
  124. data/lib/chef/tasks/chef_repo.rake +1 -1
  125. data/lib/chef/version.rb +1 -1
  126. data/lib/chef/webui_user.rb +1 -1
  127. metadata +329 -290
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/node'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/node'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/node'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/node'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -17,7 +17,8 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'json'
20
+ require 'chef/json'
21
+ require 'uuidtools'
21
22
 
22
23
  class Chef
23
24
  class Knife
@@ -36,14 +37,29 @@ class Chef
36
37
  :short => "-i IMAGE",
37
38
  :long => "--image IMAGE",
38
39
  :description => "The image of the server",
39
- :proc => Proc.new { |i| i.to_i },
40
- :default => 14362
40
+ :proc => Proc.new { |i| i.to_i }
41
41
 
42
42
  option :server_name,
43
- :short => "-N NAME",
43
+ :short => "-S NAME",
44
44
  :long => "--server-name NAME",
45
- :description => "The server name",
46
- :default => "wtf"
45
+ :description => "The server name. Defaults to a random UUID.",
46
+ :default => UUIDTools::UUID.random_create.to_s
47
+
48
+ option :chef_node_name,
49
+ :short => "-N NAME",
50
+ :long => "--node-name NAME",
51
+ :description => "The Chef node name for your new node"
52
+
53
+ option :ssh_user,
54
+ :short => "-x USERNAME",
55
+ :long => "--ssh-user USERNAME",
56
+ :description => "The ssh username",
57
+ :default => "root"
58
+
59
+ option :ssh_password,
60
+ :short => "-P PASSWORD",
61
+ :long => "--ssh-password PASSWORD",
62
+ :description => "The ssh password"
47
63
 
48
64
  option :api_key,
49
65
  :short => "-K KEY",
@@ -57,9 +73,43 @@ class Chef
57
73
  :description => "Your rackspace API username",
58
74
  :proc => Proc.new { |username| Chef::Config[:knife][:rackspace_api_username] = username }
59
75
 
76
+ option :prerelease,
77
+ :long => "--prerelease",
78
+ :description => "Install the pre-release chef gems"
79
+
80
+ option :distro,
81
+ :short => "-d DISTRO",
82
+ :long => "--distro DISTRO",
83
+ :description => "Bootstrap a distro using a template",
84
+ :default => "ubuntu10.04-gems"
85
+
86
+ option :template_file,
87
+ :long => "--template-file TEMPLATE",
88
+ :description => "Full path to location of template to use",
89
+ :default => false
90
+
60
91
  def h
61
92
  @highline ||= HighLine.new
62
93
  end
94
+
95
+ def tcp_test_ssh(hostname)
96
+ tcp_socket = TCPSocket.new(hostname, 22)
97
+ readable = IO.select([tcp_socket], nil, nil, 5)
98
+ if readable
99
+ Chef::Log.debug("sshd accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
100
+ yield
101
+ true
102
+ else
103
+ false
104
+ end
105
+ rescue Errno::ETIMEDOUT
106
+ false
107
+ rescue Errno::ECONNREFUSED
108
+ sleep 2
109
+ false
110
+ ensure
111
+ tcp_socket && tcp_socket.close
112
+ end
63
113
 
64
114
  def run
65
115
  require 'fog'
@@ -67,87 +117,65 @@ class Chef
67
117
  require 'net/ssh/multi'
68
118
  require 'readline'
69
119
 
70
- connection = Fog::Rackspace::Servers.new(
120
+ $stdout.sync = true
121
+
122
+ connection = Fog::Rackspace::Compute.new(
71
123
  :rackspace_api_key => Chef::Config[:knife][:rackspace_api_key],
72
124
  :rackspace_username => Chef::Config[:knife][:rackspace_api_username]
73
125
  )
74
126
 
75
- server = connection.servers.new
76
-
77
- server.flavor_id = config[:flavor]
78
- server.image_id = config[:image]
79
- server.name = config[:server_name]
80
- server.personality = [
81
- {
82
- 'path' => '/etc/install-chef',
83
- 'contents' => <<-EOH
84
- #!/bin/bash
85
- # Customized rc.local for chef installation
86
-
87
- if [ ! -f /usr/bin/chef-client ]; then
88
- apt-get update
89
- apt-get install -y ruby ruby1.8-dev build-essential wget libruby-extras libruby1.8-extras
90
- cd /tmp
91
- wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
92
- tar xvf rubygems-1.3.6.tgz
93
- cd rubygems-1.3.6
94
- ruby setup.rb
95
- cp /usr/bin/gem1.8 /usr/bin/gem
96
- gem install chef ohai --no-rdoc --no-ri --verbose
97
- fi
98
-
99
- exit 0
100
- EOH
101
- },
102
- {
103
- 'path' => "/etc/chef/validation.pem",
104
- 'contents' => IO.read(Chef::Config[:validation_key])
105
- },
106
- {
107
- 'path' => "/etc/chef/client.rb",
108
- 'contents' => <<-EOH
109
- log_level :info
110
- log_location STDOUT
111
- chef_server_url "#{Chef::Config[:chef_server_url]}"
112
- validation_client_name "#{Chef::Config[:validation_client_name]}"
113
- EOH
114
- },
115
- {
116
- 'path' => "/etc/chef/first-boot.json",
117
- 'contents' => { "run_list" => @name_args }.to_json
118
- },
119
- ]
120
-
121
- server.save
122
-
123
- $stdout.sync = true
127
+ server = connection.servers.create(
128
+ :name => config[:server_name],
129
+ :image_id => config[:image],
130
+ :flavor_id => config[:flavor]
131
+ )
124
132
 
133
+ puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
125
134
  puts "#{h.color("Name", :cyan)}: #{server.name}"
126
135
  puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
127
136
  puts "#{h.color("Image", :cyan)}: #{server.image_id}"
128
- puts "#{h.color("Public Address", :cyan)}: #{server.addresses["public"]}"
129
- puts "#{h.color("Private Address", :cyan)}: #{server.addresses["private"]}"
137
+ puts "#{h.color("Public IP Address", :cyan)}: #{server.addresses["public"][0]}"
138
+ puts "#{h.color("Private IP Address", :cyan)}: #{server.addresses["private"][0]}"
130
139
  puts "#{h.color("Password", :cyan)}: #{server.password}"
131
-
140
+
132
141
  print "\n#{h.color("Requesting server", :magenta)}"
133
- saved_password = server.password
134
142
 
135
143
  # wait for it to be ready to do stuff
136
144
  server.wait_for { print "."; ready? }
137
145
 
138
- puts "\nServer ready, waiting 15 seconds to bootstrap."
139
- sleep 15
146
+ puts("\n")
147
+
148
+ print "\n#{h.color("Waiting for sshd", :magenta)}"
149
+
150
+ print(".") until tcp_test_ssh(server.addresses["public"][0]) { sleep @initial_sleep_delay ||= 10; puts("done") }
140
151
 
141
- puts "\nBootstrapping #{h.color(server.name, :bold)}..."
152
+ bootstrap_for_node(server).run
142
153
 
143
- ssh = Chef::Knife::Ssh.new
144
- ssh.name_args = [ server.addresses["public"][0], "/bin/bash /etc/install-chef && /usr/bin/chef-client -j /etc/chef/first-boot.json" ]
145
- ssh.config[:ssh_user] = "root"
146
- ssh.config[:manual] = true
147
- ssh.config[:ssh_password] = saved_password
148
- ssh.password = saved_password
149
- ssh.run
154
+ puts "\n"
155
+ puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
156
+ puts "#{h.color("Name", :cyan)}: #{server.name}"
157
+ puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
158
+ puts "#{h.color("Image", :cyan)}: #{server.image_id}"
159
+ puts "#{h.color("Public IP Address", :cyan)}: #{server.addresses["public"][0]}"
160
+ puts "#{h.color("Private IP Address", :cyan)}: #{server.addresses["private"][0]}"
161
+ puts "#{h.color("Password", :cyan)}: #{server.password}"
162
+ puts "#{h.color("Run List", :cyan)}: #{@name_args.join(', ')}"
163
+ end
150
164
 
165
+ def bootstrap_for_node(server)
166
+ bootstrap = Chef::Knife::Bootstrap.new
167
+ bootstrap.name_args = [server.addresses["public"][0]]
168
+ bootstrap.config[:run_list] = @name_args
169
+ bootstrap.config[:ssh_user] = config[:ssh_user] || "root"
170
+ bootstrap.config[:ssh_password] = server.password
171
+ bootstrap.config[:identity_file] = config[:identity_file]
172
+ bootstrap.config[:chef_node_name] = config[:chef_node_name] || server.id
173
+ bootstrap.config[:prerelease] = config[:prerelease]
174
+ bootstrap.config[:distro] = config[:distro]
175
+ bootstrap.config[:use_sudo] = true
176
+ bootstrap.config[:template_file] = config[:template_file]
177
+ bootstrap.config[:environment] = config[:environment]
178
+ bootstrap
151
179
  end
152
180
  end
153
181
  end
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'json'
20
+ require 'chef/json'
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -35,7 +35,7 @@ class Chef
35
35
  require 'net/ssh/multi'
36
36
  require 'readline'
37
37
 
38
- connection = Fog::Rackspace::Servers.new(
38
+ connection = Fog::Rackspace::Compute.new(
39
39
  :rackspace_api_key => Chef::Config[:knife][:rackspace_api_key],
40
40
  :rackspace_username => Chef::Config[:knife][:rackspace_api_username]
41
41
  )
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'json'
20
+ require 'chef/json'
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -35,7 +35,7 @@ class Chef
35
35
  require 'net/ssh/multi'
36
36
  require 'readline'
37
37
 
38
- connection = Fog::Rackspace::Servers.new(
38
+ connection = Fog::Rackspace::Compute.new(
39
39
  :rackspace_api_key => Chef::Config[:knife][:rackspace_api_key],
40
40
  :rackspace_username => Chef::Config[:knife][:rackspace_api_username]
41
41
  )
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/node'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/role'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/role'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/role'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/role'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -33,7 +33,7 @@ class Chef
33
33
 
34
34
  output(format_for_display(updated)) if config[:print_after]
35
35
 
36
- Chef::Log.warn("Updated Role #{updated.name}!")
36
+ Chef::Log.info("Updated Role #{updated.name}!")
37
37
  end
38
38
 
39
39
  end
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/node'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -18,7 +18,7 @@
18
18
 
19
19
  require 'chef/knife'
20
20
  require 'chef/node'
21
- require 'json'
21
+ require 'chef/json'
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'json'
20
+ require 'chef/json'
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -33,7 +33,7 @@ class Chef
33
33
  require 'fog'
34
34
  require 'highline'
35
35
 
36
- slicehost = Fog::Slicehost.new(
36
+ slicehost = Fog::Slicehost::Compute.new(
37
37
  :slicehost_password => Chef::Config[:knife][:slicehost_password]
38
38
  )
39
39
 
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'json'
20
+ require 'chef/json'
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -62,7 +62,7 @@ class Chef
62
62
  require 'net/ssh/multi'
63
63
  require 'readline'
64
64
 
65
- slicehost = Fog::Slicehost.new(
65
+ slicehost = Fog::Slicehost::Compute.new(
66
66
  :slicehost_password => Chef::Config[:knife][:slicehost_password]
67
67
  )
68
68
 
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'json'
20
+ require 'chef/json'
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -29,7 +29,7 @@ class Chef
29
29
  require 'fog'
30
30
  require 'readline'
31
31
 
32
- slicehost = Fog::Slicehost.new(
32
+ slicehost = Fog::Slicehost::Compute.new(
33
33
  :slicehost_password => Chef::Config[:knife][:slicehost_password]
34
34
  )
35
35
 
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'json'
20
+ require 'chef/json'
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -35,7 +35,7 @@ class Chef
35
35
  require 'net/ssh/multi'
36
36
  require 'readline'
37
37
 
38
- slicehost = Fog::Slicehost.new(
38
+ slicehost = Fog::Slicehost::Compute.new(
39
39
  :slicehost_password => Chef::Config[:knife][:slicehost_password]
40
40
  )
41
41
 
@@ -231,30 +231,54 @@ class Chef
231
231
  end
232
232
 
233
233
  def tmux
234
+ ssh_dest = lambda do |server|
235
+ prefix = server.user ? "#{server.user}@" : ""
236
+ "'ssh #{prefix}#{server.host}'"
237
+ end
238
+
239
+ new_window_cmds = lambda do
240
+ if session.servers_for.size > 1
241
+ [""] + session.servers_for[1..-1].map do |server|
242
+ "new-window -a -n '#{server.host}' #{ssh_dest.call(server)}"
243
+ end
244
+ else
245
+ []
246
+ end.join(" \\; ")
247
+ end
248
+
249
+ tmux_name = "'knife ssh #{@name_args[0]}'"
234
250
  begin
235
- Chef::Mixin::Command.run_command(:command => "tmux new-session -d -s 'knife'")
251
+ server = session.servers_for.first
252
+ cmd = ["tmux new-session -d -s #{tmux_name}",
253
+ "-n '#{server.host}'", ssh_dest.call(server),
254
+ new_window_cmds.call].join(" ")
255
+ Chef::Mixin::Command.run_command(:command => cmd)
256
+ exec("tmux attach-session -t #{tmux_name}")
236
257
  rescue Chef::Exceptions::Exec
237
258
  end
238
- session.servers_for.each do |server|
239
- begin
240
- Chef::Mixin::Command.run_command(:command => "tmux new-window -d -n '#{server.host}' -t 'knife' 'ssh #{server.user ? "#{server.user}@#{server.host}" : server.host}'")
241
- rescue Chef::Exceptions::Exec
242
- end
243
- end
244
- exec("tmux attach-session -t knife")
245
259
  end
246
260
 
247
261
  def macterm
248
- require 'appscript'
262
+ begin
263
+ require 'appscript'
264
+ rescue LoadError
265
+ STDERR.puts "you need the rb-appscript gem to use knife ssh macterm. `(sudo) gem install rb-appscript` to install"
266
+ raise
267
+ end
268
+
249
269
  Appscript.app("/Applications/Utilities/Terminal.app").windows.first.activate
250
270
  Appscript.app("System Events").application_processes["Terminal.app"].keystroke("n", :using=>:command_down)
251
271
  term = Appscript.app('Terminal')
252
272
  window = term.windows.first.get
253
- session.servers_for.each do |server|
273
+
274
+ (session.servers_for.size - 1).times do |i|
275
+ window.activate
254
276
  Appscript.app("System Events").application_processes["Terminal.app"].keystroke("t", :using=>:command_down)
277
+ end
278
+
279
+ session.servers_for.each_with_index do |server, tab_number|
255
280
  cmd = "unset PROMPT_COMMAND; echo -e \"\\033]0;#{server.host}\\007\"; ssh #{server.user ? "#{server.user}@#{server.host}" : server.host}"
256
- Appscript.app('Terminal').do_script(cmd, :in => window.tabs.last.get)
257
- sleep 1
281
+ Appscript.app('Terminal').do_script(cmd, :in => window.tabs[tab_number + 1].get)
258
282
  end
259
283
  end
260
284