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