# File lib/puppet/util/filetype.rb, line 131 def self.clear @@tabs.clear end
# File lib/puppet/util/filetype.rb, line 70 def self.filetype(type) @filetypes[type] end
# File lib/puppet/util/filetype.rb, line 79 def initialize(path) raise ArgumentError.new("Path is nil") if path.nil? @path = path end
Create a new filetype.
# File lib/puppet/util/filetype.rb, line 19 def self.newfiletype(name, &block) @filetypes ||= {} klass = genclass( name, :block => block, :prefix => "FileType", :hash => @filetypes ) # Rename the read and write methods, so that we're sure they # maintain the stats. klass.class_eval do # Rename the read method define_method(:real_read, instance_method(:read)) define_method(:read) do begin val = real_read @loaded = Time.now if val return val.gsub(/# HEADER.*\n/,'') else return "" end rescue Puppet::Error => detail raise rescue => detail message = "#{self.class} could not read #{@path}: #{detail}" Puppet.log_exception(detail, message) raise Puppet::Error, message end end # And then the write method define_method(:real_write, instance_method(:write)) define_method(:write) do |text| begin val = real_write(text) @synced = Time.now return val rescue Puppet::Error => detail raise rescue => detail message = "#{self.class} could not write #{@path}: #{detail}" Puppet.log_exception(detail, message) raise Puppet::Error, message end end end end
Back the file up before replacing it.
# File lib/puppet/util/filetype.rb, line 98 def backup bucket.backup(@path) if File.exists?(@path) end
Pick or create a filebucket to use.
# File lib/puppet/util/filetype.rb, line 75 def bucket @bucket ||= Puppet::Type.type(:filebucket).mkdefaultbucket.bucket end
Only add the -u flag when the @path is different. Fedora apparently does not think I should be allowed to set the @path to my own user name
# File lib/puppet/util/filetype.rb, line 203 def cmdbase cmd = nil if @uid == Puppet::Util::SUIDManager.uid || Facter.value(:operatingsystem) == "HP-UX" return "crontab" else return "crontab -u #{@path}" end end
Arguments that will be passed to the execute method. Will set the uid to the target user if the target user and the current user are not the same
# File lib/puppet/util/filetype.rb, line 87 def cronargs if uid = Puppet::Util.uid(@path) and uid == Puppet::Util::SUIDManager.uid {:failonfail => true, :combine => true} else {:failonfail => true, :combine => true, :uid => @path} end end
# File lib/puppet/util/filetype.rb, line 165 def path=(user) begin @uid = Puppet::Util.uid(user) rescue Puppet::Error => detail raise Puppet::Error, "Could not retrieve user #{user}: #{detail}", detail.backtrace end # XXX We have to have the user name, not the uid, because some # systems *cough*linux*cough* require it that way @path = user end
Read the file.
# File lib/puppet/util/filetype.rb, line 103 def read if File.exist?(@path) File.read(@path) else return nil end end
Remove the file.
# File lib/puppet/util/filetype.rb, line 112 def remove File.unlink(@path) if File.exist?(@path) end
Overwrite the file.
# File lib/puppet/util/filetype.rb, line 117 def write(text) tf = Tempfile.new("puppet") tf.print text; tf.flush FileUtils.cp(tf.path, @path) tf.close # If SELinux is present, we need to ensure the file has its expected context set_selinux_default_context(@path) end