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

Return the path to a given node's file.

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

Private Instance Methods

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