You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-3-install/install/variables/system.py

384 lines
13 KiB

#-*- coding: utf-8 -*-
# Copyright 2008-2012 Calculate Ltd. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
import re
from os import path
from calculate.lib.datavars import Variables,VariableError
from calculate.lib.variables import System
from calculate.install.cl_install import FileSystemManager
from calculate.lib.utils.files import readFile,getProgPath,process
from calculate.lib.utils.common import getPasswdUsers
from crypt import crypt
from calculate.lib.encrypt import encrypt
from calculate.lib.cl_lang import setLocalTranslate
setLocalTranslate('cl_install',sys.modules[__name__])
class InstallSystem(System):
vars = ["os_install_scratch","cl_autoupdate_set",
"cl_install_autoupdate_set",
"os_install_proxy","os_install_ntp",
"os_install_dev_from","os_install_lvm_set",
"os_install_mdadm_set","os_grub_conf","os_grub2_path",
"cl_chroot_grub","os_install_grub_devicemap_conf",
"cl_distfiles_path","cl_pkgdir_path","os_format_type",
"os_format_use","os_install_makeopts","cl_migrate_user",
"cl_migrate_data",
"cl_migrate_user_pwd","os_nvidia_mask","cl_autologin"]
# install system in scratch mode
os_install_scratch = {'mode':'w',
'type':'bool',
'opt':['--build'],
'label':_("Builder mode"),
'help':_("installation for assemble")}
# filesystem format support by calcualte-install
os_format_type = {'mode':'r',
'type':"list"}
# avialable format by mkfs utility
os_format_use = {'mode':'r',
'type':"list"}
# (on or off) autoupdate config from install program
cl_autoupdate_set = {'value': "off",
'type': "bool",
'value': "off"}
# (on or off) autoupdate config from install program for install
cl_install_autoupdate_set = {'mode':'w',
'type': "bool",
'value': "off"}
# proxy server for system
os_install_proxy = {'mode':'w',
'value':''}
# nt server for system
os_install_ntp = {'mode':'w',
'label':_("NTP server"),
'opt':['--ntp'],
'help':_("set the ntp server for the system"),
'metavalue':"NTP",
'value':'ntp0.zenon.net'}
# type of device for install
os_install_root_type = {'mode':'w'}
# root device of installed os
os_install_root_dev = {}
# using lvm
os_install_lvm_set = {'mode':'r',
'type':"bool"}
# using mdadm
os_install_mdadm_set = {'mode':'r',
'type':"bool"}
# current grub
os_grub_conf = {}
# grub2 install path
os_grub2_path = {'mode':'w'}
# grub chroot need for grub-mkconfig
cl_chroot_grub = {}
# content of device.map file for grub
os_install_grub_devicemap_conf = {}
# DISTFILES value
cl_distfiles_path = {'mode':'w',
'value':'/var/calculate/remote/distfiles'}
# PKGDIR value
cl_pkgdir_path = {'mode':'w'}
# makeconf makeopts
os_install_makeopts = {'mode':'w'}
# user migrate data table
cl_migrate_data = {'type':'table',
'mode':'w',
'opt':["--users","-u"],
'metavalue':'USERS',
'source':['cl_migrate_user',
'cl_migrate_user_pwd'],
'help':_("add a user to the installed system"),
'label':_("Migration users")}
# migrate users
cl_migrate_user = {'type':'list',
'label':_("Login"),
'mode':'w'}
# migrate users who need to change passwords
cl_migrate_user_pwd = {'type':'password-list',
'label':_("Password"),
'mode':'w'}
# nvidia-drivers atom mask
os_nvidia_mask = {}
# variable for autologin
cl_autologin = {'type':'choiceedit',
'mode':'w',
'label':_("Autologin"),
'opt':["--autologin",'-A'],
'metavalue':"USER",
'help':_("add an autologin user to the installed system")
}
# root device of previous installed os
os_install_dev_from = {'mode':'w'}
def get_os_install_scratch(self):
"""Install system in scratch mode"""
if self.Get('cl_action') == 'system':
return "off"
else:
return self.Get('os_scratch')
def check_os_install_scratch(self,value):
"""Check abality install in scratch mode"""
if value == "on":
if self.Get('os_install_root_type') == "flash":
raise VariableError(
_("Installation to flash disk is not supported"
" in builder mode"))
if filter(lambda x: x != '/', self.Get('os_install_disk_mount')):
raise VariableError(
_("Builder mode does not support multipartition install"))
def get_os_format_type(self):
"""Filesystem format support by calcualte-install"""
return FileSystemManager.supportFS.keys()
def get_os_format_use(self):
"""Avialable format by mkfs utility"""
return map(lambda x:"yes"
if path.exists(FileSystemManager.supportFS[x]["format"])
else "no", self.Get('os_format_type'))
def get_cl_pkgdir_path(self):
return "/var/calculate/remote/packages/%s/%s" % (
self.Get('os_install_linux_shortname'),
self.Get('os_install_arch_machine'))
def get_cl_install_autoupdate_set(self):
"""Get autoupdate default value"""
if self.Get('ac_install_system') == "up":
if self.Get('os_install_linux_system') == 'desktop':
return "on"
else:
return "off"
else:
return self.Get('cl_autoupdate_set')
def get_os_nvidia_mask(self):
"""Get nvidia card mask versions"""
image = self.Get('cl_image')
try:
if image:
image = image.convertToDirectory()
chrootPath = image.getDirectory()
chrootPath = image.getDirectory()
else:
chrootPath = self.Get("cl_chroot_path")
nvidiaeclass = path.join(chrootPath,
'usr/portage/eclass/nvidia-driver.eclass')
if not os.access(nvidiaeclass,os.R_OK):
return ""
category = "0300"
vendor = "10de:"
lsPciProg = getProgPath("/usr/sbin/lspci")
nvidiacards = filter(lambda x:" %s: "%category in x,
process(lsPciProg,"-d",vendor,"-n"))
if not nvidiacards:
return ""
cardsid = \
map(lambda x:x.groups()[0],
filter(lambda x:x,
map(lambda x:re.search("[0-9a-fA-F]{4}:([0-9a-fA-F]{4})",x),
nvidiacards)))
if not cardsid:
return ""
eclassdata = readFile(nvidiaeclass)
drv_categories = re.findall('^drv_([^=]+)="', eclassdata, re.M)
drvs = map(lambda x:(x[0],x[1].replace('\\\n','').split()),
re.findall('\ndrv_(%s)="(.*?)"'%"|".join(drv_categories),
eclassdata,re.S))
mask_categories = re.findall('^mask_([^=]+)="', eclassdata, re.M)
masks = dict(map(lambda x:(x[0],x[1].replace('\\\n','')),
re.findall('\nmask_(%s)="(.*?)"'%"|".join(drv_categories),
eclassdata,re.S)))
drvsForCardsid = filter(lambda x:set(x[1])&set(cardsid),drvs)
if drvsForCardsid and drvsForCardsid[0][0] in masks:
return masks[drvsForCardsid[0][0]]
finally:
if image:
image.close()
return ""
def get_os_install_lvm_set(self):
"""Using lvm"""
for typeDisk in self.Get('os_install_disk_type'):
if "lvm" in typeDisk:
return "on"
else:
return "off"
def get_os_install_mdadm_set(self):
"""Using mdadm"""
for typeDisk in self.Get('os_install_disk_type'):
if "lvm" in typeDisk:
return "on"
else:
return "off"
def get_cl_chroot_grub(self):
"""
Chroot for grub-mkconfig
TODO: check for install scratch system.
"""
if self.Get('os_install_scratch') == "on":
return path.join(self.Get('cl_chroot_path'),"mnt/scratch")
else:
return self.Get('cl_chroot_path')
def get_os_grub2_path(self):
"""
Get Grub2 Install cmd
"""
# find grub2-install
grubInstall = getProgPath('/sbin/grub2-install')
if grubInstall:
return grubInstall
# find grub-install and check, that this is grub2-install (ver 1.99)
grubInstall = self.getProgPath('/sbin/grub-install')
if grubInstall and filter(lambda x:"1.99" in x,
process(grubInstall,'-v')):
return grubInstall
return ""
def get_cl_migrate_user(self):
"""
Migration users (root and users above 1000 uid)
"""
return getPasswdUsers()
def get_cl_migrate_user_pwd(self):
"""
Migration users passwords
"""
retList = []
fileName = "/etc/shadow"
if os.access(fileName, os.R_OK):
migrateusers = self.Get("cl_migrate_user")
if migrateusers:
lenData=9
shadowData = filter(lambda x: len(x)==lenData,
map(lambda x: x.rstrip().split(":"),
open(fileName)))
shadowData = filter(lambda x: x[0] in migrateusers, shadowData)
shadowData = map(lambda x: (x[0], x[1]), shadowData)
shadowUsers = map(lambda x: x[0], shadowData)
for userName in migrateusers:
if userName in ("root",):
if userName in shadowUsers:
userData = filter(lambda x: x[0]==userName,
shadowData)
hashPwd = userData[0][1]
salt = "".join(hashPwd.rpartition("$")[:1])
if salt and crypt(userName, salt) == hashPwd:
retList.append("")
else:
retList.append(hashPwd)
else:
retList.append("")
else:
if userName in shadowUsers:
userData = filter(lambda x: x[0]==userName,
shadowData)
hashPwd = userData[0][1]
retList.append(hashPwd)
else:
retList.append("")
return retList
def check_cl_migrate_user_pwd(self,value):
"""
Check exists password for all migrate users
"""
for user,pwd in zip(self.Get('cl_migrate_user'),value):
if not pwd:
raise VariableError(
_("Missed a password for the user %s")%user)
def set_cl_migrate_user_pwd(self,value):
"""
Encrypt passwords
"""
reCheck = re.compile("^\$[^$]+\$[^$]+\$.*$")
encryptObj = encrypt()
return map(lambda x:x if reCheck.match(x) or not x else \
encryptObj.getHashPasswd(x, "shadow_ssha256"),
value)
def get_cl_autologin(self):
"""
Autologin
"""
if self.Get('os_install_root_type') == "livecd" or \
self.Get('os_install_linux_shortname') == "CMC":
nonRootUsers = filter(lambda x: x != "root",
self.Get('cl_migrate_user'))
if nonRootUsers:
return nonRootUsers[0]
else:
return ""
return ""
def choice_cl_autologin(self):
"""
List of valid users
"""
return filter(lambda x:x != "root",self.Get('cl_migrate_user'))+[""]
def check_cl_autologin(self,value):
"""
Autologin only migrated users
"""
if value and not value in self.Get('cl_migrate_user'):
raise VariableError(_("User %s is not exists")%value)
if value == "root":
raise VariableError(_("Autologin is imposible for %s user")%value)
def uncompatible_user_vars(self):
"""
Network setting up unavailable for flash installation
"""
if self.Get('os_install_root_type') == 'flash':
return \
_("User configuration unavailable for flash installation")
return ""
uncompatible_cl_autologin = \
uncompatible_cl_migrate_data = \
uncompatible_user_vars