#!/usr/bin/env perl use strict; use warnings; use File::Spec; use MYDan::Node; use MYDan::Util::OptConf; use MYDan::Agent::Client; use MYDan::VSSH::Print; $| ++; $MYDan::Util::OptConf::THIS = 'agent'; $MYDan::Util::OptConf::ARGC = -1; @MYDan::Util::OptConf::CONF = qw( no_ignore_case pass_through ); =head1 SYNOPSIS $0 -r range [--sudo sudoer ] [--verbose] cmd .. [--user username (default `id -un`)] [--timeout seconds (default 500)] [--max number ( default 128 )] [--port number ( default from .config )] [--env "A=123;B=abc" ] [--version] =cut my $option = MYDan::Util::OptConf->load(); my %o = $option->get( qw( range=s sudo=s timeout=i max=i verbose env=s user=s port=s version ) )->dump(); $option->assert( 'range' ); $o{verbose} = 1; my $code = shift; $o{version} = 1 if $code eq 'version'; $o{user} = `id -un` and chop $o{user} unless $o{user}; my %query = ( code => $code, argv => argv( $code ), map{ $_ => $o{$_} }qw( user sudo ) ); if( $o{env} ) { my %env; map{ my @env = split /=/, $_; $env{$env[0]} = $env[1] if 2 == @env }split /;/, $o{env}; $query{env} = \%env if %env; } $query{sudo} = delete $o{sudo} if $o{sudo}; my $range = MYDan::Node->new( $option->dump( 'range' ) ); my %result = MYDan::Agent::Client->new( $range->load( delete $o{range} )->list )->run( %o, query => \%query ); MYDan::VSSH::Print::result( 'rcal' => %result ); exit 0; sub argv { my $code = File::Spec->join( $o{argv}, shift ); return -f $code && ( $code = do $code ) && ref $code eq 'CODE' ? &$code( @ARGV ) : \@ARGV; }