Module: Chef::Sugar::Shell

Extended by:
Shell
Included in:
Shell
Defined in:
lib/chef/sugar/shell.rb

Instance Method Summary collapse

Instance Method Details

#dev_null(node) ⇒ String

The platform-specific output path to /dev/null.

Returns:


56
57
58
59
60
61
62
# File 'lib/chef/sugar/shell.rb', line 56

def dev_null(node)
  if defined?(ChefUtils)
    ChefUtils.windows?(node) ? 'NUL' : '/dev/null'
  else
    Chef::Sugar::PlatformFamily.windows?(node) ? 'NUL' : '/dev/null'
  end
end

#installed?(cmd) ⇒ Boolean

Boolean method to check if a command line utility is installed.

Parameters:

  • cmd (String)

    the command to find

Returns:

  • (Boolean)

    true if the command is found in the path, false otherwise


73
74
75
# File 'lib/chef/sugar/shell.rb', line 73

def installed?(cmd)
  !which(cmd).nil?
end

#installed_at_version?(cmd, expected_version, flag = '--version') ⇒ Boolean

Checks if the given binary is installed and exists at the given version. Also see #version_for.

Parameters:

  • cmd (String)

    the command to check

  • expected_version (String)

    the version to check

  • flag (String) (defaults to: '--version')

    the flag to use to check the version of the binary

Returns:

  • (Boolean)

    true if the command exists and is at the given version, false otherwise


92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/chef/sugar/shell.rb', line 92

def installed_at_version?(cmd, expected_version, flag = '--version')
  return false if !installed?(cmd)

  version = version_for(cmd, flag)
  return false if version.nil?

  if expected_version.is_a?(Regexp)
    !version.match(expected_version).nil?
  else
    version.include?(expected_version)
  end
end

#version_for(cmd, flag = '--version') ⇒ String

The version for a given command. This method does NOT check if the command exists! It is assumed the command existence has been checked with which or similar. To simply check if an installed version is acceptable, please see installed_at_version.

Assumptions:

1. The command exists.
2. The command outputs version information to +$stdout+ or +$stderr+.
   Did you know that java outputs its version to $stderr?

Parameters:

  • cmd (String)

    the command to find the version for

  • flag (String) (defaults to: '--version')

    the flag to use to get the version

Returns:

  • (String)

    the entire output of the version command (stderr and stdout)


125
126
127
128
129
130
# File 'lib/chef/sugar/shell.rb', line 125

def version_for(cmd, flag = '--version')
  cmd = Mixlib::ShellOut.new("#{cmd} #{flag}")
  cmd.run_command
  cmd.error!
  [cmd.stdout.strip, cmd.stderr.strip].join("\n")
end

#which(cmd) ⇒ String?

Finds a command in $PATH

Parameters:

  • cmd (String)

    the command to find

Returns:


35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/chef/sugar/shell.rb', line 35

def which(cmd)
  if Pathname.new(cmd).absolute?
    File.executable?(cmd) ? cmd : nil
  else
    paths = ENV['PATH'].split(::File::PATH_SEPARATOR) + %w(/bin /usr/bin /sbin /usr/sbin)

    paths.each do |path|
      possible = File.join(path, cmd)
      return possible if File.executable?(possible)
    end

    nil
  end
end