blob: 133f22c7779f114e818846969ff312b1b0cbb1a6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
74
75
76
77
78
79
|
require 'puppet/util/cacher'
# Just define it, so this class has fewer load dependencies.
class Puppet::Node
end
# Model the environment that a node can operate in. This class just
# provides a simple wrapper for the functionality around environments.
class Puppet::Node::Environment
include Puppet::Util::Cacher
@seen = {}
# Return an existing environment instance, or create a new one.
def self.new(name = nil)
name ||= Puppet.settings.value(:environment)
raise ArgumentError, "Environment name must be specified" unless name
symbol = name.to_sym
return @seen[symbol] if @seen[symbol]
obj = self.allocate
obj.send :initialize, symbol
@seen[symbol] = obj
end
# This is only used for testing.
def self.clear
@seen.clear
end
attr_reader :name
# Return an environment-specific setting.
def [](param)
Puppet.settings.value(param, self.name)
end
def initialize(name)
@name = name
end
def module(name)
mod = Puppet::Module.new(name, self)
return nil unless mod.exist?
return mod
end
# Cache the modulepath, so that we aren't searching through
# all known directories all the time.
cached_attr(:modulepath, :ttl => Puppet[:filetimeout]) do
dirs = self[:modulepath].split(File::PATH_SEPARATOR)
if ENV["PUPPETLIB"]
dirs = ENV["PUPPETLIB"].split(File::PATH_SEPARATOR) + dirs
end
dirs.collect do |dir|
if dir !~ /^#{File::SEPARATOR}/
File.join(Dir.getwd, dir)
else
dir
end
end.find_all do |p|
p =~ /^#{File::SEPARATOR}/ && FileTest.directory?(p)
end
end
# Return all modules from this environment.
# Cache the list, because it can be expensive to create.
cached_attr(:modules, :ttl => Puppet[:filetimeout]) do
module_names = modulepath.collect { |path| Dir.entries(path) }.flatten.uniq
module_names.collect { |path| Puppet::Module.new(path, self) rescue nil }.compact
end
def to_s
name.to_s
end
end
|