This patch backports the recent iscsi cleanup work done in Fedora to 5.4, significantly cleaning up the iscsi code, and fixing a number of issues, most noticably it fixes chap / reverse chap in combination with ibft (#497438) --- iscsi.py | 573 +++++++++++------------------------------------ iw/autopart_type.py | 44 +--- kickstart.py | 4 - partitioning.py | 1 - scripts/upd-instroot | 2 + textw/partition_text.py | 29 +--- upgrade.py | 3 + 7 files changed, 146 insertions(+), 510 deletions(-) diff --git a/iscsi.py b/iscsi.py index 89220c0..1f80600 100644 --- a/iscsi.py +++ b/iscsi.py @@ -13,10 +13,8 @@ # import os -import errno -import string -import signal import iutil +import isys from flags import flags import logging import shutil @@ -26,13 +24,15 @@ log = logging.getLogger("anaconda") from rhpl.translate import _, N_ +has_libiscsi = True +try: + import libiscsi +except ImportError: + has_libiscsi = False + # Note that stage2 copies all files under /sbin to /usr/sbin -global ISCSID ISCSID="" -global ISCSIADM -ISCSIADM = "" INITIATOR_FILE="/etc/iscsi/initiatorname.iscsi" -ISCSID_CONF="/etc/iscsi/iscsid.conf" def find_iscsi_files(): global ISCSID @@ -41,137 +41,23 @@ def find_iscsi_files(): path="%s/iscsid" % (dir,) if os.access(path, os.X_OK): ISCSID=path - global ISCSIADM - if ISCSIADM == "": - for dir in ("/usr/sbin", "/tmp/updates", "/mnt/source/RHupdates"): - path="%s/iscsiadm" % (dir,) - if os.access(path, os.X_OK): - ISCSIADM=path def has_iscsi(): find_iscsi_files() - if ISCSID == "" or ISCSIADM == "": + if ISCSID == "" or not has_libiscsi: return False log.info("ISCSID is %s" % (ISCSID,)) - log.info("ISCSIADM is %s" % (ISCSIADM,)) # make sure the module is loaded if not os.access("/sys/module/iscsi_tcp", os.X_OK): return False return True -class iscsiTarget: - def __init__(self, ipaddr, port=None, user=None, pw=None, - user_in=None, pw_in=None, discover=True, login=True): - # 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 = [] - self.doDiscovery = discover - self.doLogin = login - - 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) - 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) - - # 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""" - s = "iqn.2005-03.com.max:01." + s = "iqn.1994-05.com.rhel:01." m = md5.md5() u = os.uname() for i in u: @@ -182,249 +68,81 @@ 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")) + time.sleep(2) + + # ensure we have device nodes for our partitions + isys.flushDriveDict() + iutil.makeDriveDeviceNodes() + + 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"] - self.initiatorSet = True + if flags.ibft: + 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: + if self.initiatorSet and val != self._initiator: raise ValueError, "Unable to change iSCSI initiator name once set" if len(val) == 0: raise ValueError, "Must provide a non-zero length string" self._initiator = val - self.initiatorSet = True 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 - - # iface.bootproto = DHCP - # or - # iface.bootproto = STATIC - # iface.ipaddress = 192.168.32.72 - # iface.subnet_mask = 255.255.252.0 - # iface.gateway = 192.168.35.254 - - # 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(): + def _startIBFT(self, intf = None): + if not flags.ibft: return - retval = {} - - argv = [ "-m", "fw" ] - log.debug("queryFirmware: ISCSIADM is %s" % (ISCSIADM,)) - result = iutil.execWithCapture(ISCSIADM, argv) - 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) - - 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"]) - result.strip() - if result == "": + try: + found_nodes = libiscsi.discover_firmware() + except: + # an exception here means there is no ibft firmware, just return return - psout = iutil.execWithCapture("/usr/bin/pidof", ["iscsid"]) - if psout.strip() != "": - log.info("iSCSI shutdown") - for t in self.targets: - t.logout() - - for pidstr in psout.split(): - pid = string.atoi(pidstr) - log.info("killing %s %d" % (ISCSID, pid)) + 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 - os.kill(pid, signal.SIGKILL) + stabilize(intf) - self.iscsidStarted = False - - def shutdown(self): - if not has_iscsi(): + def startup(self, intf = None): + if self.started: 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 updateIscsidConf(self, values): - 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,) - - try: - f = open(ISCSID_CONF, "w") - except: - raise RuntimeError, "Cannot open %s for write." % (ISCSID_CONF,) - - lines = {} - for line in oldIscsidFile: - line = line.strip() - (k,v) = line.split('=') - k = k.strip() - v = v.strip() - - for k,v in values.items(): - commentK = '#%s' % (k,) - if lines.has_key(commentK): - del lines[commentK] - lines[k] = v - - for k,v in lines.items(): - f.write("%s = %s\n" % (k, v)) - f.close() - - def loginToDefaultDrive(self): - find_iscsi_files() - - argv = [ "-m", "fw" ] - log.debug("iscsiadm %s" % (string.join(argv),)) - result = iutil.execWithCapture(ISCSIADM, argv) - log.debug("iscsiadm result: %s" % (result,)) - - result = result.strip() - result = string.split(result, '\n') - results = [] - n = -1 - - in_record = False - for x in range(0, len(result)): - line = result[x] - if line == '# BEGIN RECORD': - n += 1 - results.append({}) - in_record = True - continue - elif line == '# END RECORD': - in_record = False - continue - elif in_record: - try: - (k,v) = line.split(' = ') - results[n][k] = v - except ValueError: - pass - - for n in range(0, len(results)): - record = results[n] - replacements = {} - for k,v in record.items(): - if '[0]' in k: - replacements[k] = k.replace('[0]','[%s]' % (n,)) - for k0,k1 in replacements.items(): - v = record[k0] - del record[k0] - record[k1] = v - - self.updateIscsidConf(record) - - if record.has_key('node.session.auth.username'): - username = record['node.session.auth.username'] - else: - username = None - - if record.has_key('node.session.auth.password'): - password = record['node.session.auth.password'] - else: - password = None - - t = iscsiTarget(ipaddr=record['node.conn[%s].address' % (n,)], - port=record['node.conn[%s].port' % (n,)], - user=username, - pw=password, - discover = False) - self.targets.append(t) - - 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: + if self._initiator == "": 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"), @@ -439,129 +157,94 @@ class iscsi(object): fd = os.open(INITIATOR_FILE, os.O_RDWR | os.O_CREAT) os.write(fd, "InitiatorName=%s\n" %(self.initiator)) os.close(fd) + self.initiatorSet = True - if not os.path.isdir("/var/lib/iscsi"): - os.makedirs("/var/lib/iscsi", 0660) 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() - self.startIBFT() - - for t in self.targets: - if t.doDiscovery: - if not t.discover(): - continue - if t.doLogin: - t.login() + 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, "user is required" - if pw is None: - raise ValueError, "pw is required" - - if user_in is not None or pw_in is not None: - commentUser_in = '' - if user_in is None: - raise ValueError, "user_in is required" - if pw_in is None: - raise ValueError, "pw_in is required" - - # 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 self._initiator == "": + raise ValueError, _("No initiator name set") + + if user or pw or user_in or pw_in: + # Note may raise a ValueError + authinfo = libiscsi.chapAuthInfo(username=user, password=pw, + reverse_username=user_in, + reverse_password=pw_in) + self.startup(intf) + + # 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" % auth.username) + f.write(" --password %s" % auth.password) + if len(auth.reverse_username): + f.write(" --reverse-user %s" % auth.reverse_username) + if len(auth.reverse_password): + f.write(" --reverse-password %s" % auth.reverse_password) f.write("\n") def write(self, instPath): @@ -576,10 +259,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 531d456..e8692eb 100644 --- a/iw/autopart_type.py +++ b/iw/autopart_type.py @@ -137,7 +137,6 @@ class PartitionTypeWindow(InstallWindow): rc = dialog.run() if rc == gtk.RESPONSE_CANCEL: break - return rc initiator = dxml.get_widget("iscsiInitiatorEntry").get_text() initiator.strip() @@ -155,35 +154,6 @@ class PartitionTypeWindow(InstallWindow): user_in = dxml.get_widget("userinEntry").get_text().strip() pw_in = dxml.get_widget("passinEntry").get_text().strip() - if len(user) == 0: - user = None - if len(pw) == 0: - pw = None - if len(user_in) == 0: - user_in = None - if len(pw_in) == 0: - pw_in = None - - if user is not None or pw is not None: - if user is None: - self.intf.messageWindow(_("Missing value"), - _("CHAP username is required if CHAP password is defined.")) - continue - if pw is None: - self.intf.messageWindow(_("Missing value"), - _("CHAP password is required if CHAP username is defined.")) - continue - - if user_in is not None or pw_in is not None: - if user_in is None: - self.intf.messageWindow(_("Missing value"), - _("Reverse CHAP username is required if reverse CHAP password is defined.")) - continue - if pw_in is None: - self.intf.messageWindow(_("Missing value"), - _("Reverse CHAP password is required if reverse CHAP username is defined.")) - continue - err = None try: idx = target.rfind(":") @@ -202,8 +172,15 @@ class PartitionTypeWindow(InstallWindow): self.intf.messageWindow(_("Error with Data"), "%s" %(err,)) continue - self.anaconda.id.iscsi.addTarget(ip, port, user, pw, user_in, pw_in, - self.intf) + try: + self.anaconda.id.iscsi.addTarget(ip, port, user, pw, user_in, pw_in, + self.intf) + 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() @@ -270,11 +247,14 @@ class PartitionTypeWindow(InstallWindow): dialog.destroy() if rc != gtk.RESPONSE_CANCEL: + w = self.intf.waitWindow(_("Rescanning disks"), + _("Rescanning disks")) partitioning.partitionObjectsInitialize(self.anaconda) createAllowedDrivesStore(self.diskset.disks, self.partitions.autoClearPartDrives, self.drivelist, self.anaconda.updateSrc) + w.pop() def getScreen(self, anaconda): diff --git a/kickstart.py b/kickstart.py index d1631ec..403fe41 100644 --- a/kickstart.py +++ b/kickstart.py @@ -215,11 +215,7 @@ class AnacondaKSHandlers(KickstartHandlers): def doIscsiName(self, args): KickstartHandlers.doIscsiName(self, args) self.id.iscsi.initiator = self.ksdata.iscsiname - - self.id.iscsi.startIBFT() self.id.iscsi.startup() - # FIXME: flush the drive dict so we figure drives out again - isys.flushDriveDict() def doKey(self, args): KickstartHandlers.doKey(self, args) diff --git a/partitioning.py b/partitioning.py index d281d78..8630655 100644 --- a/partitioning.py +++ b/partitioning.py @@ -32,7 +32,6 @@ def partitionObjectsInitialize(anaconda): # shut down all dm devices anaconda.id.diskset.closeDevices() anaconda.id.diskset.stopMdRaid() - anaconda.id.iscsi.shutdown() anaconda.id.zfcp.shutdown() # clean slate about drives diff --git a/scripts/upd-instroot b/scripts/upd-instroot index 097df60..a4ebe3f 100755 --- a/scripts/upd-instroot +++ b/scripts/upd-instroot @@ -422,6 +422,7 @@ usr/$LIBDIR/libcrypto* usr/$LIBDIR/libbz2* usr/$LIBDIR/libdhcp* usr/$LIBDIR/libelf* +usr/$LIBDIR/libiscsi.so* usr/$LIBDIR/libncurses* usr/$LIBDIR/libnewt* usr/$LIBDIR/libnl* @@ -461,6 +462,7 @@ usr/$LIBDIR/python?.?/site-packages/rpmmodule.so usr/$LIBDIR/python?.?/site-packages/partedmodule.so usr/$LIBDIR/python?.?/site-packages/ixf86configmodule.so usr/$LIBDIR/python?.?/site-packages/xf86config.py +usr/$LIBDIR/python?.?/site-packages/libiscsimodule.so usr/$LIBDIR/python?.?/site-packages/libusermodule.so usr/$LIBDIR/python?.?/site-packages/*sqlite* usr/$LIBDIR/python?.?/site-packages/rhpl diff --git a/textw/partition_text.py b/textw/partition_text.py index 723af70..1fba143 100644 --- a/textw/partition_text.py +++ b/textw/partition_text.py @@ -1675,7 +1675,7 @@ class PartitionTypeWindow: else: try: return self.addIscsiDriveDialog(screen) - except ValueError, e: + except (ValueError, IOError), e: ButtonChoiceWindow(screen, _("Error"), "%s" %(e,)) return INSTALL_BACK @@ -1719,33 +1719,6 @@ class PartitionTypeWindow: (user, pw, user_in, pw_in) = entries[2:] - if len(user) == 0: - user = None - if len(pw) == 0: - pw = None - if len(user_in) == 0: - user_in = None - if len(pw_in) == 0: - pw_in = None - - if user is not None or pw is not None: - if user is None: - ButtonChoiceWindow(screen, _("Missing value"), - _("Username is required when password is present.")) - if pw is None: - ButtonChoiceWindow(screen, _("Missing value"), - _("Password is required when username is present.")) - - if user_in is not None or pw_in is not None: - if user_in is None: - ButtonChoiceWindow(screen, _("Missing value"), - _("Reverse username is required when" - "reverse password is present.")) - if pw_in is None: - ButtonChoiceWindow(screen, _("Missing value"), - _("Reverse password is required when" - "reverse username is present.")) - target = entries[0].strip() try: idx = target.rfind(":") diff --git a/upgrade.py b/upgrade.py index 933104f..5beb8a2 100644 --- a/upgrade.py +++ b/upgrade.py @@ -138,6 +138,9 @@ def findExistingRoots(anaconda, upgradeany = 0): return [(anaconda.rootPath, 'ext2', "")] return [] + # make ibft configured iscsi disks available + anaconda.id.iscsi.startup(anaconda.intf) + anaconda.id.diskset.openDevices() anaconda.id.partitions.getEncryptedDevices(anaconda.id.diskset) -- 1.6.2.2 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list