#!/usr/local/bin/perl
use strict;
use Getopt::Std;
use Time::Local;
use NBU;
my %opts;
getopts('rhda:p:s:l:', \%opts);
NBU->debug($opts{'d'});
$opts{'r'} ||= ($opts{'s'} =~ /r/);
$opts{'r'} ||= ($opts{'s'} =~ /v/);
my $period = 1;
my ($mm, $dd, $yyyy);
if (!$opts{'a'}) {
my ($s, $m, $h, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
$year += 1900;
$mm = $mon + 1;
$dd = $mday;
$yyyy = $year;
}
else {
$opts{'a'} =~ /^([\d]{4})([\d]{2})([\d]{2})$/;
$mm = $2;
$dd = $3;
$yyyy = $1;
}
if ($opts{'p'}) {
$period = $opts{'p'};
}
my ($midnightStart, $midnightEnd);
if ($period > 0) {
$midnightStart = timelocal(0, 0, 0, $dd, $mm-1, $yyyy);
$midnightEnd = $midnightStart + (24 * 60 * 60 * $period);
}
else {
$midnightEnd = timelocal(0, 0, 0, $dd, $mm-1, $yyyy);
$midnightStart = $midnightEnd + (24 * 60 * 60 * $period);
}
NBU::Media->populate(1);
sub dispInterval {
my $i = shift;
my $seconds = $i % 60; $i = int($i / 60);
my $minutes = $i % 60; $i = int($i / 60);
my $hours = $i % 24;
my $days = int($i / 24);
my $fmt = sprintf("%02d", $seconds);
$fmt = sprintf("%02d:", $minutes).$fmt;
$fmt = sprintf("%02d:", $hours).$fmt;
$fmt = "$days days ".$fmt if ($days);
return $fmt;
}
my %usedCount;
my %oldest;
my %fillTime;
foreach my $volume (NBU::Media->listVolumes) {
my $dt = $volume->lastWritten;
if (($dt >= $midnightStart) && ($dt < $midnightEnd)) {
if ($volume->full) {
my ($s, $m, $h, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($dt);
$year += 1900;
$mm = $mon + 1;
$dd = $mday;
$yyyy = $year;
my $key = $volume->pool->name;
$key .= ":".sprintf("%04u%02u%02d", $year, $mm, $dd);
$key .= ":".($opts{'h'} ? $volume->mmdbHost->name : "");
$key .= ":".($opts{'r'} ? $volume->retention->level : "");
$usedCount{$key} += 1;
$key =$volume->pool->name.":".$volume->retention->level;
my $age = $oldest{$key};
$oldest{$key} = $volume->allocated if (!defined($age) || ($volume->allocated < $age));
$fillTime{$key} += $volume->fillTime;
}
}
}
my %poolUsage;
my %levelUsage;
my %poollevelUsage;
foreach my $k (sort (keys %usedCount)) {
my ($pool, $dt, $hostName, $level) = split(':', $k);
my $c = $usedCount{$k};
my $detail = "";
$detail .= $hostName." " if (defined($hostName) && ($hostName ne ""));
$detail .= "filled $c $pool volumes";
$detail .= " at retention level ".NBU::Retention->byLevel($level)->description if (defined($level) && ($level =~ /^[0-9]+$/));
$detail .= " on $dt\n";
if (($opts{'s'} =~ /v/) && ($opts{'s'} =~ /r/)) {
$poollevelUsage{$pool.":".$level} += $c;
}
elsif ($opts{'s'} =~ /v/) {
$poolUsage{$pool} += $c;
}
elsif ($opts{'s'} =~ /r/) {
$levelUsage{$level} += $c;
}
print $detail unless ($opts{'s'});
}
if (($opts{'s'} =~ /v/) && ($opts{'s'} =~ /r/)) {
my $previousPool;
my $poolCount = 0;
for my $k (sort (keys %poollevelUsage)) {
my ($pool, $level) = split(':', $k);
if (defined($previousPool) && ($pool ne $previousPool)) {
print "$previousPool uses a total of $poolCount volumes\n";
$poolCount = 0;
}
my $c = $poollevelUsage{$k};
my $span = time - $oldest{$k};
$span /= (24 * 60 * 60);
$span = sprintf("%3d", $span);
my $velocity = int($fillTime{$k} / $c);
print "$pool consumed $c volumes at retention level "
.NBU::Retention->byLevel($level)->description
."; at an average velocity of ".dispInterval($velocity)
."\n";
$previousPool = $pool;
$poolCount += $c;
}
print "$previousPool used a total of $poolCount volumes\n";
}
elsif ($opts{'s'} =~ /v/) {
for my $pool (sort (keys %poolUsage)) {
my $c = $poolUsage{$pool};
print "$pool consumed $c volumes\n";
}
}
elsif ($opts{'s'} =~ /r/) {
for my $level (sort (keys %levelUsage)) {
my $c = $levelUsage{$level};
print $level.": ".NBU::Retention->byLevel($level)->description." consumed $c volumes\n";
}
}