diff --git a/interface/ri_data.py b/interface/ri_data.py index e3b99d2..c47a39d 100644 --- a/interface/ri_data.py +++ b/interface/ri_data.py @@ -1,9 +1,13 @@ #!/usr/bin/python -import re,os +import re,os,sys import commands from xml.dom import minidom from xml.dom.ext import PrettyPrint +sys.path.append('../new_partition/') +import partition_data as p_d + + # xml file names install_xml = '/var/install/install.xml' @@ -688,12 +692,10 @@ def init_from_xml(): if n.nodeType == n.ELEMENT_NODE: if n.nodeName == 'serial-number': SerialNumber.init_from_xml(n) - elif n.nodeName == 'partitions': - Partition.init_from_xml(n) + elif n.nodeName == 'disks': + p_d.Partition.init_from_xml(n) elif n.nodeName == 'raids': Raid.init_from_xml(n) - elif n.nodeName == 'mount-points': - MountPoint.init_from_xml(n) elif n.nodeName == 'network': Network.init_from_xml(n) elif n.nodeName == 'groups': diff --git a/interface/ri_install.py b/interface/ri_install.py index f43ffcd..e045260 100644 --- a/interface/ri_install.py +++ b/interface/ri_install.py @@ -22,6 +22,8 @@ import ri_oper import os import os.path import ri_data +sys.path.append('../new_partition/') +import partition_data as p_d def install_over(ret): if ri_oper.Rate.value == 100 and ret == 0: @@ -80,6 +82,6 @@ ri_oper.display_operation = display.set_task ri_oper.display_sub_operation = display.set_sub_task ri_oper.display_scale = display.set_task_scale -oper_list = [ri_oper.MakeRaid(3),ri_oper.Format(7),ri_oper.Mount(3),ri_oper.InstallPkg(54),ri_oper.MakeRaidConfigure(2),ri_oper.ConfigureFstab(5),ri_oper.GenerateIssue(3),ri_oper.ConfigureNetwork(2),ri_oper.MakeServiceAutoBoot(5),ri_oper.CopyKernel(7),ri_oper.ConfigureBootloader(5),ri_oper.BootLoader(2),ri_oper.ExecFinishInstall(2)] +oper_list = [ri_oper.MakePartitions(5),ri_oper.MakeRaid(3),ri_oper.Format(7),ri_oper.Mount(3),ri_oper.InstallPkg(49),ri_oper.MakeRaidConfigure(2),ri_oper.ConfigureFstab(5),ri_oper.GenerateIssue(3),ri_oper.ConfigureNetwork(2),ri_oper.MakeServiceAutoBoot(5),ri_oper.CopyKernel(7),ri_oper.ConfigureBootloader(5),ri_oper.BootLoader(2),ri_oper.ExecFinishInstall(2)] display.start(main) diff --git a/interface/ri_oper.py b/interface/ri_oper.py index 0e26bf0..718ca46 100644 --- a/interface/ri_oper.py +++ b/interface/ri_oper.py @@ -18,9 +18,11 @@ import ri_data import ri_dep -import os +import os,sys import subprocess import signal +sys.path.append('../new_partition/') +import partition_data as p_d display_operation = None display_sub_operation = None @@ -113,6 +115,44 @@ class Operation: arch = result.stdout.readline().rstrip() return arch +class MakePartitions(Operation): + '''class for make partitions''' + def __init__(self, scr): + Operation.__init__(self, 'Make partition', u'磁盘分区', 'partition_disks.sh', scr) + + def get_stdin(self): + args = ' ' + n = 0 + disks = p_d.Partition.dict.keys() + disks.sort() + for d in disks: + if p_d.Partition.dict[d]['from_os'] == 'no': + args += '%s mklabel %s\n' %(d, p_d.Partition.dict[d]['partition_table']) + partitions = p_d.sort_partitions(p_d.Partition.dict, d, 'partition') + for p in partitions: + fs_type = '' + p_type = '' + flags = '' + set_flg = '' + if p_d.Partition.dict[d]['partition'][p]['from_os'] == 'yes': + continue + fs_type = p_d.Partition.dict[d]['partition'][p]['filesystem'] + start = p_d.Partition.dict[d]['partition'][p]['start'] + end = p_d.Partition.dict[d]['partition'][p]['end'] + p_type = p_d.Partition.dict[d]['partition'][p]['type'] + partition = p_d.Partition.dict[d]['partition'][p]['num'] + flags = p_d.Partition.dict[d]['partition'][p]['flags'] + mkpart = "%s mkpart %s %s %s %s" %(d, p_type, fs_type, start, end) + if flags.strip(): + set_flg = "set %s %s on" %(partition, flags) + + n += 1 + args += "%s %s\n" %(mkpart, set_flg) + + self.steps += n + return args + + class Format(Operation): ''' class for format partition ''' def __init__(self, scr): @@ -120,14 +160,21 @@ class Format(Operation): self.return_value[127] = ('No tool to format partitions', u'没有格式化硬盘分区的工具') def get_stdin(self): - format='' - n = 0 - for instance in ri_data.MountPoint.dict.values(): - if instance.format == "yes" and instance.filesystem != '': - format+="/dev/%s %s\n"%(instance.device,instance.filesystem) - n += 1 - self.steps += n - return format + format = '' + n = 0 + disks = p_d.Partition.dict.keys() + disks.sort() + for d in disks: + partitions = p_d.sort_partitions(p_d.Partition.dict, d, 'partition') + for p in partitions: + fs_type = p_d.Partition.dict[d]['partition'][p]['filesystem'] + fmt = p_d.Partition.dict[d]['partition'][p]['format'] + if fmt.strip() == 'yes' and fs_type.strip(): + format += "%s %s\n" %(p, fs_type) + n += 1 + + self.steps += n + return format class MakeRaid(Operation): """class for make raid""" @@ -177,16 +224,18 @@ class Mount(Operation): Operation.__init__(self,'Mount partition', u'挂载分区', 'mount_partition.sh',scr) def get_stdin(self): - mount='' + mount = '' n = 0 - for dir in set([ m.directory for m in ri_data.MountPoint.dict.values() if m.directory ]): - for k in ri_data.MountPoint.dict.keys(): - if ri_data.MountPoint.dict[k].directory == dir and ri_data.MountPoint.dict[k].filesystem: - # during configure fstab, use dict of Mount - Mount.dict[k]=dir - mount+='/dev/%s %s %s\n' %(k,dir,ri_data.MountPoint.dict[k].filesystem) - n+=1 - break + disks = p_d.Partition.dict.keys() + disks.sort() + for d in disks: + partitions = p_d.sort_partitions(p_d.Partition.dict, d, 'partition') + for p in partitions: + mp = p_d.Partition.dict[d]['partition'][p]['mount_point'] + fs = p_d.Partition.dict[d]['partition'][p]['filesystem'] + if mp.strip() and fs.strip(): + mount += "%s %s %s\n" %(p, mp, fs) + n += 1 self.steps += n return mount @@ -217,15 +266,18 @@ class ConfigureFstab(Mount): def get_stdin(self): fstab='' - # Note: Mount.dict are mount point. it isn't equal ri_data.MountPoint.dict - for k in Mount.dict.keys(): - if ri_data.MountPoint.dict[k].filesystem != 'swap': - fstab += "/dev/%s %s %s\n" %(k,Mount.dict[k],ri_data.MountPoint.dict[k].filesystem) - - for k in ri_data.MountPoint.dict.keys(): - if ri_data.MountPoint.dict[k].filesystem == 'swap': - fstab += '/dev/%s swap swap\n' %k - break + disks = p_d.Partition.dict.keys() + disks.sort() + for d in disks: + partitions = p_d.sort_partitions(p_d.Partition.dict, d, 'partition') + for p in partitions: + mp = p_d.Partition.dict[d]['partition'][p]['mount_point'] + fs = p_d.Partition.dict[d]['partition'][p]['filesystem'] + if fs.strip() == 'linux-swap': + fs = 'swap' + mp = 'swap' + if mp.strip() and fs.strip(): + fstab += "%s %s %s\n" %(p, mp, fs) # process fstab to sort fstab_new = '' diff --git a/new_partition/partition_data.py b/new_partition/partition_data.py index a30c926..b093674 100755 --- a/new_partition/partition_data.py +++ b/new_partition/partition_data.py @@ -75,11 +75,17 @@ 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 ''' + ''' Partition init function ''' + def __init__(self, dev, ds, pt, dfm, sn, partition, num, st, se, sz, tp, fs, fg, fr, fm, mp): + + '''special process linux-swap(v1) use linux-swap for instead ''' + if fs.startswith('linux-swap'): + fs = 'linux-swap' self.dict[dev][dev] = dev self.dict[dev]['disk_size'] = ds self.dict[dev]['partition_table'] = pt + ''' if modify parittion table this flag is no ''' + self.dict[dev]['from_os'] = dfm self.dict[dev]['partition'][partition]['sn']= sn self.dict[dev]['partition'][partition]['num']= num self.dict[dev]['partition'][partition]['start'] = st @@ -116,7 +122,10 @@ class Partition: ''' each disk ''' for d in Partition.get_disks(): _device = _ped.device_get(d) - _disk = _ped.Disk(_device) + try: + _disk = _ped.Disk(_device) + except: + continue _part = _disk.next_partition() ''' free partition number ''' fn = 0 @@ -189,6 +198,7 @@ type_name:%s, fs: %s, flags: %s" %(sn, num, partition, start, end, size, \ Partition(dev , # device name disk_size, # disk size partition_table, # partition table + 'yes', # disk from os sn, # partition sequence number partition, # partition num, # num @@ -198,7 +208,7 @@ type_name:%s, fs: %s, flags: %s" %(sn, num, partition, start, end, size, \ type_name, # type fs, # file system flags, # flags - 'yes', # from os + 'yes', # partition from os ' ', # whether format ' ' # mount point ) @@ -217,11 +227,13 @@ type_name:%s, fs: %s, flags: %s" %(sn, num, partition, start, end, size, \ dev = d.attributes['disk'].value.encode('ascii') disk_size = d.attributes['disk_size'].value.encode('ascii') partition_table = d.attributes['partition_table'].value.encode('ascii') + disk_from_os = d.attributes['from_os'].value.encode('ascii') if DEBUG: print dev print partition_table print disk_size + print disk_from_os for p in d.getElementsByTagName('partition'): sn = p.attributes['sn'].value.encode('ascii') @@ -246,6 +258,7 @@ type_name:%s, fs: %s, flags: %s" %(sn, num, partition, start, end, size, \ Partition(dev , # device name disk_size, # disk size partition_table, # partition table + disk_from_os, # disk from os sn, # partition sequence number partition, # partition num, # num @@ -326,6 +339,8 @@ def create_node(d, doc, pts): dt.setAttribute(str(k), d[key]['disk_size']) elif k == 'partition_table': dt.setAttribute(str(k), d[key]['partition_table']) + elif k == 'from_os': + dt.setAttribute(str(k), d[key]['from_os']) pts.appendChild(dt) def pretty(d, indent=0): @@ -365,9 +380,9 @@ def sort_partition(dict, disk, p): for k in dict[disk]["partition"]: if k.startswith("free"): - f_d[k] = dict[disk]["partition"][k]["num"] + f_d[k] = int(dict[disk]["partition"][k]["num"]) else: - p_d[k] = dict[disk]["partition"][k]["num"] + p_d[k] = int(dict[disk]["partition"][k]["num"]) if p == "free": return (sorted(f_d, key = lambda key: f_d[key])) @@ -380,7 +395,7 @@ def sort_partitions(dict, disk, p="all"): if p == "all": ''' k, t: partitions ''' return (sorted(((k) for k in dict[disk]["partition"]), key=lambda \ - t: dict[disk]["partition"][t]["sn"])) + t: int(dict[disk]["partition"][t]["sn"]))) elif p == "free": return sort_partition(dict, disk, "free") elif p == "partition": @@ -409,9 +424,10 @@ if __name__ == "__main__": #for d in Partition.get_raid_devices(): # print d #print Partition.dict.keys() - #pretty(Partition.dict) + pretty(Partition.dict) + #print Partition.unit #write_to_xml_file() - disks = Partition.dict.keys() + #disks = Partition.dict.keys() #disks.sort() #for key in disks: # partitions = sort_partitions(Partition.dict, key, 'partition') diff --git a/operation/format_partition.sh b/operation/format_partition.sh index 6af108c..8aee8c0 100755 --- a/operation/format_partition.sh +++ b/operation/format_partition.sh @@ -47,8 +47,15 @@ format_partition () local fs_type="$2" if [ ! -e "$devname" ];then + # wait for device + for((i=0;i<10;i++))do + [ -e "$devname" ] && break + sleep $i + done + if [ ! -e "$devname" ];then err "$devname node doesn't exist !" return 2 + fi fi # partition may be used to swap, or has already mounted @@ -66,6 +73,9 @@ format_partition () ext3) mkfs.ext3 -F -I 128 "$devname" 1>>"$DEV_LOG" 2>&1 ;; + ext4) + mkfs.ext4 -F -I 128 "$devname" 1>>"$DEV_LOG" 2>&1 + ;; reiserfs) yes | mkfs.reiserfs -f "$devname" 1>>"$DEV_LOG" 2>&1 ;; @@ -75,7 +85,7 @@ format_partition () jfs) yes | mkfs.jfs -q "$devname" 1>>"$DEV_LOG" 2>&1 ;; - swap) + swap|linux-swap) mkswap -f "$devname" 1>>"$DEV_LOG" 2>&1 ;; vfat) diff --git a/operation/functions b/operation/functions index e48cebe..e7f64c7 100644 --- a/operation/functions +++ b/operation/functions @@ -24,16 +24,20 @@ mkdir -p "$TARGET" stdout () { - printf "$*\n" + # process % in partition + local log=$(echo $*|sed "s/%/%%/g") + printf "$log\n" } log () { local DATE=$(date "+%Y/%m/%d %T") + # process % in partition + local log=$(echo $*|sed "s/%/%%/g") case "$LOG" in - true) printf "$DATE $*\n" >>"$LOG_FILE" ;; - stdout) stdout "$DATE $*" ;; + true) printf "$DATE $log\n" >>"$LOG_FILE" ;; + stdout) stdout "$DATE $log" ;; *) : ;; esac } diff --git a/operation/partition_disks.sh b/operation/partition_disks.sh new file mode 100755 index 0000000..e46737f --- /dev/null +++ b/operation/partition_disks.sh @@ -0,0 +1,43 @@ +#!/bin/bash - +#=============================================================================== +# +# FILE: partition_disks.sh +# +# USAGE: ./partition_disks.sh +# +# DESCRIPTION: +# +# OPTIONS: --- +# REQUIREMENTS: --- +# BUGS: --- +# NOTES: --- +# AUTHOR: bqin (), bqin@linx-info.com +# COMPANY: linx-info +# COPYRIGHT: Copyright 2001-2013 Beijing Linx Technology Co.,Ltd. +# CREATED: 2013年12月23日 16时18分10秒 CST +# REVISION: --- +#=============================================================================== + + +source ./functions + + +main () +{ + while read line;do + info "$line" stdout + [ -z "$line" ] && continue + + parted -s $line + ret=$? + if [ $ret -ne 0 ];then + exit $ret + else + info "partition disk $line success" stdout + fi + done +} + +main "$@" + +