lars
de3280806f
plugin interface changed ("prepareForm" removed) plugins do not raise exceptions anymore first part of the partitioning plugin device-specific stuff moved to CryptoBoxTools
132 lines
3.4 KiB
Python
132 lines
3.4 KiB
Python
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
|
|
|