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
search(request)
click to toggle source
# File lib/puppet/indirector/json.rb 31 def search(request) 32 Dir.glob(path(request.key)).collect do |file| 33 load_json_from_file(file, request.key) 34 end 35 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