caterer 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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