#!/usr/bin/perl

use strict;
use warnings;

use JSON;
use JSON::XS;

use Data::Dumper;

my %lenovoSupportMatrix;

$lenovoSupportMatrix{"AL14SE[a-zA-Z0-9]{5}"} = ["TB(4[7-9]|[5-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"AL15SE[a-zA-Z0-9]{5}"} = ["TB(5[4-9]|[6-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"AL14SX[a-zA-Z0-9]{5}"} = ["TC(5[4-9]|[6-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"MG04[a-zA-Z0-9]{5}"} = ["TG(4[8-9]|[5-9][0-9]|[0-9]{3,})", "TH(4[8-9]|[5-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"MG06[a-zA-Z0-9]{5}"} = ["TG(6[5-9]|[7-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"MG07[a-zA-Z0-9]{5}"} = ["TG(7[4-9]|[8-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"HUH721212AL5200"} = ["K6(R[4-9]|[S-Z][0-9])"];
$lenovoSupportMatrix{"HUS726T4TALS200"} = ["K3(S[4-9]|[T-Z][0-9])"];
$lenovoSupportMatrix{"HUS726T6TAL5200"} = ["K6(S[4-9]|[T-Z][0-9])"];
$lenovoSupportMatrix{"HUS728T8TAL5200"} = ["K6(T[3-9]|[U-Z][0-9])"];
$lenovoSupportMatrix{"WUS721010AL5204"} = ["K6(V[0-9]|[W-Z][0-9])"];
$lenovoSupportMatrix{"WUH721414AL5200"} = ["K6(U[4-9]|[V-Z][0-9])"];
$lenovoSupportMatrix{"ST2000NX0353"} = ["FD(3[5-9]|[4-9][0-9]|[0-9]{3,})", "FDK[5-9]"];
$lenovoSupportMatrix{"ST1000NX0453"} = ["LD4[D-Z]", "LDK[D-Z]"];
$lenovoSupportMatrix{"ST2000NX0433"} = ["LD4[C-Z]", "LDK[C-Z]"];
$lenovoSupportMatrix{"ST8000NM0075"} = ["LC(79|[8-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST8000NM0135"} = ["FC(7[6-9]|[8-9][0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST1000NM0045"} = ["LK(9[0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST2000NM0045"} = ["LK(9[0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST4000NM0025"} = ["LK(9[0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST4000NM0135"} = ["FK(8[6-9]|9[0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST6000NM0285"} = ["FC(8[6-9]|9[0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST6000NM0095"} = ["LC(89|9[0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST600MM0208"} = ["L5(A[7-9]|[B-Z][0-9])"];
$lenovoSupportMatrix{"ST300MM0048"} = ["L5(K[7-9]|[L-Z][0-9])"];
$lenovoSupportMatrix{"ST300MM0058"} = ["F5(K[7-9]|[L-Z][0-9])"];
$lenovoSupportMatrix{"ST300MP0006"} = ["L(3(6[6-9]|[7-9][0-9])|[4-9][0-9]{2}|[0-9]{4,})", "L3(K[6-9]|[L-Z][0-9])"];
$lenovoSupportMatrix{"ST600MP0006"} = ["L(3(6[5-9]|[7-9][0-9])|[4-9][0-9]{2}|[0-9]{4,})"];
$lenovoSupportMatrix{"ST900MP0146"} = ["L(4(6[6-9]|[7-9][0-9])|[5-9][0-9]{2}|[0-9]{4,})", "L4(K[6-9]|[L-Z][0-9])"];
$lenovoSupportMatrix{"ST10000NM0096"} = ["LC(9[0-9]|[0-9]{3,})"];
$lenovoSupportMatrix{"ST600MM0009"} = ["L1B[6-9]", "L1K[6-9]"];
$lenovoSupportMatrix{"ST1200MM0009"} = ["L1B[6-9]", "L1K[6-9]"];
$lenovoSupportMatrix{"ST1800MM0129"} = ["L2B[4-9]", "L2K[4-9]"];
$lenovoSupportMatrix{"ST2400MM0129"} = ["L2B[4-9]", "L2K[4-9]"];

my $filename = 'test.json';

my $json_text = do {
	open(my $json_fh, "<:encoding(UTF-8)", $filename)
		or die("Can't open \$filename\": $!\n");
	local $/;
	<$json_fh>
};

my $json = JSON->new;
my $data = $json->decode($json_text);
my $serverOK = "";
my $serverVulnerable = "";

my $tmpText = "";
my $tmpVulnerable = 0;
my $tmpStatus = 0;


foreach my $server ( @{$data->{nodeList}} ) {
	$tmpStatus = 0;
	$server->{hostname} = lc $server->{hostname};
	$tmpText = $server->{hostname};
	$tmpVulnerable = 0;
	#print Dumper($server);
	
	foreach my $raiddevice (@{$server->{raidSettings}}) {
		#print Dumper($raiddevice);
		foreach my $Disk (@{$raiddevice->{diskDrives}}) {
			#print Dumper($Disk);
			$tmpText .= "|".$Disk->{model};
			foreach my $Firmware (@{$Disk->{firmware}}) {
				#print Dumper($Firmware);
				$tmpText .= "-".$Firmware->{version};
				foreach my $type (keys %lenovoSupportMatrix) {
					if ($Disk->{model} =~ /^\s*$type\s*$/) {
						$tmpStatus = 1;
						foreach my $firmwareVersion (@{$lenovoSupportMatrix{$type}}) {
							if ($Firmware->{version} =~ /^\s*$firmwareVersion\s*$/) {
								$tmpStatus = 0;
								last;
							}
						}
						last;
					}
				}
				if ($tmpStatus ne 0) {
					$tmpVulnerable = 1;
				}
			}
		}
	}
	$tmpText .= "\n";
	if ($tmpVulnerable eq 0) {
		$serverOK .= $tmpText;
	} else {
		$serverVulnerable .= $tmpText;	
	}
}
chomp($serverVulnerable);
chomp($serverOK);
$serverVulnerable = `echo "$serverVulnerable" | sort`;
$serverOK = `echo "$serverOK" | sort`;

print "Vulnerable:\n$serverVulnerable\n\n\nOK:\n$serverOK";
