-
Notifications
You must be signed in to change notification settings - Fork 89
LinuxCommand#verify cleaned up #530
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -56,23 +56,29 @@ def verify | |
res = @backend.run_command(run("echo")) | ||
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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For the future: |
||
|
||
rawerr | ||
raise Train::UserError.new("Sudo failed: #{msg}", reason) | ||
end | ||
|
||
# (see CommandWrapperBase::run) | ||
|
@@ -167,15 +173,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) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thank you! |
||
end | ||
end | ||
end | ||
|
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/) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. great! |
||
end | ||
end | ||
end | ||
|
||
describe "windows command" do | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I'm sold on the benefits of switching this to a
case
yet. Can you explain this?That said, I'm REALLY not sold on the
each
here... it could probably have been a hash lookup? Unless this bit answers the question about why there's regexps now... in which I case I guess I'm sold on thecase
+regexps
.Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @zenspider,
Here the only reason for switching to the
case
is if an exception would occur I would rather say:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I understand that. Assuming my interpretation is correct, then you're doing "I am the one" via
raise
, not viacase
vs{...}.each
.