knife-tidy 0.1.0 → 0.1.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: 4617020ad74d1acc6de5f6c5e65c7f3506455689
4
- data.tar.gz: be95ccdc41759a9949aa6ee3aa6afe221486c995
3
+ metadata.gz: d41634bad35e623a19ebe00e33d890aa31c6e4e9
4
+ data.tar.gz: dc4576d52dc94ea7c5dce5e72d6045dc4ddbb634
5
5
  SHA512:
6
- metadata.gz: 4170963ff8992beec932a57db8715fa0edba110edee1c643c3f277d4d9b2568edb7ea846cee7033bfa397c4bcd699f5dc0a6aff1494b808c519c461c6269e810
7
- data.tar.gz: acc9b53c4944f77bc0879805142be99b7143a891a2feb320a80767f2c89879c651d606f9fd56234ddc1801c13b59c17b61a86b3fc12e65140baa36bbc67ec212
6
+ metadata.gz: 309ce63b1bd9eb385a901efdc4cc185cc04a2953bf88064a5aad88a28d7beb7109eee64956f0e7f3956eac9a549e954e2b957753d0059f3f55893d48f0feca0d
7
+ data.tar.gz: c7d6e786d7f4ece31e628d3dd3976cf0f723e4bb2db0815851fa68ecf448f5976461897fac525702761997d1f8b380d4e0a99d88eb490656e40d7198685063fe
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Change Log
2
+
3
+ ## [0.1.1](https://github.com/jeremymv2/knife-tidy/tree/0.1.1) (2017-08-11)
4
+ [Full Changelog](https://github.com/jeremymv2/knife-tidy/compare/0.1.1...0.1.1)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - bump version to 0.1.1 [\#2](https://github.com/jeremymv2/knife-tidy/pull/2) ([jeremymv2](https://github.com/jeremymv2))
9
+
10
+
11
+
12
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/README.md CHANGED
@@ -33,6 +33,10 @@ The following options are supported across all subcommands:
33
33
 
34
34
  # knife tidy server report (options)
35
35
 
36
+ Cookbooks and nodes account for the largest objects in your Chef Server.
37
+ If you want to keep it lean and mean and easy to port the object data, you must
38
+ clean any of these unused objects up!
39
+
36
40
  ## Options
37
41
 
38
42
  * `--node-threshold NUM_DAYS`
@@ -43,23 +47,53 @@ The following options are supported across all subcommands:
43
47
 
44
48
  File Name | Contents
45
49
  --- | ---
46
- <org>_<threshold_num>d_stale_nodes.json | Nodes in that org that have not checked in for the number of days specified.
47
- <org>_cookbook_count.json | Number of cookbook versions for each cookbook that that org.
48
- <org>_unused_cookbooks.json | List of cookbooks and versions that do not appear to be in-use for that org. This is determined by checking the versioned run list of each of the nodes in the org.
50
+ org_threshold_numdays_stale_nodes.json | Nodes in that org that have not checked in for the number of days specified.
51
+ org_cookbook_count.json | Number of cookbook versions for each cookbook that that org.
52
+ org_unused_cookbooks.json | List of cookbooks and versions that do not appear to be in-use for that org. This is determined by checking the versioned run list of each of the nodes in the org.
49
53
 
50
54
  # knife tidy backup clean (options)
51
55
 
52
56
  ## Options
53
57
 
54
58
  * `--repo-path /path/to/chef-repo`:
55
- The Chef Repo to report on or change (such as one created from a
56
- [knife-ec-backup](https://github.com/chef/knife-ec-backup)
59
+ The Chef Repo to tidy up (such as one created from a [knife-ec-backup](https://github.com/chef/knife-ec-backup)
60
+
61
+ * `--gsub-file path/to/gsub/file`:
62
+ The path to the file used for substitutions. If non-existant, a boiler plate one will be created.
57
63
 
58
64
  ## Notes
59
65
 
60
- * Items [Addressed](ITEMS_CLEANED.md)
61
- * [To Do](TODO_LIST.md)
66
+ Global file substitutions can be performed when `--gsub-file` option is used. Several known issues are corrected
67
+ and others can be added with search/replace pairings:
68
+
69
+ * DONE: global glob'd file gsub definitions
70
+
71
+ ```json
72
+ {
73
+ "chef-sugar":{
74
+ "organizations/*/cookbooks/chef-sugar*/metadata.rb":[
75
+ {
76
+ "pattern":"require +File.expand_path('../lib/chef/sugar/version', __FILE__)",
77
+ "replace":"# require File.expand_path('../lib/chef/sugar/version', __FILE__)"
78
+ },
79
+ {
80
+ "pattern":"version *Chef::Sugar::VERSION",
81
+ "replace":"# version !COOKBOOK_VERSION!"
82
+ }
83
+ ]
84
+ }
85
+ }
86
+ ```
87
+
88
+ * DONE: metadata validation with `Chef::CookbookLoader`
89
+ * DONE: metadata.rb and metadata.json inconsistencies correction
90
+ * DONE: metadata self-dependency correction
91
+ * DONE: user email validation
92
+ * DONE: ensure user emails do not cause primary key violation
93
+ * TODO: ambiguous actors (acl actor exists as client and user)
94
+ * TODO: users/clients referenced as actors in acls that do not exist in users/clients
95
+ * TODO: nonexistent groups referenced in acls
62
96
 
63
- # Credits
97
+ ## Summary and Credits
64
98
 
65
99
  * Server Report was ported from Nolan Davidson's [chef-cleanup](https://github.com/nsdavidson/chef-cleanup)
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env rake
2
2
 
3
- require_relative 'tasks/maintainers'
3
+ # require_relative 'tasks/maintainers'
4
4
 
5
5
  # Style tests. cookstyle (rubocop) and Foodcritic
6
6
  namespace :style do
@@ -65,5 +65,17 @@ namespace :supermarket do
65
65
  end
66
66
  end
67
67
 
68
+ # Changelog
69
+ namespace :changelog do
70
+ begin
71
+ require 'github_changelog_generator/task'
72
+
73
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
74
+ config.since_tag = '0.1.1'
75
+ config.future_release = '0.1.1'
76
+ end
77
+ end
78
+ end
79
+
68
80
  # Default
69
81
  task default: %w(style spec)
@@ -10,6 +10,7 @@ class Chef
10
10
  require 'chef/cookbook_loader'
11
11
  require 'chef/cookbook/metadata'
12
12
  require 'chef/tidy_substitutions'
13
+ require 'ffi_yajl'
13
14
  end
14
15
 
15
16
  option :backup_path,
@@ -18,7 +19,7 @@ class Chef
18
19
 
19
20
  option :gsub_file,
20
21
  :long => '--gsub-file path/to/gsub/file',
21
- :description => 'The path to the file used for substitutions'
22
+ :description => 'The path to the file used for substitutions. If non-existant, a boiler plate one will be created.'
22
23
 
23
24
  def run
24
25
  unless config[:backup_path]
@@ -26,13 +27,12 @@ class Chef
26
27
  exit 1
27
28
  end
28
29
 
29
- global_users.each do |user|
30
- validate_user(user)
31
- end
30
+ validate_user_emails!
32
31
 
33
32
  if config[:gsub_file]
34
- if config[:gen_gsub_template]
33
+ unless ::File.exist?(config[:gsub_file])
35
34
  Chef::TidySubstitutions.new(substitutions_file).boiler_plate
35
+ exit
36
36
  else
37
37
  Chef::TidySubstitutions.new(substitutions_file, backup_path_expanded).run_substitutions
38
38
  end
@@ -45,6 +45,45 @@ class Chef
45
45
  end
46
46
  end
47
47
 
48
+ def validate_user_emails!
49
+ emails_seen = []
50
+ global_users.each do |user|
51
+ email = ''
52
+ ui.info "Validating #{user}"
53
+ the_user = FFI_Yajl::Parser.parse(::File.read(::File.join(global_users_path_expanded, "#{user}.json")), symbolize_names: false)
54
+ if the_user['email'].match(/\A[^@\s]+@[^@\s]+\z/)
55
+ if emails_seen.include?(the_user['email'])
56
+ ui.info "Already saw #{user}'s email, creating a unique one."
57
+ email = unique_email
58
+ new_user = the_user.dup
59
+ new_user['email'] = email
60
+ save_user(new_user)
61
+ emails_seen.push(email)
62
+ else
63
+ emails_seen.push(the_user['email'])
64
+ end
65
+ else
66
+ ui.info "User #{user} does not have a valid email, creating a unique one."
67
+ email = unique_email
68
+ new_user = the_user.dup
69
+ new_user['email'] = email
70
+ save_user(new_user)
71
+ emails_seen.push(email)
72
+ end
73
+ end
74
+ end
75
+
76
+ def unique_email
77
+ (0...8).map { (65 + rand(26)).chr }.join.downcase +
78
+ '@' + (0...8).map { (65 + rand(26)).chr }.join.downcase + '.com'
79
+ end
80
+
81
+ def save_user(user)
82
+ ::File.open(::File.join(global_users_path_expanded, "#{user['username']}.json"), 'w+') do |f|
83
+ f.write(FFI_Yajl::Encoder.encode(user, pretty: true))
84
+ end
85
+ end
86
+
48
87
  def load_cookbooks(org)
49
88
  cl = Chef::CookbookLoader.new(cookbooks_path_expanded(org))
50
89
  for_each_cookbook_basename(org) do |cookbook|
@@ -87,7 +126,7 @@ class Chef
87
126
  ui.warn "No metadata.rb in #{path} - skipping"
88
127
  return
89
128
  end
90
- ui.info " Generating new metadata.json for #{path}"
129
+ ui.info "Generating new metadata.json for #{path}"
91
130
  md = Chef::Cookbook::Metadata.new
92
131
  md.name(cookbook)
93
132
  md.from_file(md_path)
@@ -60,6 +60,10 @@ class Chef
60
60
  ::File.expand_path(::File.join(backup_path_expanded, 'organizations', org, 'cookbooks'))
61
61
  end
62
62
 
63
+ def global_users_path_expanded
64
+ ::File.expand_path(::File.join(backup_path_expanded, 'users'))
65
+ end
66
+
63
67
  def substitutions_file
64
68
  ::File.expand_path(config[:gsub_file])
65
69
  end
@@ -1,4 +1,4 @@
1
1
  module KnifeTidy
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  MAJOR, MINOR, TINY = VERSION.split('.')
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-tidy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Miller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-11 00:00:00.000000000 Z
11
+ date: 2017-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -103,6 +103,7 @@ extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
105
  - ".gitignore"
106
+ - CHANGELOG.md
106
107
  - Gemfile
107
108
  - LICENSE
108
109
  - README.md