#!/usr/bin/perl -w use strict; my ($AMADMIN,$CONFIG,$COMMAND,@output,$host,$filesystem,$level,$tape,$status,$lasthost,$lastfilesystem,$neednull,$needone,%tapes); &Init; &Collect; &Report; sub Init { $AMADMIN = "/usr/sbin/amadmin"; $CONFIG = "thuis"; $COMMAND = "$AMADMIN $CONFIG find"; @output = `$COMMAND`; die "Unable to run '$COMMAND'\nPlease run as user 'amanda' or 'root'" if ($?); } sub Collect { while (@output) { my $line = pop(@output); chomp $line; $line =~ s/\s+/ /g; next unless ($line =~ '^20'); ($host,$filesystem,$level,$tape,$status) = (split /\s/,$line)[1,2,3,4,6]; next unless ($status eq "OK"); &PreHouseKeeping; &Select($tape) if Needed(); &PostHouseKeeping; } } sub PreHouseKeeping { die "Unknown level ($level) found\n" unless (LevelOne() or LevelNull()); $lasthost = "" unless defined ($lasthost); ResetLevels() if (NewHost() or NewFilesystem()); } sub LevelNull { if ($level eq "0") { $needone = 0; return 1; } return 0; } sub LevelOne { return 1 if ($level eq "1"); return 0; } sub ResetLevels { $neednull = $needone = 1; } sub NewHost { return 1 if ($lasthost ne $host); return 0; } sub NewFilesystem { return 1 if ($lastfilesystem ne $filesystem); return 0; } sub Select { my $tape = "@_"; $tapes{$tape} = 1; } sub Needed { return 1 if (LevelNull() and $neednull); return 1 if (LevelOne() and $needone); return 0; } sub PostHouseKeeping { $neednull = 0 if LevelNull(); $needone = 0 if LevelOne(); $lasthost = $host; $lastfilesystem = $filesystem; } sub Report { print "Need the following tapes:\n"; foreach (sort keys %tapes) { print "$_\n"; } }