Puppet Function: validate_cmd

Defined in:
vendor_modules/stdlib/lib/puppet/parser/functions/validate_cmd.rb
Function type:
Ruby 3.x API

Summary

Perform validation of a string with an external command.

Overview

validate_cmd()Any

The first argument of this function should be a string to test, and the second argument should be a path to a test command taking a % as a placeholder for the file path (will default to the end). If the command, launched against a tempfile containing the passed string, returns a non-null value, compilation will abort with a parse error. If a third argument is specified, this will be the error message raised and seen by the user.

A helpful error message can be returned like this:

Examples:

*Usage*


Defaults to end of path
  validate_cmd($sudoerscontent, '/usr/sbin/visudo -c -f', 'Visudo failed to validate sudoers content')

% as file location
  validate_cmd($haproxycontent, '/usr/sbin/haproxy -f % -c', 'Haproxy failed to validate config content')

Returns:

  • (Any)

    validate of a string with an external command



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
# File 'vendor_modules/stdlib/lib/puppet/parser/functions/validate_cmd.rb', line 10

newfunction(:validate_cmd, doc: <<-DOC
  @summary
    Perform validation of a string with an external command.

  The first argument of this function should be a string to
  test, and the second argument should be a path to a test command
  taking a % as a placeholder for the file path (will default to the end).
  If the command, launched against a tempfile containing the passed string,
  returns a non-null value, compilation will abort with a parse error.
  If a third argument is specified, this will be the error message raised and
  seen by the user.

  @return
    validate of a string with an external command

  A helpful error message can be returned like this:

  @example **Usage**

    Defaults to end of path
      validate_cmd($sudoerscontent, '/usr/sbin/visudo -c -f', 'Visudo failed to validate sudoers content')

    % as file location
      validate_cmd($haproxycontent, '/usr/sbin/haproxy -f % -c', 'Haproxy failed to validate config content')

  DOC
) do |args|
  if (args.length < 2) || (args.length > 3)
    raise Puppet::ParseError, "validate_cmd(): wrong number of arguments (#{args.length}; must be 2 or 3)"
  end

  msg = args[2] || "validate_cmd(): failed to validate content with command #{args[1].inspect}"

  content = args[0]
  checkscript = args[1]

  # Test content in a temporary file
  tmpfile = Tempfile.new('validate_cmd')
  begin
    tmpfile.write(content)
    tmpfile.close

    check_with_correct_location = if %r{\s%(\s|$)}.match?(checkscript)
                                    checkscript.gsub(%r{%}, tmpfile.path)
                                  else
                                    "#{checkscript} #{tmpfile.path}"
                                  end

    if Puppet::Util::Execution.respond_to?('execute')
      Puppet::Util::Execution.execute(check_with_correct_location)
    else
      Puppet::Util.execute(check_with_correct_location)
    end
  rescue Puppet::ExecutionFailure => detail
    msg += "\n#{detail}"
    raise Puppet::ParseError, msg
  rescue StandardError => detail
    msg += "\n#{detail.class.name} #{detail}"
    raise Puppet::ParseError, msg
  ensure
    tmpfile.unlink
  end
end