#!/usr/bin/env perl use strict; use warnings; use YAML::XS; use File::Spec; use MYDan::Util::OptConf; $| ++; $MYDan::Util::OptConf::THIS = 'agent'; $MYDan::Util::OptConf::ARGC = -1; =head1 SYNOPSIS $0 cmd .. [--env "A=123;B=abc" ] [--secret "x=1;xx=2" ] =cut my $option = MYDan::Util::OptConf->load(); my %o = $option->get( qw( env=s secret=s ) )->dump(); my $code = shift; my %query = ( code => $code, argv => argv( $code ) ); map{ $query{"__$1"} = $2 if $_ =~ /^([^=]+)=(.+)$/ }split /;/, delete $o{secret} if $o{secret}; 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; } my $tmpfile = "/tmp/tmp.lcall.$$"; YAML::XS::DumpFile $tmpfile, \%query or die "dump fail: $!"; open STDIN, '<', "$tmpfile" or die "Can't open '$tmpfile': $!"; unlink $tmpfile; exec "$MYDan::PATH/dan/agent/code/$code"; sub argv { my $code = File::Spec->join( $o{argv}, shift ); return -f $code && ( $code = do $code ) && ref $code eq 'CODE' ? &$code( @ARGV ) : \@ARGV; }