module PSWindows::Exec

Constants

ABS_CMD
CMD

Public Instance Methods

add_env_var(key, val) click to toggle source

Add the provided key/val to the current ssh environment @param [String] key The key to add the value to @param [String] val The value for the key @example

host.add_env_var('PATH', '/usr/bin:PATH')
# File lib/beaker/host/pswindows/exec.rb, line 116
def add_env_var key, val
  key = key.to_s.upcase
  # see if the key/value pair already exists
  cur_val = get_env_var(key, true)
  subbed_val = cur_val.gsub(/#{Regexp.escape(val.gsub(/'|"/, ''))}/, '')
  if cur_val.empty?
    exec(powershell("[Environment]::SetEnvironmentVariable('#{key}', '#{val}', 'Machine')"))
    self.close # refresh the state
  elsif subbed_val == cur_val # not present, add it
    exec(powershell("[Environment]::SetEnvironmentVariable('#{key}', '#{val};#{cur_val}', 'Machine')"))
    self.close # refresh the state
  end
end
clear_env_var(key) click to toggle source

Delete the environment variable from the current ssh environment @param [String] key The key to delete @example

host.clear_env_var('PATH')
# File lib/beaker/host/pswindows/exec.rb, line 171
def clear_env_var key
  key = key.to_s.upcase
  exec(powershell("[Environment]::SetEnvironmentVariable('#{key}', $null, 'Machine')"))
  exec(powershell("[Environment]::SetEnvironmentVariable('#{key}', $null, 'User')"))
  exec(powershell("[Environment]::SetEnvironmentVariable('#{key}', $null, 'Process')"))
  self.close # refresh the state
end
delete_env_var(key, val) click to toggle source

Delete the provided key/val from the current ssh environment @param [String] key The key to delete the value from @param [String] val The value to delete for the key @example

host.delete_env_var('PATH', '/usr/bin:PATH')
# File lib/beaker/host/pswindows/exec.rb, line 135
def delete_env_var key, val
  key = key.to_s.upcase
  # get the current value of the key
  cur_val = get_env_var(key, true)
  subbed_val = (cur_val.split(';') - [val.gsub(/'|"/, '')]).join(';')
  return unless subbed_val != cur_val

  # remove the current key value
  self.clear_env_var(key)
  # set to the truncated value
  self.add_env_var(key, subbed_val)
end
echo(msg, abs = true) click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 14
def echo(msg, abs = true)
  (abs ? ABS_CMD : CMD) + " /c echo #{msg}"
end
environment_string(env) click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 179
def environment_string env
  return '' if env.empty?

  env_array = self.environment_variable_string_pair_array(env)

  environment_string = ''
  env_array.each do |env|
    environment_string += "set \"#{env}\" && "
  end
  environment_string
end
environment_variable_string_pair_array(env) click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 191
def environment_variable_string_pair_array env
  env_array = []
  env.each_key do |key|
    val = env[key]
    val = if val.is_a?(Array)
            val.join(':')
          else
            val.to_s
          end
    # doing this for the key itself & the upcase'd version allows us to remain
    # backwards compatible
    # TODO: (Next Major Version) get rid of upcase'd version
    key_str = key.to_s
    keys = [key_str]
    keys << key_str.upcase if key_str.upcase != key_str
    keys.each do |env_key|
      env_array << "#{env_key}=#{val}"
    end
  end
  env_array
end
get_env_var(key, clean = false) click to toggle source

Return the value of a specific env var @param [String] key The key to look for @param [Boolean] clean Remove the ‘KEY=’ and only return the value of the env var @example

host.get_env_var('path')
# File lib/beaker/host/pswindows/exec.rb, line 153
def get_env_var key, clean = false
  self.close # refresh the state
  key = key.to_s.upcase
  val = exec(Beaker::Command.new("set #{key}"), :accept_all_exit_codes => true).stdout.chomp
  return '' if val.empty?

  val = val.split("\n")[0] # only take the first result
  if clean
    val.gsub(/#{key}=/i, '')
  else
    val
  end
end
get_ip() click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 63
def get_ip
  # when querying for an IP this way the return value can be formatted like:
  # IPAddress=
  # IPAddress={"129.168.0.1"}
  # IPAddress={"192.168.0.1","2001:db8:aaaa:bbbb:cccc:dddd:eeee:0001"}

  ips = execute("wmic nicconfig where ipenabled=true GET IPAddress /format:list")

  ip = ''
  ips.each_line do |line|
    matches = line.split('=')
    next if matches.length <= 1

    matches = matches[1].match(/^{"(.*?)"/)
    next if matches.nil? || matches.captures.nil? || matches.captures.empty?

    ip = matches.captures[0] if matches && matches.captures
    break if ip != ''
  end

  ip
end
mkdir_p(dir) click to toggle source

Create the provided directory structure on the host @param [String] dir The directory structure to create on the host @return [Boolean] True, if directory construction succeeded, otherwise False

# File lib/beaker/host/pswindows/exec.rb, line 104
def mkdir_p dir
  normalized_path = dir.tr('/', '\\')
  result = exec(powershell("New-Item -Path '#{normalized_path}' -ItemType 'directory'"),
                :acceptable_exit_codes => [0, 1])
  result.exit_code == 0
end
modified_at(file, timestamp = nil) click to toggle source

Update ModifiedDate on a file @param [String] file Path to the file @param [String] timestamp Timestamp to set

# File lib/beaker/host/pswindows/exec.rb, line 43
def modified_at(file, timestamp = nil)
  require 'date'
  time = timestamp ? DateTime.parse("#{timestamp}") : DateTime.now

  result = execute("powershell Test-Path #{file} -PathType Leaf")

  execute("powershell New-Item -ItemType file #{file}") if result.include? 'False'
  execute("powershell (gci #{file}).LastWriteTime = Get-Date " \
          "-Year '#{time.year}'" \
          "-Month '#{time.month}'" \
          "-Day '#{time.day}'" \
          "-Hour '#{time.hour}'" \
          "-Minute '#{time.minute}'" \
          "-Second '#{time.second}'")
end
mv(orig, dest, rm = true) click to toggle source

Move the origin to destination. The destination is removed prior to moving. @param [String] orig The origin path @param [String] dest the destination path @param [Boolean] rm Remove the destination prior to move

# File lib/beaker/host/pswindows/exec.rb, line 32
def mv(orig, dest, rm = true)
  # ensure that we have the right slashes for windows
  orig = orig.tr('/', '\\')
  dest = dest.tr('/', '\\')
  rm_rf dest unless !rm
  execute("move /y #{orig} #{dest}")
end
path() click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 59
def path
  'c:/windows/system32;c:/windows'
end
ping(target, attempts = 5) click to toggle source

Attempt to ping the provided target hostname @param [String] target The hostname to ping @param [Integer] attempts Amount of times to attempt ping before giving up @return [Boolean] true of ping successful, overwise false

# File lib/beaker/host/pswindows/exec.rb, line 90
def ping target, attempts = 5
  try = 0
  while try < attempts
    result = exec(Beaker::Command.new("ping -n 1 #{target}"), :accept_all_exit_codes => true)
    return true if result.exit_code == 0

    try += 1
  end
  result.exit_code == 0
end
reboot() click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 5
def reboot
  exec(Beaker::Command.new("shutdown /r /t 0"), :expect_connection_failure => true)
  # rebooting on windows is slooooow
  sleep(40)
end
rm_rf(path) click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 22
def rm_rf path
  # ensure that we have the right slashes for windows
  path = path.tr('/', '\\')
  execute(%(del /s /q "#{path}"))
end
ssh_permit_user_environment() click to toggle source

Overrides the {Windows::Exec#ssh_permit_user_environment} method, since no steps are needed in this setup to allow user ssh environments to work.

# File lib/beaker/host/pswindows/exec.rb, line 216
def ssh_permit_user_environment; end
ssh_set_user_environment(env) click to toggle source

Sets the user SSH environment.

@param [Hash{String=>String}] env Environment variables to set on the system,

in the form of a hash of String variable
names to their corresponding String values.

@note this class doesn’t manipulate an SSH environment file, it just sets the environment variables on the system.

@api private @return nil

# File lib/beaker/host/pswindows/exec.rb, line 229
def ssh_set_user_environment(env)
  # add the env var set to this test host
  env.each_pair do |var, value|
    add_env_var(var, value)
  end
end
touch(file, abs = true) click to toggle source
# File lib/beaker/host/pswindows/exec.rb, line 18
def touch(file, abs = true)
  (abs ? ABS_CMD : CMD) + " /c echo. 2> #{file}"
end
which(command) click to toggle source

First path it finds for the command executable @param [String] command The command executable to search for

@return [String] Path to the searched executable or empty string if not found

@example

host.which('ruby')
# File lib/beaker/host/pswindows/exec.rb, line 243
def which(command)
  where_command = "cmd /C \"where #{command}\""

  result = execute(where_command, :accept_all_exit_codes => true)
  return '' if result.empty?

  result
end