diff options
Diffstat (limited to 'pyanaconda/storage/dasd.py')
-rw-r--r-- | pyanaconda/storage/dasd.py | 218 |
1 files changed, 0 insertions, 218 deletions
diff --git a/pyanaconda/storage/dasd.py b/pyanaconda/storage/dasd.py deleted file mode 100644 index bd3d4debc..000000000 --- a/pyanaconda/storage/dasd.py +++ /dev/null @@ -1,218 +0,0 @@ -# -# dasd.py - DASD class -# -# Copyright (C) 2009, 2010 Red Hat, Inc. All rights reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# -# Red Hat Author(s): David Cantrell <dcantrell@redhat.com> -# - -import sys -import os -from pyanaconda.storage.errors import DasdFormatError -from pyanaconda.storage.devices import deviceNameToDiskByPath -from pyanaconda.storage import util -from pyanaconda.storage import arch -from . import ROOT_PATH -from .udev import udev_trigger - -import logging -log = logging.getLogger("storage") - -import gettext -_ = lambda x: gettext.ldgettext("anaconda", x) -P_ = lambda x, y, z: gettext.ldngettext("anaconda", x, y, z) - -def getDasdPorts(): - """ Return comma delimited string of valid DASD ports. """ - ports = [] - - f = open("/proc/dasd/devices", "r") - lines = map(lambda x: x.strip(), f.readlines()) - f.close() - - for line in lines: - if "unknown" in line: - continue - - if "(FBA )" in line or "(ECKD)" in line: - ports.append(line.split('(')[0]) - - return ','.join(ports) - -class DASD: - """ Controlling class for DASD interaction before the storage code in - anaconda has initialized. - - The DASD class can determine if any DASD devices on the system are - unformatted and can perform a dasdfmt on them. - """ - - def __init__(self): - self._dasdlist = [] - self._devices = [] # list of DASDDevice objects - self.totalCylinders = 0 - self._completedCylinders = 0.0 - self._maxFormatJobs = 0 - self.dasdfmt = "/sbin/dasdfmt" - self.commonArgv = ["-y", "-d", "cdl", "-b", "4096"] - self.started = False - - def __call__(self): - return self - - def startup(self, intf, exclusiveDisks, zeroMbr): - """ Look for any unformatted DASDs in the system and offer the user - the option for format them with dasdfmt or exit the installer. - """ - if self.started: - return - - self.started = True - - if not arch.isS390(): - return - - # Trigger udev data about the dasd devices on the system - udev_trigger(action="change", name="dasd*") - - log.info("Checking for unformatted DASD devices:") - - for device in os.listdir("/sys/block"): - if not device.startswith("dasd"): - continue - - statusfile = "/sys/block/%s/device/status" % (device,) - if not os.path.isfile(statusfile): - continue - - f = open(statusfile, "r") - status = f.read().strip() - f.close() - - if status in ["unformatted"] and device not in exclusiveDisks: - bypath = deviceNameToDiskByPath(device) - if not bypath: - bypath = "/dev/" + device - - log.info(" %s (%s) status is %s, needs dasdfmt" % (device, - bypath, - status,)) - self._dasdlist.append((device, bypath)) - - if not len(self._dasdlist): - log.info(" no unformatted DASD devices found") - return - - askUser = True - - if zeroMbr: - askUser = False - elif not intf and not zeroMbr: - log.info(" non-interactive kickstart install without zerombr " - "command, unable to run dasdfmt, exiting installer") - sys.exit(0) - - c = len(self._dasdlist) - - if intf and askUser: - devs = '' - for dasd, bypath in self._dasdlist: - devs += "%s\n" % (bypath,) - - rc = intf.questionInitializeDASD(c, devs) - if rc == 1: - log.info(" not running dasdfmt, continuing installation") - return - - # gather total cylinder count - argv = ["-t", "-v"] + self.commonArgv - for dasd, bypath in self._dasdlist: - buf = util.capture_output([self.dasdfmt, argv, "/dev/" + dasd]) - for line in buf.splitlines(): - if line.startswith("Drive Geometry: "): - # line will look like this: - # Drive Geometry: 3339 Cylinders * 15 Heads = 50085 Tracks - cyls = long(filter(lambda s: s, line.split(' '))[2]) - self.totalCylinders += cyls - break - - # format DASDs - argv = ["-P"] + self.commonArgv - update = self._updateProgressWindow - - title = P_("Formatting DASD Device", "Formatting DASD Devices", c) - msg = P_("Preparing %d DASD device for use with Linux..." % c, - "Preparing %d DASD devices for use with Linux..." % c, c) - - if intf: - if self.totalCylinders: - pw = intf.progressWindow(title, msg, 1.0) - else: - pw = intf.progressWindow(title, msg, 100, pulse=True) - - for dasd, bypath in self._dasdlist: - log.info("Running dasdfmt on %s" % (bypath,)) - arglist = argv + ["/dev/" + dasd] - - try: - rc = util.run_program([self.dasdfmt] + arglist) - except Exception as e: - raise DasdFormatError(e, bypath) - - if rc: - raise DasdFormatError("dasdfmt failed: %s" % rc, bypath) - - if intf: - pw.pop() - - def addDASD(self, dasd): - """ Adds a DASDDevice to the internal list of DASDs. """ - if dasd: - self._devices.append(dasd) - - def clear_device_list(self): - """ Clear the device list to force re-populate on next access. """ - self._devices = [] - - def write(self): - """ Write /etc/dasd.conf to target system for all DASD devices - configured during installation. - """ - if self._devices == []: - return - - f = open(os.path.realpath(ROOT_PATH + "/etc/dasd.conf"), "w") - for dasd in self._devices: - fields = [dasd.busid] + dasd.getOpts() - f.write("%s\n" % (" ".join(fields),)) - f.close() - - def _updateProgressWindow(self, data, callback_data=None): - """ Reads progress output from dasdfmt and collects the number of - cylinders completed so the progress window can update. - """ - if not callback_data: - return - - if data == '\n': - # each newline we see in this output means one more cylinder done - self._completedCylinders += 1.0 - callback_data.set(self._completedCylinders / self.totalCylinders) - -# Create DASD singleton -DASD = DASD() - -# vim:tw=78:ts=4:et:sw=4 |