#!/usr/bin/perl -w
use strict;

my $outputdir="/suse/meissner/Export";

%CanDBReader::allcans = ();
%CanDBReader::maintained = ();

my $dn = `dirname $0`;chomp($dn);
my $pwd = `pwd`;chomp($pwd);
if ($dn !~ /^\//) { $dn = $pwd . "/" . $dn; }
push @INC,$dn;

require CanDBReader;

my $can;
my $inqa;
my %years = ();

sub cvesortfun($$) {
        my ($xa,$xb) = @_;
        my ($ya,$na,$yb,$nb);
        if ($xa =~ /-(\d*)-(\d*)$/) {
                $ya = $1; $na = $2;
                #print "$xa - $ya / $na\n";
        } else {
                print "$xa did not parse\n";
                $ya = 9999;
        }
        if ($xb =~ /-(\d*)-(\d*)$/) {
                $yb = $1; $nb = $2;
                #print "$xb - $yb / $nb\n";
        } else {
                print "$xb did not parse\n";
                $yb = 9999;
        }
        return $ya <=> $yb if ($ya != $yb);
        return $na <=> $nb;
}

delete $CanDBReader::allcans{"NOT-SECURITY"};

my @cans = sort cvesortfun keys %CanDBReader::allcans;

foreach (@cans) { if (/(CVE|CAN)-(\d*)-\d*/) {  $years{$2}=1;} }

open(ALLCANS,">$outputdir/cans.html")||die;

foreach my $year (sort keys %years) {
	open(YEARCAN,">$outputdir/cans-$year.html")||die;
	print YEARCAN "<table border=1>\n";
	print YEARCAN "<tr><th>CAN</th><th>Packages</th><th>Bugzilla</th><th>SWAMP</th><th>Status</th></tr>\n";
	foreach $can (@cans) {
		my $swampid = 0;

		next unless ($can=~ /CVE-$year-/);

		next unless (
			defined($CanDBReader::packages{$can})	||
			defined($CanDBReader::bugzillas{$can})	||
			defined($CanDBReader::swamps{$can})	||
			defined($CanDBReader::qadone{$can})	||
			defined($CanDBReader::rejected{$can})	||
			defined($CanDBReader::released{$can})	||
			defined($CanDBReader::swamps{$can})	||
			defined($CanDBReader::note{$can})	||
			defined($CanDBReader::advisories{$can})
		);

		print YEARCAN "<tr><td>";
		print YEARCAN "<a href=\"https://www.suse.com/security/cve/$can\">$can</a>";
		print YEARCAN "</td><td>";
		if (defined($CanDBReader::packages{$can})) {
			my %xx;
			my @xx;

			%xx = map { $_ => 1 } split(/,/,$CanDBReader::packages{$can});
			@xx = sort keys %xx;
			if ($#xx > -1) {
				my $str="";
				my $pkg;
				foreach $pkg (@xx) {
					$str .= "$pkg<br>";
				}
				print YEARCAN $str;
			} else {
				print YEARCAN "&nbsp;";
			}
		} else {
			print YEARCAN "&nbsp;";
		}
		print YEARCAN "</td><td>";
		if (defined($CanDBReader::bugzillas{$can})) {
			my %xx;
			my @xx;

			%xx = map { $_ => 1 } split(/,/,$CanDBReader::bugzillas{$can});
			@xx = sort keys %xx;

			if ($#xx > -1) {
				my $str="";
				my $bug;
				foreach $bug (@xx) {
					$str .= "<a href=\"https://bugzilla.suse.com/show_bug.cgi?id=$bug\">#$bug</a><br>";
				}
				print YEARCAN $str;
			} else {
				print YEARCAN "&nbsp;";
			}
		} else {
			print YEARCAN "&nbsp;";
		}
		print YEARCAN "</td><td>";
		$inqa=0;
		if (defined($CanDBReader::swamps{$can}))	{ $inqa=1; }
		if (defined($CanDBReader::qadone{$can}))	{ $inqa=0; }
		if (defined($CanDBReader::rejected{$can}))	{ $inqa=0; }
		if (defined($CanDBReader::released{$can}))	{ $inqa=0; }

		if (defined($CanDBReader::swamps{$can})) {
			my %xx;
			my @xx;
			%xx = map { $_ => 1 } split(/,/,$CanDBReader::swamps{$can});
			@xx = sort keys %xx;

			if (scalar(@xx) > -1) {
				my $swamp;
				if ($#xx == 0) {
					$swamp = pop @xx;
					$swamp =~ /(\d*)/;
					$swampid = $1;
					print YEARCAN "<a href=\"https://swamp.suse.de/webswamp/swamp/template/DisplayWorkflow.vm?workflowid=$swamp\">$swamp</a>";
				} else {
					foreach $swamp (@xx) {
						next if ($swamp eq "");
						$swamp =~ /(\d*)/;
						if ($1 > $swampid) {
							$swampid = $1;
						}
						print YEARCAN "<a href=\"https://swamp.suse.de/webswamp/swamp/template/DisplayWorkflow.vm?workflowid=$swamp\">$swamp</a><br>";
					}
				}
			} else {
				print YEARCAN "&nbsp;";
			}
		} else {
			print YEARCAN "&nbsp;";
		}
		print YEARCAN "</td><td>";

		# Try to find out the status...

		my @status = ();
		if ($inqa) {
			push @status,"In the QA queue.";
		}
		if ($CanDBReader::rejected{$can} && !$CanDBReader::qadone{$can} && !$CanDBReader::released{$can}) {
			push @status,"Rejected during QA.... Waiting for new packages.";
		}
		if (defined($CanDBReader::note{$can})) {
			push @status,"Note from Security Team: " . $CanDBReader::note{$can};
		}
		if (defined($CanDBReader::advisories{$can})) {
			my $str ="Advisory released: ";
			my %xx;
			my @xx;
			%xx = map { $_ => 1 } split(/,/,$CanDBReader::advisories{$can});
			@xx = sort keys %xx;

			if (scalar(@xx) > -1) {
				my $url;
				foreach $url (@xx) {
					if ($url =~ /suse-security-announce\/([^\/]*)\//) {
						$url =~ /suse-security-announce\/([^\/]*)\//;
						$str .= "<a href=\"$url\">$1</a>,";
					}
					if ($url =~ /suse-updates\/([^\/]*)\//) {
						$url =~ /suse-updates\/([^\/]*)\//;
						$str .= "<a href=\"$url\">$1</a>,";
					}
				}
				chop $str;
			}
			push @status,$str;
		}
		if (defined($CanDBReader::released{$can})) {
			my %xx;
			my $md5;
			my $yp;
			if ($#status<0) {
				@status=("Updates released");
			}
			%xx = map { $_ => 1 } split(/,/,$CanDBReader::released{$can});
			my $str="";
			foreach $md5 (sort keys %xx) {
				my $xmd5 = $md5;
				
				next unless ($CanDBReader::maintained{$md5});
				$str .= "$md5: <a href=\"http://download.suse.com/patch/finder/#familyId=&productId=&dateRange=&startDate=&endDate=&priority=&distribution=&architecture=&keywords=$md5&xf=7260\">TID</a><br>";
			}
			if (defined($CanDBReader::youpatches{$can})) {
				%xx = map { $_ => 1 } split(/,/,$CanDBReader::youpatches{$can});
				foreach $yp (sort keys %xx) {
					$str .= $yp . "<br>";
				}
			}
			push @status,$str;
		}
		if (defined($CanDBReader::qadone{$can})) {
			if ($#status<0) {
				@status=("QA done, waiting for release");
			}
		}
		if ($#status<0) {
			@status=("Unknown");
		}
		print YEARCAN join("<br>",@status);

		print YEARCAN "</td></tr>\n";
	}
	print YEARCAN "</table>\n";
	close(YEARCAN);
	print ALLCANS "<a href=\"cans-$year.html\">CVE-$year-...</a><br>\n";
}
close(ALLCANS);
