#!/usr/bin/python # # raid.py - raid probing control # # Erik Troan # # Copyright 2001 Red Hat, Inc. # # This software may be freely redistributed under the terms of the GNU # library public license. # # You should have received a copy of the GNU Library Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # XXX partedify import _balkan import isys import os def scanForRaid(drives): raidSets = {} raidDevices = {} for d in drives: isys.makeDevInode(d, "/tmp/" + d) try: parts = _balkan.readTable('/tmp/' + d) except SystemError, msg: parts = [] os.remove("/tmp/" + d) for i in range(0, len(parts)): (type, start, size) = parts[i] if type != _balkan.RAID: continue dev = "%s%d" % (d, i + 1) try: (major, minor, raidSet, level, nrDisks, totalDisks, mdMinor) =\ isys.raidsb(dev) except ValueError: # bad magic, this can't be part of our raid set continue if raidSets.has_key(raidSet): (knownLevel, knownDisks, knownMinor, knownDevices) = \ raidSets[raidSet] if knownLevel != level or knownDisks != totalDisks or \ knownMinor != mdMinor: # Raise hell raise SystemError, ("raid set inconsistency for md%d: " "all drives in this raid set do not " "agree on raid parameters" % (mdMinor,)) knownDevices.append(dev) raidSets[raidSet] = (knownLevel, knownDisks, knownMinor, knownDevices) else: raidSets[raidSet] = (level, totalDisks, mdMinor, [dev,]) if raidDevices.has_key(mdMinor): if (raidDevices[mdMinor] != raidSet): raise SystemError, ("raid set inconsistency for md%d: " "found members of multiple raid sets " "that claim to be md%d" % (mdMinor, mdMinor)) else: raidDevices[mdMinor] = raidSet raidList = [] for key in raidSets.keys(): (level, totalDisks, mdMinor, devices) = raidSets[key] if len(devices) < totalDisks: str = ("missing components of raid device md%d. The " "raid device needs %d drives and only %d were found." % (mdMinor, len(devices), totalDisks)) raise SystemError, str raidList.append((mdMinor, devices)) return raidList def startAllRaid(driveList): mdList = [] for (mdDevice, deviceList) in scanForRaid(driveList): devName = "md%d" % (mdDevice,) isys.raidstart(devName, deviceList[0]) mdList.append(devName) return mdList def stopAllRaid(mdList): for dev in mdList: isys.raidstop(dev)