modify follow files for new datastructure

modified:   interface/ri_data.py
    remove MountPoint use new datastructure for instead

modified:   interface/ri_install.py
    add MakePartitions for partition

modified:   interface/ri_oper.py
    1.add MakePartitions class
    2.modify Format, Mount, ConfigureFstab class

modified:   new_partition/partition_data.py
    1.add disk_from_os attribute to Partition class for disk
    2.add process linux-swap(v1) in Partition class
    3.force convert num and sn to int, beacause when read from install.xml
      sn and num is still string.

modified:   operation/format_partition.sh
    1.add timeout beacause use MakePartitions, need time to generate
    device file
    2.add linux-swap for swap

modified:   operation/functions
    1.add % support, beacause of partition may use 1% to partition
    disks.

new file:   operation/partition_disks.sh
    1.use partition_disks as parted stdin wrapper.

Signed-off-by: Qin Bo <bqin@linx-info.com>
This commit is contained in:
Qin Bo
2013-12-04 19:16:16 +08:00
parent c304aeab2a
commit 02dbaa792b
7 changed files with 175 additions and 46 deletions

View File

@@ -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':

View File

@@ -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)

View File

@@ -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 = ''

View File

@@ -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')

View File

@@ -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)

View File

@@ -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
}

43
operation/partition_disks.sh Executable file
View File

@@ -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 "$@"