package main;

use strict;
use warnings FATAL => "all";
use vars qw($spooler $spooler_log $spooler_job $spooler_task);

use Config;


sub spooler_process() {

  my $rc = 0;
     $rc = 1 if $spooler_job->order_queue;
  
  eval {
    my $commandline = "";
    my $parameters  = "";
    my $subprocess  = $spooler_task->create_subprocess();
   
    if ($spooler_task->params->value("shell_command") && length($spooler_task->params->value("shell_command")) > 0) {
        $commandline = $spooler_task->params->value("shell_command");
    } else {
        $spooler_log->warn( "no value for shell command was given for parameter [shell_command]" );
        return 0;
    }

#   these are samples for shell commands:
#   if ($Config{osname} eq 'MSWin32')  { 
#      #  Windows: the command to be executed, modify this to an executable script for your platform
#      $commandline = "cmd.exe /V:ON /C " . $spooler->directory . "samples/shell.webservice.command/webservice_shell.cmd";
#   } else {
#      #  Unix: the command to be executed, modify this to an executable script for your platform
#      $commandline = $spooler->directory . "samples/shell.webservice.command/webservice_shell.sh";
#   }

    #  retrieve parameters from order payload or from task parameters
    if ($rc) {
      $parameters = $spooler_task->order->payload;
    } else {
      $parameters = $spooler_task->params;
    }

    if ($parameters) {
      my @parameter_names = split( /;/, $parameters->names() );
      for(my $i=0; $i<@parameter_names; $i++) {
      if ( lc($parameter_names[$i]) eq "shell_command" ) { next; }
        # .. either append parameter names and values to the comamnd line (this needs more checking for vulnerabilities)
        #  $spooler_log->debug3( "parameter " . $parameter_names[$i] . "=" . $parameters->value($parameter_names[$i]) );
        #  commandline .= " " . $parameter_names[$i] . "=\"" . $parameters->value($parameter_names[$i]) . "\"";

        # .. or copy parameters to environment variables which is more safe
        $subprocess->LetProperty( 'environment', $parameter_names[$i], $parameters->value($parameter_names[$i]) );
        # .. and for this sample append parameter names to the command line
        $commandline .= " \"" . $parameter_names[$i] . "\"";
      }
    }

    $spooler_log->info( "... executing command line: " . $commandline );
    $subprocess->start( $commandline );

    $subprocess->wait_for_termination();
    if ( $subprocess->terminated ) {
      $spooler_log->info( "exit code=" . $subprocess->exit_code );
      $spooler_log->info( "termination signal=" . $subprocess->termination_signal );
    }
  };
  if ( $@ ) {
    chomp $@; 
    $spooler_log->warn( $@ ); 
    return 0;
  }
  
  return $rc;
}