[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[master 5/6] iutil: execWithCallback() and execWithPulseProgress() return an object.



The object contains all the products of the exec: return call, stdout and
stderr. The remaining execWith*() methods can migrate to this too one
day. The advantage now is that lvm() and mdadm() in devicelibs/ don't have
to resort to (possibly broken) hacks to get the error message from their
calls.
---
 iutil.py                     |   15 +++++++++------
 storage/dasd.py              |   18 ++++++++++--------
 storage/devicelibs/lvm.py    |   15 +++------------
 storage/devicelibs/mdraid.py |   15 +++------------
 storage/devicelibs/swap.py   |    4 ++--
 storage/formats/fs.py        |   22 +++++++++++-----------
 6 files changed, 38 insertions(+), 51 deletions(-)

diff --git a/iutil.py b/iutil.py
index d026bcf..fb3d6d1 100644
--- a/iutil.py
+++ b/iutil.py
@@ -39,6 +39,12 @@ import logging
 log = logging.getLogger("anaconda")
 program_log = logging.getLogger("program")
 
+class ExecProduct:
+    def __init__(self, rc, stdout, stderr):
+        self.rc = rc
+        self.stdout = stdout
+        self.stderr = stderr
+
 #Python reimplementation of the shell tee process, so we can
 #feed the pipe output into two places at the same time
 class tee(threading.Thread):
@@ -348,14 +354,11 @@ def execWithCallback(command, argv, stdin = None, stdout = None,
         log.critical("exception from waitpid: %s %s" %(e.errno, e.strerror))
 
     closefds()
-    # *shrug*  no clue why this would happen, but hope that things are fine
-    if status is None:
-        return 0
 
+    rc = 1
     if os.WIFEXITED(status):
-        return os.WEXITSTATUS(status)
-
-    return 1
+        rc = os.WEXITSTATUS(status)
+    return ExecProduct(rc, log_output , log_errors)
 
 def _pulseProgressCallback(data, callback_data=None):
     if callback_data:
diff --git a/storage/dasd.py b/storage/dasd.py
index f113cfb..3e8fefe 100644
--- a/storage/dasd.py
+++ b/storage/dasd.py
@@ -168,15 +168,17 @@ class DASD:
 
             try:
                 if intf and self.totalCylinders:
-                    rc = iutil.execWithCallback(self.dasdfmt, arglist,
-                                                stdout=out, stderr=err,
-                                                callback=update,
-                                                callback_data=pw,
-                                                echo=False)
+                    ret = iutil.execWithCallback(self.dasdfmt, arglist,
+                                                 stdout=out, stderr=err,
+                                                 callback=update,
+                                                 callback_data=pw,
+                                                 echo=False)
+                    rc = ret.rc
                 elif intf:
-                    rc = iutil.execWithPulseProgress(self.dasdfmt, arglist,
-                                                     stdout=out, stderr=err,
-                                                     progress=pw)
+                    ret = iutil.execWithPulseProgress(self.dasdfmt, arglist,
+                                                      stdout=out, stderr=err,
+                                                      progress=pw)
+                    rc = ret.rc
                 else:
                     rc = iutil.execWithRedirect(self.dasdfmt, arglist,
                                                 stdout=out, stderr=err)
diff --git a/storage/devicelibs/lvm.py b/storage/devicelibs/lvm.py
index fd74f56..726d209 100644
--- a/storage/devicelibs/lvm.py
+++ b/storage/devicelibs/lvm.py
@@ -159,21 +159,12 @@ def clampSize(size, pesize, roundup=None):
     return long(round(float(size)/float(pesize)) * pesize)
 
 def lvm(args, progress=None):
-    rc = iutil.execWithPulseProgress("lvm", args,
+    ret = iutil.execWithPulseProgress("lvm", args,
                                      stdout = "/dev/tty5",
                                      stderr = "/dev/tty5",
                                      progress=progress)
-    if not rc:
-        return
-
-    try:
-        # grab the last line of program.log and strip off the timestamp
-        msg = open("/tmp/program.log").readlines()[-1]
-        msg = msg.split("program: ", 1)[1].strip()
-    except Exception:
-        msg = ""
-
-    raise LVMError(msg)
+    if ret.rc:
+        raise LVMError(ret.stderr)
 
 def pvcreate(device, progress=None):
     args = ["pvcreate"] + \
diff --git a/storage/devicelibs/mdraid.py b/storage/devicelibs/mdraid.py
index a04965d..851f88f 100644
--- a/storage/devicelibs/mdraid.py
+++ b/storage/devicelibs/mdraid.py
@@ -125,21 +125,12 @@ def get_raid_max_spares(raidlevel, nummembers):
     raise ValueError, "invalid raid level %d" % raidlevel
 
 def mdadm(args, progress=None):
-    rc = iutil.execWithPulseProgress("mdadm", args,
+    ret = iutil.execWithPulseProgress("mdadm", args,
                                      stdout = "/dev/tty5",
                                      stderr = "/dev/tty5",
                                      progress=progress)
-    if not rc:
-        return
-
-    try:
-        # grab the last line of program.log and strip off the timestamp
-        msg = open("/tmp/program.log").readlines()[-1]
-        msg = msg.split("program: ", 1)[1].strip()
-    except Exception:
-        msg = ""
-
-    raise MDRaidError(msg)
+    if ret.rc:
+        raise MDRaidError(ret.stderr)
 
 def mdcreate(device, level, disks, spares=0, metadataVer=None, bitmap=False,
              progress=None):
diff --git a/storage/devicelibs/swap.py b/storage/devicelibs/swap.py
index 92dfe93..ef0f4c2 100644
--- a/storage/devicelibs/swap.py
+++ b/storage/devicelibs/swap.py
@@ -40,12 +40,12 @@ def mkswap(device, label='', progress=None):
         argv.extend(["-L", label])
     argv.append(device)
 
-    rc = iutil.execWithPulseProgress("mkswap", argv,
+    ret = iutil.execWithPulseProgress("mkswap", argv,
                                      stderr = "/dev/tty5",
                                      stdout = "/dev/tty5",
                                      progress=progress)
 
-    if rc:
+    if ret.rc:
         raise SwapError("mkswap failed for '%s'" % device)
 
 def swapon(device, priority=None):
diff --git a/storage/formats/fs.py b/storage/formats/fs.py
index 7377471..7c0b19b 100644
--- a/storage/formats/fs.py
+++ b/storage/formats/fs.py
@@ -357,18 +357,18 @@ class FS(DeviceFormat):
                                     100, pulse = True)
 
         try:
-            rc = iutil.execWithPulseProgress(self.mkfsProg,
-                                             argv,
-                                             stdout="/dev/tty5",
-                                             stderr="/dev/tty5",
-                                             progress=w)
+            ret = iutil.execWithPulseProgress(self.mkfsProg,
+                                              argv,
+                                              stdout="/dev/tty5",
+                                              stderr="/dev/tty5",
+                                              progress=w)
         except Exception as e:
             raise FormatCreateError(e, self.device)
         finally:
             if w:
                 w.pop()
 
-        if rc:
+        if ret.rc:
             raise FormatCreateError("format failed: %s" % rc, self.device)
 
         self.exists = True
@@ -466,7 +466,7 @@ class FS(DeviceFormat):
                                     100, pulse = True)
 
         try:
-            rc = iutil.execWithPulseProgress(self.resizefsProg,
+            ret = iutil.execWithPulseProgress(self.resizefsProg,
                                              self.resizeArgs,
                                              stdout="/dev/tty5",
                                              stderr="/dev/tty5",
@@ -477,7 +477,7 @@ class FS(DeviceFormat):
             if w:
                 w.pop()
 
-        if rc:
+        if ret.rc:
             raise FSResizeError("resize failed: %s" % rc, self.device)
 
         self.doCheck(intf=intf)
@@ -516,7 +516,7 @@ class FS(DeviceFormat):
                                     100, pulse = True)
 
         try:
-            rc = iutil.execWithPulseProgress(self.fsckProg,
+            ret = iutil.execWithPulseProgress(self.fsckProg,
                                              self._getCheckArgs(),
                                              stdout="/dev/tty5",
                                              stderr="/dev/tty5",
@@ -527,11 +527,11 @@ class FS(DeviceFormat):
             if w:
                 w.pop()
 
-        if self._fsckFailed(rc):
+        if self._fsckFailed(ret.rc):
             hdr = _("%(type)s filesystem check failure on %(device)s: ") % \
                     {"type": self.type, "device": self.device}
 
-            msg = self._fsckErrorMessage(rc)
+            msg = self._fsckErrorMessage(ret.rc)
 
             if intf:
                 help = _("Errors like this usually mean there is a problem "
-- 
1.6.6


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]