#!/usr/bin/python3 import argparse import os import sys import re import subprocess import configparser from boottoolsfunctions import _run, _read_config config = _read_config ('boottoolsgenerator.cfg') debconf_settings = config['debconf'].get ('settings') def _aptget_clean(): _run (['apt-get', '--yes', 'clean']) def _aptget_autoclean(): _run (['apt-get', '--yes', 'autoclean']) def _aptget_autoremove(): _run (['apt-get', '--yes', 'autoremove']) def _aptget_update(): _run (['apt-get', '--yes', 'update']) def _aptget_upgrade(): _run (['apt-get', '--yes', 'upgrade']) def _aptget_install (pkgs, opts=[]): _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): _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: _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... _oghook_deactivate() _aptget_upgrade() _mock_mtab() # Instalamos el kernel. _aptget_install ([f'linux-image-{osrelease}', f'linux-headers-{osrelease}', f'linux-modules-{osrelease}', f'linux-modules-extra-{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']) pkgs = [] for section in config.options('Packages'): pkgs += re.split (r'[ \n]', config['Packages'].get(section).strip()) print ('about to install these packages: "{}"'.format (' '.join (pkgs))) _aptget_install (pkgs) # Instalar módulos que algunos paquetes puedan tener pendientes de compilar. stdout, _ = _run (['dkms', 'status']) for l in stdout.strip().split ('\n'): if not l: continue print (f'l "{l}"') mod, vers, status = l.split (',') if 'added' in status: print (f'dkms installing {mod} {vers}') _run (['dkms', 'install', '-m', mod.strip(), '-v', vers.strip()]) _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)