diff --git a/new_partition/finddisk.sh b/new_partition/finddisk.sh deleted file mode 100755 index fed7337..0000000 --- a/new_partition/finddisk.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash - -finddisks() { - workdir="$PWD" - cd /sys/block - # ide devices - for dev in $(ls | egrep '^hd'); do - if [ "$(cat $dev/device/media)" = "disk" ]; then - echo -e "/dev/$dev$3" - fi - done - #scsi/sata devices, and virtio blockdevices (/dev/vd*) - for dev in $(ls | egrep '^[sv]d'); do - # TODO: what is the significance of 5? ASKDEV - if ! [ "$(cat $dev/device/type)" = "5" ]; then - echo -e "/dev/$dev$3" - fi - done - # cciss controllers - if [ -d /dev/cciss ] ; then - cd /dev/cciss - for dev in $(ls | egrep -v 'p'); do - echo -e "/dev/cciss/$dev$3" - done - fi - # Smart 2 controllers - if [ -d /dev/ida ] ; then - cd /dev/ida - for dev in $(ls | egrep -v 'p'); do - echo -e "/dev/ida/$dev$3" - done - fi - cd "$workdir" -} - -findblockdevices() { - workdir="$PWD" - for devpath in $(finddisks) - do - disk=$(echo $devpath | sed 's|.*/||') - echo -e "/dev/$disk$3" - cd /sys/block/$disk - for part in $disk* - do - # check if not already assembled to a raid device. TODO: what is the significance of the 5? ASKDEV - if ! [ "$(grep $part /proc/mdstat 2>/dev/null)" -o "$(fstype 2>/dev/null /dev/null | grep "5")" ] - then - if [ -d $part ] - then - echo -e "/dev/$part$3" - fi - fi - done - done - # include any mapped devices - for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control) - do - echo -e "/dev/mapper/$devpath$3" - done - # include any raid md devices - for devpath in $(ls -d /dev/md* 2>/dev/null| grep '[0-9]' 2>/dev/null) - do - if grep -qw $(echo $devpath /proc/mdstat | sed -e 's|/dev/||g') - then - echo -e "$devpath$3" - fi - done - # inlcude cciss controllers - if [ -d /dev/cciss ] - then - cd /dev/cciss - for dev in $(ls | egrep 'p') - do - echo -e "/dev/cciss/$dev$3" - done - fi - # inlcude Smart 2 controllers - if [ -d /dev/ida ] - then - cd /dev/ida - for dev in $(ls | egrep 'p') - do - echo -e "/dev/ida/$dev$3" - done - fi - - cd "$workdir" -} - -#findblockdevices |grep -v [0-9]|while read f;\ -#do fdisk -l ${f} 2>/dev/null; done|\ -#grep "Disk /dev" |awk -F "," '{print $1}'|\ -#awk -F ":" '{print $1,$2}' - -findblockdevices |grep -v [0-9] diff --git a/new_partition/interface_partition.py b/new_partition/interface_partition.py new file mode 100755 index 0000000..c1690fb --- /dev/null +++ b/new_partition/interface_partition.py @@ -0,0 +1,527 @@ +#!/usr/bin/env python +from snack import * +import gettext, sys, os, re, string, time + +import partition_data as p_d + +screen = SnackScreen() +screen.drawRootText(0, 0, "Welcome to Rocky Security OS") +screen.pushHelpLine( (" F1-New F2-Delete F3-Boot F4-Raid F12-OK ")) + +global count +count = 0 +def DEBUG(): + global count + print 'debug' + str(count) + count = count + 1 + +global base_unit +base_unit = 'B' + +# the origin unit is 's' +#def pretty_unit(num): +# if num*0.5*1.024 < 10*1000: +# # < 10M unit is kB +# num_pretty = num*0.5*1.024 +# unit = 'kB' +# elif num*0.5*1.024 < 10*1000*1000: +# # < 10G unit is MB +# num_pretty = num*0.5*1.024/1000 +# unit = 'MB' +# elif num*0.5*1.024 < 10000000000: +# # < 10T unit is GB +# num_pretty = num*0.5*1.024/1000/1000 +# unit = 'GB' +# return str("%.0f" %num_pretty) + unit +# +#def unit_to_s(num): +# if re.search('kB', num): +# # unit kB to s +# num_s = num/1.024*2 +# elif re.search('MB', num): +# # unit MB to s +# num_s = num/1000/1.024*2 +# elif re.search('GB', num): +# # unit GB to s +# num_s = num/1000/1000/1.024*2 +# return num_s + +#the origin unit is 'byte' +def pretty_unit(num): + num = int(num) + global num_pretty + global unit_pretty + if num < 1000: + # < 1k unit is B + num_pretty = num + unit_pretty = 'B' + elif num/1000 < 10*1000: + # < 10M unit is kB + num_pretty = num/1000 + unit_pretty = 'kB' + elif num/1000/1000 < 10*1000: + # < 10G unit is MB + num_pretty = num/1000/1000 + unit_pretty = 'MB' + elif num/1000/1000/1000 < 10*1000: + # < 10T unit is GB + num_pretty = num/1000/1000/1000 + unit_pretty = 'GB' + return str("%.1f" %num_pretty) + unit_pretty + +def unit_to_byte(num_unit): + #num = int(filter(str.isdigit, str(num_unit))) + # because int('10.0') error + num = int(float(get_size_num(str(num_unit)))) + if re.search('kB', num_unit): + # unit kB to byte + num_byte = num*1000 + elif re.search('MB', num_unit): + # unit MB to byte + num_byte = num*1000*1000 + elif re.search('GB', num_unit): + # unit GB to byte + num_byte = num*1000*1000*1000 + return num_byte + +def sort_partition(dev): + list_partition = [] + list_partition_sorted = [] + for partition in p_d.Partition.dict[dev]['partition'].keys(): + list_partition.append(partition) + list_partition_sorted.append(partition) + print list_partition + for partition in list_partition: + sn = p_d.Partition.dict[dev]['partition'][partition]['sn'] + list_partition_sorted[int(sn)-1] = partition + return list_partition_sorted + +def showPartitionWindow(): + global clb + global bb + bb = ButtonBar (screen, (("New", "new", "F1"),("Delete", "delete", "F2"),("Boot", "boot", "F3"),\ + ("Raid", "raid", "F4"),("OK", "ok", "F12"),("Cancel", "cancel"),)) + + clb = CListbox(height=10, cols=6, + col_widths=[19,11,11,11,10,12], + scroll=1, returnExit = 1, + width=85, col_pad=2, + col_labels=['Device', 'Start', 'End', 'Size', 'Type', 'Flags'], + col_label_align=[CENTER,CENTER,CENTER,CENTER,CENTER,CENTER]) + + for dev in sorted(p_d.Partition.dict.keys()): + # dev: /dev/sda dev_name: sda; dev: /dev/cciss/c0d0 dev_name:cciss/c0d0 + dev_name = dev.split('/dev/')[1] + partition_table = p_d.Partition.dict[dev]['partition_table'] + dev_size = p_d.Partition.dict[dev]['disk_size'] + #dev_size_pretty = pretty_unit(filter(str.isdigit, dev_size)) + + clb.append(["%s" %(dev),"","","","",""], \ + "dev:%s:%s" %(dev,dev_size), [LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT]) + + if partition_table == None: + continue + + list_partition_all_sorted = p_d.sort_partitions(p_d.Partition.dict, dev, "all") + for partition in list_partition_all_sorted: + start = p_d.Partition.dict[dev]['partition'][partition]['start'] + end = p_d.Partition.dict[dev]['partition'][partition]['end'] + size = p_d.Partition.dict[dev]['partition'][partition]['size'] + ptype = p_d.Partition.dict[dev]['partition'][partition]['type'] + flags = p_d.Partition.dict[dev]['partition'][partition]['flags'] + + try: + if int(filter(str.isdigit, start)) < 2000000 and \ + int(filter(str.isdigit, size)) < 2000000: + continue + except: + pass + + start_pretty = pretty_unit(filter(str.isdigit, str(start))) + end_pretty = pretty_unit(filter(str.isdigit, str(end))) + size_pretty = pretty_unit(filter(str.isdigit, str(size))) + + # pretty free space partition + if re.search('free', partition): + partition_pretty = 'Free Space' + else: + partition_pretty = partition + + clb.append([" %s" %(partition_pretty),"%s" %(start_pretty),"%s" %(end_pretty),"%s" %(size_pretty),"%s" %(ptype),"%s" %(flags)],\ + "partition:%s:%s:%s:%s:%s:%s:%s" %(partition, dev, size, start, end, partition_table, size_pretty),\ + [LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT]) + + sg = Grid(2, 3) + sg.setField(bb, 0, 1, anchorLeft = 1) + g = Grid(1, 3) + g.setField(clb, 0, 0) + g.setField(sg, 0, 2) + g.place(1, 1) + screen.gridWrappedWindow(g, "Partitioning") + f = Form() + f.add(bb) + f.add(clb) + f.addHotKey("F1") + f.addHotKey("F2") + f.addHotKey("F3") + f.addHotKey("F4") + f.addHotKey("F12") + + global res + res =f.run() + screen.refresh + +def get_size_num(size): + if re.search('kB', size): + size_num = size.split('kB')[0] + elif re.search('MB', size): + size_num = size.split('MB')[0] + elif re.search('GB', size): + size_num = size.split('GB')[0] + return size_num + +def show_error(tips): + g21 = GridForm(screen, "Error", 1, 2) + g21.add(Label("%s." %(tips)), 0, 0) + g21.add(Button("OK"), 0, 1) + g21.runOnce() + +def check_size_set(size, maxsize): + if size == "": + return ("Must specify a value") + try: + if float(size) > float(maxsize): + return ("Requested value is too large") + except: + return ("Requested value is not an number") + +def count_primary_extended(dev): + count_primary = 0 + count_extended = 0 + for p in p_d.sort_partitions(p_d.Partition.dict, dev): + if p_d.Partition.dict[dev]['partition'][p]['type'] == 'primary': + count_primary += 1 + if p_d.Partition.dict[dev]['partition'][p]['type'] == 'extended': + count_extended += 1 + return (count_primary, count_extended) + +def get_extended_start_end(dev): + extended_start = '' + extended_end = '' + for p in p_d.sort_partitions(p_d.Partition.dict, dev): + if p_d.Partition.dict[dev]['partition'][p]['type'] == 'extended': + extended_start = p_d.Partition.dict[dev]['partition'][p]['start'] + extended_end = p_d.Partition.dict[dev]['partition'][p]['end'] + return (extended_start, extended_end) + +def add_partition(ptype='', extended='', label=''): + free_space = clb.current().split(":")[1] + dev = clb.current().split(":")[2] + dev_name = dev.split("/dev/")[1] + size = clb.current().split(":")[3] + size_pretty = clb.current().split(":")[7] + free_space_start = filter(str.isdigit, clb.current().split(":")[4]) + free_space_end = filter(str.isdigit, clb.current().split(":")[5]) + free_space_sn = int(p_d.Partition.dict[dev]['partition'][free_space]['sn']) + + # 4k assign + #if int(free_space_start) < 2*1000*1000: + # free_space_start_real = free_space_start + # free_space_start = '0%' + + size_num = filter(str.isdigit, size) + #size_num = get_size_num(size) + unit = filter(str.isalpha, size_pretty) + #size_pretty_num = filter(str.isdigit, size_pretty) + size_pretty_num = get_size_num(size_pretty) + + bb2 = ButtonBar(screen, (("OK", "ok"), ("Cancel", "cancel"))) + sg21 = Grid(2,1) + typeLbl = Label("File System type: ") + lb_fstype = Listbox(height=3, scroll=1) + list_fs = ['ext2', 'ext3', 'ext4', 'linux-swap', 'raid', 'reiserfs', 'xfs', 'jfs'] + for fs in list_fs: + lb_fstype.append(fs, fs) + lb_fstype.setCurrent('ext3') + sg21.setField(typeLbl, 0, 0, anchorLeft=0) + sg21.setField(lb_fstype, 1, 0) + + sg22 = Grid(2,1) + sizeLbl = Label("Size(%s): " %(unit)) + entry_size = Entry(10, size_pretty_num) + sg22.setField(sizeLbl, 0, 0) + sg22.setField(entry_size, 1, 0) + + sg23 = Grid(2,1) + rb_primary = SingleRadioButton("primary", None, 1) + rb_extended = SingleRadioButton("extended", rb_primary) + sg23.setField(rb_primary, 0, 0) + sg23.setField(rb_extended, 1, 0) + + cb_boot = Checkbox("Force to be a bootable partition") + + g2 = GridForm(screen, "New Partition(%s)" %(dev), 1, 9) + g2.add(sg21,0,0) + + g2.add(Label(""),0,1) + g2.add(sg22,0,2) + g2.add(Label(""),0,3) + g2.add(cb_boot,0,4) + g2.add(Label(""),0,5) + + if extended == "extended" or label == 'gpt': + g2.add(bb2, 0, 6) + res2 = g2.runOnce() + if label == 'gpt': + ptype = 'primary' + else: + g2.add(sg23,0,6) + g2.add(Label(""),0,7) + g2.add(bb2, 0, 8) + res2 = g2.runOnce() + if rb_primary.selected(): + ptype = 'primary' + else: + ptype = 'extended' + + if bb2.buttonPressed(res2) == "ok": + #if ptype == 'extended' and count_extended != 0: + # show_error('An extended partition has existed !You can not create any more !') + fs_set = lb_fstype.current() + tips = check_size_set(entry_size.value(),size_pretty_num) + if tips: + show_error(tips) + else: + size_set_pretty = entry_size.value() + unit + size_set_num = unit_to_byte(size_set_pretty) + size_set = str(size_set_num) + base_unit + partition_start = free_space_start + base_unit + partition_end = str(int(free_space_start) + size_set_num) + base_unit + + flags = '' + if cb_boot.value() == 1: + if flags == '': + flags = 'boot' + else: + flags = flags + ',boot' + if fs_set == 'raid': + if flags == '': + flags = 'raid' + else: + flags = flags + ',raid' + + partition_num = 0 + list_partition_sorted = p_d.sort_partitions(p_d.Partition.dict,dev,'partition') + list_free_sorted = p_d.sort_partitions(p_d.Partition.dict,dev,'free') + if list_partition_sorted == []: + # an empty disk + pass + else: + if ptype == 'logical': + partition_num = 4 + for p in list_partition_sorted: + if int(p_d.Partition.dict[dev]['partition'][p]['num']) > partition_num \ + and p_d.Partition.dict[dev]['partition'][p]['type'] =='logical': + partition_num = int(p_d.Partition.dict[dev]['partition'][p]['num']) + else: + if label == 'msdos': + for p in list_partition_sorted: + if int(p_d.Partition.dict[dev]['partition'][p]['num']) > partition_num \ + and p_d.Partition.dict[dev]['partition'][p]['type'] != 'logical': + partition_num = int(p_d.Partition.dict[dev]['partition'][p]['num']) + elif label == 'gpt': + if int(p_d.Partition.dict[dev]['partition'][list_partition_sorted[0]]['num']) != 1: + pass + else: + for i in range(len(list_partition_sorted)): + #print int(p_d.Partition.dict[dev]['partition'][sorted(list_partition)[i]]['num']) + if i == len(list_partition_sorted) - 1 or \ + int(p_d.Partition.dict[dev]['partition'][list_partition_sorted[i]]['num']) \ + != int(p_d.Partition.dict[dev]['partition'][list_partition_sorted[i+1]]['num']) - 1: + partition_num = int(p_d.Partition.dict[dev]['partition'][list_partition_sorted[i]]['num']) + break + + partition_num += 1 + partition = dev + str(partition_num) + partition_sn = free_space_sn + + if size_set_pretty == size_pretty: + partition_end = free_space_end + if len(list_free_sorted) > 1: + for p in list_free_sorted: + if int(p_d.Partition.dict[dev]['partition'][p]['sn']) >= int(free_space_sn): + p_num = int(p_d.Partition.dict[dev]['partition'][p]['num']) + p_d.Partition.dict[dev]['partition'][p]['sn'] = p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['sn'] + p_d.Partition.dict[dev]['partition'][p]['start'] = p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['start'] + p_d.Partition.dict[dev]['partition'][p]['end'] = p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['end'] + p_d.Partition.dict[dev]['partition'][p]['size'] = p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['size'] + p_d.delete_one_partition(p_d.Partition.dict, dev, 'free '+str(len(list_free_sorted)+1)) + p_d.delete_one_partition(p_d.Partition.dict, dev, 'free '+str(len(list_free_sorted))) + else: + del p_d.Partition.dict[dev]['partition'][free_space] + else: + list_partition_all_sorted = p_d.sort_partitions(p_d.Partition.dict, dev, 'all') + p_d.Partition.dict[dev]['partition'][free_space]['start'] = str(int(free_space_start) + size_set_num + 1) + base_unit + for p in list_partition_all_sorted: + if p_d.Partition.dict[dev]['partition'][p]['sn'] > free_space_sn-1: + p_d.Partition.dict[dev]['partition'][p]['sn'] = int(p_d.Partition.dict[dev]['partition'][p]['sn']) + 1 + p_d.Partition.dict[dev]['partition'][free_space]['sn'] = int(free_space_sn) + 1 + p_d.Partition.dict[dev]['partition'][free_space]['size'] = \ + str(int(filter(str.isdigit,p_d.Partition.dict[dev]['partition'][free_space]['end'])) - \ + int(filter(str.isdigit,p_d.Partition.dict[dev]['partition'][free_space]['start']))) + base_unit + + p_d.Partition.dict[dev]['partition'][partition]['sn'] = int(partition_sn) + p_d.Partition.dict[dev]['partition'][partition]['num'] = int(partition_num) + p_d.Partition.dict[dev]['partition'][partition]['start'] = partition_start + p_d.Partition.dict[dev]['partition'][partition]['end'] = partition_end + p_d.Partition.dict[dev]['partition'][partition]['size'] = size_set + p_d.Partition.dict[dev]['partition'][partition]['type'] = ptype + p_d.Partition.dict[dev]['partition'][partition]['filesystem'] = fs_set + p_d.Partition.dict[dev]['partition'][partition]['flags'] = flags + + if ptype == 'extended': + list_partition_all_sorted = p_d.sort_partitions(p_d.Partition.dict,dev, 'all') + list_free_sorted = p_d.sort_partitions(p_d.Partition.dict,dev,'free') + extended_free_space_sn = partition_sn + 1 + free_num = 0 + if len(list_partition_all_sorted) == partition_sn: + if list_free_sorted != []: + for f in list_free_sorted: + if p_d.Partition.dict[dev]['partition'][f]['num'] > free_num: + free_num = p_d.Partition.dict[dev]['partition'][f]['num'] + else: + for p in list_partition_all_sorted[::-1]: + p_num = p_d.Partition.dict[dev]['partition'][p]['num'] + if p_d.Partition.dict[dev]['partition'][p]['sn'] > partition_sn: + if re.search('free', p): + p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['sn'] = p_d.Partition.dict[dev]['partition'][p]['sn']+1 + p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['num'] = p_num + 1 + p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['start'] =\ + p_d.Partition.dict[dev]['partition'][p]['start'] + p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['end'] =\ + p_d.Partition.dict[dev]['partition'][p]['end'] + p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['size'] =\ + p_d.Partition.dict[dev]['partition'][p]['size'] + p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['type'] = ' ' + p_d.Partition.dict[dev]['partition']['free '+str(p_num+1)]['flags'] = ' ' + else: + p_d.Partition.dict[dev]['partition'][p]['sn'] = p_d.Partition.dict[dev]['partition'][p]['sn']+1 + + if p_d.Partition.dict[dev]['partition'][p]['sn'] == partition_sn+1: + p_d.delete_one_partition(p_d.Partition.dict, dev, p) + if list_free_sorted != []: + for f in list_free_sorted: + if p_d.Partition.dict[dev]['partition'][f]['sn'] < extended_free_space_sn: + if p_d.Partition.dict[dev]['partition'][f]['num'] > free_num: + free_num = p_d.Partition.dict[dev]['partition'][f]['num'] + free_num += 1 + p_d.Partition.dict[dev]['partition']['free '+str(free_num)]['sn'] = int(partition_sn+1) + p_d.Partition.dict[dev]['partition']['free '+str(free_num)]['num'] = int(free_num) + p_d.Partition.dict[dev]['partition']['free '+str(free_num)]['start'] = partition_start + p_d.Partition.dict[dev]['partition']['free '+str(free_num)]['end'] = partition_end + p_d.Partition.dict[dev]['partition']['free '+str(free_num)]['size'] = size_set + p_d.Partition.dict[dev]['partition']['free '+str(free_num)]['type'] = '' + p_d.Partition.dict[dev]['partition']['free '+str(free_num)]['flags'] = '' + +def del_partition(partition,dev): + bb3 = ButtonBar(screen, (("Cancel", "cancel"), ("Delete", "delete"))) + g3 = GridForm(screen, "Del Partition", 1, 3) + g3.add(TextboxReflowed(45, 'You are about to delete the partition "%s".' \ + %(partition)), 0, 0) + g3.add(Label(""),0,1) + g3.add(bb3, 0, 2) + res3 = g3.runOnce() + if bb3.buttonPressed(res3) == "delete": + list_partition_all_sorted = p_d.sort_partition(p_d.Partition.dict, dev, "all") + partition_sn = int(p_d.Partition.dict[dev]['partition'][partition]['sn']) + for p in list_partition_all_sorted: + p_sn = p_d.Partition.dict[dev]['partition'][p]['sn'] + if p_sn == partition_sn -1 and re.search('free', p): + p_d.Partition.dict[dev]['partition'][p]['end'] + + + + + +p_d.Partition.init_from_os() + +while(1): + global ret + showPartitionWindow() + if bb.buttonPressed(res) == "cancel": + ret = 1 + break + if bb.buttonPressed(res) == "ok": + ret = 0 + break + # assign label(msdos or gpt) of dev + if re.search("dev:", clb.current()) and bb.buttonPressed(res) == "new": + dev = clb.current().split(":")[1] + dev_size = clb.current().split(":")[2] + rb = RadioBar(screen, (("gpt", "gpt", 0),("msdos", "msdos", 1))) + bb1 = ButtonBar(screen, (("Cancel", "cancel"), ("OK", "ok"))) + g = GridForm(screen, "Partition table", 1, 4) + g.add(TextboxReflowed(25, 'Warning! A new partition table will be created on "%s" and the data on it will be cleared.' \ + %(dev)), 0, 0) + g.add(Label(""),0,1) + g.add(rb,0,2,(0,0,0,1)) + g.add(bb1, 0, 3) + res1 = g.runOnce() + if bb1.buttonPressed(res1) == "ok": + label = rb.getSelection() + p_d.Partition.dict[dev]['partition_table'] = label + p_d.delete_all_partitions(p_d.Partition.dict, dev) + + # add partition when dev's label is msdos + elif re.search("partition:free", clb.current()) and \ + clb.current().split(':')[6] == 'msdos'and \ + bb.buttonPressed(res) == "new": + dev = clb.current().split(":")[2] + dev_name = dev.split("/dev/")[1] + free_space_start = clb.current().split(":")[4] + free_space_end = clb.current().split(":")[5] + free_space_size = clb.current().split(":")[3] + + (count_primary, count_extended) = count_primary_extended(dev) + # add logical partition when an extended partition exists + if re.search('extended', str(p_d.Partition.dict[dev])): + (extended_start, extended_end) = get_extended_start_end(dev) + if int(filter(str.isdigit,free_space_start)) >= int(filter(str.isdigit,extended_start)) \ + and int(filter(str.isdigit,free_space_end)) <= int(filter(str.isdigit,extended_end)): + ptype = 'logical' + #print 'ptype' + #time.sleep(5) + add_partition(ptype, 'extended', 'msdos') + elif int(filter(str.isdigit,free_space_start)) >= int(filter(str.isdigit,extended_end)): + show_error("Bad partition scheme ! This free space can't be used any more !") + else: + if count_primary == 3: + show_error('You can not add new primary or extended partition any more !') + else: + ptype = 'primary' + add_partition(ptype, 'extended', 'msdos') + else: + if count_primary == 4: + show_error("You can't add partitions any more !") + else: + add_partition(ptype='', extended='', label='msdos') + elif re.search("partition:free", clb.current()) and \ + clb.current().split(':')[6] == 'gpt'and \ + bb.buttonPressed(res) == "new": + dev = clb.current().split(":")[2] + free_space_start = clb.current().split(":")[4] + free_space_end = clb.current().split(":")[5] + free_space_size = clb.current().split(":")[3] + add_partition(ptype='primary', extended='', label='gpt') + elif re.search("partition:free", clb.current()) == None and \ + re.search("dev:", clb.current()) == None and \ + bb.buttonPressed(res) == "delete": + dev = clb.current().split(":")[2] + partition = clb.current().split(":")[1] + del_partition(partition, dev) + + + +screen.finish() +#p_d.pretty(p_d.Partition.dict) +p_d.write_to_xml_file() diff --git a/new_partition/list-devices b/new_partition/list-devices deleted file mode 100755 index 3005e66..0000000 --- a/new_partition/list-devices +++ /dev/null @@ -1,170 +0,0 @@ -#! /bin/sh -e -# get from debian-installer-utils list-devices-linux - -TYPE="$1" - -case $TYPE in - maybe-floppy) - #logger -t list-devices "deprecated parameter maybe-floppy" - TYPE=floppy - ;; - cd|disk|partition|floppy|maybe-usb-floppy|usb-partition) ;; - *) - echo "Usage: $0 cd|disk|partition|floppy|maybe-usb-floppy|usb-partition" >&2 - exit 2 - ;; -esac - -if [ ! -d /sys/block ]; then - exit 0 -fi -if type udevadm >/dev/null 2>&1; then - device_info () { - udevadm info -q "$1" -p "$2" 2>/dev/null - } -elif type udevinfo >/dev/null 2>&1; then - device_info () { - udevinfo -q "$1" -p "$2" 2>/dev/null - } -else - exit 0 -fi - -device_name () { - local name - if ! name="$(device_info name "$1")"; then - name="$(printf %s "${1##*/}" | \ - sed 's,!,/,g')" - fi - echo "/dev/$name" -} - -is_sataraid () { - grep -qs ^DMRAID- "$1/dm/uuid" -} - -is_sataraid_partition () { - # dmraid partitions are always slaved to another dm device - for slave in "$1"/slaves/dm-*; do - if [ -e "$slave" ]; then - return 0 - fi - done - return 1 -} - -if type dmraid >/dev/null 2>&1; then - raiddevs="$(dmraid -r -c || true)" -else - raiddevs= -fi - -# cloned-and-hacked from partman-base/init.d/parted -part_of_sataraid () { - local raiddev - for raiddev in $raiddevs; do - if [ "$(readlink -f "$raiddev")" = "$1" ]; then - return 0 - fi - done - return 1 -} - -syspaths= -scan_partition=false -case $TYPE in - partition) - for x in /sys/block/*/*[0-9]; do - [ -d "$x" ] || continue - syspaths="${syspaths:+$syspaths }$x" - done - for x in /sys/block/dm-*; do - [ -d "$x" ] || continue - (is_sataraid "$x" && is_sataraid_partition "$x") || continue - syspaths="${syspaths:+$syspaths }$x" - done - TYPE=disk - # Also allow misdetected USB devices - scan_partition=: - ;; - usb-partition) - for x in /sys/block/*/*; do - [ -d "$x" ] || continue - syspaths="${syspaths:+$syspaths }$x" - done - ;; - *) - for x in /sys/block/*; do - [ -d "$x" ] || continue - case $x in - /sys/block/dm-*) - if is_sataraid "$x" && is_sataraid_partition "$x"; then - continue - fi - ;; - *) - name="$(device_name "$x")" - if part_of_sataraid "$name"; then - continue - fi - ;; - esac - syspaths="${syspaths:+$syspaths }$x" - done - ;; -esac -for x in $syspaths; do - devpath="${x#/sys}" - match=false - case $TYPE in - floppy) - # TODO ugly special case for non-IDE floppies - case $devpath in - /block/fd[0-9]*) - match=: - ;; - esac - ;; - esac - if ! $match && [ "$TYPE" = cd ]; then - if device_info env "$devpath" | grep -q '^ID_CDROM='; then - match=: - fi - fi - if ! $match; then - if device_info env "$devpath" | grep -q "^ID_TYPE=$TYPE"; then - match=: - fi - fi - if ! $match && [ "$TYPE" = disk ]; then - case $devpath in - /block/cciss\!*|/block/ida\!*|/block/rd\!*|/block/mmcblk*|/block/vd[a-z]*|/block/xvd[a-z]*) - match=: - ;; - /block/dm-*) - # for now, we only understand dmraid - if is_sataraid "/sys$devpath"; then - match=: - fi - ;; - esac - fi - # Some USB sticks and CD drives are misdetected as floppy - # This allows to scan for those - if ! $match && ( $scan_partition || [ "$TYPE" = maybe-usb-floppy ] ); then - if device_info env "$devpath" | grep -q '^ID_BUS=usb' && \ - device_info env "$devpath" | grep -q '^ID_TYPE=floppy'; then - match=: - fi - fi - # Disk partitions, but only on USB drives - if ! $match && [ "$TYPE" = usb-partition ]; then - if device_info env "$devpath" | grep -q '^ID_BUS=usb' && \ - device_info env "$devpath" | grep -q '^ID_TYPE=disk'; then - match=: - fi - fi - if $match; then - device_name "/sys$devpath" - fi -done diff --git a/new_partition/new_partition.py b/new_partition/new_partition.py deleted file mode 100755 index 423b012..0000000 --- a/new_partition/new_partition.py +++ /dev/null @@ -1,558 +0,0 @@ -#!/usr/bin/env python - -from snack import * -import gettext -_ = lambda x: gettext.ldgettext("linx", x) - -import sys -import os -import re -import string - -data_dir = '/tmp/new_partitions' -os.mkdir(data_dir) - -screen = SnackScreen() - -screen.drawRootText(0, 0, "Welcome to Rocky Security OS") - -screen.pushHelpLine( _(" F1-New F2-Delete F3-Boot F4-Raid F12-OK ")) - -global p_num -p_num = dict() - -def invalidnumber(str, maxsize): - ints = string.digits + "." - if str == "": - return ("Must specify a value") - for n in str: - if n not in ints: - return ("Requested value is not an number") - if float(str) > float(maxsize): - return ("Requested value is too large") - -def showInvalidNumberWindow(tips): - g21 = GridForm(screen, "Invalid Entry for Partition Size", 1, 2) - g21.add(Label("%s." %(tips)), 0, 0) - g21.add(Button("OK"), 0, 1) - g21.runOnce() - -def findstrinfile(filename, lookup): - return lookup in open(filename, 'rt').read() - -def get_extended_end(filename): - f_extended = open(filename, 'r') - for end in f_extended.readlines(): - if re.search('extended',end): - extended_end = end.split('\n')[0].split()[2] - f_extended.close() - return extended_end - else: - continue - f_extended.close() - -def get_extended_start(filename): - f_extended = open(filename, 'r') - for start in f_extended.readlines(): - if re.search('extended',start): - extended_start = start.split('\n')[0].split()[1] - f_extended.close() - return extended_start - else: - continue - f_extended.close() - -def conform_start_end(free_space_start, size_set, flag_align=""): - free_space_start_unit = filter(str.isalpha, free_space_start) - size_set_unit = filter(str.isalpha, size_set) - free_space_start_num = get_size_num(free_space_start) - size_set_num = get_size_num(size_set) - size_set_num_orig = size_set_num - - if size_set_unit == free_space_start_unit: - pass - else: - if free_space_start_unit == "kB" and size_set_unit == "MB": - #size_set_num = float(size_set_num) * 1000 - free_space_start_num = float(free_space_start_num) / 1000 - elif free_space_start_unit == "kB" and size_set_unit == "GB": - #size_set_num = float(size_set_num) * 1000 * 1000 - free_space_start_num = float(free_space_start_num) / 1000 / 1000 - elif free_space_start_unit == "MB" and size_set_unit == "kB": - size_set_num = float(size_set_num) / 1000 - size_set_unit = free_space_start_unit - elif free_space_start_unit == "MB" and size_set_unit == "GB": - #size_set_num = float(size_set_num) * 1000 - free_space_start_num = float(free_space_start_num) / 1000 - elif free_space_start_unit == "GB" and size_set_unit == "kB": - size_set_num = float(size_set_num) / 1000 / 1000 - size_set_unit = free_space_start_unit - elif free_space_start_unit == "GB" and size_set_unit == "MB": - size_set_num = float(size_set_num) / 1000 - size_set_unit = free_space_start_unit - - if flag_align == "0%": - if size_set_unit == "kB": - size_set_num_tmp = float(size_set_num_orig) - if size_set_unit == "MB": - size_set_num_tmp = float(size_set_num_orig) * 1000 - elif size_set_unit == "GB": - size_set_num_tmp = float(size_set_num_orig) * 1000 * 1000 - - if size_set_num_tmp < 2000: - free_space_end = "2MB" - else: - free_space_end = size_set - else: - free_space_end_num = float(free_space_start_num) + float(size_set_num) - free_space_end = str(free_space_end_num) + size_set_unit - - return free_space_end - -def conform_and_compare(var1, var2, sign): - - var1_unit = filter(str.isalpha, var1) - var2_unit = filter(str.isalpha, var2) - var1_num = get_size_num(var1) - var2_num = get_size_num(var2) - - if var1_unit == var2_unit: - pass - if var1_unit == "kB" and var2_unit == "MB": - var2_num = float(var2_num) * 1000 - elif var1_unit == "kB" and var2_unit == "GB": - var2_num = float(var2_num) * 1000 * 1000 - elif var1_unit == "MB" and var2_unit == "kB": - var2_num = float(var2_num) / 1000 - elif var1_unit == "MB" and var2_unit == "GB": - var2_num = float(var2_num) * 1000 - elif var1_unit == "GB" and var2_unit == "kB": - var2_num = float(var2_num) / 1000 / 1000 - elif var1_unit == "GB" and var2_unit == "MB": - var2_num = float(var2_num) / 1000 - - var2_num = float(var2_num) - var1_num = float(var1_num) - - if sign == ">=": - if var2_num >= var1_num: - return True - else: - return False - elif sign == "<=": - if var2_num <= var1_num: - return True - else: - return False - - -def get_disk_label(disk_name): - os.system("parted /dev/%s print |grep 'Partition Table:'|awk -F':' \ - '{print $2}' >%s/label-%s" %(disk_name, data_dir, disk_name)) - f_disk_label = open("%s/label-%s" %(data_dir, disk_name)) - label = f_disk_label.readline().split('\n')[0].strip() - f_disk_label.close() - - return label - -def get_size_num(size): - if re.search('kB', size): - size_num = size.split('kB')[0] - elif re.search('MB', size): - size_num = size.split('MB')[0] - elif re.search('GB', size): - size_num = size.split('GB')[0] - return size_num - -def get_new_partition_num(dev, dev_name, ptype): - p_num_new = dict() - p_num_new['logical_num_'+dev_name] = [] - p_num_new['primary_num_'+dev_name] = [] - - os.system('parted %s print free |sed -n "/^Number/,//p" |sed \ - "/^Number/d" |sed "/^$/d">%s/%s-partitions 2>/dev/null' %(dev,data_dir,dev_name)) - f_partitions = open("%s/%s-partitions" %(data_dir,dev_name), 'r') - - label = get_disk_label(dev_name) - - if label == "gpt": - for p in f_partitions.readlines(): - p = p.split('\n')[0] - if re.search('Free Space', p): - pass - else: - p_num_new['primary_num_'+dev_name].append(int(p.split()[0])) - elif label == "msdos": - for p in f_partitions.readlines(): - p = p.split('\n')[0] - ptype = p.split()[4] - if re.search('Free Space', p): - pass - else: - if ptype == "logical": - p_num_new['logical_num_'+dev_name].append(int(p.split()[0])) - else: - if ptype != "extended": - p_num_new['primary_num_'+dev_name].append(int(p.split()[0])) - - f_partitions.close() - return p_num_new - -def set_partition_flag(ptype, dev, dev_name, flag): - p_num_new = get_new_partition_num(dev,dev_name,ptype) - for i in p_num_new[ptype+'_num_'+dev_name]: - if i not in p_num[ptype+'_num_'+dev_name]: - if flag == 'boot': - os.system("parted -s %s set %d boot >/dev/null 2>&1" %(dev, i)) - elif flag == 'raid': - os.system("parted -s %s set %d raid >/dev/null 2>&1" %(dev, i)) - -def new_partition(ptype='', extended='', label=''): - dev = clb.current().split(":")[2] - dev_name = dev.split("/")[2] - size = clb.current().split(":")[3] - free_space_start = clb.current().split(":")[4] - end = clb.current().split(":")[5] - - if re.search('kB', free_space_start) and \ - float(get_size_num(free_space_start)) < 2048: - free_space_start_real = free_space_start - free_space_start = '0%' - - size_num = get_size_num(size) - unit = filter(str.isalpha, size) - - bb2 = ButtonBar(screen, (("OK", "ok"), ("Cancel", "cancel"))) - - sg21 = Grid(2,1) - typeLbl = Label("File System type: ") - lb_fstype = Listbox(height=3, scroll=1) - list_fs = ['ext2', 'ext3', 'ext4', 'linux-swap', 'raid', 'reiserfs', 'xfs', 'jfs'] - for fs in list_fs: - lb_fstype.append(fs, fs) - lb_fstype.setCurrent('ext3') - sg21.setField(typeLbl, 0, 0, anchorLeft=0) - sg21.setField(lb_fstype, 1, 0) - - sg22 = Grid(2,1) - sizeLbl = Label("Size(%s): " %(unit)) - size_entry = Entry(10, size_num) - sg22.setField(sizeLbl, 0, 0) - sg22.setField(size_entry, 1, 0) - - sg23 = Grid(2,1) - rb_primary = SingleRadioButton("primary", None, 1) - rb_extended = SingleRadioButton("extended", rb_primary) - sg23.setField(rb_primary, 0, 0) - sg23.setField(rb_extended, 1, 0) - - cb_boot = Checkbox("Force to be a bootable partition") - - g2 = GridForm(screen, "New Partition(%s)" %(dev), 1, 9) - g2.add(sg21,0,0) - g2.add(Label(""),0,1) - g2.add(sg22,0,2) - g2.add(Label(""),0,3) - g2.add(cb_boot,0,4) - g2.add(Label(""),0,5) - - if extended == "extended" or label == 'gpt': - g2.add(bb2, 0, 6) - res2 = g2.runOnce() - if label == 'gpt': - ptype = 'primary' - else: - g2.add(sg23,0,6) - g2.add(Label(""),0,7) - g2.add(bb2, 0, 8) - res2 = g2.runOnce() - if rb_primary.selected(): - ptype = 'primary' - else: - ptype = 'extended' - - if bb2.buttonPressed(res2) == "ok": - fs_set = lb_fstype.current() - - tips = invalidnumber(size_entry.value(), size_num) - if tips: - showInvalidNumberWindow(tips) - else: - size_set = size_entry.value() + unit - if free_space_start == "0%": - free_space_end = conform_start_end(free_space_start_real,size_set,"0%") - else: - free_space_end = conform_start_end(free_space_start, size_set) - - if ptype == 'primary' or ptype == 'logical': - if fs_set == 'raid': - os.system("parted -s %s mkpart %s %s %s >/dev/null 2>&1" %(dev, ptype,\ - free_space_start, free_space_end)) - set_partition_flag(ptype, dev, dev_name, 'raid') - elif fs_set == 'linux-swap': - os.system("parted -s %s mkpartfs %s %s %s %s >/dev/null 2>&1" %(dev, ptype,\ - fs_set,free_space_start, free_space_end)) - else: - os.system("parted -s %s mkpart %s %s %s %s >/dev/null 2>&1" %(dev, ptype,\ - fs_set,free_space_start, free_space_end)) - if cb_boot.value() == 1: - set_partition_flag(ptype, dev, dev_name, 'boot') - elif ptype == 'extended': - os.system("parted -s %s mkpart %s %s %s >/dev/null 2>&1" %(dev, ptype,\ - free_space_start, free_space_end)) - - -def del_partition(): - dev = clb.current().split(":")[1] - bb3 = ButtonBar(screen, (("Cancel", "cancel"), ("Delete", "delete"))) - g3 = GridForm(screen, "Del Partition", 1, 3) - g3.add(TextboxReflowed(45, 'You are about to delete the partition "%s".' \ - %(dev,)), 0, 0) - g3.add(Label(""),0,1) - g3.add(bb3, 0, 2) - res3 = g3.runOnce() - if bb3.buttonPressed(res3) == "delete": - disk = "/dev/" + filter(str.isalpha, dev) - num = filter(str.isdigit, dev) - ptype = clb.current().split(":")[2] - os.system("parted -s %s rm %s >/dev/null 2>&1" %(disk, num)) - -def showPartitionWindow(): - p_num.clear() - global clb - clb = CListbox(height=10, cols=6, - col_widths=[13,11,11,11,10,12], - scroll=1, returnExit = 1, - width=79, col_pad=2, - col_labels=[_('Device'), _('Start'), _('End'), _('Size'), _('Type'), _('Flags')], - col_label_align=[CENTER,CENTER,CENTER,CENTER,CENTER,CENTER]) - - os.system("../new_partition/parted_devices |awk -F' ' '{print $1}' >%s/disks 2>/dev/null" %(data_dir)) - f_disk = open("%s/disks" %(data_dir), 'r') - - for d in f_disk.readlines(): - disk = d.split('\n')[0] - disk_name = disk.split('/')[2] - - p_num['logical_num_'+disk_name] = [] - p_num['primary_num_'+disk_name] = [] - - clb.append(["%s" %(disk),"","","","",""], \ - "disk:%s" %(disk), \ - [LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT]) - - os.system('parted %s print free |sed -n "/^Number/,//p" |sed \ - "/^Number/d" |sed "/^$/d" >%s/%s-partitions 2>/dev/null' %(disk,data_dir,disk_name)) - - f_partitions = open("%s/%s-partitions" %(data_dir,disk_name), 'r') - - for p in f_partitions.readlines(): - p = p.split('\n')[0] - if re.search('Free Space', p): - size = p.split()[2] - if re.search('512B', size) or (float(get_size_num(size)) < 2048 \ - and filter(str.isalpha, size) == 'kB'): - continue - partition = "Free Space" - start = p.split()[0] - end = p.split()[1] - ptype = p.split()[3] + " " + p.split()[4] - fs = "" - flags = "" - - label = get_disk_label(disk_name) - - clb.append([" %s" %(partition), - "%s" %(start), - "%s" %(end), - "%s" %(size), - "%s" %(ptype), - "%s" %(flags)], "partition:%s:%s:%s:%s:%s:%s" %(partition,disk, size, start, end,label), - [LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT]) - - else: - partition = disk_name + p.split()[0] - - start = p.split()[1] - end = p.split()[2] - size = p.split()[3] - ptype = p.split()[4] - - if ptype == "logical": - p_num['logical_num_'+disk_name].append(int(p.split()[0])) - else: - if ptype != "extended": - p_num['primary_num_'+disk_name].append(int(p.split()[0])) - - os.system("blkid /dev/%s |awk -F' TYPE=' '{print $2}' |awk \ - -F'\"' '{print $2}' >%s/fsType-%s 2>/dev/null" %(partition,data_dir,partition)) - - f_partitions_fs = open("%s/fsType-%s" %(data_dir,partition)) - fs = f_partitions_fs.readline().split('\n')[0] - flags = "" - - try: - if fs != "": - try: - flags = p.split()[6] + p.split()[7] - except: - flags = p.split()[6] - else: - try: - #flags = p.split()[5] + ", " + p.split()[6] - flags = p.split()[5] + " " + p.split()[6] - except: - flags = p.split()[5] - except: - pass - - if fs == "swap": - if flags == "": - flags = fs - else: - flags = flags + ", swap" - - #if fs == "linux_raid_member": - # if flags == "": - # flags = 'raid' - # else: - # flags = flags + ", raid" - - clb.append([" %s" %(partition), - "%s" %(start), - "%s" %(end), - "%s" %(size), - "%s" %(ptype), - "%s" %(flags)], "partition:%s:%s:%s:%s" %(partition, ptype, disk, flags), - [LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT]) - - f_partitions_fs.close() - - - f_partitions.close() - - f_disk.close() - - global bb - bb = ButtonBar (screen, ((_("New"), "new", "F1"), - (_("Delete"), "delete", "F2"), - (_("Boot"), "boot", "F3"), - (_("Raid"), "raid", "F4"), - (_("OK"), "ok", "F12"), - (_("Cancel"), "cancel"), - )) - - sg = Grid(2, 3) - sg.setField(bb, 0, 1, anchorLeft = 1) - - g = Grid(1, 3) - g.setField(clb, 0, 0) - g.setField(sg, 0, 2) - #g.setField(bb, 0, 1) - g.place(1, 1) - screen.gridWrappedWindow(g, "Partitioning") - - f = Form("This is some help") - f.add(bb) - f.add(clb) - - f.addHotKey("F1") - f.addHotKey("F2") - f.addHotKey("F3") - f.addHotKey("F4") - f.addHotKey("F12") - - global res - res = f.run() - - #screen.popWindow() - screen.refresh() - -while(1): - global ret - showPartitionWindow() - - if bb.buttonPressed(res) == "cancel": - ret = 1 - break - - if bb.buttonPressed(res) == "ok": - ret = 0 - break - - if bb.buttonPressed(res) == "boot": - if re.search("partition:", clb.current()) and \ - re.search("swap", clb.current()) == None and \ - re.search("raid", clb.current()) == None and \ - re.search("lba", clb.current()) == None: - dev = clb.current().split(":")[3] - partition_num = filter(str.isdigit, clb.current().split(":")[1]) - os.system("parted -s %s set %s boot >/dev/null 2>&1" %(dev, partition_num)) - - if bb.buttonPressed(res) == "raid": - if re.search("partition:", clb.current()) and \ - re.search("lba", clb.current()) == None: - dev = clb.current().split(":")[3] - partition_num = filter(str.isdigit, clb.current().split(":")[1]) - os.system("parted -s %s set %s raid >/dev/null 2>&1" %(dev, partition_num)) - - # assign partition table label - if re.search("disk:", clb.current()): - dev = clb.current().split(":")[1] - rb = RadioBar(screen, (("gpt", "gpt", 0),("msdos", "msdos", 1))) - bb1 = ButtonBar(screen, (("Cancel", "cancel"), ("OK", "ok"))) - g = GridForm(screen, "Partition table", 1, 4) - g.add(TextboxReflowed(25, 'Warning! A new partition table will be created on "%s" and the data on it will be cleared.' \ - %(dev,)), 0, 0) - g.add(Label(""),0,1) - g.add(rb,0,2,(0,0,0,1)) - g.add(bb1, 0, 3) - res1 = g.runOnce() - if bb1.buttonPressed(res1) == "ok": - label = rb.getSelection() - os.system("parted -s %s mklabel %s >/dev/null 2>&1" %(dev, label)) - - # new partition when partition table label is msdos - elif re.search("partition:Free", clb.current()) and \ - clb.current().split(':')[6] == 'msdos'and \ - bb.buttonPressed(res) == "new": - dev = clb.current().split(":")[2] - dev_name = dev.split("/")[2] - free_space_start = clb.current().split(":")[4] - end = clb.current().split(":")[5] - # new logical partition when partition table is msdos and there is - # an extended partition - if findstrinfile("%s/%s-partitions" %(data_dir,dev_name), "extended"): - - extended_start = get_extended_start("%s/%s-partitions" %(data_dir,dev_name)) - extended_end = get_extended_end("%s/%s-partitions" %(data_dir,dev_name)) - - if conform_and_compare(extended_start, free_space_start, '>=') and \ - conform_and_compare(extended_end, end, '<='): - ptype = 'logical' - # new primary partition when partition table label is msdos and - # there is an extended partition - else: - ptype = 'primary' - - new_partition(ptype,'extended','msdos') - - # new partition when partition table label is msdos and there is no - # extended partition - else: - new_partition(ptype='', extended='', label='msdos') - - # new partition when partition table label is gpt - elif re.search("partition:Free", clb.current()) and \ - clb.current().split(':')[6] == 'gpt' and \ - bb.buttonPressed(res) == "new": - new_partition(ptype='primary', extended='', label='gpt') - elif re.search("partition:Free", clb.current()) == None and \ - re.search("disk:", clb.current()) == None and \ - bb.buttonPressed(res) == "delete": - del_partition() - - -screen.finish() -os.system('rm -rf %s' %(data_dir)) -sys.exit(ret) diff --git a/new_partition/parted_devices b/new_partition/parted_devices deleted file mode 100755 index 6599259..0000000 Binary files a/new_partition/parted_devices and /dev/null differ diff --git a/new_partition/parted_devices.py b/new_partition/parted_devices.py index e16fa25..40bc040 100755 --- a/new_partition/parted_devices.py +++ b/new_partition/parted_devices.py @@ -1,38 +1,60 @@ #!/usr/bin/python +# +# pythonlized partman-base/parted_devices.c +# import parted -import _ped +import os,fcntl,array +import re + +'''is cdrom return 0''' +def is_cdrom(path): + CDROM_GET_CAPABILITY = 0x5331 + ret = 1 + + '''h: array type code, mean signed short ''' + buf= array.array('h', [0]) + fd = os.open(path, os.O_RDONLY | os.O_NONBLOCK) + try: + ret = fcntl.ioctl(fd, CDROM_GET_CAPABILITY, buf) + ret = buf[0] + except IOError: + pass + + return ret + +'''is floppy return true''' +def is_floppy(path): + return path == "/dev/floppy" or path == "/dev/fd"; + +'''is device mapper return true, +filter /dev/mapper, we don't use /dev/mapper in installer -- bqin''' +def is_devicemapper(path): + return (path.startswith("/dev/mapper")) + +def process_device(dev): + if dev.readOnly == 1: + return + if not is_cdrom(dev.path) or is_floppy(dev.path) or is_devicemapper(dev.path): + return + if dev.path == "/dev/ramzswap" or dev.path == "/dev/zram": + return + return dev.path -# class from pyparted-3.4/tests/_ped/baseclass.py -# Base class for any test case that requires a list being built via successive -# calls of some function. The function must raise IndexError when there's no -# more output to add to the return list. This class is most useful for all -# those _get_next methods. -class BuildList: - def getDeviceList(self, func): - lst = [] - prev = None +def get_disks(): + disk_list = [] - while True: - try: - if not prev: - prev = func() - else: - prev = func(prev) + device_list = parted.getAllDevices() - lst.append(prev) - except IndexError: - break + for i in range(len(device_list)): + item = process_device(device_list[i]) + if item: + disk_list.append(item) - return lst + return disk_list -_ped.device_probe_all() -List = BuildList() -disk_list = List.getDeviceList(_ped.device_get_next) - -for i in range(len(disk_list)): - print disk_list[i].path - -#print _ped.device_get_next() +if __name__ == "__main__": + for i in get_disks(): + print i diff --git a/new_partition/partition_data.py b/new_partition/partition_data.py new file mode 100755 index 0000000..03a8f74 --- /dev/null +++ b/new_partition/partition_data.py @@ -0,0 +1,373 @@ +#!/usr/bin/python + +import re,os +import commands +import subprocess +import signal +from xml.dom import minidom +from collections import defaultdict +import _ped +import parted_devices + +DEBUG = False + +''' algorithm from libparted/unit.c ''' +def parse_unit_suffix(suffix): + if (len(suffix) > 1) and (suffix[1] == 'i'): + return { + 'k': _ped.UNIT_KIBIBYTE, + 'm': _ped.UNIT_MEBIBYTE, + 'g': _ped.UNIT_GIBIBYTE, + 't': _ped.UNIT_TEBIBYTE, + }[suffix[0].lower()] + elif (len(suffix) > 0): + return { + 's': _ped.UNIT_SECTOR, + 'b': _ped.UNIT_BYTE, + 'k': _ped.UNIT_KILOBYTE, + 'm': _ped.UNIT_MEGABYTE, + 'g': _ped.UNIT_GIGABYTE, + 't': _ped.UNIT_TERABYTE, + 'c': _ped.UNIT_CYLINDER, + '%': _ped.UNIT_PERCENT, + }[suffix[0].lower()] + +''' type name for display ''' +def get_type_name(type): + try: return { + _ped.PARTITION_NORMAL :'primary', + _ped.PARTITION_LOGICAL :'logical', + _ped.PARTITION_EXTENDED :'extended', + _ped.PARTITION_FREESPACE :' ', + _ped.PARTITION_METADATA :' ', + _ped.PARTITION_PROTECTED :' ', + }[type] + except KeyError: + return ' ' + +''' get_flags from rhel5 anaconda partedUtils.py + algorithm the same as parted in parted.c partition_print_flags() ''' +def get_flags (part): + string="" + if not part.is_active (): + return string + first=1 + flag = _ped.partition_flag_next (0) + while flag: + if part.get_flag (flag): + string = string + _ped.partition_flag_get_name (flag) + if first: + first = 0 + else: + string = string + ", " + flag = _ped.partition_flag_next (flag) + return string + + +'''make nested dict''' +def makehash(): + return defaultdict(makehash) + +class Partition: + ''' disk partition ''' + unit = '' + dict = makehash() + def __init__(self, dev, ds, pt, sn, partition, num, st, se, sz, tp, fs, fg, fr, fm, mp): + ''' Partition init function ''' + self.dict[dev][dev] = dev + self.dict[dev]['disk_size'] = ds + self.dict[dev]['partition_table'] = pt + self.dict[dev]['partition'][partition]['sn']= sn + self.dict[dev]['partition'][partition]['num']= num + self.dict[dev]['partition'][partition]['start'] = st + self.dict[dev]['partition'][partition]['end'] = se + self.dict[dev]['partition'][partition]['size'] = sz + self.dict[dev]['partition'][partition]['type'] = tp + self.dict[dev]['partition'][partition]['filesystem'] = fs + self.dict[dev]['partition'][partition]['flags'] = fg + self.dict[dev]['partition'][partition]['from_os'] = fr + self.dict[dev]['partition'][partition]['format'] = fm + self.dict[dev]['partition'][partition]['mount_point'] = mp + + @staticmethod + def get_disks(): + return parted_devices.get_disks() + + @staticmethod + def check_partitions(): + cmd = "grep [a-zA-Z][0-9] /proc/partitions>/dev/null" + ret = os.system(cmd) + return ret + + @staticmethod + def init_from_os(unit='b'): + + Partition.unit = unit + + if Partition.unit: + default_unit = parse_unit_suffix(Partition.unit) + else: + default_unit = _ped.UNIT_COMPACT + _ped.unit_set_default(default_unit) + + ''' each disk ''' + for d in Partition.get_disks(): + _device = _ped.device_get(d) + _disk = _ped.Disk(_device) + _part = _disk.next_partition() + ''' free partition number ''' + fn = 0 + ''' partition sequence number ''' + sn = 0 + ''' each partition ''' + + ''' algorithm from parted.c do_print() ''' + disk_start = _device.unit_format (0) + disk_end = _device.unit_format_byte (_device.length * _device.sector_size \ + - (default_unit == _ped.UNIT_CHS or \ + default_unit == _ped.UNIT_CYLINDER)) + + disk_size = disk_end + + partition_table = _disk.type.name + dev = _device.path + + if DEBUG: + print dev + print partition_table + print disk_start + print disk_size + while _part: + + ''' skip _part.type = 9 + I can't find type 9 from pyparted ''' + if _part.type == 9: + _part = _disk.next_partition(_part) + continue + + p_g = _part.geom + + ''' algorithm get from parted.c do_print() ''' + start = _device.unit_format(p_g.start) + end = _device.unit_format_byte((p_g.end + 1) * _device.sector_size - 1) + size = _device.unit_format(p_g.length) + + if _part.num == -1: + fn += 1 + num = fn + partition = "free %s" %fn + else: + num = _part.num + partition = _part.get_path() + + type_name = get_type_name(_part.type) + + try: + fs = _part.fs_type.name + except: + fs = ' ' + ''' may be PARTITION_METADATA mustn't appear at free space, + but may be pyparted have bug, awareness last partition as + metadata. But parted is not. ''' + if _part.type & _ped.PARTITION_FREESPACE or \ + _part.type & _ped.PARTITION_METADATA: + fs = 'Free Space' + + flags = get_flags(_part) + + sn += 1 + if DEBUG: + print "sn:%s, num:%s, %s, start:%s, end:%s, size:%s, type_name:%s, fs: %s, flags: %s" %(sn, num, partition, start, end, size, type_name, fs, flags) + + ''' create a Partition instance from hardware info''' + Partition(dev , # device name + disk_size, # disk size + partition_table, # partition table + sn, # partition sequence number + partition, # partition + num, # num + start, # start + end, # end + size, # size + type_name, # type + fs, # file system + flags, # flags + 'yes', # from os + ' ', # whether format + ' ' # mount point + ) + _part = _disk.next_partition(_part) + + '''TODO: + need fix for new data structure or abandon + ''' + @staticmethod + def init_from_xml(node): + ''' create Partition instances from xml node ''' + Partition.unit = node.attributes['unit'].value.encode('ascii') + for p in node.childNodes: + if p.nodeType == node.ELEMENT_NODE and p.nodeName == 'partition': + Partition(p.attributes['device'].value.encode('ascii'),\ + p.attributes['start'].value.encode('ascii'),\ + p.attributes['size'].value.encode('ascii'),\ + p.attributes['type'].value.encode('ascii'),\ + p.attributes['file-system'].value.encode('ascii'),\ + p.attributes['flags'].value.encode('ascii'),\ + p.attributes['from_os'].value.encode('ascii')) + + + @staticmethod + def to_xml(doc, p_node): + ''' write all Partition instance into xml +doc - xml document instance +p_node - xml node (parent node)''' + pts = doc.createElement('disks') + unit_attr = doc.createAttribute('unit') + unit_attr.value = Partition.unit + pts.setAttributeNode(unit_attr) + + create_node(Partition.dict, doc, pts) + p_node.appendChild(pts) + p_node.appendChild(pts) + + @staticmethod + def get_disk_attr(disk, attr): + try: + return Partition.dict[disk][attr] + except: + return None + + @staticmethod + def get_partition_attr(partition, attr): + disk = re.sub("\d+$", "", partition) + try: + return Partition.dict[disk]['partition'][partition][attr] + except: + return None + + + +''' Fix Me: + make recursive is better ''' +def create_node(d, doc, pts): + for key in d.keys(): + dt = doc.createElement('disk') + dt.setAttribute('disk', key) + for k in d[key].keys(): + if k == 'partition': + pt = doc.createElement('partitions') + for l in d[key]['partition'].keys(): + lt = doc.createElement('partition') + lt.setAttribute('partition', str(l)) + for m in d[key]['partition'][l].keys(): + '''if mount_point etc. is ' ', then can't set attribute, + so I manual add space + ''' + attr = "%s " %d[key]['partition'][l][m] + if attr.rstrip(): + attr = attr.rstrip() + lt.setAttribute(m, attr) + pt.appendChild(lt) + dt.appendChild(pt) + elif k == 'disk_size': + dt.setAttribute(str(k), d[key]['disk_size']) + elif k == 'partition_table': + dt.setAttribute(str(k), d[key]['partition_table']) + pts.appendChild(dt) + +def pretty(d, indent=0): + for key, value in d.iteritems(): + print '\t' * indent + str(key) + if isinstance(value, dict): + pretty(value, indent+1) + else: + print '\t' * (indent+1) + str(value) + +def delete_all_partitions(d, k): + for key in d[k]['partition'].keys(): + d[k]['partition'].pop(key, None) + + partition = 'free 1' + sz = se = d[k]['disk_size'] + d[k]['partition'][partition]['sn']= 1 + d[k]['partition'][partition]['num']= 1 + d[k]['partition'][partition]['start'] = '0' + d[k]['partition'][partition]['end'] = se + d[k]['partition'][partition]['size'] = sz + d[k]['partition'][partition]['type'] = '' + d[k]['partition'][partition]['filesystem'] = '' + d[k]['partition'][partition]['flags'] = '' + d[k]['partition'][partition]['from_os'] = '' + d[k]['partition'][partition]['format'] = '' + d[k]['partition'][partition]['mount_point'] = '' + +def delete_one_partition(dict, disk, partition): + for key in dict[disk]['partition'].keys(): + if key == partition: + del dict[disk]['partition'][key] + +def sort_partition(dict, disk, p): + f_d = {} + p_d = {} + + for k in dict[disk]["partition"]: + if k.startswith("free"): + f_d[k] = dict[disk]["partition"][k]["num"] + else: + p_d[k] = dict[disk]["partition"][k]["num"] + + if p == "free": + return (sorted(f_d, key = lambda key: f_d[key])) + elif p == "partition": + return (sorted(p_d, key = lambda key: p_d[key])) + else: + return + + +def sort_partitions(dict, disk, p="all"): + # k, t: partitions + if p == "all": + return (sorted(((k) for k in dict[disk]["partition"]), key=lambda \ + t: dict[disk]["partition"][t]["sn"])) + elif p == "free": + return sort_partition(dict, disk, "free") + elif p == "partition": + return sort_partition(dict, disk, "partition") + +def write_to_xml_file(): + xmldoc = minidom.Document() + root = xmldoc.createElement('install') + xmldoc.appendChild(root) + Partition.to_xml(xmldoc, root) + xml_string =xmldoc.toprettyxml(indent=" ") + print xml_string + + + + +#if __name__ == "__main__": +# Partition.init_from_os() + #pretty(Partition.dict) + #delete_all_partitions(Partition.dict, "/dev/sda") +# delete_one_partition(Partition.dict, "/dev/sdb", "free 1") + #pretty(Partition.dict) +# print sort_partitions(Partition.dict, "/dev/sda", "all") +# print "+"*100 +# print sort_partitions(Partition.dict, "/dev/sda", "free") +# print "+"*100 +# print sort_partitions(Partition.dict, "/dev/sda", "partition") +# write_to_xml_file() + #print Partition.dict + #print Partition.get_size("/dev/sda") + #print Partition.get_disk_attr("/dev/sda", "disk_size") + #print Partition.get_disk_attr("/dev/sda", "partition_table") + #print Partition.get_partition_attr("/dev/sda1", "size") + +# xmldoc = minidom.Document() +# root = xmldoc.createElement('install') +# xmldoc.appendChild(root) +# Partition.to_xml(xmldoc, root) +# xml_string = xmldoc.toprettyxml(indent=" ") + +# print xml_string +