summaryrefslogtreecommitdiff
path: root/lib/puppet/parser/functions/validate_absolute_path.rb
diff options
context:
space:
mode:
authorJeff McCune <jeff@puppetlabs.com>2012-03-12 17:41:24 -0700
committerJeff McCune <jeff@puppetlabs.com>2012-03-12 17:41:24 -0700
commitced1f7476e562fea8241469471c715778f3b8157 (patch)
tree7b1692232877f53b7a18b029b31102c13f405fe8 /lib/puppet/parser/functions/validate_absolute_path.rb
parentc0ac470e764841b0de88dbabade342dc2c1b193e (diff)
parent5d1cec8a66fd67ebf4242c08abdf087783706057 (diff)
downloadpuppet-stdlib-ced1f7476e562fea8241469471c715778f3b8157.tar.gz
puppet-stdlib-ced1f7476e562fea8241469471c715778f3b8157.tar.bz2
Merge branch '2.3.x'
* 2.3.x: (#12357) Fix broken compatibility with Puppet 2.6 (maint) Comment Ken's fix to String#any? (#13018) Fix missing method any? message for ruby 1.9.x (#12357) Add ability to display an error message from validate_re (#12357) Add validate_absolute_path() function (maint) Stop printing the directory of spec_helper (#12357) Make facter_dot_d look in Puppet[:confdir]/facts.d (#12357) Add puppet_vardir custom fact (#12357) Fix root_home fact on Windows
Diffstat (limited to 'lib/puppet/parser/functions/validate_absolute_path.rb')
-rw-r--r--lib/puppet/parser/functions/validate_absolute_path.rb56
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/puppet/parser/functions/validate_absolute_path.rb b/lib/puppet/parser/functions/validate_absolute_path.rb
new file mode 100644
index 0000000..fe27974
--- /dev/null
+++ b/lib/puppet/parser/functions/validate_absolute_path.rb
@@ -0,0 +1,56 @@
+module Puppet::Parser::Functions
+ newfunction(:validate_absolute_path, :doc => <<-'ENDHEREDOC') do |args|
+ Validate the string represents an absolute path in the filesystem. This function works
+ for windows and unix style paths.
+
+ The following values will pass:
+
+ $my_path = "C:/Program Files (x86)/Puppet Labs/Puppet"
+ validate_absolute_path($my_path)
+ $my_path2 = "/var/lib/puppet"
+ validate_absolute_path($my_path2)
+
+
+ The following values will fail, causing compilation to abort:
+
+ validate_absolute_path(true)
+ validate_absolute_path([ 'var/lib/puppet', '/var/foo' ])
+ validate_absolute_path([ '/var/lib/puppet', 'var/foo' ])
+ $undefined = undef
+ validate_absolute_path($undefined)
+
+ ENDHEREDOC
+
+ require 'puppet/util'
+
+ unless args.length > 0 then
+ raise Puppet::ParseError, ("validate_absolute_path(): wrong number of arguments (#{args.length}; must be > 0)")
+ end
+
+ args.each do |arg|
+ # This logic was borrowed from
+ # [lib/puppet/file_serving/base.rb](https://github.com/puppetlabs/puppet/blob/master/lib/puppet/file_serving/base.rb)
+
+ # Puppet 2.7 and beyond will have Puppet::Util.absolute_path? Fall back to a back-ported implementation otherwise.
+ if Puppet::Util.respond_to?(:absolute_path?) then
+ unless Puppet::Util.absolute_path?(arg, :posix) or Puppet::Util.absolute_path?(arg, :windows)
+ raise Puppet::ParseError, ("#{arg.inspect} is not an absolute path.")
+ end
+ else
+ # This code back-ported from 2.7.x's lib/puppet/util.rb Puppet::Util.absolute_path?
+ # Determine in a platform-specific way whether a path is absolute. This
+ # defaults to the local platform if none is specified.
+ # Escape once for the string literal, and once for the regex.
+ slash = '[\\\\/]'
+ name = '[^\\\\/]+'
+ regexes = {
+ :windows => %r!^(([A-Z]:#{slash})|(#{slash}#{slash}#{name}#{slash}#{name})|(#{slash}#{slash}\?#{slash}#{name}))!i,
+ :posix => %r!^/!,
+ }
+
+ rval = (!!(arg =~ regexes[:posix])) || (!!(arg =~ regexes[:windows]))
+ rval or raise Puppet::ParseError, ("#{arg.inspect} is not an absolute path.")
+ end
+ end
+ end
+end