#!/usr/bin/perl -w
# package 2 cpe map, read from aimas
use strict;

use JSON;
use Data::Dumper;
use LWP;
use LWP::UserAgent;


my $dn = `dirname $0`;chomp($dn);
my $cverepobase=`dirname $dn`;
chomp($cverepobase);

my %package2cpe = (
	# 'expat' => 'cpe:2.3:a:libexpat_project:libexpat:*:*:*:*:*:*:*:*',
);

my $cpemapurl="https://aimaas.suse.de/api/entity/cpe-map";

my $ua = LWP::UserAgent->new("keep_alive" => 1);
$ua->agent("cve-database/SMASHData.pm");
$ua->timeout(300);      # we have very long queries... but lets keep it to 5 minutes

sub cpe_aimas_get_url($) {
        my ($url) = @_;

        # print STDERR "getting $url\n";
	# Create a request
        my $req = HTTP::Request->new(GET => $url);
        $req->header( 'Accept' => 'application/json' );
        my $res = $ua->request($req);
        if ($res->is_success) {
                if ($res->content eq "") {
                        print STDERR "empty result on retrieving $url?\n";
                }
                return $res->content;
        } else {
                print STDERR "ERROR on: $url:\n";
                print STDERR $res->status_line;
                print STDERR "\n";
                return "";
        }
}


my $url = $cpemapurl;
my $page = 1;
my $last = 1;
do {
	my $json = cpe_aimas_get_url($url);
	my $mapref;

        eval {
                $mapref = decode_json($json);
        } or do {
                die "json invalid: $json\n";
        };

	my $items = $mapref->{"items"};
	$last = 1;
	foreach my $item (@{$items}) {
		#print STDERR Dumper($item);
		foreach my $pkg (@{$item->{"packages"}}) {
			$package2cpe{$pkg} = $item->{"name"};
		}
		$last = 0;
	}
	$page++;
	$url = "$cpemapurl?page=$page";
} while (!$last);

sub
package2cpe {
	my ($pkg,$verrel) = @_;
	my $version;
	my $release;

	if (!defined($verrel)) {
		return $package2cpe{$pkg} if (defined($package2cpe{$pkg}));

		if ($pkg =~ /(.*)-([^-]*-[^-]*)$/) {	# (name)-(version-release)
			return package2cpe($1,$2);
		}
		# otherwise nothing found
		return undef;
	}

	# print "$pkg / $verrel \n";
	return undef unless ($verrel =~ /^([^-]*)-([^-]*)$/);
	$version = $1;
	$release = $2;

	# print STDERR "pkg is $pkg, $version is $version, release is $release\n";

	if (!defined($package2cpe{$pkg})) {
		return undef;
	}
	my $cpe = $package2cpe{$pkg};

	# expat,cpe:2.3:a:libexpat_project:libexpat:*:*:*:*:*:*:*:*

	my (@cpearr) = split(/:/,$cpe);
	$cpearr[5] = "$version";
	$cpe = join(":",@cpearr);

	# print STDERR "mapped: $pkg / $verrel -> $cpe\n";

	return $cpe;
}

print package2cpe("expat") . "\n";
print package2cpe("expat","2-2") . "\n";
print package2cpe("expat-2-2") . "\n";

1;
