b11d1796a18322283e587bd6cc8e3741f7145480
[packages/precise/mcollective.git] / plugins / mcollective / data / fstat_data.rb
1 module MCollective
2   module Data
3     class Fstat_data<Base
4       query do |file|
5         result[:name] = file
6         result[:output] = "not present"
7         result[:type] = "unknown"
8         result[:mode] = "0000"
9         result[:present] = 0
10         result[:size] = 0
11         result[:mtime] = 0
12         result[:ctime] = 0
13         result[:atime] = 0
14         result[:mtime_seconds] = 0
15         result[:ctime_seconds] = 0
16         result[:atime_seconds] = 0
17         result[:md5] = 0
18         result[:uid] = 0
19         result[:gid] = 0
20
21
22         if File.exists?(file)
23           result[:output] = "present"
24           result[:present] = 1
25
26           if File.symlink?(file)
27             stat = File.lstat(file)
28           else
29             stat = File.stat(file)
30           end
31
32           [:size, :uid, :gid].each do |item|
33             result[item] = stat.send(item)
34           end
35
36           [:mtime, :ctime, :atime].each do |item|
37             result[item] = stat.send(item).strftime("%F %T")
38             result["#{item}_seconds".to_sym] = stat.send(item).to_i
39             result["#{item}_age".to_sym] = Time.now.to_i - stat.send(item).to_i
40           end
41
42           result[:mode] = "%o" % [stat.mode]
43           result[:md5] = Digest::MD5.hexdigest(File.read(file)) if stat.file?
44
45           result[:type] = "directory" if stat.directory?
46           result[:type] = "file" if stat.file?
47           result[:type] = "symlink" if stat.symlink?
48           result[:type] = "socket" if stat.socket?
49           result[:type] = "chardev" if stat.chardev?
50           result[:type] = "blockdev" if stat.blockdev?
51         end
52       end
53     end
54   end
55 end
56