136 lines
5.5 KiB
Python
136 lines
5.5 KiB
Python
#!/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)
|
|
|