class Puppet::Indirector::JSON

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.

Public Instance Methods

destroy(request) click to toggle source
   # File lib/puppet/indirector/json.rb
22 def destroy(request)
23   Puppet::FileSystem.unlink(path(request.key))
24 rescue => detail
25   unless detail.is_a? Errno::ENOENT
26     raise Puppet::Error, _("Could not destroy %{json} %{request}: %{detail}") % { json: self.name, request: request.key, detail: detail }, detail.backtrace
27   end
28   1                           # emulate success...
29 end
find(request) click to toggle source
   # File lib/puppet/indirector/json.rb
 9 def find(request)
10   load_json_from_file(path(request.key), request.key)
11 end
path(name, ext = '.json') click to toggle source

Return the path to a given node's file.

   # File lib/puppet/indirector/json.rb
38 def path(name, ext = '.json')
39   if name =~ Puppet::Indirector::BadNameRegexp then
40     Puppet.crit(_("directory traversal detected in %{json}: %{name}") % { json: self.class, name: name.inspect })
41     raise ArgumentError, _("invalid key")
42   end
43 
44   base = data_dir
45   File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
46 end
save(request) click to toggle source
   # File lib/puppet/indirector/json.rb
13 def save(request)
14   filename = path(request.key)
15   FileUtils.mkdir_p(File.dirname(filename))
16 
17   Puppet::FileSystem.replace_file(filename, 0660) {|f| f.print to_json(request.instance).force_encoding(Encoding::BINARY) }
18 rescue TypeError => detail
19   Puppet.log_exception(detail, _("Could not save %{json} %{request}: %{detail}") % { json: self.name, request: request.key, detail: detail })
20 end

Private Instance Methods

data_dir() click to toggle source
   # File lib/puppet/indirector/json.rb
50 def data_dir()
51   Puppet.run_mode.server? ? Puppet[:server_datadir] : Puppet[:client_datadir]
52 end
from_json(text) click to toggle source
   # File lib/puppet/indirector/json.rb
72 def from_json(text)
73   model.convert_from('json', text.force_encoding(Encoding::UTF_8))
74 end
load_json_from_file(file, key) click to toggle source
   # File lib/puppet/indirector/json.rb
54 def load_json_from_file(file, key)
55   json = nil
56 
57   begin
58     json = Puppet::FileSystem.read(file, :encoding => Encoding::BINARY)
59   rescue Errno::ENOENT
60     return nil
61   rescue => detail
62     raise Puppet::Error, _("Could not read JSON data for %{name} %{key}: %{detail}") % { name: indirection.name, key: key, detail: detail }, detail.backtrace
63   end
64 
65   begin
66     return from_json(json)
67   rescue => detail
68     raise Puppet::Error, _("Could not parse JSON data for %{name} %{key}: %{detail}") % { name: indirection.name, key: key, detail: detail }, detail.backtrace
69   end
70 end
to_json(object) click to toggle source
   # File lib/puppet/indirector/json.rb
76 def to_json(object)
77   object.render('json')
78 end