#!/usr/bin/env perl # Description: # Basic summary for monthly VMware vCops reports # Results are displayed on stdout or redirected to a file # # Save all monthly vCops CSV reports in a directory and run this script # # Typical CVS files generated from vCops reports: # # CIQ_Report-201411010100-World-Virtual_Machine_Optimization_Report.csv # CIQ_Report-201411010200-World-Oversized_Virtual_Machines_Report.csv # CIQ_Report-201411010300-World-Undersized_Virtual_Machines_Report.csv # CIQ_Report-201411010400-World-Powered_Off_Virtual_Machines_Report.csv # CIQ_Report-201411010500-World-Host_Utilization_Report.csv # CIQ_Report-201411010600-World-Cluster_or_Host_Capacity_Inventory_Report.csv # # Last Update: 5 October 2014 # Designed by: Dusan U. Baljevic (dusan.baljevic@ieee.org) #use warnings; use strict; # Define important environment variables # $ENV{'PATH'} = "/bin:/usr/sbin:/sbin:/usr/bin"; my @files = {}; my $FSP = q{}; my $SaveCPUs = q{}; my $DateStamp = q{}; sub Prusage { print <) { chomp($_); next if grep(/^$/, $_); next if grep(/^::::/, $_); next if grep(/Virtual Machine/, $_); $_ =~ s/\R//g; ($id, $policy, $vCenter, $VdiskSpace, $TimeOff, $ProvDiskSpace) = split( /,/, $_); $id =~ s/"//g; $vCenter =~ s/"//g; $TimeOff =~ s/"//g; $ProvDiskSpace =~ s/"//g; $ProvDiskSpace =~ s/\s+//g; $myid = join "-", $id, $vCenter; if ( "$id" ne '' ) { if ( grep(/\Q$myid\E/, @ALLDATA) ) { push @ALLDATA, $myid; $TOFF = sprintf("%8s", $TimeOff); for ( @{$data{$myid}} ) { $_ .= $TOFF; } } else { push @ALLDATA, $myid; my $mloc = $fileno * 8; $TOFF = sprintf("%${mloc}s", $TimeOff); push @{$data{$myid}}, $TOFF; } } if ( "$ProvDiskSpace" ) { if ( ! grep(/\Q$id\E/, @{$data{$myid}} ) ) { $ProvDiskSpace =~ s/GB//g; $SaveDiskSpace += $ProvDiskSpace; } } } close(inFile); $FSP = sprintf("%2.2f", $SaveDiskSpace / 1024); push @{$FSPARR{$DateStamp}}, $FSP; } } my %data5; my $myid = q{}; my $id = q{}; my $value = q{}; my $Head2 = sprintf("%55s ", " "); foreach my $fils ( @Ofile ) { chomp($fils); (undef, $DateStamp, undef) = split( /-/, $fils); $DateStamp = substr $DateStamp, 0, 8; $Head2 .= sprintf("%8s ", $DateStamp); if ( open( inFile, "awk NF $fils |" ) ) { while () { chomp($_); next if grep(/^$/, $_); $_ =~ s/","/;/g; $_ =~ s/\R//g; next if grep(/VMs/, $_); my ($id, $value) = split( /;/, $_); $id =~ s/"//g; $value =~ s/"//g; if ( "$id" ne '' ) { $value =~ s/,//g; push @{$data5{$id}}, int($value); } } close(inFile); } } my %data2; my @ALLDATA2 = (); my $myid = q{}; my $id = q{}; my $policy = q{}; my $vCenter = q{}; my $confvCPU = q{}; my $recvCPU = q{}; my $CPUutil = q{}; my $confRAM = q{}; my $recRAM = q{}; my $rRAM = q{}; my $cRAM = q{}; my $TOFF = q{}; my $SaveRAM = q{}; my $Head3 = sprintf("%71s ", " "); foreach my $fils ( @Zfile ) { chomp($fils); $fileno++; (undef, $DateStamp, undef) = split( /-/, $fils); $DateStamp = substr $DateStamp, 0, 8; $Head3 .= sprintf("%8s ", $DateStamp); $SaveCPUs = 0; $SaveRAM = 0; if ( open( inFile, "awk NF $fils |" ) ) { while () { chomp($_); next if grep(/^$/, $_); next if grep(/^::::/, $_); next if grep(/Virtual Machine/, $_); $_ =~ s/\R//g; ($id, $policy, $vCenter, $confvCPU, $recvCPU, $CPUutil, $confRAM, $recRAM) = split( /,/, $_); $id =~ s/"//g; $vCenter =~ s/"//g; $confvCPU =~ s/"//g; $confvCPU =~ s/\s+//g; $confRAM =~ s/"//g; $confRAM =~ s/\s+//g; $recRAM =~ s/"//g; $recRAM =~ s/\s+//g; $myid = join "-", $id, $vCenter, $confvCPU, $confRAM; $CPUutil =~ s/"//g; if ( "$id" ne '' ) { if ( grep(/\Q$myid\E/, @ALLDATA2) ) { push @ALLDATA2, $myid; $TOFF = sprintf("%8s", $CPUutil); for ( @{$data2{$myid}} ) { $_ .= $TOFF; } } else { push @ALLDATA2, $myid; my $mloc = $fileno * 8; $TOFF = sprintf("%${mloc}s", $CPUutil); push @{$data2{$myid}}, $TOFF; } if ( ! grep(/\Q$id\E/, @{$data2{$myid}} ) ) { $confvCPU =~ s/vCPUs//g; $recvCPU =~ s/vCPUs//g; $recvCPU =~ s/vCPUs//g; if ( grep(/MB/, $confRAM ) ) { $confRAM =~ s/MB//g; $cRAM = sprintf("%2.2f", $confRAM / 1024); } elsif ( grep(/TB/, $confRAM ) ){ $confRAM =~ s/TB//g; $cRAM = $confRAM * 1024; } else { $confRAM =~ s/GB//g; $cRAM = $confRAM; } if ( grep(/MB/, $recRAM ) ) { $recRAM =~ s/MB//g; $recRAM =~ s/,//g; $rRAM = sprintf("%2.2f", $recRAM / 1024); } elsif ( grep(/TB/, $recRAM ) ) { $recRAM =~ s/TB//g; $rRAM = $recRAM * 1024; } else { $recRAM =~ s/GB//g; $rRAM = $recRAM; } $recvCPU =~ s/\s+//g; $recvCPU =~ s/"//g; if ( "$confvCPU" > "$recvCPU" ) { $SaveCPUs += $confvCPU - $recvCPU; } $SaveRAM += $cRAM - $rRAM; } } } close(inFile); } push @{$SCPUARR{$DateStamp}}, $SaveCPUs; push @{$SRAMARR{$DateStamp}}, $SaveRAM; } my %data3; my %data4; my $fileno = 0; my $myid = q{}; my $id = q{}; my $policy = q{}; my $vCenter = q{}; my $confvCPU = q{}; my $recvCPU = q{}; my $CPUutil = q{}; my $confRAM = q{}; my $recRAM = q{}; my $RAMundersz = q{}; my $CPUundersz = q{}; my $T1 = q{}; my $T2 = q{}; my @ALLDATA3 = (); my $Head4 = sprintf("%55s ", " "); foreach my $fils ( @Ufile ) { chomp($fils); $fileno++; (undef, $DateStamp, undef) = split( /-/, $fils); $DateStamp = substr $DateStamp, 0, 8; $Head4 .= sprintf("%8s ", $DateStamp); if ( open( inFile, "awk NF $fils |" ) ) { while () { chomp($_); next if grep(/^$/, $_); next if grep(/Virtual Machine/, $_); next if grep(/^::::/, $_); $_ =~ s/\R//g; ($id, $policy, $vCenter, $confvCPU, $CPUundersz, $confRAM, $RAMundersz) = split( /,/, $_); $id =~ s/"//g; $vCenter =~ s/"//g; $confvCPU =~ s/"//g; $confRAM =~ s/"//g; $confvCPU =~ s/\s+//g; $confRAM =~ s/\s+//g; $myid = join "-", $id, $vCenter, $confvCPU, $confRAM; $RAMundersz =~ s/"//g; $CPUundersz =~ s/"//g; if ( "$id" ne '' ) { if ( grep(/\Q$myid\E/, @ALLDATA3) ) { push @ALLDATA3, $myid; $T1 = sprintf("%8s", $RAMundersz); $T2 = sprintf("%8s", $CPUundersz); for ( @{$data3{$myid}} ) { $_ .= $T1; } for ( @{$data4{$myid}} ) { $_ .= $T2; } } else { push @ALLDATA3, $myid; my $mloc = $fileno * 8; $T1 = sprintf("%${mloc}s", $RAMundersz); $T2 = sprintf("%${mloc}s", $CPUundersz); push @{$data3{$myid}}, $T1; push @{$data4{$myid}}, $T2; } } } close(inFile); } } print "\nExecutive Monthly Report\n"; print "\nNON-UTILISED PROVISIONED DISK SPACE FOR POWERED-OFF VMs PER MONTH (YYYYMMDD)\n"; foreach my $k (sort keys %FSPARR) { next if grep(/^$/, $k); printf " %-8s => %-s TB", $k, @{$FSPARR{$k}}; print "\n"; } print "\nNON-UTILISED CPUs FOR OVERSIZED VMs PER MONTH (YYYYMMDD)\n"; foreach my $k (sort keys %SCPUARR) { next if grep(/^$/, $k); printf " %-8s => %-s vCPUs", $k, @{$SCPUARR{$k}}; print "\n"; } print "\nNON-UTILISED MEMORY (RAM) FOR OVERSIZED VMs PER MONTH (YYYYMMDD)\n"; foreach my $k (sort keys %SRAMARR) { next if grep(/^$/, $k); printf " %-8s => %-2.2f GB", $k, @{$SRAMARR{$k}}; print "\n"; } print "\n\nDetailed Monthly Report\n"; print "\nvCops Powered-Off Virtual Machines Report (% Time Powered-Off)\n"; print "$Head1\n"; showres2(%data); print "\nvCops World Virtual Machine Optimization Report\n"; print "$Head2\n"; showres(%data5); print "\nvCops Oversized Virtual Machines Report (% CPU Demand of Recommended)\n"; print "$Head3\n"; showres2(%data2); print "\nvCops Undersized Virtual Machines Report (% Memory Undersized)\n"; print "$Head4\n"; showres2(%data3); print "\nvCops Undersized Virtual Machines Report (% CPU Undersized)\n"; print "$Head4\n"; showres2(%data4); exit(0);