knife-tidy 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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