#!/usr/local/bin/perl -- # -*- cperl -*- use strict; use diagnostics; use HTTP::Date; use Text::CSV_XS; use IO::File; use English; use Getopt::Std; my $usage = qq{usage: $0 -l log_file [-c csv_file] }; my $file; # Name of log file. my $csv_name; # name of csv file. my %log; # Holds the parsed out inform my $last_start; # Start of last backup my %time; # hash of start times -> end times my %host; # host->partition->exists? my $saveset_p; # flag for within a saveset my ($name, $part, $size, $level); # various info from log file. my $csv; # Handler to create CSV file my $csv_file; # csv file handle my %opt; # holds parsed cmd line args sub bytes2number { # Convert bytes to number my $val = shift; my $num = $val; $num =~ s/\s.*//; my $ret = int($num); my $mult; if($val =~ /KB/) { $mult = 1024; } elsif($val =~ /MB/) { $mult = 1024*1024; } return ($ret * $mult); } getopt("l:c:", \%opt); # get cmd line args. die $usage if !defined $opt{l}; if(!defined $opt{c}) { $csv_name = $opt{l}; $csv_name =~ s/.log$//i; $csv_name .= ".csv"; } else { $csv_name = $opt{c}; } # Handler to create CSV file $csv = Text::CSV_XS->new({eol => "\n"}); # csv file handle $csv_file = new IO::File(">$csv_name"); $file = $opt{l}; open FILE, $file; LINE: while() { if(/Start time/) { /Start time:\s+(.*)$/; $last_start = str2time($1); } if(/End time/) { /End time:\s+(.*)$/; $time{$last_start} = str2time($1); } next LINE if /no cycles found/; next LINE if m:\*:; if($saveset_p and /NetWorker Savegroup/) { $saveset_p = undef; next LINE; } if($saveset_p) { if(/(\S+):\s+(\S+)\s+level=(\S+),\s+([\d.]+\s\w+)/) { ($name, $part, $level, $size) = ($1, $2, $3, $4); $name =~ s/\..*//; $host{$name}->{$part} = 1; $log{$last_start}->{$name}->{$part}->{level} = $level; $log{$last_start}->{$name}->{$part}->{size} = bytes2number $size; } } if(/Successful Save Sets/){ $saveset_p = 1; } } format STDOUT = @<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<< @>>>>>> @>>>> $name, $part, $size, $level . $FORMAT_FORMFEED = "\n\n---\n\n"; foreach my $start_time (sort keys %log) { my $total_time = $time{$start_time} - $start_time; my $begin = time2str($start_time); my $end = time2str($time{$start_time}); { local $^W = 0; eval "format STDOUT_TOP = Start Time: $begin End Time: $end Total time $total_time seconds Machine Name Partition Size Level ------------- -------------------- ------- ----- ."} $FORMAT_LINES_LEFT = 0; # force printing a new header foreach $name (keys %{$log{$start_time}}) { foreach $part (keys %{$log{$start_time}->{$name}}) { $size = $log{$start_time}->{$name}->{$part}->{size}; $level = $log{$start_time}->{$name}->{$part}->{level}; write; my $tmp = [ $name, $start_time, $time{$start_time}, $part, $size, $level ]; $csv->print($csv_file, $tmp); } } } print "\n\n"; foreach $name (keys %host) { print "Partitions on $name: \n\t", join (",\n\t", sort keys %{$host{$name}}), "\n"; } print "\n\nNumber of backups found: ", scalar keys %time,"\n"; print "Number of hosts found: ", scalar keys %host, " (", join(", ", keys %host), ")\n";