summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/files.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/parser/files.rb')
-rw-r--r--lib/puppet/parser/files.rb94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/puppet/parser/files.rb b/lib/puppet/parser/files.rb
new file mode 100644
index 000000000..2cd163f97
--- /dev/null
+++ b/lib/puppet/parser/files.rb
@@ -0,0 +1,94 @@
+require 'puppet/module'
+require 'puppet/parser/parser'
+
+# This is a silly central module for finding
+# different kinds of files while parsing. This code
+# doesn't really belong in the Puppet::Module class,
+# but it doesn't really belong anywhere else, either.
+module Puppet::Parser::Files
+ module_function
+
+ # Return a list of manifests (as absolute filenames) that match +pat+
+ # with the current directory set to +cwd+. If the first component of
+ # +pat+ does not contain any wildcards and is an existing module, return
+ # a list of manifests in that module matching the rest of +pat+
+ # Otherwise, try to find manifests matching +pat+ relative to +cwd+
+ def find_manifests(start, options = {})
+ cwd = options[:cwd] || Dir.getwd
+ module_name, pattern = split_file_path(start)
+ if module_name and mod = Puppet::Module.find(module_name, options[:environment])
+ return mod.match_manifests(pattern)
+ else
+ abspat = File::expand_path(start, cwd)
+ files = Dir.glob(abspat).reject { |f| FileTest.directory?(f) }
+ if files.size == 0
+ files = Dir.glob(abspat + ".pp").reject { |f| FileTest.directory?(f) }
+ end
+ return files
+ end
+ end
+
+ # Find the concrete file denoted by +file+. If +file+ is absolute,
+ # return it directly. Otherwise try to find it as a template in a
+ # module. If that fails, return it relative to the +templatedir+ config
+ # param.
+ # In all cases, an absolute path is returned, which does not
+ # necessarily refer to an existing file
+ def find_template(template, environment = nil)
+ if template =~ /^#{File::SEPARATOR}/
+ return template
+ end
+
+ if template_paths = templatepath(environment)
+ # If we can find the template in :templatedir, we return that.
+ td_file = template_paths.collect { |path|
+ File::join(path, template)
+ }.each do |f|
+ return f if FileTest.exist?(f)
+ end
+ end
+
+ # check in the default template dir, if there is one
+ unless td_file = find_template_in_module(template, environment)
+ raise Puppet::Error, "No valid template directory found, please check templatedir settings" if template_paths.nil?
+ td_file = File::join(template_paths.first, template)
+ end
+ td_file
+ end
+
+ def find_template_in_module(template, environment = nil)
+ path, file = split_file_path(template)
+
+ # Because templates don't have an assumed template name, like manifests do,
+ # we treat templates with no name as being templates in the main template
+ # directory.
+ return nil unless file
+
+ if mod = Puppet::Module.find(path, environment) and t = mod.template(file)
+ return t
+ end
+ nil
+ end
+
+ # Return an array of paths by splitting the +templatedir+ config
+ # parameter.
+ def templatepath(environment = nil)
+ dirs = Puppet.settings.value(:templatedir, environment).split(":")
+ dirs.select do |p|
+ File::directory?(p)
+ end
+ end
+
+ # Split the path into the module and the rest of the path.
+ # This method can and often does return nil, so anyone calling
+ # it needs to handle that.
+ def split_file_path(path)
+ if path =~ %r/^#{File::SEPARATOR}/
+ return nil
+ end
+
+ modname, rest = path.split(File::SEPARATOR, 2)
+ return nil if modname.nil? || modname.empty?
+ return modname, rest
+ end
+end