#!/usr/bin/env perl
use strict;
use warnings;
use SMT::Agent::Constants;
use SMT::Agent::Config;
use SMT::Agent::Utils;
use SMT::Agent::RestXML;
use UNIVERSAL 'isa';


###############################################################################
# load job handler
# args: jobtype, jobid
sub loadjobhandler
{
  my ( $jobtype, $jobid) =  @_;

  # prevent command injection
  SMT::Agent::Utils::error ( "cannot load non-alphanumeric jobs." ) unless ( $jobtype =~ /^[0-9A-Za-z]+$/ );

  my $jobhandler = SMT::Agent::Constants::JOB_HANDLER_PATH."/".$jobtype;

  eval { require $jobhandler };
  SMT::Agent::Utils::error( "unable to load handler for jobtype \"$jobtype\": $@", $jobid ) if ( $@ );
}



my  $jobid  =  $ARGV[0];
SMT::Agent::Utils::logger ( "jobid: $jobid" );

my $xmldata = SMT::Agent::RestXML::getjob( $jobid );
my %jobdata = SMT::Agent::RestXML::parsejob( $xmldata );


if ( ! SMT::Agent::Utils::isAgentAllowed ( $jobdata{type} ) )
{
  SMT::Agent::Utils::logger("Running ". $jobdata{type}. " denied by client policy", $jobdata{id} );
  SMT::Agent::RestXML::updatejob ( $jobdata{id}, 3 , "denied by client policy", "", "", "" );
}
else
{
  loadjobhandler ( $jobdata{type}, $jobdata{id} ); 


  my $verbose = "false";
  $verbose = "true" if (defined $jobdata{verbose} && ( $jobdata{verbose} eq "1" || $jobdata{verbose} eq "true"  ) );

  my %retval = jobhandler ( $jobdata{type}, $jobdata{id}, $jobdata{args}, $verbose );

  SMT::Agent::Utils::logger ( "job ". $jobdata{id}. (( $retval{success} eq "true")?" successfully finished":" FAILED"), $jobdata{id} );
  if ( $verbose eq "true" )
  {
    SMT::Agent::Utils::logger ( "job ". $jobdata{id}. " stdout: ".$retval{stdout}, $jobdata{id} );
    SMT::Agent::Utils::logger ( "job ". $jobdata{id}. " stderr: ".$retval{stderr}, $jobdata{id} );
  }
  SMT::Agent::Utils::logger ( "job ". $jobdata{id}. " message: ".$retval{message}, $jobdata{id} );
  SMT::Agent::Utils::logger ( "job ". $jobdata{id}. " exitcode: ".$retval{exitcode}, $jobdata{id} );

  SMT::Agent::RestXML::updatejob ( $jobdata{id}, ($retval{success} eq "true")?1:2 , $retval{message}, $retval{stdout}, $retval{stderr}, $retval{exitcode} );
}




