Blame server-src/amtoc.pl

Packit Service 392537
#!@PERL@ -w
Packit Service 392537
Packit Service 392537
use strict;
Packit Service 392537
use warnings;
Packit Service 392537
Packit Service 392537
# create a TOC (Table Of Content) file for an amanda dump
Packit Service 392537
Packit Service 392537
# Author: Nicolas.Mayencourt@cui.unige.ch
Packit Service 392537
Packit Service 392537
# release 3.1.4
Packit Service 392537
Packit Service 392537
# HISTORY
Packit Service 392537
# 1.0 19??-??-?? nicolas@cui.unige.ch
Packit Service 392537
#	don't remember :-)
Packit Service 392537
# 2.0 1996-??-?? nicolas@cui.unige.ch
Packit Service 392537
#	amanda 2.2.6 support
Packit Service 392537
# 3.0 1999-02-17 Nicolas.Mayencourt@cui.unige.ch
Packit Service 392537
#	major rewrite, incompatible with release 2.0, amanda 2.4 support
Packit Service 392537
# 3.0.1 1999-02-17 oliva@dcc.unicamp.br
Packit Service 392537
#	minor fixes for multi-tape runs
Packit Service 392537
# 3.0.2 1999-02-28 martineau@IRO.UMontreal.CA
Packit Service 392537
#	output the datestamp of each dump
Packit Service 392537
# 3.0.3 1999-09-01 jrj@purdue.edu
Packit Service 392537
#	allow multiple -s entries
Packit Service 392537
# 3.0.4 1999-09-15 jrj@purdue.edu
Packit Service 392537
#	handle an image failing on one tape...
Packit Service 392537
# 3.1.0 1999-10-06 Nicolas.Mayencourt@cui.unige.ch
Packit Service 392537
#	add new options (-i -t)
Packit Service 392537
# 3.1.1 1999-10-08 Nicolas.Mayencourt@cui.unige.ch
Packit Service 392537
#	print original size, instead of size-on-tape
Packit Service 392537
# 3.1.2 1999-10-11 Nicolas.Mayencourt@cui.unige.ch
Packit Service 392537
#	really print original size, instead of size-on-tape
Packit Service 392537
# 3.1.3 Nicolas.Mayencourt@cui.unige.ch
Packit Service 392537
#	correct a bug for total report
Packit Service 392537
# 3.1.4 2000-01-14 dhw@whistle.com
Packit Service 392537
#	Add a flag (-w) for vertical whitespace
Packit Service 392537
Packit Service 392537
my %lines;
Packit Service 392537
my %dates;
Packit Service 392537
my %labels;
Packit Service 392537
my $IF;
Packit Service 392537
my $OF;
Packit Service 392537
my $tabular;
Packit Service 392537
my $fnbr;
Packit Service 392537
my $hstprt;
Packit Service 392537
my $dt;
Packit Service 392537
my $lvl;
Packit Service 392537
my $sz;
Packit Service 392537
my $ch;
Packit Service 392537
my $s;
Packit Service 392537
my @subs;
Packit Service 392537
my $dir;
Packit Service 392537
my $i;
Packit Service 392537
my $info;
Packit Service 392537
my $tocfilename;
Packit Service 392537
my $vwspace;
Packit Service 392537
my $logfile;
Packit Service 392537
my $filenumber;
Packit Service 392537
my $tot_or_size;
Packit Service 392537
my $line;
Packit Service 392537
my $host;
Packit Service 392537
my $disk;
Packit Service 392537
my %osize;
Packit Service 392537
my %fail;
Packit Service 392537
my $flash_mode;
Packit Service 392537
my $storage;
Packit Service 392537
my $pool;
Packit Service 392537
my $label;
Packit Service 392537
my $filenum;
Packit Service 392537
my $date;
Packit Service 392537
my $chunk;
Packit Service 392537
my $level;
Packit Service 392537
my $mysize;
Packit Service 392537
my $note;
Packit Service 392537
my $size;
Packit Service 392537
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
sub pr($$$$$$$) { 
Packit Service 392537
# you can update these proc if you want another formating
Packit Service 392537
# format: filenumber  host:part  date  level  size
Packit Service 392537
# If you use tabular option, modifie the format at the end of the code
Packit Service 392537
  if (defined($tabular)) {
Packit Service 392537
	$fnbr=$_[0];
Packit Service 392537
	$hstprt=$_[1] . ":" . $_[2];
Packit Service 392537
	$dt=$_[3];
Packit Service 392537
	$lvl=$_[4];
Packit Service 392537
	$sz=$_[5];
Packit Service 392537
	$ch=$_[6];
Packit Service 392537
    write($OF);
Packit Service 392537
  } else {
Packit Service 392537
    print $OF "$_[0]  $_[1]:$_[2]  $_[3]  $_[4]  $_[5]  $_[6]\n";
Packit Service 392537
  }
Packit Service 392537
}
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
Packit Service 392537
Packit Service 392537
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
sub tfn($) {
Packit Service 392537
  # calculate tocfilename
Packit Service 392537
  $_ = $_[0];
Packit Service 392537
  foreach $s (@subs) {
Packit Service 392537
    eval $s;
Packit Service 392537
  }
Packit Service 392537
  return $dir . $_ ;
Packit Service 392537
}
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
Packit Service 392537
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
sub usage($) {
Packit Service 392537
  print STDERR "@_\n\n";
Packit Service 392537
  print STDERR "usage: amtoc [-a] [-i] [-t] [-f file] [-s subs] [-w] [--] logfile\n";
Packit Service 392537
  print STDERR "         -a      : file output to `label`.toc\n";
Packit Service 392537
  print STDERR "         -i      : Start TOC with a small help message\n";
Packit Service 392537
  print STDERR "         -t      : tabular output\n";
Packit Service 392537
  print STDERR "         -f file : output to file\n";
Packit Service 392537
  print STDERR "         -s subs : output file name evaluated to `eval \$subs`\n";
Packit Service 392537
  print STDERR "         -w      : add vertical whitespace after each tape\n";
Packit Service 392537
  print STDERR "         --      : last option\n";
Packit Service 392537
  print STDERR "         logfile : input file ('-' for stdin)\n";
Packit Service 392537
  exit;
Packit Service 392537
}
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
sub init() {
Packit Service 392537
  &usage("amtoc required at least 'logfile' parameter.") if ($#ARGV==-1) ;
Packit Service 392537
Packit Service 392537
  @subs = ();
Packit Service 392537
  for ($i=0;$i<=$#ARGV;$i++) {
Packit Service 392537
    if ($ARGV[$i] eq '-a') {
Packit Service 392537
        push (@subs, "s/\$/.toc/");
Packit Service 392537
      }
Packit Service 392537
    elsif ($ARGV[$i] eq '-i') {
Packit Service 392537
        $info=1;
Packit Service 392537
      }
Packit Service 392537
    elsif ($ARGV[$i] eq '-t') {
Packit Service 392537
        $tabular=1;
Packit Service 392537
      }
Packit Service 392537
    elsif ($ARGV[$i] eq '-f') {
Packit Service 392537
        $i++;
Packit Service 392537
        &usage("'-f' option require 'file' parameter.")  if ($i > $#ARGV);
Packit Service 392537
        $tocfilename=$ARGV[$i];
Packit Service 392537
      }
Packit Service 392537
    elsif ($ARGV[$i] eq '-s') {
Packit Service 392537
        $i++;
Packit Service 392537
        &usage("'-s' option require 'subs' parameter.")  if ($i > $#ARGV);
Packit Service 392537
        push (@subs, $ARGV[$i]);
Packit Service 392537
      }
Packit Service 392537
    elsif ($ARGV[$i] eq '-w') {
Packit Service 392537
        $vwspace=1;
Packit Service 392537
      }
Packit Service 392537
    elsif ($ARGV[$i] eq '--') {
Packit Service 392537
      # no more options: next arg == logfile
Packit Service 392537
        $i++;
Packit Service 392537
        &usage("amtoc required at least 'logfile' parameter.") if ($i > $#ARGV);
Packit Service 392537
        $logfile=$ARGV[$i];
Packit Service 392537
        &usage("too many parameters.") unless ($i == $#ARGV);
Packit Service 392537
      }
Packit Service 392537
    else {
Packit Service 392537
        $logfile=$ARGV[$i];
Packit Service 392537
        &usage("too many parameters.") unless ($i == $#ARGV);
Packit Service 392537
      }
Packit Service 392537
  }
Packit Service 392537
  &usage("amtoc required at least 'logfile' parameter.") unless ($logfile);
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
#--------------------------------------------------------
Packit Service 392537
Packit Service 392537
&ini;;
Packit Service 392537
Packit Service 392537
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV', 'PATH'};
Packit Service 392537
$ENV{'PATH'} = "/usr/bin:/usr/sbin:/sbin:/bin";
Packit Service 392537
Packit Service 392537
$dir=$logfile;
Packit Service 392537
$dir =~ s/[^\/]*$//;
Packit Service 392537
Packit Service 392537
Packit Service 392537
if ($logfile eq '-') {$IF=*STDIN} else 
Packit Service 392537
  {die ("Cannot open logfile $logfile") unless open ($IF,"$logfile");}
Packit Service 392537
Packit Service 392537
$filenumber=0;
Packit Service 392537
$tot_or_size=0;
Packit Service 392537
Packit Service 392537
while ( <$IF> ) {
Packit Service 392537
  $line = $_;
Packit Service 392537
  if ( /^FAIL dumper (\S+) (\S+)/ ) {
Packit Service 392537
    next;
Packit Service 392537
  }
Packit Service 392537
  if ( /^SUCCESS dumper (\S+) (\S+)/ ) {
Packit Service 392537
    $host = $1;
Packit Service 392537
    $disk = $2;
Packit Service 392537
    $line =~ /orig-kb (\d+)/;
Packit Service 392537
    $osize{$host}{$disk} = $1;
Packit Service 392537
    $tot_or_size += $osize{$host}{$disk};
Packit Service 392537
    $fail{$host}{$disk} = 0;
Packit Service 392537
    next;
Packit Service 392537
  }
Packit Service 392537
  if ( /^START amflush/ ) {
Packit Service 392537
    $flash_mode = 1;
Packit Service 392537
    next;
Packit Service 392537
  }
Packit Service 392537
  if ( ! /^([A-Z]+) taper \S+ \S+ (\S+) (\S+) (\S+) (\S+) (\S+)/) { next;}
Packit Service 392537
  # $_ = $1;
Packit Service 392537
  if (/PART taper/) {
Packit Service 392537
    if (/^([A-Z]+) taper ("ST:\S+") ("POOL:\S+") (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)/) {
Packit Service 392537
        $storage = $2;
Packit Service 392537
        $pool = $3;
Packit Service 392537
        $label = $4;
Packit Service 392537
        $filenum = $5;
Packit Service 392537
        $host = $6;
Packit Service 392537
        $disk = $7;
Packit Service 392537
        $date = $8;
Packit Service 392537
        $chunk = $9;
Packit Service 392537
        $level = $10;
Packit Service 392537
	$labels{$storage}{$pool}{$host}{$disk}{$date} = $label;
Packit Service 392537
    } else {
Packit Service 392537
        /^([A-Z]+) taper (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)/;
Packit Service 392537
        $label = $2;
Packit Service 392537
        $filenum = $3;
Packit Service 392537
        $host = $4;
Packit Service 392537
        $disk = $5;
Packit Service 392537
        $date = $6;
Packit Service 392537
        $chunk = $7;
Packit Service 392537
        $level = $8;
Packit Service 392537
    }
Packit Service 392537
    if ($filenum != $filenumber) {
Packit Service 392537
      # This should not be possible */
Packit Service 392537
      $filenumber = $filenum;
Packit Service 392537
    }
Packit Service 392537
  } elsif (/START taper/) {
Packit Service 392537
    if (/^([A-Z]+) taper (\S+) (\S+) ("ST:\S+") ("POOL:\S+") (\S+) (\S+) (\S+)/) {
Packit Service 392537
        $date = $3;
Packit Service 392537
        $storage = $4;
Packit Service 392537
        $pool = $5;
Packit Service 392537
        $label = $7;
Packit Service 392537
        $level = $7;
Packit Service 392537
    } else {
Packit Service 392537
        /^([A-Z]+) taper (\S+) (\S+) (\S+) (\S+) (\S+)/;
Packit Service 392537
        $date = $3;
Packit Service 392537
        $label = $4;
Packit Service 392537
        $level = $5;
Packit Service 392537
    }
Packit Service 392537
  } else {
Packit Service 392537
    if (/^([A-Z]+) taper ("ST:\S+") ("POOL:\S+") (\S+) (\S+) (\S+) (\S+) (\S+)/) {
Packit Service 392537
        $storage = $2;
Packit Service 392537
        $pool = $3;
Packit Service 392537
        $host = $4;
Packit Service 392537
        $disk = $5;
Packit Service 392537
        $date = $6;
Packit Service 392537
        $chunk = $7;
Packit Service 392537
        $level = $8;
Packit Service 392537
	$label = $labels{$storage}{$pool}{$host}{$disk}{$date};
Packit Service 392537
    } else {
Packit Service 392537
        /^([A-Z]+) taper (\S+) (\S+) (\S+) (\S+) (\S+)/;
Packit Service 392537
        $host = $2;
Packit Service 392537
        $disk = $3;
Packit Service 392537
        $date = $4;
Packit Service 392537
        $chunk = $5;
Packit Service 392537
        $level = $6;
Packit Service 392537
    }
Packit Service 392537
  }
Packit Service 392537
  switch: {
Packit Service 392537
    /START taper/ && do {
Packit Service 392537
      $tocfilename=&tfn($label) if ($#subs >= 0);
Packit Service 392537
      if (!$tocfilename || ($tocfilename eq '-')) {$OF=*STDOUT;}
Packit Service 392537
      else {
Packit Service 392537
          die ("Cannot open tocfile $tocfilename") unless open($OF,">$tocfilename");
Packit Service 392537
        }
Packit Service 392537
Packit Service 392537
	print $OF "\f" if ($vwspace && $filenumber);
Packit Service 392537
	if (defined($info)) {
Packit Service 392537
	  print $OF "AMANDA: To restore:\n";
Packit Service 392537
	  print $OF "    position tape at start of file and run:\n";
Packit Service 392537
	  print $OF "        dd if=<tape> bs=32k skip=1 [ | zcat ] | restore -...f\n";
Packit Service 392537
	  print $OF "    or run: amrestore -p <tape> [host [partition]] | restore -...f\n";
Packit Service 392537
	  print $OF "\n";
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
Packit Service 392537
Packit Service 392537
      $filenumber=0;
Packit Service 392537
#      &pr("#","Server","/partition","date", "level","size[Kb]","part");
Packit Service 392537
#      &pr("$filenumber","$label","","$date","-","-","-");
Packit Service 392537
      $dates{$label} = $date;
Packit Service 392537
      last switch; };
Packit Service 392537
    /^(?:SUCCESS|CHUNK|PART|DONE) taper/ && do {
Packit Service 392537
      if(/SUCCESS/){
Packit Service 392537
	$level = $chunk;
Packit Service 392537
	$chunk = "-";
Packit Service 392537
      }
Packit Service 392537
      $filenum = $filenumber;
Packit Service 392537
      if (/DONE/) {
Packit Service 392537
	$chunk = "-";
Packit Service 392537
	$filenumber--;
Packit Service 392537
	$filenum = " ";
Packit Service 392537
      }
Packit Service 392537
      my $mysize = 0;
Packit Service 392537
      if(/ kb (\d+) /){
Packit Service 392537
	$mysize = $1;
Packit Service 392537
      } elsif(/ bytes (\d+) /){
Packit Service 392537
	$mysize = int($1/1024);
Packit Service 392537
      }
Packit Service 392537
      if ( $fail{$host}{$disk} ) {
Packit Service 392537
	my @line = ($filenum, $host, $disk, $date, $level, "FAIL", $chunk);
Packit Service 392537
	push @{$lines{$label}}, \@line;
Packit Service 392537
      } else {
Packit Service 392537
	if (defined($flash_mode)) {
Packit Service 392537
	  my @line = ($filenum, $host, $disk, $date, $level, "$mysize", $chunk);
Packit Service 392537
	  push @{$lines{$label}}, \@line;
Packit Service 392537
	} else {
Packit Service 392537
	  if (defined($osize{$host}{$disk}) && !/^CHUNK/ && !/^PART/) {
Packit Service 392537
	    my @line = ($filenum, $host, $disk, $date, $level, "$osize{$host}{$disk}", $chunk);
Packit Service 392537
	    push @{$lines{$label}}, \@line;
Packit Service 392537
	  } else {
Packit Service 392537
	    $note = "";
Packit Service 392537
	    if(!/^CHUNK/ && !/^PART/){
Packit Service 392537
		# this case should never happend: 
Packit Service 392537
	    } else {
Packit Service 392537
	      $note = "*";
Packit Service 392537
	    }
Packit Service 392537
	    my @line = ($filenum, $host, $disk, $date, $level, "$note$mysize", $chunk);
Packit Service 392537
	    push @{$lines{$label}}, \@line;
Packit Service 392537
	  }
Packit Service 392537
	}
Packit Service 392537
      }
Packit Service 392537
      last switch;};
Packit Service 392537
    /INFO taper retrying/ && do {
Packit Service 392537
      --$filenumber;
Packit Service 392537
      last switch; };
Packit Service 392537
    /INFO taper tape (\S+) .* \[OK\]/ && do {
Packit Service 392537
      $label = $1;
Packit Service 392537
      $line =~ / kb (\d+) /;
Packit Service 392537
      $size = $1;
Packit Service 392537
      $line =~ / fm (\d+) /;
Packit Service 392537
      my @line = ($1, "total", "on_tape", "-", "-", "$size", "-");
Packit Service 392537
      push @{$lines{$label}}, \@line;
Packit Service 392537
      last switch; };
Packit Service 392537
    /FAIL taper/ && do { next; };
Packit Service 392537
  }
Packit Service 392537
  $filenumber += 1;
Packit Service 392537
}
Packit Service 392537
close $IF;
Packit Service 392537
Packit Service 392537
foreach my $label (sort keys %lines) {
Packit Service 392537
    $tocfilename=&tfn($label) if ($#subs >= 0);
Packit Service 392537
    if (!$tocfilename || ($tocfilename eq '-')) {$OF=*STDOUT;}
Packit Service 392537
    else {
Packit Service 392537
        die ("Cannot open tocfile $tocfilename") unless open($OF,">$tocfilename");
Packit Service 392537
    }
Packit Service 392537
    my $ofh = select($OF);
Packit Service 392537
    $~ = "OF";
Packit Service 392537
    select($ofh);
Packit Service 392537
Packit Service 392537
    print $OF "\f" if $vwspace;
Packit Service 392537
    pr("#","Server","/partition","date", "level","size[Kb]","part");
Packit Service 392537
    pr("0","$label","","$dates{$label}","-","-","-");
Packit Service 392537
    foreach my $line (@{$lines{$label}}) {
Packit Service 392537
	&pr(@{$line});
Packit Service 392537
    }
Packit Service 392537
Packit Service 392537
    print "\n\n" if ($vwspace);
Packit Service 392537
    if ($tocfilename && $tocfilename ne '-') {
Packit Service 392537
        close $OF;
Packit Service 392537
    }
Packit Service 392537
}
Packit Service 392537
#if (defined($flash_mode)) {
Packit Service 392537
#    pr("-","total","origin","-","not","available","-");
Packit Service 392537
#} else {
Packit Service 392537
#    pr("-","total","origin","-","-","$tot_or_size","-");
Packit Service 392537
#}
Packit Service 392537
Packit Service 392537
Packit Service 392537
format OF =
Packit Service 392537
@>>  @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @>> @>>>>>>>>
Packit Service 392537
$fnbr,$hstprt,$dt,$lvl,$sz
Packit Service 392537
.
Packit Service 392537
Packit Service 392537
format STDOUT =
Packit Service 392537
@>>  @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @>> @>>>>>>>> @>>>
Packit Service 392537
$fnbr,$hstprt,$dt,$lvl,$sz,$ch
Packit Service 392537
.
Packit Service 392537