--- nfo/perl/libs/Data/Rap/Engine.pm 2003/02/20 19:46:33 1.2 +++ nfo/perl/libs/Data/Rap/Engine.pm 2003/03/29 07:11:54 1.8 @@ -1,7 +1,27 @@ ## ---------------------------------------------------------------------- -## $Id: Engine.pm,v 1.2 2003/02/20 19:46:33 joko Exp $ +## $Id: Engine.pm,v 1.8 2003/03/29 07:11:54 joko Exp $ ## ---------------------------------------------------------------------- ## $Log: Engine.pm,v $ +## Revision 1.8 2003/03/29 07:11:54 joko +## modified: sub run_executable +## new: sub run_script +## +## Revision 1.7 2003/03/28 07:02:56 joko +## modified structure around '$wrapper_program' +## +## Revision 1.6 2003/03/27 15:31:05 joko +## fixes to modules regarding new namespace(s) below Data::Mungle::* +## +## Revision 1.5 2003/03/27 15:03:03 joko +## enhanced 'sub run_executable' +## +## Revision 1.4 2003/02/22 16:51:21 joko +## + enhanced run_executable +## modified logging output +## +## Revision 1.3 2003/02/21 01:46:17 joko +## renamed core function +## ## Revision 1.2 2003/02/20 19:46:33 joko ## renamed and revamped some of modules ## renamed methods @@ -24,8 +44,9 @@ use Iterate; use shortcuts qw( run_cmd ); -use Data::Code::Ref qw( ref_slot ); -use Data::Transform::Deep qw( expand ); +use Data::Mungle::Code::Ref qw( ref_slot ); +use Data::Mungle::Transform::Deep qw( expand deep_copy ); +use File::Temp qw/ tempfile tempdir /; sub performTarget { @@ -38,6 +59,17 @@ my $self = shift; my $targetname = shift; + my $header = ("- " x 12) . " " . $targetname . " " . ("- " x 6); + + # V1 + #$self->log("- " x 35, 'notice'); + #$self->log("Performing Target '$targetname'.", 'notice'); + + # V2 + #$self->log($header, 'notice'); + + # V3 + $self->log("- " x 35, 'info'); $self->log("Performing Target '$targetname'.", 'notice'); #exit; @@ -81,7 +113,8 @@ foreach my $entry (@{$target->{content}}) { my $command = $entry->{name}; my $args = $entry->{attrib}; - $self->perform_command($command, $args); + my $content = $entry->{content}; + $self->perform_command($command, $args, $content); # check recursiveness if ($entry->{content} && ref $entry->{content}) { $self->perform_details($entry); @@ -97,16 +130,17 @@ sub perform_command { my $self = shift; my $command = shift; + my $args_list = shift; + my $content = shift; if (!$command) { - $self->log("Command was empty!", 'warning'); + $self->log("Command was empty!", 'debug'); return; } # FIXME: make '__PACKAGE__' go one level deeper properly! $self->log( __PACKAGE__ . "->perform_command: " . $command, 'debug'); - my $args_list = shift; my $args = {}; #print Dumper($args_list); if ($args_list) { @@ -126,7 +160,7 @@ $container ||= $self; if ($container->can($command)) { - $container->$command($args); + $container->$command($args, $content); } else { $self->log("Command '$command' not implemented.", "warning"); } @@ -155,7 +189,7 @@ #print "DATA NEE! - MERGE!", "\n"; #print Dumper($data_new); #exit; - #hash2object($self, $data_new); + #merge_to($self, $data_new); $self->set_property( { name => $name, value => $data_new } ); } else { @@ -279,21 +313,49 @@ my $self = shift; my $opts = shift; + my $meta = deep_copy($opts); + + delete $opts->{caption}; + delete $opts->{async}; + + #print Dumper($meta); + if ($opts->{executable}) { my $program = $opts->{executable}; delete $opts->{executable}; + # determine execution method + my $wrapper_program = ''; + + # check if program is a namespace-string (contains '::') - use 'do' in this case! + if ($program =~ /::/) { + #$wrapper_program = 'rap.pl'; + $wrapper_program = $0; + } + + # prepare arguments my @buf; foreach (keys %$opts) { my $value = $opts->{$_}; + if (m/^_/) { + if ($_ eq '_switches') { + my @switches = split(/,\s|,/, $value); + foreach my $switch (@switches) { + push @buf, '--' . $switch; + } + } + next; + } + if ($value =~ /\s/) { $value = "\"$value\""; } push @buf, "--$_=$value"; } - - my $cmd = $program . ' ' . join(' ', @buf); + + # build {program} & {arguments} + my $cmd = ($wrapper_program ? $wrapper_program . ' ' : '') . $program . ' ' . join(' ', @buf); # trace #print "command: $cmd", "\n"; @@ -306,15 +368,77 @@ $ENV{PERL5LIB} = $INC[0]; #print Dumper(%ENV); - run_cmd($cmd); + + #print "command: '$cmd'", "\n"; + + # V1 - basic + #run_cmd($cmd); + + # V1.b - enhanced: variable local method + $meta->{caption} ||= ''; + $meta->{async} ||= 0; + my $evalstr = "run_cmd('$cmd', '$meta->{caption}', { async => $meta->{async} });"; + eval($evalstr); + #my $res = do "$cmd"; + #print $res, "\n" if $res; + + #$self->log("run_executable: $evalstr", 'info'); + $self->raiseException("run_executable: $evalstr\n$@") if $@; + # V2: via IPC::Run # .... (TODO) - + } } +sub run_script { + + my $self = shift; + my $args = shift; + my $code = shift; + + if ($args->{language} eq 'msdos/bat') { + + #print "code: $code", "\n"; + + # reporting + $self->log("Executing some arbitrary unsigned code (probably unsafe). [language=$args->{language}]", 'info'); + $self->log("\n\n$code\n", 'info'); + + # create temporary intermediate file to execute code + my $tmpdir = '/tmp/rap'; + mkdir $tmpdir; + (my $fh, my $filename) = tempfile( DIR => $tmpdir, SUFFIX => '.bat' ); + print $fh $code, "\n"; + run_cmd( $filename, '', { async => 1 } ); + + # FIXME: DELETE code inside temp-files as soon as possible! + #print $fh ''; + + # TODO: delete FILE completely! + # required for this: wait until execution has finished, then unlink.... + # but: "how to wait until execution is finished"? + # i believe the best is to spawn *another* process directly from here, + # let's call it 'watcher-agent'. + # This one should monitor a certain running process and delete its + # executable file after it has finished execution. + # Possible extensions could be: + # keep track of all stuff sent to STDOUT or STDERR and + # send that stuff to the task-owner indirectly (not via shell/console) + # (e.g. via email, by posting report to a newsgroup or publishing on a specified web-page: use mod-dav!) + + } elsif ($args->{language} eq 'bash') { + $self->log("FIXME: - - - - - -- - - -- BASH - - - - - - - -- - ", 'error'); + + } else { + $self->log("FIXME: Script language '$args->{language}' not implemented.", 'error'); + + } + +} + 1; __END__