12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #! /usr/bin/python
- #
- # SPDX-License-Identifier: Apache-2.0
- # Zephyr's Twister library
- #
- # pylint: disable=unused-import
- #
- # Set of code that other projects can also import to do things on
- # Zephyr's sanity check testcases.
- import logging
- import yaml
- try:
- # Use the C LibYAML parser if available, rather than the Python parser.
- # It's much faster.
- from yaml import CLoader as Loader
- from yaml import CSafeLoader as SafeLoader
- from yaml import CDumper as Dumper
- except ImportError:
- from yaml import Loader, SafeLoader, Dumper
- log = logging.getLogger("scl")
- #
- #
- def yaml_load(filename):
- """
- Safely load a YAML document
- Follows recomendations from
- https://security.openstack.org/guidelines/dg_avoid-dangerous-input-parsing-libraries.html.
- :param str filename: filename to load
- :raises yaml.scanner: On YAML scan issues
- :raises: any other exception on file access erors
- :return: dictionary representing the YAML document
- """
- try:
- with open(filename, 'r') as f:
- return yaml.load(f, Loader=SafeLoader)
- except yaml.scanner.ScannerError as e: # For errors parsing schema.yaml
- mark = e.problem_mark
- cmark = e.context_mark
- log.error("%s:%d:%d: error: %s (note %s context @%s:%d:%d %s)",
- mark.name, mark.line, mark.column, e.problem,
- e.note, cmark.name, cmark.line, cmark.column, e.context)
- raise
- # If pykwalify is installed, then the validate functionw ill work --
- # otherwise, it is a stub and we'd warn about it.
- try:
- import pykwalify.core
- # Don't print error messages yourself, let us do it
- logging.getLogger("pykwalify.core").setLevel(50)
- def _yaml_validate(data, schema):
- if not schema:
- return
- c = pykwalify.core.Core(source_data=data, schema_data=schema)
- c.validate(raise_exception=True)
- except ImportError as e:
- log.warning("can't import pykwalify; won't validate YAML (%s)", e)
- def _yaml_validate(data, schema):
- pass
- def yaml_load_verify(filename, schema):
- """
- Safely load a testcase/sample yaml document and validate it
- against the YAML schema, returing in case of success the YAML data.
- :param str filename: name of the file to load and process
- :param dict schema: loaded YAML schema (can load with :func:`yaml_load`)
- # 'document.yaml' contains a single YAML document.
- :raises yaml.scanner.ScannerError: on YAML parsing error
- :raises pykwalify.errors.SchemaError: on Schema violation error
- """
- # 'document.yaml' contains a single YAML document.
- y = yaml_load(filename)
- _yaml_validate(y, schema)
- return y
|