#!/usr/bin/python

import _balkan
import isys
import os

def scanForRaid(drives):
   for d in drives:
       isys.makeDevInode(d, "/tmp/" + d)
       try:
           parts = _balkan.readTable('/tmp/' + d)
       except SystemError, msg:
           parts = []

       os.remove("/tmp/" + d)
       raidSets = {}
       raidDevices = {}
       for i in range(0, len(parts) - 1):
           (type, start, size) = parts[i]
           if type != 7: continue

           dev = "%s%d" % (d, i + 1)

           (major, minor, raidSet, level, nrDisks, totalDisks, mdMinor) = \
               isys.raidsb(dev)

           if raidSets.has_key(raidSet):
               (knownLevel, knownDisks, knownMinor, knownDevices) = \
                       raidSets[raidSet]
               if knownLevel != level or knownDisks != totalDisks or \
                  knownMinor != mdMinor:
                      # Raise hell
                      pass
               knownDevices.append(dev)
           else:
               raidSets[raidSet] = (level, totalDisks, mdMinor, [dev,])

           if raidDevices.has_key(mdMinor):
               if (raidDevices[mdMinor] != raidSet):
                   # Raise hell
                   pass
           else:
               raidDevices[mdMinor] = raidSet

       raidList = []
       for key in raidSets.keys():
           (level, totalDisks, mdMinor, devices) = raidSets[key]
           if len(devices) != totalDisks:
               # raise hell
               pass
           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)