def has_lvm(): if iutil.find_program_in_path("lvm"): for line in open("/proc/devices").readlines(): if "device-mapper" in line.split(): return True return False
def startup(self, intf=None): if self.started: return if not has_iscsi(): return if self._initiator == "": log.info("no initiator set") return if intf: w = intf.waitWindow(_("Initializing iSCSI initiator"), _("Initializing iSCSI initiator")) log.debug("Setting up %s" % (INITIATOR_FILE, )) log.info("iSCSI initiator name %s", self.initiator) if os.path.exists(INITIATOR_FILE): os.unlink(INITIATOR_FILE) if not os.path.isdir("/etc/iscsi"): os.makedirs("/etc/iscsi", 0755) 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 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, 0755) log.info("iSCSI startup") iutil.execWithRedirect('modprobe', ['-a'] + ISCSI_MODULES, stdout="/dev/tty5", stderr="/dev/tty5") # brcm_iscsiuio is needed by Broadcom offload cards (bnx2i). Currently # not present in iscsi-initiator-utils for Fedora. try: brcm_iscsiuio = iutil.find_program_in_path('brcm_iscsiuio', raise_on_error=True) except RuntimeError: log.info("iscsi: brcm_iscsiuio not found.") else: log.debug("iscsi: brcm_iscsiuio is at %s" % brcm_iscsiuio) iutil.execWithRedirect(brcm_iscsiuio, [], stdout="/dev/tty5", stderr="/dev/tty5") # run the daemon iutil.execWithRedirect(ISCSID, [], stdout="/dev/tty5", stderr="/dev/tty5") time.sleep(1) if intf: w.pop() self._startIBFT(intf) self.started = True
def minSize(self): """ The minimum filesystem size in megabytes. """ if self._minInstanceSize is None: # we try one time to determine the minimum size. size = self._minSize if self.exists and os.path.exists(self.device) and \ iutil.find_program_in_path(self.resizefsProg): minSize = None buf = iutil.execWithCapture(self.resizefsProg, ["-m", self.device], stderr = "/dev/tty5") for l in buf.split("\n"): if not l.startswith("Minsize"): continue try: min = l.split(":")[1].strip() minSize = int(min) + 250 except (IndexError, ValueError) as e: minSize = None log.warning("Unable to parse output for minimum size on %s: %s" %(self.device, e)) if minSize is None: log.warning("Unable to discover minimum size of filesystem " "on %s" %(self.device,)) else: size = minSize self._minInstanceSize = size return self._minInstanceSize
def startup(self, intf = None): if self.started: return if not has_iscsi(): return if self._initiator == "": log.info("no initiator set") return if intf: w = intf.waitWindow(_("Initializing iSCSI initiator"), _("Initializing iSCSI initiator")) log.debug("Setting up %s" % (INITIATOR_FILE, )) log.info("iSCSI initiator name %s", self.initiator) if os.path.exists(INITIATOR_FILE): os.unlink(INITIATOR_FILE) if not os.path.isdir("/etc/iscsi"): os.makedirs("/etc/iscsi", 0755) 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 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, 0755) log.info("iSCSI startup") iutil.execWithRedirect('modprobe', ['-a'] + ISCSI_MODULES, stdout="/dev/tty5", stderr="/dev/tty5") # iscsiuio is needed by Broadcom offload cards (bnx2i). Currently # not present in iscsi-initiator-utils for Fedora. try: iscsiuio = iutil.find_program_in_path('iscsiuio', raise_on_error=True) except RuntimeError: log.info("iscsi: iscsiuio not found.") else: log.debug("iscsi: iscsiuio is at %s" % iscsiuio) iutil.execWithRedirect(iscsiuio, [], stdout="/dev/tty5", stderr="/dev/tty5") # run the daemon iutil.execWithRedirect(ISCSID, [], stdout="/dev/tty5", stderr="/dev/tty5") time.sleep(1) if intf: w.pop() self._startIBFT(intf) self.started = True
def utilsAvailable(self): # we aren't checking for fsck because we shouldn't need it for prog in [self.mkfsProg, self.resizefsProg, self.labelfsProg, self.infofsProg]: if not prog: continue if not iutil.find_program_in_path(prog): return False return True
def utilsAvailable(self): # we aren't checking for fsck because we shouldn't need it for prog in [ self.mkfsProg, self.resizefsProg, self.labelfsProg, self.infofsProg ]: if not prog: continue if not iutil.find_program_in_path(prog): return False return True
def has_iscsi(): global ISCSID if not os.access("/sys/module/iscsi_tcp", os.X_OK): return False if not ISCSID: location = iutil.find_program_in_path("iscsid") if not location: return False ISCSID = location log.info("ISCSID is %s" % (ISCSID, )) return True
def has_iscsi(): global ISCSID if not os.access("/sys/module/iscsi_tcp", os.X_OK): return False if not ISCSID: location = iutil.find_program_in_path("iscsid") if not location: return False ISCSID = location log.info("ISCSID is %s" % (ISCSID,)) return True
def _isMigratable(self): """ Can filesystems of this type be migrated? """ return bool(self._migratable and self.migratefsProg and iutil.find_program_in_path(self.migratefsProg) and self.migrationTarget)
def _getExistingSize(self): """ Determine the size of this filesystem. Filesystem must exist. Each filesystem varies, but the general procedure is to run the filesystem dump or info utility and read the block size and number of blocks for the filesystem and compute megabytes from that. The loop that reads the output from the infofsProg is meant to be simple, but take in to account variations in output. The general procedure: 1) Capture output from infofsProg. 2) Iterate over each line of the output: a) Trim leading and trailing whitespace. b) Break line into fields split on ' ' c) If line begins with any of the strings in _existingSizeFields, start at the end of fields and take the first one that converts to a long. Store this in the values list. d) Repeat until the values list length equals the _existingSizeFields length. 3) If the length of the values list equals the length of _existingSizeFields, compute the size of this filesystem by multiplying all of the values together to get bytes, then convert to megabytes. Return this value. 4) If we were unable to capture all fields, return 0. The caller should catch exceptions from this method. Any exception raised indicates a need to change the fields we are looking for, the command to run and arguments, or something else. If you catch an exception from this method, assume the filesystem cannot be resized. """ size = self._size if self.infofsProg and self.exists and not size and \ iutil.find_program_in_path(self.infofsProg): try: values = [] argv = self._defaultInfoOptions + [ self.device ] buf = iutil.execWithCapture(self.infofsProg, argv, stderr="/dev/tty5") for line in buf.splitlines(): found = False line = line.strip() tmp = line.split(' ') tmp.reverse() for field in self._existingSizeFields: if line.startswith(field): for subfield in tmp: try: values.append(long(subfield)) found = True break except ValueError: continue if found: break if len(values) == len(self._existingSizeFields): break if len(values) != len(self._existingSizeFields): return 0 size = 1 for value in values: size *= value # report current size as megabytes size = math.floor(size / 1024.0 / 1024.0) except Exception as e: log.error("failed to obtain size of filesystem on %s: %s" % (self.device, e)) return size