#!/usr/bin/python3 import argparse import os import re import subprocess from boottoolsfunctions import _run debconf_settings = """ kexec-tools kexec-tools/load_kexec boolean true openssh-server openssh-server/permit-root-login boolean true refind refind/install_to_esp boolean false """.strip() def _aptget_clean(): subprocess.run (['apt-get', 'clean']) def _aptget_autoclean(): subprocess.run (['apt-get', 'autoclean']) def _aptget_autoremove(): subprocess.run (['apt-get', 'autoremove']) def _aptget_update(): subprocess.run (['apt-get', 'update']) def _aptget_upgrade(): subprocess.run (['apt-get', 'upgrade', '--yes']) def _aptget_install (pkgs, opts=[]): subprocess.run (['apt-get', '--yes'] + opts + ['install'] + pkgs) def _oghook_deactivate(): #Desactivamos el hook del oginitrd.img para evitar problemas, al final de este escripts se activará os.rename ('/etc/initramfs-tools/hooks/oghooks', '/etc/initramfs-tools/oghooks') def _oghook_activate(): #Activamos el hook del oginitrd.img os.rename ('/etc/initramfs-tools/oghooks', '/etc/initramfs-tools/hooks/oghooks') def _mock_mtab(): # Preparamos el mtab necesario para la instalacion correcta de paquetes. #echo "/dev/sda1 / ext4 rw,errors=remount-ro 0 0" > /etc/mtab ## nati: falla porque es un symlink a ../proc/self/mounts pass def _restore_mtab(): # Dejamos el mtab como al principio #echo " " > /etc/mtab pass def boottoolsSoftwareInstall (osarch, osrelease): os.environ['LANGUAGE'] = 'C' os.environ['LC_ALL'] = 'C' os.environ['LANG'] = 'C' os.environ['DEBIAN_FRONTEND'] = 'noninteractive' stdout, _ = _run (['dpkg-divert', '--list']) if not re.findall (r'local diversion of /sbin/initctl to /sbin/initctl.distrib', stdout): subprocess.run (['dpkg-divert', '--local', '--rename', '--add', '/sbin/initctl']) os.symlink ('/bin/true', '/sbin/initctl') #TEST desactivamos upstart #apt-get update; apt-get install --no-install-recommends dbus; dbus-uuidgen > /var/lib/dbus/machine-id; dpkg-divert --local --rename --add /sbin/initctl; ln -s /bin/true /sbin/initctl _aptget_clean() pkgs32 = [] if 'i386' != osarch: subprocess.run (['dpkg', '--add-architecture', 'i386']) pkgs32 = 'lib32gcc-s1 lib32stdc++6 lib32z1 libc6-i386'.split (' ') ## he cambiado lib32gcc1 por lib32gcc-s1 pero como queramos crear un oglive viejo, esto va a petar _aptget_update() ## esto ya esta hecho... #Ign:13 http://ppa.launchpad.net/zfs-native/stable/ubuntu noble InRelease #Err:15 http://ppa.launchpad.net/zfs-native/stable/ubuntu noble Release # 404 Not Found [IP: 185.125.190.80 80] # #E: The repository 'http://ppa.launchpad.net/zfs-native/stable/ubuntu noble Release' does not have a Release file. #N: Updating from such a repository can't be done securely, and is therefore disabled by default. #N: See apt-secure(8) manpage for repository creation and user configuration details. _oghook_deactivate() _aptget_upgrade() _mock_mtab() # Instalamos el kernel. _aptget_install (['linux-image-{}'.format (osrelease), 'linux-headers-{}'.format (osrelease), 'linux-modules-{}'.format (osrelease), 'linux-modules-extra-{}'.format (osrelease), 'dkms', 'shim-signed', 'openssl']) subprocess.run (['debconf-set-selections'], input=debconf_settings, text=True) ## nati: hace falta --force-confdef para evitar un tema interactivo del /etc/ssh/ssh_config _aptget_install (['sshfs', 'kexec-tools'] + pkgs32, opts=['-o', 'DPkg::Options::=--force-confdef']) """ #comenzamos con la instalación de los paquetes a instalar. to_install = {} for group in `find /usr/bin/boot-tools/listpackages/ -name sw.*`; do echo "Instalando el grupo de paquetes almacenados en $group" for package in ` awk /^install/'{print $2}' $group `; do echo -n $package' ' >&2 to_install[package] = 1 done echo >&2 done del to_install['refind'] ## nati: este paquete no existe y toda la invocación de apt se muere (no sé cómo hacer que apt ignore los paquetes que no existen) echo =========================================== nati pkgs to install ${!TO_INSTALL[*]} _aptget_install (list (to_install.keys())) # Instalar módulos que algunos paquetes puedan tener pendientes de compilar. echo "Instalando módulos adicionales con DKMS" while read -e mod vers; do echo -n "Intalando módulo $mod v$vers" dkms install -m $mod -v $vers &>/dev/null RETVAL=$? if [ $RETVAL == 0 ]; then echo " : OK - Módulo instalado correctamente (codigo interno de dkms $RETVAL)" else echo " : Error módulo $mod (codigo interno de dkms $RETVAL) " echo "Pulse [Intro] para continuar" read fi done < <(dkms status 2>/dev/null | awk -F, '$3~/added/ {print $1,$2}') """ _oghook_activate() _restore_mtab() _aptget_clean() _aptget_autoclean() _aptget_autoremove() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument ('--osarch', help='OS architecture', action='store', required=True) parser.add_argument ('--osrelease', help='OS release', action='store', required=True) args = parser.parse_args() boottoolsSoftwareInstall (args.osarch, args.osrelease)