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/pym/install/variables/X11.py

421 lines
15 KiB

9 years ago
# -*- coding: utf-8 -*-
# Copyright 2008-2016 Mir Calculate. 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
import hashlib
import glob
from calculate.lib.datavars import Variable, VariableError, ReadonlyVariable
from calculate.lib.utils.portage import isPkgInstalled
9 years ago
from calculate.lib.utils.files import readFile
import calculate.lib.utils.device as device
from calculate.lib.utils.common import (getVideoFromXorgLog,
9 years ago
getVideoFromXorgConf,
getVideoFromCmdLine,
getAvailableVideo, getValueFromCmdLine,
getCompositeFromXorgconf,
getVideoFromModules,
getVideoFromVendor, getInstalledVideo,
CmdlineParams)
from calculate.install.distr import DistributiveError
import fcntl
import struct
from collections import OrderedDict
9 years ago
from calculate.lib.cl_lang import setLocalTranslate, _
setLocalTranslate('cl_install3', sys.modules[__name__])
class VideoVariable(Variable):
"""
Video variables not using for flash installation
"""
xorg_need = True
default_video = "default"
driver_names = OrderedDict([
('default', _("Auto detection")),
('radeon', _("AMD Radeon (radeon)")),
('amdgpu', _("AMD AMDGPU (amdgpu)")),
('fglrx', _("AMD Catalyst (fglrx)")),
('intel', _("Intel (intel)")),
('nouveau', _("Nvidia Nouveau (nouveau)")),
('nvidia', _("Nvidia Graphics Driver (nvidia)")),
('vesa', _("Generic VESA (vesa)")),
])
def uncompatible(self):
"""
Video setting up unavailable for flash installation
"""
if self.Get('os_install_root_type') == 'flash':
return \
12 years ago
_("Video configuration unavailable for Flash install")
if (self.Get('install.os_install_x11_server_set') == 'off' and
self.xorg_need):
return \
_("This distribution does not provide a Xorg server")
return ""
9 years ago
class ResolutionVariable(VideoVariable):
"""
Abstract resolution variable
"""
fbres = False
9 years ago
def choice(self):
resolutions = ["640x480", "800x480", "800x600", "1024x576", "1024x600",
"1024x768", "1200x800", "1280x800", "1280x720",
"1280x768", "1280x1024", "1360x768", "1366x768",
"1368x768", "1400x1050", "1440x900", "1680x945",
"1680x1050", "1920x1080", "1920x1200", "1600x768",
"1600x900", "1600x1200", "2048x1152", "2560x1440",
"2560x1600"]
if self.fbres:
9 years ago
return map(lambda x: "%s-32" % x,
resolutions)
else:
return resolutions
9 years ago
def check(self, value):
"""
Check resolution format 1234x567
"""
9 years ago
if not re.match('^\d+x\d+(-\d+(@\d+)?)?$', value):
raise VariableError(
_("Wrong resolution {resolution} {example}").format(
9 years ago
resolution=value,
example="(%s:%s)" % (_("Example"), "1024x768")))
class VariableOsInstallX11ResolutionPreferred(ResolutionVariable):
"""
X.org resolution
"""
type = 'choiceedit'
opt = ['-X']
metavalue = "<width>x<height>"
# разрешение по умолчанию пустое - это нужно для livecd
# для автоопределения разрешения xorg сервером
preferred_resolution = ""
def init(self):
self.help = _("set the Xorg resolution")
self.label = _("Screen resolution")
def get(self):
# get resolution from xorg.log
res = self.Get('os_x11_resolution')
if res:
return res
else:
return self.preferred_resolution
class VariableOsInstallX11Resolution(ResolutionVariable):
"""
X.org resolution
"""
fallback_resolution = "1024x768"
def get(self):
# get resolution from xorg.log
for vn in ('install.os_install_x11_resolution_preferred',
'install.os_install_fb_resolution'):
res = self.Get(vn)
if res:
return res
else:
return self.fallback_resolution
9 years ago
class VariableOsInstallX11VideoAvailable(VideoVariable):
"""
Get available (already installed or installable drivers
"""
type = "list"
# supported = ["nvidia", "fglrx", "amdgpu", "nouveau", "intel", "radeon"]
supported = ["nvidia", "fglrx", "amdgpu", "nouveau", "intel", "radeon"]
def get(self):
image = self.Get('cl_image')
if image:
9 years ago
with image:
try:
distrPath = image.getDirectory()
9 years ago
if isPkgInstalled('xorg-server', prefix=distrPath):
return (sorted(filter(self.supported.__contains__,
9 years ago
getAvailableVideo(
prefix=distrPath))) +
[self.default_video])
9 years ago
except DistributiveError:
pass
return []
def humanReadable(self):
return map(lambda x: self.driver_names.get(x, x), self.Get())
class VariableOsX11KmsVideoDrv(ReadonlyVariable):
"""
Список KMS драйверов
"""
type = "list"
value = ["radeon", "intel", "nouveau", "amdgpu"]
class VariableOsInstallX11VideoDrv(VideoVariable):
"""
Video driver used by xorg
"""
type = 'choiceedit'
opt = ['--video']
metavalue = "VIDEODRV"
def init(self):
self.help = _("set the video driver")
self.label = _("Video driver")
def choice(self):
"""Get available (already installed or installable drivers"""
if self.Get('os_install_x11_server_set') == 'on':
values = self.Get('os_install_x11_video_available')
else:
values = self.Get('os_x11_kms_video_drv') + [self.default_video]
return map(lambda x: (x, self.driver_names.get(x, x)),
(x for x in self.driver_names.keys() if x in values))
12 years ago
def get(self):
if self.Get('os_install_x11_server_set') == 'on':
# get available videodriver list from install or configure distributive
list_video = self.Choice('os_install_x11_video_drv')
if not list_video:
return self.default_video
# if type system is usb-hdd then get detect video driver
if self.Get('os_install_root_type') == 'usb-hdd':
9 years ago
methods = ((getVideoFromModules, ()),
(getVideoFromCmdLine, ()),
(getVideoFromVendor,
(self.Get('hr_video'), list_video)))
else:
# test current video driver for install system
9 years ago
methods = ((getVideoFromXorgLog, ('/', list_video)),
(getVideoFromXorgConf, ('/',)),
(getVideoFromModules, ()),
(getVideoFromCmdLine, ()),
(getVideoFromVendor,
(self.Get('hr_video'), list_video)))
for func, args in methods:
drv = func(*args)
if drv in list_video:
return drv
return self.default_video
else:
9 years ago
for drv in map(lambda x: x[0], self.choice()):
refcnt = device.sysfs.read(
device.sysfs.Path.Module, drv, "refcnt").strip()
if refcnt.isdigit() and int(refcnt) > 0:
9 years ago
return {'i915': 'intel'}.get(drv, drv)
else:
return self.default_video
9 years ago
pkgDrvMap = {'nvidia': ('NVidia', 'x11-drivers/nvidia-drivers'),
'fglrx': ('ATI', 'x11-drivers/ati-drivers'),
'vboxdrv': ('VirtualBox', 'x11-drivers/xf86-video-virtualbox')}
9 years ago
def check(self, value):
if self.Get('os_install_x11_server_set') == 'on':
if self.Get('cl_action') == 'system':
availDrvs = self.Get('os_install_x11_video_available')
if not value in availDrvs:
9 years ago
raise VariableError(_("Only %s drivers are available") %
",".join(availDrvs))
else:
if not value in getInstalledVideo(prefix="/") and \
9 years ago
not value in ("auto", self.default_video):
error = _("video driver %s is unavailable") % value
if value in self.pkgDrvMap:
error += ". " + (_("Install driver %s with:")
9 years ago
% self.pkgDrvMap[value][0])
error += "\n" + ("emerge %s" % self.pkgDrvMap[value][1])
raise VariableError(error)
else:
9 years ago
availDrivers = self.Get('os_x11_kms_video_drv') + [
self.default_video]
if not value in availDrivers:
raise VariableError("Only %s drivers are available" %
",".join(availDrivers))
def uncompatible(self):
"""
Video setting up unavailable for flash installation
"""
if self.Get('os_install_root_type') == 'flash':
return \
_("Video configuration unavailable for Flash install")
return ""
9 years ago
class VariableOsInstallX11VideoDrvPrev(VariableOsInstallX11VideoDrv):
"""
Предыдущее значение os_install_x11_videodrv
"""
class VariableHrVideoId(ReadonlyVariable):
"""
BusID of video card
TODO: need realization
"""
value = ""
9 years ago
class VariableOsInstallX11Composite(VideoVariable):
"""
on/off composite
"""
type = 'bool'
opt = ['--composite']
def init(self):
12 years ago
self.help = _("toggle composite")
self.label = _("Composite")
def get(self):
"""On/off composite"""
defaultCompositeOn = ("nvidia", "intel", "fglrx", "amdgpu",
9 years ago
"nouveau", "radeon", "default")
composite = getValueFromCmdLine(CmdlineParams.Calculate,
CmdlineParams.Composite)
videodrv = getValueFromCmdLine(CmdlineParams.Calculate,
CmdlineParams.Video)
if videodrv != "auto":
9 years ago
composite = {'nocomposite': 'off',
'off': 'off',
'on': 'on',
'composite': 'on'}.get(composite)
else:
composite = None
if self.Get('os_install_x11_video_drv') in defaultCompositeOn:
defaultComposite = "on"
elif self.Get('hr_virtual') == 'vmware':
defaultComposite = "on"
else:
defaultComposite = "off"
if self.Get('os_install_x11_video_drv') == self.Get('os_x11_video_drv'):
state = getCompositeFromXorgconf()
else:
state = None
return composite or state or defaultComposite
9 years ago
class VariableOsInstallFbResolution(ResolutionVariable):
"""
Framebuffer resolution
"""
type = 'choiceedit'
opt = ['--fb']
metavalue = "<width>x<height>"
xorg_need = False
fbres = True
fallback_resolution = "1024x768"
def init(self):
self.help = _("set the framebuffer resolution")
self.label = _("Framebuffer resolution")
def get(self):
return self.Get('os_install_x11_resolution') or self.fallback_resolution
class VariableClGrubImageHash(ReadonlyVariable):
"""
Контрольная сумма изображения для grub
"""
grub_image = "/boot/grub/grub-calculate.png"
theme_data = "/etc/grub.d/05_theme"
def get_image_md5(self, source):
return hashlib.md5(readFile(source)).hexdigest()
def get_config_md5(selfself, source):
return hashlib.md5(readFile(source, grab=True)).hexdigest()
def get_checksum(self):
data = []
if path.exists(self.grub_image):
data.append(self.get_image_md5(self.grub_image))
else:
data.append("-")
if path.exists(self.theme_data):
data.append(self.get_config_md5(self.theme_data))
else:
data.append("-")
return "".join(data)
def get(self):
if self.Get('cl_setup') == 'themes':
return self.get_checksum()
return ""
class VariableClGrubImageUpdateSet(VariableClGrubImageHash):
"""
Изображение для grub обновлилось
"""
def get(self):
if self.Get('cl_setup') == 'themes':
newmd5 = self.get_checksum()
return "on" if newmd5 != self.Get('cl_grub_image_hash') else "off"
return "off"
class VariableClSplashImageHash(ReadonlyVariable):
"""
Контрольные суммы изображений для splashutils
"""
hash_files = ("/etc/splash/calculate/images/verbose.md5",
"/etc/splash/calculate/images/silent.md5")
cfg_files = "/etc/splash/calculate/*.cfg"
def get_config_md5(selfself, source):
return hashlib.md5(readFile(source, grab=True)).hexdigest()
def get_hash_data(self, sources):
data = []
for fn in sources:
data.append(readFile(fn) or "-")
for fn in glob.glob(self.cfg_files):
data.append(self.get_config_md5(fn))
break
return "".join(data)
def get(self):
if self.Get('cl_setup') == 'themes':
return self.get_hash_data(self.hash_files)
return ""
class VariableClSplashImageUpdateSet(VariableClSplashImageHash):
"""
Изображение для splash dracut обновлилось
"""
def get(self):
if self.Get('cl_setup') == 'themes':
newmd5 = self.get_hash_data(self.hash_files)
return "on" if newmd5 != self.Get('cl_splash_image_hash') else "off"
return "off"