#!# perl: deploy/code/m.deploy
use strict;
use File::Spec;
use Sys::Hostname;
use MYDan::Agent::Client;
use MYDan::Node;
use YAML::XS;

my %agent;
BEGIN{
    %agent = MYDan::Util::OptConf->load()->dump('agent');
};

my %run = ( timeout => 300, max => 128, sudo => 'root' );

return sub
{
    my %param = @_;

    my ( $batch, $param ) = @param{qw( batch param )};
    
    my $range = MYDan::Node->new();

    my $code = do File::Spec->join( $agent{argv}, 'deploy' );
    die "deploy not CODE" unless $code && ref $code eq 'CODE';

    print "=" x 30,"\n";
    my %succ;
    my %query = ( 
        code => 'deploy',
        user => $param->{user}||'root', 
        argv => &$code( $param->{name}, @{$param->{ctrl}})
    );

    my $client = MYDan::Agent::Client->new( @$batch );

    my ( %result, %re, %mesg ) = $client->run(  
        query => \%query, %agent, map{ $_ => $param->{$_} ||$run{$_} }qw( timeout sudo max ) );

    while( my( $node, $mesg ) = each %result )
    {
        $succ{$node} = 1 if $mesg && $mesg =~ /--- 0\n$/;
        push @{$re{$mesg}}, $node;
    }
    while( my( $mesg, $node ) = each %re )
    {
        $mesg =~ s/--- \d+\n$//;
        $node = $range->load( $node );
        $node = sprintf "%s[%d]", $node->dump(), scalar $node->list;
        $mesg{$node} = $mesg;
    }
    YAML::XS::DumpFile \*STDOUT, \%mesg if %mesg;

    print "=" x 30,"\n";
    return %succ;
};