I didn't find any obvious mistake. I would commit and iron out any issues afterwards. Regards. On Wed, May 06, 2009 at 10:33:39AM +0200, Hans de Goede wrote: > 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 -- Joel Andres Granados Brno, Czech Republic, Red Hat. _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list