package ssh;

use warnings;
use strict;

use Net::OpenSSH;
use English;
use Data::Dump qw/dump/;
use client;
use CouchDB;

my $id = 3;
my $id_rsa = '/root/.ssh/id_rsa';

sub copy_id {
	my $ip = shift;
	my $ssh = client::ip_path( $ip, 'ssh' );
	return if -l $ssh;
	my $id = $id_rsa . '.pub';
	my $cmd = "sudo ssh-copy-id -i $id root\@$ip";
	warn "# $cmd\n";
	system $cmd;
	warn "$id -> $ssh";
	symlink $id, $ssh;
}

sub ethernet_bridge_to {
	my $ip = shift;

	die "you need to run this as root\n" unless $UID == 0;

	copy_id $ip;

	warn "# reset local IP address";
	system "ifconfig virtual 172.16.10.$id";

	warn "# connect to $ip";
	my $ssh = Net::OpenSSH->new( $ip,
		master_opts => [ -i => $id_rsa, -w => "$id:$id", -o => 'Tunnel=ethernet' ],
	);

	foreach my $command ( "ifconfig tap$id up", "brctl addif virtual tap$id" ) {
		warn "# $command";
		system $command;
		$ssh->system( $command ) or die "$command ", $ssh->error;
	}

	warn "press enter to close tunnel to $ip from $id";
	<STDIN>;

	system "ifconfig virtual 172.16.10.1";

}

sub shell {
	my $ip = shift;

	copy_id $ip;

	warn "# ssh $ip -i $id_rsa";
	my $ssh = Net::OpenSSH->new( $ip,
		master_opts => [ -i => $id_rsa ],
	);

	my $html;
	my @shell;

	foreach my $command ( @_ ) {
		warn "root\@$ip:# $command\n";
		my ($out,$err) = $ssh->capture2( $command ) or die "$command ", $ssh->error;
		warn "$out\n$err";

		CouchDB::audit( $ip, $command, { ip => $ip, command => $command, out => $out, err => $err } );

		$html .= qq|<tt style="color: grey">root\@$ip:# <b>$command</b></tt><pre>$out</pre>|;
		$html .= qq|<pre style="color: red">$err</pre>| if $err;
	}

	return $html;
}

1;
