knife-ec-backup 1.2.0 → 2.0.0.beta.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1f715c068eec09039f7fb77be236223d14bd5bbb
4
- data.tar.gz: 5d00a6295eda4e69bd2a1631ff0c651f737a870b
3
+ metadata.gz: 24f0f5bf6187090c18829999dd6ae339b8f97f44
4
+ data.tar.gz: c90dc04b94f007fb059a03021e2d951411e60d92
5
5
  SHA512:
6
- metadata.gz: bb98c58235cb8bc54b5ddbe810afea0c11a55fe9db47eced86203bb3aea403f545ee438917af54706dc873b1a73b32bf3866bdc52128702f015ca3e7fd9c6b65
7
- data.tar.gz: 7e27ada33d2a6424880d54e6e924b1336e677cc8125403c064edb2708fed90c91e1d0cd27914391f5d02354e31fe09ad48ac2aec8f4093dd3980e2449215ff87
6
+ metadata.gz: d8f804e4a2a9bcc0486c86f618af446f3d8cea3a8ce002a39705db49652d6301ac5d68d65b1224c0f5b2db60a8eca620b50c0012a3fabff08ce40762555f1389
7
+ data.tar.gz: 0c5f596befa740f26deb0b7bc4bc50065333904d039ce22ded2e9bf02768e5c0475660c4a2d7723d1359901372a58b50463408b2683b6f6e9cfc56f65e469f69
data/README.md CHANGED
@@ -6,9 +6,12 @@ This is an UNOFFICIAL and EXPERIMENTAL knife plugin intended to back up and rest
6
6
 
7
7
  # Requirements
8
8
 
9
- This knife plugin currently requires the Knife-Essentials gem to be installed in the same gemset. This requirement is currently hosted here:
9
+ This knife plugin requires Chef 11.8+.
10
10
 
11
- https://github.com/jkeiser/knife-essentials
11
+ ## Chef 10
12
+
13
+ Users who are still using Chef 10 can use the most recent 1.x version
14
+ of this gem. Version 1.x additionally depends on knife-essentials.
12
15
 
13
16
  # Installation
14
17
 
@@ -16,7 +19,6 @@ This knife plugin currently requires the Knife-Essentials gem to be installed in
16
19
  This will install the plugin directly on the Chef Server:
17
20
 
18
21
  /opt/opscode/embedded/bin/gem install knife-ec-backup
19
- /opt/opscode/embedded/bin/gem install knife-ec-backup
20
22
 
21
23
  ## Build from source
22
24
  Clone the git repository and run the following from inside:
@@ -118,4 +120,4 @@ Restores all data from a repository to an Enterprise Chef / Private Chef server.
118
120
  * Single org backups.
119
121
  * This plugin does **NOT** currently backup user passwords. **They will have to be reset after a restore.**
120
122
  * This plugin does **NOT** currently restore user public keys. **Private keys will have to be reset after a restore.**
121
- * This plugin does **NOT** currently restore custom user ACLs. **It will revert back to default ACLs on a restore.**
123
+ * This plugin does **NOT** currently restore custom user ACLs. **It will revert back to default ACLs on a restore.**
@@ -25,21 +25,25 @@ class Chef
25
25
  :default => false,
26
26
  :description => "Whether to skip checking the Chef Server version. This will also skip any auto-configured options"
27
27
 
28
+ option :with_user_sql,
29
+ :long => '--with-user-sql',
30
+ :description => 'Whether to try direct data base access for user export. Required to properly handle passwords, keys, and USAGs'
31
+
28
32
  option :org,
29
33
  :long => '--only-org ORGNAME',
30
34
  :description => "Only back up objects in the named organization (default: all orgs)"
31
35
 
32
36
  deps do
33
- require 'chef_fs/config'
34
- require 'chef_fs/file_system'
35
- require 'chef_fs/file_pattern'
36
- require 'chef_fs/parallelizer'
37
+ require 'chef/chef_fs/config'
38
+ require 'chef/chef_fs/file_system'
39
+ require 'chef/chef_fs/file_pattern'
40
+ require 'chef/chef_fs/parallelizer'
37
41
  end
38
42
 
39
43
  def configure_chef
40
44
  super
41
45
  Chef::Config[:concurrency] = config[:concurrency].to_i if config[:concurrency]
42
- ::ChefFS::Parallelizer.threads = (Chef::Config[:concurrency] || 10) - 1
46
+ Chef::ChefFS::Parallelizer.threads = (Chef::Config[:concurrency] || 10) - 1
43
47
  end
44
48
 
45
49
  def run
@@ -122,7 +126,6 @@ class Chef
122
126
 
123
127
  # Grab users
124
128
  puts "Grabbing users ..."
125
-
126
129
  ensure_dir("#{dest_dir}/users")
127
130
  ensure_dir("#{dest_dir}/user_acls")
128
131
 
@@ -141,6 +144,16 @@ class Chef
141
144
  end
142
145
  end
143
146
 
147
+ if config[:with_user_sql]
148
+ require 'chef/knife/ec_key_export'
149
+ Chef::Knife::EcKeyExport.deps
150
+ k = Chef::Knife::EcKeyExport.new
151
+ k.name_args = ["#{dest_dir}/key_dump.json"]
152
+ k.config[:sql_host] = "localhost"
153
+ k.config[:sql_port] = 5432
154
+ k.run
155
+ end
156
+
144
157
  # Download organizations
145
158
  ensure_dir("#{dest_dir}/organizations")
146
159
  rest.get_rest('/organizations').each_pair do |name, url|
@@ -174,16 +187,13 @@ class Chef
174
187
  end
175
188
 
176
189
  PATHS = %w(chef_repo_path cookbook_path environment_path data_bag_path role_path node_path client_path acl_path group_path container_path)
177
- CONFIG_VARS = %w(chef_server_url chef_server_root custom_http_headers node_name client_key versioned_cookbooks) + PATHS
178
190
  def download_org(dest_dir, webui_key, name)
179
- old_config = {}
180
- CONFIG_VARS.each do |key|
181
- old_config[key] = Chef::Config[key.to_sym]
182
- end
191
+ old_config = Chef::Config.save
192
+
183
193
  begin
184
194
  # Clear out paths
185
- PATHS.each do |path_var|
186
- Chef::Config[path_var.to_sym] = nil
195
+ PATHS.each do |path|
196
+ Chef::Config.delete(path.to_sym)
187
197
  end
188
198
  Chef::Config.chef_repo_path = "#{dest_dir}/organizations/#{name}"
189
199
  Chef::Config.versioned_cookbooks = true
@@ -193,17 +203,17 @@ class Chef
193
203
  ensure_dir(Chef::Config.chef_repo_path)
194
204
 
195
205
  # Download the billing-admins ACL and group as pivotal
196
- chef_fs_config = ::ChefFS::Config.new
197
- pattern = ::ChefFS::FilePattern.new('/acls/groups/billing-admins.json')
198
- if ::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
206
+ chef_fs_config = Chef::ChefFS::Config.new
207
+ pattern = Chef::ChefFS::FilePattern.new('/acls/groups/billing-admins.json')
208
+ if Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
199
209
  @error = true
200
210
  end
201
- pattern = ::ChefFS::FilePattern.new('/groups/billing-admins.json')
202
- if ::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
211
+ pattern = Chef::ChefFS::FilePattern.new('/groups/billing-admins.json')
212
+ if Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
203
213
  @error = true
204
214
  end
205
- pattern = ::ChefFS::FilePattern.new('/groups/admins.json')
206
- if ::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
215
+ pattern = Chef::ChefFS::FilePattern.new('/groups/admins.json')
216
+ if Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
207
217
  @error = true
208
218
  end
209
219
 
@@ -217,19 +227,17 @@ class Chef
217
227
  Chef::Config.custom_http_headers = (Chef::Config.custom_http_headers || {}).merge({'x-ops-request-source' => 'web'})
218
228
 
219
229
  # Download the entire org skipping the billing admins group ACL and the group itself
220
- chef_fs_config = ::ChefFS::Config.new
230
+ chef_fs_config = Chef::ChefFS::Config.new
221
231
  top_level_paths = chef_fs_config.chef_fs.children.select { |entry| entry.name != 'acls' && entry.name != 'groups' }.map { |entry| entry.path }
222
- acl_paths = ::ChefFS::FileSystem.list(chef_fs_config.chef_fs, ::ChefFS::FilePattern.new('/acls/*')).select { |entry| entry.name != 'groups' }.map { |entry| entry.path }
223
- group_acl_paths = ::ChefFS::FileSystem.list(chef_fs_config.chef_fs, ::ChefFS::FilePattern.new('/acls/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| entry.path }
224
- group_paths = ::ChefFS::FileSystem.list(chef_fs_config.chef_fs, ::ChefFS::FilePattern.new('/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| entry.path }
232
+ acl_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.chef_fs, Chef::ChefFS::FilePattern.new('/acls/*')).select { |entry| entry.name != 'groups' }.map { |entry| entry.path }
233
+ group_acl_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.chef_fs, Chef::ChefFS::FilePattern.new('/acls/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| entry.path }
234
+ group_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.chef_fs, Chef::ChefFS::FilePattern.new('/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| entry.path }
225
235
  (top_level_paths + group_acl_paths + acl_paths + group_paths).each do |path|
226
- ::ChefFS::FileSystem.copy_to(::ChefFS::FilePattern.new(path), chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
236
+ Chef::ChefFS::FileSystem.copy_to(Chef::ChefFS::FilePattern.new(path), chef_fs_config.chef_fs, chef_fs_config.local_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
227
237
  end
228
238
 
229
239
  ensure
230
- CONFIG_VARS.each do |key|
231
- Chef::Config[key.to_sym] = old_config[key]
232
- end
240
+ Chef::Config.restore(old_config)
233
241
  end
234
242
  end
235
243
  end
@@ -52,8 +52,9 @@ class Chef
52
52
 
53
53
  def db
54
54
  @db ||= begin
55
+ require 'sequel'
55
56
  server_string = "#{config[:sql_user]}:#{config[:sql_password]}@#{config[:sql_host]}:#{config[:sql_port]}/opscode_chef"
56
- Sequel.connect("postgres://#{server_string}")
57
+ ::Sequel.connect("postgres://#{server_string}")
57
58
  end
58
59
  end
59
60
 
@@ -37,7 +37,7 @@ class Chef
37
37
  end
38
38
 
39
39
  def export(path)
40
- users = db.select(:username, :public_key, :pubkey_version, :hashed_password, :salt, :hash_type).from(:users)
40
+ users = db.select(:username, :id, :public_key, :pubkey_version, :hashed_password, :salt, :hash_type).from(:users)
41
41
  File.open(path, 'w') { |file| file.write(users.all.to_json) }
42
42
  end
43
43
  end
@@ -33,6 +33,12 @@ class Chef
33
33
  :boolean => true,
34
34
  :description => "Upload pivotal key. By default the pivotal key is not uploaded."
35
35
 
36
+ option :skip_ids,
37
+ :long => "--[no-]skip-user-ids",
38
+ :default => true,
39
+ :boolean => true,
40
+ :description => "Upload user ids."
41
+
36
42
  def run
37
43
  if config[:sql_user].nil? || config[:sql_password].nil?
38
44
  load_config_from_file!
@@ -46,6 +52,7 @@ class Chef
46
52
  def import(path)
47
53
  key_data = JSON.parse(File.read(path))
48
54
  key_data.each do |d|
55
+ id = d['id']
49
56
  username = d['username']
50
57
  key = d['public_key']
51
58
  version = d['pubkey_version']
@@ -63,11 +70,14 @@ class Chef
63
70
  if users_to_update.count != 1
64
71
  ui.warn "Wrong number of users to update for #{username}. Skipping"
65
72
  else
66
- users_to_update.update(:public_key => key,
67
- :pubkey_version => version,
68
- :salt => salt,
69
- :hashed_password => hashed_password,
70
- :hash_type => hash_type)
73
+ data = { :public_key => key,
74
+ :pubkey_version => version,
75
+ :salt => salt,
76
+ :hashed_password => hashed_password,
77
+ :hash_type => hash_type
78
+ }
79
+ data[:id] = id unless config[:skip_ids]
80
+ users_to_update.update(data)
71
81
  end
72
82
  end
73
83
  end
@@ -31,22 +31,36 @@ class Chef
31
31
  :default => false,
32
32
  :description => "Whether to skip checking the Chef Server version. This will also skip any auto-configured options"
33
33
 
34
+ option :org,
35
+ :long => "--only-org ORG",
36
+ :description => "Only restore objects in the named organization (default: all orgs)"
37
+
38
+ option :skip_users,
39
+ :long => "--skip-users",
40
+ :description => "Skip restoring users"
41
+
42
+ option :with_user_sql,
43
+ :long => "--with-user-sql",
44
+ :description => "Restore user id's, passwords, and keys from sql export"
45
+
34
46
  deps do
35
47
  require 'chef/json_compat'
36
- require 'chef_fs/config'
37
- require 'chef_fs/file_system'
38
- require 'chef_fs/file_pattern'
39
- require 'chef_fs/file_system/acl_entry'
40
- require 'chef_fs/data_handler/acl_data_handler'
48
+ require 'chef/chef_fs/config'
49
+ require 'chef/chef_fs/file_system'
50
+ require 'chef/chef_fs/file_pattern'
51
+ # Work around bug in chef_fs
52
+ require 'chef/chef_fs/command_line'
53
+ require 'chef/chef_fs/file_system/acl_entry'
54
+ require 'chef/chef_fs/data_handler/acl_data_handler'
41
55
  require 'securerandom'
42
- require 'chef_fs/parallelizer'
56
+ require 'chef/chef_fs/parallelizer'
43
57
  require 'chef/tsorter'
44
58
  end
45
59
 
46
60
  def configure_chef
47
61
  super
48
62
  Chef::Config[:concurrency] = config[:concurrency].to_i if config[:concurrency]
49
- ::ChefFS::Parallelizer.threads = (Chef::Config[:concurrency] || 10) - 1
63
+ Chef::ChefFS::Parallelizer.threads = (Chef::Config[:concurrency] || 10) - 1
50
64
  end
51
65
 
52
66
  def run
@@ -109,46 +123,22 @@ class Chef
109
123
  config[:skip_useracl] = true
110
124
  user_acl_rest = nil
111
125
  else
112
- user_acl_rest = rest
113
- end
126
+ user_acl_rest = rest
127
+ end
114
128
  else
115
129
  ui.warn("Unable to detect Chef Server version.")
116
130
  end
117
131
  end
118
132
 
119
- # Restore users
120
- puts "Restoring users ..."
121
-
122
133
  rest = Chef::REST.new(Chef::Config.chef_server_root)
123
-
124
- Dir.foreach("#{dest_dir}/users") do |filename|
125
- next if filename !~ /(.+)\.json/
126
- name = $1
127
- if name == 'pivotal' && !config[:overwrite_pivotal]
128
- ui.warn("Skipping pivotal update. To overwrite pivotal, pass --overwrite-pivotal.")
129
- next
130
- end
131
-
132
- # Update user object
133
- user = JSONCompat.from_json(IO.read("#{dest_dir}/users/#{name}.json"))
134
- begin
135
- # Supply password for new user
136
- user_with_password = user.dup
137
- user_with_password['password'] = SecureRandom.hex
138
- rest.post_rest('users', user_with_password)
139
- rescue Net::HTTPServerException => e
140
- if e.response.code == "409"
141
- rest.put_rest("users/#{name}", user)
142
- else
143
- raise
144
- end
145
- end
146
-
147
- end
134
+ # Restore users
135
+ restore_users(dest_dir, rest) unless config[:skip_users]
136
+ restore_user_sql(dest_dir) if config[:with_user_sql]
148
137
 
149
138
  # Restore organizations
150
139
  Dir.foreach("#{dest_dir}/organizations") do |name|
151
140
  next if name == '..' || name == '.' || !File.directory?("#{dest_dir}/organizations/#{name}")
141
+ next unless (config[:org].nil? || config[:org] == name)
152
142
  puts "Restoring org #{name} ..."
153
143
 
154
144
  # Create organization
@@ -170,7 +160,7 @@ class Chef
170
160
  rest.post_rest("organizations/#{name}/association_requests", { 'user' => invitation['username'] })
171
161
  rescue Net::HTTPServerException => e
172
162
  if e.response.code != "409"
173
- raise
163
+ ui.error("Cannot create invitation #{invitation['id']}")
174
164
  end
175
165
  end
176
166
  end
@@ -210,7 +200,7 @@ class Chef
210
200
 
211
201
  # Update user acl
212
202
  user_acl = JSONCompat.from_json(IO.read("#{dest_dir}/user_acls/#{name}.json"))
213
- put_acl(rest, "users/#{name}/_acl", user_acl)
203
+ put_acl(rest, "users/#{name}/_acl", user_acl)
214
204
  end
215
205
 
216
206
 
@@ -219,18 +209,54 @@ class Chef
219
209
  end
220
210
  end
221
211
 
212
+ def restore_users(dest_dir, rest)
213
+ puts "Restoring users ..."
214
+ Dir.foreach("#{dest_dir}/users") do |filename|
215
+ next if filename !~ /(.+)\.json/
216
+ name = $1
217
+ if name == 'pivotal' && !config[:overwrite_pivotal]
218
+ ui.warn("Skipping pivotal update. To overwrite pivotal, pass --overwrite-pivotal.")
219
+ next
220
+ end
221
+
222
+ # Update user object
223
+ user = JSONCompat.from_json(IO.read("#{dest_dir}/users/#{name}.json"))
224
+ begin
225
+ # Supply password for new user
226
+ user_with_password = user.dup
227
+ user_with_password['password'] = SecureRandom.hex
228
+ rest.post_rest('users', user_with_password)
229
+ rescue Net::HTTPServerException => e
230
+ if e.response.code == "409"
231
+ rest.put_rest("users/#{name}", user)
232
+ else
233
+ raise
234
+ end
235
+ end
236
+ end
237
+ end
238
+
239
+ def restore_user_sql(dest_dir)
240
+ require 'chef/knife/ec_key_import'
241
+ k = Chef::Knife::EcKeyImport.new
242
+ k.name_args = ["#{dest_dir}/key_dump.json"]
243
+ k.config[:skip_pivotal] = true
244
+ k.config[:skip_ids] = false
245
+ k.config[:sql_host] = "localhost"
246
+ k.config[:sql_port] = 5432
247
+ k.run
248
+ end
249
+
222
250
  PATHS = %w(chef_repo_path cookbook_path environment_path data_bag_path role_path node_path client_path acl_path group_path container_path)
223
- CONFIG_VARS = %w(chef_server_url chef_server_root custom_http_headers node_name client_key versioned_cookbooks) + PATHS
224
251
  def upload_org(dest_dir, webui_key, name)
225
- old_config = {}
226
- CONFIG_VARS.each do |key|
227
- old_config[key] = Chef::Config[key.to_sym]
228
- end
252
+ old_config = Chef::Config.save
253
+
229
254
  begin
230
255
  # Clear out paths
231
- PATHS.each do |path_var|
232
- Chef::Config[path_var.to_sym] = nil
256
+ PATHS.each do |path|
257
+ Chef::Config.delete(path.to_sym)
233
258
  end
259
+
234
260
  Chef::Config.chef_repo_path = "#{dest_dir}/organizations/#{name}"
235
261
  Chef::Config.versioned_cookbooks = true
236
262
 
@@ -238,15 +264,15 @@ class Chef
238
264
 
239
265
  # Upload the admins group and billing-admins acls
240
266
  puts "Restoring the org admin data"
241
- chef_fs_config = ::ChefFS::Config.new
267
+ chef_fs_config = Chef::ChefFS::Config.new
242
268
 
243
269
  # Restore users w/o clients (which don't exist yet)
244
270
  ['admins', 'billing-admins'].each do |group|
245
271
  restore_group(chef_fs_config, group, :clients => false)
246
272
  end
247
273
 
248
- pattern = ::ChefFS::FilePattern.new('/acls/groups/billing-admins.json')
249
- if ::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.local_fs, chef_fs_config.chef_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
274
+ pattern = Chef::ChefFS::FilePattern.new('/acls/groups/billing-admins.json')
275
+ if Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.local_fs, chef_fs_config.chef_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
250
276
  @error = true
251
277
  end
252
278
 
@@ -267,30 +293,28 @@ class Chef
267
293
 
268
294
  # Restore the entire org skipping the admin data and restoring groups and acls last
269
295
  puts "Restoring the rest of the org"
270
- chef_fs_config = ::ChefFS::Config.new
296
+ chef_fs_config = Chef::ChefFS::Config.new
271
297
  top_level_paths = chef_fs_config.local_fs.children.select { |entry| entry.name != 'acls' && entry.name != 'groups' }.map { |entry| entry.path }
272
298
 
273
299
  # Topologically sort groups for upload
274
- unsorted_groups = ::ChefFS::FileSystem.list(chef_fs_config.local_fs, ::ChefFS::FilePattern.new('/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| JSON.parse(entry.read) }
300
+ unsorted_groups = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| JSON.parse(entry.read) }
275
301
  group_paths = sort_groups_for_upload(unsorted_groups).map { |group_name| "/groups/#{group_name}.json" }
276
302
 
277
- group_acl_paths = ::ChefFS::FileSystem.list(chef_fs_config.local_fs, ::ChefFS::FilePattern.new('/acls/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| entry.path }
278
- acl_paths = ::ChefFS::FileSystem.list(chef_fs_config.local_fs, ::ChefFS::FilePattern.new('/acls/*')).select { |entry| entry.name != 'groups' }.map { |entry| entry.path }
303
+ group_acl_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/acls/groups/*')).select { |entry| entry.name != 'billing-admins.json' }.map { |entry| entry.path }
304
+ acl_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/acls/*')).select { |entry| entry.name != 'groups' }.map { |entry| entry.path }
279
305
 
280
306
  (top_level_paths + group_paths + group_acl_paths + acl_paths).each do |path|
281
- ::ChefFS::FileSystem.copy_to(::ChefFS::FilePattern.new(path), chef_fs_config.local_fs, chef_fs_config.chef_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
307
+ Chef::ChefFS::FileSystem.copy_to(Chef::ChefFS::FilePattern.new(path), chef_fs_config.local_fs, chef_fs_config.chef_fs, nil, config, ui, proc { |entry| chef_fs_config.format_path(entry) })
282
308
  end
283
309
  # restore clients to groups, using the pivotal key again
284
310
  Chef::Config[:node_name] = old_config['node_name']
285
- Chef::Config[:client_key] = old_config['client_key']
311
+ Chef::Config[:client_key] = old_config['client_key']
286
312
  Chef::Config.custom_http_headers = {}
287
313
  ['admins', 'billing-admins'].each do |group|
288
- restore_group(::ChefFS::Config.new, group)
314
+ restore_group(Chef::ChefFS::Config.new, group)
289
315
  end
290
316
  ensure
291
- CONFIG_VARS.each do |key|
292
- Chef::Config[key.to_sym] = old_config[key]
293
- end
317
+ Chef::Config.restore(old_config)
294
318
  end
295
319
  end
296
320
 
@@ -316,13 +340,13 @@ class Chef
316
340
  def restore_group(chef_fs_config, group_name, includes = {:users => true, :clients => true})
317
341
  includes[:users] = true unless includes.key? :users
318
342
  includes[:clients] = true unless includes.key? :clients
319
-
320
- group = ::ChefFS::FileSystem.resolve_path(
343
+
344
+ group = Chef::ChefFS::FileSystem.resolve_path(
321
345
  chef_fs_config.chef_fs,
322
346
  "/groups/#{group_name}.json"
323
347
  )
324
348
 
325
- members_json = ::ChefFS::FileSystem.resolve_path(
349
+ members_json = Chef::ChefFS::FileSystem.resolve_path(
326
350
  chef_fs_config.local_fs,
327
351
  "/groups/#{group_name}.json"
328
352
  ).read
@@ -336,20 +360,20 @@ class Chef
336
360
  member == 'clients'
337
361
  end
338
362
  end
339
-
363
+
340
364
  group.write(members.to_json)
341
365
  end
342
366
 
343
367
  def parallelize(entries, options = {}, &block)
344
- ::ChefFS::Parallelizer.parallelize(entries, options, &block)
368
+ Chef::ChefFS::Parallelizer.parallelize(entries, options, &block)
345
369
  end
346
370
 
347
371
  def put_acl(rest, url, acls)
348
372
  old_acls = rest.get_rest(url)
349
- old_acls = ::ChefFS::DataHandler::AclDataHandler.new.normalize(old_acls, nil)
350
- acls = ::ChefFS::DataHandler::AclDataHandler.new.normalize(acls, nil)
373
+ old_acls = Chef::ChefFS::DataHandler::AclDataHandler.new.normalize(old_acls, nil)
374
+ acls = Chef::ChefFS::DataHandler::AclDataHandler.new.normalize(acls, nil)
351
375
  if acls != old_acls
352
- ::ChefFS::FileSystem::AclEntry::PERMISSIONS.each do |permission|
376
+ Chef::ChefFS::FileSystem::AclEntry::PERMISSIONS.each do |permission|
353
377
  rest.put_rest("#{url}/#{permission}", { permission => acls[permission] })
354
378
  end
355
379
  end
@@ -1,3 +1,3 @@
1
1
  module KnifeECBackup
2
- VERSION = '1.2.0'
2
+ VERSION = '2.0.0.beta.1'
3
3
  end
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-ec-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Keiser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-19 00:00:00.000000000 Z
11
+ date: 2014-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: knife-essentials
14
+ name: sequel
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.5.6
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.5.6
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: sequel
28
+ name: pg
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: pg
42
+ name: chef
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '11.8'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '11.8'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -113,12 +113,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
113
113
  version: '0'
114
114
  required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ">="
116
+ - - ">"
117
117
  - !ruby/object:Gem::Version
118
- version: '0'
118
+ version: 1.3.1
119
119
  requirements: []
120
120
  rubyforge_project:
121
- rubygems_version: 2.2.1
121
+ rubygems_version: 2.2.2
122
122
  signing_key:
123
123
  specification_version: 4
124
124
  summary: Backup and Restore of Enterprise Chef