module Windows::Exec

Constants

ABS_CMD
CMD

Public Instance Methods

append_commands(_command = '', user_ac = '', _opts = {}) click to toggle source

Gets the specific append commands as needed for this host

@param [String] command Command to be executed @param [String] user_ac List of user-specified commands to append @param [Hash] opts optional parameters

@return [String] Command string as needed for this host

# File lib/beaker/host/windows/exec.rb, line 111
def append_commands(_command = '', user_ac = '', _opts = {})
  user_ac
end
cygwin_installed?() click to toggle source

Determine if cygwin is actually installed on the SUT. Differs from is_cygwin?, which is just a type check for a Windows::Host.

@return [Boolean]

# File lib/beaker/host/windows/exec.rb, line 151
def cygwin_installed?
  output = exec(Beaker::Command.new('cygcheck --check-setup cygwin'), :accept_all_exit_codes => true).stdout
  return true if output.include?('cygwin') && output.include?('OK')

  false
end
echo(msg, abs = true) click to toggle source
# File lib/beaker/host/windows/exec.rb, line 14
def echo(msg, abs = true)
  (abs ? ABS_CMD : CMD) + " /c echo #{msg}"
end
get_ip() click to toggle source
# File lib/beaker/host/windows/exec.rb, line 26
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,Pathname] dir The directory structure to create on the host @return [Boolean] True, if directory construction succeeded, otherwise False

# File lib/beaker/host/windows/exec.rb, line 126
def mkdir_p(dir)
  # single or double quotes will disable ~ expansion, so only quote if we have to
  str = dir.to_s
  cmd = if str.start_with?('~') && !str.include?(' ')
          "mkdir -p #{str}"
        else
          "mkdir -p \"#{str}\""
        end
  result = exec(Beaker::Command.new(cmd), :acceptable_exit_codes => [0, 1])
  result.exit_code == 0
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/windows/exec.rb, line 142
def mv orig, dest, rm = true
  rm_rf dest unless !rm
  execute("mv \"#{orig}\" \"#{dest}\"")
end
path() click to toggle source
# File lib/beaker/host/windows/exec.rb, line 22
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/windows/exec.rb, line 53
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
prepend_commands(_command = '', user_pc = nil, opts = {}) click to toggle source

Gets the specific prepend commands as needed for this host

@param [String] command Command to be executed @param [String] user_pc List of user-specified commands to prepend @param [Hash] opts optional parameters @option opts [Boolean] :cmd_exe whether cmd.exe should be used

@return [String] Command string as needed for this host

# File lib/beaker/host/windows/exec.rb, line 98
def prepend_commands(_command = '', user_pc = nil, opts = {})
  cygwin_prefix = (self.is_cygwin? and opts[:cmd_exe]) ? 'cmd.exe /c' : ''
  spacing = user_pc && !cygwin_prefix.empty? ? ' ' : ''
  "#{cygwin_prefix}#{spacing}#{user_pc}"
end
reboot() click to toggle source
# File lib/beaker/host/windows/exec.rb, line 4
def reboot
  exec(Beaker::Command.new('shutdown /f /r /t 0 /d p:4:1 /c "Beaker::Host reboot command issued"'), :reset_connection => true)
  # rebooting on windows is sloooooow
  # give it some breathing room before attempting a reconnect
  sleep(40)
end
selinux_enabled?() click to toggle source

 Checks if selinux is enabled selinux is not available on Windows

@return [Boolean] false

# File lib/beaker/host/windows/exec.rb, line 119
def selinux_enabled?
  false
end
ssh_permit_user_environment() click to toggle source

Sets the PermitUserEnvironment setting & restarts the SSH service

@api private @return [Result] result of the command starting the SSH service

(from {#ssh_service_restart}).
# File lib/beaker/host/windows/exec.rb, line 85
def ssh_permit_user_environment
  exec(Beaker::Command.new("echo '\nPermitUserEnvironment yes' >> /etc/sshd_config"))
  ssh_service_restart
end
ssh_service_restart() click to toggle source

Restarts the SSH service.

@return [Result] result of starting SSH service

# File lib/beaker/host/windows/exec.rb, line 67
def ssh_service_restart
  command_result = nil
  # we get periodic failures to restart the service, so looping these with re-attempts
  repeat_fibonacci_style_for(5) do
    0 == exec(Beaker::Command.new("cygrunsrv -E sshd"), :acceptable_exit_codes => [0, 1]).exit_code
  end
  repeat_fibonacci_style_for(5) do
    command_result = exec(Beaker::Command.new("cygrunsrv -S sshd"), :acceptable_exit_codes => [0, 1])
    0 == command_result.exit_code
  end
  command_result
end
touch(file, abs = true) click to toggle source
# File lib/beaker/host/windows/exec.rb, line 18
def touch(file, abs = true)
  (abs ? ABS_CMD : CMD) + " /c echo. 2> #{file}"
end