Replace Popen object to process from calculate-lib. Added --mbr=off. Added os_install_mbr variable. Need calculate-lib 1274..34de.

master3.3
Mike Hiretsky 14 years ago
parent 11c534d450
commit 37cecdb465

@ -995,3 +995,17 @@ class fillVars(object, glob_attr):
def get_os_scratch(self):
"""Current system is scratch"""
return "on" if isMount('/mnt/scratch') else "off"
def getFieldByField(self,resField,field,value, firstPrefix="os_disk",
secondPrefix="os_disk"):
res = filter(lambda x: x[1] == value,
zip(self.clVars.Get('%s_%s'%(firstPrefix,resField)),
self.clVars.Get('%s_%s'%(secondPrefix,field)))) or\
[("","")]
return res[0][0]
def get_os_install_mbr(self):
if self.Get('os_device_dev'):
return self.Get('os_device_dev')[0]
else:
return ""

@ -24,7 +24,7 @@ import traceback
from os.path import exists as pathexists,join as pathjoin,dirname
from cl_utils import runOsCommand,appendProgramToEnvFile, \
removeProgramToEnvFile,pathJoin, \
scanDirectory
scanDirectory,process
from cl_kernel import KernelConfig,InitRamFs
@ -58,7 +58,7 @@ from cl_distr import PartitionDistributive,DistributiveRepository,\
Spinner
from cl_string import tableReport
from time import sleep
from subprocess import Popen,PIPE
from subprocess import PIPE,STDOUT
from server.utils import dialogYesNo
from cl_migrate_users import migrate, currentUsers
from cl_utils import getUserPassword
@ -722,8 +722,8 @@ class cl_install(color_print):
sleep(1)
self.defaultPrint("\b\b \n")
def prepareBoot(self,targetDistr, grubDisk="0"):
self.installBootloader(targetDistr, grubDisk="0")
def prepareBoot(self,targetDistr):
self.installBootloader(targetDistr)
def getTargetDistributive(self,disk,fileSystem="reiserfs",isFormat=False,
systemId=None):
@ -782,7 +782,8 @@ class cl_install(color_print):
zip(self.clVars.Get('os_install_bind_dir'),
self.clVars.Get('os_install_bind_mountpoint'))))
def setInstallOptions(self, listDisks, listBinds, listSwaps, listUsers):
def setInstallOptions(self, listDisks, listBinds, listSwaps, listUsers,
mbrDisk):
"""Set data for installation partitions"""
if listUsers:
migrateUsers = list(set(listUsers))
@ -1061,6 +1062,21 @@ class cl_install(color_print):
disk['systemId'] = updateIdDict[disk['dev']]
else:
disk['systemId'] = None
bootDiskGrub = ""
if mbrDisk == "off":
self.clVars.Set('os_install_mbr',"",force=True)
elif mbrDisk:
listbootDiskGrub = map(lambda x: x[0],
filter(lambda x: "/dev/"+x[0]==mbrDisk,
zip(self.clVars.Get('os_device_dev'),
self.clVars.Get('os_device_map'))))
if filter(lambda x: "/dev/%s"%x == mbrDisk,
self.clVars.Get('os_device_dev')):
self.clVars.Set('os_install_mbr',mbrDisk.strip('/dev/'),
force=True)
else:
self.printERROR(_("Cann't found disk '%s'")%mbrDisk)
return False
return True
def getDeviceByField(self,field,value, secondPrefix="os_disk"):
@ -1084,28 +1100,30 @@ class cl_install(color_print):
else:
return ""
def installBootloader(self,target, grubDisk="0"):
def installBootloader(self,target):
"""Install boot loader
Perform grub installation to disk, which has root partition
"""
pipe = Popen(["/sbin/grub",
grubProcess = process("/sbin/grub",
"--device-map=%s/boot/grub/device.map"%target.getDirectory(),
"--batch"], stdin=PIPE, stdout=PIPE,stderr=PIPE)
"--batch")
bootDisk = self.getFieldByField("grub","mount","/boot",
secondPrefix="os_install_disk")
if not bootDisk:
bootDisk = self.getFieldByField("grub","mount","/",
secondPrefix="os_install_disk")
pipe.stdin.write("root (hd%s)\n" %bootDisk)
# TODO: change hd0 for bootloader install to other disks
# may be another parameters
pipe.stdin.write("setup (hd%s)\n"%grubDisk)
pipe.stdin.write("quit\n")
pipe.stdin.close()
# TODO: break if command is hang (KeyboardInterrupt is supported)
if pipe.wait() != 0:
raise DistributiveError("Cann't install bootloader")
mbrDisk = self.clVars.Get('os_install_mbr')
mbrDiskNum = filter(lambda x:x[0]==mbrDisk,
zip(self.clVars.Get('os_device_dev'),
self.clVars.Get('os_device_map')))
if not mbrDiskNum:
raise DistributiveError(_("Cann't determine mbr disk"))
grubProcess.write("root (hd%s)\n" %bootDisk)
grubProcess.write("setup (hd%d)\n"%mbrDiskNum[0][1])
grubProcess.write("quit\n")
if grubProcess.failed():
raise DistributiveError(_("Cann't install bootloader"))
def generateTableData(self):
"""Get data from print table"""
@ -1399,16 +1417,6 @@ class cl_install(color_print):
#waittime = 3
#self.printSUCCESS(_("Installation will start pass %d seconds.")
#%waittime)
bootDiskGrub = ""
if bootDisk:
listbootDiskGrub = map(lambda x: x[1],
filter(lambda x: "/dev/"+x[0]==bootDisk,
zip(self.clVars.Get('os_device_dev'),
self.clVars.Get('os_device_map'))))
if listbootDiskGrub:
bootDiskGrub=listbootDiskGrub[0]
else:
raise InstallError(_("Cann't found disk %s")%bootDisk)
self.printInfo(sourceDistr,targetDistr)
targetDistr = self.getTargetDistributive(rootPartdev,
fileSystem=rootPartFileSystem,
@ -1525,10 +1533,8 @@ the system") + " (yes/no)"
if not objMigrate.migrate(addUsers,changePwdUsers,migrateUsers):
raise InstallError(_("Can not migrate users to new system"))
# change boot config
self.printMessageForTest(_("Preparing system for reboot"))
if bootDiskGrub:
self.prepareBoot(targetDistr, bootDiskGrub)
else:
if self.clVars.Get('os_install_mbr'):
self.printMessageForTest(_("Preparing system for reboot"))
self.prepareBoot(targetDistr)
self.printByResult(True)
# optimize initrd

@ -40,7 +40,7 @@ CMD_OPTIONS = [{'shortOption':"d",
{'longOption':"mbr",
'optVal':"DEVICE",
'help':_("boot disk for the installed system \
(to be recorded MBR)")
(to be recorded MBR), off - disable MBR writing")
},
{'shortOption':"w",
'longOption':"swap",
@ -198,7 +198,7 @@ class install_cmd(share_cmd):
#check boot device
if values.mbr:
bootDisk = values.mbr
reBootDisk = re.compile("^/dev/.+[^\d]$")
reBootDisk = re.compile("^/dev/.+[^\d]|off$")
if not reBootDisk.match(bootDisk):
self.optobj.error(_("option %s:") %"mbr" + " " +\
_("disk specifing error: '%s'")%bootDisk)
@ -267,7 +267,8 @@ class install_cmd(share_cmd):
if listSwapOptions is False:
return False
if not self.logicObj.setInstallOptions(listDiskOptions, listBindOptions,
listSwapOptions, usersOptions):
listSwapOptions, usersOptions,
self.optobj.values.mbr):
return False
return True

@ -14,13 +14,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from cl_utils import typeFile,runOsCommand
from cl_utils import typeFile,runOsCommand,process
import gzip
import re
import os
from os.path import join as pathjoin
from os import access,R_OK
from subprocess import Popen,PIPE
from subprocess import PIPE
from shutil import rmtree
class KernelConfig:
@ -125,14 +125,12 @@ class InitRamFs:
if not os.path.exists(self.tmpPath):
os.mkdir(self.tmpPath)
os.chdir(self.tmpPath)
cpioProcess = Popen(["cpio", "-di"],
stdout=PIPE,stdin=PIPE,stderr=PIPE)
cpioProcess = process("cpio", "-di")
gzipInitrd = gzip.open(self.initrdFile,'r')
cpioProcess.stdin.write(gzipInitrd.read())
cpioProcess.stdin.flush()
cpioProcess.communicate()
cpioProcess.write(gzipInitrd.read())
res = cpioProcess.success()
os.chdir(self.prevDir)
return True if cpioProcess.returncode == 0 else False
return res
def _packInitRamfs(self):
"""Pack initramfs"""
@ -148,15 +146,13 @@ class InitRamFs:
# change dir for cpio
os.chdir(self.tmpPath)
# create cpio process
cpioProcess = Popen(["cpio", "-o", "--quiet", "-H","newc"],
stdout=PIPE,stdin=PIPE,stderr=PIPE)
cpioProcess = process("cpio", "-o", "--quiet", "-H","newc")
# send file list to cpio process
cpioProcess.stdin.write("\n".join(fileList))
cpioProcess.stdin.write("\n")
cpioProcess.stdin.flush()
cpioProcess.write("\n".join(fileList))
cpioProcess.write("\n")
# get result of cpio
cpioData = cpioProcess.communicate()[0]
cpioRes = cpioProcess.returncode
cpioData = cpioProcess.read()
cpioRes = cpioProcess.returncode()
except KeyboardInterrupt:
os.chdir(self.prevDir)
raise KeyboardInterrupt

@ -82,6 +82,9 @@ class Data:
# partition's system id
os_disk_id = {}
# disk for boot mbr
os_install_mbr = {}
# list grub id for partition devices
os_disk_grub = {}

Loading…
Cancel
Save