#!/usr/bin/env perl
use strict;
use warnings;
use IPC::Open3;
use SMT::Agent::Constants;
use SMT::Agent::Utils;

sub jobhandler
{
  my ($jobtype, $jobid, $args, $verbose) =  @_;

  SMT::Agent::Utils::logger ("jobhandler for softwarepush called", $jobid);
  SMT::Agent::Utils::logger ("softwarepush runs jobid \"$jobid\"", $jobid);


  # check whether this handler can handle requested jobtype
  SMT::Agent::Utils::error ("wrong job handler: \"softwarepush\" cannot handle \"$jobtype\"", $jobid) if ( $jobtype ne "softwarepush" );


  # collect and verify arguments
  my $force;
  my $agreelicenses;
  my $packages;


  $force   = $args->[0]->{force}  if ( defined ( $args->[0]->{force} ) );
  $force = "false"	if ( ! defined( $force ) );
  SMT::Agent::Utils::error( "argument invalid: force", $jobid )	if ( ! ( $force eq "true" || $force eq "false" || $force eq "1" || $force eq "0" ) );
  $force = "true" if ($force eq "1" );
  $force = "false" if ($force eq "0" );

  $agreelicenses = $args->[0]->{agreelicenses} if ( defined ( $args->[0]->{agreelicenses} ) );
  $agreelicenses = "false"	if ( ! defined( $agreelicenses ) );
  SMT::Agent::Utils::error( "argument invalid: agreelicenses", $jobid )	if ( ! ( $agreelicenses eq "true" || $agreelicenses eq "false"  || 
									  $agreelicenses eq "0" || $agreelicenses eq "1"  ) );
  $agreelicenses = "true" if ($agreelicenses eq "1" );
  $agreelicenses = "false" if ($agreelicenses eq "0" );

  $packages   = $args->[0]->{packages}->[0]->{package}	if ( defined ( $args->[0]->{packages}->[0]->{package}  ) );
  SMT::Agent::Utils::error( "argument missing: packages", $jobid ) 	if ( ! defined( $packages   ));
  SMT::Agent::Utils::error( "argument invalid: packages", $jobid )  	if ( ! isa($packages, 'ARRAY' ) );


  #==  run zypper ==

  my $command = "/usr/bin/zypper";
  my @cmdArgs;
  push (@cmdArgs, "--no-cd");					# ignore CD/DVD repositories
  push (@cmdArgs, "-x");					# xml output
  push (@cmdArgs, "--non-interactive");				# doesn't ask user
  push (@cmdArgs, "in");					# install
  push (@cmdArgs, "-l") if ( $agreelicenses eq "true" );	# agree licenses
  push (@cmdArgs, "-f") if ( $force eq "true" );		# reinstall

  foreach my $pack (@$packages)                                                             
  {                                                                                         
    push (@cmdArgs, $pack);
  }    

  (my $retval, my $stdout, my $stderr) = SMT::Agent::Utils::executeCommand ( $command, undef, @cmdArgs );

  if ( $verbose ne "true" )
  {
    $stdout="";
    $stderr="";
  }

  my $mesg = "softwarepush failed";
  $mesg = "softwarepush successfully finished" if $retval == 0 ;
  $mesg = "softwarepush successfully finished and reboot needed" if $retval == 102;


  return (
    stdout => defined ( $stdout )? $stdout : "",
    stderr => defined ( $stderr )? $stderr : "",
    exitcode => $retval,
    success => ($retval == 0 ) ? "true" : "false",
    message => $mesg
  );

}

SMT::Agent::Utils::logger ("successfully loaded handler for jobtype \"softwarepush\"");

return 1;

