forked from opiproject/smbios-validation-tool
-
Notifications
You must be signed in to change notification settings - Fork 0
/
smbios_validation
97 lines (81 loc) · 3.21 KB
/
smbios_validation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/env python3
#
# Lint as: python3
# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Main function to run SMBIOS validation."""
from absl import app
from absl import flags
from dmiparse import DmiParser
from smbios_validation_tool import rules
from smbios_validation_tool.error_bucket import ErrorBucket
from smbios_validation_tool.validator import GroupValidator
import termcolor
FLAGS = flags.FLAGS
flags.DEFINE_string('file', '', 'dmidecode dump file path')
def print_source_code_header():
"""Print header when running the binary."""
print('*********************************************************************')
print('SMBIOS LESS Compliance Validation Tool\n')
print('Copyright 2019 Google LLC')
print('Licensed under the Apache License, Version 2.0 (the "License")')
print('you may not use this file except in compliance with the License.')
print('You may obtain a copy of the License at\n')
print('https://www.apache.org/licenses/LICENSE-2.0\n')
print('Unless required by applicable law or agreed to in writing, software')
print('distributed under the License is distributed on an "AS IS" BASIS,')
print(
'WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.'
)
print('See the License for the specific language governing permissions and')
print('limitations under the License.')
print(
'*********************************************************************\n')
def main(argv):
if len(argv) > 1:
raise app.UsageError('Too many command-line arguments.')
print_source_code_header()
records, groups = DmiParser(FLAGS.file).parse()
is_less_compliant = True
# Validate rules for individual SMBIOS record
error_bucket = ErrorBucket()
for record in records.values():
for rule in rules.rules:
# Not a matched record, no need to validate it
if not rule.matchers.is_matched_record(record):
continue
# Validation passed, no error message to print
if rule.validators.validate_rule(record, records):
continue
is_less_compliant = False
error_bucket.add_error(record.handle_id, (rule.err_msg, rule.action_msg))
# Validate groups of SMBIOS records
if not GroupValidator(records, groups).validate():
is_less_compliant = False
# Print error messages
error_bucket.print_buckets()
if is_less_compliant:
print(
termcolor.colored(
'**The SMBIOS implementation in this host is LESS compliant.**\n',
color='green',
attrs=['bold']))
else:
print(
termcolor.colored(
'**The SMBIOS implementation in this host lacks LESS compliance.**\n',
color='red',
attrs=['bold']))
if __name__ == '__main__':
app.run(main)