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.



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.



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.



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?


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



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