summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2009-02-06 10:50:14 +0100
committerHans de Goede <hdegoede@redhat.com>2009-02-11 12:08:25 +0100
commit78ca394478575bc2dfda5a8e107c90254ee39b11 (patch)
treea7ade2ec15da4cc323ddc672d2caf08b3ed6f335
parente7745f5d452aca7c1d55b343b1ea705c5db47508 (diff)
downloadanaconda-78ca394478575bc2dfda5a8e107c90254ee39b11.tar.gz
anaconda-78ca394478575bc2dfda5a8e107c90254ee39b11.tar.xz
anaconda-78ca394478575bc2dfda5a8e107c90254ee39b11.zip
Rewrite iscsi code using libiscsi
This patch replaces the iscsi.py code with new code using libiscsi, getting rid of the awefull configfile mangling to set auth info hack, and in general making it much cleaner. Fixes: -Report error when we cannot add a disk instead of silently failing (461830) -Report error when trying to use iscsi from kickstart without having an iscsiname directive first (463156) -Better feedback while scanning iscsi disks -Make ibft work with chap and 2-way chap -Make ibft configured disks available for upgrades and in rescue mode -Make ibft boot work even when iscsi-initiator-utils is installed after the kernel in the transaction Note: libiscsi is available in Fedora now
-rw-r--r--backend.py12
-rw-r--r--iscsi.py522
-rw-r--r--iw/autopart_type.py7
-rw-r--r--kickstart.py3
-rw-r--r--partitions.py3
-rw-r--r--rescue.py1
-rwxr-xr-xscripts/upd-instroot2
-rw-r--r--textw/partition_text.py2
-rw-r--r--upgrade.py3
9 files changed, 150 insertions, 405 deletions
diff --git a/backend.py b/backend.py
index 300867146..e8bcf4f5c 100644
--- a/backend.py
+++ b/backend.py
@@ -79,9 +79,21 @@ class AnacondaBackend:
log.error("Could not copy firmware file %s: %s" % (f, e.strerror))
def doPostInstall(self, anaconda):
+ has_iscsi_disk = False
+
+ # See if we have an iscsi disk. If we do we rerun mkinitrd, as
+ # the initrd might need iscsi-initiator-utils, and chances are
+ # it was not installed yet the first time mkinitrd was run, as
+ # mkinitrd does not require it.
+ for disk in anaconda.id.diskset.disks.keys():
+ if isys.driveIsIscsi(disk):
+ has_iscsi_disk = True
+ break
+
if anaconda.id.extraModules:
self.copyFirmware(anaconda)
+ if anaconda.id.extraModules or has_iscsi_disk:
for (n, arch, tag) in self.kernelVersionList(anaconda.rootPath):
packages.recreateInitrd(n, anaconda.rootPath)
diff --git a/iscsi.py b/iscsi.py
index a4d301e9e..fbd33c390 100644
--- a/iscsi.py
+++ b/iscsi.py
@@ -36,6 +36,11 @@ log = logging.getLogger("anaconda")
import gettext
_ = lambda x: gettext.ldgettext("anaconda", x)
+has_libiscsi = True
+try:
+ import libiscsi
+except:
+ has_libiscsi = False
# Note that stage2 copies all files under /sbin to /usr/sbin
global ISCSID
@@ -43,7 +48,6 @@ ISCSID=""
global ISCSIADM
ISCSIADM = ""
INITIATOR_FILE="/etc/iscsi/initiatorname.iscsi"
-ISCSID_CONF="/etc/iscsi/iscsid.conf"
def find_iscsi_files():
global ISCSID
@@ -61,7 +65,7 @@ def find_iscsi_files():
def has_iscsi():
find_iscsi_files()
- if ISCSID == "" or ISCSIADM == "":
+ if ISCSID == "" or ISCSIADM == "" or not has_libiscsi:
return False
log.info("ISCSID is %s" % (ISCSID,))
@@ -83,6 +87,7 @@ def iscsi_get_node_record(node_settings, record):
return None
+# FIXME replace with libiscsi use
def iscsi_make_node_autostart(disk):
sysfs_path = os.path.realpath("/sys/block/%s/device" %(disk,))
argv = [ "-m", "session", "-r", sysfs_path ]
@@ -95,119 +100,6 @@ def iscsi_make_node_autostart(disk):
iutil.execWithRedirect(ISCSIADM, argv,
stdout = "/dev/tty5", stderr="/dev/tty5")
-class iscsiTarget:
- def __init__(self, ipaddr, port=None, user=None, pw=None,
- user_in=None, pw_in=None):
- # FIXME: validate ipaddr
- self.ipaddr = ipaddr
- if not port: # FIXME: hack hack hack
- port = 3260
- self.port = str(port)
- self.user = user
- self.password = pw
- self.user_in = user_in
- self.password_in = pw_in
- self._portal = None
- self._nodes = []
-
- find_iscsi_files()
-
- def _getPortal(self):
- if self._portal is None:
- argv = [ "-m", "discovery", "-t", "st", "-p", self.ipaddr ]
- log.debug("iscsiadm %s" %(string.join(argv),))
- records = iutil.execWithCapture(ISCSIADM, argv, stderr="/dev/tty5")
- records = records.strip()
- for line in records.split("\n"):
- log.debug(" %s" % (line,))
- if not line or line.find("found!") != -1:
- log.warn("no record found!")
- continue
- pnlist = line.split()
- if len(pnlist) != 2:
- log.warn("didn't get what we expected from iscsiadm")
- continue
- (portal, node) = pnlist
- if portal.startswith(self.ipaddr):
- self._portal = portal
- self._nodes.append(node)
- return self._portal
- portal = property(_getPortal)
-
- def _getNode(self):
- if len(self._nodes) == 0:
- # _getPortal() fills the list, if possible.
- self._getPortal()
- return self._nodes
- nodes = property(_getNode)
-
- def discover(self):
- argv = [ "-m", "discovery", "-t", "st", "-p",
- "%s:%s" % (self.ipaddr, self.port) ]
- log.debug("iscsiadm %s" %(string.join(argv),))
- rc = iutil.execWithRedirect(ISCSIADM, argv,
- stdout = "/dev/tty5", stderr="/dev/tty5")
- if rc != 0:
- log.warn("iscsiadm failed to discover on %s" %(self.ipaddr,))
- return False
- return True
-
- def addNode(self, node):
- if node is None or self.portal is None:
- log.warn("unable to find portal information")
- return
-
- argv = [ "-m", "node", "-T", node, "-p", self.portal,
- "-o", "new" ]
- log.debug("iscsiadm %s" %(string.join(argv),))
- iutil.execWithRedirect(ISCSIADM, argv,
- stdout = "/dev/tty5", stderr="/dev/tty5")
-
- def loginToNode(self, node):
- if node is None or self.portal is None:
- log.warn("unable to find portal information")
- return
-
- argv = [ "-m", "node", "-T", node, "-p", self.portal, "--login" ]
- log.debug("iscsiadm %s" %(string.join(argv),))
- rc = iutil.execWithRedirect(ISCSIADM, argv,
- stdout = "/dev/tty5", stderr="/dev/tty5")
- if rc != 0:
- log.warn("iscsiadm failed to login to %s" %(self.ipaddr,))
- return False
- return True
-
- def login(self):
- if len(self.nodes) == 0 or self.portal is None:
- log.warn("unable to find portal information")
- return False
-
-
- ret = False
- for node in self.nodes:
- if self.loginToNode(node):
- ret = True
- self.addNode(node)
-
- # Wait for udev to create the devices for the just added disks
- if ret:
- # It is possible when we get here the events for the new devices
- # are not send yet, so sleep to make sure the events are fired
- time.sleep(1)
- iutil.execWithRedirect("/sbin/udevadm", [ "settle" ],
- stdout = "/dev/tty5", stderr="/dev/tty5")
-
- # we return True if there were any successful logins for our portal.
- return ret
-
- def logout(self):
- for node in self.nodes:
- argv = [ "-m", "node", "-T", node, "-p", self.portal, "--logout" ]
- log.debug("iscsiadm %s" %(string.join(argv),))
- rc = iutil.execWithRedirect(ISCSIADM, argv,
- stdout = "/dev/tty5", stderr="/dev/tty5")
-
-
def randomIname():
"""Generate a random initiator name the same way as iscsi-iname"""
@@ -222,27 +114,39 @@ def randomIname():
s += dig[random.randrange(0, 32)]
return s
+def stabilize(intf = None):
+ # Wait for udev to create the devices for the just added disks
+ if intf:
+ w = intf.waitWindow(_("Scanning iSCSI nodes"),
+ _("Scanning iSCSI nodes"))
+ # It is possible when we get here the events for the new devices
+ # are not send yet, so sleep to make sure the events are fired
+ time.sleep(2)
+ iutil.execWithRedirect("udevadm", [ "settle" ],
+ stdout = "/dev/tty5", stderr="/dev/tty5",
+ searchPath = 1)
+ if intf:
+ w.pop()
+
class iscsi(object):
def __init__(self):
- self.fwinfo = self._queryFirmware()
- self.targets = []
+ self.nodes = []
self._initiator = ""
self.initiatorSet = False
- self.oldInitiatorFile = None
- self.iscsidStarted = False
+ self.started = False
- if self.fwinfo and self.fwinfo.has_key("iface.initiatorname"):
- self._initiator = self.fwinfo["iface.initiatorname"]
+ try:
+ initiatorname = libiscsi.get_firmware_initiator_name()
+ self._initiator = initiatorname
self.initiatorSet = True
+ except:
+ pass
def _getInitiator(self):
if self._initiator != "":
return self._initiator
- if self.fwinfo and self.fwinfo.has_key("iface.initiatorname"):
- return self.fwinfo["iface.initiatorname"]
- else:
- return randomIname()
+ return randomIname()
def _setInitiator(self, val):
if self._initiator != "" and val != self._initiator:
@@ -254,190 +158,37 @@ class iscsi(object):
initiator = property(_getInitiator, _setInitiator)
- def _queryFirmware(self):
- # Example:
- # [root@elm3b87 ~]# iscsiadm -m fw
- # iface.initiatorname = iqn.2007-05.com.ibm.beaverton.elm3b87:01
- # iface.hwaddress = 00:14:5e:b3:8e:b2
- # node.name = iqn.1992-08.com.netapp:sn.84183797
- # node.conn[0].address = 9.47.67.152
- # node.conn[0].port = 3260
-
- find_iscsi_files()
-
- if not has_iscsi():
- return
-
- retval = {}
-
- argv = [ "-m", "fw" ]
- log.debug("queryFirmware: ISCSIADM is %s" % (ISCSIADM,))
- result = iutil.execWithCapture(ISCSIADM, argv, stderr="/dev/tty5")
- result = result.strip()
-
- if len(result) == 0 \
- or result[0].find("iscsiadm -") != -1 \
- or result[0].find("iscsiadm: ") != -1:
- log.debug("queryFirmware: iscsiadm %s returns bad output: %s" %
- (argv,result))
-
- # Try querying the node records instead
- argv = [ "-m", "node", "-o", "show", "-S" ]
- result = iutil.execWithCapture(ISCSIADM, argv, stderr="/dev/tty5")
-
- if len(result) == 0 \
- or result[0].find("iscsiadm -") != -1 \
- or result[0].find("iscsiadm: ") != -1:
- log.debug("queryFirmware: iscsiadm %s returns bad output: %s" %
- (argv,result))
- return retval
-
- for line in result.split("\n"):
- SPLIT = " = "
- idx = line.find(SPLIT)
- if idx != -1:
- lhs = line[:idx]
- rhs = line[idx+len(SPLIT):]
- retval[lhs] = rhs
-
- return retval
-
- def _startIscsiDaemon(self):
- psout = iutil.execWithCapture("/usr/bin/pidof", ["iscsid"])
- if psout.strip() == "":
- log.info("iSCSI startup")
- iutil.execWithRedirect(ISCSID, [],
- stdout="/dev/tty5", stderr="/dev/tty5")
- self.iscsidStarted = True
- time.sleep(2)
-
- def _stopIscsiDaemon(self):
- result = iutil.execWithCapture(ISCSIADM, ["-k", "0"], stderr="/dev/tty5")
- result.strip()
- if result == "":
- self.iscsidStarted = False
-
- def shutdown(self):
- if not has_iscsi():
+ def _startIBFT(self, intf = None):
+ if not flags.ibft:
return
- if flags.test:
- if self.oldInitiatorFile != None:
- f = open(INITIATOR_FILE, "w")
- for line in self.oldInitiatorFile:
- f.write(line)
- f.close ()
- self.oldInitiatorFile = None
- self._stopIscsiDaemon()
-
- def loginToDefaultDrive(self):
- # Example:
- # [root@elm3b87 ~]# iscsiadm -m discovery -t fw -l
- # Logging in to [iface: default, target: iqn.1992-08.com.netapp:sn.84183797, portal: 9.47.67.152,3260]
-
- find_iscsi_files()
+ try:
+ found_nodes = libiscsi.discover_firmware()
+ except:
+ # an exception here means there is no ibft firmware, just return
+ return
- argv = [ "-m", "discovery", "-t", "fw", "-l" ]
- result = iutil.execWithCapture(ISCSIADM, argv, stderr="/dev/tty5")
- log.debug("iscsiadm result: %s" % (result,))
+ for node in found_nodes:
+ try:
+ node.login()
+ self.nodes.append(node)
+ except:
+ # FIXME, what to do when we cannot log in to a firmware
+ # provided node ??
+ pass
- start = result.find('[')
- end = result.rfind(']')
+ stabilize(intf)
- if start == -1 or end == -1:
- log.warn("could not find markers. iscsiadm returned: %s" %
- (result,))
+ def startup(self, intf = None):
+ if self.started:
return
- values = {}
- for kv in string.split(result[start+1:end], ', '):
- (k, v) = string.split(kv, ': ')
- values[k] = v
- del start, end
-
- if not values.has_key('target'):
- log.warn("iBFT data missing target. iscsiadm returned: %s" %
- (result,))
-
- if not values.has_key('portal'):
- log.warn("iBFT data missing portal. iscsiadm returned: %s" %
- (result,))
- else:
- portal = values['portal']
- comma = portal.find(',')
- if comma == -1:
- values['port'] = 3260
- else:
- values['port'] = portal[comma+1:]
- values['portal'] = portal[0:comma]
-
- if not values.has_key('chap-username') or not \
- values.has_key('chap-password'):
- if values.has_key('chap-username'):
- log.warn("Invalid iBFT CHAP password. iscsiadm returned: %s" %
- (result,))
- return
- if values.has_key('chap-password'):
- log.warn("Invalid iBFT CHAP username. iscsiadm returned: %s" %
- (result,))
- return
-
- if not values.has_key('rev-chap-username') or not \
- values.has_key('rev-chap-password'):
- if values.has_key('rev-chap-username'):
- log.warn("Invalid iBFT Reverse CHAP password. " \
- "iscsiadm returned %s" % (result,))
- return
- if values.has_key('rev-chap-password'):
- log.warn("Invalid iBFT Reverse CHAP username. " \
- "iscsiadm returned %s" % (result,))
- return
-
- target = values['target']
-
- renames = {
- 'portal': 'ipaddr',
- 'chap-username': 'user',
- 'chap-password': 'pw',
- 'rev-chap-username': 'user_in',
- 'rev-chap-password': 'pw_in',
- }
-
- for k,v in renames.items():
- if values.has_key(k):
- values[v] = values[k]
- del values[k]
-
- badKeys = filter(lambda x: not x in \
- ('ipaddr','port','user','pw','user_in','pw_in'),
- values.keys())
- for k in badKeys:
- del values[k]
-
- # make a new target
- self.addTarget(**values)
-
-
- def startIBFT(self):
- # If there is a default drive in the iSCSI configuration, then
- # automatically attach to it. Do this before testing the initiator
- # name, because it is provided by the iBFT too
-
- if flags.ibft:
- self.loginToDefaultDrive()
-
- def startup(self, intf = None):
if not has_iscsi():
return
if not self.initiatorSet:
log.info("no initiator set")
return
- if flags.test:
- if os.access(INITIATOR_FILE, os.R_OK):
- f = open(INITIATOR_FILE, "r")
- self.oldInitiatorFile = f.readlines()
- f.close()
if intf:
w = intf.waitWindow(_("Initializing iSCSI initiator"),
@@ -453,120 +204,91 @@ class iscsi(object):
os.write(fd, "InitiatorName=%s\n" %(self.initiator))
os.close(fd)
- if not os.path.isdir("/var/lib/iscsi"):
- os.makedirs("/var/lib/iscsi", 0660)
- for dir in ['nodes','send_targets','ifaces']:
+ for dir in ['ifaces','isns','nodes','send_targets','slp','static']:
fulldir = "/var/lib/iscsi/%s" % (dir,)
if not os.path.isdir(fulldir):
- os.makedirs(fulldir, 0660)
+ os.makedirs(fulldir, 0755)
- self._startIscsiDaemon()
+ log.info("iSCSI startup")
+ iutil.execWithRedirect(ISCSID, [],
+ stdout="/dev/tty5", stderr="/dev/tty5")
+ time.sleep(1)
if intf:
w.pop()
+ self._startIBFT(intf)
+ self.started = True
+
def addTarget(self, ipaddr, port="3260", user=None, pw=None,
user_in=None, pw_in=None, intf=None):
- if not self.iscsidStarted:
- self.startup(intf)
- if not self.iscsidStarted:
- # can't start for some reason.... just fallback I guess
- return
-
- commentUser = '#'
- commentUser_in = '#'
-
- if user is not None or pw is not None:
- commentUser = ''
- if user is None:
- raise ValueError, _("CHAP username is required if CHAP password is defined.")
- if pw is None:
- raise ValueError, _("CHAP password is required if CHAP username is defined.")
-
- if user_in is not None or pw_in is not None:
- commentUser_in = ''
- if user_in is None:
- raise ValueError, _("Reverse CHAP username is required if reverse CHAP password is defined.")
- if pw_in is None:
- raise ValueError, _("Reverse CHAP password is required if reverse CHAP username is defined.")
-
- # If either a user/pw pair was specified or a user_in/pw_in was
- # specified, then CHAP is specified.
- if commentUser == '' or commentUser_in == '':
- commentChap = ''
- else:
- commentChap = '#'
-
-
- oldIscsidFile = []
- try:
- f = open(ISCSID_CONF, "r")
- oldIscsidFile = f.readlines()
- f.close()
- except IOError, x:
- if x.errno != errno.ENOENT:
- raise RuntimeError, "Cannot open %s for read." % (ISCSID_CONF,)
+ authinfo = None
+ found = 0
+ logged_in = 0
- try:
- f = open(ISCSID_CONF, "w")
- except:
- raise RuntimeError, "Cannot open %s for write." % (ISCSID_CONF,)
-
- vals = {
- "node.session.auth.authmethod = ": [commentChap, "CHAP"],
- "node.session.auth.username = ": [commentUser, user],
- "node.session.auth.password = ": [commentUser, pw],
- "node.session.auth.username_in = ": [commentUser_in, user_in],
- "node.session.auth.password_in = ": [commentUser_in, pw_in],
- "discovery.sendtargets.auth.authmethod = ": [commentChap, "CHAP"],
- "discovery.sendtargets.auth.username = ": [commentUser, user],
- "discovery.sendtargets.auth.password = ": [commentUser, pw],
- "discovery.sendtargets.auth.username_in = ":
- [commentUser_in, user_in],
- "discovery.sendtargets.auth.password_in = ":
- [commentUser_in, pw_in],
- }
-
- for line in oldIscsidFile:
- s = line.strip()
- # grab the cr/lf/cr+lf
- nl = line[line.find(s)+len(s):]
- found = False
- for (k, (c, v)) in vals.items():
- if line.find(k) != -1:
- f.write("%s%s%s%s" % (c, k, v, nl))
- found=True
- del vals[k]
- break
- if not found:
- f.write(line)
-
- for (k, (c, v)) in vals.items():
- f.write("%s%s%s\n" % (c, k, v))
- f.close ()
-
- t = iscsiTarget(ipaddr, port, user, pw, user_in, pw_in)
- if not t.discover():
- return
- if not t.login():
- return
- self.targets.append(t)
- return
+ if not has_iscsi():
+ raise IOError, _("iSCSI not available")
+ if not self.initiatorSet:
+ raise ValueError, _("No initiator name set")
+
+ self.startup(intf)
+
+ if user:
+ # Note may raise a ValueError
+ authinfo = libiscsi.chapAuthInfo(username=user, password=pw,
+ reverse_username=user_in,
+ reverse_password=pw_in)
+ # Note may raise an IOError
+ found_nodes = libiscsi.discover_sendtargets(address=ipaddr,
+ port=int(port),
+ authinfo=authinfo)
+ if found_nodes == None:
+ raise IOError, _("No iSCSI nodes discovered")
+
+ if intf:
+ w = intf.waitWindow(_("Logging in to iSCSI nodes"),
+ _("Logging in to iSCSI nodes"))
+
+ for node in found_nodes:
+ # skip nodes we already have
+ if node in self.nodes:
+ continue
+
+ found = found + 1
+ try:
+ if (authinfo):
+ node.setAuth(authinfo)
+ node.login()
+ self.nodes.append(node)
+ logged_in = logged_in + 1
+ except:
+ # some nodes may require different credentials
+ pass
+
+ if intf:
+ w.pop()
+
+ if found == 0:
+ raise IOError, _("No new iSCSI nodes discovered")
+
+ if logged_in == 0:
+ raise IOError, _("Could not log in to any of the discovered nodes")
+
+ stabilize(intf)
def writeKS(self, f):
if not self.initiatorSet:
return
f.write("iscsiname %s\n" %(self.initiator,))
- for t in self.targets:
- f.write("iscsi --ipaddr %s --port %s" %(t.ipaddr, t.port))
- if t.user:
- f.write(" --user %s" %(t.user,))
- if t.password:
- f.write(" --password %s" %(t.password,))
- if t.user_in:
- f.write(" --reverse-user %s" % (t.user_in,))
- if t.password_in:
- f.write(" --reverse-password %s" % (t.password_in,))
+ for n in self.nodes:
+ f.write("iscsi --ipaddr %s --port %s" %(n.address, n.port))
+ auth = n.getAuth()
+ if auth:
+ f.write(" --user %s" %(n.username,))
+ f.write(" --password %s" %(n.password,))
+ if len(auth.reverse_username):
+ f.write(" --reverse-user %s" % (n.reverse_username,))
+ f.write(" --reverse-password %s" % (n.reverse_password,))
f.write("\n")
def write(self, instPath, anaconda):
@@ -601,10 +323,10 @@ class iscsi(object):
os.close(fd)
# copy "db" files. *sigh*
- if not os.path.isdir(instPath + "/var/lib/iscsi"):
- os.makedirs(instPath + "/var/lib/iscsi", 0755)
- for d in ("/var/lib/iscsi/nodes", "/var/lib/iscsi/send_targets"):
- if os.path.isdir(d):
- shutil.copytree(d, instPath + d)
+ if os.path.isdir(instPath + "/var/lib/iscsi"):
+ shutil.rmtree(instPath + "/var/lib/iscsi")
+ if os.path.isdir("/var/lib/iscsi"):
+ shutil.copytree("/var/lib/iscsi", instPath + "/var/lib/iscsi",
+ symlinks=True)
# vim:tw=78:ts=4:et:sw=4
diff --git a/iw/autopart_type.py b/iw/autopart_type.py
index f166eabe8..3b3668282 100644
--- a/iw/autopart_type.py
+++ b/iw/autopart_type.py
@@ -247,7 +247,6 @@ class PartitionTypeWindow(InstallWindow):
rc = dialog.run()
if rc == gtk.RESPONSE_CANCEL:
break
- return rc
initiator = dxml.get_widget("iscsiInitiatorEntry").get_text()
initiator.strip()
@@ -297,6 +296,9 @@ class PartitionTypeWindow(InstallWindow):
except ValueError, e:
self.intf.messageWindow(_("Error"), str(e))
continue
+ except IOError, e:
+ self.intf.messageWindow(_("Error"), str(e))
+ rc = gtk.RESPONSE_CANCEL
break
dialog.destroy()
@@ -362,12 +364,15 @@ class PartitionTypeWindow(InstallWindow):
dialog.destroy()
if rc != gtk.RESPONSE_CANCEL:
+ w = self.intf.waitWindow(_("Rescanning disks"),
+ _("Rescanning disks"))
partitions.partitionObjectsInitialize(self.anaconda)
createAllowedDrivesStore(self.diskset.disks,
self.partitions.autoClearPartDrives,
self.drivelist,
disallowDrives=[self.anaconda.updateSrc])
self._fillBootStore()
+ w.pop()
def _fillBootStore(self):
bootstore = self.bootcombo.get_model()
diff --git a/kickstart.py b/kickstart.py
index bf028f27e..86f3e8992 100644
--- a/kickstart.py
+++ b/kickstart.py
@@ -313,9 +313,6 @@ class IscsiName(commands.iscsiname.FC6_IscsiName):
retval = commands.iscsiname.FC6_IscsiName.parse(self, args)
self.handler.id.iscsi.initiator = self.iscsiname
- self.handler.id.iscsi.startIBFT()
- # FIXME: flush the drive dict so we figure drives out again
- isys.flushDriveDict()
return retval
class Keyboard(commands.keyboard.FC3_Keyboard):
diff --git a/partitions.py b/partitions.py
index 74a9e117a..a22c54b28 100644
--- a/partitions.py
+++ b/partitions.py
@@ -62,6 +62,9 @@ def partitionObjectsInitialize(anaconda):
if anaconda.dir == DISPATCH_BACK:
return
+ # make ibft configured iscsi disks available when findrootparts was skipped
+ anaconda.id.iscsi.startup(anaconda.intf)
+
# ensure zfcp devs are up
anaconda.id.zfcp.startup()
diff --git a/rescue.py b/rescue.py
index 2ae35e64d..42e5b960c 100644
--- a/rescue.py
+++ b/rescue.py
@@ -205,6 +205,7 @@ def runRescue(anaconda, instClass):
else:
break
+ anaconda.intf = None
screen.finish()
# Early shell access with no disk access attempts
diff --git a/scripts/upd-instroot b/scripts/upd-instroot
index 033d96544..72c62d188 100755
--- a/scripts/upd-instroot
+++ b/scripts/upd-instroot
@@ -439,6 +439,7 @@ usr/$LIBDIR/python?.?/site-packages/firstboot
usr/$LIBDIR/python?.?/site-packages/gtk*
usr/$LIBDIR/python?.?/site-packages/gtk*/gtk
usr/$LIBDIR/python?.?/site-packages/ixf86configmodule.so
+usr/$LIBDIR/python?.?/site-packages/libiscsimodule.so
usr/$LIBDIR/python?.?/site-packages/libusermodule.so
usr/$LIBDIR/python?.?/site-packages/partedmodule.so
usr/$LIBDIR/python?.?/site-packages/rhpl
@@ -446,6 +447,7 @@ usr/$LIBDIR/python?.?/site-packages/rpmmodule.so
usr/$LIBDIR/python?.?/site-packages/xf86config.py
usr/$LIBDIR/python?.?/xml/etree/
usr/$LIBDIR/rpm/rpmpopt
+usr/$LIBDIR/libiscsi.so*
usr/$LIBDIR/libsqlite3.so*
usr/$LIBDIR/xorg/modules
usr/$LIBDIR/xserver/SecurityPolicy
diff --git a/textw/partition_text.py b/textw/partition_text.py
index 77f937dcc..b5cab7c1e 100644
--- a/textw/partition_text.py
+++ b/textw/partition_text.py
@@ -187,7 +187,7 @@ class PartitionTypeWindow:
else:
try:
return self.addIscsiDriveDialog(screen)
- except ValueError, e:
+ except (ValueError, IOError), e:
ButtonChoiceWindow(screen, _("Error"), str(e))
return INSTALL_BACK
diff --git a/upgrade.py b/upgrade.py
index d8d1e7574..1c4685d2e 100644
--- a/upgrade.py
+++ b/upgrade.py
@@ -149,6 +149,9 @@ def findRootParts(anaconda):
anaconda.dispatch.skipStep("installtype", skip = 0)
def findExistingRoots(anaconda, upgradeany = 0):
+ # make ibft configured iscsi disks available
+ anaconda.id.iscsi.startup(anaconda.intf)
+
if not flags.setupFilesystems:
relstr = partedUtils.getReleaseString (anaconda.rootPath)
if ((flags.cmdline.has_key("upgradeany")) or