chef 0.7.16 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of chef might be problematic. Click here for more details.

Files changed (180) hide show
  1. data/README.rdoc +11 -10
  2. data/bin/chef-client +2 -2
  3. data/bin/chef-solo +1 -1
  4. data/bin/knife +27 -0
  5. data/bin/shef +49 -0
  6. data/distro/README +2 -0
  7. data/distro/{debian → common}/man/man1/chef-indexer.1 +0 -0
  8. data/distro/{debian → common}/man/man1/chef-server.1 +0 -0
  9. data/distro/{debian → common}/man/man8/chef-client.8 +0 -0
  10. data/distro/{debian → common}/man/man8/chef-solo.8 +0 -0
  11. data/distro/common/man/man8/knife.8 +375 -0
  12. data/distro/redhat/etc/init.d/chef-client +8 -4
  13. data/distro/redhat/etc/init.d/chef-server +16 -15
  14. data/distro/redhat/etc/init.d/chef-server-webui +78 -0
  15. data/distro/redhat/etc/init.d/chef-solr +76 -0
  16. data/distro/redhat/etc/init.d/chef-solr-indexer +75 -0
  17. data/distro/redhat/etc/sysconfig/chef-client +10 -0
  18. data/distro/redhat/etc/sysconfig/chef-server +10 -0
  19. data/distro/redhat/etc/sysconfig/chef-server-webui +10 -0
  20. data/distro/redhat/etc/sysconfig/chef-solr +9 -0
  21. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  22. data/distro/suse/etc/init.d/chef-client +121 -0
  23. data/lib/chef.rb +1 -1
  24. data/lib/chef/api_client.rb +263 -0
  25. data/lib/chef/application.rb +1 -1
  26. data/lib/chef/application/client.rb +21 -3
  27. data/lib/chef/application/knife.rb +144 -0
  28. data/lib/chef/application/server.rb +2 -1
  29. data/lib/chef/application/solo.rb +9 -2
  30. data/lib/chef/cache.rb +61 -0
  31. data/lib/chef/cache/checksum.rb +70 -0
  32. data/lib/chef/certificate.rb +154 -0
  33. data/lib/chef/client.rb +123 -220
  34. data/lib/chef/compile.rb +9 -21
  35. data/lib/chef/config.rb +67 -10
  36. data/lib/chef/cookbook.rb +49 -22
  37. data/lib/chef/cookbook/metadata.rb +85 -5
  38. data/lib/chef/cookbook_loader.rb +4 -4
  39. data/lib/chef/couchdb.rb +99 -30
  40. data/lib/chef/daemon.rb +1 -1
  41. data/lib/chef/data_bag.rb +215 -0
  42. data/lib/chef/data_bag_item.rb +219 -0
  43. data/lib/chef/exceptions.rb +3 -0
  44. data/lib/chef/index_queue.rb +29 -0
  45. data/lib/chef/index_queue/amqp_client.rb +106 -0
  46. data/lib/chef/index_queue/consumer.rb +76 -0
  47. data/lib/chef/index_queue/indexable.rb +74 -0
  48. data/lib/chef/knife.rb +309 -0
  49. data/lib/chef/knife/client_bulk_delete.rb +40 -0
  50. data/lib/chef/knife/client_create.rb +62 -0
  51. data/lib/chef/knife/client_delete.rb +37 -0
  52. data/lib/chef/knife/client_edit.rb +37 -0
  53. data/lib/chef/knife/client_list.rb +40 -0
  54. data/lib/chef/knife/client_reregister.rb +48 -0
  55. data/lib/chef/knife/client_show.rb +42 -0
  56. data/lib/chef/knife/configure.rb +123 -0
  57. data/lib/chef/knife/cookbook_bulk_delete.rb +46 -0
  58. data/lib/chef/knife/cookbook_delete.rb +41 -0
  59. data/lib/chef/knife/cookbook_download.rb +57 -0
  60. data/lib/chef/knife/cookbook_list.rb +41 -0
  61. data/lib/chef/knife/cookbook_metadata.rb +87 -0
  62. data/lib/chef/knife/cookbook_show.rb +75 -0
  63. data/lib/chef/knife/cookbook_upload.rb +179 -0
  64. data/lib/chef/knife/data_bag_create.rb +43 -0
  65. data/lib/chef/knife/data_bag_delete.rb +43 -0
  66. data/lib/chef/knife/data_bag_edit.rb +49 -0
  67. data/lib/chef/knife/data_bag_list.rb +42 -0
  68. data/lib/chef/knife/data_bag_show.rb +40 -0
  69. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  70. data/lib/chef/knife/index_rebuild.rb +51 -0
  71. data/lib/chef/knife/node_bulk_delete.rb +43 -0
  72. data/lib/chef/knife/node_create.rb +39 -0
  73. data/lib/chef/knife/node_delete.rb +36 -0
  74. data/lib/chef/knife/node_edit.rb +36 -0
  75. data/lib/chef/knife/node_from_file.rb +42 -0
  76. data/lib/chef/knife/node_list.rb +41 -0
  77. data/lib/chef/knife/node_run_list_add.rb +64 -0
  78. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  79. data/lib/chef/knife/node_show.rb +46 -0
  80. data/lib/chef/knife/role_bulk_delete.rb +44 -0
  81. data/lib/chef/knife/role_create.rb +44 -0
  82. data/lib/chef/knife/role_delete.rb +36 -0
  83. data/lib/chef/knife/role_edit.rb +37 -0
  84. data/lib/chef/knife/role_from_file.rb +46 -0
  85. data/lib/chef/knife/role_list.rb +40 -0
  86. data/lib/chef/knife/role_show.rb +43 -0
  87. data/lib/chef/knife/search.rb +94 -0
  88. data/lib/chef/knife/ssh.rb +170 -0
  89. data/lib/chef/log.rb +30 -8
  90. data/lib/chef/mixin/checksum.rb +2 -7
  91. data/lib/chef/mixin/command.rb +32 -13
  92. data/lib/chef/mixin/convert_to_class_name.rb +15 -0
  93. data/lib/chef/mixin/deep_merge.rb +199 -11
  94. data/lib/chef/mixin/generate_url.rb +18 -9
  95. data/lib/chef/mixin/language.rb +29 -1
  96. data/lib/chef/mixin/language_include_attribute.rb +56 -0
  97. data/lib/chef/mixin/language_include_recipe.rb +53 -0
  98. data/lib/chef/mixin/params_validate.rb +25 -12
  99. data/lib/chef/mixin/recipe_definition_dsl_core.rb +2 -0
  100. data/lib/chef/mixin/template.rb +11 -1
  101. data/lib/chef/mixin/xml_escape.rb +87 -0
  102. data/lib/chef/node.rb +144 -122
  103. data/lib/chef/openid_registration.rb +12 -5
  104. data/lib/chef/platform.rb +89 -47
  105. data/lib/chef/provider/breakpoint.rb +36 -0
  106. data/lib/chef/provider/cron.rb +5 -6
  107. data/lib/chef/provider/deploy.rb +43 -10
  108. data/lib/chef/provider/deploy/revision.rb +2 -3
  109. data/lib/chef/provider/erl_call.rb +72 -0
  110. data/lib/chef/provider/file.rb +8 -4
  111. data/lib/chef/provider/git.rb +10 -5
  112. data/lib/chef/provider/group/dscl.rb +128 -0
  113. data/lib/chef/provider/http_request.rb +6 -2
  114. data/lib/chef/provider/ifconfig.rb +1 -0
  115. data/lib/chef/provider/link.rb +1 -1
  116. data/lib/chef/provider/log.rb +53 -0
  117. data/lib/chef/provider/mdadm.rb +88 -0
  118. data/lib/chef/provider/mount/mount.rb +1 -1
  119. data/lib/chef/provider/package.rb +1 -1
  120. data/lib/chef/provider/package/easy_install.rb +106 -0
  121. data/lib/chef/provider/package/pacman.rb +101 -0
  122. data/lib/chef/provider/package/portage.rb +1 -1
  123. data/lib/chef/provider/package/rpm.rb +10 -8
  124. data/lib/chef/provider/package/yum-dump.py +22 -3
  125. data/lib/chef/provider/package/yum.rb +32 -8
  126. data/lib/chef/provider/package/zypper.rb +132 -0
  127. data/lib/chef/provider/remote_directory.rb +58 -49
  128. data/lib/chef/provider/remote_file.rb +1 -1
  129. data/lib/chef/provider/route.rb +136 -80
  130. data/lib/chef/provider/ruby_block.rb +18 -1
  131. data/lib/chef/provider/service/arch.rb +109 -0
  132. data/lib/chef/provider/service/freebsd.rb +0 -1
  133. data/lib/chef/provider/service/simple.rb +2 -3
  134. data/lib/chef/provider/service/upstart.rb +191 -0
  135. data/lib/chef/provider/subversion.rb +12 -4
  136. data/lib/chef/provider/template.rb +85 -53
  137. data/lib/chef/provider/user.rb +1 -1
  138. data/lib/chef/provider/user/dscl.rb +277 -0
  139. data/lib/chef/provider/user/useradd.rb +1 -0
  140. data/lib/chef/recipe.rb +2 -41
  141. data/lib/chef/resource.rb +9 -3
  142. data/lib/chef/resource/breakpoint.rb +35 -0
  143. data/lib/chef/resource/deploy.rb +16 -2
  144. data/lib/chef/resource/easy_install_package.rb +41 -0
  145. data/lib/chef/resource/erl_call.rb +83 -0
  146. data/lib/chef/resource/freebsd_package.rb +35 -0
  147. data/lib/chef/resource/log.rb +62 -0
  148. data/lib/chef/resource/mdadm.rb +82 -0
  149. data/lib/chef/resource/pacman_package.rb +33 -0
  150. data/lib/chef/resource/ruby_block.rb +21 -2
  151. data/lib/chef/resource/scm.rb +8 -0
  152. data/lib/chef/resource/subversion.rb +1 -0
  153. data/lib/chef/resource/user.rb +5 -2
  154. data/lib/chef/resource/yum_package.rb +36 -0
  155. data/lib/chef/resource_collection.rb +17 -9
  156. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  157. data/lib/chef/rest.rb +166 -81
  158. data/lib/chef/role.rb +114 -38
  159. data/lib/chef/run_list.rb +15 -6
  160. data/lib/chef/runner.rb +13 -11
  161. data/lib/chef/search/query.rb +60 -0
  162. data/lib/chef/shef.rb +220 -0
  163. data/lib/chef/shef/ext.rb +297 -0
  164. data/lib/chef/shef/shef_session.rb +175 -0
  165. data/lib/chef/streaming_cookbook_uploader.rb +187 -0
  166. data/lib/chef/tasks/chef_repo.rake +53 -155
  167. data/lib/chef/util/file_edit.rb +94 -96
  168. data/lib/chef/webui_user.rb +233 -0
  169. metadata +219 -63
  170. data/distro/debian/etc/init.d/chef-indexer +0 -175
  171. data/distro/redhat/etc/chef/client.rb +0 -16
  172. data/distro/redhat/etc/chef/indexer.rb +0 -10
  173. data/distro/redhat/etc/chef/server.rb +0 -22
  174. data/distro/redhat/etc/init.d/chef-indexer +0 -76
  175. data/lib/chef/application/indexer.rb +0 -141
  176. data/lib/chef/queue.rb +0 -145
  177. data/lib/chef/search.rb +0 -88
  178. data/lib/chef/search/result.rb +0 -64
  179. data/lib/chef/search_index.rb +0 -77
  180. data/lib/chef/util/fileedit.rb +0 -121
@@ -35,8 +35,6 @@ class Chef
35
35
 
36
36
  def action_create
37
37
  super
38
-
39
- @remote_file_list = Hash.new
40
38
  do_recursive
41
39
  end
42
40
 
@@ -45,81 +43,92 @@ class Chef
45
43
  def do_recursive
46
44
  if Chef::Config[:solo]
47
45
  Chef::Log.debug("Doing a local recursive directory copy for #{@new_resource}")
48
- files_to_transfer = files_for_directory(@new_resource.source)
49
46
  else
50
47
  Chef::Log.debug("Doing a remote recursive directory transfer for #{@new_resource}")
51
- r = Chef::REST.new(Chef::Config[:remotefile_url])
52
- files_to_transfer = r.get_rest(generate_url(@new_resource.source, "files", { :recursive => "true" }))
53
- end
54
-
48
+ end
49
+
55
50
  files_to_transfer.each do |remote_file_source|
56
51
  fetch_remote_file(remote_file_source)
57
52
  end
58
53
  end
59
54
 
55
+ def files_to_transfer
56
+ file_list = Chef::Config[:solo] ? generate_solo_file_list : generate_client_file_list
57
+ Chef::Log.debug("Generated file manifest for #{@new_resource}:\n#{file_list.join("\n")}")
58
+ file_list
59
+ end
60
+
61
+ def generate_solo_file_list
62
+ # Pulled from chef-server-slice files controller
63
+ directory = find_preferred_file(
64
+ @new_resource.cookbook_name,
65
+ :remote_file,
66
+ @new_resource.source,
67
+ @node[:fqdn],
68
+ @node[:platform],
69
+ @node[:platform_version]
70
+ )
71
+
72
+ unless (directory && ::File.directory?(directory))
73
+ raise NotFound, "Cannot find a suitable directory"
74
+ end
75
+
76
+ Dir[::File.join(directory, '**', '*')].sort.reverse.select do |file|
77
+ file[/^#{directory}\/(.+)$/, 1] unless ::File.directory?(file)
78
+ end
79
+ end
80
+
81
+ def generate_client_file_list
82
+ r = Chef::REST.new(Chef::Config[:remotefile_url])
83
+ r.get_rest(generate_url(@new_resource.source, "files", { :recursive => "true" }))
84
+ end
85
+
60
86
  def fetch_remote_file(remote_file_source)
61
87
  full_path = ::File.join(@new_resource.path, remote_file_source)
62
- full_dir = ::File.dirname(full_path)
63
88
 
64
- if !::File.directory?(full_dir)
65
- create_directory(full_dir)
66
- end
67
-
68
- remote_file = Chef::Resource::RemoteFile.new(full_path, nil, @node)
69
- remote_file.cookbook_name = @new_resource.cookbook || @new_resource.cookbook_name
70
- remote_file.source(::File.join(@new_resource.source, remote_file_source))
89
+ ensure_directory_exists(::File.dirname(full_path))
90
+
91
+ file_to_fetch = provider_for_remote_file(full_path, remote_file_source)
92
+ file_to_fetch.load_current_resource
93
+ file_to_fetch.action_create
94
+ @new_resource.updated = true if file_to_fetch.new_resource.updated
95
+ end
96
+
97
+ def provider_for_remote_file(path, source)
98
+ remote_file = Chef::Resource::RemoteFile.new(path, nil, @node)
99
+ remote_file.cookbook_name = @new_resource.cookbook || @new_resource.cookbook_name
100
+ remote_file.source(::File.join(@new_resource.source, source))
71
101
  remote_file.mode(@new_resource.files_mode) if @new_resource.files_mode
72
102
  remote_file.group(@new_resource.files_group) if @new_resource.files_group
73
103
  remote_file.owner(@new_resource.files_owner) if @new_resource.files_owner
74
104
  remote_file.backup(@new_resource.files_backup) if @new_resource.files_backup
75
105
 
76
- rf_provider = Chef::Platform.provider_for_node(@node, remote_file)
77
- rf_provider.load_current_resource
78
- rf_provider.action_create
79
- @new_resource.updated = true if rf_provider.new_resource.updated
106
+ Chef::Platform.provider_for_node(@node, remote_file)
80
107
  end
81
108
 
82
- def create_directory(full_dir)
83
- new_dir = Chef::Resource::Directory.new(full_dir, nil, @node)
109
+ def ensure_directory_exists(path)
110
+ unless ::File.directory?(path)
111
+ directory_to_create = provider_for_directory(path)
112
+ directory_to_create.load_current_resource
113
+ directory_to_create.action_create
114
+ @new_resource.updated = true if directory_to_create.new_resource.updated
115
+ end
116
+ end
117
+
118
+ def provider_for_directory(path)
119
+ new_dir = Chef::Resource::Directory.new(path, nil, @node)
84
120
  new_dir.cookbook_name = @new_resource.cookbook || @new_resource.cookbook_name
85
121
  new_dir.mode(@new_resource.mode)
86
122
  new_dir.group(@new_resource.group)
87
123
  new_dir.owner(@new_resource.owner)
88
124
  new_dir.recursive(true)
89
125
 
90
- d_provider = Chef::Platform.provider_for_node(@node, new_dir)
91
- d_provider.load_current_resource
92
- d_provider.action_create
93
- @new_resource.updated = true if d_provider.new_resource.updated
126
+ Chef::Platform.provider_for_node(@node, new_dir)
94
127
  end
95
128
 
96
129
  def action_create_if_missing
97
130
  raise Chef::Exceptions::UnsupportedAction, "Remote Directories do not support create_if_missing."
98
131
  end
99
- # Pulled from chef-server-slice files controller
100
-
101
- def files_for_directory(path)
102
- directory = find_preferred_file(
103
- @new_resource.cookbook_name,
104
- :remote_file,
105
- path,
106
- @node[:fqdn],
107
- @node[:platform],
108
- @node[:platform_version]
109
- )
110
-
111
- unless (directory && ::File.directory?(directory))
112
- raise NotFound, "Cannot find a suitable directory"
113
- end
114
-
115
- directory_listing = Array.new
116
- Dir[::File.join(directory, '**', '*')].sort { |a,b| b <=> a }.each do |file|
117
- next if ::File.directory?(file)
118
- file =~ /^#{directory}\/(.+)$/
119
- directory_listing << $1
120
- end
121
- directory_listing
122
- end
123
132
 
124
133
  end
125
134
  end
@@ -102,7 +102,7 @@ class Chef
102
102
  begin
103
103
  uri = URI.parse(source)
104
104
  if uri.absolute
105
- r = Chef::REST.new(source)
105
+ r = Chef::REST.new(source, nil, nil)
106
106
  Chef::Log.debug("Downloading from absolute URI: #{source}")
107
107
  r.get_rest(source, true).open
108
108
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Author:: Bryan McLellan (btm@loftninjas.org)
2
+ # Author:: Bryan McLellan (btm@loftninjas.org), Jesse Nelson (spheromak@gmail.com)
3
3
  # Copyright:: Copyright (c) 2009 Bryan McLellan
4
4
  # License:: Apache License, Version 2.0
5
5
  #
@@ -19,100 +19,156 @@
19
19
  require 'chef/log'
20
20
  require 'chef/mixin/command'
21
21
  require 'chef/provider'
22
- require 'erb'
22
+ require 'ipaddr'
23
23
 
24
- class Chef
25
- class Provider
26
- class Route < Chef::Provider
27
- include Chef::Mixin::Command
24
+ class Chef::Provider::Route < Chef::Provider
25
+ include Chef::Mixin::Command
28
26
 
29
- def load_current_resource
30
- @current_resource = Chef::Resource::Route.new(@new_resource.name)
27
+ attr_accessor :is_running
28
+
29
+ MASK = {
30
+ '0.0.0.0' => '0',
31
+ '128.0.0.0' => '1',
32
+ '192.0.0.0' => '2',
33
+ '224.0.0.0' => '3',
34
+ '240.0.0.0' => '4',
35
+ '248.0.0.0' => '5',
36
+ '252.0.0.0' => '6',
37
+ '254.0.0.0' => '7',
38
+ '255.0.0.0' => '8',
39
+ '255.128.0.0' => '9',
40
+ '255.192.0.0' => '10',
41
+ '255.224.0.0' => '11',
42
+ '255.240.0.0' => '12',
43
+ '255.248.0.0' => '13',
44
+ '255.252.0.0' => '14',
45
+ '255.254.0.0' => '15',
46
+ '255.255.0.0' => '16',
47
+ '255.255.128.0' => '17',
48
+ '255.255.192.0' => '18',
49
+ '255.255.224.0' => '19',
50
+ '255.255.240.0' => '20',
51
+ '255.255.248.0' => '21',
52
+ '255.255.252.0' => '22',
53
+ '255.255.254.0' => '23',
54
+ '255.255.255.0' => '24',
55
+ '255.255.255.128' => '25',
56
+ '255.255.255.192' => '26',
57
+ '255.255.255.224' => '27',
58
+ '255.255.255.240' => '28',
59
+ '255.255.255.248' => '29',
60
+ '255.255.255.252' => '30',
61
+ '255.255.255.254' => '31',
62
+ '255.255.255.255' => '32'
63
+ }
31
64
 
32
- Chef::Log.debug("Checking routes for #{@current_resource.target}")
33
- status = popen4("route -n") do |pid, stdin, stdout, stderr|
34
- stdout.each do |line|
35
- case line
36
- # Destination Gateway Genmask Flags Metric Ref Use Iface
37
- when /^#{@new_resource.target}\s+([\d.]+)\s+([\d.]+)\s+(.+)\s+(\d+)\s+(.+)\s+(.+)\s+(\w+)$/
38
- @current_resource.target(@new_resource.target)
39
- @current_resource.gateway($1)
40
- @current_resource.netmask($2)
41
- @current_resource.metric($4.to_i)
42
- @current_resource.device($7)
43
- Chef::Log.debug("Found route ip:#{@current_resource.target} gw:#{@current_resource.gateway} nm:#{@current_resource.netmask} " +
44
- "metric:#{@current_resource.metric} dev:#{@current_resource.device}")
45
- end
46
- end
47
- end
65
+ def load_current_resource
66
+ is_running = nil
67
+
68
+ Chef::Log.debug("Configuring Route #{@new_resource.name}")
48
69
 
49
- unless status.exitstatus == 0
50
- raise Chef::Exception::Route, "route failed - #{status.inspect}!"
51
- end
70
+ # cidr or quad dot mask
71
+ if @new_resource.netmask
72
+ new_ip = IPAddr.new("#{@new_resource.target}/#{@new_resource.netmask}")
73
+ else
74
+ new_ip = IPAddr.new(@new_resource.target)
75
+ end
52
76
 
53
- @current_resource
54
- end
77
+ # pull routes from proc
78
+ if node[:os] == "linux"
79
+ route_file = ::File.open("/proc/net/route", "r")
80
+ while (line = route_file.gets)
81
+ # proc layout
82
+ iface,destination,gateway,flags,refcnt,use,metric,mask,mtu,window,irtt = line.split
83
+
84
+ # need to convert packed adresses int quad dot
85
+ # the addrs are reversed hex packed decimal addrs. so this unwraps them. tho you could
86
+ # do this without ipaddr using unpack. ipaddr has no htoa method.
87
+ #
88
+ destination = IPAddr.new(destination.scan(/../).reverse.to_s.hex, Socket::AF_INET).to_s
89
+ gateway = IPAddr.new(gateway.scan(/../).reverse.to_s.hex, Socket::AF_INET).to_s
90
+ mask = IPAddr.new(mask.scan(/../).reverse.to_s.hex, Socket::AF_INET).to_s
91
+ Chef::Log.debug( "System has route: dest=#{destination} mask=#{mask} gw=#{gateway}")
92
+
93
+ # check if what were trying to configure is already there
94
+ # use an ipaddr object with ip/mask this way we can have
95
+ # a new resource be in cidr format (i don't feel like
96
+ # expanding bitmask by hand.
97
+ #
98
+ running_ip = IPAddr.new("#{destination}/#{mask}")
99
+ Chef::Log.debug( "new ip: #{new_ip.inspect} running ip: #{running_ip.inspect} ")
100
+ is_running = true if running_ip == new_ip
101
+ end
102
+ route_file.close
103
+ end
104
+ end
55
105
 
56
- def action_add
106
+ def action_add
57
107
  # check to see if load_current_resource found the route
58
- unless @current_resource.gateway
59
- if @new_resource.route_type == :net
60
- command = "route add -net #{@new_resource.target}"
61
- else
62
- command = "route add #{@new_resource.target}"
63
- end
64
- command << " netmask #{@new_resource.netmask}" if @new_resource.netmask
65
- command << " gw #{@new_resource.gateway}" if @new_resource.gateway
66
- command << " metric #{@new_resource.metric}" if @new_resource.metric
67
- command << " dev #{@new_resource.device}" if @new_resource.device
68
-
69
- run_command(
70
- :command => command
71
- )
72
- @new_resource.updated = true
108
+ if is_running
109
+ Chef::Log.debug("Route #{@new_resource.name} already active ")
73
110
  else
74
- Chef::Log.debug("Route #{@current_resource} already exists")
111
+ command = "ip route replace #{@new_resource.target}"
112
+ command << "/#{MASK[@new_resource.netmask.to_s]}" if @new_resource.netmask
113
+ command << " via #{@new_resource.gateway} "
114
+ command << " dev #{@new_resource.device} " if @new_resource.device
115
+
116
+ Chef::Log.info("Adding route: #{command} ")
117
+ run_command( :command => command )
118
+ @new_resource.updated = true
75
119
  end
76
- # Write out the config files
120
+
121
+ #for now we always write the file (ugly but its what it is)
77
122
  generate_config
78
- end
79
123
 
80
- def action_delete
81
- # check to see if load_current_resource found the route
82
- if @current_resource.gateway
83
- command = "route del #{@new_resource.target}"
84
- command << " netmask #{@new_resource.netmask}" if @new_resource.netmask
85
- command << " gw #{@new_resource.gateway}" if @new_resource.gateway
86
- command << " metric #{@new_resource.metric}" if @new_resource.metric
87
- command << " dev #{@new_resource.device}" if @new_resource.device
88
-
89
- run_command(
90
- :command => command
91
- )
92
- @new_resource.updated = true
124
+ end
125
+
126
+ def action_delete
127
+ if is_running
128
+ command = "ip route delete #{@new_resource.target}"
129
+ command << "/#{MASK[@new_resource.netmask.to_s]}" if @new_resource.netmask
130
+ command << " via #{@new_resource.gateway} "
131
+
132
+ Chef::Log.info("Removing route: #{command}")
133
+ run_command( :command => command )
134
+ @new_resource.updated = true
93
135
  else
94
- Chef::Log.debug("Route #{@current_resource} does not exist")
136
+ Chef::Log.debug("Route #{@new_resource.name} does not exist")
95
137
  end
96
- end
138
+ end
97
139
 
98
- def generate_config
99
- b = binding
140
+ def generate_config
141
+ conf = Hash.new
100
142
  case node[:platform]
101
143
  when ("centos" || "redhat" || "fedora")
102
- content = %{
103
- <% if @new_resource.networking %>NETWORKING=<%= @new_resource.networking %><% end %>
104
- <% if @new_resource.networking_ipv6 %>NETWORKING_IPV6=<%= @new_resource.networking_ipv6 %><% end %>
105
- <% if @new_resource.hostname %>HOSTNAME=<%= @new_resource.hostname %><% end %>
106
- <% if @new_resource.name %>GATEWAY=<%= @new_resource.name %><% end %>
107
- <% if @new_resource.domainname %>DOMAINNAME=<%= @new_resource.domainname %><% end %>
108
- <% if @new_resource.domainname %>DOMAIN=<%= @new_resource.domainname %><% end %>
109
- }
110
- template = ::ERB.new(content)
111
- network_file = ::File.new("/etc/sysconfig/network", "w")
112
- network_file.puts(template.result(b))
113
- network_file.close
144
+ # walk the collection
145
+ @collection.each do |resource|
146
+ if resource.is_a? Chef::Resource::Route
147
+ # default to eth0
148
+ if resource.device
149
+ dev = resource.device
150
+ else
151
+ dev = "eth0"
152
+ end
153
+
154
+ conf[dev] = String.new if conf[dev].nil?
155
+ if resource.action == :add
156
+ conf[dev] << "#{resource.target}"
157
+ conf[dev] << "/#{resource.netmask}" if resource.netmask
158
+ conf[dev] << " via #{resource.gateway}\n"
159
+ else
160
+ # need to do this for the case when the last route on an int
161
+ # is removed
162
+ conf[dev] = ""
163
+ end
164
+ end
165
+ end
166
+ conf.each do |k, v|
167
+ network_file = ::File.new("/etc/sysconfig/network-scripts/route-#{k}", "w")
168
+ network_file.puts(conf[k])
169
+ Chef::Log.debug("writing route.#{k}\n#{conf[k]}")
170
+ network_file.close
171
+ end
114
172
  end
115
- end
116
- end
117
- end
173
+ end
118
174
  end
@@ -1,9 +1,26 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: AJ Christensen (<aj@opscode.com>)
4
+ # Copyright:: Copyright (c) 2009 Opscode
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
1
19
 
2
20
  class Chef
3
21
  class Provider
4
22
  class RubyBlock < Chef::Provider
5
23
  def load_current_resource
6
- Chef::Log.debug(@new_resource.inspect)
7
24
  true
8
25
  end
9
26
 
@@ -0,0 +1,109 @@
1
+ #
2
+ # Author:: Jan Zimmek (<jan.zimmek@web.de>)
3
+ # Copyright:: Copyright (c) 2010 Jan Zimmek
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/provider/service/init'
20
+ require 'chef/mixin/command'
21
+
22
+ class Chef::Provider::Service::Arch < Chef::Provider::Service::Init
23
+
24
+ def initialize(node, new_resource, collection=nil, definitions=nil, cookbook_loader=nil)
25
+ super(node, new_resource, collection, definitions, cookbook_loader)
26
+ @init_command = "/etc/rc.d/#{@new_resource.service_name}"
27
+ end
28
+
29
+ def load_current_resource
30
+
31
+ raise Chef::Exceptions::Service unless ::File.exists?("/etc/rc.conf")
32
+ raise Chef::Exceptions::Service unless ::File.read("/etc/rc.conf").match(/DAEMONS=\((.*)\)/)
33
+
34
+ super
35
+
36
+ @current_resource.enabled(daemons.include?(@current_resource.service_name))
37
+
38
+ @current_resource
39
+ end
40
+
41
+ def daemons
42
+ entries = []
43
+ if ::File.read("/etc/rc.conf").match(/DAEMONS=\((.*)\)/)
44
+ entries += $1.split(" ") if $1.length > 0
45
+ end
46
+
47
+ yield(entries) if block_given?
48
+
49
+ entries
50
+ end
51
+
52
+ def update_daemons(entries)
53
+ content = ::File.read("/etc/rc.conf").gsub(/DAEMONS=\((.*)\)/, "DAEMONS=(#{entries.join(' ')})")
54
+ ::File.open("/etc/rc.conf", "w") do |f|
55
+ f.write(content)
56
+ end
57
+ end
58
+
59
+ def enable_service()
60
+ new_daemons = []
61
+ entries = daemons
62
+
63
+ if entries.include?(new_resource.service_name)
64
+ # exists and already enabled
65
+ new_daemons += entries
66
+ else
67
+ if entries.include?("!#{new_resource.service_name}")
68
+ # exists but disabled
69
+ entries.each do |daemon|
70
+ if daemon == "!#{new_resource.service_name}"
71
+ new_daemons << new_resource.service_name
72
+ else
73
+ new_daemons << daemon
74
+ end
75
+ end
76
+ else
77
+ # does not exist
78
+ new_daemons += entries
79
+ new_daemons << new_resource.service_name
80
+ end
81
+ end
82
+
83
+ update_daemons(new_daemons)
84
+ end
85
+
86
+ def disable_service()
87
+ new_daemons = []
88
+ entries = daemons
89
+
90
+ if entries.include?("!#{new_resource.service_name}")
91
+ # exists and disabled
92
+ new_daemons += entries
93
+ else
94
+ if entries.include?(new_resource.service_name)
95
+ # exists but enabled
96
+ entries.each do |daemon|
97
+ if daemon == new_resource.service_name
98
+ new_daemons << "!#{new_resource.service_name}"
99
+ else
100
+ new_daemons << daemon
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ update_daemons(new_daemons)
107
+ end
108
+
109
+ end