Index: /tags/ipp-pv3-20140717/ippTools/share/Makefile.am
===================================================================
--- /tags/ipp-pv3-20140717/ippTools/share/Makefile.am	(revision 37282)
+++ /tags/ipp-pv3-20140717/ippTools/share/Makefile.am	(revision 37283)
@@ -509,3 +509,5 @@
 	remotetool_definebyquery_stack.sql \
 	remotetool_dropcomponent.sql \
+	remotetool_listcomponent.sql \
+	remotetool_doneprep.sql \
 	remotetool_updatepoll.sql
Index: /tags/ipp-pv3-20140717/ippTools/src/remotetool.c
===================================================================
--- /tags/ipp-pv3-20140717/ippTools/src/remotetool.c	(revision 37282)
+++ /tags/ipp-pv3-20140717/ippTools/src/remotetool.c	(revision 37283)
@@ -21,4 +21,7 @@
 static bool listrunMode(pxConfig *config);
 static bool listcomponentMode(pxConfig *config);
+
+// list remoteRuns with all remoteComponents in state 'prep_done' or 'prep_fail'
+static bool doneprepMode(pxConfig *config);
 
 // Update
@@ -50,4 +53,5 @@
     MODECASE(REMOTETOOL_MODE_DEFINEBYQUERY,   definebyqueryMode);
     MODECASE(REMOTETOOL_MODE_LISTRUN,         listrunMode);
+    MODECASE(REMOTETOOL_MODE_DONEPREP,         doneprepMode);
     MODECASE(REMOTETOOL_MODE_LISTCOMPONENT,   listcomponentMode);
     MODECASE(REMOTETOOL_MODE_DROPCOMPONENT,   dropcomponentMode);
@@ -281,5 +285,4 @@
   PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-
   psArray *remRuns = NULL;
   remRuns = psDBSelectRows(config->dbh, "remoteRun", where, limit);
@@ -300,15 +303,128 @@
 
   PXOPT_COPY_S64(config->args, where, "-remote_id", "remote_id", "==");
+  PXOPT_COPY_S64(config->args, where, "-stage_id",  "stage_id",  "==");
+  PXOPT_COPY_S64(config->args, where, "-jobs",      "jobs",      "==");
+
+  PXOPT_COPY_STR(config->args, where, "-state", "remoteComponent.state", "==");
+  PXOPT_COPY_STR(config->args, where, "-label", "remoteRun.label", "==");
+
   PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-
-  psArray *remComps = NULL;
-  remComps = psDBSelectRows(config->dbh, "remoteComponent", where, 0);
-
-  if (!ippdbPrintMetadatas(stdout, remComps, "remoteComponent", !simple)) {
+  PXOPT_LOOKUP_S16(limit,   config->args, "-limit",  false, false);
+
+  psString query = pxDataGet("remotetool_listcomponent.sql");
+  if (!query) {
+      psError(PXTOOLS_ERR_SYS,false, "failed to retreive SQL statement");
+      return(false);
+  }
+
+  if (psListLength(where->list)) {
+      psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+      psStringAppend(&query, " WHERE %s", whereClause);
+      psFree(whereClause);
+  }
+  psFree(where);
+
+  if (limit) {
+    psString limitString = psDBGenerateLimitSQL(limit);
+    psStringAppend(&query, " %s", limitString);
+    psFree(limitString);
+  }
+
+  if (!p_psDBRunQuery(config->dbh, query)) {
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      psFree(query);
+      return false;
+  }
+  psFree(query);
+
+  psArray *output = p_psDBFetchResult(config->dbh);
+  if (!output) {
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return false;
+  }
+  if (!psArrayLength(output)) {
+    psTrace("remotetool", PS_LOG_INFO, "no rows found");
+    psFree(output);
+    return true;
+  }
+
+  if (!ippdbPrintMetadatas(stdout, output, "remoteComponent", !simple)) {
     psError(PS_ERR_UNKNOWN, false, "failed to print array");
-    psFree(remComps);
-    return false;
-  }
-  psFree(remComps);
+    psFree(output);
+    return false;
+  }
+  psFree(output);
+
+  return true;
+}
+
+// List
+static bool doneprepMode(pxConfig *config)
+{
+  psMetadata *where = psMetadataAlloc();
+
+  PXOPT_COPY_S64(config->args, where, "-remote_id", "remote_id", "==");
+  PXOPT_COPY_S64(config->args, where, "-job_id", "job_id", "==");
+
+  PXOPT_COPY_STR(config->args, where, "-stage",  "stage",  "==");
+  PXOPT_COPY_STR(config->args, where, "-state", "remoteRun.state", "==");
+  PXOPT_COPY_STR(config->args, where, "-label",  "label",  "==");
+
+  PXOPT_LOOKUP_S16(limit,   config->args, "-limit",  false, false);
+  PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+  psString query = pxDataGet("remotetool_doneprep.sql");
+  if (!query) {
+      psError(PXTOOLS_ERR_SYS,false, "failed to retreive SQL statement");
+      return(false);
+  }
+
+  psString whereDone = NULL;
+  psString whereJobs = NULL;
+  if (psListLength(where->list)) {
+      psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+      psStringAppend(&whereDone, " \n AND %s", whereClause);
+      psStringAppend(&whereJobs, " \n WHERE %s", whereClause);
+      psFree(whereClause);
+  }
+
+  if (limit) {
+    psString limitString = psDBGenerateLimitSQL(limit);
+    psStringAppend(&query, " %s", limitString);
+    psFree(limitString);
+  }
+
+  // fprintf (stderr, "query: %s\n", query);
+  // fprintf (stderr, "whereDone: %s\n", whereDone);
+  // fprintf (stderr, "whereJobs: %s\n", whereJobs);
+
+  if (!p_psDBRunQueryF(config->dbh, query, whereDone, whereJobs)) {
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      psFree(whereDone);
+      psFree(whereJobs);
+      psFree(query);
+      return false;
+  }
+  psFree(whereDone);
+  psFree(whereJobs);
+  psFree(query);
+
+  psArray *output = p_psDBFetchResult(config->dbh);
+  if (!output) {
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return false;
+  }
+  if (!psArrayLength(output)) {
+    psTrace("remotetool", PS_LOG_INFO, "no rows found");
+    psFree(output);
+    return true;
+  }
+
+  if (!ippdbPrintMetadatas(stdout, output, "remoteRun", !simple)) {
+    psError(PS_ERR_UNKNOWN, false, "failed to print array");
+    psFree(output);
+    return false;
+  }
+  psFree(output);
 
   return true;
Index: /tags/ipp-pv3-20140717/ippTools/src/remotetool.h
===================================================================
--- /tags/ipp-pv3-20140717/ippTools/src/remotetool.h	(revision 37282)
+++ /tags/ipp-pv3-20140717/ippTools/src/remotetool.h	(revision 37283)
@@ -12,4 +12,5 @@
   REMOTETOOL_MODE_DEFINEBYQUERY,
   REMOTETOOL_MODE_LISTRUN,
+  REMOTETOOL_MODE_DONEPREP,
   REMOTETOOL_MODE_LISTCOMPONENT,
   REMOTETOOL_MODE_DROPCOMPONENT,
@@ -17,6 +18,6 @@
   REMOTETOOL_MODE_UPDATEPOLL,
   REMOTETOOL_MODE_UPDATECOMPONENT,
-  REMOTETOOL_MODE_REVERTRUN,    
-  REMOTETOOL_MODE_REVERTAUTH,   
+  REMOTETOOL_MODE_REVERTRUN,
+  REMOTETOOL_MODE_REVERTAUTH,
 } remotetoolMode;
 
Index: /tags/ipp-pv3-20140717/ippTools/src/remotetoolConfig.c
===================================================================
--- /tags/ipp-pv3-20140717/ippTools/src/remotetoolConfig.c	(revision 37282)
+++ /tags/ipp-pv3-20140717/ippTools/src/remotetoolConfig.c	(revision 37283)
@@ -40,5 +40,5 @@
   ADD_OPT(Bool, definebyqueryArgs, "-pretend",       "pretend to do this.", 0);
   ADD_OPT(Bool, definebyqueryArgs,"-simple",         "simple print format",0);
-  
+
   // -listrun
   psMetadata *listrunArgs = psMetadataAlloc();
@@ -59,9 +59,24 @@
   ADD_OPT(S16, listrunArgs,  "-limit",             "limit to number of runs to display", 0);
 
+  // -doneprep
+  psMetadata *doneprepArgs = psMetadataAlloc();
+  ADD_OPT(S64, doneprepArgs, "-remote_id",          "run to list", 0);
+  ADD_OPT(S64, doneprepArgs, "-job_id",             "job_id", 0);
+  ADD_OPT(Str, doneprepArgs, "-stage",              "stage to return", NULL);
+  ADD_OPT(Str, doneprepArgs, "-state",              "state to return", NULL);
+  ADD_OPT(Str, doneprepArgs, "-label",              "remRun label to use", NULL);
+
+  ADD_OPT(Bool, doneprepArgs, "-simple",            "simple print format", false);
+  ADD_OPT(S16, doneprepArgs,  "-limit",             "limit to number of runs to display", 0);
+
   // -listcomponents
-  psMetadata *listcomponentArgs = psMetadataAlloc();
-  ADD_OPT(S64, listcomponentArgs, "-remote_id",             "run to list", 0);
-  ADD_OPT(S16, listcomponentArgs, "-limit",              "limit to number of runs to display", 0);
+  psMetadata   *listcomponentArgs = psMetadataAlloc();
+  ADD_OPT(S64,  listcomponentArgs, "-remote_id",         "run to list", 0);
+  ADD_OPT(S64,  listcomponentArgs, "-stage_id",          "run to list", 0);
+  ADD_OPT(S32,  listcomponentArgs, "-jobs",              "run to list", 0);
+  ADD_OPT(Str,  listcomponentArgs, "-state",             "run to list", NULL);
+  ADD_OPT(S16,  listcomponentArgs, "-limit",             "limit to number of runs to display", 0);
   ADD_OPT(Bool, listcomponentArgs, "-simple",            "simple print format", false);
+  ADD_OPT(Str,  listcomponentArgs, "-label",             "label to use", NULL);
 
   // -dropcomponent
@@ -69,5 +84,5 @@
   ADD_OPT(S64, dropcomponentArgs, "-remote_id",         "run to update", 0);
   ADD_OPT(S64, dropcomponentArgs, "-stage_id",          "stage_id to remote", 0);
-  
+
   // -updaterun
   psMetadata *updaterunArgs = psMetadataAlloc();
@@ -83,5 +98,5 @@
   psMetadata *updatepollArgs = psMetadataAlloc();
   ADD_OPT(S64, updatepollArgs, "-remote_id",            "run to update", 0);
-  
+
   // -updatecomponent
   psMetadata  *updatecomponentArgs = psMetadataAlloc();
@@ -97,5 +112,5 @@
   ADD_OPT(Str, revertrunArgs, "-label",      "remRun label to use", NULL);
   ADD_OPT(S16, revertrunArgs, "-fault",              "fault code", 0);
-  
+
   // -revertauth
   psMetadata *revertauthArgs = psMetadataAlloc();
@@ -108,4 +123,5 @@
   PXOPT_ADD_MODE("-definebyquery",     "", REMOTETOOL_MODE_DEFINEBYQUERY,   definebyqueryArgs);
   PXOPT_ADD_MODE("-listrun",           "", REMOTETOOL_MODE_LISTRUN,         listrunArgs);
+  PXOPT_ADD_MODE("-doneprep",          "", REMOTETOOL_MODE_DONEPREP,        doneprepArgs);
   PXOPT_ADD_MODE("-listcomponent",     "", REMOTETOOL_MODE_LISTCOMPONENT,   listcomponentArgs);
   PXOPT_ADD_MODE("-dropcomponent",     "", REMOTETOOL_MODE_DROPCOMPONENT,   dropcomponentArgs);
