dust-deploy 0.8.3 → 0.9.0

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,6 +1,24 @@
1
1
  Changelog
2
2
  =============
3
3
 
4
+
5
+ 0.9.0
6
+ ------------
7
+
8
+ - @node.exec now supports a :as_user => username argument, and then executes the command as the specified user
9
+ - fixes a bug where @noed.uses_* methods wherent properly cached
10
+ - sudo prompt is not displayed anymore when using :live => true
11
+ - duplicity recipe and cronjob example now inverts the --exclude and --include order. this is more what you probably want.
12
+ BE CAREFUL: you may have to adapt your cronjob.erb for duplicity. have a look at the updated example
13
+
14
+ - adds ruby_rvm recipe, you can now maintain your ruby version with dust and rvm.
15
+
16
+ recipes:
17
+ ruby_rvm:
18
+ # installs a specified ruby version using rvm for this user
19
+ myuser: '1.9.3-p125'
20
+
21
+
4
22
  0.8.3
5
23
  ------------
6
24
 
@@ -41,12 +41,13 @@ nice -n $NICE slapcat > /root/.ldap-<%= config['interval'] %> &> /dev/null
41
41
  # backup selected directories
42
42
  nice -n <%= config['nice'] %> duplicity --archive-dir <%= config['archive'] %> \
43
43
  --full-if-older-than <%= config['full-if-older-than'] %> --exclude-device-files / \
44
- % config['include'].each do |dir|
45
- --include <%= dir %> \
46
- % end
47
- % config['exclude'].each do |dir|
44
+ % config['exclude'].to_array.each do |dir|
48
45
  --exclude <%= dir %> \
49
46
  % end
47
+ % config['include'].to_array.each do |dir|
48
+ --include <%= dir %> \
49
+ % end
50
+ --exclude '**' \
50
51
  <%= File.join(config['backend'], config['directory']) %> &> /dev/null
51
52
 
52
53
  unset PASSPHRASE
@@ -40,7 +40,7 @@ class Cjdroute< Recipe
40
40
  'bin_dir' => '/usr/local/bin',
41
41
  'etc_dir' => '/etc/cjdns/',
42
42
  'tun' => 'cjdroute0',
43
- 'loglevel' => 'WARN'
43
+ 'loglevel' => 'INFO'
44
44
  }
45
45
  end
46
46
 
@@ -103,6 +103,7 @@ class Cjdroute< Recipe
103
103
  if @node.uses_apt?
104
104
  return false unless @node.install_package 'git-core', :indent => 2
105
105
  return false unless @node.install_package 'build-essential', :indent => 2
106
+ return false unless @node.install_package 'psmisc', :indent => 2
106
107
  return false unless @node.install_package 'coreutils', :indent => 2
107
108
  elsif @node.uses_rpm?
108
109
  return false unless @node.install_package 'git', :indent => 2
@@ -197,9 +198,7 @@ class Cjdroute< Recipe
197
198
  # kill any cjdroute processes that might be running
198
199
  def stop_cjdroute
199
200
  ::Dust.print_msg 'stopping cjdroute'
200
- pids = @node.exec("ps ax |grep cjdroute |grep -v grep |awk '{print $1}'")[:stdout]
201
- pids.each_line { |pid| @node.exec "kill #{pid}" }
202
- ::Dust.print_ok
201
+ ::Dust.print_result @node.exec('killall cjdroute')[:exit_code]
203
202
  end
204
203
 
205
204
  # fire up cjdroute
@@ -11,7 +11,7 @@ class Duplicity < Recipe
11
11
 
12
12
  @config.each do |scenario, c|
13
13
  # cloning is necessary if we have configurations with multiple hostnames
14
- config = c.clone
14
+ config = default_config.merge c
15
15
 
16
16
  # if directory config options is not given, use hostname-scenario
17
17
  config['directory'] ||= "#{@node['hostname']}-#{scenario}"
@@ -47,7 +47,7 @@ class Duplicity < Recipe
47
47
 
48
48
  # adjust and upload cronjob
49
49
  ::Dust.print_msg "adjusting and deploying cronjob (scenario: #{scenario}, interval: #{config['interval']})\n"
50
- config['options'].each { |option| ::Dust.print_ok "adding option: #{option}", :indent => 2 }
50
+ config['options'].to_array.each { |option| ::Dust.print_ok "adding option: #{option}", :indent => 2 }
51
51
 
52
52
  @node.deploy_file "#{@template_path}/cronjob", cronjob_path, :binding => binding
53
53
 
@@ -63,8 +63,8 @@ class Duplicity < Recipe
63
63
  def status
64
64
  return unless @node.package_installed? 'duplicity'
65
65
 
66
- @config.each do |scenario, conf|
67
- config = conf.clone
66
+ @config.each do |scenario, c|
67
+ config = default_config.merge c
68
68
 
69
69
  # if directory config option is not given, use hostname-scenario
70
70
  config['directory'] ||= "#{@node['hostname']}-#{scenario}"
@@ -95,6 +95,20 @@ class Duplicity < Recipe
95
95
  end
96
96
 
97
97
  private
98
+ def default_config
99
+ {
100
+ 'interval' => 'daily',
101
+ 'nice' => 10,
102
+ 'keep-n-full' => 5,
103
+ 'full-if-older-than' => '7D',
104
+ 'archive' => '/tmp/duplicity',
105
+ 'options' => [],
106
+ 'include' => [],
107
+ 'exclude' => []
108
+ }
109
+ end
110
+
111
+
98
112
  # removes all duplicity cronjobs
99
113
  def remove_duplicity_cronjobs
100
114
  ::Dust.print_msg 'deleting old duplicity cronjobs'
@@ -0,0 +1,74 @@
1
+ class RubyRvm < Recipe
2
+ desc 'ruby_rvm:deploy', 'installs rvm and ruby for a user'
3
+ def deploy
4
+ # TODO: rvm only works if your user uses bash/zsh as login shell, check
5
+
6
+ # dependency needed by rvm
7
+ # TODO: these are only debian/ubuntu dependencies, add for other distributions as well
8
+ if @node.uses_apt?
9
+ return unless @node.install_package 'bash'
10
+ return unless @node.install_package 'curl'
11
+ return unless @node.install_package 'dh-autoreconf'
12
+ @node.install_package 'libxml2-dev'
13
+ @node.install_package 'libxslt1-dev'
14
+ @node.install_package 'libreadline6-dev'
15
+ @node.install_package 'zlib1g-dev'
16
+ end
17
+
18
+ @config.each do |user, version|
19
+ unless @node.user_exists? user, :quiet => true
20
+ ::Dust.print_warning "user #{user} doesn't exist. skipping"
21
+ next
22
+ end
23
+
24
+ return unless install_rvm user
25
+ return unless install_ruby user, version
26
+ return unless set_default user, version
27
+ end
28
+ end
29
+
30
+ desc 'ruby_rvm:status', 'shows current ruby version'
31
+ def status
32
+ @config.each do |user, version|
33
+ ::Dust.print_msg "getting current ruby-version for user #{user}"
34
+ ret = @node.exec 'rvm use', :as_user => user
35
+ ::Dust.print_result ret[:exit_code]
36
+ ::Dust.print_ret ret
37
+ end
38
+ end
39
+
40
+
41
+ private
42
+
43
+ def install_rvm user
44
+ # check if rvm is already installed
45
+ if @node.exec('which rvm', :as_user => user)[:exit_code] == 0
46
+ ::Dust.print_msg "updating rvm for user #{user}"
47
+ return ::Dust.print_result @node.exec('rvm get latest', :as_user => user)[:exit_code]
48
+
49
+ else
50
+ ::Dust.print_msg "installing rvm for user #{user}"
51
+ return ::Dust.print_result @node.exec("curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer |bash -s stable",
52
+ :as_user => user)[:exit_code]
53
+ end
54
+ end
55
+
56
+ def install_ruby user, version
57
+ return true if installed? user, version
58
+ ::Dust.print_msg "downloading, compiling and installing ruby-#{version}"
59
+ ::Dust.print_result @node.exec("rvm install ruby-#{version}", :as_user => user)[:exit_code]
60
+ end
61
+
62
+ def set_default user, version
63
+ ::Dust.print_msg "setting ruby-#{version} as default"
64
+ ::Dust.print_result @node.exec("rvm use ruby-#{version} --default", :as_user => user)[:exit_code]
65
+ end
66
+
67
+ def installed? user, version
68
+ ret = @node.exec "rvm list |grep ruby-#{version}", :as_user => user
69
+ if ret[:exit_code] == 0
70
+ return ::Dust.print_ok "ruby-#{version} for user #{user} already installed"
71
+ end
72
+ false
73
+ end
74
+ end
@@ -50,7 +50,7 @@ module Dust
50
50
  @ssh.close
51
51
  end
52
52
 
53
- def exec command, options={:live => false}
53
+ def exec command, options={:live => false, :as_user => false}
54
54
  sudo_authenticated = false
55
55
  stdout = ''
56
56
  stderr = ''
@@ -58,7 +58,10 @@ module Dust
58
58
  exit_signal = nil
59
59
 
60
60
  @ssh.open_channel do |channel|
61
-
61
+
62
+ # if :as_user => user is given, execute as user (be aware of ' usage)
63
+ command = "su #{options[:as_user]} -l -c '#{command}'" if options[:as_user]
64
+
62
65
  # request a terminal (sudo needs it)
63
66
  # and prepend "sudo"
64
67
  if @node['sudo']
@@ -78,9 +81,8 @@ module Dust
78
81
  sudo_authenticated = true
79
82
  else
80
83
  stdout += data
84
+ Dust.print_msg "#{Dust.green 0}#{data}#{Dust.none}", :indent => 0 if options[:live] and not data.empty?
81
85
  end
82
-
83
- Dust.print_msg "#{Dust.green 0}#{data}#{Dust.none}", :indent => 0 if options[:live] and not data.empty?
84
86
  end
85
87
 
86
88
  channel.on_extended_data do |ch, type, data|
@@ -374,7 +376,7 @@ module Dust
374
376
  def uses_apt? options = {}
375
377
  options = default_options(:quiet => true).merge options
376
378
 
377
- return @uses_apt if @uses_apt
379
+ return @uses_apt if defined? @uses_apt
378
380
  Dust.print_msg 'determining whether node uses apt', options
379
381
  @uses_apt = Dust.print_result exec('test -e /etc/debian_version')[:exit_code], options
380
382
  end
@@ -382,7 +384,7 @@ module Dust
382
384
  def uses_rpm? options = {}
383
385
  options = default_options(:quiet => true).merge options
384
386
 
385
- return @uses_rpm if @uses_rpm
387
+ return @uses_rpm if defined? @uses_rpm
386
388
  Dust.print_msg 'determining whether node uses rpm', options
387
389
  @uses_rpm = Dust.print_result exec('test -e /etc/redhat-release')[:exit_code], options
388
390
  end
@@ -390,7 +392,7 @@ module Dust
390
392
  def uses_emerge? options = {}
391
393
  options = default_options(:quiet => true).merge options
392
394
 
393
- return @uses_emerge if @uses_emerge
395
+ return @uses_emerge if defined? @uses_emerge
394
396
  Dust.print_msg 'determining whether node uses emerge', options
395
397
  @uses_emerge = Dust.print_result exec('test -e /etc/gentoo-release')[:exit_code], options
396
398
  end
@@ -1,3 +1,3 @@
1
1
  module Dust
2
- VERSION = "0.8.3"
2
+ VERSION = "0.9.0"
3
3
  end
metadata CHANGED
@@ -1,92 +1,80 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: dust-deploy
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 8
8
- - 3
9
- version: 0.8.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - kris kechagia
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-03-14 00:00:00 +01:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-03-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: net-ssh
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
16
+ requirement: &70183130378760 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
30
22
  type: :runtime
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: net-scp
34
23
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
- version: "0"
24
+ version_requirements: *70183130378760
25
+ - !ruby/object:Gem::Dependency
26
+ name: net-scp
27
+ requirement: &70183130378280 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
42
33
  type: :runtime
43
- version_requirements: *id002
44
- - !ruby/object:Gem::Dependency
45
- name: net-sftp
46
34
  prerelease: false
47
- requirement: &id003 !ruby/object:Gem::Requirement
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- segments:
52
- - 0
53
- version: "0"
35
+ version_requirements: *70183130378280
36
+ - !ruby/object:Gem::Dependency
37
+ name: net-sftp
38
+ requirement: &70183130377840 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
54
44
  type: :runtime
55
- version_requirements: *id003
56
- - !ruby/object:Gem::Dependency
57
- name: thor
58
45
  prerelease: false
59
- requirement: &id004 !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- segments:
64
- - 0
65
- version: "0"
46
+ version_requirements: *70183130377840
47
+ - !ruby/object:Gem::Dependency
48
+ name: thor
49
+ requirement: &70183130377320 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
66
55
  type: :runtime
67
- version_requirements: *id004
68
- - !ruby/object:Gem::Dependency
69
- name: ipaddress
70
56
  prerelease: false
71
- requirement: &id005 !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- segments:
76
- - 0
77
- version: "0"
57
+ version_requirements: *70183130377320
58
+ - !ruby/object:Gem::Dependency
59
+ name: ipaddress
60
+ requirement: &70183130376860 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
78
66
  type: :runtime
79
- version_requirements: *id005
80
- description: when puppet and chef suck because you want to be in control and sprinkle just cannot do enough for you
81
- email:
67
+ prerelease: false
68
+ version_requirements: *70183130376860
69
+ description: when puppet and chef suck because you want to be in control and sprinkle
70
+ just cannot do enough for you
71
+ email:
82
72
  - kk@rndsec.net
83
- executables:
73
+ executables:
84
74
  - dust
85
75
  extensions: []
86
-
87
76
  extra_rdoc_files: []
88
-
89
- files:
77
+ files:
90
78
  - .gitignore
91
79
  - Gemfile
92
80
  - LICENSE
@@ -145,6 +133,7 @@ files:
145
133
  - lib/dust/recipes/remove_packages.rb
146
134
  - lib/dust/recipes/repositories.rb
147
135
  - lib/dust/recipes/resolv_conf.rb
136
+ - lib/dust/recipes/ruby_rvm.rb
148
137
  - lib/dust/recipes/ssh_authorized_keys.rb
149
138
  - lib/dust/recipes/sshd.rb
150
139
  - lib/dust/recipes/sudoers.rb
@@ -153,35 +142,28 @@ files:
153
142
  - lib/dust/recipes/zabbix_agent.rb
154
143
  - lib/dust/server.rb
155
144
  - lib/dust/version.rb
156
- has_rdoc: true
157
- homepage: ""
145
+ homepage: ''
158
146
  licenses: []
159
-
160
147
  post_install_message:
161
148
  rdoc_options: []
162
-
163
- require_paths:
149
+ require_paths:
164
150
  - lib
165
- required_ruby_version: !ruby/object:Gem::Requirement
166
- requirements:
167
- - - ">="
168
- - !ruby/object:Gem::Version
169
- segments:
170
- - 0
171
- version: "0"
172
- required_rubygems_version: !ruby/object:Gem::Requirement
173
- requirements:
174
- - - ">="
175
- - !ruby/object:Gem::Version
176
- segments:
177
- - 0
178
- version: "0"
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ! '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
179
163
  requirements: []
180
-
181
164
  rubyforge_project: dust-deploy
182
- rubygems_version: 1.3.6
165
+ rubygems_version: 1.8.11
183
166
  signing_key:
184
167
  specification_version: 3
185
168
  summary: small server deployment tool for complex environments
186
169
  test_files: []
187
-