caterer 0.1.0 → 0.1.1

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.
@@ -1,13 +1,49 @@
1
+ require 'pty'
2
+
1
3
  module Caterer
2
4
  module Communication
3
5
  class Rsync
4
6
 
5
7
  def initialize(server)
6
- @server = server
7
- @logger = Log4r::Logger.new("caterer::communication::ssh")
8
+ @server = server
9
+ @logger = Log4r::Logger.new("caterer::communication::ssh")
8
10
  end
9
11
 
10
-
12
+ def sync(from, to)
13
+ PTY.spawn(rsync_cmd(from, to)) do |stdout, stdin|
14
+ eof = false
15
+ until eof do
16
+ begin
17
+ out = stdout.readpartial(4096)
18
+ if out.match /password:/
19
+ stdin.puts @server.password
20
+ else
21
+ print out if print_worthy out
22
+ end
23
+ rescue EOFError
24
+ eof = true
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ protected
31
+
32
+ def print_worthy(data)
33
+ [
34
+ /^\r\n$/, # empty lines
35
+ /^Warning: Permanently added/, # key added nonsense
36
+ ].each do |cruft|
37
+ if data.match cruft
38
+ return false
39
+ end
40
+ end
41
+ true
42
+ end
43
+
44
+ def rsync_cmd(from, to)
45
+ "rsync -zr -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p #{@server.port}' --delete #{from} #{@server.username}@#{@server.host}:#{to}"
46
+ end
11
47
 
12
48
  end
13
49
  end
@@ -134,24 +134,32 @@ module Caterer
134
134
  ch.exec(shell) do |ch2, _|
135
135
  # Setup the channel callbacks so we can get data and exit status
136
136
  ch2.on_data do |ch3, data|
137
+
137
138
  @logger.debug("stdout: #{data}")
138
- if block_given?
139
- # Filter out the clear screen command
140
- data = remove_ansi_escape_codes(data)
141
- yield :stdout, data
142
- end
139
+
140
+ # Filter out the clear screen command
141
+ data = remove_ansi_escape_codes(data)
142
+ # Filter annoying messages
143
+ data = remove_cruft(data)
144
+
145
+ yield :stdout, data if block_given?
146
+
143
147
  if opts[:stream]
144
148
  @server.ui.info data, {:prefix => false, :new_line => false}
145
149
  end
146
150
  end
147
151
 
148
152
  ch2.on_extended_data do |ch3, type, data|
153
+
149
154
  @logger.debug("stderr: #{data}")
150
- if block_given?
151
- # Filter out the clear screen command
152
- data = remove_ansi_escape_codes(data)
153
- yield :stderr, data
154
- end
155
+
156
+ # Filter out the clear screen command
157
+ data = remove_ansi_escape_codes(data)
158
+ # Filter annoying messages
159
+ data = remove_cruft(data)
160
+
161
+ yield :stderr, data if block_given?
162
+
155
163
  if opts[:stream]
156
164
  @server.ui.info data, {:prefix => false, :new_line => false}
157
165
  end
@@ -180,6 +188,13 @@ module Caterer
180
188
  return exit_status
181
189
  end
182
190
 
191
+ def remove_cruft(string)
192
+ ["stdin: is not a tty\n"].each do |m|
193
+ string.gsub! m, ''
194
+ end
195
+ string
196
+ end
197
+
183
198
  end
184
199
  end
185
200
  end
@@ -24,6 +24,10 @@ module Caterer
24
24
  @run_list << "role[#{role}]"
25
25
  end
26
26
 
27
+ def add_image(image)
28
+ @run_list += Caterer.config.images[image].provisioner.run_list
29
+ end
30
+
27
31
  def errors
28
32
  errors = {}
29
33
 
@@ -83,17 +83,22 @@ module Caterer
83
83
  end
84
84
 
85
85
  def cleanup
86
- server.ssh.sudo "rm -rf #{base_path}", :stream => true
86
+ # server.ssh.sudo "rm -rf #{base_path}", :stream => true
87
87
  end
88
88
 
89
89
  protected
90
90
 
91
91
  def upload_directory(from, to)
92
92
  if File.exists? from
93
- unique = Digest::MD5.hexdigest(from)
94
- server.ssh.upload from, "#{to}/#{unique}"
95
- server.ssh.sudo "mv #{to}/#{unique}/* #{to}/", :stream => true
96
- server.ssh.sudo "rm -rf #{to}/#{unique}", :stream => true
93
+ if @server.can_rsync?
94
+ from += "/" if not from.match /\/$/
95
+ @server.rsync.sync(from, to)
96
+ else
97
+ unique = Digest::MD5.hexdigest(from)
98
+ server.ssh.upload from, "#{to}/#{unique}"
99
+ server.ssh.sudo "mv #{to}/#{unique}/* #{to}/", :stream => true
100
+ server.ssh.sudo "rm -rf #{to}/#{unique}", :stream => true
101
+ end
97
102
  end
98
103
  end
99
104
 
@@ -114,7 +119,7 @@ module Caterer
114
119
  end
115
120
 
116
121
  def data_bags_path
117
- "#{base_path}/data_bags"
122
+ "#{base_path}/data_bags"
118
123
  end
119
124
 
120
125
  def config_bootstrap
@@ -53,6 +53,14 @@ module Caterer
53
53
  @ssh ||= Communication::SSH.new(self)
54
54
  end
55
55
 
56
+ def rsync
57
+ @rsync ||= Communication::Rsync.new(self)
58
+ end
59
+
60
+ def can_rsync?
61
+ true
62
+ end
63
+
56
64
  def ssh_opts
57
65
  {
58
66
  :port => port,
@@ -1,3 +1,3 @@
1
1
  module Caterer
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caterer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-18 00:00:00.000000000 Z
12
+ date: 2012-12-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: log4r