From b54877528c299461d00b4539e00050fb3b754940 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Wed, 4 Dec 2024 10:50:59 +0100 Subject: [PATCH] refs #1217 do not translate grubSyntax to python --- client/shared/scripts/grubSyntax | 486 ++++++++++++++++++++++++++++ client/shared/scripts/grubSyntax.py | 197 ----------- 2 files changed, 486 insertions(+), 197 deletions(-) create mode 100755 client/shared/scripts/grubSyntax delete mode 100755 client/shared/scripts/grubSyntax.py diff --git a/client/shared/scripts/grubSyntax b/client/shared/scripts/grubSyntax new file mode 100755 index 0000000..2ff21fb --- /dev/null +++ b/client/shared/scripts/grubSyntax @@ -0,0 +1,486 @@ +#!/bin/bash +set -e + +#grubSyntax +#version 1.1.0 +#autoconfigurador de items de menu para grub/brg +#basado en scripts del paquete de grub +#Antonio Doblas Viso +#Universidad de Málaga +#@version 1.1.1 - En los parámetros del kernel se sustituye el UUID por el dispositivo. +#@version 1.1.1 - Detecta cargador de Windows en directorio Part-xx-yy dentro de ESP (#802 #888) + +export PYTHONPATH=/opt/opengnsys/lib/engine/bin/ + +DISK= +PART= + + + +if [ $# == 3 ]; then + DISK=$1;PART=$2;KERNELPARAM=$3 +fi + +if [ $# == 2 ]; then + DISK=$1;PART=$2 +fi + +if [ $# == 1 ]; then + KERNELPARAM=$1 +fi + + +#Versión de scripts compatible con la versión 1.99 de grub-probe +#Uso del grub-probe 1.99 según arquitectura +grub_probe=${grub_probe:-$OGBIN/grub-probe1.99_$(arch)} + +#librerias del osProber para kernel antiguos: detecta e identifica sistema operativos. +if grub-install --version | grep 1.99 ; then + cp -r /opt/opengnsys/lib/os-probes/* /usr/lib/os-probes/ +else + # Librería os-probe para cargador de microsoft en dir part-x-y (uefi) + OSPROBE_MS_PART="/opt/opengnsys/lib/os-probes/mounted/efi/31part-x-y" + [ -f $OSPROBE_MS_PART ] && cp $OSPROBE_MS_PART /usr/lib/os-probes/mounted/efi +fi + + +#Autoreconocimiento del ogLive en cache +#fichero de reconocimeinto de grub +#fichero de lsb-release en la cache (al final de este scripts se elimina esta entrada para que el browser no lo muestre + +if [ $(ls /opt/opengnsys/cache/boot/$oglivedir/ogvmlinuz 2>/dev/null) ]; then + sed -i 's|/boot/\${oglivedir}/ogvmlinuz |/vmlinuz |i' /usr/lib/linux-boot-probes/mounted/90fallback + sed -i 's|/vmlinuz |/vmlinuz /boot/\${oglivedir}/ogvmlinuz |1' /usr/lib/linux-boot-probes/mounted/90fallback + mkdir -p /opt/opengnsys/cache/etc/ + echo "DISTRIB_ID=Ubuntu" > /opt/opengnsys/cache/etc/lsb-release + echo "DISTRIB_RELEASE= " >> /opt/opengnsys/cache/etc/lsb-release + echo $oglivedir | awk -F- ' {print "DISTRIB_CODENAME="$2 }' >> /opt/opengnsys/cache/etc/lsb-release + echo "DISTRIB_DESCRIPTION=OpenGnsys Live" >> /opt/opengnsys/cache/etc/lsb-release +fi + +#ver linea 195 detección de los os en variable OSPROBED + +OG_prepare_grub_to_access_device () +{ + device="$1" + loop_file= + case ${device} in + /dev/loop/*|/dev/loop[0-9]) + grub_loop_device="${device#/dev/}" + loop_file=`losetup "${device}" | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` + case $loop_file in + /dev/*) ;; + *) + loop_device="${device}" + device=`"${grub_probe}" --target=device "${loop_file}"` || return 0 + ;; + esac + ;; + esac + if dmsetup status $device 2>/dev/null | grep -q 'crypt[[:space:]]$'; then + grub_warn \ + "$device is a crypto device, which GRUB cannot read directly. Some" \ + "necessary modules may be missing from /boot/grub/grub.cfg. You may" \ + "need to list them in GRUB_PRELOAD_MODULES in /etc/default/grub. See" \ + "http://bugs.debian.org/542165 for details." + return 0 + fi + # Abstraction modules aren't auto-loaded. + abstraction="`"${grub_probe}" --device "${device}" --target=abstraction`" + for module in ${abstraction} ; do + echo "insmod ${module}" + done + partmap="`"${grub_probe}" --device "${device}" --target=partmap`" + for module in ${partmap} ; do + case "${module}" in + netbsd | openbsd) + echo "insmod part_bsd";; + *) + echo "insmod part_${module}";; + esac + done + fs="`"${grub_probe}" --device "${device}" --target=fs`" + for module in ${fs} ; do + echo "insmod ${module}" + done + # If there's a filesystem UUID that GRUB is capable of identifying, use it; + # otherwise set root as per value in device.map. + #OG modificacion + # PARCHE UHU ...SI el disco es nvme se cambia su nomenclatura, ya que grub_probe no funciona bien + if [[ $DEVICE == *"nvme"* ]]; then + #DEVICE=`echo $DEVICE | sed -e "s/\/dev\/nvme/hd/g" | sed -e "s/n.*p/,gpt/g"` + #TODO Detectar si es GPT o no... + read -r D P <<< $(python3 -c 'import DiskLib; d = DiskLib.ogDevToDisk ("'$DEVICE'"); print (d)') + PTT = $(python3 -c 'import DiskLib; t = DiskLib.ogGetPartitionTableType ("'$D'"); print (t)') + if [ "$PTT" == "GPT" ]; then + # Si es gpt se sustituye por "hd(X-1),gptY" + #device=`echo $device | sed -e "s/\/dev\/nvme/hd/g" | sed -e "s/n.*p/,gpt/g"` + nvmeDevice=`echo "hd"$(expr $D - 1)",gpt$P"` + + else + # Sino se sustituye por hd(X-1),(Y-1) + nvmeDevice=`echo "hd"$(expr $D - 1)","$(expr $P - 1)` + fi + echo "set root='$nvmeDevice'" + else + echo "set root='`"${grub_probe}" --device "${device}" --target=drive`'" + fi + + #if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then + # echo "search --no-floppy --fs-uuid --set=root ${fs_uuid}" + #fi + + if [ "x${loop_file}" != x ]; then + loop_mountpoint="$(awk '"'${loop_file}'" ~ "^"$2 && $2 != "/" { print $2 }' /proc/mounts | tail -n1)" + if [ "x${loop_mountpoint}" != x ]; then + echo "loopback ${grub_loop_device} ${loop_file#$loop_mountpoint}" + echo "set root=(${grub_loop_device})" + fi + fi +} + + + + + +# grub-mkconfig helper script. +# Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc. +# +# GRUB is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GRUB. If not, see . + + +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib + +. ${libdir}/grub/grub-mkconfig_lib + +found_other_os= + +make_timeout () { + if [ "x${found_other_os}" = "x" ] ; then + if [ "x${1}" != "x" ] ; then + if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then + verbose= + else + verbose=" --verbose" + fi + + if [ "x${1}" = "x0" ] ; then + cat < /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then + # missing os-prober and/or linux-boot-prober + adjust_timeout + exit 0 +fi + +case "$1" in + + +esac + + + +# ADV OSPROBED +if [ -n "${DISK}" ]; then + #Si $DISK esta definido buscar en el disco y la particion parametro 1 y 2 + OSSEARCH=$(python3 -c 'import DiskLib; d = DiskLib.ogDiskToDev ("'$DISK'", "'$PART'"); print (d)') + OSPROBED="`os-prober | grep $OSSEARCH | tr ' ' '^' | paste -s -d ' '`" +else + #si no esta definido + OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`" +fi + +#DISK=${DISK:-"1"} +#echo $OSSEARCH +#echo "$OSPROBED" + + +if [ -z "${OSPROBED}" ] ; then + # empty os-prober output, nothing doing + adjust_timeout + exit 0 +fi + +osx_entry() { + found_other_os=1 + cat << EOF +menuentry "${LONGNAME} (${2}-bit) (on ${DEVICE})" --class osx --class darwin --class os { +EOF +save_default_entry | sed -e "s/^/\t/" +prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" +cat << EOF + load_video + set do_resume=0 + if [ /var/vm/sleepimage -nt10 / ]; then + if xnu_resume /var/vm/sleepimage; then + set do_resume=1 + fi + fi + if [ \$do_resume = 0 ]; then + xnu_uuid ${OSXUUID} uuid + if [ -f /Extra/DSDT.aml ]; then + acpi -e /Extra/DSDT.aml + fi + $1 /mach_kernel boot-uuid=\${uuid} rd=*uuid + if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then + xnu_mkext /System/Library/Extensions.mkext + else + xnu_kextdir /System/Library/Extensions + fi + if [ -f /Extra/Extensions.mkext ]; then + xnu_mkext /Extra/Extensions.mkext + fi + if [ -d /Extra/Extensions ]; then + xnu_kextdir /Extra/Extensions + fi + if [ -f /Extra/devprop.bin ]; then + xnu_devprop_load /Extra/devprop.bin + fi + if [ -f /Extra/splash.jpg ]; then + insmod jpeg + xnu_splash /Extra/splash.jpg + fi + if [ -f /Extra/splash.png ]; then + insmod png + xnu_splash /Extra/splash.png + fi + if [ -f /Extra/splash.tga ]; then + insmod tga + xnu_splash /Extra/splash.tga + fi + fi +} +EOF +} + +wubi= + +for OS in ${OSPROBED} ; do + DEVICE="`echo ${OS} | cut -d ':' -f 1`" + LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`" + LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`" + BOOT="`echo ${OS} | cut -d ':' -f 4`" + + if [ -z "${LONGNAME}" ] ; then + LONGNAME="${LABEL}" + fi + + echo "Found ${LONGNAME} on ${DEVICE}" >&2 + + case ${BOOT} in + chain) + + case ${LONGNAME} in + Windows*) + if [ -z "$wubi" ]; then + if [ -x /usr/share/lupin-support/grub-mkimage ] && \ + /usr/share/lupin-support/grub-mkimage --test; then + wubi=yes + else + wubi=no + fi + fi + if [ "$wubi" = yes ]; then + echo "Skipping ${LONGNAME} on Wubi system" >&2 + continue + fi + ;; + esac + #adv + LABELCLASS=$(echo "${LONGNAME}" | awk '{print tolower($1$2);}') + + found_other_os=1 + cat << EOF +menuentry "${LONGNAME} (on ${DEVICE})" --class $LABELCLASS --class windows { +EOF +save_default_entry | sed -e "s/^/\t/" +#ADV prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" +OG_prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" + +case ${LONGNAME} in + Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*) + ;; + *) + #ADV cat << EOF + #ADV drivemap -s (hd0) \${root} + #ADV EOF + ;; +esac + +cat <&2 + ;; + esac +done + +adjust_timeout + +rm /opt/opengnsys/cache/etc/lsb-release &>/dev/null diff --git a/client/shared/scripts/grubSyntax.py b/client/shared/scripts/grubSyntax.py deleted file mode 100755 index f2c9394..0000000 --- a/client/shared/scripts/grubSyntax.py +++ /dev/null @@ -1,197 +0,0 @@ -import os -import subprocess -import sys -import DiskLib - -#!/usr/bin/env python3 - -def run_command(command): - result = subprocess.run(command, shell=True, capture_output=True, text=True) - return result.stdout.strip() - -def copy_files(src, dest): - if os.path.exists(src): - subprocess.run(f"cp -r {src} {dest}", shell=True) - -def prepare_grub_to_access_device(device): - loop_file = None - if device.startswith("/dev/loop"): - grub_loop_device = device.split('/')[-1] - loop_file = run_command(f"losetup {device} | sed -e 's/^[^(]*(\\([^)]\\+\\)).*/\\1/'") - if not loop_file.startswith("/dev"): - loop_device = device - device = run_command(f"{grub_probe} --target=device {loop_file}") - - if "crypt" in run_command(f"dmsetup status {device}"): - print(f"{device} is a crypto device, which GRUB cannot read directly.") - return - - abstraction = run_command(f"{grub_probe} --device {device} --target=abstraction") - for module in abstraction.split(): - print(f"insmod {module}") - - partmap = run_command(f"{grub_probe} --device {device} --target=partmap") - for module in partmap.split(): - if module in ["netbsd", "openbsd"]: - print("insmod part_bsd") - else: - print(f"insmod part_{module}") - - fs = run_command(f"{grub_probe} --device {device} --target=fs") - for module in fs.split(): - print(f"insmod {module}") - - if "nvme" in device: - d, p = DiskLib.ogDevToDisk(device) - if DiskLib.ogGetPartitionTableType(d) == "GPT": - nvme_device = f"hd{d-1},gpt{p}" - else: - nvme_device = f"hd{d-1},{p-1}" - print(f"set root='{nvme_device}'") - else: - print(f"set root='{run_command(f'{grub_probe} --device {device} --target=drive')}'") - - if loop_file: - loop_mountpoint = run_command(f"awk '{loop_file} ~ \"^\"$2 && $2 != \"/\" {{ print $2 }}' /proc/mounts | tail -n1") - if loop_mountpoint: - print(f"loopback {grub_loop_device} {loop_file[len(loop_mountpoint):]}") - print(f"set root=({grub_loop_device})") - -def main(): - disk = part = kernel_param = None - if len(sys.argv) == 4: - disk, part, kernel_param = sys.argv[1:4] - elif len(sys.argv) == 3: - disk, part = sys.argv[1:3] - elif len(sys.argv) == 2: - kernel_param = sys.argv[1] - - grub_probe = os.getenv("grub_probe", f"{os.getenv('OGBIN')}/grub-probe1.99_{os.uname().machine}") - - if "1.99" in run_command("grub-install --version"): - copy_files("/opt/opengnsys/lib/os-probes/*", "/usr/lib/os-probes/") - else: - osprobe_ms_part = "/opt/opengnsys/lib/os-probes/mounted/efi/31part-x-y" - if os.path.isfile(osprobe_ms_part): - copy_files(osprobe_ms_part, "/usr/lib/os-probes/mounted/efi") - - if os.path.exists(f"/opt/opengnsys/cache/boot/{oglivedir}/ogvmlinuz"): - subprocess.run(f"sed -i 's|/boot/{{oglivedir}}/ogvmlinuz |/vmlinuz |i' /usr/lib/linux-boot-probes/mounted/90fallback", shell=True) - subprocess.run(f"sed -i 's|/vmlinuz |/vmlinuz /boot/{{oglivedir}}/ogvmlinuz |1' /usr/lib/linux-boot-probes/mounted/90fallback", shell=True) - os.makedirs("/opt/opengnsys/cache/etc/", exist_ok=True) - with open("/opt/opengnsys/cache/etc/lsb-release", "w") as f: - f.write("DISTRIB_ID=Ubuntu\n") - f.write("DISTRIB_RELEASE= \n") - f.write(f"DISTRIB_CODENAME={oglivedir.split('-')[1]}\n") - f.write("DISTRIB_DESCRIPTION=OpenGnsys Live\n") - - if disk: - os_search = DiskLib.ogDiskToDev(disk, part) - os_probed = run_command(f"os-prober | grep {os_search} | tr ' ' '^' | paste -s -d ' '") - else: - os_probed = run_command("os-prober | tr ' ' '^' | paste -s -d ' '") - - if not os_probed: - adjust_timeout() - sys.exit(0) - - for os_entry in os_probed.split(): - device, longname, label, boot = os_entry.split(':') - longname = longname.replace('^', ' ') - label = label.replace('^', ' ') - if not longname: - longname = label - - print(f"Found {longname} on {device}", file=sys.stderr) - - if boot == "chain": - if "Windows" in longname: - if not wubi: - if os.path.exists("/usr/share/lupin-support/grub-mkimage") and run_command("/usr/share/lupin-support/grub-mkimage --test"): - wubi = "yes" - else: - wubi = "no" - if wubi == "yes": - print(f"Skipping {longname} on Wubi system", file=sys.stderr) - continue - - label_class = ''.join(longname.lower().split()[:2]) - print(f"menuentry \"{longname} (on {device})\" --class {label_class} --class windows {{") - save_default_entry() - prepare_grub_to_access_device(device) - if "Windows Vista" in longname or "Windows 7" in longname or "Windows Server 2008" in longname: - pass - else: - pass - print("chainloader +1") - print("}") - - elif boot == "efi": - efipath = device.split('@')[1] - device = device.split('@')[0] - onstr = f"(on {device})" - print(f"menuentry '{longname} {onstr}' --class windows --class os {{") - save_default_entry() - prepare_grub_to_access_device(device) - print(f"chainloader {efipath}") - print("}") - - elif boot == "linux": - linux_probed = run_command(f"linux-boot-prober {device} 2> /dev/null | tr ' ' '^' | paste -s -d ' '") - linux_probed = linux_probed.split()[0] - prepare_boot_cache = None - for linux_entry in linux_probed.split(): - lroot, lboot, llabel, lkernel, linitrd, lparams = linux_entry.split(':') - llabel = llabel.replace('^', ' ') - lparams = lparams.replace('^', ' ') - uuid = run_command(f"blkid -s UUID -o value {lroot}") - lparams = lparams.replace(f"UUID={uuid}", lroot) - if not llabel: - llabel = longname - if lroot != lboot: - lkernel = lkernel.replace('/boot', '') - linitrd = linitrd.replace('/boot', '') - label_class = llabel.split()[0].lower() - print(f"menuentry \"{llabel} (on {device})\" --class {label_class} --class linux --class os {{") - save_default_entry() - if not prepare_boot_cache: - prepare_boot_cache = prepare_grub_to_access_device(lboot) - print(prepare_boot_cache) - if label_class == "opengnsys": - kernel_param = run_command("cat /proc/cmdline") - print(f"linux {lkernel} {lparams} {kernel_param}") - if linitrd: - print(f"initrd {linitrd}") - print("}") - - elif boot == "macosx": - osx_uuid = run_command(f"grub-probe --target=fs_uuid --device {device} 2> /dev/null") - osx_entry("xnu_kernel", 32, device, longname, osx_uuid) - osx_entry("xnu_kernel64", 64, device, longname, osx_uuid) - - elif boot == "hurd": - print(f"menuentry \"{longname} (on {device})\" --class hurd --class gnu --class os {{") - save_default_entry() - prepare_grub_to_access_device(device) - grub_device = run_command(f"{grub_probe} --device {device} --target=drive") - mach_device = grub_device.replace("(hd", "").replace(",msdos", "s") - grub_fs = run_command(f"{grub_probe} --device {device} --target=fs") - hurd_fs = grub_fs if grub_fs.endswith("fs") else f"{grub_fs}fs" - print(f"multiboot /boot/gnumach.gz root=device:{mach_device}") - print(f"module /hurd/{hurd_fs}.static {hurd_fs} --readonly \\") - print(f" --multiboot-command-line='{{kernel-command-line}}' \\") - print(f" --host-priv-port='{{host-port}}' \\") - print(f" --device-master-port='{{device-port}}' \\") - print(f" --exec-server-task='{{exec-task}}' -T typed '{{root}}' \\") - print(f" '{{task-create}}' '{{task-resume}}'") - print(f"module /lib/ld.so.1 exec /hurd/exec '{{exec-task=task-create}}'") - print("}") - - else: - print(f" {longname} is not yet supported by grub-mkconfig.", file=sys.stderr) - - adjust_timeout() - os.remove("/opt/opengnsys/cache/etc/lsb-release") - -if __name__ == "__main__": - main()