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:
@@ -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':
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = ''
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
43
operation/partition_disks.sh
Executable 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 "$@"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user