Re: PATCH: latest revision of iscsi rewrite

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



looks good to me.
----- "Hans de Goede" <hdegoede@xxxxxxxxxx> wrote:

> Hi all,
> 
> I really need someone to review the changes I made in reaction to
> clumens 
> changes, so that I can commit this, as tomorrow is iscsi test day.
> 
> 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
> ---
>   backend.py              |   12 +
>   iscsi.py                |  522
> +++++++++++------------------------------------
>   iw/autopart_type.py     |    7 +-
>   kickstart.py            |    3 -
>   partitions.py           |    3 +
>   rescue.py               |    1 +
>   scripts/upd-instroot    |    2 +
>   textw/partition_text.py |    2 +-
>   upgrade.py              |    3 +
>   9 files changed, 150 insertions(+), 405 deletions(-)
> 
> diff --git a/backend.py b/backend.py
> index 3008671..e8bcf4f 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 a4d301e..fbd33c3 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 f166eab..3b36682 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 eafd4d8..9305ef0 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 74a9e11..a22c54b 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 2ae35e6..42e5b96 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 033d965..72c62d1 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 1944ee1..c8381d1 100644
> --- a/textw/partition_text.py
> +++ b/textw/partition_text.py
> @@ -1650,7 +1650,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 d8d1e75..1c4685d 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
> -- 
> 1.6.1.2
> 
> Regards,
> 
> Hans
> 
> _______________________________________________
> Anaconda-devel-list mailing list
> Anaconda-devel-list@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/anaconda-devel-list

-- 
Joel Andres Granados
Red Hat / Brno Czech Republic

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

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux