#!/usr/bin/perl
# vim:sw=4:ts=4:noet:

use strict;

$#ARGV == 0 || die "1 argument (talkback report directory) expected";
my $tbrep = $ARGV[0];

sub print_hash($$) {
	my ($title, $hash) = @_;
	print("$title:\n");
	foreach my $key (sort(keys(%{$hash}))) {
		print "  ${$hash}{$key} $key\n";
	}
	print("\n");
}

my %kernels;

open REPORT, "lynx -source http://talkback-public.mozilla.org/reports/$tbrep/smart-analysis.lin|";
my $reading = 0;
while (<REPORT>) {
	if ($reading) {
		if (m/^\s*(\d*)\s*\[Linux (.*)\]/) {
			$kernels{$2} += int($1);
		} else {
			$reading = 0;
		}
	} else {
		if (m/^     Count   Platform List $/) {
			$reading = 1;
		}
	}
}
print_hash("Kernels (by uname -r)", \%kernels);

my %major_versions;
foreach my $kernel (keys(%kernels)) {
	$major_versions{substr($kernel,0,3)} += $kernels{$kernel};
}
print_hash("Major versions", \%major_versions);



my %distros;
my %unknown_kernels;
my $exact_distro_map = {
	"2.4.2-2" => "Red Hat 7.1",
	"2.4.2-2smp" => "Red Hat 7.1",
	"2.4.3-12" => "Red Hat 7.1",
	"2.4.3-12smp" => "Red Hat 7.1",
	"2.4.9-6" => "Red Hat 7.1",
	"2.4.9-6smp" => "Red Hat 7.1",
	"2.4.7-10" => "Red Hat 7.2",
	"2.4.7-10smp" => "Red Hat 7.2",
	"2.4.9-7" => "Red Hat 7.2",
	"2.4.9-7smp" => "Red Hat 7.2",
	"2.4.9-12" => "Red Hat 7.1",
	"2.4.9-12smp" => "Red Hat 7.1",
	"2.4.9-13" => "Red Hat 7.2",
	"2.4.9-13smp" => "Red Hat 7.2",
	"2.4.9-21" => "Red Hat 7.1 or 7.2",
	"2.4.9-21smp" => "Red Hat 7.1 or 7.2",
	"2.4.9-31" => "Red Hat 7.1 or 7.2",
	"2.4.9-31smp" => "Red Hat 7.1 or 7.2",
	"2.4.9-34" => "Red Hat 7.1 or 7.2",
	"2.4.9-34smp" => "Red Hat 7.1 or 7.2",
	"2.4.9-37" => "Red Hat 7.2",
	"2.4.9-37smp" => "Red Hat 7.2",
	"2.4.9-38" => "Red Hat 7.1 or 7.2",
	"2.4.9-38smp" => "Red Hat 7.1 or 7.2",
	"2.4.18-3" => "Red Hat 7.3",
	"2.4.18-3smp" => "Red Hat 7.3",
	"2.4.18-4" => "Red Hat 7.3",
	"2.4.18-4smp" => "Red Hat 7.3",
	"2.4.18-5" => "Red Hat 7.3",
	"2.4.18-5smp" => "Red Hat 7.3",
	"2.4.18-10" => "Red Hat 7.3",
	"2.4.18-10smp" => "Red Hat 7.3",
	"2.4.18-17.7.x" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-17.7.xsmp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-18.7.x" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-18.7.xsmp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-19.7.x" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-19.7.xsmp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-24.7.x" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-24.7.xsmp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-26.7.x" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-26.7.xsmp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-27.7.x" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.18-27.7.xsmp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-13.7" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-13.7smp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-18.7" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-18.7smp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-19.7" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-19.7smp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-20.7" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-20.7smp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-24.7" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-24.7smp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-27.7" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-27.7smp" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-28.7" => "Red Hat 7.1, 7.2, or 7.3",
	"2.4.20-28.7smp" => "Red Hat 7.1, 7.2, or 7.3",

	"2.4.18-14" => "Red Hat 8",
	"2.4.18-14smp" => "Red Hat 8",
	"2.4.18-17.8.0" => "Red Hat 8",
	"2.4.18-17.8.0smp" => "Red Hat 8",
	"2.4.18-18.8.0" => "Red Hat 8",
	"2.4.18-18.8.0smp" => "Red Hat 8",
	"2.4.18-19.8.0" => "Red Hat 8",
	"2.4.18-19.8.0smp" => "Red Hat 8",
	"2.4.18-24.8.0" => "Red Hat 8",
	"2.4.18-24.8.0smp" => "Red Hat 8",
	"2.4.18-26.8.0" => "Red Hat 8",
	"2.4.18-26.8.0smp" => "Red Hat 8",
	"2.4.18-27.8.0" => "Red Hat 8",
	"2.4.18-27.8.0smp" => "Red Hat 8",
	"2.4.20-13.8" => "Red Hat 8",
	"2.4.20-13.8smp" => "Red Hat 8",
	"2.4.20-18.8" => "Red Hat 8",
	"2.4.20-18.8smp" => "Red Hat 8",
	"2.4.20-19.8" => "Red Hat 8",
	"2.4.20-19.8smp" => "Red Hat 8",
	"2.4.20-20.8" => "Red Hat 8",
	"2.4.20-20.8smp" => "Red Hat 8",
	"2.4.20-24.8" => "Red Hat 8",
	"2.4.20-24.8smp" => "Red Hat 8",
	"2.4.20-27.8" => "Red Hat 8",
	"2.4.20-27.8smp" => "Red Hat 8",
	"2.4.20-28.8" => "Red Hat 8",
	"2.4.20-28.8smp" => "Red Hat 8",

	"2.4.20-8" => "Red Hat 9",
	"2.4.20-8smp" => "Red Hat 9",
	"2.4.20-9" => "Red Hat 9",
	"2.4.20-9smp" => "Red Hat 9",
	"2.4.20-13.9" => "Red Hat 9",
	"2.4.20-13.9smp" => "Red Hat 9",
	"2.4.20-18.9" => "Red Hat 9",
	"2.4.20-18.9smp" => "Red Hat 9",
	"2.4.20-19.9" => "Red Hat 9",
	"2.4.20-19.9smp" => "Red Hat 9",
	"2.4.20-20.9" => "Red Hat 9",
	"2.4.20-20.9smp" => "Red Hat 9",
	"2.4.20-24.9" => "Red Hat 9",
	"2.4.20-24.9smp" => "Red Hat 9",
	"2.4.20-27.9" => "Red Hat 9",
	"2.4.20-27.9smp" => "Red Hat 9",
	"2.4.20-28.9" => "Red Hat 9",
	"2.4.20-28.9smp" => "Red Hat 9",
	"2.4.20-30.9" => "Red Hat 9",
	"2.4.20-30.9smp" => "Red Hat 9",
	"2.4.20-31.9" => "Red Hat 9",
	"2.4.20-31.9smp" => "Red Hat 9",

	"2.4.22-1.2115.nptl" => "Fedora Core 1",
	"2.4.22-1.2115.nptlsmp" => "Fedora Core 1",
	"2.4.22-1.2140.nptl" => "Fedora Core 1",
	"2.4.22-1.2140.nptlsmp" => "Fedora Core 1",
	"2.4.22-1.2174.nptl" => "Fedora Core 1",
	"2.4.22-1.2174.nptlsmp" => "Fedora Core 1",
	"2.4.22-1.2179.nptl" => "Fedora Core 1",
	"2.4.22-1.2179.nptlsmp" => "Fedora Core 1",
	"2.4.22-1.2188.nptl" => "Fedora Core 1",
	"2.4.22-1.2188.nptlsmp" => "Fedora Core 1",

	"2.6.5-1.305" => "Fedora Core 2 test 2",  # apparently...
	"2.6.5-1.305smp" => "Fedora Core 2 test 2",  # apparently...

	"2.6.5-1.358" => "Fedora Core 2",
	"2.6.5-1.358smp" => "Fedora Core 2",
	"2.6.5-1.358.8kstacks" => "Fedora Core 2",
	"2.6.5-1.358.8kstackssmp" => "Fedora Core 2",
	"2.6.6-1.427" => "Fedora Core 2",
	"2.6.6-1.427smp" => "Fedora Core 2",
	"2.6.6-1.427.8kstacks" => "Fedora Core 2",
	"2.6.6-1.427.8kstackssmp" => "Fedora Core 2",
	"2.6.6-1.435" => "Fedora Core 2",
	"2.6.6-1.435smp" => "Fedora Core 2",
	"2.6.6-1.435.8kstacks" => "Fedora Core 2",
	"2.6.6-1.435.8kstackssmp" => "Fedora Core 2",

	"2.6.5-1.358custom" => "Fedora Core 2",

	"2.4.9-e.3enterprise" => "Red Hat EL AS2.1",
	"2.4.9-e.5enterprise" => "Red Hat EL AS2.1",
	"2.4.9-e.8enterprise" => "Red Hat EL AS2.1",
	"2.4.9-e.9enterprise" => "Red Hat EL AS2.1",
	"2.4.9-e.10enterprise" => "Red Hat EL AS2.1",
	"2.4.9-e.12enterprise" => "Red Hat EL AS2.1",
	"2.4.9-e.16enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.23enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.24enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.25enterprise" => "Red Hat EL WS2.1 or ES2.1",
	"2.4.9-e.27enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.30enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.34enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.35enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.37enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.38enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.9-e.40enterprise" => "Red Hat EL AS2.1 or WS2.1 or ES2.1",
	"2.4.18-e.25enterprise" => "Red Hat EL AS2.1 or AW2.1",
	"2.4.18-e.31enterprise" => "Red Hat EL AS2.1 or AW2.1",
	"2.4.18-e.37enterprise" => "Red Hat EL AS2.1 or AW2.1",
	"2.4.18-e.40enterprise" => "Red Hat EL AS2.1 or AW2.1",
	"2.4.18-e.41enterprise" => "Red Hat EL AS2.1 or AW2.1",
	"2.4.18-e.43enterprise" => "Red Hat EL AS2.1 or AW2.1",

	"2.4.21-4.EL" => "Red Hat EL 3",
	"2.4.21-4.ELsmp" => "Red Hat EL 3",
	"2.4.21-4.0.1.EL" => "Red Hat EL 3",
	"2.4.21-4.0.1.ELsmp" => "Red Hat EL 3",
	"2.4.21-4.0.2.EL" => "Red Hat EL 3",
	"2.4.21-4.0.2.ELsmp" => "Red Hat EL 3",
	"2.4.21-9.EL" => "Red Hat EL 3",
	"2.4.21-9.ELsmp" => "Red Hat EL 3",
	"2.4.21-9.0.1.EL" => "Red Hat EL 3",
	"2.4.21-9.0.1.ELsmp" => "Red Hat EL 3",
	"2.4.21-9.0.3.EL" => "Red Hat EL 3",
	"2.4.21-9.0.3.ELsmp" => "Red Hat EL 3",
	"2.4.21-15.EL" => "Red Hat EL 3",
	"2.4.21-15.ELsmp" => "Red Hat EL 3",

# ftp://ftp.suse.com/pub/suse/i386/
# ftp://ftp.suse.com/pub/suse/i386/update/
# http://lists.suse.com/archive/suse-security-announce/
# look for k_deflt (etc.) for <= 9.0, kernel-* for 9.1
# SuSE 8.0:  2.4.18-154 ... 2.4.18-281 2.4.18-282 2.4.18-289 2.4.18-290 2.4.18-293 2.4.18-299
# SuSE 8.1:  2.4.19-{110,105,107} ... 2.4.21-151 2.4.21-168 2.4.21-189 2.4.21-{201,203} 2.4.21-215 2.4.21-226
# SuSE 8.2:  2.4.20-62 ... 2.4.20-101 2.4.20-102 2.4.20-105 2.4.20-109 2.4.20-111 2.4.20-113

    "2.4.20-4GB" => "SuSE 8.2 Pro?",
    "2.4.20-4GB-SMP" => "SuSE 8.2 Pro?",
    "2.4.20-4GB-athlon" => "SuSE 8.2 Pro?",
    "2.4.20-64GB" => "SuSE 8.2 Pro?",
    "2.4.20-64GB-SMP" => "SuSE 8.2 Pro?",
    "2.4.20-64GB-athlon" => "SuSE 8.2 Pro?",

# SuSE 9.0: 2.4.21-144 2.4.21-166 2.4.21-192 2.4.21-199 2.4.21-202 2.4.21-215 2.4.21-226
    "2.4.21-144-athlon" => "SuSE Linux 9.0",
    "2.4.21-144-default" => "SuSE Linux 9.0",
    "2.4.21-144-smp" => "SuSE Linux 9.0",
    "2.4.21-144-smp4G" => "SuSE Linux 9.0",
    "2.4.21-166-athlon" => "SuSE Linux 9.0",
    "2.4.21-166-default" => "SuSE Linux 9.0",
    "2.4.21-166-smp" => "SuSE Linux 9.0",
    "2.4.21-166-smp4G" => "SuSE Linux 9.0",
    "2.4.21-192-athlon" => "SuSE Linux 9.0",
    "2.4.21-192-default" => "SuSE Linux 9.0",
    "2.4.21-192-smp" => "SuSE Linux 9.0",
    "2.4.21-192-smp4G" => "SuSE Linux 9.0",
    "2.4.21-199-athlon" => "SuSE Linux 9.0",
    "2.4.21-199-default" => "SuSE Linux 9.0",
    "2.4.21-199-smp" => "SuSE Linux 9.0",
    "2.4.21-199-smp4G" => "SuSE Linux 9.0",
    "2.4.21-202-athlon" => "SuSE Linux 9.0",
    "2.4.21-202-default" => "SuSE Linux 9.0",
    "2.4.21-202-smp" => "SuSE Linux 9.0",
    "2.4.21-202-smp4G" => "SuSE Linux 9.0",
    "2.4.21-215-athlon" => "SuSE Linux 9.0 or 8.1",
    "2.4.21-215-default" => "SuSE Linux 9.0 or 8.1",
    "2.4.21-215-smp" => "SuSE Linux 9.0 or 8.1",
    "2.4.21-215-smp4G" => "SuSE Linux 9.0 or 8.1",
    "2.4.21-226-athlon" => "SuSE Linux 9.0 or 8.1",
    "2.4.21-226-default" => "SuSE Linux 9.0 or 8.1",
    "2.4.21-226-smp" => "SuSE Linux 9.0 or 8.1",
    "2.4.21-226-smp4G" => "SuSE Linux 9.0 or 8.1",

# SuSE 9.1: 2.6.4-52 2.6.4-54.3 2.6.4-54.5 2.6.5-7.75
    "2.6.4-52-default" => "SuSE Linux 9.1",
    "2.6.4-52-enterprise" => "SuSE Linux 9.1",
    "2.6.4-52-smp" => "SuSE Linux 9.1",
    "2.6.4-54.3-default" => "SuSE Linux 9.1",
    "2.6.4-54.3-enterprise" => "SuSE Linux 9.1",
    "2.6.4-54.3-smp" => "SuSE Linux 9.1",
    "2.6.4-54.5-default" => "SuSE Linux 9.1",
    "2.6.4-54.5-enterprise" => "SuSE Linux 9.1",
    "2.6.4-54.5-smp" => "SuSE Linux 9.1",
    "2.6.5-7.75-default" => "SuSE Linux 9.1",
    "2.6.5-7.75-enterprise" => "SuSE Linux 9.1",
    "2.6.5-7.75-smp" => "SuSE Linux 9.1",

# Slackware 8.1: 2.4.18
# Slackware 9.0: 2.4.20
# Slackware 9.1: 2.4.22

};
foreach my $kernel (keys(%kernels)) {
	if (defined($exact_distro_map->{$kernel})) {
		$distros{$exact_distro_map->{$kernel}} += $kernels{$kernel};
	} elsif ($kernel =~ /mdk/) {
		$distros{"Mandrake (various)"} += $kernels{$kernel};
	} elsif ($kernel =~ /gentoo/) {
		$distros{"Gentoo (various)"} += $kernels{$kernel};
	} elsif ($kernel =~ /rhfc1/ || $kernel =~ /nptl/) {
		$distros{"Fedora Core 1 - variant"} += $kernels{$kernel};
	} else {
		$distros{"--UNKNOWN (see above)--"} += $kernels{$kernel};
		$unknown_kernels{$kernel} = $kernels{$kernel};
	}
}
print_hash("Unknown kernels (by uname -r)", \%unknown_kernels);
print_hash("Distros", \%distros);
