FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Fedora User

 
 
LinkBack Thread Tools
 
Old 09-30-2010, 02:26 PM
Radek Vykydal
 
Default Make nfsiso work in repo UI for Installation Repo.

Also refactor some mounting fuctions.
---
data/ui/addrepo.glade | 1 +
pyanaconda/image.py | 45 -----------------
pyanaconda/iutil.py | 13 +++++
pyanaconda/iw/task_gui.py | 10 ++++-
pyanaconda/yuminstall.py | 116 ++++++++++++++++++++++++++++++++------------
5 files changed, 107 insertions(+), 78 deletions(-)

diff --git a/data/ui/addrepo.glade b/data/ui/addrepo.glade
index 7a6637e..69cab86 100644
--- a/data/ui/addrepo.glade
+++ b/data/ui/addrepo.glade
@@ -194,6 +194,7 @@
<property name="items" translatable="yes">HTTP/FTP
CD/DVD
NFS
+NFS ISO
Hard Drive</property>
<property name="add_tearoffs">False</property>
<property name="focus_on_click">True</property>
diff --git a/pyanaconda/image.py b/pyanaconda/image.py
index 9341192..84c5511 100644
--- a/pyanaconda/image.py
+++ b/pyanaconda/image.py
@@ -122,51 +122,6 @@ def getMediaId(path):
else:
return None

-# This mounts the directory containing the iso images, and places the
-# mount point in /mnt/isodir.
-def mountDirectory(methodstr, messageWindow):
- if methodstr.startswith("hd:"):
- method = methodstr[3:]
- if method.count(":") == 1:
- (device, path) = method.split(":")
- fstype = "auto"
- else:
- (device, fstype, path) = method.split(":")
-
- if not device.startswith("/dev/") and not device.startswith("UUID=")
- and not device.startswith("LABEL="):
- device = "/dev/%s" % device
- elif methodstr.startswith("nfsiso:"):
- device = methodstr[7:]
- fstype = "nfs"
- else:
- return
-
- # No need to mount it again.
- if os.path.ismount("/mnt/isodir"):
- return
-
- while True:
- try:
- isys.mount(device, "/mnt/isodir", fstype = fstype)
- break
- except SystemError, msg:
- log.error("couldn't mount ISO source directory: %s" % msg)
- ans = messageWindow(_("Couldn't Mount ISO Source"),
- _("An error occurred mounting the source "
- "device %s. This may happen if your ISO "
- "images are located on an advanced storage "
- "device like LVM or RAID, or if there was a "
- "problem mounting a partition. Click exit "
- "to abort the installation.")
- % (device,), type="custom", custom_icon="error",
- custom_buttons=[_("_Exit"), _("_Retry")])
-
- if ans == 0:
- sys.exit(0)
- else:
- continue
-
def mountImage(isodir, tree, discnum, messageWindow, discImages={}):
if os.path.ismount(tree):
raise SystemError, "trying to mount already-mounted iso image!"
diff --git a/pyanaconda/iutil.py b/pyanaconda/iutil.py
index 9a1c142..3aacd12 100644
--- a/pyanaconda/iutil.py
+++ b/pyanaconda/iutil.py
@@ -1074,6 +1074,19 @@ def parseNfsUrl(nfsurl):
host = s[0]
return (options, host, path)

+def parseHdUrl(url):
+ device = '
+ fstype = '
+ path = '
+ if url:
+ s = url.split(":")
+ s.pop(0)
+ if len(s) >= 3:
+ (device, fstype, path) = s[:3]
+ elif len(2) == 2:
+ (device, path) = s
+ return (device, fstype, path)
+
def add_po_path(module, dir):
""" Looks to see what translations are under a given path and tells
the gettext module to use that path as the base dir """
diff --git a/pyanaconda/iw/task_gui.py b/pyanaconda/iw/task_gui.py
index 3a6392e..5da1bd1 100644
--- a/pyanaconda/iw/task_gui.py
+++ b/pyanaconda/iw/task_gui.py
@@ -104,6 +104,7 @@ class RepoEditor:
store.append(["HTTP/FTP", "http", self._applyURL, 0])
store.append(["NFS", "nfs", self._applyNfs, 2])
if repotype == "method":
+ store.append(["NFS ISO", "nfsiso", self._applyNfsIso, 2])
store.append(["CD/DVD", "cdrom", self._applyMedia, 1])
#store.append(["HD", "hd", self._applyHd, 3])

@@ -111,7 +112,8 @@ class RepoEditor:
d = {"http":"http",
"ftp":"http",
"cdrom":"cdrom",
- "nfs":"nfs",
+ "nfsiso":"nfsiso",
+ "nfs:":"nfs",
"hd":"hd"}
for prefix in d:
if url.startswith(prefix):
@@ -245,6 +247,12 @@ class RepoEditor:
self.repo.url = "nfs:%s:%s:%s" % (options,server,path)
return True

+ def _applyNfsIso(self):
+ if not self._applyNfs():
+ return False
+ self.repo.url = "nfsiso" + self.repo.url[3:]
+ return True
+
def _applyHd(self):
return True

diff --git a/pyanaconda/yuminstall.py b/pyanaconda/yuminstall.py
index c94f14c..84e6aca 100644
--- a/pyanaconda/yuminstall.py
+++ b/pyanaconda/yuminstall.py
@@ -234,24 +234,90 @@ class YumRepoSpec(RepoSpec):
self.enabled = yumrepo.enabled
self.mediaid = yumrepo.mediaid

- def mount(self, ayum):
- # TODORV: failure handling
- if self.url.startswith("hd:"):
- if self.url.count(":") == 2:
- (device, path) = self.url[3:].split(":")
- else:
- (device, fstype, path) = self.url[3:].split(":")
+ # TODORV: handle failure (UI, setup attribute)
+ def _umountIsodir(self, ayum):
+ if os.path.ismount(ayum.tree):
+ isys.umount(ayum.tree, removeDir=False)
+ ayum.currentMedia = None
+ if os.path.isdir(ayum.isodir):
+ if os.path.ismount(ayum.isodir):
+ isys.umount(ayum.isodir, removeDir=False)
+ else:
+ os.mkdir(ayum.isodir)
+
+ def _mountUI(self, intf, device, path, fstype, options=None, msg=("","")):
+ title, msg = msg
+ while True:
+ try:
+ isys.mount(device, path, fstype=fstype, options=options)
+ break
+ except SystemError as e:
+ log.error("repository mounting failed: %s" % e)
+ ans = intf.messageWindow(title,
+ "%s
%s" % (msg, e),
+ type="custom", custom_icon="error",
+ custom_buttons=[_("_Exit"), _("_Edit"), _("_Retry")])
+
+ if ans == 0:
+ sys.exit(0)
+ elif ans == 1:
+ self.setup = "failed"
+ self.setup_fail_comment = msg
+ return False
+ else:
+ continue
+ return True

- ayum.isodir = "/mnt/isodir/%s" % path
+ def _mountNfsIso(self, ayum):
+ (opts, server, path) = iutil.parseNfsUrl(self.url)
+ ayum.isodir = "/mnt/isodir"
+ title = _("Couldn't Mount ISO Source")
+ msg = _("An error occurred mounting the ISO source "
+ "on %s.") % server+":"+path
+ return self._mountIso(ayum, server+":"+path,
+ ayum.isodir, "nfs", options=opts,
+ msg=(title, msg))
+
+ def _mountHdIso(self, ayum):
+ (device, fstype, path) = iutil.parseHdUrl(self.url)
+ ayum.isodir = "/mnt/isodir/%s" % path
+ title = _("Couldn't Mount ISO Source")
+ msg = _("An error occurred mounting the source "
+ "device %s. This may happen if your ISO "
+ "images are located on an advanced storage "
+ "device like LVM or RAID, or if there was a "
+ "problem mounting a partition.") % device
+ return self._mountIso(ayum, device, ayum.isodir,
+ fstype or "auto", msg=(title, msg))
+
+ def _mountIso(self, ayum, device, path, fstype, options=None, msg=""):
+ self._umountIsodir(ayum)
+ if not self._mountUI(ayum.anaconda.intf, device, path, fstype, options=options, msg=msg):
+ return False
+ ayum._switchImage(1)
+ ayum.mediagrabber = ayum.mediaHandler
+ return True

- # This takes care of mounting /mnt/isodir first.
- ayum._switchImage(1)
- ayum.mediagrabber = ayum.mediaHandler
+ def _mountNfs(self, ayum, dest):
+ (opts, server, path) = iutil.parseNfsUrl(self.url)
+ title = _("Couldn't Mount Source Tree")
+ msg = _("An error occured mounting the source tree on %s") % server+":"+path
+ return self._mountUI(ayum.anaconda.intf, server+":"+path, dest, "nfs",
+ options=opts, msg=(title, msg))
+ def mount(self, ayum):
+ if self.url.startswith("hd:"):
+ if not self._mountHdIso(ayum):
+ return False
+ self.baseurl = "file://%s" % ayum.tree
elif self.url.startswith("http") or self.url.startswith("ftp:"):
self.baseurl = self.url
elif self.url.startswith("cdrom:"):
# When/if supported (KS, UI), parse device
- if not self.media_device:
+ # nfsiso or hdiso could have been mounted to ayum.tree
+ if ayum.isodir and os.path.ismount(ayum.tree):
+ isys.umount(ayum.tree, removeDir=False)
+ ayum.currentMedia = None
+ if not self.media_device or ayum.isodir:
cdr = scanForMedia(ayum.tree, ayum.anaconda.storage)
if cdr:
self.media_device = cdr
@@ -274,12 +340,8 @@ class YumRepoSpec(RepoSpec):
else:
dest = tempfile.mkdtemp("", self.name.replace(" ", ""), "/mnt")

- (opts, server, path) = iutil.parseNfsUrl(self.url)
- try:
- isys.mount(server+":"+path, dest, "nfs", options=opts)
- except Exception as e:
- log.error("error mounting NFS repo %s: %s" % (self.name, e))
- raise
+ if not self._mountNfs(ayum, dest):
+ return False
self.baseurl = "file://%s" % dest

# This really should be fixed in loader instead but for now see
@@ -288,18 +350,13 @@ class YumRepoSpec(RepoSpec):
if self.type == "method":
images = findIsoImages(ayum.tree, ayum.anaconda.intf.messageWindow)
if images != {}:
- isys.umount(ayum.tree, removeDir=False)
self.url = "nfsiso:%s" % self.url[4:]
- # TODORV - fix properly? SPOT?
- # "nfsiso:" case pasted
- ayum.isodir = "/mnt/isodir"
- ayum._switchImage(1)
- ayum.mediagrabber = ayum.mediaHandler
+ if not self._mountNfsIso(ayum):
+ return False
self.baseurl = "file://%s" % ayum.tree
elif self.url.startswith("nfsiso:"):
- ayum.isodir = "/mnt/isodir"
- ayum._switchImage(1)
- ayum.mediagrabber = ayum.mediaHandler
+ if not self._mountNfsIso(ayum):
+ return False
self.baseurl = "file://%s" % ayum.tree
else:
log.info("repo %s has unsupported url: %s" % (self.name,
@@ -614,11 +671,6 @@ class AnacondaYum(YumSorter):
umountImage(self.tree, self.currentMedia)
self.currentMedia = None

- # mountDirectory checks before doing anything, so it's safe to
- # call this repeatedly.
- mountDirectory(self.anaconda.methodstr,
- self.anaconda.intf.messageWindow)
-
self._discImages = mountImage(self.isodir, self.tree, discnum,
self.anaconda.intf.messageWindow,
discImages=self._discImages)
--
1.7.2

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 10:49 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org