module Chef::Sugar::Shell

Public Instance Methods

dev_null(node) click to toggle source

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

@return [String]

# File lib/chef/sugar/shell.rb, line 53
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) click to toggle source

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

@param [String] cmd

the command to find

@return [Boolean]

true if the command is found in the path, false otherwise
# File lib/chef/sugar/shell.rb, line 70
def installed?(cmd)
  !sugar_which(cmd).nil?
end
installed_at_version?(cmd, expected_version, flag = '--version') click to toggle source

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

@param [String] cmd

the command to check

@param [String] expected_version

the version to check

@param [String] flag

the flag to use to check the version of the binary

@return [Boolean]

true if the command exists and is at the given version, false
otherwise
# File lib/chef/sugar/shell.rb, line 89
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
sugar_which(cmd) click to toggle source

Finds a command in $PATH

@param [String] cmd

the command to find

@return [String, nil]

# File lib/chef/sugar/shell.rb, line 33
def sugar_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
version_for(cmd, flag = '--version') click to toggle source

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 sugar_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?

@param [String] cmd

the command to find the version for

@param [String] flag

the flag to use to get the version

@return [String]

the entire output of the version command (stderr and stdout)
# File lib/chef/sugar/shell.rb, line 122
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