#! /usr/bin/perl -w
###############################################################################
#
# bkill - deletes slurm jobs in familiar openlava format.
#
#
###############################################################################
#  Copyright (C) 2015 SchedMD LLC.
#  Written by Danny Auble <da@schedmd.com>.
#
#  This file is part of Slurm, a resource management program.
#  For details, see <https://slurm.schedmd.com/>.
#  Please also read the included file: DISCLAIMER.
#
#  Slurm is free software; you can redistribute it and/or modify it under
#  the terms of the GNU General Public License as published by the Free
#  Software Foundation; either version 2 of the License, or (at your option)
#  any later version.
#
#  In addition, as a special exception, the copyright holders give permission
#  to link the code of portions of this program with the OpenSSL library under
#  certain conditions as described in each individual source file, and
#  distribute linked combinations including the two. You must obey the GNU
#  General Public License in all respects for all of the code used other than
#  OpenSSL. If you modify file(s) with this exception, you may extend this
#  exception to your version of the file(s), but you are not obligated to do
#  so. If you do not wish to do so, delete this exception statement from your
#  version.  If you delete this exception statement from all source files in
#  the program, then also delete it here.
#
#  Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
#  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
#  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
#  details.
#
#  You should have received a copy of the GNU General Public License along
#  with Slurm; if not, write to the Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
#
###############################################################################

#use strict;
use FindBin;
use Getopt::Long 2.24 qw(:config no_ignore_case);
use lib "${FindBin::Bin}/../lib/perl";
use autouse 'Pod::Usage' => qw(pod2usage);
use Slurm ':all';
use POSIX qw(:signal_h);

# Parse Command Line Arguments
my ($help,
    $man);

GetOptions(
        'h' => \$help,
        'man'    => \$man,
	)
	or pod2usage(2);

# Display usage if necessary
pod2usage(0) if $help;
if ($man)
{
        if ($< == 0)    # Cannot invoke perldoc as root
        {
		my $id = eval { getpwnam("nobody") };
		$id = eval { getpwnam("nouser") } unless defined $id;
		$id = -2                          unless defined $id;
		$<  = $id;
        }
        $> = $<;                         # Disengage setuid
        $ENV{PATH} = "/bin:/usr/bin";    # Untaint PATH
        delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
        if ($0 =~ /^([-\/\w\.]+)$/) { $0 = $1; }    # Untaint $0
        else { die "Illegal characters were found in \$0 ($0)\n"; }
        pod2usage(-exitstatus => 0, -verbose => 2);
}

# Use sole remaining argument as job_ids
my @job_ids;
if (@ARGV) {
        @job_ids = @ARGV;
} else {
        pod2usage(2);
}

# OpenLava goes through the list beforehand verifying before it processes
# and exits on first error.
foreach my $jobid (@job_ids) {
	if ($jobid !~ /^\d+$/) {
		printf("%s: Illegal job ID.\n", $jobid);
		exit 1;
	}
}

my $rc = 0;
foreach my $jobid (@job_ids) {
	my $err = 0;
	my $resp = 0;

	for (my $i=0; $i<3; $i++) {
		$resp = Slurm->kill_job($jobid, SIGKILL);
		$err = Slurm->get_errno();
		if($resp == SLURM_SUCCESS
		   || ($err ne ESLURM_TRANSITION_STATE_NO_UPDATE
		       && $err ne ESLURM_JOB_PENDING)) {
			last;
		}
	}
	if ($resp == SLURM_ERROR) {
		$rc++;
		printf("Job <%s>: %s\n", $jobid, Slurm->strerror($err));
	} else {
		printf("Job <%s> is being terminated\n", $jobid);
	}
}
exit $rc;

##############################################################################

__END__

=head1 NAME

B<bkill> - deletes jobs in a familiar openlava format

=head1 SYNOPSIS

B<bkill> I<job_id>...

=head1 DESCRIPTION

The B<bkill> command cancels the specified jobs.

=head1 OPTIONS

=over 4

=item B<-h | --help>

brief help message

=item B<--man>

full documentation

=back

=head1 EXIT STATUS

On success, B<bkill> will exit with a value of zero. On failure, B<bkill> will exit with a value greater than zero.

=cut
