Index: trunk/ippScripts/scripts/ipp_cleanup.pl
===================================================================
--- trunk/ippScripts/scripts/ipp_cleanup.pl	(revision 18158)
+++ trunk/ippScripts/scripts/ipp_cleanup.pl	(revision 18359)
@@ -9,8 +9,10 @@
 use warnings;
 use strict;
+use Carp;
 
 use IPC::Cmd 0.36 qw( can_run run );
 use File::Spec;
-use PS::IPP::Config;
+use PS::IPP::Config 1.01 qw( :standard );
+use PS::IPP::Metadata::List qw( parse_md_list );
 use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );
 use Pod::Usage qw( pod2usage );
@@ -19,32 +21,30 @@
 
 # Parse the command-line arguments
-my ($stage, $camera, $class_id, $mode, $path_base, $dbname, $no_op, $help);
+my ($stage, $camera, $stage_id, $mode, $path_base, $dbname, $verbose, $no_op, $helplist);
 GetOptions('stage=s'        => \$stage,     # which analysis stage to clean?
 	   'camera|i=s'     => \$camera,    # user-supplied camera name
-	   'class_id=s'     => \$class_id,  # class_id (only needed for certain stages)
+	   'stage_id=s'     => \$stage_id,  # id for this stage (only needed for certain stages)
 	   'mode|m=s'       => \$mode,      # cleanup mode (clean / purge)
 	   'path_base=s'    => \$path_base, # basename for files
 	   'dbname|d=s'     => \$dbname,    # Database name
+           'verbose'        => \$verbose,   # Print to stdout
 	   'no-op'          => \$no_op,     # pretend but don't actually inject
-	   'help'           => \$help       # give help listing
+	   'helplist'       => \$helplist   # give help listing
 	   ) or pod2usage( 2 );
 
 pod2usage( -msg => "remove temporary / all data files for an IPP analysis stage", 
-	   -exitval => 2) if 
-    defined $help;
+	   -exitval => 2) if defined $helplist;
 
-pod2usage( -msg => "Usage: $0 --camera (name) [--class_id class_id] --stage (stage) --mode (mode) --path_base (path) [--dbname dbname] [--no-op] [--help]", 
-	   -exitval => 2 ) if 
-    scalar @ARGV == 0;
+pod2usage( -msg => "Usage: $0 --camera (name) --stage (stage) --stage_id (stage_id) --mode (mode) [--path_base (path)] [--dbname dbname] [--no-op] [--help]", 
+	   -exitval => 2 ) if scalar @ARGV;
 
-pod2usage( -msg => "Required options:--camera (name) --stage (stage) --mode (mode) --path_base (path)",
+pod2usage( -msg => "Required options:--camera (name) --stage (stage) --mode (mode)",
 	   -exitval => 3) unless 
     defined $camera and
     defined $stage and
-    defined $mode and
-    defined $path_base;
+    defined $mode;
 
-# $mode must be one of "clean" or "purge"
-unless (($mode eq "clean") || ($mode eq "purge")) {
+# $mode must be one of "goto_cleaned" or "goto_purged"
+unless (($mode eq "goto_cleaned") || ($mode eq "goto_purged")) {
     die "invalid cleanup mode $mode\n";    
 }
@@ -52,30 +52,92 @@
 $ipprc->define_camera($camera);
 
-my $found = 0;
-my @files = ();
+my $mdcParser = PS::IPP::Metadata::Config->new; # Parser for metadata config files
+
+my $fault = 0;
 
 # choice of files to delete depends on the stage
 if ($stage eq "chip") {
-    unless defined $class_id die "cleanup for chip stage requires class_id\n";
-    # delete the temporary image datafiles
-    addFilename (\@files, "PPIMAGE.OUTPUT", $path_base, $class_id);
-    addFilename (\@files, "PPIMAGE.OUTPUT.MASK", $path_base, $class_id);
-    addFilename (\@files, "PPIMAGE.OUTPUT.WEIGHT", $path_base, $class_id);
-    addFilename (\@files, "PPIMAGE.CHIP", $path_base, $class_id);
-    addFilename (\@files, "PPIMAGE.CHIP.MASK", $path_base, $class_id);
-    addFilename (\@files, "PPIMAGE.CHIP.WEIGHT", $path_base, $class_id);
-    if ($mode eq "purge") {
-	# additional files to remove for 'purge' mode
-	addFilename (\@files, "PPIMAGE.OUTPUT.FPA1", $path_base, $class_id);
-	addFilename (\@files, "PPIMAGE.OUTPUT.FPA2", $path_base, $class_id);
-	addFilename (\@files, "PPIMAGE.BIN1", $path_base, $class_id);
-	addFilename (\@files, "PPIMAGE.BIN2", $path_base, $class_id);
-	addFilename (\@files, "PPIMAGE.JPEG1", $path_base, $class_id);
-	addFilename (\@files, "PPIMAGE.JPEG", $path_base, $class_id);
-	addFilename (\@files, "PPIMAGE.STATS", $path_base, $class_id);
+    
+    ### select the imfiles for this entry
+
+    # this stage uses 'chiptool'
+    my $chiptool = can_run('chiptool') or die "Can't find chiptool";
+
+    # Get list of component imfiles
+    # XXX may need a different my_die for each stage
+    my $imfiles;                      # Array of component files
+    my $command = "$chiptool -pendingcleanupimfile -chip_id $stage_id"; # Command to run
+    $command .= " -dbname $dbname" if defined $dbname;
+    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = run(command => $command, verbose => $verbose);
+    unless ($success) {
+        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
+        &my_die("Unable to perform chiptool: $error_code", "chip", $stage_id, $error_code);
     }
-    delete_files (\@files);
-    
-    # need to run command "chiptool -donecleanup"
+    my $metadata = $mdcParser->parse(join "", @$stdout_buf) or
+        &my_die("Unable to parse metadata config doc", "chip", $stage_id, $PS_EXIT_PROG_ERROR);
+
+    # extract the metadata for the files into a hash list
+    $imfiles = parse_md_list($metadata) or
+        &my_die("Unable to parse metadata list", "chip", $stage_id, $PS_EXIT_PROG_ERROR);
+
+    # loop over all of the imfiles, determine the path_base and class_id for each
+    foreach my $imfile (@$imfiles) {
+	my $class_id = $imfile->{class_id};
+	my $path_base = $imfile->{path_base};
+
+	# array of actual filenames to delete
+	my @files = ();
+
+	# delete the temporary image datafiles
+	addFilename (\@files, "PPIMAGE.OUTPUT", $path_base, $class_id);
+	addFilename (\@files, "PPIMAGE.OUTPUT.MASK", $path_base, $class_id);
+	addFilename (\@files, "PPIMAGE.OUTPUT.WEIGHT", $path_base, $class_id);
+	addFilename (\@files, "PPIMAGE.CHIP", $path_base, $class_id);
+	addFilename (\@files, "PPIMAGE.CHIP.MASK", $path_base, $class_id);
+	addFilename (\@files, "PPIMAGE.CHIP.WEIGHT", $path_base, $class_id);
+	if ($mode eq "goto_purged") {
+	    # additional files to remove for 'purge' mode
+	    addFilename (\@files, "PPIMAGE.OUTPUT.FPA1", $path_base, $class_id);
+	    addFilename (\@files, "PPIMAGE.OUTPUT.FPA2", $path_base, $class_id);
+	    addFilename (\@files, "PPIMAGE.BIN1", $path_base, $class_id);
+	    addFilename (\@files, "PPIMAGE.BIN2", $path_base, $class_id);
+	    addFilename (\@files, "PPIMAGE.JPEG1", $path_base, $class_id);
+	    addFilename (\@files, "PPIMAGE.JPEG", $path_base, $class_id);
+	    addFilename (\@files, "PPIMAGE.STATS", $path_base, $class_id);
+	}
+	
+	# actual command to delete the files
+	my $status = &delete_files (\@files);
+
+	if (! $status)  {
+	    my $command = "$chiptool -updateimfile -chip_id $stage_id -class_id $class_id -code 1"; # Command to run
+	    $command .= " -dbname $dbname" if defined $dbname;
+
+	    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = run(command => $command, verbose => $verbose);
+	    unless ($success) {
+		$error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
+		&my_die("Unable to perform chiptool: $error_code", "chip", $stage_id, $error_code);
+	    }
+	    
+	    $fault = 1;
+	}
+    }
+
+    if (! $fault) {
+	# set the state of the chipRun entry to "cleaned" or "purged" as needed
+	my $command = "$chiptool -updaterun -chip_id $stage_id";
+	if ($mode eq "goto_purged") {
+	    $command .= " -state purged";
+	} else {
+	    $command .= " -state cleaned";
+	}
+	$command .= " -dbname $dbname" if defined $dbname;
+
+	my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = run(command => $command, verbose => $verbose);
+	unless ($success) {
+	    $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
+	    &my_die("Unable to perform chiptool: $error_code", "chip", $stage_id, $error_code);
+	}
+    }
     exit 0;
 }
@@ -86,10 +148,10 @@
 sub delete_files 
 {
-    my @files = shift; # reference to a list of files to unlink
+    my $files = shift; # reference to a list of files to unlink
     
     # this script is, of course, very dangerous.  
     foreach my $file (@$files) {
-	echo "unlinking $file\n";
-	# unlink $file;
+	print STDERR "unlinking $file\n";
+	unlink $file;
     }
     return 1;
@@ -109,3 +171,15 @@
 }
 
+sub my_die
+{
+    my $msg = shift; # Warning message on die
+    my $stage = shift; # Chiptool identifier
+    my $stage_id = shift; # Chiptool identifier
+    my $exit_code = shift; # Exit code to add
+    # outputImage and outroot are globals
+
+    carp($msg);
+    exit $exit_code;
+}
+
 __END__
