#!/usr/bin/perl
# -T is not working on 11.4 at least
# 2011 by Christian Dengler <info@christian-dengler.de>

# openSUSE Buildservice - service file 
# Verify the checksum of a given file with the given control checksum


use strict;
use warnings;


# config
$ENV{PATH} = "/usr/bin:/bin";
my %opt = (
            verifier        => 'sha256sum',
            checksum        => undef,
            file            => undef,
            outdir          => undef,
            verifiers       => ['md5sum', 'sha1sum', 'sha224sum', 'sha256sum', 'sha384sum', 'sha512sum',
            			        'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
			                   ],
          );

($opt{str_verifiers} = "@{$opt{verifiers}}[0..5]") =~ s/ /|/g;


sub check_input {
    my ($string, $typ) = @_;

    error("Paramter's value is missing") if (! $string);
    if ($typ eq 'key') {
        $string =~ /^([\w\-:]+)$/;
        error("Wrong character in parameter (key)") if (! $1);
        return $1;
    } elsif ($typ eq 'value') {
        $string =~ /^([\w\-\/~\.:]+)$/;
        error("Wrong character in parameter (value)") if (! $1);
        return $1;
    }

    error("Internal error in $0\n");
}

sub usage {
    print "Usage: $0 --verifier $opt{str_verifiers} --checksum \$CHECKSUM --file \$FILE\n";
    exit 2;
}

sub error {
    my ($err) = @_;

    print STDERR "Wrong use of this OBS-service:\n* $err *\n";
    usage();
}


error('More parameter needed') if ($#ARGV < 3);
#error('Too many parameters') if ($#ARGV > 5);

while (@ARGV) {
    my $key = shift;
    my $value = shift;

    # check the input
    my $k = check_input($key, 'key');
    my $v = check_input($value, 'value');

    # check if it is a valid option
    $k =~ s/^--//;
    error("Unkown parameter") if (! exists $opt{$k});

    # check if it is a valid verifier
    error("Unknown verifier") if ($k eq 'verifier' && ! grep /^$v$/, @{$opt{verifiers}});

    $opt{$k} = $v;
}
error("Missing paramter (file)") if (! $opt{file});
error("Missing paramter (checksum)") if (! $opt{checksum});

$opt{verifier} .= 'sum' if ($opt{verifier} !~ /sum$/); 


my $filesum = `$opt{verifier} "$opt{file}"` || error("Cannot check the checksum");
my ($checksum) = split /\s+/, $filesum;

my $ret = ($checksum eq $opt{checksum}) ? 0 : 1;

printf "%s\n", ($ret) ? 'FAILED' : 'PASSED';

exit $ret

