dust-deploy 0.13.17 → 0.13.18

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.
data/changelog.md CHANGED
@@ -1,6 +1,15 @@
1
1
  Changelog
2
2
  =============
3
3
 
4
+ 0.13.18
5
+ ------------
6
+
7
+ - adds support for ppa-repositories
8
+ - fixes small bug with iptables ipv6 workaround
9
+ - newrelic now works with non-apt systems
10
+ - packages recipe now accepts https, http and ftp urls
11
+
12
+
4
13
  0.13.17
5
14
  ------------
6
15
 
data/lib/dust/helper.rb CHANGED
@@ -2,8 +2,7 @@ class Object
2
2
  # turns an object into an array
3
3
  # this is needed, since 1.9 doesnt support "string".to_a and "string".each anymore
4
4
  def to_array
5
- return [ self ] unless self.is_a? Array
6
- return self
5
+ Array(self)
7
6
  end
8
7
  end
9
8
 
@@ -263,14 +263,14 @@ class Iptables < Recipe
263
263
  def workaround_setup
264
264
  # openwrt always needs the workaround
265
265
  if @node.uses_opkg?
266
- @workaround = { 'path' => '/etc/firewall.sh' }
266
+ @workaround ||= { 'path' => '/etc/firewall.sh' }
267
267
 
268
268
  # iptables-persistent < version 0.5.1 doesn't support ipv6
269
269
  # so doing a workaround
270
270
  elsif @node.uses_apt? and @ip_version == 6
271
271
  unless @node.package_min_version?('iptables-persistent', '0.5.1', :quiet => true)
272
272
  @node.messages.add('iptables-persistent too old (< 0.5.1), using workaround for ipv6').warning
273
- @workaround = { 'path' => '/etc/network/if-pre-up.d/ip6tables' }
273
+ @workaround ||= { 'path' => '/etc/network/if-pre-up.d/ip6tables' }
274
274
  end
275
275
  end
276
276
 
@@ -2,12 +2,6 @@ class Newrelic < Recipe
2
2
  desc 'newrelic:deploy', 'installs and configures newrelic system monitoring'
3
3
  def deploy
4
4
  return Dust.print_failed 'no key specified' unless @config
5
- return unless @node.uses_apt? :quiet=>false
6
-
7
- if @options.restart? or @options.reload?
8
- msg = @node.messages.add('updating repositories')
9
- msg.parse_result(@node.exec('aptitude update')[:exit_code])
10
- end
11
5
 
12
6
  unless @node.install_package 'newrelic-sysmond'
13
7
  @node.messages.add('installing newrelic monitoring daemon failed, did you setup the newrelic repositories?').failed
@@ -1,8 +1,8 @@
1
1
  class Packages < Recipe
2
2
  desc 'packages:deploy', 'installs packages'
3
- def deploy
4
- @config.each do |package|
5
- @node.install_package package
3
+ def deploy
4
+ @config.to_array.each do |package|
5
+ @node.install_package(package)
6
6
  end
7
7
  end
8
8
  end
@@ -16,7 +16,7 @@ class Repositories < Recipe
16
16
  # deletes all .list files under /etc/apt/sources.list.d
17
17
  def delete_old_repositories
18
18
  msg = @node.messages.add('deleting old repositories')
19
- @node.rm '/etc/apt/sources.list.d/*.list', :quiet => true if @node.uses_apt?
19
+ @node.rm('/etc/apt/sources.list.d/*.list', :quiet => true) if @node.uses_apt?
20
20
  msg.ok
21
21
  end
22
22
 
@@ -26,37 +26,43 @@ class Repositories < Recipe
26
26
  # if repo is present but not a hash use defaults
27
27
  repo = {} unless repo.is_a? Hash
28
28
 
29
- merge_with_default_settings repo
29
+ merge_with_default_settings(repo)
30
30
 
31
31
  # the default repository in /etc/apt/sources.list (debian)
32
32
  if name == 'default'
33
- msg = @node.messages.add('deploying default repository' )
34
- sources = generate_default_repo repo
35
- msg.parse_result(@node.write('/etc/apt/sources.list', sources, :quiet => true) )
33
+ msg = @node.messages.add('deploying default repository')
34
+ sources = generate_default_repo(repo)
35
+ msg.parse_result(@node.write('/etc/apt/sources.list', sources, :quiet => true))
36
36
  else
37
- msg = @node.messages.add("adding repository '#{name}' to sources" )
38
- sources = generate_repo repo
39
- msg.parse_result(@node.write("/etc/apt/sources.list.d/#{name}.list", sources, :quiet => true) )
40
- add_repo_key name, repo
37
+ if repo['ppa']
38
+ @node.messages.add("adding ppa repository '#{name}'\n")
39
+ add_ppa(repo)
40
+ else
41
+ msg = @node.messages.add("adding repository '#{name}' to sources")
42
+ sources = generate_repo(repo)
43
+ msg.parse_result(@node.write("/etc/apt/sources.list.d/#{name}.list", sources, :quiet => true))
44
+ add_repo_key(name, repo)
45
+ end
41
46
  end
42
47
  end
43
48
  end
44
49
 
45
50
  # merge repo configuration with default settings
46
- def merge_with_default_settings repo
51
+ def merge_with_default_settings(repo)
47
52
  # setting defaults
48
53
  repo['url'] ||= 'http://ftp.debian.org/debian/' if @node.is_debian?
49
54
  repo['url'] ||= 'http://archive.ubuntu.com/ubuntu/' if @node.is_ubuntu?
50
55
 
51
56
  repo['release'] ||= @node['lsbdistcodename']
52
- repo['components'] ||= 'main'
57
+ repo['components'] ||= [ 'main' ]
58
+ repo['components'] = repo['components'].to_array.join(' ')
53
59
 
54
60
  # ||= doesn't work for booleans
55
61
  repo['source'] = repo['source'].nil? ? true : repo['source']
56
62
  repo['binary'] = repo['binary'].nil? ? true : repo['binary']
57
63
  end
58
64
 
59
- def generate_default_repo repo
65
+ def generate_default_repo(repo)
60
66
  sources = ''
61
67
  sources << "deb #{repo['url']} #{repo['release']} #{repo['components']}\n"
62
68
  sources << "deb-src #{repo['url']} #{repo['release']} #{repo['components']}\n\n"
@@ -89,7 +95,18 @@ class Repositories < Recipe
89
95
  sources
90
96
  end
91
97
 
92
- def generate_repo repo
98
+ def add_ppa(repo)
99
+ return false unless @node.install_package('python-software-properties', :indent => 2)
100
+ msg = @node.messages.add('running add-apt-repository', :indent => 2)
101
+ cmd = "add-apt-repository -y ppa:#{repo['ppa']}"
102
+ if repo['keyserver']
103
+ @node.messages.add("using custom keyserver '#{repo['keyserver']}'").ok
104
+ cmd << " -k #{repo['keyserver']}"
105
+ end
106
+ msg.parse_result(@node.exec(cmd)[:exit_code])
107
+ end
108
+
109
+ def generate_repo(repo)
93
110
  # add url to sources.list
94
111
  sources = ''
95
112
  repo['release'].to_array.each do |release|
@@ -99,14 +116,14 @@ class Repositories < Recipe
99
116
  sources
100
117
  end
101
118
 
102
- def add_repo_key name, repo
119
+ def add_repo_key(name, repo)
103
120
  # add the repository key
104
121
  if repo['key']
105
122
  msg = @node.messages.add("adding #{name} repository key")
106
123
 
107
124
  # if the key is a .deb, download and install it
108
125
  if repo['key'].match /\.deb$/
109
- ret = @node.exec 'mktemp --tmpdir dust.XXXXXXXXXX'
126
+ ret = @node.exec('mktemp --tmpdir dust.XXXXXXXXXX')
110
127
  if ret[:exit_code] != 0
111
128
  msg.failed('could not create temporary file on server')
112
129
  return false
@@ -4,8 +4,8 @@ class Skel < Recipe
4
4
  @config.to_array.each do |user|
5
5
  @node.messages.add("deploying homedir skeleton for #{user}\n")
6
6
  Dir["#{@template_path}/.*"].each do |file|
7
- next unless File.file? file
8
- @node.deploy_file file, "/#{@node.get_home user}/#{File.basename file}", { :binding => binding, :indent => 2 }
7
+ next unless File.file?(file)
8
+ @node.deploy_file(file, "#{@node.get_home(user)}/#{File.basename(file)}", { :binding => binding, :indent => 2 })
9
9
  end
10
10
  end
11
11
  end
data/lib/dust/server.rb CHANGED
@@ -163,13 +163,8 @@ module Dust
163
163
 
164
164
  # if in sudo mode, copy file to temporary place, then move using sudo
165
165
  if @node['sudo']
166
- ret = exec 'mktemp --tmpdir dust.XXXXXXXXXX'
167
- if ret[:exit_code] != 0
168
- msg.failed('could not create temporary file (needed for sudo)')
169
- return false
170
- end
171
-
172
- tmpfile = ret[:stdout].chomp
166
+ tmpfile = mktemp
167
+ return msg.failed('could not create temporary file (needed for sudo)') unless tmpfile
173
168
 
174
169
  # allow user to write file without sudo (for scp)
175
170
  # then change file back to root, and copy to the destination
@@ -319,32 +314,66 @@ module Dust
319
314
  msg.failed
320
315
  end
321
316
 
322
- def install_package package, options = {}
323
- options = default_options.merge options
317
+ def install_package(package, options = {})
318
+ options = default_options.merge(options)
324
319
  options[:env] ||= ''
325
320
 
326
- if package_installed? package, :quiet => true
321
+ if package_installed?(package, :quiet => true)
327
322
  return messages.add("package #{package} already installed", options).ok
328
323
  end
329
324
 
330
- msg = messages.add("installing #{package}", options)
325
+ # if package is an url, download and install the package file
326
+ if package =~ /^(http:\/\/|https:\/\/|ftp:\/\/)/
327
+ if uses_apt?
328
+ messages.add("installing #{package}\n", options)
329
+ return false unless install_package('wget')
331
330
 
332
- if uses_apt?
333
- exec "DEBIAN_FRONTEND=noninteractive aptitude install -y #{package}"
334
- elsif uses_emerge?
335
- exec "#{options[:env]} emerge #{package}"
336
- elsif uses_rpm?
337
- exec "yum install -y #{package}"
338
- elsif uses_pacman?
339
- exec "echo y |pacman -S #{package}"
340
- elsif uses_opkg?
341
- exec "opkg install #{package}"
331
+ msg = messages.add('downloading package', options.merge(:indent => options[:indent] + 1))
332
+
333
+ # creating temporary file
334
+ tmpfile = mktemp
335
+ return msg.failed('could not create temporary file') unless tmpfile
336
+
337
+ msg.parse_result(exec("wget #{package} -O #{tmpfile}")[:exit_code])
338
+
339
+ msg = messages.add('installing package', options.merge(:indent => options[:indent] + 1))
340
+ ret = msg.parse_result(exec("dpkg -i #{tmpfile}")[:exit_code])
341
+
342
+ msg = messages.add('deleting downloaded file', options.merge(:indent => options[:indent] + 1))
343
+ msg.parse_result(rm(tmpfile, :quiet => true))
344
+
345
+ return ret
346
+
347
+ elsif uses_rpm?
348
+ msg = messages.add("installing #{package}", options)
349
+ return msg.parse_result(exec("rpm -U #{package}")[:exit_code])
350
+
351
+ else
352
+ return msg.failed("\ninstalling packages from url not yet supported " +
353
+ "for your distribution. feel free to contribute!").failed
354
+ end
355
+
356
+ # package is not an url, use package manager
342
357
  else
343
- return msg.failed("install_package only supports apt, emerge and yum systems at the moment")
344
- end
358
+ msg = messages.add("installing #{package}", options)
359
+
360
+ if uses_apt?
361
+ exec "DEBIAN_FRONTEND=noninteractive aptitude install -y #{package}"
362
+ elsif uses_emerge?
363
+ exec "#{options[:env]} emerge #{package}"
364
+ elsif uses_rpm?
365
+ exec "yum install -y #{package}"
366
+ elsif uses_pacman?
367
+ exec "echo y |pacman -S #{package}"
368
+ elsif uses_opkg?
369
+ exec "opkg install #{package}"
370
+ else
371
+ return msg.failed("install_package only supports apt, emerge and yum systems at the moment")
372
+ end
345
373
 
346
- # check if package actually was installed
347
- msg.parse_result(package_installed?(package, :quiet => true))
374
+ # check if package actually was installed
375
+ return msg.parse_result(package_installed?(package, :quiet => true))
376
+ end
348
377
  end
349
378
 
350
379
  # check if installed package is at least version min_version
@@ -760,6 +789,13 @@ module Dust
760
789
  end
761
790
  end
762
791
 
792
+ # create a temporary file
793
+ def mktemp
794
+ ret = exec('mktemp --tmpdir dust.XXXXXXXXXX')
795
+ return false if ret[:exit_code] != 0
796
+ ret[:stdout].chomp
797
+ end
798
+
763
799
 
764
800
  private
765
801
 
data/lib/dust/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dust
2
- VERSION = "0.13.17"
2
+ VERSION = "0.13.18"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dust-deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.17
4
+ version: 0.13.18
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-07-05 00:00:00.000000000 Z
12
+ date: 2012-07-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json