import re import subprocess import imp import os import logging import CryptoBoxTools PartTypes = { "linux" : "L", "windows" : "0xC"} logger = logging.getLogger("CryptoBox") def doAction(hdf, cbox, **args): try: step = args["step"] del args["step"] except KeyError: step = "select_device" if step == "add_partition": return __actionAddPartition(hdf, cbox, args) if step == "del_partition": return __actionDelPartition(hdf, cbox, args) elif step == "finish": return __actionFinish(hdf, cbox, args) else: # for "select_device" and for invalid targets return __actionSelectDevice(hdf, cbox, args) def getStatus(cbox): return "%d.%d.%d.%d" % __getCurrentIP(cbox) def __isDeviceValid(device, cbox): if not cbox.isDeviceAllowed(device): return False if not device in CryptoBoxTools.getParentBlockDevices(): return False def __actionSelectDevice(hdf, cbox, args): block_devices = [e for e in CryptoBoxTools.getParentBlockDevices() if cbox.isDeviceAllowed(e)] counter = 0 for a in block_devices: hdf["Data.Plugins.partition.BlockDevices.%d" % counter] = a cbox.log.debug("found a suitable block device: %s" % a) counter += 1 return "select_device" def __actionAddPartition(hdf, cbox, args): try: device = args["block_device"] except KeyError: return __actionSelectDevice(hdf, cbox, args) #FIXME: the following check should obviuosly get reversed if __isDeviceValid(device, cbox): return __actionSelectDevice(hdf, cbox, args) size = __getDeviceSize(device) hdf["Data.Plugins.partition.Device"] = device hdf["Data.Plugins.partition.Device.Size"] = size parts = __getPartitionsFromArgs(args, size) __setPartitionData(hdf, parts, size) return "set_partitions" def __actionDelPartition(hdf, cbox, args): try: device = args["block_device"] except KeyError: return __actionSelectDevice(hdf, cbox, args) #FIXME: the following check should obviuosly get reversed if __isDeviceValid(device, cbox): return __actionSelectDevice(hdf, cbox, args) size = __getDeviceSize(device) hdf["Data.Plugins.partition.Device"] = device hdf["Data.Plugins.partition.Device.Size"] = size parts = __getPartitionsFromArgs(args, size) __setPartitionData(hdf, parts[:-1], size) return "set_partitions" def __setPartitionData(hdf, parts, size): availSize = size i = 0 for part in parts: logger.debug(part) hdf["Data.Plugins.partition.Parts.%d.Size" % i] = part["size"] hdf["Data.Plugins.partition.Parts.%d.Type" % i] = part["type"] availSize -= part["size"] i += 1 hdf["Data.Plugins.partition.availSize"] = availSize for t in PartTypes.keys(): hdf["Data.Plugins.partition.Types.%s" % t] = t def __getPartitionsFromArgs(args, maxSize): parts = [] done = False availSize = maxSize i = -1 while not done: i += 1 try: size = int(args["part%d_size" % i]) partType = args["part%d_type" % i] if int(size) > availSize: continue if int(size) <= 0: continue if not partType in PartTypes.keys(): continue parts.append({"size":size, "type":partType}) availSize -= size except TypeError: pass except KeyError: done = True return parts def __getDeviceSize(device): rdev = os.stat(device).st_rdev minor = os.minor(rdev) major = os.major(rdev) for f in file("/proc/partitions"): try: elements = f.split() if len(elements) != 4: continue if (int(elements[0]) == major) and (int(elements[1]) == minor): return int(elements[2]) except ValueError: pass return 0