Class: Puppet::Util::Storage Private

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

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

a class for storing state

Constant Summary

Constants included from Puppet::Util

ALNUM, ALPHA, AbsolutePathPosix, AbsolutePathWindows, DEFAULT_POSIX_MODE, DEFAULT_WINDOWS_MODE, ESCAPED, HEX, HttpProxy, PUPPET_STACK_INSERTION_FRAME, RESERVED, RFC_3986_URI_REGEX, UNRESERVED, UNSAFE

Constants included from POSIX

POSIX::LOCALE_ENV_VARS, POSIX::USER_ENV_VARS

Constants included from SymbolicFileMode

Puppet::Util::SymbolicFileMode::SetGIDBit, Puppet::Util::SymbolicFileMode::SetUIDBit, Puppet::Util::SymbolicFileMode::StickyBit, Puppet::Util::SymbolicFileMode::SymbolicMode, Puppet::Util::SymbolicFileMode::SymbolicSpecialToBit

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Puppet::Util

absolute_path?, benchmark, chuser, clear_environment, default_env, deterministic_rand, deterministic_rand_int, exit_on_fail, format_backtrace_array, format_puppetstack_frame, get_env, get_environment, logmethods, merge_environment, path_to_uri, pretty_backtrace, replace_file, resolve_stackframe, rfc2396_escape, safe_posix_fork, set_env, skip_external_facts, symbolizehash, thinmark, uri_encode, uri_query_encode, uri_to_path, uri_unescape, which, withenv, withumask

Methods included from POSIX

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

Methods included from SymbolicFileMode

#display_mode, #normalize_symbolic_mode, #symbolic_mode_to_int, #valid_symbolic_mode?

Constructor Details

#initializeStorage

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Storage.


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

def initialize
  self.class.load
end

Class Method Details

.cache(object) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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.


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

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

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

.clearObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


33
34
35
# File 'lib/puppet/util/storage.rb', line 33

def self.clear
  @@state.clear
end

.initObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


37
38
39
# File 'lib/puppet/util/storage.rb', line 37

def self.init
  @@state = {}
end

.loadObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


43
44
45
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
# File 'lib/puppet/util/storage.rb', line 43

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

  unless Puppet::FileSystem.exist?(filename)
    self.init if @@state.nil?
    return
  end
  unless File.file?(filename)
    Puppet.warning(_("Checksumfile %{filename} is not a file, ignoring") % { filename: filename })
    return
  end
  Puppet::Util.benchmark(:debug, "Loaded state in %{seconds} seconds") do
    begin
      @@state = Puppet::Util::Yaml.safe_load_file(filename, [Symbol, Time])
    rescue Puppet::Util::Yaml::YamlLoadError => detail
      Puppet.err _("Checksumfile %{filename} is corrupt (%{detail}); replacing") % { filename: filename, detail: detail }

      begin
        File.rename(filename, filename + ".bad")
      rescue
        raise Puppet::Error, _("Could not rename corrupt %{filename}; remove manually") % { filename: filename }, detail.backtrace
      end
    end
  end

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

.stateObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


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

def self.state
  @@state
end

.stateinspectObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


75
76
77
# File 'lib/puppet/util/storage.rb', line 75

def self.stateinspect
  @@state.inspect
end

.storeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/puppet/util/storage.rb', line 79

def self.store
  Puppet.debug "Storing state"

  Puppet.info _("Creating state file %{file}") % { file: Puppet[:statefile] } unless Puppet::FileSystem.exist?(Puppet[:statefile])

  if Puppet[:statettl] == 0 || Puppet[:statettl] == Float::INFINITY
    Puppet.debug "Not pruning old state cache entries"
  else
    Puppet::Util.benchmark(:debug, "Pruned old state cache entries in %{seconds} seconds") do
      ttl_cutoff = Time.now - Puppet[:statettl]

      @@state.reject! do |k,v|
        @@state[k][:checked] && @@state[k][:checked] < ttl_cutoff
      end
    end
  end

  Puppet::Util.benchmark(:debug, "Stored state in %{seconds} seconds") do
    Puppet::Util::Yaml.dump(@@state, Puppet[:statefile])
  end
end