Skip to content

Commit

Permalink
Merge pull request #530 from MsysTechnologiesllc/VSingh/MSYS-1084_cle…
Browse files Browse the repository at this point in the history
…an_up_linux_command_verify

LinuxCommand#verify cleaned up
Ryan Davis authored Jan 15, 2020

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents 17fba4b + c029473 commit d94d44d
Showing 2 changed files with 71 additions and 22 deletions.
46 changes: 24 additions & 22 deletions lib/train/extras/command_wrapper.rb
Original file line number Diff line number Diff line change
@@ -77,23 +77,29 @@ def verify
}
return nil if res.exit_status == 0

rawerr = res.stdout + " " + res.stderr

{
"Sorry, try again" => ["Wrong sudo password.", :bad_sudo_password],
"sudo: no tty present and no askpass program specified" =>
["Sudo requires a password, please configure it.", :sudo_password_required],
"sudo: command not found" =>
["Can't find sudo command. Please either install and "\
"configure it on the target or deactivate sudo.", :sudo_command_not_found],
"sudo: sorry, you must have a tty to run sudo" =>
["Sudo requires a TTY. Please see the README on how to configure "\
"sudo to allow for non-interactive usage.", :sudo_no_tty],
}.each do |sudo, human|
rawerr = human if rawerr.include? sudo
rawerr = "#{res.stdout} #{res.stderr}".strip

case rawerr
when "Sorry, try again"
["Wrong sudo password.", :bad_sudo_password]
when "sudo: no tty present and no askpass program specified"
["Sudo requires a password, please configure it.", :sudo_password_required]
when "sudo: command not found"
["Can't find sudo command. Please either install and "\
"configure it on the target or deactivate sudo.", :sudo_command_not_found]
when "sudo: sorry, you must have a tty to run sudo"
["Sudo requires a TTY. Please see the README on how to configure "\
"sudo to allow for non-interactive usage.", :sudo_no_tty]
else
[rawerr, nil]
end
end

def verify!
msg, reason = verify
return nil unless msg

rawerr
raise Train::UserError.new("Sudo failed: #{msg}", reason)
end

# (see CommandWrapperBase::run)
@@ -191,15 +197,11 @@ def self.load(transport, options)
return nil unless LinuxCommand.active?(options)

res = LinuxCommand.new(transport, options)
verification_res = res.verify
if verification_res
msg, reason = verification_res
raise Train::UserError.new("Sudo failed: #{msg}", reason)
end
res.verify!

res
elsif transport.platform.windows?
res = WindowsCommand.new(transport, options)
res
WindowsCommand.new(transport, options)
end
end
end
47 changes: 47 additions & 0 deletions test/unit/extras/command_wrapper_test.rb
Original file line number Diff line number Diff line change
@@ -106,6 +106,53 @@
_(lc.run(cmd)).must_equal "echo #{bcmd} | base64 --decode | /bin/bash --login"
end
end

describe "#verify" do
def mock_connect_result(stderr, exit_status)
OpenStruct.new(stdout: "", stderr: stderr, exit_status: exit_status)
end

it "returns nil on success" do
backend.stubs(:run_command).returns(mock_connect_result(nil, 0))
lc = cls.new(backend, { sudo: true })
_(lc.verify).must_be_nil
end

it "error message for bad sudo password" do
backend.stubs(:run_command).returns(mock_connect_result("Sorry, try again", 1))
lc = cls.new(backend, { sudo: true })
err = _ { lc.verify! }.must_raise Train::UserError
_(err.message).must_match(/Sudo failed: Wrong sudo password./)
end

it "error message for sudo password required" do
backend.stubs(:run_command).returns(mock_connect_result("sudo: no tty present and no askpass program specified", 1))
lc = cls.new(backend, { sudo: true })
err = _ { lc.verify! }.must_raise Train::UserError
_(err.message).must_match(/Sudo requires a password, please configure it./)
end

it "error message for sudo: command not found" do
backend.stubs(:run_command).returns(mock_connect_result("sudo: command not found", 1))
lc = cls.new(backend, { sudo: true })
err = _ { lc.verify! }.must_raise Train::UserError
_(err.message).must_match(/Can't find sudo command. Please either install and configure it on the target or deactivate sudo./)
end

it "error message for requires tty" do
backend.stubs(:run_command).returns(mock_connect_result("sudo: sorry, you must have a tty to run sudo", 1))
lc = cls.new(backend, { sudo: true })
err = _ { lc.verify! }.must_raise Train::UserError
_(err.message).must_match(/Sudo failed: Sudo requires a TTY. Please see the README/)
end

it "error message for other sudo related errors" do
backend.stubs(:run_command).returns(mock_connect_result("Other sudo related error", 1))
lc = cls.new(backend, { sudo: true })
err = _ { lc.verify! }.must_raise Train::UserError
_(err.message).must_match(/Other sudo related error/)
end
end
end

describe "windows command" do

0 comments on commit d94d44d

Please sign in to comment.