Class: Inspec::Schema

Inherits:
Object
  • Object
show all
Defined in:
lib/inspec/schema.rb

Constant Summary collapse

STATISTICS =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'duration' => { 'type' => 'number' },
    'controls' => {
      'type' => 'object',
      'optional' => true,
      'properties' => {
        'total' => { 'type' => 'number' },
        'passed' => {
          'type' => 'object',
          'properties' => {
            'total' => { 'type' => 'number' },
          },
        },
        'skipped' => {
          'type' => 'object',
          'properties' => {
            'total' => { 'type' => 'number' },
          },
        },
        'failed' => {
          'type' => 'object',
          'properties' => {
            'total' => { 'type' => 'number' },
          },
        },
      },
    },
  },
}.freeze
PLATFORM =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'name' => { 'type' => 'string' },
    'release' => { 'type' => 'string' },
    'target_id' => { 'type' => 'string', 'optional' => true },
  },
}.freeze
TAGS =

Tags are open right, with simple key-value associations and not restrictions

{ 'type' => 'object' }.freeze
RESULT =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'status' => { 'type' => 'string' },
    'code_desc' => { 'type' => 'string' },
    'run_time' => { 'type' => 'number' },
    'start_time' => { 'type' => 'string' },
    'skip_message' => { 'type' => 'string', 'optional' => true },
    'resource' => { 'type' => 'string', 'optional' => true },
    'message' => { 'type' => 'string', 'optional' => true },
    'exception' => { 'type' => 'string', 'optional' => true },
    'backtrace' => { 'type' => 'object', 'optional' => true },
  },
}.freeze
REF =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'ref' => { 'type' => 'string' },
    # TODO: One of these needs to be deprecated
    'uri' => { 'type' => 'string', 'optional' => true },
    'url' => { 'type' => 'string', 'optional' => true },
  },
}.freeze
REFS =
{ 'type' => 'array', 'items' => REF }.freeze
CONTROL =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'id' => { 'type' => 'string' },
    'title' => { 'type' => %w{string null} },
    'desc' => { 'type' => %w{string null} },
    'descriptions' => { 'type' => %w{array} },
    'impact' => { 'type' => 'number' },
    'refs' => REFS,
    'tags' => TAGS,
    'code' => { 'type' => 'string' },
    'source_location' => {
      'type' => 'object',
      'properties' => {
        'ref' => { 'type' => 'string' },
        'line' => { 'type' => 'number' },
      },
    },
    'results' => { 'type' => 'array', 'items' => RESULT },
  },
}.freeze
SUPPORTS =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'platform-family' => { 'type' => 'string', 'optional' => true },
    'platform-name' => { 'type' => 'string', 'optional' => true },
    'platform' => { 'type' => 'string', 'optional' => true },
    # os-* supports are being deprecated
    'os-family' => { 'type' => 'string', 'optional' => true },
    'os-name' => { 'type' => 'string', 'optional' => true },
  },
}.freeze
CONTROL_GROUP =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'id' => { 'type' => 'string' },
    'title' => { 'type' => 'string', 'optional' => true },
    'controls' => { 'type' => 'array', 'items' => { 'type' => 'string' } },
  },
}.freeze
PROFILE =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'name' => { 'type' => 'string' },
    'version' => { 'type' => 'string', 'optional' => true },
    'sha256' => { 'type' => 'string', 'optional' => false },

    'title' => { 'type' => 'string', 'optional' => true },
    'maintainer' => { 'type' => 'string', 'optional' => true },
    'copyright' => { 'type' => 'string', 'optional' => true },
    'copyright_email' => { 'type' => 'string', 'optional' => true },
    'license' => { 'type' => 'string', 'optional' => true },
    'summary' => { 'type' => 'string', 'optional' => true },
    'status' => { 'type' => 'string', 'optional' => false },
    'skip_message' => { 'type' => 'string', 'optional' => true },

    'supports' => {
      'type' => 'array',
      'items' => SUPPORTS,
      'optional' => true,
    },
    'controls' => {
      'type' => 'array',
      'items' => CONTROL,
    },
    'groups' => {
      'type' => 'array',
      'items' => CONTROL_GROUP,
    },
    'attributes' => {
      'type' => 'array',
      # TODO: more detailed specification needed
    },
  },
}.freeze
EXEC_JSON =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'platform' => PLATFORM,
    'profiles' => {
      'type' => 'array',
      'items' => PROFILE,
    },
    'statistics' => STATISTICS,
    'version' => { 'type' => 'string' },
  },
}.freeze
MIN_CONTROL =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'id' => { 'type' => 'string' },
    'profile_id' => { 'type' => %w{string null} },
    'profile_sha256' => { 'type' => 'string' },
    'status' => { 'type' => 'string' },
    'code_desc' => { 'type' => 'string' },
    'skip_message' => { 'type' => 'string', 'optional' => true },
    'resource' => { 'type' => 'string', 'optional' => true },
    'message' => { 'type' => 'string', 'optional' => true },
    'exception' => { 'type' => 'string', 'optional' => true },
    'backtrace' => { 'type' => 'object', 'optional' => true },
  },
}.freeze
EXEC_JSONMIN =
{
  'type' => 'object',
  'additionalProperties' => false,
  'properties' => {
    'statistics' => STATISTICS,
    'version' => { 'type' => 'string' },
    'controls' => {
      'type' => 'array',
      'items' => MIN_CONTROL,
    },
  },
}.freeze
PLATFORMS =

using a proc here so we can lazy load it when we need

lambda do
  require 'train'
  Train.create('mock').connection
  Train::Platforms.export
end
LIST =
{
  'exec-json' => EXEC_JSON,
  'exec-jsonmin' => EXEC_JSONMIN,
  'platforms' => PLATFORMS,
}.freeze

Class Method Summary collapse

Class Method Details

.json(name) ⇒ Object



224
225
226
227
228
229
230
231
232
233
# File 'lib/inspec/schema.rb', line 224

def self.json(name)
  if !LIST.key?(name)
    raise("Cannot find schema #{name.inspect}.")
  elsif LIST[name].is_a?(Proc)
    v = LIST[name].call
  else
    v = LIST[name]
  end
  JSON.dump(v)
end

.namesObject



220
221
222
# File 'lib/inspec/schema.rb', line 220

def self.names
  LIST.keys
end