X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=scpubgit%2FObject-Remote.git;a=blobdiff_plain;f=lib%2FObject%2FRemote%2FConnector%2FLocalSudo.pm;h=0ff34b3a04f0431ebc1ff655355656322a368dca;hp=aa19ced3fbcbc1dcef95ba9c093af24235cb68f1;hb=1b315002f7e87ede72405474f0efab1864769fac;hpb=9822fc762d19741060b1e731c405395938d810af diff --git a/lib/Object/Remote/Connector/LocalSudo.pm b/lib/Object/Remote/Connector/LocalSudo.pm index aa19ced..0ff34b3 100644 --- a/lib/Object/Remote/Connector/LocalSudo.pm +++ b/lib/Object/Remote/Connector/LocalSudo.pm @@ -1,20 +1,32 @@ package Object::Remote::Connector::LocalSudo; use Symbol qw(gensym); +use Module::Runtime qw(use_module); use IPC::Open3; use Moo; extends 'Object::Remote::Connector::Local'; -has password_callback => (is => 'ro'); +has target_user => (is => 'ro', required => 1); + +has password_callback => (is => 'lazy'); + +sub _build_password_callback { + my ($self) = @_; + my $pw_prompt = use_module('Object::Remote::Prompt')->can('prompt_pw'); + my $user = $self->target_user; + return sub { + $pw_prompt->("sudo password for ${user}", undef, { cache => 1 }) + } +} sub _sudo_perl_command { - my ($self, $target_user) = @_; + my ($self) = @_; return - 'sudo', '-S', '-u', $target_user, '-p', "[sudo] password please\n", + 'sudo', '-S', '-u', $self->target_user, '-p', "[sudo] password please\n", 'perl', '-MPOSIX=dup2', '-e', 'print STDERR "GO\n"; exec(@ARGV);', - $self->_perl_command($target_user); + $self->_perl_command($self->target_user); } sub _start_perl { @@ -70,7 +82,7 @@ push @Object::Remote::Connection::Guess, sub { for ($_[0]) { # username followed by @ if (defined and !ref and /^ ([^\@]*?) \@ $/x) { - return __PACKAGE__->new->connect($1); + return __PACKAGE__->new(target_user => $1)->connect; } } return;