From d1f7939db550dc921de07ef825d1297794c52f1e Mon Sep 17 00:00:00 2001
From: Hal Simpson <hasimpson@usgs.gov>
Date: Wed, 9 Dec 2015 17:23:58 -0700
Subject: [PATCH] Changed from subprocess.check_output to subprocess.Popen, 
 that allows us to retrieve error messages. Also Added a while loop, to use
 all servers passed in,  instead of just the first one.  Finally, added some
 error logging,  and some data logging.

---
 geomagio/imfv283/GOESIMFV283Factory.py | 35 ++++++++++++++++++++------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/geomagio/imfv283/GOESIMFV283Factory.py b/geomagio/imfv283/GOESIMFV283Factory.py
index de090de23..a3facbf39 100644
--- a/geomagio/imfv283/GOESIMFV283Factory.py
+++ b/geomagio/imfv283/GOESIMFV283Factory.py
@@ -46,9 +46,11 @@ class GOESIMFV283Factory(IMFV283Factory):
         self.directory = directory
         self.getdcpmessages = getdcpmessages
         self.server = server
+        self.maxserver = len(self.server)
         self.user = user
         self.log_file_name = self.observatory + '.log'
         self.criteria_file_name = self.observatory + '.sc'
+        self.javaerror = 'java.io.IOException: Socket closed'
 
     def get_timeseries(self, starttime, endtime, observatory=None,
             channels=None, type=None, interval=None):
@@ -66,6 +68,11 @@ class GOESIMFV283Factory(IMFV283Factory):
         timeseries.merge()
         # trim to requested start/end time
         timeseries.trim(starttime, endtime)
+        # output the number of points we read for logging
+        if len(timeseries):
+            print "Read %s points from %s" % \
+                (timeseries[0].stats.npts, observatory)
+
         self._post_process(timeseries)
         if observatory is not None:
             timeseries = timeseries.select(station=observatory)
@@ -103,14 +110,26 @@ class GOESIMFV283Factory(IMFV283Factory):
             Messages from getDcpMessages
         """
         self._fill_criteria_file(starttime, endtime)
-        output = subprocess.check_output(
-                [self.getdcpmessages,
-                '-h ' + self.server[0],
-                '-u ' + self.user,
-                '-f ' + self.directory + '/' + self.criteria_file_name,
-                '-l ' + self.directory + '/' + self.log_file_name,
-                '-t 60',
-                '-n'])
+        currentserver = 0
+
+        while (currentserver < self.maxserver):
+            print self.server[currentserver]
+            proc = subprocess.Popen(
+                    [self.getdcpmessages,
+                    '-h ' + self.server[currentserver],
+                    '-u ' + self.user,
+                    '-f ' + self.directory + '/' + self.criteria_file_name,
+                    '-t 60',
+                    '-n'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+            (output, error) = proc.communicate()
+            print error
+            if error.find(self.javaerror) >= 0:
+                print 'Error: could not connect to %s' % \
+                        self.server[currentserver]
+                currentserver += 1
+                continue
+            break
+
         return output
 
     def _fill_criteria_file(self, starttime, endtime):
-- 
GitLab