[PATCH] Add progress percentage info to liveinst
Brian C. Lane
bcl at redhat.com
Thu Nov 1 21:26:00 UTC 2012
From: "Brian C. Lane" <bcl at redhat.com>
This adds a thread that uses os.statvfs to monitor the amount data
that has been copied to the destination mountpoints.
---
pyanaconda/packaging/livepayload.py | 37 ++++++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
diff --git a/pyanaconda/packaging/livepayload.py b/pyanaconda/packaging/livepayload.py
index e47f46f..91493de 100644
--- a/pyanaconda/packaging/livepayload.py
+++ b/pyanaconda/packaging/livepayload.py
@@ -31,6 +31,8 @@
"""
import os
import stat
+from time import sleep
+from threading import Lock
from pyanaconda import isys
from . import *
@@ -46,6 +48,7 @@ log = logging.getLogger("anaconda")
from pyanaconda.errors import *
from pyanaconda import progress
from pyanaconda.storage.size import Size
+from pyanaconda.threads import threadMgr, AnacondaThread
import gettext
_ = lambda x: gettext.ldgettext("anaconda", x)
@@ -66,10 +69,34 @@ class LiveImagePayload(ImagePayload):
def preInstall(self, packages=None, groups=None):
""" Perform pre-installation tasks. """
super(LiveImagePayload, self).preInstall(packages=packages, groups=groups)
- progress.send_message(_("Installing software"))
+ progress.send_message(_("Installing software %d%%") % (0,))
+
+ def progress(self):
+ """Monitor the amount of disk space used on the target and source and
+ update the hub's progress bar.
+ """
+ source = os.statvfs(INSTALL_TREE)
+ source_size = source.f_frsize * (source.f_blocks - source.f_bfree)
+ mountpoints = self.storage.mountpoints.copy()
+ while self.pct < 100:
+ dest_size = 0
+ for mnt in mountpoints:
+ mnt_stat = os.statvfs(ROOT_PATH+mnt)
+ dest_size += mnt_stat.f_frsize * (mnt_stat.f_blocks - mnt_stat.f_bfree)
+
+ with self.pct_lock:
+ self.pct = int(100 * dest_size / source_size)
+
+ progress.send_message(_("Installing software %d%%") % (min(100,self.pct),))
+ sleep(0.777)
def install(self):
""" Install the payload. """
+ self.pct_lock = Lock()
+ self.pct = 0
+ threadMgr.add(AnacondaThread(name="AnaLiveProgressThread",
+ target=self.progress))
+
cmd = "rsync"
# preserve: permissions, owners, groups, ACL's, xattrs, times,
# symlinks, hardlinks
@@ -91,8 +118,16 @@ class LiveImagePayload(ImagePayload):
if errorHandler.cb(exn) == ERROR_RAISE:
raise exn
+ # Wait for progress thread to finish
+ with self.pct_lock:
+ self.pct = 100
+ progressThread = threadMgr.get("AnaLiveProgressThread")
+ if progressThread:
+ progressThread.join()
+
def postInstall(self):
""" Perform post-installation tasks. """
+ progress.send_message(_("Performing post-install setup tasks"))
isys.umount(INSTALL_TREE, removeDir=True)
super(LiveImagePayload, self).postInstall()
--
1.7.11.7
More information about the anaconda-patches
mailing list