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" => { # TODO: rename to inputs, refs #3802
      "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



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

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



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

def self.names
  LIST.keys
end