Class: Puppet::Indirector::JSON

Inherits:
Terminus show all
Defined in:
lib/puppet/indirector/json.rb

Overview

The base class for JSON indirection terminus implementations.

This should generally be preferred to the YAML base for any future implementations, since it is faster and can load untrusted data safely.

Direct Known Subclasses

Resource::Catalog::Json

Constant Summary

Constants included from Util

Util::AbsolutePathPosix, Util::AbsolutePathWindows, Util::DEFAULT_POSIX_MODE, Util::DEFAULT_WINDOWS_MODE

Constants included from Util::POSIX

Util::POSIX::LOCALE_ENV_VARS, Util::POSIX::USER_ENV_VARS

Constants included from Util::SymbolicFileMode

Util::SymbolicFileMode::SetGIDBit, Util::SymbolicFileMode::SetUIDBit, Util::SymbolicFileMode::StickyBit, Util::SymbolicFileMode::SymbolicMode, Util::SymbolicFileMode::SymbolicSpecialToBit

Constants included from Util::Docs

Util::Docs::HEADER_LEVELS

Instance Attribute Summary

Attributes included from Util::Docs

#doc, #nodoc

Instance Method Summary collapse

Methods inherited from Terminus

abstract_terminus?, #allow_remote_requests?, const2name, #indirection, indirection_name, inherited, #initialize, mark_as_abstract_terminus, model, #model, #name, name2const, register_terminus_class, terminus_class, terminus_classes, #terminus_type, #validate, #validate_key, #validate_model

Methods included from Util::InstanceLoader

#instance_docs, #instance_hash, #instance_load, #instance_loader, #instance_loading?, #loaded_instance, #loaded_instances

Methods included from Util

absolute_path?, benchmark, chuser, clear_environment, default_env, deterministic_rand, deterministic_rand_int, exit_on_fail, get_env, get_environment, logmethods, merge_environment, path_to_uri, pretty_backtrace, replace_file, safe_posix_fork, set_env, symbolizehash, thinmark, uri_encode, uri_query_encode, uri_to_path, which, withenv, withumask

Methods included from Util::POSIX

#get_posix_field, #gid, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid

Methods included from Util::SymbolicFileMode

#normalize_symbolic_mode, #symbolic_mode_to_int, #valid_symbolic_mode?

Methods included from Util::Docs

#desc, #dochook, #doctable, #markdown_definitionlist, #markdown_header, #nodoc?, #pad, scrub

Constructor Details

This class inherits a constructor from Puppet::Indirector::Terminus

Instance Method Details

#destroy(request) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/puppet/indirector/json.rb', line 22

def destroy(request)
  Puppet::FileSystem.unlink(path(request.key))
rescue => detail
  unless detail.is_a? Errno::ENOENT
    raise Puppet::Error, _("Could not destroy %{json} %{request}: %{detail}") % { json: self.name, request: request.key, detail: detail }, detail.backtrace
  end
  1                           # emulate success...
end

#find(request) ⇒ Object



9
10
11
# File 'lib/puppet/indirector/json.rb', line 9

def find(request)
  load_json_from_file(path(request.key), request.key)
end

#path(name, ext = '.json') ⇒ Object

Return the path to a given node’s file.



38
39
40
41
42
43
44
45
46
# File 'lib/puppet/indirector/json.rb', line 38

def path(name, ext = '.json')
  if name =~ Puppet::Indirector::BadNameRegexp then
    Puppet.crit(_("directory traversal detected in %{json}: %{name}") % { json: self.class, name: name.inspect })
    raise ArgumentError, _("invalid key")
  end

  base = Puppet.run_mode.master? ? Puppet[:server_datadir] : Puppet[:client_datadir]
  File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
end

#save(request) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/puppet/indirector/json.rb', line 13

def save(request)
  filename = path(request.key)
  FileUtils.mkdir_p(File.dirname(filename))

  Puppet::Util.replace_file(filename, 0660) {|f| f.print to_json(request.instance).force_encoding(Encoding::BINARY) }
rescue TypeError => detail
  Puppet.log_exception(detail, _("Could not save %{json} %{request}: %{detail}") % { json: self.name, request: request.key, detail: detail })
end

#search(request) ⇒ Object



31
32
33
34
35
# File 'lib/puppet/indirector/json.rb', line 31

def search(request)
  Dir.glob(path(request.key)).collect do |file|
    load_json_from_file(file, request.key)
  end
end