puppet-lint-legacy_fact-check 0.1.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/lib/puppet-lint/plugins/legacy_fact.rb +155 -0
- data/spec/puppet-lint/plugins/legacy_fact/legacy_fact_spec.rb +101 -0
- data/spec/spec_helper.rb +3 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 04b65e777123a43554e8788a1b602c1529627f95e0237ab3dd5caae6700bebe4
|
4
|
+
data.tar.gz: 41a3fd9082bf4073d3e48e1e639975b35a9e85784585e0378ec410ae7176a78e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 464b08bbff526379fd81cae724f9e2e1b512d86ab72f50dbb3bdc050cff75cb63b73d7c06b218e06d0e8e0b2cc438cb48324be6c94296f32908ce89273b0b0f8
|
7
|
+
data.tar.gz: 8350c3fd77953ad91c02c7126300c98d4560335c5e180e5e61a5a645ea531a8d0d569efa0baee717c43f241342eef8c0b1ef0381f817faf28a835c9b2b360f8e
|
@@ -0,0 +1,155 @@
|
|
1
|
+
PuppetLint.new_check(:legacy_fact) do
|
2
|
+
LEGACY_FACTS_STATIC = {
|
3
|
+
'architecture' => "facts['os']['architecture']",
|
4
|
+
'augeasversion' => "",
|
5
|
+
'blockdevices' => "",
|
6
|
+
'bios_release_date' => "",
|
7
|
+
'bios_vendor' => "",
|
8
|
+
'bios_version' => "",
|
9
|
+
'boardassettag' => "",
|
10
|
+
'boardmanufacturer' => "",
|
11
|
+
'boardproductname' => "",
|
12
|
+
'boardserialnumber' => "",
|
13
|
+
'chassisassettag' => "",
|
14
|
+
'chassistype' => "",
|
15
|
+
'dhcp_servers' => "",
|
16
|
+
'domain' => "facts['networking']['domain']",
|
17
|
+
'fqdn' => "facts['networking']['fqdn']",
|
18
|
+
'gid' => "",
|
19
|
+
'hardwareisa' => "facts['os']['hardware']",
|
20
|
+
'hardwaremodel' => "",
|
21
|
+
'hostname' => "",
|
22
|
+
'id' => "",
|
23
|
+
'interfaces' => "",
|
24
|
+
'ipaddress' => "",
|
25
|
+
'ipaddress6' => "",
|
26
|
+
'lsbdistcodename' => "",
|
27
|
+
'lsbdistdescription' => "",
|
28
|
+
'lsbdistid' => "",
|
29
|
+
'lsbdistrelease' => "",
|
30
|
+
'lsbmajdistrelease' => "",
|
31
|
+
'lsbminordistrelease' => "",
|
32
|
+
'lsbrelease' => "",
|
33
|
+
'macaddress' => "",
|
34
|
+
'macosx_buildversion' => "",
|
35
|
+
'macosx_productname' => "",
|
36
|
+
'macosx_productversion' => "",
|
37
|
+
'macosx_productversion_major' => "",
|
38
|
+
'macosx_productversion_minor' => "",
|
39
|
+
'manufacturer' => "",
|
40
|
+
'memoryfree' => "",
|
41
|
+
'memoryfree_mb' => "",
|
42
|
+
'memorysize' => "",
|
43
|
+
'memorysize_mb' => "",
|
44
|
+
'netmask' => "",
|
45
|
+
'netmask6' => "",
|
46
|
+
'network' => "",
|
47
|
+
'network6' => "",
|
48
|
+
'operatingsystem' => "facts['os']['release']",
|
49
|
+
'operatingsystemmajrelease' => "facts['os']['release']['major']",
|
50
|
+
'operatingsystemrelease' => "facts['os']['release']['full']",
|
51
|
+
'osfamily' => "facts['os']['family']",
|
52
|
+
'physicalprocessorcount' => "",
|
53
|
+
'processorcount' => "",
|
54
|
+
'productname' => "",
|
55
|
+
'rubyplatform' => "",
|
56
|
+
'rubysitedir' => "",
|
57
|
+
'rubyversion' => "",
|
58
|
+
'selinux' => "",
|
59
|
+
'selinux_config_mode' => "",
|
60
|
+
'selinux_config_policy' => "",
|
61
|
+
'selinux_current_mode' => "",
|
62
|
+
'selinux_enforced' => "",
|
63
|
+
'selinux_policyversion' => "",
|
64
|
+
'serialnumber' => "",
|
65
|
+
'swapencrypted' => "",
|
66
|
+
'swapfree' => "",
|
67
|
+
'swapfree_mb' => "",
|
68
|
+
'swapsize' => "",
|
69
|
+
'swapsize_mb' => "",
|
70
|
+
'system32' => "",
|
71
|
+
'uptime' => "",
|
72
|
+
'uptime_days' => "",
|
73
|
+
'uptime_hours' => "",
|
74
|
+
'uptime_seconds' => "",
|
75
|
+
'uuid' => "",
|
76
|
+
'xendomains' => "",
|
77
|
+
'zonename' => "",
|
78
|
+
'zones' => "",
|
79
|
+
}
|
80
|
+
|
81
|
+
LEGACY_FACTS_REGEX = {
|
82
|
+
/^blockdevice_(.+)_model$/ => "facts['disks']['%s']['model']",
|
83
|
+
/^blockdevice_(.+)_size$/ => "facts['disks']['%s']['size']",
|
84
|
+
/^blockdevice_(.+)_vendor$/ => "facts['disks']['%s']['vendor']",
|
85
|
+
/^ipaddress6_(.+)$/ => "facts['networking']['%s']['ip6']",
|
86
|
+
/^ipaddress_(.+)$/ => "facts['networking']['%s']['ip']",
|
87
|
+
/^ldom_(.+)$/ => "",
|
88
|
+
/^macaddress_(.+)$/ => "facts['networking']['%s']['mac']",
|
89
|
+
/^mtu_(.+)$/ => "facts['networking']['%s']['mtu']",
|
90
|
+
/^netmask6_(.+)$/ => "facts['networking']['%s']['netmask6']",
|
91
|
+
/^netmask_(.+)$/ => "facts['networking']['%s']['netmask']",
|
92
|
+
/^network6_(.+)$/ => "facts['networking']['%s']['network6']",
|
93
|
+
/^network_(.+)$/ => "facts['networking']['%s']['network']",
|
94
|
+
/^processor(.+)$/ => "facts['processors']['model'][%s]",
|
95
|
+
/^sp_(.+)$/ => "",
|
96
|
+
/^ssh(.+)key$/ => "facts['ssh']['%s']['key']",
|
97
|
+
/^sshfp_(.+)$/ => "", # TODO original is "facts['ssh']['%s']['sha256']" and sha1
|
98
|
+
/^zone_(.+)_brand$/ => "",
|
99
|
+
/^zone_(.+)_id$/ => "",
|
100
|
+
/^zone_(.+)_iptype$/ => "",
|
101
|
+
/^zone_(.+)_name$/ => "",
|
102
|
+
/^zone_(.+)_path$/ => "",
|
103
|
+
/^zone_(.+)_status$/ => "",
|
104
|
+
/^zone_(.+)_uuid$/ => "",
|
105
|
+
}
|
106
|
+
|
107
|
+
def check
|
108
|
+
tokens.select { |r|
|
109
|
+
Set[:VARIABLE, :UNENC_VARIABLE].include? r.type
|
110
|
+
}.each do |token|
|
111
|
+
if is_legacy_fact(normalize_fact(token.value))
|
112
|
+
notify :warning, {
|
113
|
+
:message => 'legacy fact used',
|
114
|
+
:line => token.line,
|
115
|
+
:column => token.column,
|
116
|
+
:token => token,
|
117
|
+
}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def fix(problem)
|
123
|
+
replacement = replacement_fact(normalize_fact(problem[:token].value))
|
124
|
+
raise PuppetLint::NoFix if replacement.nil? || replacement.empty?
|
125
|
+
problem[:token].value = replacement
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
def normalize_fact(fact)
|
131
|
+
fact.gsub(/^(::)?(.+)$/, '\2').gsub(/^facts\[("|')(.+)\1\]/, '\2')
|
132
|
+
end
|
133
|
+
|
134
|
+
def find_static_fact(fact)
|
135
|
+
LEGACY_FACTS_STATIC[fact]
|
136
|
+
end
|
137
|
+
|
138
|
+
def find_regex_fact(fact)
|
139
|
+
LEGACY_FACTS_REGEX.each do |pattern, replacement|
|
140
|
+
if (md = pattern.match(fact))
|
141
|
+
return replacement % md.captures
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
nil
|
146
|
+
end
|
147
|
+
|
148
|
+
def is_legacy_fact(fact)
|
149
|
+
!find_static_fact(fact).nil? || !find_regex_fact(fact).nil?
|
150
|
+
end
|
151
|
+
|
152
|
+
def replacement_fact(fact)
|
153
|
+
find_static_fact(fact) || find_regex_fact(fact)
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'legacy_fact' do
|
4
|
+
let(:msg) { 'legacy fact used' }
|
5
|
+
|
6
|
+
context 'with fix disabled' do
|
7
|
+
tests = [
|
8
|
+
['top scoped', '$operatingsystem'],
|
9
|
+
['absolute scoped', '$::operatingsystem'],
|
10
|
+
['fact variable with single quotes', "$facts['operatingsystem']"],
|
11
|
+
['fact variable with double quotes', '$facts["operatingsystem"]'],
|
12
|
+
['regex-based variable', '$ipaddress_eth0'],
|
13
|
+
#['fact function with single quotes', "fact('operatingsystem')"],
|
14
|
+
#['fact function with double quotes', 'fact("operatingsystem")'],
|
15
|
+
]
|
16
|
+
tests.each do |ctx, sample|
|
17
|
+
context "using #{ctx}: #{sample}" do
|
18
|
+
let(:code) { sample }
|
19
|
+
|
20
|
+
it 'should detect a single problem' do
|
21
|
+
expect(problems).to have(1).problem
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should create a warning' do
|
25
|
+
expect(problems).to contain_warning(msg).on_line(1).in_column(1)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'code using modern fact' do
|
31
|
+
let(:code) { "$facts['os']['name']" }
|
32
|
+
|
33
|
+
it 'should not detect any problems' do
|
34
|
+
expect(problems).to have(0).problems
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'with fix enabled' do
|
40
|
+
before do
|
41
|
+
PuppetLint.configuration.fix = true
|
42
|
+
end
|
43
|
+
|
44
|
+
after do
|
45
|
+
PuppetLint.configuration.fix = false
|
46
|
+
end
|
47
|
+
|
48
|
+
tests = [
|
49
|
+
['top scoped', '$operatingsystem', "$facts['os']['release']"],
|
50
|
+
['absolute scoped', '$::operatingsystem', "$facts['os']['release']"],
|
51
|
+
['fact variable with single quotes', "$facts['operatingsystem']", "$facts['os']['release']"],
|
52
|
+
['fact variable with double quotes', '$facts["operatingsystem"]', "$facts['os']['release']"],
|
53
|
+
['regex-based variable', '$ipaddress_eth0', "$facts['networking']['eth0']['ip']"],
|
54
|
+
]
|
55
|
+
tests.each do |ctx, sample, replacement|
|
56
|
+
context "using #{ctx}: #{sample}" do
|
57
|
+
let(:code) { sample }
|
58
|
+
|
59
|
+
it 'should detect a single problem' do
|
60
|
+
expect(problems).to have(1).problem
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should fix the problem' do
|
64
|
+
expect(problems).to contain_fixed(msg).on_line(1).in_column(1)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should add a newline to the end of the manifest' do
|
68
|
+
expect(manifest).to eq(replacement)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'code using legacy fact without replacement' do
|
74
|
+
let(:code) { "$macosx_buildversion" }
|
75
|
+
|
76
|
+
it 'should detect a single problem' do
|
77
|
+
expect(problems).to have(1).problem
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should not fix the problem' do
|
81
|
+
expect(problems).to contain_warning(msg).on_line(1).in_column(1)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should not modify the manifest' do
|
85
|
+
expect(manifest).to eq(code)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'code using modern fact' do
|
90
|
+
let(:code) { "$facts['os']['name']" }
|
91
|
+
|
92
|
+
it 'should not detect any problems' do
|
93
|
+
expect(problems).to have(0).problems
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should not modify the manifest' do
|
97
|
+
expect(manifest).to eq(code)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: puppet-lint-legacy_fact-check
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ewoud Kohl van Wijngaarden
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-08-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: puppet-lint
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-its
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-collection_matchers
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: " A puppet-lint plugin to check that manifest files don't use legacy
|
98
|
+
facts.\n"
|
99
|
+
email: ewoud+rubygems@kohlvanwijngaarden.nl
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- lib/puppet-lint/plugins/legacy_fact.rb
|
105
|
+
- spec/puppet-lint/plugins/legacy_fact/legacy_fact_spec.rb
|
106
|
+
- spec/spec_helper.rb
|
107
|
+
homepage: https://github.com/ekohl/puppet-lint-legacy_fact-check
|
108
|
+
licenses:
|
109
|
+
- MIT
|
110
|
+
metadata: {}
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options: []
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: 2.0.0
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
requirements: []
|
126
|
+
rubygems_version: 3.0.3
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: A puppet-lint plugin to check for legacy facts.
|
130
|
+
test_files:
|
131
|
+
- spec/spec_helper.rb
|
132
|
+
- spec/puppet-lint/plugins/legacy_fact/legacy_fact_spec.rb
|