lib/taste_tester/windows.rb (47 lines of code) (raw):
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
# Copyright 2013-present Facebook
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module TasteTester
module Windows
# We use START to spawn a subprocess of chef-zero since if you were to do
# this directly within a terminal session it will collide with the running
# chef-zero process when the user tries to input commands leading to many
# keystrokes being lost :(
def start_win_chef_zero_server
# `START` needs quotes around one of the arguments to function correctly.
# rubocop:disable Lint/PercentStringArray
cmd = %W{
START "taste-tester"
/MIN
#{TasteTester::Config.chef_zero_path}
--port #{@state.port}
}.join(' ')
# rubocop:enable Lint/PercentStringArray
if TasteTester::Config.my_hostname
cmd << " --host #{TasteTester::Config.my_hostname}"
else
cmd << " --host #{@addr}"
end
if TasteTester::Config.chef_zero_logging
cmd << " --log-file #{@log_file} --log-level debug"
end
cmd << ' --ssl' if TasteTester::Config.use_ssl
cmd << " --file-store #{@fsroot}" if TasteTester::Config.bundle
# Mixlib::Shellout will always wait for a process to finish before
# returning, so we use `spawn` instead.
spawn(cmd)
sleep(2)
end
# `START` will also create a parent process for `cmd.exe` when `ruby.exe` is
# created, so we also need to make sure that we find those and kill them
# after the ruby process is terminated. Otherwise many orphaned `cmd.exe`
# windows could be left open in the aftermath.
def find_cz_pids
require 'wmi-lite'
wmi = WmiLite::Wmi.new
cz_process_query = %{
SELECT
ProcessID,
ParentProcessID
FROM
Win32_Process
WHERE
CommandLine LIKE "%chef-zero%"
AND
Name = "ruby.exe"
}
wmi.query(cz_process_query).map do |process|
[process['processid'], process['parentprocessid']]
end
end
# It is possible to have multiple chef-zero processes running which may
# mess up taste-tester's state. So... nuke 'em all.
def nuke_all_cz_pids
find_cz_pids.each do |pid, parentpid|
::Mixlib::ShellOut.new("taskkill /F /PID #{pid}").run_command
::Mixlib::ShellOut.new("taskkill /F /PID #{parentpid}").run_command
end
end
end
end