/usr/local/CPAN/Annelidous-snapshot/Annelidous/Transport/SSH.pm


#!/usr/bin/perl
#
# Annelidous - the flexibile cloud management framework
# Copyright (C) 2009  Eric Windisch <eric@grokthis.net>
# 
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

#
# STUB: This file is only stub!
#
package Annelidous::Transport::SSH;
use base 'Annelidous::Transport';
use Data::Dumper;

sub new {
    my $invocant = shift;
    my $class   = ref($invocant) || $invocant;

	my $self={
	    use_openssh=>1,
	    username=>'root',
		-host=>'',
	    @_
	};
	bless $self, $class;
	
	if ($self->{use_openssh}==0) {
	    eval {
	       require Net::SSH::Perl;
	    };
	    if ($@) {
	        # Sometimes you can't get what you want,
	        # but you might just get what you need.
	        # (We don't want OpenSSH, but we don't have Net::SSH:Perl,
	        # so we're gonna use OpenSSH anyway!)
	        $self->{use_openssh}=1;
	    } else {
	       # We don't want to use openssh and
	       # Net::SSH::Perl is actually available,
	       # so the user is going to get what they want.
	       $self->login();
	    }
	}
	
	return $self;
}

sub login {
    my $self=shift;    
    $self->{_session} = Net::SSH::Perl->new($self->get_host);
    $self->{_session}->login($self->{username});
}

sub _session {
    my $self=shift;
    # We want to make sure that we're connected.
    # for this reason, subroutines connecting to the SSH session
    # should always use this method and not directly accessing the hash-key
    # of {_session}.
    eval {
        my $sock=$self->{_session}->sock;
    };
    if ($@) {
        $self->login();
    }
    return $self->{_session};
}

# Execs on server
sub exec {
    my $self=shift;
    my @exec=@_;
	my $hostname=$self->get_host();
    
    if ($self->{use_openssh}) {
		my $result;
        open(SSHCONN,'-|','/usr/bin/ssh','-i','/etc/ssh/id_rsa_vps',"-l",$self->{username},$hostname,@exec);
		while(<SSHCONN>) {
			$result.=$_;
		}
		close SSHCONN;
		return [$?, $result];
    } else {
        $self->_session->cmd(join (" ",@exec));
    }
}

# allocates a tty for the command
sub tty {
    my $self=shift;
    my @exec=@_;
	my $hostname=$self->get_host();

	# Must do openssh for now... 
    #if ($self->{use_openssh}) {
	system("ssh",'-t','-i','/etc/ssh/id_rsa_vps',"-l",$self->{username},$hostname,@exec);
	#print Dumper $ENV;
	#system("ssh",'-t',"-l",$self->{username},$hostname,@exec);
    #} else {
    #    $self->_session->cmd(join (" ",@exec));
    #}
}

1;