}
}
+#untaint user input $ARGV[0]
+
+if ($conf =~ /^([\w.-]+)$/) { # $1 is untainted
+ $conf = $1;
+} else {
+ die "filename '$conf' has invalid characters.\n";
+}
+
+
if ( ! -d "$confdir/$conf" ) {
die "amstatus$suf: could not find directory $confdir/$conf";
}
+$oldPATH = $ENV{'PATH'};
+$ENV{'PATH'} = "/bin:/usr/bin:/usr/sbin:/sbin"; # force known path
+
$pwd = `pwd`;
chomp $pwd;
chdir "$confdir/$conf";
}
$unit=`$sbindir/amgetconf$suf displayunit`;
+$ENV{'PATH'} = $oldPATH;
chomp($unit);
$unitdivisor=1;
if($unit eq 'K') {
$dump_started{$hostpart}=1;
$dump_time{$hostpart}=$1;
$dump_finished{$hostpart}=0;
- $holding_file{$hostpart}=$5;
if( $level{$hostpart} != $8 &&
$degr_level{$hostpart} == $8) {
$level{$hostpart}=$degr_level{$hostpart};
$dumpers_held[$dumpers_active]={};
}
}
+ elsif(/driver: send-cmd time (\S+) to (chunker\d*): (PORT-WRITE) (\d+-\d+) (\S+) (\S+) (\S+) (\d+)/) {
+ $current_time=$1;
+ $host=$6;
+ $partition=$7;
+ $hostpart=&make_hostpart($host,$partition,$gdatestamp);
+ $serial=$4;
+ $serial{$serial}=$hostpart;
+ #$chunk_started{$hostpart}=1;
+ #$chunk_time{$hostpart}=$1;
+ #$chunk_finished{$hostpart}=0;
+ $holding_file{$hostpart}=$5;
+ }
+ elsif(/driver: send-cmd time (\S+) to (chunker\d*): (PORT-WRITE) (\d+-\d+) (\S+) (\S+) (\S+) (\S+) (\d+)/) {
+ $current_time=$1;
+ $host=$6;
+ $features=$7;
+ $features=$features;
+ $partition=$8;
+ $hostpart=&make_hostpart($host,$partition,$gdatestamp);
+ $serial=$4;
+ $serial{$serial}=$hostpart;
+ #$chunk_started{$hostpart}=1;
+ #$chunk_time{$hostpart}=$1;
+ #$chunk_finished{$hostpart}=0;
+ $holding_file{$hostpart}=$5;
+ }
elsif(/driver: send-cmd time (\S+) to (dumper\d*): (FILE-DUMP|PORT-DUMP) (\d+-\d+) (\S+) (\S+) (\S+) (\S+) (\d+)/) {
$current_time=$1;
$host=$6;
$dumpers_held[$dumpers_active]={};
}
}
- elsif(/driver: send-cmd time (\S+) to (dumper\d*): CONTINUE (\d+-\d+) (\S+) (\d+) (\d+)/) {
+ elsif(/driver: send-cmd time (\S+) to (chunker\d*): CONTINUE (\d+-\d+) (\S+) (\d+) (\d+)/) {
$current_time=$1;
$serial=$3;
$hostpart=$serial{$serial};
$error{$hostpart}="driver: (aborted:$error)";
$dumpers_active--;
}
- elsif(/driver: result time (\S+) from (dumper\d+): DONE (\d+-\d+) (\d+) (\d+) (\d+) \[.*\]/) {
+ elsif(/driver: result time (\S+) from (dumper\d+): (DONE|PARTIAL) (\d+-\d+) (\d+) (\d+) (\d+) \[.*\]/) {
$current_time=$1;
- $serial=$3;
- $origsize=$4 / $unitdivisor;
- $outputsize=$5 / $unitdivisor;
+ $serial=$4;
+ $origsize=$5 / $unitdivisor;
+ $outputsize=$6 / $unitdivisor;
$hostpart=$serial{$serial};
$size{$hostpart}=$outputsize;
$dump_finished{$hostpart}=1;
$dump_time{$hostpart}=$1;
$error{$hostpart}="";
$dumpers_active--;
+ $partial{$hostpart}=1 if $3 eq "PARTIAL" ;
+ }
+ elsif(/driver: result time (\S+) from (chunker\d+): (DONE|PARTIAL) (\d+-\d+) (\d+) \[.*\]/) {
+ $current_time=$1;
+ $serial=$4;
+ $outputsize=$5 / $unitdivisor;
+ $hostpart=$serial{$serial};
+ $size{$hostpart}=$outputsize;
+ $dump_finished{$hostpart}=1;
+ $busy_time{$2}+=($1-$dump_time{$hostpart});
+ $running_dumper{$2} = "0";
+ $dump_time{$hostpart}=$1;
+ $error{$hostpart}="";
+ $partial{$hostpart}=1 if $3 eq "PARTIAL" ;
}
elsif(/driver: result time (\S+) from (dumper\d+): ABORT-FINISHED (\d+-\d+)/) {
$current_time=$1;
$error{$hostpart}="driver: (aborted)";
$dumpers_active--;
}
- elsif(/driver: result time (\S+) from (dumper\d+): RQ-MORE-DISK (\d+-\d+)/) {
+ elsif(/driver: result time (\S+) from (chunker\d+): RQ-MORE-DISK (\d+-\d+)/) {
$current_time=$1;
$serial=$3;
$hostpart=$serial{$serial};
$taper_finished{$hostpart}=0;
$taper_time{$hostpart}=$1;
}
- elsif(/driver: result time (\S+) from taper: DONE (\d+-\d+) (\S+) (\d+) \[sec (\S+) kb (\d+) kps/) {
+ elsif(/driver: result time (\S+) from taper: (DONE|PARTIAL) (\d+-\d+) (\S+) (\d+) \[sec (\S+) kb (\d+) kps/) {
$current_time=$1;
- $serial=$2;
- $label=$3;
- $size=$6 / $unitdivisor;
+ $serial=$3;
+ $label=$4;
+ $size=$7 / $unitdivisor;
$hostpart=$serial{$serial};
$taper_finished{$hostpart}=1;
$busy_time{"taper"}+=($1-$taper_time{$hostpart});
else {
$ntesize{$nb_tape} += $size{$hostpart};
}
+ $partial{$hostpart}=1 if $3 eq "PARTIAL" ;
}
elsif(/driver: result time (\S+) from taper: (TRY-AGAIN|TAPE-ERROR) (\d+-\d+) (.+)/) {
$current_time=$1;
if( defined $starttime ) {
print " (", &showtime($taper_time{$hostpart}), ")";
}
+ print ", PARTIAL" if defined $partial{$hostpart};
print "\n";
}
$tpartition++;
if( defined $starttime ) {
print " (", &showtime($dump_time{$hostpart}), ")";
}
- print ", wait for writing to tape\n";
+ print ", wait for writing to tape";
+ print ", PARTIAL" if defined $partial{$hostpart};
+ print "\n";
}
$dpartition++;
$dsize += $size{$hostpart};
printf "%8s ", $datestamp if defined $opt_date;
printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $size{$hostpart};
- print " waiting to flush\n";
+ print " waiting to flush";
+ print ", PARTIAL" if defined $partial{$hostpart};
+ print "\n";
}
$wfpartition++;
$wfsize += $size{$hostpart};