oglive-builder/03-boottoolsSoftwareInstall.py

118 lines
4.2 KiB
Python

#!/usr/bin/python3
import argparse
import os
import re
import subprocess
import configparser
from boottoolsfunctions import _run
config = configparser.ConfigParser (inline_comment_prefixes='#')
config.read ('boottoolsgenerator.cfg')
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():
_run (['apt-get', 'clean'])
def _aptget_autoclean():
_run (['apt-get', 'autoclean'])
def _aptget_autoremove():
_run (['apt-get', 'autoremove'])
def _aptget_update():
_run (['apt-get', 'update'])
def _aptget_upgrade():
_run (['apt-get', 'upgrade', '--yes'])
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 (['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'])
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 ('l "{}"'.format (l))
mod, vers, status = l.split (',')
if 'added' in status:
print ('dkms installing {} {}'.format (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)