Class: Puppet::Util::Storage

Inherits:
Object
  • Object
show all
Includes:
Puppet::Util, Singleton
Defined in:
lib/vendor/puppet/util/storage.rb

Overview

a class for storing state

Constant Summary

Constants included from Puppet::Util

AbsolutePathPosix, AbsolutePathWindows

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Puppet::Util

absolute_path?, activerecord_version, benchmark, binread, chuser, classproxy, #execfail, #execpipe, execute, execute_posix, execute_windows, logmethods, memory, path_to_uri, proxy, replace_file, safe_posix_fork, symbolize, symbolizehash, symbolizehash!, synchronize_on, thinmark, #threadlock, uri_to_path, wait_for_output, which, withumask

Methods included from POSIX

#get_posix_field, #gid, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid

Constructor Details

#initializeStorage

Returns a new instance of Storage.



15
16
17
# File 'lib/vendor/puppet/util/storage.rb', line 15

def initialize
  self.class.load
end

Class Method Details

.cache(object) ⇒ Object

Return a hash that will be stored to disk. It’s worth noting here that we use the object’s full path, not just the name/type combination. At the least, this is useful for those non-isomorphic types like exec, but it also means that if an object changes locations in the configuration it will lose its cache.



24
25
26
27
28
29
30
31
32
# File 'lib/vendor/puppet/util/storage.rb', line 24

def self.cache(object)
  if object.is_a?(Symbol)
    name = object
  else
    name = object.to_s
  end

  @@state[name] ||= {}
end

.clearObject



34
35
36
37
# File 'lib/vendor/puppet/util/storage.rb', line 34

def self.clear
  @@state.clear
  Storage.init
end

.initObject



39
40
41
42
# File 'lib/vendor/puppet/util/storage.rb', line 39

def self.init
  @@state = {}
  @@splitchar = "\t"
end

.loadObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/vendor/puppet/util/storage.rb', line 46

def self.load
  Puppet.settings.use(:main) unless FileTest.directory?(Puppet[:statedir])

  unless File.exists?(Puppet[:statefile])
    self.init unless !@@state.nil?
    return
  end
  unless File.file?(Puppet[:statefile])
    Puppet.warning("Checksumfile #{Puppet[:statefile]} is not a file, ignoring")
    return
  end
  Puppet::Util.benchmark(:debug, "Loaded state") do
    Puppet::Util::FileLocking.readlock(Puppet[:statefile]) do |file|
      begin
        @@state = YAML.load(file)
      rescue => detail
        Puppet.err "Checksumfile #{Puppet[:statefile]} is corrupt (#{detail}); replacing"
        begin
          File.rename(Puppet[:statefile], Puppet[:statefile] + ".bad")
        rescue
          raise Puppet::Error,
            "Could not rename corrupt #{Puppet[:statefile]}; remove manually"
        end
      end
    end
  end

  unless @@state.is_a?(Hash)
    Puppet.err "State got corrupted"
    self.init
  end

  #Puppet.debug "Loaded state is #{@@state.inspect}"
end

.stateObject



11
12
13
# File 'lib/vendor/puppet/util/storage.rb', line 11

def self.state
  @@state
end

.stateinspectObject



81
82
83
# File 'lib/vendor/puppet/util/storage.rb', line 81

def self.stateinspect
  @@state.inspect
end

.storeObject



85
86
87
88
89
90
91
92
93
94
95
# File 'lib/vendor/puppet/util/storage.rb', line 85

def self.store
  Puppet.debug "Storing state"

  Puppet.info "Creating state file #{Puppet[:statefile]}" unless FileTest.exist?(Puppet[:statefile])

  Puppet::Util.benchmark(:debug, "Stored state") do
    Puppet::Util::FileLocking.writelock(Puppet[:statefile], 0660) do |file|
      file.print YAML.dump(@@state)
    end
  end
end