use strictures 1;
package Data::Collector::Engine::OpenSSH;
BEGIN {
  $Data::Collector::Engine::OpenSSH::VERSION = '0.12';
}
# ABSTRACT: An OpenSSH engine for Data::Collector utilizing Net::OpenSSH

use Moose;
use Net::OpenSSH;
use MooseX::StrictConstructor;
use namespace::autoclean;

extends 'Data::Collector::Engine';

has '+name'  => ( default => 'OpenSSH' );

has 'host'   => (
    is        => 'rw',
    isa       => 'Str',
    predicate => 'has_host',
    required  => 1,
);

has 'user'   => ( is => 'rw', isa => 'Str', predicate => 'has_user'   );
has 'passwd' => ( is => 'rw', isa => 'Str', predicate => 'has_passwd' );
has 'port'   => ( is => 'rw', isa => 'Int', predicate => 'has_port' );
has 'ssh'    => (
    is         => 'ro',
    isa        => 'Net::OpenSSH',
    lazy_build => 1,
);

sub _build_ssh {
    my $self = shift;

    return $self->connect();
}

sub connect {
    my $self = shift;
    my %data = ();
    foreach my $attr ( qw/ user passwd port / ) {
        my $predicate = "has_$attr";
        $self->$predicate and $data{$attr} = $self->$attr;
    }

    my $ssh = Net::OpenSSH->new( $self->host, %data );

    $ssh->error and die "OpenSSH Engine connect failed: " . $ssh->error;
    return $ssh;
}

sub run {
    my ( $self, $cmd ) = @_;

    return $self->ssh->capture($cmd);
}

sub pipe {
    my ( $self, $cmd, $params ) = @_;
    my ( $in, $out, $pid ) = $self->ssh->open2($cmd);

    print {$in} $params;
    close $in;

    my $output;
    while ( <$out> ) { $output .= $_; }
    close $out;

    return $output;
}

__PACKAGE__->meta->make_immutable;
1;



=pod

=head1 NAME

Data::Collector::Engine::OpenSSH - An OpenSSH engine for Data::Collector utilizing Net::OpenSSH

=head1 VERSION

version 0.12

=head1 SYNOPSIS

    use Data::Collector;

    my $collector = Data::Collector->new(
        engine      => 'OpenSSH', # the default
        engine_args => {
            user   => 'me',
            host   => 'soymilkyway',
            passwd => 'crow@MIDn1ght',
        },
    );

=head1 ATTRIBUTES

=head2 host(Str)

Host to connect to. B<Required>.

=head2 user(Str)

Username to connect with. Defaults to session user.

=head2 passwd(Str)

Password to be used in connection. As with the OpenSSH C<ssh> program, if a
password is ot provided, it will go over other methods (such as keys), so this
is not required.

=head2 ssh(Object)

Contains the L<Net::OpenSSH> object that is used.

=head1 SUBROUTINES/METHODS

=head2 connect

This method creates the Net::OpenSSH object and connects to the host.

=head2 run

This functions runs the given command on the host using ssh and returns the
results.

=head2 pipe

Pipes your request to the command. Gets the command to run, returns the output
of that command.

=head1 AUTHOR

  Sawyer X <xsawyerx@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2010 by Sawyer X.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut


__END__