|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
|
# Copyright 2015 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 re
|
|
|
|
|
from os import path
|
|
|
|
|
import sys
|
|
|
|
|
from calculate.lib.utils.portage import isPkgInstalled
|
|
|
|
|
from calculate.lib.variables.linux import LinuxDataVars
|
|
|
|
|
from calculate.install.distr import IsoDistributive, DistributiveError
|
|
|
|
|
from calculate.lib.utils.files import listDirectory
|
|
|
|
|
from calculate.lib.datavars import ReadonlyVariable, \
|
|
|
|
|
ReadonlyTableVariable, FieldValue, VariableError, Variable
|
|
|
|
|
from calculate.install.variables.system import VariableOsInstallX11ServerSet
|
|
|
|
|
from builder import (VariableClBuilderPath, VariableClBuilderKernel,
|
|
|
|
|
VariableClBuilderKernelVer, VariableClBuilderInitrdInstall,
|
|
|
|
|
VariableClBuilderVideoDriverPath, VariableClBuilderVideodrvSet)
|
|
|
|
|
from action import Actions
|
|
|
|
|
|
|
|
|
|
_ = lambda x:x
|
|
|
|
|
|
|
|
|
|
from calculate.lib.cl_lang import setLocalTranslate
|
|
|
|
|
|
|
|
|
|
setLocalTranslate('cl_builder3', sys.modules[__name__])
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderIsoLabel(ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Метка в syslinux образе
|
|
|
|
|
"""
|
|
|
|
|
fullname_format = "{name} {ver}{subname} {arch} {build}"
|
|
|
|
|
|
|
|
|
|
def get(self):
|
|
|
|
|
name = self.Get('os_linux_name')
|
|
|
|
|
subname = self.Get('os_linux_subname')
|
|
|
|
|
if subname:
|
|
|
|
|
subname = " %s" % subname
|
|
|
|
|
ver = self.Get('os_linux_ver')
|
|
|
|
|
build = self.Get('os_linux_build')
|
|
|
|
|
arch = self.Get('os_arch_machine')
|
|
|
|
|
return self.fullname_format.format(
|
|
|
|
|
name=name, ver=ver, subname=subname, arch=arch, build=build)
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderSplash(ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Тип splash в образе
|
|
|
|
|
"""
|
|
|
|
|
def get(self):
|
|
|
|
|
prefix = self.Get('cl_builder_path')
|
|
|
|
|
if isPkgInstalled('media-gfx/splashutils', prefix=prefix):
|
|
|
|
|
return "splashutils"
|
|
|
|
|
elif isPkgInstalled("media-gfx/plymouth-themes-calculate",
|
|
|
|
|
prefix=prefix):
|
|
|
|
|
return "plymouth"
|
|
|
|
|
else:
|
|
|
|
|
return ""
|
|
|
|
|
|
|
|
|
|
class DataVarsBuilderImage(LinuxDataVars):
|
|
|
|
|
def variables(self):
|
|
|
|
|
l = super(DataVarsBuilderImage, self).variables()
|
|
|
|
|
return l + [
|
|
|
|
|
VariableClBuilderPath(),
|
|
|
|
|
VariableClBuilderKernel(),
|
|
|
|
|
VariableClBuilderInitrdInstall(),
|
|
|
|
|
VariableClBuilderKernelVer(),
|
|
|
|
|
VariableOsInstallX11ServerSet(image=False,
|
|
|
|
|
prefix_variable="cl_builder_path"),
|
|
|
|
|
VariableClBuilderVideoDriverPath(),
|
|
|
|
|
VariableClBuilderVideodrvSet(autodetect=True),
|
|
|
|
|
VariableClBuilderIsoLabel(),
|
|
|
|
|
VariableClBuilderSplash(),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def init_variables(self):
|
|
|
|
|
self['cl_builder_path'] = self.systemRoot
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderLiveBasePath(ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Путь, куда подключена flash
|
|
|
|
|
"""
|
|
|
|
|
value = "/run/initramfs/live"
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImagePath(ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Путь до iso образов
|
|
|
|
|
"""
|
|
|
|
|
def get(self):
|
|
|
|
|
return path.join(self.Get('cl_builder_live_base_path'), "iso")
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageBootparam(Variable):
|
|
|
|
|
"""
|
|
|
|
|
Стандартная строка загрзки live образа
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageData(ReadonlyTableVariable):
|
|
|
|
|
"""
|
|
|
|
|
Информация о прочих репозиториях
|
|
|
|
|
"""
|
|
|
|
|
source = ['cl_builder_image_id',
|
|
|
|
|
'cl_builder_image_label',
|
|
|
|
|
'cl_builder_image_iso',
|
|
|
|
|
'cl_builder_image_vmlinuz_orig',
|
|
|
|
|
'cl_builder_image_vmlinuz',
|
|
|
|
|
'cl_builder_image_initrd_orig',
|
|
|
|
|
'cl_builder_image_initrd',
|
|
|
|
|
'cl_builder_image_xorg',
|
|
|
|
|
'cl_builder_image_drivers',
|
|
|
|
|
'cl_builder_image_splash',
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def generate_name(self, basename, namelist):
|
|
|
|
|
if basename not in namelist:
|
|
|
|
|
return basename
|
|
|
|
|
for n in range(1, 99):
|
|
|
|
|
newname = "%s-%d"%(basename,n)
|
|
|
|
|
if newname not in namelist:
|
|
|
|
|
return newname
|
|
|
|
|
raise VariableError(_("Failed to generate kernel name"))
|
|
|
|
|
|
|
|
|
|
parser = re.compile(r"^.*/(.*?)-(\d+)(-\d+)?-(x86_64|i686)\.iso$")
|
|
|
|
|
|
|
|
|
|
def sortkey(self, x):
|
|
|
|
|
m = self.parser.search(x)
|
|
|
|
|
if m:
|
|
|
|
|
return (m.group(1), m.group(2),
|
|
|
|
|
-int(m.group(3)) if m.group(3) else 0, m.group(4))
|
|
|
|
|
else:
|
|
|
|
|
return (x,)
|
|
|
|
|
|
|
|
|
|
def generator(self, isopath):
|
|
|
|
|
n = 1
|
|
|
|
|
numbered = re.compile(r"^.*-(\d+)-(?:x86_64|i686)\.iso$")
|
|
|
|
|
for iso_image in sorted(
|
|
|
|
|
[x for x in listDirectory(isopath, fullPath=True)
|
|
|
|
|
if x.endswith('.iso')],
|
|
|
|
|
key=self.sortkey):
|
|
|
|
|
try:
|
|
|
|
|
with IsoDistributive(iso_image) as image:
|
|
|
|
|
dn = image.getDirectory()
|
|
|
|
|
dv = DataVarsBuilderImage(dn)
|
|
|
|
|
|
|
|
|
|
kernel = dv['cl_builder_kernel']
|
|
|
|
|
kernel_copy = "vmlinuz-%d" % n
|
|
|
|
|
initrd = dv['cl_builder_initrd_install']
|
|
|
|
|
initrd_copy = "initrd-%d" % n
|
|
|
|
|
|
|
|
|
|
label = dv['cl_builder_iso_label']
|
|
|
|
|
m = numbered.search(iso_image)
|
|
|
|
|
if m:
|
|
|
|
|
label = "%s-%s"%(label, m.group(1))
|
|
|
|
|
|
|
|
|
|
yield ["cl-%d"%n,
|
|
|
|
|
label,
|
|
|
|
|
iso_image,
|
|
|
|
|
kernel, kernel_copy,
|
|
|
|
|
initrd, initrd_copy,
|
|
|
|
|
dv['os_install_x11_server_set'],
|
|
|
|
|
dv['cl_builder_videodrv_set'],
|
|
|
|
|
dv['cl_builder_splash'],
|
|
|
|
|
]
|
|
|
|
|
n += 1
|
|
|
|
|
except DistributiveError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def get(self, hr=False):
|
|
|
|
|
isopath = self.Get('cl_builder_flash_repository')
|
|
|
|
|
if self.Get('cl_builder_action') != Actions.ImageMenu or not isopath:
|
|
|
|
|
return [[]]
|
|
|
|
|
return list(self.generator(isopath))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageId(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Идентификаторы образов
|
|
|
|
|
"""
|
|
|
|
|
type = "list"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageLabel(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Идентификаторы образов
|
|
|
|
|
"""
|
|
|
|
|
type = "list"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageIso(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Пути до iso образов
|
|
|
|
|
"""
|
|
|
|
|
type = "list"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageVmlinuzOrig(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Пути до vmlinuz
|
|
|
|
|
"""
|
|
|
|
|
type = "list"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageVmlinuz(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Пути до vmlinuz
|
|
|
|
|
"""
|
|
|
|
|
type = "list"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageInitrdOrig(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Пути до initrd
|
|
|
|
|
"""
|
|
|
|
|
type = "list-bool"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageInitrd(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Пути до initrd
|
|
|
|
|
"""
|
|
|
|
|
type = "list-bool"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 6
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageXorg(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Содержит ли образ xorg-server
|
|
|
|
|
"""
|
|
|
|
|
type = "list-bool"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageDrivers(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Содержит ли образ проприетарные видеодраверы
|
|
|
|
|
"""
|
|
|
|
|
type = "list"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 8
|
|
|
|
|
|
|
|
|
|
class VariableClBuilderImageSplash(FieldValue, ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Какой сплэш содержит образ
|
|
|
|
|
"""
|
|
|
|
|
type = "list"
|
|
|
|
|
source_variable = "cl_builder_image_data"
|
|
|
|
|
column = 9
|