diff --git a/CHANGES b/CHANGES index dcc32eea0..ea4019376 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,11 @@ require changes in the slideshow. ## Modules ## + - *initramfs* has been changed from a Python module to a C++ module. + Packaging will need to adjust now it installs a .so instead of a .py. + The module itself functions as before. It does have a new configuration + option, to change the version passed as to the `-k` option of + update-initramfs. #1180 - *partition* Now has its own setting for *requiredStorage*, duplicating the same setting in the *welcome* module. This is useful for configurations where no *welcome* module is used, but a minimum diff --git a/src/modules/initramfs/CMakeLists.txt b/src/modules/initramfs/CMakeLists.txt new file mode 100644 index 000000000..79bb650c5 --- /dev/null +++ b/src/modules/initramfs/CMakeLists.txt @@ -0,0 +1,9 @@ +calamares_add_plugin( initramfs + TYPE job + EXPORT_MACRO PLUGINDLLEXPORT_PRO + SOURCES + InitramfsJob.cpp + LINK_PRIVATE_LIBRARIES + calamares + SHARED_LIB +) diff --git a/src/modules/initramfs/InitramfsJob.cpp b/src/modules/initramfs/InitramfsJob.cpp new file mode 100644 index 000000000..db9f8038a --- /dev/null +++ b/src/modules/initramfs/InitramfsJob.cpp @@ -0,0 +1,75 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares 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. + * + * Calamares 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 Calamares. If not, see . + */ + +#include "InitramfsJob.h" + +#include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" +#include "utils/Variant.h" + +InitramfsJob::InitramfsJob( QObject* parent ) + : Calamares::CppJob( parent ) +{ +} + +InitramfsJob::~InitramfsJob() {} + + +QString +InitramfsJob::prettyName() const +{ + return tr( "Creating initramfs." ); +} + + +Calamares::JobResult +InitramfsJob::exec() +{ + cDebug() << "Updating initramfs with kernel" << m_kernel; + auto r = CalamaresUtils::System::instance()->targetEnvCommand( + { "update-initramfs", "-k", m_kernel, "-c", "-t" }, QString(), QString(), 10 ); + return r.explainProcess( "update-initramfs", 10 ); +} + + +void +InitramfsJob::setConfigurationMap( const QVariantMap& configurationMap ) +{ + m_kernel = CalamaresUtils::getString( configurationMap, "kernel" ); + if ( m_kernel.isEmpty() ) + { + m_kernel = QStringLiteral( "all" ); + } + else if ( m_kernel == "$uname" ) + { + auto r = CalamaresUtils::System::runCommand( + CalamaresUtils::System::RunLocation::RunInHost, { "/bin/uname", "-r" }, QString(), QString(), 3 ); + if ( r.getExitCode() == 0 ) + { + m_kernel = r.getOutput(); + cDebug() << "*initramfs* using running kernel" << m_kernel; + } + else + { + cWarning() << "*initramfs* could not determine running kernel, using 'all'." << Logger::Continuation + << r.getExitCode() << r.getOutput(); + } + } +} + +CALAMARES_PLUGIN_FACTORY_DEFINITION( InitramfsJobFactory, registerPlugin< InitramfsJob >(); ) diff --git a/src/modules/initramfs/InitramfsJob.h b/src/modules/initramfs/InitramfsJob.h new file mode 100644 index 000000000..63aed4136 --- /dev/null +++ b/src/modules/initramfs/InitramfsJob.h @@ -0,0 +1,49 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares 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. + * + * Calamares 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 Calamares. If not, see . + */ + +#ifndef INITRAMFSJOB_H +#define INITRAMFSJOB_H + +#include "CppJob.h" +#include "PluginDllMacro.h" +#include "utils/PluginFactory.h" + +#include +#include + +class PLUGINDLLEXPORT InitramfsJob : public Calamares::CppJob +{ + Q_OBJECT + +public: + explicit InitramfsJob( QObject* parent = nullptr ); + virtual ~InitramfsJob() override; + + QString prettyName() const override; + + Calamares::JobResult exec() override; + + void setConfigurationMap( const QVariantMap& configurationMap ) override; + +private: + QString m_kernel; +}; + +CALAMARES_PLUGIN_FACTORY_DECLARATION( InitramfsJobFactory ) + +#endif // INITRAMFSJOB_H diff --git a/src/modules/initramfs/README.md b/src/modules/initramfs/README.md deleted file mode 100644 index f7de44f2f..000000000 --- a/src/modules/initramfs/README.md +++ /dev/null @@ -1,12 +0,0 @@ -## initramfs module - -This module is specific to Debian based distros. Post installation on Debian -the initramfs needs to be updated so as to not interrupt the boot process -with a error about fsck.ext4 not being found. - -## Debian specific notes - -If you're using live-build to build your ISO and setup the runtime env -make sure that you purge the live-\* packages on the target system -before running this module, since live-config dpkg-diverts update-initramfs -and can cause all sorts of fun issues. diff --git a/src/modules/initramfs/initramfs.conf b/src/modules/initramfs/initramfs.conf new file mode 100644 index 000000000..c9803a3b1 --- /dev/null +++ b/src/modules/initramfs/initramfs.conf @@ -0,0 +1,31 @@ +## initramfs module +# +# This module is specific to Debian based distros. Post installation on Debian +# the initramfs needs to be updated so as to not interrupt the boot process +# with a error about fsck.ext4 not being found. +# +## Debian specific notes +# +# If you're using live-build to build your ISO and setup the runtime env +# make sure that you purge the live-\* packages on the target system +# before running this module, since live-config dpkg-diverts update-initramfs +# and can cause all sorts of fun issues. +--- +# There is only one configuration item for this module, +# the kernel to be loaded. This can have the following +# values: +# - empty or unset, interpreted as "all" +# - the literal string "$uname" (without quotes, with dollar), +# which will use the output of `uname -r` to determine the +# running kernel, and use that. +# - any other string. +# +# Whatever is set, that string is passed as *version* argument to the +# `-k` option of *update-initramfs*. Take care that both "$uname" operates +# in the host system, and might not be correct if the target system is +# updated (to a newer kernel) as part of the installation. +# +# The default is empty/unset, leading to the behavior from Calamares +# 3.2.9 and earlier which passed "all" as version. + +# kernel: all diff --git a/src/modules/initramfs/main.py b/src/modules/initramfs/main.py deleted file mode 100644 index 7ff32bafb..000000000 --- a/src/modules/initramfs/main.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# === This file is part of Calamares - === -# -# Copyright 2014, Philip Müller -# Copyright 2017, Alf Gaida -# Copyright 2019, Adriaan de Groot -# -# Calamares 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. -# -# Calamares 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 Calamares. If not, see . - -import libcalamares -from libcalamares.utils import target_env_call - - -import gettext -_ = gettext.translation("calamares-python", - localedir=libcalamares.utils.gettext_path(), - languages=libcalamares.utils.gettext_languages(), - fallback=True).gettext - - -def pretty_name(): - return _("Creating initramfs.") - - -def run(): - """ Generate an initramfs image. - - :return: - """ - return_code = target_env_call(["update-initramfs", "-k", "all", "-c", - "-t"]) - - if return_code != 0: - libcalamares.utils.debug("update-initramfs returned {}".format(return_code)) - return ( - _("Failed to run update-initramfs on the target"), - _("The exit code was {}").format(return_code) - ) diff --git a/src/modules/initramfs/module.desc b/src/modules/initramfs/module.desc deleted file mode 100644 index 321a03782..000000000 --- a/src/modules/initramfs/module.desc +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: "job" -name: "initramfs" -interface: "python" -script: "main.py"