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.
- data/distro/arch/etc/conf.d/chef-client.conf +5 -0
- data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
- data/distro/arch/etc/conf.d/chef-server.conf +10 -0
- data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -0
- data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
- data/distro/arch/etc/rc.d/chef-client +76 -0
- data/distro/arch/etc/rc.d/chef-server +82 -0
- data/distro/arch/etc/rc.d/chef-server-webui +82 -0
- data/distro/arch/etc/rc.d/chef-solr +82 -0
- data/distro/arch/etc/rc.d/chef-solr-indexer +82 -0
- data/distro/common/markdown/knife.mkd +34 -1
- data/distro/debian/etc/default/chef-solr +1 -0
- data/distro/debian/etc/init.d/chef-client +1 -1
- data/distro/debian/etc/init.d/chef-solr +39 -40
- data/distro/debian/etc/init.d/chef-solr-indexer +1 -1
- data/distro/redhat/etc/init.d/chef-client +1 -1
- data/lib/chef.rb +1 -0
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/application/agent.rb +1 -1
- data/lib/chef/application/client.rb +1 -1
- data/lib/chef/application/solo.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +2 -2
- data/lib/chef/cookbook/syntax_check.rb +1 -1
- data/lib/chef/cookbook_version.rb +5 -1
- data/lib/chef/couchdb.rb +1 -1
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +35 -9
- data/lib/chef/exceptions.rb +2 -0
- data/lib/chef/file_cache.rb +1 -1
- data/lib/chef/handler/json_file.rb +1 -1
- data/lib/chef/index_queue/amqp_client.rb +2 -2
- data/lib/chef/index_queue/consumer.rb +2 -2
- data/lib/chef/json.rb +52 -0
- data/lib/chef/knife.rb +6 -6
- data/lib/chef/knife/bluebox_images_list.rb +54 -0
- data/lib/chef/knife/bluebox_server_create.rb +157 -0
- data/lib/chef/knife/bluebox_server_delete.rb +63 -0
- data/lib/chef/knife/bluebox_server_list.rb +59 -0
- data/lib/chef/knife/bootstrap.rb +3 -1
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
- data/lib/chef/knife/client_bulk_delete.rb +1 -1
- data/lib/chef/knife/client_create.rb +1 -1
- data/lib/chef/knife/client_delete.rb +1 -1
- data/lib/chef/knife/client_edit.rb +1 -1
- data/lib/chef/knife/client_list.rb +1 -1
- data/lib/chef/knife/client_reregister.rb +1 -1
- data/lib/chef/knife/client_show.rb +1 -1
- data/lib/chef/knife/cookbook_create.rb +1 -1
- data/lib/chef/knife/cookbook_list.rb +1 -1
- data/lib/chef/knife/cookbook_metadata.rb +1 -1
- data/lib/chef/knife/cookbook_show.rb +10 -18
- data/lib/chef/knife/cookbook_site_share.rb +1 -1
- data/lib/chef/knife/cookbook_site_vendor.rb +17 -11
- data/lib/chef/knife/ec2_instance_data.rb +1 -1
- data/lib/chef/knife/ec2_server_create.rb +8 -6
- data/lib/chef/knife/ec2_server_delete.rb +5 -8
- data/lib/chef/knife/ec2_server_list.rb +5 -4
- data/lib/chef/knife/exec.rb +1 -1
- data/lib/chef/knife/node_bulk_delete.rb +1 -1
- data/lib/chef/knife/node_create.rb +1 -1
- data/lib/chef/knife/node_delete.rb +1 -1
- data/lib/chef/knife/node_edit.rb +1 -1
- data/lib/chef/knife/node_from_file.rb +2 -2
- data/lib/chef/knife/node_list.rb +1 -1
- data/lib/chef/knife/node_run_list_add.rb +1 -1
- data/lib/chef/knife/node_run_list_remove.rb +1 -1
- data/lib/chef/knife/node_show.rb +1 -1
- data/lib/chef/knife/rackspace_server_create.rb +98 -70
- data/lib/chef/knife/rackspace_server_delete.rb +2 -2
- data/lib/chef/knife/rackspace_server_list.rb +2 -2
- data/lib/chef/knife/role_bulk_delete.rb +1 -1
- data/lib/chef/knife/role_create.rb +1 -1
- data/lib/chef/knife/role_delete.rb +1 -1
- data/lib/chef/knife/role_edit.rb +1 -1
- data/lib/chef/knife/role_from_file.rb +2 -2
- data/lib/chef/knife/role_list.rb +1 -1
- data/lib/chef/knife/role_show.rb +1 -1
- data/lib/chef/knife/slicehost_images_list.rb +2 -2
- data/lib/chef/knife/slicehost_server_create.rb +2 -2
- data/lib/chef/knife/slicehost_server_delete.rb +2 -2
- data/lib/chef/knife/slicehost_server_list.rb +2 -2
- data/lib/chef/knife/ssh.rb +36 -12
- data/lib/chef/knife/status.rb +1 -1
- data/lib/chef/knife/terremark_server_create.rb +1 -1
- data/lib/chef/knife/terremark_server_delete.rb +1 -1
- data/lib/chef/knife/terremark_server_list.rb +1 -1
- data/lib/chef/log.rb +31 -4
- data/lib/chef/mixin/command.rb +1 -1
- data/lib/chef/mixin/create_path.rb +1 -1
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +1 -1
- data/lib/chef/monkey_patches/numeric.rb +7 -0
- data/lib/chef/node.rb +6 -8
- data/lib/chef/node/attribute.rb +24 -2
- data/lib/chef/openid_registration.rb +1 -1
- data/lib/chef/platform.rb +11 -0
- data/lib/chef/provider/breakpoint.rb +1 -1
- data/lib/chef/provider/cookbook_file.rb +1 -1
- data/lib/chef/provider/deploy/revision.rb +1 -1
- data/lib/chef/provider/deploy/timestamped.rb +1 -1
- data/lib/chef/provider/erl_call.rb +14 -2
- data/lib/chef/provider/git.rb +79 -55
- data/lib/chef/provider/group/pw.rb +1 -1
- data/lib/chef/provider/package/easy_install.rb +35 -13
- data/lib/chef/provider/service/debian.rb +65 -40
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/windows.rb +74 -57
- data/lib/chef/provider/subversion.rb +45 -10
- data/lib/chef/provider/user/pw.rb +1 -1
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/resource/deploy_revision.rb +1 -1
- data/lib/chef/resource/easy_install_package.rb +16 -0
- data/lib/chef/resource/file.rb +8 -1
- data/lib/chef/resource_collection/stepable_iterator.rb +1 -1
- data/lib/chef/rest.rb +7 -7
- data/lib/chef/role.rb +2 -2
- data/lib/chef/run_status.rb +1 -1
- data/lib/chef/shef.rb +2 -2
- data/lib/chef/shef/ext.rb +2 -2
- data/lib/chef/shef/model_wrapper.rb +1 -1
- data/lib/chef/shef/shef_rest.rb +1 -1
- data/lib/chef/shef/shef_session.rb +13 -5
- data/lib/chef/tasks/chef_repo.rake +1 -1
- data/lib/chef/version.rb +1 -1
- data/lib/chef/webui_user.rb +1 -1
- metadata +329 -290
data/lib/chef/knife/node_list.rb
CHANGED
data/lib/chef/knife/node_show.rb
CHANGED
@@ -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 => "-
|
43
|
+
:short => "-S NAME",
|
44
44
|
:long => "--server-name NAME",
|
45
|
-
:description => "The server name",
|
46
|
-
:default =>
|
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
|
-
|
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.
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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
|
139
|
-
|
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
|
-
|
152
|
+
bootstrap_for_node(server).run
|
142
153
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
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::
|
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::
|
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
|
)
|
data/lib/chef/knife/role_edit.rb
CHANGED
@@ -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.
|
36
|
+
Chef::Log.info("Updated Role #{updated.name}!")
|
37
37
|
end
|
38
38
|
|
39
39
|
end
|
data/lib/chef/knife/role_list.rb
CHANGED
data/lib/chef/knife/role_show.rb
CHANGED
@@ -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
|
|
data/lib/chef/knife/ssh.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|
|