Linux Archive

Linux Archive (http://www.linux-archive.org/)
-   Gentoo Embedded (http://www.linux-archive.org/gentoo-embedded/)
-   -   PATCH: latest revision of iscsi rewrite (http://www.linux-archive.org/gentoo-embedded/243721-patch-latest-revision-iscsi-rewrite.html)

Hans de Goede 02-11-2009 09:29 AM

PATCH: latest revision of iscsi rewrite
 
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("
"):
- 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("
"):
- 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
" %(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','stat ic']:
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
" % (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
" %(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("
")

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.anacond a)
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@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

Joel Granados 02-11-2009 10:02 AM

PATCH: latest revision of iscsi rewrite
 
looks good to me.
----- "Hans de Goede" <hdegoede@redhat.com> 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("
"):
> - 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("
"):
> - 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
" %(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','stat ic']:
> 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
" % (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
" %(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("
")
>
> 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.anacond a)
> 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@redhat.com
> 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@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list


All times are GMT. The time now is 03:54 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.