knife-tar 1.3.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.
- checksums.yaml +7 -0
- data/Gemfile +5 -0
- data/README.md +281 -0
- data/Rakefile +60 -0
- data/lib/chef/knife/client_tar_download.rb +40 -0
- data/lib/chef/knife/client_tar_upload.rb +49 -0
- data/lib/chef/knife/cookbook_tar_download.rb +49 -0
- data/lib/chef/knife/cookbook_tar_upload.rb +178 -0
- data/lib/chef/knife/data_bag_tar_download.rb +44 -0
- data/lib/chef/knife/data_bag_tar_upload.rb +53 -0
- data/lib/chef/knife/environment_tar_download.rb +44 -0
- data/lib/chef/knife/environment_tar_upload.rb +36 -0
- data/lib/chef/knife/node_tar_download.rb +40 -0
- data/lib/chef/knife/node_tar_upload.rb +37 -0
- data/lib/chef/knife/role_tar_download.rb +40 -0
- data/lib/chef/knife/role_tar_upload.rb +36 -0
- data/lib/chef/knife/tar_download_all.rb +36 -0
- data/lib/chef/knife/tar_upload_all.rb +70 -0
- data/lib/chef/knife/user_tar_download.rb +40 -0
- data/lib/chef/knife/user_tar_upload.rb +49 -0
- data/lib/chef/tar_file.rb +276 -0
- data/lib/tmp_directory.rb +25 -0
- metadata +95 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
require 'chef/data_bag'
|
5
|
+
require 'chef/data_bag_item'
|
6
|
+
|
7
|
+
class Chef
|
8
|
+
class Knife
|
9
|
+
class DataBagTarDownload < Chef::Knife
|
10
|
+
|
11
|
+
banner "knife data bag tar download tarPath [options]"
|
12
|
+
category "data bag tar"
|
13
|
+
|
14
|
+
def run
|
15
|
+
#Get Arguments
|
16
|
+
if @name_args.size != 1
|
17
|
+
ui.info("Please specify a tar path")
|
18
|
+
show_usage
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
|
22
|
+
tar_file = Chef::TarFile.new(@name_args.first, true)
|
23
|
+
DataBagTarDownload.download_data_bags tar_file
|
24
|
+
tar_file.save
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.download_data_bags(tar_file)
|
29
|
+
dir = tar_file.data_bags_path
|
30
|
+
Chef::DataBag.list.each do |bag_name, url|
|
31
|
+
system("mkdir -p #{File.join(dir, bag_name)}")
|
32
|
+
Chef::DataBag.load(bag_name).each do |item_name, itemUrl|
|
33
|
+
Chef::Log.info("Backing up data bag #{bag_name} item #{item_name}")
|
34
|
+
item = Chef::DataBagItem.load(bag_name, item_name)
|
35
|
+
File.open(File.join(dir, bag_name, "#{item_name}.json"), "w") do |dbag_file|
|
36
|
+
dbag_file.print(item.raw_data.to_json)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
class DataBagTarUpload < Chef::Knife
|
8
|
+
|
9
|
+
banner "knife data bag tar upload tarPath [options]"
|
10
|
+
category "data bag tar"
|
11
|
+
|
12
|
+
def run
|
13
|
+
#Get Arguments
|
14
|
+
if @name_args.size != 1
|
15
|
+
ui.info("Please specify a tar path")
|
16
|
+
show_usage
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
tar_file = Chef::TarFile.new(@name_args.first)
|
21
|
+
DataBagTarUpload.upload_data_bags tar_file
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.upload_data_bags(tar_file)
|
26
|
+
data_bag_from_file = Chef::Knife::DataBagFromFile.new
|
27
|
+
|
28
|
+
tar_file.data_bags.each do |databag_path|
|
29
|
+
|
30
|
+
#TODO: May want to consider moving this logic into TarFile.
|
31
|
+
|
32
|
+
databag = File.basename(File.expand_path("..", databag_path))
|
33
|
+
|
34
|
+
#In order to upload a data bag value the data bag itself must exist
|
35
|
+
#so attempt to create it now
|
36
|
+
|
37
|
+
#We make the assumption here that the parent directory of each data bag
|
38
|
+
#file is the data bag name.
|
39
|
+
|
40
|
+
databag_create = Chef::Knife::DataBagCreate.new
|
41
|
+
databag_create.name_args = [databag]
|
42
|
+
databag_create.run
|
43
|
+
|
44
|
+
#To upload a data bag we must know the data bag name and the path to the file
|
45
|
+
|
46
|
+
data_bag_from_file.name_args = [databag, databag_path]
|
47
|
+
data_bag_from_file.run
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
require 'chef/environment'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class EnvironmentTarDownload < Chef::Knife
|
9
|
+
|
10
|
+
@@DEFAULT_ENVIRONMENT = "_default"
|
11
|
+
|
12
|
+
banner "knife environment tar download tarPath [options]"
|
13
|
+
category "environment tar"
|
14
|
+
|
15
|
+
def run
|
16
|
+
#Get Arguments
|
17
|
+
if @name_args.size != 1
|
18
|
+
ui.info("Please specify a tar path")
|
19
|
+
show_usage
|
20
|
+
exit 1
|
21
|
+
end
|
22
|
+
|
23
|
+
tar_file = Chef::TarFile.new(@name_args.first, true)
|
24
|
+
EnvironmentTarDownload.download_environments tar_file
|
25
|
+
tar_file.save
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.download_environments(tar_file)
|
30
|
+
dir = tar_file.environments_path
|
31
|
+
Chef::Environment.list.each do |component_name, url|
|
32
|
+
if component_name != @@DEFAULT_ENVIRONMENT
|
33
|
+
Chef::Log.info("Backing up environment #{component_name}")
|
34
|
+
component_obj = Chef::Environment.load(component_name)
|
35
|
+
File.open(File.join(dir, "#{component_name}.json"), "w") do |component_file|
|
36
|
+
component_file.print(component_obj.to_json)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
class EnvironmentTarUpload < Chef::Knife
|
8
|
+
|
9
|
+
banner "knife environment tar upload tarPath [options]"
|
10
|
+
category "environment tar"
|
11
|
+
|
12
|
+
def run
|
13
|
+
#Get Arguments
|
14
|
+
if @name_args.size != 1
|
15
|
+
ui.info("Please specify a tar path")
|
16
|
+
show_usage
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
tar_file = Chef::TarFile.new(@name_args.first)
|
21
|
+
EnvironmentTarUpload.upload_environments tar_file
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.upload_environments(tar_file)
|
26
|
+
environment_from_file = Chef::Knife::EnvironmentFromFile.new
|
27
|
+
|
28
|
+
tar_file.environments.each do |environment_path|
|
29
|
+
environment_from_file.name_args = [environment_path]
|
30
|
+
environment_from_file.run
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
require 'chef/node'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class NodeTarDownload < Chef::Knife
|
9
|
+
|
10
|
+
banner "knife node tar download tarPath [options]"
|
11
|
+
category "node tar"
|
12
|
+
|
13
|
+
def run
|
14
|
+
#Get Arguments
|
15
|
+
if @name_args.size != 1
|
16
|
+
ui.info("Please specify a tar path")
|
17
|
+
show_usage
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
tar_file = Chef::TarFile.new(@name_args.first, true)
|
22
|
+
NodeTarDownload.download_nodes tar_file
|
23
|
+
tar_file.save
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.download_nodes(tar_file)
|
28
|
+
dir = tar_file.nodes_path
|
29
|
+
Chef::Node.list.each do |component_name, url|
|
30
|
+
Chef::Log.info("Backing up node #{component_name}")
|
31
|
+
component_obj = Chef::Node.load(component_name)
|
32
|
+
File.open(File.join(dir, "#{component_name}.json"), "w") do |component_file|
|
33
|
+
component_file.print(component_obj.to_json)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/node'
|
3
|
+
require 'chef/knife/core/object_loader'
|
4
|
+
require 'chef/json_compat'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class NodeTarUpload < Chef::Knife
|
9
|
+
|
10
|
+
banner "knife node tar upload tarPath [options]"
|
11
|
+
category "node tar"
|
12
|
+
|
13
|
+
def run
|
14
|
+
#Get Arguments
|
15
|
+
if @name_args.size != 1
|
16
|
+
ui.info("Please specify a tar path")
|
17
|
+
show_usage
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
tar_file = Chef::TarFile.new(@name_args.first)
|
22
|
+
NodeTarUpload.upload_nodes tar_file
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.upload_nodes(tar_file)
|
27
|
+
node_from_file = Chef::Knife::NodeFromFile.new
|
28
|
+
|
29
|
+
tar_file.nodes.each do |nodes_path|
|
30
|
+
node_from_file.name_args = [nodes_path]
|
31
|
+
node_from_file.run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
require 'chef/role'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class RoleTarDownload < Chef::Knife
|
9
|
+
|
10
|
+
banner "knife role tar download tarPath [options]"
|
11
|
+
category "role tar"
|
12
|
+
|
13
|
+
def run
|
14
|
+
#Get Arguments
|
15
|
+
if @name_args.size != 1
|
16
|
+
ui.info("Please specify a tar path")
|
17
|
+
show_usage
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
tar_file = Chef::TarFile.new(@name_args.first, true)
|
22
|
+
RoleTarDownload.download_roles tar_file
|
23
|
+
tar_file.save
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.download_roles(tar_file)
|
28
|
+
dir = tar_file.roles_path
|
29
|
+
Chef::Role.list.each do |component_name, url|
|
30
|
+
Chef::Log.info("Backing up role #{component_name}")
|
31
|
+
component_obj = Chef::Role.load(component_name)
|
32
|
+
File.open(File.join(dir, "#{component_name}.json"), "w") do |component_file|
|
33
|
+
component_file.print(component_obj.to_json)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
require 'chef/knife'
|
4
|
+
require 'chef/role'
|
5
|
+
require 'chef/knife/core/object_loader'
|
6
|
+
require 'chef/json_compat'
|
7
|
+
|
8
|
+
class Chef
|
9
|
+
class Knife
|
10
|
+
class RoleTarUpload < Chef::Knife
|
11
|
+
|
12
|
+
banner "knife role tar upload TARPATH [options]"
|
13
|
+
|
14
|
+
def run
|
15
|
+
#Get Arguments
|
16
|
+
if @name_args.size != 1
|
17
|
+
ui.info("Please specify a tar path")
|
18
|
+
show_usage
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
|
22
|
+
tar_file = Chef::TarFile.new(@name_args[0])
|
23
|
+
RoleTarUpload.upload_roles tar_file
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.upload_roles tar_file
|
28
|
+
role_from_file = Chef::Knife::RoleFromFile.new
|
29
|
+
role_from_file.name_args = tar_file.roles
|
30
|
+
role_from_file.config[:print_after] = true
|
31
|
+
role_from_file.run
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
class TarDownload < Chef::Knife
|
8
|
+
|
9
|
+
banner "knife tar download tarPath [options]"
|
10
|
+
category "tar"
|
11
|
+
|
12
|
+
def run
|
13
|
+
#Get Arguments
|
14
|
+
if @name_args.size != 1
|
15
|
+
ui.info("Please specify a tar path")
|
16
|
+
show_usage
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
tar_file = Chef::TarFile.new(@name_args.first, true)
|
21
|
+
|
22
|
+
ClientTarDownload.download_clients tar_file
|
23
|
+
CookbookTarDownload.download_cookbooks tar_file
|
24
|
+
DataBagTarDownload.download_data_bags tar_file
|
25
|
+
EnvironmentTarDownload.download_environments tar_file
|
26
|
+
NodeTarDownload.download_nodes tar_file
|
27
|
+
RoleTarDownload.download_roles tar_file
|
28
|
+
UserTarDownload.download_users tar_file
|
29
|
+
|
30
|
+
tar_file.save
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Knife
|
7
|
+
class TarUpload < Chef::Knife
|
8
|
+
|
9
|
+
banner "knife tar upload tarPath [options]"
|
10
|
+
category "tar"
|
11
|
+
|
12
|
+
def run
|
13
|
+
#Get Arguments
|
14
|
+
if @name_args.size != 1
|
15
|
+
ui.info("Please specify a tar path")
|
16
|
+
show_usage
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
tar_file = Chef::TarFile.new @name_args.first
|
21
|
+
|
22
|
+
# Attempt to upload all the components in the tar file
|
23
|
+
# If our tar file does not contain a component ignore the error and skip it
|
24
|
+
begin
|
25
|
+
ClientTarUpload.upload_clients tar_file
|
26
|
+
rescue TarFile::MissingChefComponentError => e
|
27
|
+
ui.info("No Client files to upload")
|
28
|
+
end
|
29
|
+
|
30
|
+
begin
|
31
|
+
CookbookTarUpload.upload_cookbooks tar_file
|
32
|
+
rescue TarFile::MissingChefComponentError => e
|
33
|
+
ui.info("No Cookbooks to upload")
|
34
|
+
end
|
35
|
+
|
36
|
+
begin
|
37
|
+
DataBagTarUpload.upload_data_bags tar_file
|
38
|
+
rescue TarFile::MissingChefComponentError => e
|
39
|
+
ui.info("No data bag files to upload")
|
40
|
+
end
|
41
|
+
|
42
|
+
begin
|
43
|
+
EnvironmentTarUpload.upload_environments tar_file
|
44
|
+
rescue TarFile::MissingChefComponentError => e
|
45
|
+
ui.info("No Environment files to upload")
|
46
|
+
end
|
47
|
+
|
48
|
+
begin
|
49
|
+
NodeTarUpload.upload_nodes tar_file
|
50
|
+
rescue TarFile::MissingChefComponentError => e
|
51
|
+
ui.info("No Node files to upload")
|
52
|
+
end
|
53
|
+
|
54
|
+
begin
|
55
|
+
RoleTarUpload.upload_roles tar_file
|
56
|
+
rescue TarFile::MissingChefComponentError => e
|
57
|
+
ui.info("No Role files to upload")
|
58
|
+
end
|
59
|
+
|
60
|
+
begin
|
61
|
+
UserTarUpload.upload_users tar_file
|
62
|
+
rescue TarFile::MissingChefComponentError => e
|
63
|
+
ui.info("No User files to upload")
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
require 'chef/webui_user'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class UserTarDownload < Chef::Knife
|
9
|
+
|
10
|
+
banner "knife user tar download tarPath [options]"
|
11
|
+
category "user tar"
|
12
|
+
|
13
|
+
def run
|
14
|
+
#Get Arguments
|
15
|
+
if @name_args.size != 1
|
16
|
+
ui.info("Please specify a tar path")
|
17
|
+
show_usage
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
tar_file = Chef::TarFile.new(@name_args.first, true)
|
22
|
+
UserTarDownload.download_users tar_file
|
23
|
+
tar_file.save
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.download_users(tar_file)
|
28
|
+
dir = tar_file.web_users_path
|
29
|
+
Chef::WebUIUser.list.each do |component_name, url|
|
30
|
+
Chef::Log.info("Backing up user #{component_name}")
|
31
|
+
component_obj = Chef::WebUIUser.load(component_name)
|
32
|
+
File.open(File.join(dir, "#{component_name}.json"), "w") do |component_file|
|
33
|
+
component_file.print(component_obj.to_json)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'chef/knife'
|
2
|
+
require 'chef/knife/core/object_loader'
|
3
|
+
require 'chef/json_compat'
|
4
|
+
require 'chef/webui_user'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class UserTarUpload < Chef::Knife
|
9
|
+
|
10
|
+
banner "knife user tar upload tarPath [options]"
|
11
|
+
category "user tar"
|
12
|
+
|
13
|
+
def run
|
14
|
+
#Get Arguments
|
15
|
+
if @name_args.size != 1
|
16
|
+
ui.info("Please specify a tar path")
|
17
|
+
show_usage
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
tar_file = Chef::TarFile.new(@name_args.first)
|
22
|
+
UserTarUpload.upload_users tar_file
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.upload_users(tar_file)
|
27
|
+
current_users = Chef::WebUIUser.list.keys
|
28
|
+
users_loader = Chef::Knife::Core::ObjectLoader.new(Chef::WebUIUser, ui)
|
29
|
+
|
30
|
+
tar_file.web_users.each do |web_user_path|
|
31
|
+
|
32
|
+
user = users_loader.load_from("users", web_user_path)
|
33
|
+
|
34
|
+
# In order to 'update' a user we have to remove it first, so if the user exists destroy it
|
35
|
+
if current_users.include? user.name
|
36
|
+
ui.info("Deleting Chef User [#{user.name}] in order to update it")
|
37
|
+
WebUIUser.load(user.name).destroy
|
38
|
+
end
|
39
|
+
|
40
|
+
user.save
|
41
|
+
ui.info("Updated User : #{user.name}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|