diff options
Diffstat (limited to 'lib/raw_format.py')
-rw-r--r-- | lib/raw_format.py | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/lib/raw_format.py b/lib/raw_format.py new file mode 100644 index 0000000..8ef036b --- /dev/null +++ b/lib/raw_format.py @@ -0,0 +1,157 @@ +#!/usr/bin/python +# +# imported from project Mintstick, by Clement Lefebvre +# +# Copyright (C) 2013 THE isodumper'S COPYRIGHT HOLDER +# This file is distributed under the same license as the isodumper package. +# +# 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, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Author isodumper software= papoteur <papoteur@mageialinux-online.org> + +import os, sys +import getopt +import parted +from subprocess import call + +sys.path.append('/usr/lib/isodumper') + +def do_umount(target): + mounts = get_mounted(target) + if mounts: + print 'Unmounting all partitions of '+target+':' + for mount in mounts: + print 'Trying to unmount '+mount[0]+'...' + try: + retcode = call('umount '+mount[0], shell=True) + if retcode < 0: + print 'Error, umount '+mount[0]+' was terminated by signal '+str(retcode) + sys.exit(6) + else: + if retcode == 0: + print mount[0]+' successfully unmounted' + else: + print 'Error, umount '+mount[0]+' returned '+str(retcode) + sys.exit(6) + except OSError, e: + print 'Execution failed: '+str(e) + sys.exit(6) + + +def get_mounted(target): + try: + lines = [line.strip("\n").split(" ") for line in open ("/etc/mtab", "r").readlines()] + return [mount for mount in lines if mount[0].startswith(target)] + except: + print 'Could not read mtab !' + sys.exit(6) + +def raw_format(device_path, fstype, volume_label, uid, gid): + + do_umount(device_path) + + # First erase MBR and partition table , if any + os.system ("dd if=/dev/zero of=%s bs=512 count=1 >/dev/null 2>&1" % device_path) + + device = parted.getDevice(device_path) + + # Create a default partition set up + disk = parted.freshDisk(device, 'msdos') + disk.commit() + regions = disk.getFreeSpaceRegions() + + if len(regions) > 0: + #print "Build partition" + # Define size + start = parted.sizeToSectors(1, "MiB", device.sectorSize) + #print "start %s" % start + end = device.getLength() - start - 1024 + #print end + + # Alignment + #cylinder = device.endSectorToCylinder(end) + #end = device.endCylinderToSector(cylinder) + #print end + try: + geometry = parted.Geometry(device=device, start=start, end=end) + except: + print "Geometry error - Can't create partition" + sys.exit(5) + + # fstype + fs = parted.FileSystem(type=fstype, geometry=geometry) + + # Create partition + partition = parted.Partition(disk=disk, type=parted.PARTITION_NORMAL, geometry=geometry, fs=fs) + constraint = parted.Constraint(exactGeom=geometry) + disk.addPartition(partition=partition, constraint=constraint) + disk.commit() + + # Format partition according to the fstype specified + if fstype == "fat32": + os.system("mkdosfs -F 32 -n \"%s\" %s >/dev/null 2>&1" % (volume_label, partition.path)) + if fstype == "ntfs": + os.system("mkntfs -f -L \"%s\" %s >/dev/null 2>&1" % (volume_label, partition.path)) + elif fstype == "ext4": + os.system("mkfs.ext4 -E root_owner=%s:%s -L \"%s\" %s >/dev/null 2>&1" % (uid, gid, volume_label, partition.path)) + sys.exit(0) + + + + + +def main(): + # parse command line options + try: + opts, args = getopt.getopt(sys.argv[1:], "hd:f:l:u:g:", ["help", "device=","filesystem=","label=","uid=","gid="]) + except getopt.error, msg: + print msg + print "for help use --help" + sys.exit(2) + + for o, a in opts: + if o in ("-h", "--help"): + print "Usage: %s -d device -f filesystem -l volume_label\n" % sys.argv[0] + print "-d|--device : device path" + print "-f|--filesystem : filesystem\n" + print "-l|--label : volume label\n" + print "-u|--uid : uid of user\n" + print "-g|--gid : gid of user\n" + print "Example : %s -d /dev/sdj -f fat32 -l \"USB Stick\" -u 1000 -g 1000" % sys.argv[0] + sys.exit(0) + elif o in ("-d"): + device = a + elif o in ("-f"): + if a not in [ "fat32", "ntfs", "ext4" ]: + print "Specify fat32, ntfs or ext4" + sys.exit(3) + fstype = a + elif o in ("-l"): + label = a + elif o in ("-u"): + uid = a + elif o in ("-g"): + gid = a + + argc = len(sys.argv) + if argc < 11: + print "Too few arguments" + print "for help use --help" + exit(2) + + raw_format(device, fstype, label, uid, gid) + +if __name__ == "__main__": + main() |