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.
135 lines
3.8 KiB
135 lines
3.8 KiB
import os
|
|
from calculate.utils.fs import readFile
|
|
from calculate.variables.datavars import (
|
|
Variable,
|
|
Namespace,
|
|
StringType,
|
|
BooleanType,
|
|
HashType,
|
|
Calculate
|
|
)
|
|
|
|
|
|
def get_ebuild_phase():
|
|
return os.environ.get("EBUILD_PHASE", "")
|
|
|
|
|
|
def get_chroot_status():
|
|
"""Detect chroot mode by different mountinfo"""
|
|
pid = os.getpid()
|
|
try:
|
|
if not os.access('/proc/self/mountinfo', R_OK) or \
|
|
not os.access('/proc/1/mountinfo', R_OK):
|
|
return False
|
|
infos = [readFile(x) for x in ('/proc/1/mountinfo',
|
|
'/proc/self/mountinfo')]
|
|
return infos[0] != infos[1]
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def is_system_boot():
|
|
if os.readlink('/proc/self/fd/0') == '/dev/console':
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
class CmdlineParams(object):
|
|
"""Параметры опции загрузки ядра calculate=
|
|
"""
|
|
# названия параметров
|
|
Calculate = "calculate"
|
|
IsoscanFile = "iso-scan/filename"
|
|
IOScheduler = "elevator"
|
|
|
|
# внутренние параметры calculate
|
|
Locale = "lang"
|
|
Keymap = "keymap"
|
|
Timezone = "timezone"
|
|
Resolution = "resolution"
|
|
Video = "video"
|
|
Composite = "composite"
|
|
Domain = "domain"
|
|
DomainPassword = "domain_pw"
|
|
Audio = "audio"
|
|
Clock = "clock"
|
|
|
|
|
|
def get_cmdline_parameter(paramname):
|
|
cmdLine = "/proc/cmdline"
|
|
for param in readFile(cmdLine).split(" "):
|
|
parname, op, value = param.partition("=")
|
|
if parname == paramname:
|
|
return value
|
|
return None
|
|
|
|
|
|
def get_calculate_cmdline():
|
|
names = (
|
|
CmdlineParams.Locale,
|
|
CmdlineParams.Keymap,
|
|
CmdlineParams.Timezone,
|
|
CmdlineParams.Resolution,
|
|
CmdlineParams.Video,
|
|
CmdlineParams.Composite,
|
|
CmdlineParams.Domain,
|
|
CmdlineParams.DomainPassword,
|
|
CmdlineParams.Audio,
|
|
CmdlineParams.Clock)
|
|
# try get timezone from kernel calculate param
|
|
params = {x: "" for x in names}
|
|
try:
|
|
value = get_cmdline_parameter(CmdlineParams.Calculate)
|
|
if value is not None:
|
|
for cparam in (x for x in value.split(',') if x):
|
|
k, v = cparam.partition(':')[0::2]
|
|
if k and v and k in names:
|
|
params[k.strip()] = v.strip()
|
|
except (IOError, ValueError, IndexError):
|
|
pass
|
|
return params
|
|
|
|
|
|
def get_isoscan_filename():
|
|
value = get_cmdline_parameter(CmdlineParams.IsoscanFile)
|
|
if value is not None:
|
|
return value
|
|
return ""
|
|
|
|
|
|
def get_isoscan_fullpath(base_path, filename):
|
|
if filename:
|
|
return os.path.join(base_path.value, filename.value.lstrip("/"))
|
|
return ""
|
|
|
|
|
|
def import_variables():
|
|
Variable("ebuild_phase", type=StringType,
|
|
source=Calculate(get_ebuild_phase))
|
|
|
|
Variable("chroot_status", type=BooleanType,
|
|
source=Calculate(get_chroot_status))
|
|
|
|
Variable("system_boot_set", type=BooleanType,
|
|
source=Calculate(is_system_boot))
|
|
|
|
# Переменная, в которую будут помещаться пути к текущим шаблонам.
|
|
Variable("current_template", type=StringType, source="")
|
|
|
|
with Namespace('cmdline'):
|
|
Variable("calculate", type=HashType.fixed,
|
|
source=Calculate(get_calculate_cmdline))
|
|
|
|
Variable("isoscan_filename", type=StringType,
|
|
source=Calculate(get_isoscan_filename))
|
|
|
|
with Namespace('isoscan'):
|
|
Variable("base_path", type=StringType,
|
|
source="/run/initramfs/isoscan")
|
|
|
|
Variable("full_path", type=StringType,
|
|
source=Calculate(get_isoscan_fullpath,
|
|
'.base_path',
|
|
'main.cl.cmdline.isoscan_filename'))
|