#!/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 update called", $jobid);
  SMT::Agent::Utils::logger ("update runs jobid \"$jobid\"", $jobid);


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


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


  $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" );



  #==  run zypper ==

  my $command = "/usr/bin/zypper";
  my @cmdArgs;
  push (@cmdArgs, "--no-cd");					# ignore CD/DVD repositories
  push (@cmdArgs, "-xn");					# xml output
  push (@cmdArgs, "patch");					# patch
  push (@cmdArgs, "--with-interactive");			# doesn't ask user
  push (@cmdArgs, "-l") if ( $agreelicenses eq "true" );	# agree licenses


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


  # run zypper again if needed because of pkgmgr patches
  my $stdout2;
  my $stderr2;

  if ( $retval == 103 )
  {                                                                                         
    ($retval, $stdout2, $stderr2) = SMT::Agent::Utils::executeCommand ( $command, undef, @cmdArgs );
  }    

  $stdout .= $stdout2;
  $stderr .= $stderr2;


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

  my $mesg = "update failed";
  $mesg = "update successfully finished" if $retval == 0 ;
  $mesg = "update 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 \"update\"");

return 1;

