dust-deploy 0.13.17 → 0.13.18

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