Compare commits
	
		
			69 Commits
		
	
	
		
			services-s
			...
			2.4.x-stab
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					755a56914d | ||
| 
						 | 
					ef04515011 | ||
| 
						 | 
					8e842efd66 | ||
| 
						 | 
					21a6459611 | ||
| 
						 | 
					a81c8137b2 | ||
| 
						 | 
					1c946bf365 | ||
| 
						 | 
					67bd3306f8 | ||
| 
						 | 
					89f078f8c5 | ||
| 
						 | 
					6e2d445888 | ||
| 
						 | 
					bdda452f66 | ||
| 
						 | 
					50187261c3 | ||
| 
						 | 
					1f37f3dda0 | ||
| 
						 | 
					d7302ca024 | ||
| 
						 | 
					92e1233279 | ||
| 
						 | 
					4a50f5ae54 | ||
| 
						 | 
					fe75e980f5 | ||
| 
						 | 
					7a67eed918 | ||
| 
						 | 
					b4fb2115dc | ||
| 
						 | 
					61703ad070 | ||
| 
						 | 
					e95b555289 | ||
| 
						 | 
					e5274df598 | ||
| 
						 | 
					b3ecb8a981 | ||
| 
						 | 
					d18eda219c | ||
| 
						 | 
					b0a690256a | ||
| 
						 | 
					1c0fb2e4be | ||
| 
						 | 
					efd93a0f82 | ||
| 
						 | 
					08699206da | ||
| 
						 | 
					6376c39fe6 | ||
| 
						 | 
					c7dd77c0f9 | ||
| 
						 | 
					3028855a6c | ||
| 
						 | 
					c0ebc91b15 | ||
| 
						 | 
					5f5b38d148 | ||
| 
						 | 
					9581b803cc | ||
| 
						 | 
					2f6274fa28 | ||
| 
						 | 
					969ec3cd10 | ||
| 
						 | 
					7295085596 | ||
| 
						 | 
					9171fb7a77 | ||
| 
						 | 
					9867d85924 | ||
| 
						 | 
					821730c1d4 | ||
| 
						 | 
					9f8b6936e6 | ||
| 
						 | 
					06c353f170 | ||
| 
						 | 
					636d59ebf9 | ||
| 
						 | 
					d8b6f94720 | ||
| 
						 | 
					571724db83 | ||
| 
						 | 
					f9e036b0ae | ||
| 
						 | 
					a1be43c959 | ||
| 
						 | 
					7e67a2fc46 | ||
| 
						 | 
					53c1371895 | ||
| 
						 | 
					699b57016d | ||
| 
						 | 
					8d2d8d04fc | ||
| 
						 | 
					eca367b9c0 | ||
| 
						 | 
					57479d79a3 | ||
| 
						 | 
					f1ab1ca3dd | ||
| 
						 | 
					be8f310672 | ||
| 
						 | 
					c6e591c9c7 | ||
| 
						 | 
					62f94e5ce9 | ||
| 
						 | 
					9d15b61331 | ||
| 
						 | 
					32e05000f6 | ||
| 
						 | 
					165fe26996 | ||
| 
						 | 
					68dcbf95f3 | ||
| 
						 | 
					a672a4fdb9 | ||
| 
						 | 
					13507e81ad | ||
| 
						 | 
					f2fe7a83c6 | ||
| 
						 | 
					effc8b4496 | ||
| 
						 | 
					c0c51ad51d | ||
| 
						 | 
					9460e53233 | ||
| 
						 | 
					114bd6ae63 | ||
| 
						 | 
					77fb264129 | ||
| 
						 | 
					0c29233062 | 
@@ -102,7 +102,7 @@ set( CALAMARES_TRANSLATION_LANGUAGES ar ast bg ca cs_CZ da de el en en_GB es_MX
 | 
			
		||||
### Bump version here
 | 
			
		||||
set( CALAMARES_VERSION_MAJOR 2 )
 | 
			
		||||
set( CALAMARES_VERSION_MINOR 4 )
 | 
			
		||||
set( CALAMARES_VERSION_PATCH 1 )
 | 
			
		||||
set( CALAMARES_VERSION_PATCH 6 )
 | 
			
		||||
set( CALAMARES_VERSION_RC 0 )
 | 
			
		||||
 | 
			
		||||
set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} )
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ function( calamares_add_plugin )
 | 
			
		||||
    set( NAME ${ARGV0} )
 | 
			
		||||
    set( options NO_INSTALL SHARED_LIB )
 | 
			
		||||
    set( oneValueArgs NAME TYPE EXPORT_MACRO RESOURCES )
 | 
			
		||||
    set( multiValueArgs SOURCES UI LINK_LIBRARIES COMPILE_DEFINITIONS )
 | 
			
		||||
    set( multiValueArgs SOURCES UI LINK_LIBRARIES LINK_PRIVATE_LIBRARIES COMPILE_DEFINITIONS )
 | 
			
		||||
    cmake_parse_arguments( PLUGIN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
 | 
			
		||||
    set( PLUGIN_NAME ${NAME} )
 | 
			
		||||
    set( PLUGIN_DESTINATION ${CMAKE_INSTALL_LIBDIR}/calamares/modules/${PLUGIN_NAME} )
 | 
			
		||||
@@ -22,6 +22,7 @@ function( calamares_add_plugin )
 | 
			
		||||
    if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" )
 | 
			
		||||
        message( "   ${Green}TYPE:${ColorReset} ${PLUGIN_TYPE}" )
 | 
			
		||||
        message( "   ${Green}LINK_LIBRARIES:${ColorReset} ${PLUGIN_LINK_LIBRARIES}" )
 | 
			
		||||
        message( "   ${Green}LINK_PRIVATE_LIBRARIES:${ColorReset} ${PLUGIN_LINK_PRIVATE_LIBRARIES}" )
 | 
			
		||||
#        message( "   ${Green}SOURCES:${ColorReset} ${PLUGIN_SOURCES}" )
 | 
			
		||||
#        message( "   ${Green}UI:${ColorReset} ${PLUGIN_UI}" )
 | 
			
		||||
#        message( "   ${Green}EXPORT_MACRO:${ColorReset} ${PLUGIN_EXPORT_MACRO}" )
 | 
			
		||||
@@ -60,6 +61,10 @@ function( calamares_add_plugin )
 | 
			
		||||
        list( APPEND calamares_add_library_args "LINK_LIBRARIES" "${PLUGIN_LINK_LIBRARIES}" )
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    if( PLUGIN_LINK_PRIVATE_LIBRARIES )
 | 
			
		||||
        list( APPEND calamares_add_library_args "LINK_PRIVATE_LIBRARIES" "${PLUGIN_LINK_PRIVATE_LIBRARIES}" )
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    if( PLUGIN_COMPILE_DEFINITIONS )
 | 
			
		||||
        list( APPEND calamares_add_library_args "COMPILE_DEFINITIONS" ${PLUGIN_COMPILE_DEFINITIONS} )
 | 
			
		||||
    endif()
 | 
			
		||||
 
 | 
			
		||||
@@ -28,10 +28,8 @@ Modules:
 | 
			
		||||
 * extra-cmake-modules
 | 
			
		||||
 * KF5: KCoreAddons, KConfig, KI18n, KIconThemes, KIO, KService
 | 
			
		||||
 * KPMcore >= 2.2
 | 
			
		||||
 * sgdisk
 | 
			
		||||
* bootloader:
 | 
			
		||||
 * systemd-boot or GRUB
 | 
			
		||||
 * sgdisk
 | 
			
		||||
* unpackfs:
 | 
			
		||||
 * squashfs-tools
 | 
			
		||||
 * rsync
 | 
			
		||||
 
 | 
			
		||||
@@ -67,6 +67,7 @@ sequence:
 | 
			
		||||
  - users
 | 
			
		||||
  - summary
 | 
			
		||||
- exec:
 | 
			
		||||
#  - dummycpp
 | 
			
		||||
#  - dummyprocess
 | 
			
		||||
#  - dummypython
 | 
			
		||||
  - partition
 | 
			
		||||
@@ -79,6 +80,7 @@ sequence:
 | 
			
		||||
  - localecfg
 | 
			
		||||
#  - luksbootkeyfile
 | 
			
		||||
#  - luksopenswaphookcfg
 | 
			
		||||
#  - dracutlukscfg
 | 
			
		||||
  - initcpiocfg
 | 
			
		||||
  - initcpio
 | 
			
		||||
  - users
 | 
			
		||||
 
 | 
			
		||||
@@ -59,12 +59,12 @@ endif()
 | 
			
		||||
 | 
			
		||||
qt5_use_modules( calamares_bin Core Widgets )
 | 
			
		||||
target_link_libraries( calamares_bin
 | 
			
		||||
    ${CALAMARES_LIBRARIES}
 | 
			
		||||
    calamaresui
 | 
			
		||||
    Qt5::Core
 | 
			
		||||
    Qt5::Widgets
 | 
			
		||||
    yaml-cpp
 | 
			
		||||
    ${LINK_LIBRARIES}
 | 
			
		||||
    PRIVATE
 | 
			
		||||
        ${CALAMARES_LIBRARIES}
 | 
			
		||||
        calamaresui
 | 
			
		||||
        Qt5::Core
 | 
			
		||||
        Qt5::Widgets
 | 
			
		||||
        ${LINK_LIBRARIES}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
install( TARGETS calamares_bin
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/../calamares/CalamaresVersion.h.in
 | 
			
		||||
                ${CMAKE_CURRENT_BINARY_DIR}/CalamaresVersion.h )
 | 
			
		||||
 | 
			
		||||
set( libSources
 | 
			
		||||
    CppJob.cpp
 | 
			
		||||
    GlobalStorage.cpp
 | 
			
		||||
    Job.cpp
 | 
			
		||||
    JobQueue.cpp
 | 
			
		||||
@@ -24,6 +25,7 @@ set( libSources
 | 
			
		||||
    utils/CalamaresUtils.cpp
 | 
			
		||||
    utils/CalamaresUtilsSystem.cpp
 | 
			
		||||
    utils/Logger.cpp
 | 
			
		||||
    utils/PluginFactory.cpp
 | 
			
		||||
    utils/Retranslator.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								src/libcalamares/CppJob.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/libcalamares/CppJob.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "CppJob.h"
 | 
			
		||||
 | 
			
		||||
namespace Calamares
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
CppJob::CppJob( QObject* parent )
 | 
			
		||||
    : Job( parent )
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CppJob::~CppJob()
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
CppJob::setModuleInstanceKey( const QString& instanceKey )
 | 
			
		||||
{
 | 
			
		||||
    m_instanceKey = instanceKey;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
CppJob::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								src/libcalamares/CppJob.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/libcalamares/CppJob.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014-2015, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef CALAMARES_CPPJOB_H
 | 
			
		||||
#define CALAMARES_CPPJOB_H
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QVariant>
 | 
			
		||||
 | 
			
		||||
#include "DllMacro.h"
 | 
			
		||||
#include "Typedefs.h"
 | 
			
		||||
#include "Job.h"
 | 
			
		||||
 | 
			
		||||
namespace Calamares
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class DLLEXPORT CppJob : public Job
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
    explicit CppJob( QObject* parent = nullptr );
 | 
			
		||||
    virtual ~CppJob();
 | 
			
		||||
 | 
			
		||||
    void setModuleInstanceKey( const QString& instanceKey );
 | 
			
		||||
    QString moduleInstanceKey() const { return m_instanceKey; }
 | 
			
		||||
 | 
			
		||||
    virtual void setConfigurationMap( const QVariantMap& configurationMap );
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    QString m_instanceKey;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // CALAMARES_CPPJOB_H
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
#ifndef CALAMARESPLUGINFACTORY_H
 | 
			
		||||
#define CALAMARESPLUGINFACTORY_H
 | 
			
		||||
 | 
			
		||||
#include "UiDllMacro.h"
 | 
			
		||||
#include "DllMacro.h"
 | 
			
		||||
 | 
			
		||||
#include <QtCore/QObject>
 | 
			
		||||
#include <QtCore/QVariant>
 | 
			
		||||
@@ -196,7 +196,7 @@ namespace Calamares
 | 
			
		||||
 * \author Matthias Kretz <kretz@kde.org>
 | 
			
		||||
 * \author Bernhard Loos <nhuh.put@web.de>
 | 
			
		||||
 */
 | 
			
		||||
class UIDLLEXPORT PluginFactory : public QObject
 | 
			
		||||
class DLLEXPORT PluginFactory : public QObject
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
    Q_DECLARE_PRIVATE(PluginFactory)
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
set( CALAMARESUI_LIBRARY_TARGET calamaresui )
 | 
			
		||||
 | 
			
		||||
list( APPEND ${CALAMARESUI_LIBRARY_TARGET}_SOURCES
 | 
			
		||||
    modulesystem/CppJobModule.cpp
 | 
			
		||||
    modulesystem/Module.cpp
 | 
			
		||||
    modulesystem/ModuleManager.cpp
 | 
			
		||||
    modulesystem/ProcessJobModule.cpp
 | 
			
		||||
@@ -14,8 +15,6 @@ list( APPEND ${CALAMARESUI_LIBRARY_TARGET}_SOURCES
 | 
			
		||||
    utils/qjsonmodel.cpp
 | 
			
		||||
    utils/qjsonitem.cpp
 | 
			
		||||
 | 
			
		||||
    utils/PluginFactory.cpp
 | 
			
		||||
 | 
			
		||||
    viewpages/AbstractPage.cpp
 | 
			
		||||
    viewpages/ViewStep.cpp
 | 
			
		||||
 | 
			
		||||
@@ -44,10 +43,11 @@ calamares_add_library( ${CALAMARESUI_LIBRARY_TARGET}
 | 
			
		||||
    SOURCES ${${CALAMARESUI_LIBRARY_TARGET}_SOURCES}
 | 
			
		||||
    UI ${${CALAMARESUI_LIBRARY_TARGET}_UI}
 | 
			
		||||
    EXPORT_MACRO UIDLLEXPORT_PRO
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        yaml-cpp
 | 
			
		||||
        Qt5::Svg
 | 
			
		||||
	Qt5::QuickWidgets
 | 
			
		||||
        Qt5::QuickWidgets
 | 
			
		||||
        ${OPTIONAL_PRIVATE_LIBRARIES}
 | 
			
		||||
    RESOURCES libcalamaresui.qrc
 | 
			
		||||
    EXPORT CalamaresLibraryDepends
 | 
			
		||||
    VERSION ${CALAMARES_VERSION_SHORT}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										128
									
								
								src/libcalamaresui/modulesystem/CppJobModule.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								src/libcalamaresui/modulesystem/CppJobModule.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "CppJobModule.h"
 | 
			
		||||
 | 
			
		||||
#include "utils/PluginFactory.h"
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
#include "CppJob.h"
 | 
			
		||||
 | 
			
		||||
#include <QDir>
 | 
			
		||||
#include <QPluginLoader>
 | 
			
		||||
 | 
			
		||||
namespace Calamares {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Module::Type
 | 
			
		||||
CppJobModule::type() const
 | 
			
		||||
{
 | 
			
		||||
    return Job;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Module::Interface
 | 
			
		||||
CppJobModule::interface() const
 | 
			
		||||
{
 | 
			
		||||
    return QtPlugin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
CppJobModule::loadSelf()
 | 
			
		||||
{
 | 
			
		||||
    if ( m_loader )
 | 
			
		||||
    {
 | 
			
		||||
        PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() );
 | 
			
		||||
        if ( !pf )
 | 
			
		||||
        {
 | 
			
		||||
            cDebug() << Q_FUNC_INFO << m_loader->errorString();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        CppJob *cppJob = pf->create< Calamares::CppJob >();
 | 
			
		||||
        if ( !cppJob )
 | 
			
		||||
        {
 | 
			
		||||
            cDebug() << Q_FUNC_INFO << m_loader->errorString();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
//        cDebug() << "CppJobModule loading self for instance" << instanceKey()
 | 
			
		||||
//                 << "\nCppJobModule at address" << this
 | 
			
		||||
//                 << "\nCalamares::PluginFactory at address" << pf
 | 
			
		||||
//                 << "\nCppJob at address" << cppJob;
 | 
			
		||||
 | 
			
		||||
        cppJob->setModuleInstanceKey( instanceKey() );
 | 
			
		||||
        cppJob->setConfigurationMap( m_configurationMap );
 | 
			
		||||
        m_job = Calamares::job_ptr( static_cast< Calamares::Job * >( cppJob ) );
 | 
			
		||||
        m_loaded = true;
 | 
			
		||||
        cDebug() << "CppJobModule" << instanceKey() << "loading complete.";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
QList< job_ptr >
 | 
			
		||||
CppJobModule::jobs() const
 | 
			
		||||
{
 | 
			
		||||
    return QList< job_ptr >() << m_job;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
CppJobModule::initFrom( const QVariantMap& moduleDescriptor )
 | 
			
		||||
{
 | 
			
		||||
    Module::initFrom( moduleDescriptor );
 | 
			
		||||
    QDir directory( location() );
 | 
			
		||||
    QString load;
 | 
			
		||||
    if ( !moduleDescriptor.value( "load" ).toString().isEmpty() )
 | 
			
		||||
    {
 | 
			
		||||
        load = moduleDescriptor.value( "load" ).toString();
 | 
			
		||||
        load = directory.absoluteFilePath( load );
 | 
			
		||||
    }
 | 
			
		||||
    // If a load path is not specified, we look for a plugin to load in the directory.
 | 
			
		||||
    if ( load.isEmpty() || !QLibrary::isLibrary( load ) )
 | 
			
		||||
    {
 | 
			
		||||
        const QStringList ls = directory.entryList( QStringList{ "*.so" } );
 | 
			
		||||
        if ( !ls.isEmpty() )
 | 
			
		||||
        {
 | 
			
		||||
            for ( QString entry : ls )
 | 
			
		||||
            {
 | 
			
		||||
                entry = directory.absoluteFilePath( entry );
 | 
			
		||||
                if ( QLibrary::isLibrary( entry ) )
 | 
			
		||||
                {
 | 
			
		||||
                    load = entry;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_loader = new QPluginLoader( load );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CppJobModule::CppJobModule()
 | 
			
		||||
    : Module()
 | 
			
		||||
    , m_loader( nullptr )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CppJobModule::~CppJobModule()
 | 
			
		||||
{
 | 
			
		||||
    delete m_loader;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Calamares
 | 
			
		||||
							
								
								
									
										53
									
								
								src/libcalamaresui/modulesystem/CppJobModule.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/libcalamaresui/modulesystem/CppJobModule.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef CALAMARES_CPPJOBMODULE_H
 | 
			
		||||
#define CALAMARES_CPPJOBMODULE_H
 | 
			
		||||
 | 
			
		||||
#include "UiDllMacro.h"
 | 
			
		||||
#include "Module.h"
 | 
			
		||||
 | 
			
		||||
class QPluginLoader;
 | 
			
		||||
 | 
			
		||||
namespace Calamares {
 | 
			
		||||
 | 
			
		||||
class UIDLLEXPORT CppJobModule : public Module
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    Type type() const override;
 | 
			
		||||
    Interface interface() const override;
 | 
			
		||||
 | 
			
		||||
    void loadSelf() override;
 | 
			
		||||
    QList< job_ptr > jobs() const override;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    void initFrom( const QVariantMap& moduleDescriptor ) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    friend class Module; //so only the superclass can instantiate
 | 
			
		||||
    explicit CppJobModule();
 | 
			
		||||
    virtual ~CppJobModule();
 | 
			
		||||
 | 
			
		||||
    QPluginLoader* m_loader;
 | 
			
		||||
    job_ptr m_job;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Calamares
 | 
			
		||||
 | 
			
		||||
#endif // CALAMARES_CPPJOBMODULE_H
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
#include "Module.h"
 | 
			
		||||
 | 
			
		||||
#include "ProcessJobModule.h"
 | 
			
		||||
#include "CppJobModule.h"
 | 
			
		||||
#include "ViewModule.h"
 | 
			
		||||
#include "utils/CalamaresUtils.h"
 | 
			
		||||
#include "utils/YamlUtils.h"
 | 
			
		||||
@@ -76,7 +77,11 @@ Module::fromDescriptor( const QVariantMap& moduleDescriptor,
 | 
			
		||||
    }
 | 
			
		||||
    else if ( typeString == "job" )
 | 
			
		||||
    {
 | 
			
		||||
        if ( intfString == "process" )
 | 
			
		||||
        if ( intfString == "qtplugin" )
 | 
			
		||||
        {
 | 
			
		||||
            m = new CppJobModule();
 | 
			
		||||
        }
 | 
			
		||||
        else if ( intfString == "process" )
 | 
			
		||||
        {
 | 
			
		||||
            m = new ProcessJobModule();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -220,21 +220,24 @@ def install_grub(efi_directory, fw_type):
 | 
			
		||||
                               "--force"])
 | 
			
		||||
 | 
			
		||||
        # VFAT is weird, see issue CAL-385
 | 
			
		||||
        efi_directory_firmware = case_insensitive_subdir(efi_directory,
 | 
			
		||||
                                                         ["EFI", "Efi", "efi"])
 | 
			
		||||
        if not efi_directory_firmware:
 | 
			
		||||
            efi_directory_firmware = os.path.join(efi_directory, "EFI")
 | 
			
		||||
        efi_directory_firmware = os.path.join(efi_directory, "EFI")
 | 
			
		||||
        if os.path.exists(efi_directory_firmware):
 | 
			
		||||
            efi_directory_firmware = vfat_correct_case(efi_directory, "EFI")
 | 
			
		||||
 | 
			
		||||
        efi_boot_directory = case_insensitive_subdir(efi_directory_firmware,
 | 
			
		||||
                                                     ["Boot", "boot", "BOOT"])
 | 
			
		||||
        if not efi_boot_directory:
 | 
			
		||||
            efi_boot_directory = os.path.join(efi_directory_firmware, "boot")
 | 
			
		||||
        efi_boot_directory = os.path.join(efi_directory_firmware, "boot")
 | 
			
		||||
        if os.path.exists(efi_boot_directory):
 | 
			
		||||
            efi_boot_directory = vfat_correct_case(efi_directory_firmware, "boot")
 | 
			
		||||
        else:
 | 
			
		||||
            check_target_env_call(["mkdir", "-p", efi_boot_directory])
 | 
			
		||||
 | 
			
		||||
        # Workaround for some UEFI firmwares
 | 
			
		||||
        efi_file_source = {"32": os.path.join(efi_directory_firmware, efi_bootloader_id, "grubia32.efi"),
 | 
			
		||||
                           "64": os.path.join(efi_directory_firmware, efi_bootloader_id, "grubx64.efi")}
 | 
			
		||||
        efi_file_target = {"32": os.path.join(efi_boot_directory, "bootia32.efi"),
 | 
			
		||||
                           "64": os.path.join(efi_boot_directory, "bootx64.efi")}
 | 
			
		||||
        check_target_env_call(["cp",
 | 
			
		||||
                               os.path.join(efi_directory_firmware, efi_bootloader_id, "grubx64.efi"),
 | 
			
		||||
                               os.path.join(efi_boot_directory, "bootx64.efi")])
 | 
			
		||||
                               efi_file_source[efi_bitness],
 | 
			
		||||
                               efi_file_target[efi_bitness]])
 | 
			
		||||
    else:
 | 
			
		||||
        print("Bootloader: grub (bios)")
 | 
			
		||||
        boot_loader = libcalamares.globalstorage.value("bootLoader")
 | 
			
		||||
@@ -251,15 +254,15 @@ def install_grub(efi_directory, fw_type):
 | 
			
		||||
                           libcalamares.job.configuration["grubCfg"]])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def case_insensitive_subdir(parent, candidate_dirnames):
 | 
			
		||||
    for dirname in candidate_dirnames:
 | 
			
		||||
        if os.path.isdir(os.path.join(parent, dirname)):
 | 
			
		||||
            return os.path.join(parent, dirname)
 | 
			
		||||
    return ""
 | 
			
		||||
def vfat_correct_case(parent, name):
 | 
			
		||||
    for candidate in os.listdir(parent):
 | 
			
		||||
        if name.lower() == candidate.lower():
 | 
			
		||||
            return os.path.join(parent, candidate)
 | 
			
		||||
    return os.path.join(parent, name)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def prepare_bootloader(fw_type):
 | 
			
		||||
    """ Prepares bootloader and set proper flags to EFI boot partition (esp,boot).
 | 
			
		||||
    """ Prepares bootloader.
 | 
			
		||||
    Based on value 'efi_boot_loader', it either calls systemd-boot or grub to be installed.
 | 
			
		||||
 | 
			
		||||
    :param fw_type:
 | 
			
		||||
@@ -268,33 +271,6 @@ def prepare_bootloader(fw_type):
 | 
			
		||||
    efi_boot_loader = libcalamares.job.configuration["efiBootLoader"]
 | 
			
		||||
    efi_directory = libcalamares.globalstorage.value("efiSystemPartition")
 | 
			
		||||
 | 
			
		||||
    if fw_type == "efi":
 | 
			
		||||
        partitions = libcalamares.globalstorage.value("partitions")
 | 
			
		||||
        boot_p = ""
 | 
			
		||||
        device = ""
 | 
			
		||||
 | 
			
		||||
        for partition in partitions:
 | 
			
		||||
            if partition["mountPoint"] == efi_directory:
 | 
			
		||||
                boot_device = partition["device"]
 | 
			
		||||
                boot_p = boot_device[-1:]
 | 
			
		||||
                device = boot_device[:-1]
 | 
			
		||||
 | 
			
		||||
                if not boot_p or not device:
 | 
			
		||||
                    return ("EFI directory \"{!s}\" not found!".format(efi_directory),
 | 
			
		||||
                            "Boot partition: \"{!s}\"".format(boot_p),
 | 
			
		||||
                            "Boot device: \"{!s}\"".format(device))
 | 
			
		||||
                else:
 | 
			
		||||
                    print("EFI directory: \"{!s}\"".format(efi_directory))
 | 
			
		||||
                    print("Boot partition: \"{!s}\"".format(boot_p))
 | 
			
		||||
                    print("Boot device: \"{!s}\"".format(device))
 | 
			
		||||
 | 
			
		||||
        if not device:
 | 
			
		||||
            print("WARNING: no EFI system partition or EFI system partition mount point not set.")
 | 
			
		||||
            print("         >>> no EFI bootloader will be installed <<<")
 | 
			
		||||
            return None
 | 
			
		||||
        print("Set 'EF00' flag")
 | 
			
		||||
        subprocess.call(["sgdisk", "--typecode={!s}:EF00".format(boot_p), "{!s}".format(device)])
 | 
			
		||||
 | 
			
		||||
    if efi_boot_loader == "systemd-boot" and fw_type == "efi":
 | 
			
		||||
        install_systemd_boot(efi_directory)
 | 
			
		||||
    else:
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
#
 | 
			
		||||
# === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
#
 | 
			
		||||
#   Copyright 2014-2015, Philip Müller <philm@manjaro.org>
 | 
			
		||||
#   Copyright 2014-2016, Philip Müller <philm@manjaro.org>
 | 
			
		||||
#   Copyright 2014-2015, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
#   Copyright 2014, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
#
 | 
			
		||||
@@ -24,6 +24,7 @@ import os
 | 
			
		||||
import collections
 | 
			
		||||
import re
 | 
			
		||||
import libcalamares
 | 
			
		||||
import configparser
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DesktopEnvironment = collections.namedtuple('DesktopEnvironment', ['executable', 'desktop_file'])
 | 
			
		||||
@@ -44,6 +45,7 @@ desktop_environments = [
 | 
			
		||||
    DesktopEnvironment('/usr/bin/budgie-session', 'budgie-session'),
 | 
			
		||||
    DesktopEnvironment('/usr/bin/budgie-desktop', 'budgie-desktop'),
 | 
			
		||||
    DesktopEnvironment('/usr/bin/i3', 'i3'),
 | 
			
		||||
    DesktopEnvironment('/usr/bin/startdde', 'deepin'),
 | 
			
		||||
    DesktopEnvironment('/usr/bin/openbox-session', 'openbox')
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@@ -252,34 +254,29 @@ def set_autologin(username, displaymanagers, default_desktop_environment, root_m
 | 
			
		||||
        # Systems with Sddm as Desktop Manager
 | 
			
		||||
        sddm_conf_path = os.path.join(root_mount_point, "etc/sddm.conf")
 | 
			
		||||
 | 
			
		||||
        sddm_config = configparser.ConfigParser()
 | 
			
		||||
        # Make everything case sensitive
 | 
			
		||||
        sddm_config.optionxform = str
 | 
			
		||||
 | 
			
		||||
        if os.path.isfile(sddm_conf_path):
 | 
			
		||||
            libcalamares.utils.debug('SDDM config file exists')
 | 
			
		||||
        else:
 | 
			
		||||
            libcalamares.utils.check_target_env_call(["sh", "-c", "sddm --example-config > /etc/sddm.conf"])
 | 
			
		||||
            sddm_config.read(sddm_conf_path)
 | 
			
		||||
 | 
			
		||||
        text = []
 | 
			
		||||
        autologin_section = {}
 | 
			
		||||
        if 'Autologin' in sddm_config:
 | 
			
		||||
            autologin_section = sddm_config['Autologin']
 | 
			
		||||
 | 
			
		||||
        with open(sddm_conf_path, 'r') as sddm_conf:
 | 
			
		||||
            text = sddm_conf.readlines()
 | 
			
		||||
        if do_autologin:
 | 
			
		||||
            autologin_section['User'] = username
 | 
			
		||||
        elif 'User' in autologin_section:
 | 
			
		||||
            del autologin_section['User']
 | 
			
		||||
 | 
			
		||||
        with open(sddm_conf_path, 'w') as sddm_conf:
 | 
			
		||||
            for line in text:
 | 
			
		||||
                # User= line, possibly commented out
 | 
			
		||||
                if re.match('\\s*(?:#\\s*)?User=', line):
 | 
			
		||||
                    if do_autologin:
 | 
			
		||||
                        line = 'User={}\n'.format(username)
 | 
			
		||||
                    else:
 | 
			
		||||
                        line = '#User=\n'
 | 
			
		||||
        if default_desktop_environment is not None:
 | 
			
		||||
            autologin_section['Session'] = default_desktop_environment.desktop_file
 | 
			
		||||
 | 
			
		||||
                # Session= line, commented out or with empty value
 | 
			
		||||
                if re.match('\\s*#\\s*Session=|\\s*Session=$', line):
 | 
			
		||||
                    if default_desktop_environment is not None:
 | 
			
		||||
                        if do_autologin:
 | 
			
		||||
                            line = 'Session={}.desktop\n'.format(default_desktop_environment.desktop_file)
 | 
			
		||||
                        else:
 | 
			
		||||
                            line = '#Session={}.desktop\n'.format(default_desktop_environment.desktop_file)
 | 
			
		||||
        sddm_config['Autologin'] = autologin_section
 | 
			
		||||
 | 
			
		||||
                sddm_conf.write(line)
 | 
			
		||||
        with open(sddm_conf_path, 'w') as sddm_config_file:
 | 
			
		||||
            sddm_config.write(sddm_config_file, space_around_delimiters=False)
 | 
			
		||||
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
@@ -350,6 +347,11 @@ def run():
 | 
			
		||||
            if default_desktop_environment is not None:
 | 
			
		||||
                os.system("sed -i -e \"s/^.*user-session=.*/user-session={!s}/\" {!s}/etc/lightdm/lightdm.conf".format(
 | 
			
		||||
                          default_desktop_environment.desktop_file, root_mount_point))
 | 
			
		||||
 | 
			
		||||
            if default_desktop_environment.desktop_file == "deepin":
 | 
			
		||||
                os.system("sed -i -e \"s/^.greeter-session=.*/greeter-session=lightdm-deepin-greeter/\" {!s}/etc/lightdm/lightdm.conf".format(
 | 
			
		||||
                          root_mount_point))
 | 
			
		||||
                          
 | 
			
		||||
        else:
 | 
			
		||||
            libcalamares.utils.debug("lightdm selected but not installed")
 | 
			
		||||
            displaymanagers.remove("lightdm")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								src/modules/dracutlukscfg/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/modules/dracutlukscfg/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
calamares_add_plugin( dracutlukscfg
 | 
			
		||||
    TYPE job
 | 
			
		||||
    EXPORT_MACRO PLUGINDLLEXPORT_PRO
 | 
			
		||||
    SOURCES
 | 
			
		||||
        DracutLuksCfgJob.cpp
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamares
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										168
									
								
								src/modules/dracutlukscfg/DracutLuksCfgJob.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/modules/dracutlukscfg/DracutLuksCfgJob.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "DracutLuksCfgJob.h"
 | 
			
		||||
 | 
			
		||||
#include <QDir>
 | 
			
		||||
#include <QFile>
 | 
			
		||||
#include <QFileInfo>
 | 
			
		||||
#include <QTextStream>
 | 
			
		||||
 | 
			
		||||
#include "CalamaresVersion.h"
 | 
			
		||||
#include "JobQueue.h"
 | 
			
		||||
#include "GlobalStorage.h"
 | 
			
		||||
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
const QString DracutLuksCfgJob::CONFIG_FILE = QStringLiteral( "/etc/dracut.conf.d/calamares-luks.conf" );
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
const char *DracutLuksCfgJob::CONFIG_FILE_HEADER =
 | 
			
		||||
    "# Configuration file automatically written by the Calamares system installer\n"
 | 
			
		||||
    "# (This file is written once at install time and should be safe to edit.)\n"
 | 
			
		||||
    "# Enables support for LUKS full disk encryption with single sign on from GRUB.\n"
 | 
			
		||||
    "\n";
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
const char *DracutLuksCfgJob::CONFIG_FILE_CRYPTTAB_KEYFILE_LINE =
 | 
			
		||||
    "# force installing /etc/crypttab even if hostonly=\"no\", install the keyfile\n"
 | 
			
		||||
    "install_items+=\" /etc/crypttab /crypto_keyfile.bin \"\n";
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
const char *DracutLuksCfgJob::CONFIG_FILE_CRYPTTAB_LINE =
 | 
			
		||||
    "# force installing /etc/crypttab even if hostonly=\"no\"\n"
 | 
			
		||||
    "install_items+=\" /etc/crypttab \"\n";
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
const QString DracutLuksCfgJob::CONFIG_FILE_SWAPLINE = QStringLiteral( "# enable automatic resume from swap\nadd_device+=\" /dev/disk/by-uuid/%1 \"\n" );
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
QString
 | 
			
		||||
DracutLuksCfgJob::rootMountPoint()
 | 
			
		||||
{
 | 
			
		||||
    Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage();
 | 
			
		||||
    return globalStorage->value( QStringLiteral( "rootMountPoint" ) ).toString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
QVariantList
 | 
			
		||||
DracutLuksCfgJob::partitions()
 | 
			
		||||
{
 | 
			
		||||
    Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage();
 | 
			
		||||
    return globalStorage->value( QStringLiteral( "partitions" ) ).toList();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
bool
 | 
			
		||||
DracutLuksCfgJob::isRootEncrypted()
 | 
			
		||||
{
 | 
			
		||||
    const QVariantList partitions = DracutLuksCfgJob::partitions();
 | 
			
		||||
    for ( const QVariant &partition : partitions )
 | 
			
		||||
    {
 | 
			
		||||
        QVariantMap partitionMap = partition.toMap();
 | 
			
		||||
        QString mountPoint = partitionMap.value( QStringLiteral( "mountPoint" ) ).toString();
 | 
			
		||||
        if ( mountPoint == QStringLiteral( "/" ) )
 | 
			
		||||
            return partitionMap.contains( QStringLiteral( "luksMapperName" ) );
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
bool
 | 
			
		||||
DracutLuksCfgJob::hasUnencryptedSeparateBoot()
 | 
			
		||||
{
 | 
			
		||||
    const QVariantList partitions = DracutLuksCfgJob::partitions();
 | 
			
		||||
    for ( const QVariant &partition : partitions )
 | 
			
		||||
    {
 | 
			
		||||
        QVariantMap partitionMap = partition.toMap();
 | 
			
		||||
        QString mountPoint = partitionMap.value( QStringLiteral( "mountPoint" ) ).toString();
 | 
			
		||||
        if ( mountPoint == QStringLiteral( "/boot" ) )
 | 
			
		||||
            return !partitionMap.contains( QStringLiteral( "luksMapperName" ) );
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
QString
 | 
			
		||||
DracutLuksCfgJob::swapOuterUuid()
 | 
			
		||||
{
 | 
			
		||||
    const QVariantList partitions = DracutLuksCfgJob::partitions();
 | 
			
		||||
    for ( const QVariant &partition : partitions )
 | 
			
		||||
    {
 | 
			
		||||
        QVariantMap partitionMap = partition.toMap();
 | 
			
		||||
        QString fsType = partitionMap.value( QStringLiteral( "fs" ) ).toString();
 | 
			
		||||
        if ( fsType == QStringLiteral( "linuxswap" ) && partitionMap.contains( QStringLiteral( "luksMapperName" ) ) )
 | 
			
		||||
            return partitionMap.value( QStringLiteral( "luksUuid" ) ).toString();
 | 
			
		||||
    }
 | 
			
		||||
    return QString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DracutLuksCfgJob::DracutLuksCfgJob( QObject* parent )
 | 
			
		||||
    : Calamares::CppJob( parent )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DracutLuksCfgJob::~DracutLuksCfgJob()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
QString
 | 
			
		||||
DracutLuksCfgJob::prettyName() const
 | 
			
		||||
{
 | 
			
		||||
    if ( isRootEncrypted() )
 | 
			
		||||
        return tr( "Write LUKS configuration for Dracut to %1" ).arg( CONFIG_FILE );
 | 
			
		||||
    else
 | 
			
		||||
        return tr( "Skip writing LUKS configuration for Dracut: \"/\" partition is not encrypted" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Calamares::JobResult
 | 
			
		||||
DracutLuksCfgJob::exec()
 | 
			
		||||
{
 | 
			
		||||
    if ( isRootEncrypted() )
 | 
			
		||||
    {
 | 
			
		||||
        const QString realConfigFilePath = rootMountPoint() + CONFIG_FILE;
 | 
			
		||||
        cDebug() << "[DRACUTLUKSCFG]: Writing" << realConfigFilePath;
 | 
			
		||||
        QDir( QStringLiteral( "/" ) ).mkpath( QFileInfo( realConfigFilePath ).absolutePath() );
 | 
			
		||||
        QFile configFile( realConfigFilePath );
 | 
			
		||||
        if ( ! configFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
 | 
			
		||||
        {
 | 
			
		||||
            cDebug() << "[DRACUTLUKSCFG]: Failed to open" << realConfigFilePath;
 | 
			
		||||
            return Calamares::JobResult::error( tr( "Failed to open %1" ).arg( realConfigFilePath ) );
 | 
			
		||||
        }
 | 
			
		||||
        QTextStream outStream( &configFile );
 | 
			
		||||
        outStream << CONFIG_FILE_HEADER
 | 
			
		||||
                  << ( hasUnencryptedSeparateBoot() ? CONFIG_FILE_CRYPTTAB_LINE
 | 
			
		||||
                                                    : CONFIG_FILE_CRYPTTAB_KEYFILE_LINE );
 | 
			
		||||
        const QString swapOuterUuid = DracutLuksCfgJob::swapOuterUuid();
 | 
			
		||||
        if ( ! swapOuterUuid.isEmpty() )
 | 
			
		||||
        {
 | 
			
		||||
            cDebug() << "[DRACUTLUKSCFG]: Swap outer UUID" << swapOuterUuid;
 | 
			
		||||
            outStream << CONFIG_FILE_SWAPLINE.arg( swapOuterUuid ).toLatin1();
 | 
			
		||||
        }
 | 
			
		||||
        cDebug() << "[DRACUTLUKSCFG]: Wrote config to" << realConfigFilePath;
 | 
			
		||||
    } else
 | 
			
		||||
        cDebug() << "[DRACUTLUKSCFG]: / not encrypted, skipping";
 | 
			
		||||
 | 
			
		||||
    return Calamares::JobResult::ok();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CALAMARES_PLUGIN_FACTORY_DEFINITION( DracutLuksCfgJobFactory, registerPlugin<DracutLuksCfgJob>(); )
 | 
			
		||||
							
								
								
									
										59
									
								
								src/modules/dracutlukscfg/DracutLuksCfgJob.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/modules/dracutlukscfg/DracutLuksCfgJob.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef DRACUTLUKSCFGJOB_H
 | 
			
		||||
#define DRACUTLUKSCFGJOB_H
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QVariantMap>
 | 
			
		||||
 | 
			
		||||
#include <CppJob.h>
 | 
			
		||||
 | 
			
		||||
#include <utils/PluginFactory.h>
 | 
			
		||||
 | 
			
		||||
#include <PluginDllMacro.h>
 | 
			
		||||
 | 
			
		||||
class PLUGINDLLEXPORT DracutLuksCfgJob : public Calamares::CppJob
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    explicit DracutLuksCfgJob( QObject* parent = nullptr );
 | 
			
		||||
    virtual ~DracutLuksCfgJob();
 | 
			
		||||
 | 
			
		||||
    QString prettyName() const override;
 | 
			
		||||
 | 
			
		||||
    Calamares::JobResult exec() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    static const QString CONFIG_FILE;
 | 
			
		||||
    static const char *CONFIG_FILE_HEADER;
 | 
			
		||||
    static const char *CONFIG_FILE_CRYPTTAB_KEYFILE_LINE;
 | 
			
		||||
    static const char *CONFIG_FILE_CRYPTTAB_LINE;
 | 
			
		||||
    static const QString CONFIG_FILE_SWAPLINE;
 | 
			
		||||
 | 
			
		||||
    static QString rootMountPoint();
 | 
			
		||||
    static QVariantList partitions();
 | 
			
		||||
    static bool isRootEncrypted();
 | 
			
		||||
    static bool hasUnencryptedSeparateBoot();
 | 
			
		||||
    static QString swapOuterUuid();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CALAMARES_PLUGIN_FACTORY_DECLARATION( DracutLuksCfgJobFactory )
 | 
			
		||||
 | 
			
		||||
#endif // DRACUTLUKSCFGJOB_H
 | 
			
		||||
							
								
								
									
										7
									
								
								src/modules/dracutlukscfg/module.desc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/modules/dracutlukscfg/module.desc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
# Module metadata file for dracutlukscfg job
 | 
			
		||||
# Syntax is YAML 1.2
 | 
			
		||||
---
 | 
			
		||||
type:      "job"
 | 
			
		||||
name:      "dracutlukscfg"
 | 
			
		||||
interface: "qtplugin"
 | 
			
		||||
load:      "libcalamares_job_dracutlukscfg.so"
 | 
			
		||||
							
								
								
									
										9
									
								
								src/modules/dummycpp/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/modules/dummycpp/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
calamares_add_plugin( dummycpp
 | 
			
		||||
    TYPE job
 | 
			
		||||
    EXPORT_MACRO PLUGINDLLEXPORT_PRO
 | 
			
		||||
    SOURCES
 | 
			
		||||
        DummyCppJob.cpp
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamares
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										144
									
								
								src/modules/dummycpp/DummyCppJob.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								src/modules/dummycpp/DummyCppJob.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,144 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014, Teo Mrnjavac <teo@kde.org> (original dummypython code)
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "DummyCppJob.h"
 | 
			
		||||
 | 
			
		||||
#include <QProcess>
 | 
			
		||||
#include <QDateTime>
 | 
			
		||||
#include <QThread>
 | 
			
		||||
 | 
			
		||||
#include "CalamaresVersion.h"
 | 
			
		||||
#include "JobQueue.h"
 | 
			
		||||
#include "GlobalStorage.h"
 | 
			
		||||
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
 | 
			
		||||
DummyCppJob::DummyCppJob( QObject* parent )
 | 
			
		||||
    : Calamares::CppJob( parent )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DummyCppJob::~DummyCppJob()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
QString
 | 
			
		||||
DummyCppJob::prettyName() const
 | 
			
		||||
{
 | 
			
		||||
    return tr( "Dummy C++ Job" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static QString variantListToString( const QVariantList& variantList );
 | 
			
		||||
static QString variantMapToString( const QVariantMap& variantMap );
 | 
			
		||||
static QString variantHashToString( const QVariantHash& variantHash );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static QString
 | 
			
		||||
variantToString( const QVariant& variant )
 | 
			
		||||
{
 | 
			
		||||
    switch ( variant.type() )
 | 
			
		||||
    {
 | 
			
		||||
    case QVariant::Map:
 | 
			
		||||
        return variantMapToString( variant.toMap() );
 | 
			
		||||
 | 
			
		||||
    case QVariant::Hash:
 | 
			
		||||
        return variantHashToString( variant.toHash() );
 | 
			
		||||
 | 
			
		||||
    case QVariant::List:
 | 
			
		||||
    case QVariant::StringList:
 | 
			
		||||
        return variantListToString( variant.toList() );
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
        return variant.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static QString
 | 
			
		||||
variantListToString( const QVariantList& variantList )
 | 
			
		||||
{
 | 
			
		||||
    QStringList result;
 | 
			
		||||
    for ( const QVariant& variant : variantList )
 | 
			
		||||
        result.append( variantToString( variant ) );
 | 
			
		||||
    return '{' + result.join(',') + '}';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static QString
 | 
			
		||||
variantMapToString( const QVariantMap& variantMap )
 | 
			
		||||
{
 | 
			
		||||
    QStringList result;
 | 
			
		||||
    for ( auto it = variantMap.constBegin(); it != variantMap.constEnd(); ++it )
 | 
			
		||||
        result.append( it.key() + '=' + variantToString( it.value() ) );
 | 
			
		||||
    return '[' + result.join(',') + ']';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static QString
 | 
			
		||||
variantHashToString( const QVariantHash& variantHash )
 | 
			
		||||
{
 | 
			
		||||
    QStringList result;
 | 
			
		||||
    for ( auto it = variantHash.constBegin(); it != variantHash.constEnd(); ++it )
 | 
			
		||||
        result.append( it.key() + '=' + variantToString( it.value() ) );
 | 
			
		||||
    return '<' + result.join(',') + '>';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Calamares::JobResult
 | 
			
		||||
DummyCppJob::exec()
 | 
			
		||||
{
 | 
			
		||||
    // Ported from dummypython
 | 
			
		||||
    QProcess::execute( "/bin/sh", QStringList() << "-c" << "touch ~/calamares-dummycpp" );
 | 
			
		||||
    QString accumulator = QDateTime::currentDateTimeUtc().toString( Qt::ISODate ) + '\n';
 | 
			
		||||
    accumulator += QStringLiteral( "Calamares version: " ) + CALAMARES_VERSION_SHORT + '\n';
 | 
			
		||||
    accumulator += QStringLiteral( "This job's name: " ) + prettyName() + '\n';
 | 
			
		||||
    accumulator += QStringLiteral( "Configuration map: %1\n" ).arg( variantMapToString( m_configurationMap ) );
 | 
			
		||||
    accumulator += QStringLiteral( "   *** globalstorage test ***\n" );
 | 
			
		||||
    Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage();
 | 
			
		||||
    accumulator += QStringLiteral( "lala: " ) + (globalStorage->contains( "lala" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n';
 | 
			
		||||
    accumulator += QStringLiteral( "foo: " ) + (globalStorage->contains( "foo" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n';
 | 
			
		||||
    accumulator += QStringLiteral( "count: " ) + QString::number( globalStorage->count() ) + '\n';
 | 
			
		||||
    globalStorage->insert( "item2", "value2" );
 | 
			
		||||
    globalStorage->insert( "item3", 3 );
 | 
			
		||||
    accumulator += QStringLiteral( "keys: %1\n" ).arg( globalStorage->keys().join( ',' ) );
 | 
			
		||||
    accumulator += QStringLiteral( "remove: %1\n" ).arg( QString::number( globalStorage->remove( "item2" ) ) );
 | 
			
		||||
    accumulator += QStringLiteral( "values: %1 %2 %3\n" ).arg(
 | 
			
		||||
        globalStorage->value( "foo" ).toString(),
 | 
			
		||||
        globalStorage->value( "item2" ).toString(),
 | 
			
		||||
        globalStorage->value( "item3" ).toString() );
 | 
			
		||||
 | 
			
		||||
    emit progress( 0.1 );
 | 
			
		||||
    cDebug() << "[DUMMYCPP]: " << accumulator;
 | 
			
		||||
 | 
			
		||||
    QThread::sleep( 3 );
 | 
			
		||||
 | 
			
		||||
    return Calamares::JobResult::ok();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
DummyCppJob::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
{
 | 
			
		||||
    m_configurationMap = configurationMap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CALAMARES_PLUGIN_FACTORY_DEFINITION( DummyCppJobFactory, registerPlugin<DummyCppJob>(); )
 | 
			
		||||
							
								
								
									
										51
									
								
								src/modules/dummycpp/DummyCppJob.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/modules/dummycpp/DummyCppJob.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef DUMMYCPPJOB_H
 | 
			
		||||
#define DUMMYCPPJOB_H
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QVariantMap>
 | 
			
		||||
 | 
			
		||||
#include <CppJob.h>
 | 
			
		||||
 | 
			
		||||
#include <utils/PluginFactory.h>
 | 
			
		||||
 | 
			
		||||
#include <PluginDllMacro.h>
 | 
			
		||||
 | 
			
		||||
class PLUGINDLLEXPORT DummyCppJob : public Calamares::CppJob
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    explicit DummyCppJob( QObject* parent = nullptr );
 | 
			
		||||
    virtual ~DummyCppJob();
 | 
			
		||||
 | 
			
		||||
    QString prettyName() const override;
 | 
			
		||||
 | 
			
		||||
    Calamares::JobResult exec() override;
 | 
			
		||||
 | 
			
		||||
    void setConfigurationMap( const QVariantMap& configurationMap ) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    QVariantMap m_configurationMap;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CALAMARES_PLUGIN_FACTORY_DECLARATION( DummyCppJobFactory )
 | 
			
		||||
 | 
			
		||||
#endif // DUMMYCPPJOB_H
 | 
			
		||||
							
								
								
									
										18
									
								
								src/modules/dummycpp/dummycpp.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/modules/dummycpp/dummycpp.conf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
---
 | 
			
		||||
syntax: "YAML map of anything"
 | 
			
		||||
example:
 | 
			
		||||
    whats_this: "module-specific configuration"
 | 
			
		||||
    from_where: "dummycpp.conf"
 | 
			
		||||
a_list:
 | 
			
		||||
    - "item1"
 | 
			
		||||
    - "item2"
 | 
			
		||||
    - "item3"
 | 
			
		||||
    - "item4"
 | 
			
		||||
a_list_of_maps:
 | 
			
		||||
    - name: "an Item"
 | 
			
		||||
      contents:
 | 
			
		||||
        - "an element"
 | 
			
		||||
        - "another element"
 | 
			
		||||
    - name: "another item"
 | 
			
		||||
      contents:
 | 
			
		||||
        - "not much"
 | 
			
		||||
							
								
								
									
										7
									
								
								src/modules/dummycpp/module.desc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/modules/dummycpp/module.desc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
# Module metadata file for dummycpp job
 | 
			
		||||
# Syntax is YAML 1.2
 | 
			
		||||
---
 | 
			
		||||
type:      "job"
 | 
			
		||||
name:      "dummycpp"
 | 
			
		||||
interface: "qtplugin"
 | 
			
		||||
load:      "libcalamares_job_dummycpp.so"
 | 
			
		||||
@@ -7,7 +7,7 @@ calamares_add_plugin( finished
 | 
			
		||||
        FinishedPage.cpp
 | 
			
		||||
    UI
 | 
			
		||||
        FinishedPage.ui
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,3 +8,6 @@ ssdExtraMountOptions:
 | 
			
		||||
    xfs: discard
 | 
			
		||||
    swap: discard
 | 
			
		||||
    btrfs: discard,compress=lzo
 | 
			
		||||
crypttabOptions: luks
 | 
			
		||||
# For Debian and Debian-based distributions, change the above line to:
 | 
			
		||||
# crypttabOptions: luks,keyscript=/bin/cat
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import subprocess
 | 
			
		||||
 | 
			
		||||
import libcalamares
 | 
			
		||||
 | 
			
		||||
@@ -102,11 +103,13 @@ class FstabGenerator(object):
 | 
			
		||||
    :param mount_options:
 | 
			
		||||
    :param ssd_extra_mount_options:
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self, partitions, root_mount_point, mount_options, ssd_extra_mount_options):
 | 
			
		||||
    def __init__(self, partitions, root_mount_point, mount_options,
 | 
			
		||||
                 ssd_extra_mount_options, crypttab_options):
 | 
			
		||||
        self.partitions = partitions
 | 
			
		||||
        self.root_mount_point = root_mount_point
 | 
			
		||||
        self.mount_options = mount_options
 | 
			
		||||
        self.ssd_extra_mount_options = ssd_extra_mount_options
 | 
			
		||||
        self.crypttab_options = crypttab_options
 | 
			
		||||
        self.ssd_disks = set()
 | 
			
		||||
        self.root_is_ssd = False
 | 
			
		||||
 | 
			
		||||
@@ -152,21 +155,20 @@ class FstabGenerator(object):
 | 
			
		||||
        if not mapper_name or not luks_uuid:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
        if mount_point == "/":
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
        return dict(
 | 
			
		||||
            name=mapper_name,
 | 
			
		||||
            device="UUID=" + luks_uuid,
 | 
			
		||||
            password="/crypto_keyfile.bin",
 | 
			
		||||
            options=self.crypttab_options,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def print_crypttab_line(self, dct, file=None):
 | 
			
		||||
        """ Prints line to '/etc/crypttab' file. """
 | 
			
		||||
        line = "{:21} {:<45} {}".format(dct["name"],
 | 
			
		||||
                                        dct["device"],
 | 
			
		||||
                                        dct["password"],
 | 
			
		||||
                                       )
 | 
			
		||||
        line = "{:21} {:<45} {} {}".format(dct["name"],
 | 
			
		||||
                                           dct["device"],
 | 
			
		||||
                                           dct["password"],
 | 
			
		||||
                                           dct["options"],
 | 
			
		||||
                                          )
 | 
			
		||||
 | 
			
		||||
        print(line, file=file)
 | 
			
		||||
 | 
			
		||||
@@ -179,10 +181,33 @@ class FstabGenerator(object):
 | 
			
		||||
            print(FSTAB_HEADER, file=fstab_file)
 | 
			
		||||
 | 
			
		||||
            for partition in self.partitions:
 | 
			
		||||
                dct = self.generate_fstab_line_info(partition)
 | 
			
		||||
                # Special treatment for a btrfs root with @ and @home subvolumes
 | 
			
		||||
                if partition["fs"] == "btrfs" and partition["mountPoint"] == "/":
 | 
			
		||||
                    output = subprocess.check_output(['btrfs',
 | 
			
		||||
                                                      'subvolume',
 | 
			
		||||
                                                      'list',
 | 
			
		||||
                                                      self.root_mount_point])
 | 
			
		||||
                    output_lines = output.splitlines()
 | 
			
		||||
                    for line in output_lines:
 | 
			
		||||
                        if line.endswith(b'path @'):
 | 
			
		||||
                            root_entry = partition
 | 
			
		||||
                            root_entry["subvol"] = "@"
 | 
			
		||||
                            dct = self.generate_fstab_line_info(root_entry)
 | 
			
		||||
                            if dct:
 | 
			
		||||
                                self.print_fstab_line(dct, file=fstab_file)
 | 
			
		||||
                        elif line.endswith(b'path @home'):
 | 
			
		||||
                            home_entry = partition
 | 
			
		||||
                            home_entry["mountPoint"] = "/home"
 | 
			
		||||
                            home_entry["subvol"] = "@home"
 | 
			
		||||
                            dct = self.generate_fstab_line_info(home_entry)
 | 
			
		||||
                            if dct:
 | 
			
		||||
                                self.print_fstab_line(dct, file=fstab_file)
 | 
			
		||||
 | 
			
		||||
                if dct:
 | 
			
		||||
                    self.print_fstab_line(dct, file=fstab_file)
 | 
			
		||||
                else:
 | 
			
		||||
                    dct = self.generate_fstab_line_info(partition)
 | 
			
		||||
 | 
			
		||||
                    if dct:
 | 
			
		||||
                        self.print_fstab_line(dct, file=fstab_file)
 | 
			
		||||
 | 
			
		||||
            if self.root_is_ssd:
 | 
			
		||||
                # Mount /tmp on a tmpfs
 | 
			
		||||
@@ -223,12 +248,21 @@ class FstabGenerator(object):
 | 
			
		||||
        if mount_point == "/":
 | 
			
		||||
            self.root_is_ssd = is_ssd
 | 
			
		||||
 | 
			
		||||
        if filesystem == "btrfs" and "subvol" in partition:
 | 
			
		||||
            return dict(device="UUID=" + partition["uuid"],
 | 
			
		||||
                        mount_point=mount_point,
 | 
			
		||||
                        fs=filesystem,
 | 
			
		||||
                        options=",".join(["subvol={}".format(partition["subvol"]),
 | 
			
		||||
                                          options]),
 | 
			
		||||
                        check=check,
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
        return dict(device="UUID=" + partition["uuid"],
 | 
			
		||||
                    mount_point=mount_point or "swap",
 | 
			
		||||
                    fs=filesystem,
 | 
			
		||||
                    options=options,
 | 
			
		||||
                    check=check,
 | 
			
		||||
                   )
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
    def print_fstab_line(self, dct, file=None):
 | 
			
		||||
        """ Prints line to '/etc/fstab' file. """
 | 
			
		||||
@@ -258,9 +292,11 @@ def run():
 | 
			
		||||
    root_mount_point = global_storage.value("rootMountPoint")
 | 
			
		||||
    mount_options = conf["mountOptions"]
 | 
			
		||||
    ssd_extra_mount_options = conf.get("ssdExtraMountOptions", {})
 | 
			
		||||
    crypttab_options = conf.get("crypttabOptions", "luks")
 | 
			
		||||
    generator = FstabGenerator(partitions,
 | 
			
		||||
                               root_mount_point,
 | 
			
		||||
                               mount_options,
 | 
			
		||||
                               ssd_extra_mount_options)
 | 
			
		||||
                               ssd_extra_mount_options,
 | 
			
		||||
                               crypttab_options)
 | 
			
		||||
 | 
			
		||||
    return generator.run()
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,10 @@ def modify_grub_default(partitions, root_mount_point, distributor):
 | 
			
		||||
    default_grub = os.path.join(default_dir, "grub")
 | 
			
		||||
    distributor_replace = distributor.replace("'", "'\\''")
 | 
			
		||||
    plymouth_bin = libcalamares.utils.target_env_call(["sh", "-c", "which plymouth"])
 | 
			
		||||
    dracut_bin = libcalamares.utils.target_env_call(["sh", "-c", "which dracut"])
 | 
			
		||||
    use_splash = ""
 | 
			
		||||
    swap_uuid = ""
 | 
			
		||||
    swap_outer_uuid = ""
 | 
			
		||||
 | 
			
		||||
    libcalamares.utils.debug("which plymouth exit code: {!s}".format(plymouth_bin))
 | 
			
		||||
 | 
			
		||||
@@ -46,15 +48,26 @@ def modify_grub_default(partitions, root_mount_point, distributor):
 | 
			
		||||
 | 
			
		||||
    cryptdevice_params = []
 | 
			
		||||
 | 
			
		||||
    for partition in partitions:
 | 
			
		||||
        if partition["fs"] == "linuxswap":
 | 
			
		||||
            swap_uuid = partition["uuid"]
 | 
			
		||||
    if dracut_bin == 0:
 | 
			
		||||
        for partition in partitions:
 | 
			
		||||
            if partition["fs"] == "linuxswap":
 | 
			
		||||
                swap_uuid = partition["uuid"]
 | 
			
		||||
 | 
			
		||||
        if partition["mountPoint"] == "/" and "luksMapperName" in partition:
 | 
			
		||||
            cryptdevice_params = [
 | 
			
		||||
                "cryptdevice=UUID={!s}:{!s}".format(partition["luksUuid"],
 | 
			
		||||
                                                    partition["luksMapperName"]),
 | 
			
		||||
                "root=/dev/mapper/{!s}".format(partition["luksMapperName"])
 | 
			
		||||
            if partition["fs"] == "linuxswap" and "luksMapperName" in partition:
 | 
			
		||||
                swap_outer_uuid = partition["luksUuid"]
 | 
			
		||||
 | 
			
		||||
            if partition["mountPoint"] == "/" and "luksMapperName" in partition:
 | 
			
		||||
                cryptdevice_params = ["rd.luks.uuid={!s}".format(partition["luksUuid"])]
 | 
			
		||||
    else:
 | 
			
		||||
        for partition in partitions:
 | 
			
		||||
            if partition["fs"] == "linuxswap":
 | 
			
		||||
                swap_uuid = partition["uuid"]
 | 
			
		||||
 | 
			
		||||
            if partition["mountPoint"] == "/" and "luksMapperName" in partition:
 | 
			
		||||
                cryptdevice_params = [
 | 
			
		||||
                    "cryptdevice=UUID={!s}:{!s}".format(partition["luksUuid"],
 | 
			
		||||
                                                        partition["luksMapperName"]),
 | 
			
		||||
                    "root=/dev/mapper/{!s}".format(partition["luksMapperName"])
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
    kernel_params = ["quiet"]
 | 
			
		||||
@@ -68,7 +81,10 @@ def modify_grub_default(partitions, root_mount_point, distributor):
 | 
			
		||||
    if swap_uuid:
 | 
			
		||||
        kernel_params.append("resume=UUID={!s}".format(swap_uuid))
 | 
			
		||||
 | 
			
		||||
    distributor_line = "GRUB_DISTRIBUTOR=\"{!s}\"".format(distributor_replace)
 | 
			
		||||
    if dracut_bin == 0 and swap_outer_uuid:
 | 
			
		||||
        kernel_params.append("rd.luks.uuid={!s}".format(swap_outer_uuid))
 | 
			
		||||
 | 
			
		||||
    distributor_line = "GRUB_DISTRIBUTOR='{!s}'".format(distributor_replace)
 | 
			
		||||
 | 
			
		||||
    if not os.path.exists(default_dir):
 | 
			
		||||
        os.mkdir(default_dir)
 | 
			
		||||
@@ -126,7 +142,7 @@ def modify_grub_default(partitions, root_mount_point, distributor):
 | 
			
		||||
                else:
 | 
			
		||||
                    escaped_value = str(value).replace("'", "'\\''")
 | 
			
		||||
 | 
			
		||||
                lines.append("{!s}=\"{!s}\"".format(key, escaped_value))
 | 
			
		||||
                lines.append("{!s}='{!s}'".format(key, escaped_value))
 | 
			
		||||
 | 
			
		||||
    if not have_kernel_cmd:
 | 
			
		||||
        kernel_cmd = "GRUB_CMDLINE_LINUX_DEFAULT=\"{!s}\"".format(" ".join(kernel_params))
 | 
			
		||||
 
 | 
			
		||||
@@ -94,6 +94,7 @@ def modify_mkinitcpio_conf(partitions, root_mount_point):
 | 
			
		||||
    files = []
 | 
			
		||||
    encrypt_hook = False
 | 
			
		||||
    openswap_hook = False
 | 
			
		||||
    unencrypted_separate_boot = False
 | 
			
		||||
 | 
			
		||||
    # It is important that the plymouth hook comes before any encrypt hook
 | 
			
		||||
    plymouth_bin = os.path.join(root_mount_point, "usr/bin/plymouth")
 | 
			
		||||
@@ -112,9 +113,13 @@ def modify_mkinitcpio_conf(partitions, root_mount_point):
 | 
			
		||||
        if partition["mountPoint"] == "/" and "luksMapperName" in partition:
 | 
			
		||||
            encrypt_hook = True
 | 
			
		||||
 | 
			
		||||
        if partition["mountPoint"] == "/boot" and "luksMapperName" not in partition:
 | 
			
		||||
            unencrypted_separate_boot = True
 | 
			
		||||
 | 
			
		||||
    if encrypt_hook:
 | 
			
		||||
        hooks.append("encrypt")
 | 
			
		||||
        if os.path.isfile(os.path.join(root_mount_point, "crypto_keyfile.bin")):
 | 
			
		||||
        if not unencrypted_separate_boot and \
 | 
			
		||||
           os.path.isfile(os.path.join(root_mount_point, "crypto_keyfile.bin")):
 | 
			
		||||
            files.append("/crypto_keyfile.bin")
 | 
			
		||||
 | 
			
		||||
    if swap_uuid is not "":
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								src/modules/initramfscfg/encrypt_hook
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								src/modules/initramfscfg/encrypt_hook
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
  PREREQ=""
 | 
			
		||||
 | 
			
		||||
  prereqs()
 | 
			
		||||
  {
 | 
			
		||||
          echo "$PREREQ"
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  case $1 in
 | 
			
		||||
  # get pre-requisites
 | 
			
		||||
  prereqs)
 | 
			
		||||
          prereqs
 | 
			
		||||
          exit 0
 | 
			
		||||
          ;;
 | 
			
		||||
  esac
 | 
			
		||||
 | 
			
		||||
  . /usr/share/initramfs-tools/hook-functions
 | 
			
		||||
  if [ -f /crypto_keyfile.bin ]
 | 
			
		||||
  then
 | 
			
		||||
  	cp /crypto_keyfile.bin ${DESTDIR}
 | 
			
		||||
  fi
 | 
			
		||||
  if [ -f /etc/crypttab ]
 | 
			
		||||
  then
 | 
			
		||||
  	cp /etc/crypttab ${DESTDIR}/etc/
 | 
			
		||||
  fi
 | 
			
		||||
							
								
								
									
										22
									
								
								src/modules/initramfscfg/encrypt_hook_nokey
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								src/modules/initramfscfg/encrypt_hook_nokey
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
  PREREQ=""
 | 
			
		||||
 | 
			
		||||
  prereqs()
 | 
			
		||||
  {
 | 
			
		||||
          echo "$PREREQ"
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  case $1 in
 | 
			
		||||
  # get pre-requisites
 | 
			
		||||
  prereqs)
 | 
			
		||||
          prereqs
 | 
			
		||||
          exit 0
 | 
			
		||||
          ;;
 | 
			
		||||
  esac
 | 
			
		||||
 | 
			
		||||
  . /usr/share/initramfs-tools/hook-functions
 | 
			
		||||
  if [ -f /etc/crypttab ]
 | 
			
		||||
  then
 | 
			
		||||
  	cp /etc/crypttab ${DESTDIR}/etc/
 | 
			
		||||
  fi
 | 
			
		||||
							
								
								
									
										60
									
								
								src/modules/initramfscfg/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/modules/initramfscfg/main.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
#
 | 
			
		||||
# === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
#
 | 
			
		||||
#   Copyright 2014, Rohan Garg <rohan@kde.org>
 | 
			
		||||
#   Copyright 2015, Philip Müller <philm@manjaro.org>
 | 
			
		||||
#   Copyright 2016, David McKinney <mckinney@subgraph.com>
 | 
			
		||||
#   Copyright 2016, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
#
 | 
			
		||||
#   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 <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
import libcalamares
 | 
			
		||||
import os
 | 
			
		||||
import shutil
 | 
			
		||||
 | 
			
		||||
def copy_initramfs_hooks(partitions, root_mount_point):
 | 
			
		||||
    """ Copies initramfs hooks so they are picked up by update-initramfs
 | 
			
		||||
 | 
			
		||||
    :param partitions:
 | 
			
		||||
    :param root_mount_point:
 | 
			
		||||
    """
 | 
			
		||||
    encrypt_hook = False
 | 
			
		||||
    unencrypted_separate_boot = False
 | 
			
		||||
 | 
			
		||||
    for partition in partitions:
 | 
			
		||||
        if partition["mountPoint"] == "/" and "luksMapperName" in partition:
 | 
			
		||||
            encrypt_hook = True
 | 
			
		||||
 | 
			
		||||
        if partition["mountPoint"] == "/boot" and "luksMapperName" not in partition:
 | 
			
		||||
            unencrypted_separate_boot = True
 | 
			
		||||
 | 
			
		||||
    if encrypt_hook:
 | 
			
		||||
        if unencrypted_separate_boot:
 | 
			
		||||
            shutil.copy2("/usr/lib/calamares/modules/initramfscfg/encrypt_hook_nokey", "{!s}/usr/share/initramfs-tools/hooks/encrypt_hook".format(root_mount_point))
 | 
			
		||||
        else:
 | 
			
		||||
            shutil.copy2("/usr/lib/calamares/modules/initramfscfg/encrypt_hook", "{!s}/usr/share/initramfs-tools/hooks/".format(root_mount_point))
 | 
			
		||||
        os.chmod("{!s}/usr/share/initramfs-tools/hooks/encrypt_hook".format(root_mount_point), 0o755)
 | 
			
		||||
 | 
			
		||||
def run():
 | 
			
		||||
    """ Calls routine with given parameters to configure initramfs
 | 
			
		||||
 | 
			
		||||
    :return:
 | 
			
		||||
    """
 | 
			
		||||
    partitions = libcalamares.globalstorage.value("partitions")
 | 
			
		||||
    root_mount_point = libcalamares.globalstorage.value("rootMountPoint")
 | 
			
		||||
    copy_initramfs_hooks(partitions, root_mount_point)
 | 
			
		||||
 | 
			
		||||
    return None
 | 
			
		||||
							
								
								
									
										5
									
								
								src/modules/initramfscfg/module.desc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/modules/initramfscfg/module.desc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
---
 | 
			
		||||
type:       "job"
 | 
			
		||||
name:       "initramfscfg"
 | 
			
		||||
interface:  "python"
 | 
			
		||||
script:     "main.py"
 | 
			
		||||
@@ -19,7 +19,7 @@ calamares_add_plugin( interactiveterminal
 | 
			
		||||
    SOURCES
 | 
			
		||||
        InteractiveTerminalViewStep.cpp
 | 
			
		||||
        InteractiveTerminalPage.cpp
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
        KF5::Service
 | 
			
		||||
        KF5::Parts
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ calamares_add_plugin( keyboard
 | 
			
		||||
        KeyboardPage.ui
 | 
			
		||||
    RESOURCES
 | 
			
		||||
        keyboard.qrc
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -202,7 +202,8 @@ KeyboardPage::prettyStatus() const
 | 
			
		||||
 | 
			
		||||
QList< Calamares::job_ptr >
 | 
			
		||||
KeyboardPage::createJobs( const QString& xOrgConfFileName,
 | 
			
		||||
                          const QString& convertedKeymapPath )
 | 
			
		||||
                          const QString& convertedKeymapPath,
 | 
			
		||||
                          bool writeEtcDefaultKeyboard )
 | 
			
		||||
{
 | 
			
		||||
    QList< Calamares::job_ptr > list;
 | 
			
		||||
    QString selectedModel = m_models.value( ui->comboBoxModel->currentText(),
 | 
			
		||||
@@ -212,7 +213,8 @@ KeyboardPage::createJobs( const QString& xOrgConfFileName,
 | 
			
		||||
                                                  m_selectedLayout,
 | 
			
		||||
                                                  m_selectedVariant,
 | 
			
		||||
                                                  xOrgConfFileName,
 | 
			
		||||
                                                  convertedKeymapPath );
 | 
			
		||||
                                                  convertedKeymapPath,
 | 
			
		||||
                                                  writeEtcDefaultKeyboard );
 | 
			
		||||
    list.append( Calamares::job_ptr( j ) );
 | 
			
		||||
 | 
			
		||||
    return list;
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,8 @@ public:
 | 
			
		||||
    QString prettyStatus() const;
 | 
			
		||||
 | 
			
		||||
    QList< Calamares::job_ptr > createJobs( const QString& xOrgConfFileName,
 | 
			
		||||
                                            const QString& convertedKeymapPath );
 | 
			
		||||
                                            const QString& convertedKeymapPath,
 | 
			
		||||
                                            bool writeEtcDefaultKeyboard );
 | 
			
		||||
 | 
			
		||||
    void onActivate();
 | 
			
		||||
    void finalize();
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ KeyboardViewStep::KeyboardViewStep( QObject* parent )
 | 
			
		||||
    : Calamares::ViewStep( parent )
 | 
			
		||||
    , m_widget( new KeyboardPage() )
 | 
			
		||||
    , m_nextEnabled( false )
 | 
			
		||||
    , m_writeEtcDefaultKeyboard( true )
 | 
			
		||||
{
 | 
			
		||||
    m_widget->init();
 | 
			
		||||
    m_nextEnabled = true;
 | 
			
		||||
@@ -123,7 +124,9 @@ void
 | 
			
		||||
KeyboardViewStep::onLeave()
 | 
			
		||||
{
 | 
			
		||||
    m_widget->finalize();
 | 
			
		||||
    m_jobs = m_widget->createJobs( m_xOrgConfFileName, m_convertedKeymapPath );
 | 
			
		||||
    m_jobs = m_widget->createJobs( m_xOrgConfFileName,
 | 
			
		||||
                                   m_convertedKeymapPath,
 | 
			
		||||
                                   m_writeEtcDefaultKeyboard );
 | 
			
		||||
    m_prettyStatus = m_widget->prettyStatus();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -157,4 +160,14 @@ KeyboardViewStep::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
    {
 | 
			
		||||
        m_convertedKeymapPath = QString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( configurationMap.contains( "writeEtcDefaultKeyboard" ) &&
 | 
			
		||||
         configurationMap.value( "writeEtcDefaultKeyboard" ).type() == QVariant::Bool )
 | 
			
		||||
    {
 | 
			
		||||
        m_writeEtcDefaultKeyboard = configurationMap.value( "writeEtcDefaultKeyboard" ).toBool();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_writeEtcDefaultKeyboard = true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    QString m_xOrgConfFileName;
 | 
			
		||||
    QString m_convertedKeymapPath;
 | 
			
		||||
    bool m_writeEtcDefaultKeyboard;
 | 
			
		||||
 | 
			
		||||
    QList< Calamares::job_ptr > m_jobs;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2014-2016, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2014, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   Portions from systemd (localed.c):
 | 
			
		||||
@@ -40,13 +40,15 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model,
 | 
			
		||||
                                            const QString& layout,
 | 
			
		||||
                                            const QString& variant,
 | 
			
		||||
                                            const QString& xOrgConfFileName,
 | 
			
		||||
                                            const QString& convertedKeymapPath )
 | 
			
		||||
                                            const QString& convertedKeymapPath,
 | 
			
		||||
                                            bool writeEtcDefaultKeyboard)
 | 
			
		||||
    : Calamares::Job()
 | 
			
		||||
    , m_model( model )
 | 
			
		||||
    , m_layout( layout )
 | 
			
		||||
    , m_variant( variant )
 | 
			
		||||
    , m_xOrgConfFileName( xOrgConfFileName )
 | 
			
		||||
    , m_convertedKeymapPath( convertedKeymapPath )
 | 
			
		||||
    , m_writeEtcDefaultKeyboard( writeEtcDefaultKeyboard )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -240,6 +242,34 @@ SetKeyboardLayoutJob::writeX11Data( const QString& keyboardConfPath ) const
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
SetKeyboardLayoutJob::writeDefaultKeyboardData( const QString& defaultKeyboardPath ) const
 | 
			
		||||
{
 | 
			
		||||
    QFile file( defaultKeyboardPath );
 | 
			
		||||
    file.open( QIODevice::WriteOnly | QIODevice::Text );
 | 
			
		||||
    QTextStream stream( &file );
 | 
			
		||||
 | 
			
		||||
    stream << "# KEYBOARD CONFIGURATION FILE\n\n"
 | 
			
		||||
              "# Consult the keyboard(5) manual page.\n\n";
 | 
			
		||||
 | 
			
		||||
    stream << "XKBMODEL=\"" << m_model << "\"\n";
 | 
			
		||||
    stream << "XKBLAYOUT=\"" << m_layout << "\"\n";
 | 
			
		||||
    stream << "XKBVARIANT=\"" << m_variant << "\"\n";
 | 
			
		||||
    stream << "XKBOPTIONS=\"\"\n\n";
 | 
			
		||||
    stream << "BACKSPACE=\"guess\"\n";
 | 
			
		||||
    stream.flush();
 | 
			
		||||
 | 
			
		||||
    file.close();
 | 
			
		||||
 | 
			
		||||
    cDebug() << "Written XKBMODEL" << m_model <<
 | 
			
		||||
                "; XKBLAYOUT" << m_layout <<
 | 
			
		||||
                "; XKBVARIANT" << m_variant <<
 | 
			
		||||
                "to /etc/default/keyboard file" << defaultKeyboardPath;
 | 
			
		||||
 | 
			
		||||
    return ( stream.status() == QTextStream::Ok );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Calamares::JobResult
 | 
			
		||||
SetKeyboardLayoutJob::exec()
 | 
			
		||||
{
 | 
			
		||||
@@ -271,6 +301,12 @@ SetKeyboardLayoutJob::exec()
 | 
			
		||||
    }
 | 
			
		||||
    destDir.mkpath( xorgConfDPath );
 | 
			
		||||
 | 
			
		||||
    QString defaultKeyboardPath;
 | 
			
		||||
    if ( QDir( destDir.absoluteFilePath( "etc/default" ) ).exists() )
 | 
			
		||||
    {
 | 
			
		||||
        defaultKeyboardPath = destDir.absoluteFilePath( "etc/default/keyboard" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Get the path to the destination's path to the converted key mappings
 | 
			
		||||
    QString convertedKeymapPath = m_convertedKeymapPath;
 | 
			
		||||
    if ( !convertedKeymapPath.isEmpty() )
 | 
			
		||||
@@ -288,5 +324,12 @@ SetKeyboardLayoutJob::exec()
 | 
			
		||||
        return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for X11." ),
 | 
			
		||||
                                            tr( "Failed to write to %1" ).arg( keyboardConfPath ) );
 | 
			
		||||
 | 
			
		||||
    if ( !defaultKeyboardPath.isEmpty() && m_writeEtcDefaultKeyboard )
 | 
			
		||||
    {
 | 
			
		||||
        if ( !writeDefaultKeyboardData( defaultKeyboardPath ) )
 | 
			
		||||
            return Calamares::JobResult::error( tr( "Failed to write keyboard configuration to existing /etc/default directory." ),
 | 
			
		||||
                                                tr( "Failed to write to %1" ).arg( keyboardConfPath ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Calamares::JobResult::ok();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2014-2016, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2014, Kevin Kofler <kevin.kofler@chello.at>
 | 
			
		||||
 *
 | 
			
		||||
 *   Calamares is free software: you can redistribute it and/or modify
 | 
			
		||||
@@ -31,7 +31,8 @@ public:
 | 
			
		||||
                          const QString& layout,
 | 
			
		||||
                          const QString& variant,
 | 
			
		||||
                          const QString& xOrgConfFileName,
 | 
			
		||||
                          const QString& convertedKeymapPath );
 | 
			
		||||
                          const QString& convertedKeymapPath,
 | 
			
		||||
                          bool writeEtcDefaultKeyboard );
 | 
			
		||||
 | 
			
		||||
    QString prettyName() const override;
 | 
			
		||||
    Calamares::JobResult exec() override;
 | 
			
		||||
@@ -41,13 +42,15 @@ private:
 | 
			
		||||
    QString findLegacyKeymap() const;
 | 
			
		||||
    bool writeVConsoleData( const QString& vconsoleConfPath,
 | 
			
		||||
                            const QString& convertedKeymapPath ) const;
 | 
			
		||||
    bool writeX11Data( const QString& keyboardConfPath  ) const;
 | 
			
		||||
    bool writeX11Data( const QString& keyboardConfPath ) const;
 | 
			
		||||
    bool writeDefaultKeyboardData( const QString& defaultKeyboardPath ) const;
 | 
			
		||||
 | 
			
		||||
    QString m_model;
 | 
			
		||||
    QString m_layout;
 | 
			
		||||
    QString m_variant;
 | 
			
		||||
    QString m_xOrgConfFileName;
 | 
			
		||||
    QString m_convertedKeymapPath;
 | 
			
		||||
    const bool m_writeEtcDefaultKeyboard;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* SETKEYBOARDLAYOUTJOB_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,12 @@
 | 
			
		||||
# The default value is the name used by upstream systemd-localed.
 | 
			
		||||
# Relative paths are assumed to be relative to /etc/X11/xorg.conf.d
 | 
			
		||||
xOrgConfFileName: "/etc/X11/xorg.conf.d/00-keyboard.conf"
 | 
			
		||||
 | 
			
		||||
# The path to search for keymaps converted from X11 to kbd format
 | 
			
		||||
# Leave this empty if the setting does not make sense on your distribution.
 | 
			
		||||
convertedKeymapPath: "/lib/kbd/keymaps/xkb"
 | 
			
		||||
 | 
			
		||||
# Write keymap configuration to /etc/default/keyboard, usually
 | 
			
		||||
# found on Debian-related systems.
 | 
			
		||||
# Defaults to true if nothing is set.
 | 
			
		||||
#writeEtcDefaultKeyboard:   true
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
 | 
			
		||||
        LicensePage.cpp
 | 
			
		||||
    UI
 | 
			
		||||
        LicensePage.ui
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,9 @@ calamares_add_plugin( locale
 | 
			
		||||
    UI
 | 
			
		||||
    RESOURCES
 | 
			
		||||
        locale.qrc
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
        Qt5::Network
 | 
			
		||||
        yaml-cpp
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,8 @@ LocaleConfiguration::fromLanguageAndLocation( const QString& languageLocale,
 | 
			
		||||
        // FIXME: this might be useless if we already filter out non-UTF8 locales
 | 
			
		||||
        foreach ( QString line, linesForLanguage )
 | 
			
		||||
        {
 | 
			
		||||
            if ( line.contains( "UTF-8" ) )
 | 
			
		||||
            if ( line.contains( "UTF-8", Qt::CaseInsensitive ) ||
 | 
			
		||||
                 line.contains( "utf8", Qt::CaseInsensitive ) )
 | 
			
		||||
                linesForLanguageUtf.append( line );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -365,7 +365,8 @@ LocalePage::init( const QString& initialRegion,
 | 
			
		||||
    // because it's not 1995.
 | 
			
		||||
    for ( auto it = m_localeGenLines.begin(); it != m_localeGenLines.end(); )
 | 
			
		||||
    {
 | 
			
		||||
        if ( !it->contains( "UTF-8", Qt::CaseInsensitive ) )
 | 
			
		||||
        if ( !it->contains( "UTF-8", Qt::CaseInsensitive ) &&
 | 
			
		||||
             !it->contains( "utf8", Qt::CaseInsensitive ) )
 | 
			
		||||
            it = m_localeGenLines.erase( it );
 | 
			
		||||
        else
 | 
			
		||||
            ++it;
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,8 @@ def run():
 | 
			
		||||
        if partition["mountPoint"] == "/" and "luksMapperName" in partition:
 | 
			
		||||
            luks_root_device = partition["device"]
 | 
			
		||||
            luks_root_passphrase = partition["luksPassphrase"]
 | 
			
		||||
        elif "luksMapperName" in partition:
 | 
			
		||||
        elif "luksMapperName" in partition and\
 | 
			
		||||
             (partition["mountPoint"] or partition["fs"] == "linuxswap"):
 | 
			
		||||
            additional_luks_devices.append((partition["device"],
 | 
			
		||||
                                            partition["luksPassphrase"]))
 | 
			
		||||
 | 
			
		||||
@@ -65,14 +66,16 @@ def run():
 | 
			
		||||
                           "luksAddKey",
 | 
			
		||||
                           luks_root_device,
 | 
			
		||||
                           "/crypto_keyfile.bin"],
 | 
			
		||||
                          luks_root_passphrase)
 | 
			
		||||
                          luks_root_passphrase,
 | 
			
		||||
                          15)  # timeout 15s
 | 
			
		||||
 | 
			
		||||
    for additional_device in additional_luks_devices:
 | 
			
		||||
        check_target_env_call(["cryptsetup",
 | 
			
		||||
                               "luksAddKey",
 | 
			
		||||
                               additional_device[0],
 | 
			
		||||
                               "/crypto_keyfile.bin"],
 | 
			
		||||
                              additional_device[1])
 | 
			
		||||
                              additional_device[1],
 | 
			
		||||
                              15)  # timeout 15s
 | 
			
		||||
 | 
			
		||||
    check_target_env_call(["chmod",
 | 
			
		||||
                           "g-rwx,o-rwx",
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
#   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
import tempfile
 | 
			
		||||
import subprocess
 | 
			
		||||
 | 
			
		||||
import libcalamares
 | 
			
		||||
 | 
			
		||||
@@ -55,6 +56,58 @@ def mount_partitions(root_mount_point, partitions):
 | 
			
		||||
                                     partition.get("options", ""),
 | 
			
		||||
                                     )
 | 
			
		||||
 | 
			
		||||
        # If the root partition is btrfs, we create a subvolume "@"
 | 
			
		||||
        # for the root mount point.
 | 
			
		||||
        # If a separate /home partition isn't defined, we also create
 | 
			
		||||
        # a subvolume "@home".
 | 
			
		||||
        # Finally we remount all of the above on the correct paths.
 | 
			
		||||
        if fstype == "btrfs" and partition["mountPoint"] == '/':
 | 
			
		||||
            has_home_mount_point = False
 | 
			
		||||
            for p in partitions:
 | 
			
		||||
                if "mountPoint" not in p or not p["mountPoint"]:
 | 
			
		||||
                    continue
 | 
			
		||||
                if p["mountPoint"] == "/home":
 | 
			
		||||
                    has_home_mount_point = True
 | 
			
		||||
                    break
 | 
			
		||||
 | 
			
		||||
            subprocess.check_call(['btrfs', 'subvolume', 'create',
 | 
			
		||||
                                   root_mount_point + '/@'])
 | 
			
		||||
 | 
			
		||||
            if not has_home_mount_point:
 | 
			
		||||
                subprocess.check_call(['btrfs', 'subvolume', 'create',
 | 
			
		||||
                                       root_mount_point + '/@home'])
 | 
			
		||||
 | 
			
		||||
            subprocess.check_call(["umount", "-v", root_mount_point])
 | 
			
		||||
 | 
			
		||||
            if "luksMapperName" in partition:
 | 
			
		||||
                libcalamares.utils.mount("/dev/mapper/{!s}".format(partition["luksMapperName"]),
 | 
			
		||||
                                         mount_point,
 | 
			
		||||
                                         fstype,
 | 
			
		||||
                                         ",".join(["subvol=@",
 | 
			
		||||
                                                   partition.get("options", "")]),
 | 
			
		||||
                                         )
 | 
			
		||||
                if not has_home_mount_point:
 | 
			
		||||
                    libcalamares.utils.mount("/dev/mapper/{!s}".format(partition["luksMapperName"]),
 | 
			
		||||
                                             root_mount_point + "/home",
 | 
			
		||||
                                             fstype,
 | 
			
		||||
                                             ",".join(["subvol=@home",
 | 
			
		||||
                                                       partition.get("options", "")]),
 | 
			
		||||
                                             )
 | 
			
		||||
            else:
 | 
			
		||||
                libcalamares.utils.mount(partition["device"],
 | 
			
		||||
                                         mount_point,
 | 
			
		||||
                                         fstype,
 | 
			
		||||
                                         ",".join(["subvol=@",
 | 
			
		||||
                                                   partition.get("options", "")]),
 | 
			
		||||
                                         )
 | 
			
		||||
                if not has_home_mount_point:
 | 
			
		||||
                    libcalamares.utils.mount(partition["device"],
 | 
			
		||||
                                             root_mount_point + "/home",
 | 
			
		||||
                                             fstype,
 | 
			
		||||
                                             ",".join(["subvol=@home",
 | 
			
		||||
                                                       partition.get("options", "")]),
 | 
			
		||||
                                             )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def run():
 | 
			
		||||
    """ Define mountpoints.
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,9 @@ extraMounts:
 | 
			
		||||
    - device: tmpfs
 | 
			
		||||
      fs: tmpfs
 | 
			
		||||
      mountPoint: /run
 | 
			
		||||
    - device: /run/udev
 | 
			
		||||
      mountPoint: /run/udev
 | 
			
		||||
      options: bind
 | 
			
		||||
 | 
			
		||||
extraMountsEfi:
 | 
			
		||||
    - device: efivarfs
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,9 @@ calamares_add_plugin( netinstall
 | 
			
		||||
        widgets/groupselectionwidget.ui
 | 
			
		||||
    RESOURCES
 | 
			
		||||
        netinstall.qrc
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
        Qt5::Network
 | 
			
		||||
        yaml-cpp
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,7 @@ NetInstallPage::dataIsHere( QNetworkReply* reply )
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        GroupSelectionWidget* groupWidget = new GroupSelectionWidget( group.name, group.description, group.packages, this );
 | 
			
		||||
        GroupSelectionWidget* groupWidget = new GroupSelectionWidget( group.name, group.description, group.packages, group.selected, this );
 | 
			
		||||
        m_groupWidgets.insert( groupKey, groupWidget );
 | 
			
		||||
        ui->groupswidget->layout()->addWidget( groupWidget );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
#include <QtDebug>
 | 
			
		||||
 | 
			
		||||
GroupSelectionWidget::GroupSelectionWidget( QString name, QString description, QStringList packages, QWidget* parent ) :
 | 
			
		||||
GroupSelectionWidget::GroupSelectionWidget( QString name, QString description, QStringList packages, bool selected, QWidget* parent ) :
 | 
			
		||||
    QWidget( parent ),
 | 
			
		||||
    m_isToggled( false )
 | 
			
		||||
{
 | 
			
		||||
@@ -29,6 +29,7 @@ GroupSelectionWidget::GroupSelectionWidget( QString name, QString description, Q
 | 
			
		||||
    connect( ui.group, &QCheckBox::toggled, this, &GroupSelectionWidget::toggleGroup );
 | 
			
		||||
 | 
			
		||||
    ui.group->setText( name );
 | 
			
		||||
    ui.group->setChecked( selected ); // also triggers the toggleGroup slot
 | 
			
		||||
    ui.description->setText( description );
 | 
			
		||||
    const int columns = 4;
 | 
			
		||||
    const int rows = ( packages.size() - 1 ) / columns + 1;
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ class GroupSelectionWidget : public QWidget
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
    explicit GroupSelectionWidget( QString name, QString description, QStringList packages, QWidget* parent = nullptr );
 | 
			
		||||
    explicit GroupSelectionWidget( QString name, QString description, QStringList packages, bool selected, QWidget* parent = nullptr );
 | 
			
		||||
 | 
			
		||||
    // Current status of the group: is it selected in the view?
 | 
			
		||||
    bool isToggled() const;
 | 
			
		||||
 
 | 
			
		||||
@@ -57,6 +57,10 @@ def run():
 | 
			
		||||
    source_resolv = "/etc/resolv.conf"
 | 
			
		||||
    target_resolv = os.path.join(root_mount_point, "etc/resolv.conf")
 | 
			
		||||
    if source_resolv != target_resolv and os.path.exists(source_resolv):
 | 
			
		||||
        try:
 | 
			
		||||
            os.remove(target_resolv)
 | 
			
		||||
        except FileNotFoundError:
 | 
			
		||||
            libcalamares.utils.debug("Couldn't remove {}".format(target_resolv))
 | 
			
		||||
        try:
 | 
			
		||||
            shutil.copy(source_resolv, target_resolv)
 | 
			
		||||
        except FileNotFoundError:
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@
 | 
			
		||||
#   You should have received a copy of the GNU General Public License
 | 
			
		||||
#   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
import subprocess
 | 
			
		||||
import libcalamares
 | 
			
		||||
from libcalamares.utils import check_target_env_call, target_env_call
 | 
			
		||||
 | 
			
		||||
@@ -91,6 +92,22 @@ class PackageManager:
 | 
			
		||||
        elif self.backend == "entropy":
 | 
			
		||||
            check_target_env_call(["equo", "rm"] + pkgs)
 | 
			
		||||
 | 
			
		||||
    def update_db(self):
 | 
			
		||||
        if self.backend == "packagekit":
 | 
			
		||||
            check_target_env_call(["pkcon", "refresh"])
 | 
			
		||||
        elif self.backend == "zypp":
 | 
			
		||||
            check_target_env_call(["zypper", "update"])
 | 
			
		||||
        elif self.backend == "urpmi":
 | 
			
		||||
            check_target_env_call(["urpmi.update", "-a"])
 | 
			
		||||
        elif self.backend == "apt":
 | 
			
		||||
            check_target_env_call(["apt-get", "update"])
 | 
			
		||||
        elif self.backend == "pacman":
 | 
			
		||||
            check_target_env_call(["pacman", "-Sy"])
 | 
			
		||||
        elif self.backend == "portage":
 | 
			
		||||
            check_target_env_call(["emerge", "--sync"])
 | 
			
		||||
        elif self.backend == "entropy":
 | 
			
		||||
            check_target_env_call(["equo", "update"])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def run_operations(pkgman, entry):
 | 
			
		||||
    """ Call package manager with given parameters.
 | 
			
		||||
@@ -101,8 +118,18 @@ def run_operations(pkgman, entry):
 | 
			
		||||
    for key in entry.keys():
 | 
			
		||||
        if key == "install":
 | 
			
		||||
            pkgman.install(entry[key])
 | 
			
		||||
        elif key == "try_install":
 | 
			
		||||
            try:
 | 
			
		||||
                pkgman.install(entry[key])
 | 
			
		||||
            except subprocess.CalledProcessError:
 | 
			
		||||
                libcalamares.utils.debug("WARNING: could not install packages {}".format(", ".join(entry[key])))
 | 
			
		||||
        elif key == "remove":
 | 
			
		||||
            pkgman.remove(entry[key])
 | 
			
		||||
        elif key == "try_remove":
 | 
			
		||||
            try:
 | 
			
		||||
                pkgman.remove(entry[key])
 | 
			
		||||
            except subprocess.CalledProcessError:
 | 
			
		||||
                libcalamares.utils.debug("WARNING: could not remove packages {}".format(", ".join(entry[key])))
 | 
			
		||||
        elif key == "localInstall":
 | 
			
		||||
            pkgman.install(entry[key], from_local=True)
 | 
			
		||||
 | 
			
		||||
@@ -121,6 +148,10 @@ def run():
 | 
			
		||||
    pkgman = PackageManager(backend)
 | 
			
		||||
    operations = libcalamares.job.configuration.get("operations", [])
 | 
			
		||||
 | 
			
		||||
    update_db = libcalamares.job.configuration.get("update_db", False)
 | 
			
		||||
    if update_db and libcalamares.globalstorage.value("hasInternet"):
 | 
			
		||||
        pkgman.update_db()
 | 
			
		||||
 | 
			
		||||
    for entry in operations:
 | 
			
		||||
        run_operations(pkgman, entry)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,9 @@
 | 
			
		||||
#  - entropy	 - Sabayon package manager
 | 
			
		||||
#
 | 
			
		||||
backend: packagekit
 | 
			
		||||
 | 
			
		||||
update_db: true
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# List of maps with package operations such as install or remove.
 | 
			
		||||
# Distro developers can provide a list of packages to remove
 | 
			
		||||
@@ -33,12 +36,12 @@ backend: packagekit
 | 
			
		||||
#  - remove:
 | 
			
		||||
#      - pkg3
 | 
			
		||||
#      - pkg4
 | 
			
		||||
#  - install:
 | 
			
		||||
#  - try_install:   # no system install failure if a package cannot be installed
 | 
			
		||||
#      - pkg5
 | 
			
		||||
#  - remove:
 | 
			
		||||
#  - try_remove:    # no system install failure if a package cannot be removed
 | 
			
		||||
#      - pkg2
 | 
			
		||||
#      - pkg1
 | 
			
		||||
#    install:
 | 
			
		||||
#  - install:
 | 
			
		||||
#      - pkgs6
 | 
			
		||||
#      - pkg7
 | 
			
		||||
#  - localInstall:
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,13 @@ find_package( KF5 REQUIRED CoreAddons )
 | 
			
		||||
find_package( KF5 REQUIRED Config I18n IconThemes KIO Service )
 | 
			
		||||
 | 
			
		||||
find_package( KPMcore 2.2 REQUIRED )
 | 
			
		||||
if(KPMcore_VERSION VERSION_LESS 3.0.0)
 | 
			
		||||
    set(WITH_KPMCORE3 OFF)
 | 
			
		||||
else()
 | 
			
		||||
    set(WITH_KPMCORE3 ON)
 | 
			
		||||
endif()
 | 
			
		||||
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/PartitionConfig.h.in
 | 
			
		||||
                ${CMAKE_CURRENT_BINARY_DIR}/PartitionConfig.h )
 | 
			
		||||
 | 
			
		||||
add_subdirectory( tests )
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +73,7 @@ calamares_add_plugin( partition
 | 
			
		||||
        gui/EncryptWidget.ui
 | 
			
		||||
        gui/PartitionPage.ui
 | 
			
		||||
        gui/ReplaceWidget.ui
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        kpmcore
 | 
			
		||||
        calamaresui
 | 
			
		||||
        KF5::CoreAddons
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								src/modules/partition/PartitionConfig.h.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/modules/partition/PartitionConfig.h.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
#ifndef CALAMARESPARTITIONCONFIG_H
 | 
			
		||||
#define CALAMARESPARTITIONCONFIG_H
 | 
			
		||||
 | 
			
		||||
#cmakedefine WITH_KPMCORE3
 | 
			
		||||
 | 
			
		||||
#endif // CALAMARESPARTITIONCONFIG_H
 | 
			
		||||
@@ -151,6 +151,12 @@ createNewEncryptedPartition( PartitionNode* parent,
 | 
			
		||||
                           FileSystemFactory::create( FileSystem::Luks,
 | 
			
		||||
                                                      firstSector,
 | 
			
		||||
                                                      lastSector ) );
 | 
			
		||||
    if ( !fs )
 | 
			
		||||
    {
 | 
			
		||||
        qDebug() << "ERROR: cannot create LUKS filesystem. Giving up.";
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fs->createInnerFileSystem( fsType );
 | 
			
		||||
    fs->setPassphrase( passphrase );
 | 
			
		||||
    Partition* p = new Partition( parent,
 | 
			
		||||
 
 | 
			
		||||
@@ -51,8 +51,9 @@ canBeReplaced( Partition* candidate )
 | 
			
		||||
    qint64 requiredStorageB = ( requiredStorageGB + 0.5 ) * 1024 * 1024 * 1024;
 | 
			
		||||
    cDebug() << "Required  storage B:" << requiredStorageB
 | 
			
		||||
             << QString( "(%1GB)" ).arg( requiredStorageB / 1024 / 1024 / 1024 );
 | 
			
		||||
    cDebug() << "Available storage B:" << availableStorageB
 | 
			
		||||
             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 );
 | 
			
		||||
    cDebug() << "Storage capacity  B:" << availableStorageB
 | 
			
		||||
             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 )
 | 
			
		||||
             << "for" << candidate->partitionPath() << "   length:" << candidate->length();
 | 
			
		||||
 | 
			
		||||
    if ( ok &&
 | 
			
		||||
         availableStorageB > requiredStorageB )
 | 
			
		||||
@@ -102,7 +103,9 @@ canBeResized( Partition* candidate )
 | 
			
		||||
    cDebug() << "Required  storage B:" << requiredStorageB
 | 
			
		||||
             << QString( "(%1GB)" ).arg( requiredStorageB / 1024 / 1024 / 1024 );
 | 
			
		||||
    cDebug() << "Available storage B:" << availableStorageB
 | 
			
		||||
             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 );
 | 
			
		||||
             << QString( "(%1GB)" ).arg( availableStorageB / 1024 / 1024 / 1024 )
 | 
			
		||||
             << "for" << candidate->partitionPath() << "   length:" << candidate->length()
 | 
			
		||||
             << "   sectorsUsed:" << candidate->sectorsUsed() << "   fsType:" << candidate->fileSystem().name();
 | 
			
		||||
 | 
			
		||||
    if ( ok &&
 | 
			
		||||
         availableStorageB > requiredStorageB )
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014-2016, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2014-2017, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *
 | 
			
		||||
 *   Calamares is free software: you can redistribute it and/or modify
 | 
			
		||||
 *   it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -26,6 +26,7 @@
 | 
			
		||||
#include "JobQueue.h"
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
#include "GlobalStorage.h"
 | 
			
		||||
#include "PartitionConfig.h"
 | 
			
		||||
 | 
			
		||||
#include <kpmcore/core/device.h>
 | 
			
		||||
#include <kpmcore/core/partition.h>
 | 
			
		||||
@@ -128,11 +129,19 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
 | 
			
		||||
        empty_space_size = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
    qint64 firstFreeSector = empty_space_size MiB / dev->logicalSize() + 1;
 | 
			
		||||
#else
 | 
			
		||||
    qint64 firstFreeSector = empty_space_size MiB / dev->logicalSectorSize() + 1;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if ( isEfi )
 | 
			
		||||
    {
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
        qint64 lastSector = firstFreeSector + ( uefisys_part_size MiB / dev->logicalSize() );
 | 
			
		||||
#else
 | 
			
		||||
        qint64 lastSector = firstFreeSector + ( uefisys_part_size MiB / dev->logicalSectorSize() );
 | 
			
		||||
#endif
 | 
			
		||||
        core->createPartitionTable( dev, PartitionTable::gpt );
 | 
			
		||||
        Partition* efiPartition = KPMHelpers::createNewPartition(
 | 
			
		||||
            dev->partitionTable(),
 | 
			
		||||
@@ -140,14 +149,15 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
 | 
			
		||||
            PartitionRole( PartitionRole::Primary ),
 | 
			
		||||
            FileSystem::Fat32,
 | 
			
		||||
            firstFreeSector,
 | 
			
		||||
            lastSector
 | 
			
		||||
            lastSector,
 | 
			
		||||
            PartitionTable::FlagEsp
 | 
			
		||||
        );
 | 
			
		||||
        PartitionInfo::setFormat( efiPartition, true );
 | 
			
		||||
        PartitionInfo::setMountPoint( efiPartition, Calamares::JobQueue::instance()
 | 
			
		||||
                                                        ->globalStorage()
 | 
			
		||||
                                                        ->value( "efiSystemPartition" )
 | 
			
		||||
                                                        .toString() );
 | 
			
		||||
        core->createPartition( dev, efiPartition );
 | 
			
		||||
        core->createPartition( dev, efiPartition, PartitionTable::FlagEsp | PartitionTable::FlagBoot );
 | 
			
		||||
        firstFreeSector = lastSector + 1;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
@@ -156,7 +166,11 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool shouldCreateSwap = false;
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
    qint64 availableSpaceB = ( dev->totalLogical() - firstFreeSector ) * dev->logicalSize();
 | 
			
		||||
#else
 | 
			
		||||
    qint64 availableSpaceB = ( dev->totalSectors() - firstFreeSector ) * dev->logicalSectorSize();
 | 
			
		||||
#endif
 | 
			
		||||
    qint64 suggestedSwapSizeB = swapSuggestion( availableSpaceB );
 | 
			
		||||
    qint64 requiredSpaceB =
 | 
			
		||||
            ( Calamares::JobQueue::instance()->
 | 
			
		||||
@@ -167,11 +181,19 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
 | 
			
		||||
    // If there is enough room for ESP + root + swap, create swap, otherwise don't.
 | 
			
		||||
    shouldCreateSwap = availableSpaceB > requiredSpaceB;
 | 
			
		||||
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
    qint64 lastSectorForRoot = dev->totalLogical() - 1; //last sector of the device
 | 
			
		||||
    if ( shouldCreateSwap )
 | 
			
		||||
    {
 | 
			
		||||
        lastSectorForRoot -= suggestedSwapSizeB / dev->logicalSize() + 1;
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
    qint64 lastSectorForRoot = dev->totalSectors() - 1; //last sector of the device
 | 
			
		||||
    if ( shouldCreateSwap )
 | 
			
		||||
    {
 | 
			
		||||
        lastSectorForRoot -= suggestedSwapSizeB / dev->logicalSectorSize() + 1;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    Partition* rootPartition = nullptr;
 | 
			
		||||
    if ( luksPassphrase.isEmpty() )
 | 
			
		||||
@@ -212,7 +234,11 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
 | 
			
		||||
                PartitionRole( PartitionRole::Primary ),
 | 
			
		||||
                FileSystem::LinuxSwap,
 | 
			
		||||
                lastSectorForRoot + 1,
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
                dev->totalLogical() - 1
 | 
			
		||||
#else
 | 
			
		||||
                dev->totalSectors() - 1
 | 
			
		||||
#endif
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
@@ -223,7 +249,11 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass
 | 
			
		||||
                PartitionRole( PartitionRole::Primary ),
 | 
			
		||||
                FileSystem::LinuxSwap,
 | 
			
		||||
                lastSectorForRoot + 1,
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
                dev->totalLogical() - 1,
 | 
			
		||||
#else
 | 
			
		||||
                dev->totalSectors() - 1,
 | 
			
		||||
#endif
 | 
			
		||||
                luksPassphrase
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -547,29 +547,14 @@ PartitionCoreModule::scanForEfiSystemPartitions()
 | 
			
		||||
        devices.append( device );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //FIXME: Unfortunately right now we have to call sgdisk manually because
 | 
			
		||||
    //       the KPM submodule does not expose the ESP flag from libparted.
 | 
			
		||||
    //       The following findPartitions call and lambda should be scrapped and
 | 
			
		||||
    //       rewritten based on libKPM.     -- Teo 5/2015
 | 
			
		||||
    QList< Partition* > efiSystemPartitions =
 | 
			
		||||
        KPMHelpers::findPartitions( devices,
 | 
			
		||||
                                 []( Partition* partition ) -> bool
 | 
			
		||||
    {
 | 
			
		||||
        QProcess process;
 | 
			
		||||
        process.setProgram( "sgdisk" );
 | 
			
		||||
        process.setArguments( { "-i",
 | 
			
		||||
                                QString::number( partition->number() ),
 | 
			
		||||
                                partition->devicePath() } );
 | 
			
		||||
        process.setProcessChannelMode( QProcess::MergedChannels );
 | 
			
		||||
        process.start();
 | 
			
		||||
        if ( process.waitForFinished() )
 | 
			
		||||
        if ( partition->activeFlags().testFlag( PartitionTable::FlagEsp ) )
 | 
			
		||||
        {
 | 
			
		||||
            if ( process.readAllStandardOutput()
 | 
			
		||||
                    .contains( "C12A7328-F81F-11D2-BA4B-00A0C93EC93B" ) )
 | 
			
		||||
            {
 | 
			
		||||
                cDebug() << "Found EFI system partition at" << partition->partitionPath();
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            cDebug() << "Found EFI system partition at" << partition->partitionPath();
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    } );
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@
 | 
			
		||||
#include "core/PartitionInfo.h"
 | 
			
		||||
#include "core/KPMHelpers.h"
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
#include "PartitionConfig.h"
 | 
			
		||||
 | 
			
		||||
// CalaPM
 | 
			
		||||
#include <kpmcore/core/device.h>
 | 
			
		||||
@@ -148,7 +149,11 @@ PartitionModel::data( const QModelIndex& index, int role ) const
 | 
			
		||||
            return PartitionInfo::mountPoint( partition );
 | 
			
		||||
        if ( col == SizeColumn )
 | 
			
		||||
        {
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
            qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
 | 
			
		||||
#else
 | 
			
		||||
            qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSectorSize();
 | 
			
		||||
#endif
 | 
			
		||||
            return KFormat().formatByteSize( size );
 | 
			
		||||
        }
 | 
			
		||||
        cDebug() << "Unknown column" << col;
 | 
			
		||||
@@ -175,12 +180,20 @@ PartitionModel::data( const QModelIndex& index, int role ) const
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        QString prettyFileSystem = KPMHelpers::prettyNameForFileSystemType( partition->fileSystem().type() );
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
        qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
 | 
			
		||||
#else
 | 
			
		||||
        qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSectorSize();
 | 
			
		||||
#endif
 | 
			
		||||
        QString prettySize = KFormat().formatByteSize( size );
 | 
			
		||||
        return QVariant(name + " " + prettyFileSystem + " " + prettySize);
 | 
			
		||||
    }
 | 
			
		||||
    case SizeRole:
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
        return ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
 | 
			
		||||
#else
 | 
			
		||||
        return ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSectorSize();
 | 
			
		||||
#endif
 | 
			
		||||
    case IsFreeSpaceRole:
 | 
			
		||||
        return KPMHelpers::isPartitionFreeSpace( partition );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@
 | 
			
		||||
#include "BootInfoWidget.h"
 | 
			
		||||
#include "DeviceInfoWidget.h"
 | 
			
		||||
#include "ScanningDialog.h"
 | 
			
		||||
#include "PartitionConfig.h"
 | 
			
		||||
 | 
			
		||||
#include "utils/CalamaresUtilsGui.h"
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
@@ -82,12 +83,16 @@ ChoicePage::ChoicePage( QWidget* parent )
 | 
			
		||||
    , m_beforePartitionLabelsView( nullptr )
 | 
			
		||||
    , m_bootloaderComboBox( nullptr )
 | 
			
		||||
    , m_lastSelectedDeviceIndex( -1 )
 | 
			
		||||
    , m_enableEncryptionWidget( true )
 | 
			
		||||
{
 | 
			
		||||
    setupUi( this );
 | 
			
		||||
 | 
			
		||||
    m_defaultFsType = Calamares::JobQueue::instance()->
 | 
			
		||||
                        globalStorage()->
 | 
			
		||||
                        value( "defaultFileSystemType" ).toString();
 | 
			
		||||
    m_enableEncryptionWidget = Calamares::JobQueue::instance()->
 | 
			
		||||
                               globalStorage()->
 | 
			
		||||
                               value( "enableLuksAutomatedPartitioning" ).toBool();
 | 
			
		||||
    if ( FileSystem::typeForName( m_defaultFsType ) == FileSystem::Unknown )
 | 
			
		||||
        m_defaultFsType = "ext4";
 | 
			
		||||
 | 
			
		||||
@@ -590,7 +595,11 @@ ChoicePage::doAlongsideApply()
 | 
			
		||||
            qint64 oldLastSector = candidate->lastSector();
 | 
			
		||||
            qint64 newLastSector = firstSector +
 | 
			
		||||
                                   m_afterPartitionSplitterWidget->splitPartitionSize() /
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
                                   dev->logicalSize();
 | 
			
		||||
#else
 | 
			
		||||
                                   dev->logicalSectorSize();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            m_core->resizePartition( dev, candidate, firstSector, newLastSector );
 | 
			
		||||
            Partition* newPartition = nullptr;
 | 
			
		||||
@@ -884,7 +893,8 @@ ChoicePage::updateActionChoicePreview( ChoicePage::Choice choice )
 | 
			
		||||
    {
 | 
			
		||||
    case Alongside:
 | 
			
		||||
        {
 | 
			
		||||
            m_encryptWidget->show();
 | 
			
		||||
            if ( m_enableEncryptionWidget )
 | 
			
		||||
                m_encryptWidget->show();
 | 
			
		||||
            m_previewBeforeLabel->setText( tr( "Current:" ) );
 | 
			
		||||
            m_selectLabel->setText( tr( "<strong>Select a partition to shrink, "
 | 
			
		||||
                                        "then drag the bottom bar to resize</strong>" ) );
 | 
			
		||||
@@ -930,7 +940,8 @@ ChoicePage::updateActionChoicePreview( ChoicePage::Choice choice )
 | 
			
		||||
    case Erase:
 | 
			
		||||
    case Replace:
 | 
			
		||||
        {
 | 
			
		||||
            m_encryptWidget->show();
 | 
			
		||||
            if ( m_enableEncryptionWidget )
 | 
			
		||||
                m_encryptWidget->show();
 | 
			
		||||
            m_previewBeforeLabel->setText( tr( "Current:" ) );
 | 
			
		||||
            m_afterPartitionBarsView = new PartitionBarsView( m_previewAfterFrame );
 | 
			
		||||
            m_afterPartitionBarsView->setNestedPartitionsMode( mode );
 | 
			
		||||
@@ -1100,7 +1111,7 @@ ChoicePage::createBootloaderComboBox( QWidget* parent )
 | 
			
		||||
 | 
			
		||||
    // When the chosen bootloader device changes, we update the choice in the PCM
 | 
			
		||||
    connect( bcb, static_cast< void (QComboBox::*)(int) >( &QComboBox::currentIndexChanged ),
 | 
			
		||||
             [this]( int newIndex )
 | 
			
		||||
             this, [this]( int newIndex )
 | 
			
		||||
    {
 | 
			
		||||
        QComboBox* bcb = qobject_cast< QComboBox* >( sender() );
 | 
			
		||||
        if ( bcb )
 | 
			
		||||
 
 | 
			
		||||
@@ -123,6 +123,7 @@ private:
 | 
			
		||||
    int m_lastSelectedDeviceIndex;
 | 
			
		||||
 | 
			
		||||
    QString m_defaultFsType;
 | 
			
		||||
    bool m_enableEncryptionWidget;
 | 
			
		||||
 | 
			
		||||
    QMutex m_coreMutex;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
 | 
			
		||||
#include <core/PartitionModel.h>
 | 
			
		||||
#include <core/ColorUtils.h>
 | 
			
		||||
#include "PartitionConfig.h"
 | 
			
		||||
 | 
			
		||||
#include <utils/CalamaresUtilsGui.h>
 | 
			
		||||
#include <utils/Logger.h>
 | 
			
		||||
@@ -47,7 +48,11 @@ QStringList
 | 
			
		||||
buildUnknownDisklabelTexts( Device* dev )
 | 
			
		||||
{
 | 
			
		||||
    QStringList texts = { QObject::tr( "Unpartitioned space or unknown partition table" ),
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
                          KFormat().formatByteSize( dev->totalLogical() * dev->logicalSize() ) };
 | 
			
		||||
#else
 | 
			
		||||
                          KFormat().formatByteSize( dev->totalSectors() * dev->logicalSectorSize() ) };
 | 
			
		||||
#endif
 | 
			
		||||
    return texts;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
 | 
			
		||||
#include "core/ColorUtils.h"
 | 
			
		||||
#include "core/KPMHelpers.h"
 | 
			
		||||
#include "PartitionConfig.h"
 | 
			
		||||
 | 
			
		||||
// Qt
 | 
			
		||||
#include <QSpinBox>
 | 
			
		||||
@@ -135,7 +136,11 @@ PartitionSizeController::updatePartResizerWidget()
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    m_updating = true;
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
    qint64 sectorSize = qint64( m_spinBox->value() ) * 1024 * 1024 / m_device->logicalSize();
 | 
			
		||||
#else
 | 
			
		||||
    qint64 sectorSize = qint64( m_spinBox->value() ) * 1024 * 1024 / m_device->logicalSectorSize();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    qint64 firstSector = m_partition->firstSector();
 | 
			
		||||
    qint64 lastSector = firstSector + sectorSize - 1;
 | 
			
		||||
@@ -185,7 +190,11 @@ PartitionSizeController::doUpdateSpinBox()
 | 
			
		||||
{
 | 
			
		||||
    if ( !m_spinBox )
 | 
			
		||||
        return;
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
    qint64 mbSize = m_partition->length() * m_device->logicalSize() / 1024 / 1024;
 | 
			
		||||
#else
 | 
			
		||||
    qint64 mbSize = m_partition->length() * m_device->logicalSectorSize() / 1024 / 1024;
 | 
			
		||||
#endif
 | 
			
		||||
    m_spinBox->setValue( mbSize );
 | 
			
		||||
    if ( m_currentSpinBoxValue != -1 &&    //if it's not the first time we're setting it
 | 
			
		||||
         m_currentSpinBoxValue != mbSize ) //and the operation changes the SB value
 | 
			
		||||
 
 | 
			
		||||
@@ -250,6 +250,8 @@ PartitionViewStep::createSummaryWidget() const
 | 
			
		||||
        previewLabels->setModel( info.partitionModelAfter );
 | 
			
		||||
        preview->setSelectionMode( QAbstractItemView::NoSelection );
 | 
			
		||||
        previewLabels->setSelectionMode( QAbstractItemView::NoSelection );
 | 
			
		||||
        previewLabels->setCustomNewRootLabel( Calamares::Branding::instance()->
 | 
			
		||||
                                              string( Calamares::Branding::BootloaderEntryName ) );
 | 
			
		||||
        info.partitionModelAfter->setParent( widget );
 | 
			
		||||
        field = new QVBoxLayout;
 | 
			
		||||
        CalamaresUtils::unmarginLayout( field );
 | 
			
		||||
@@ -435,7 +437,39 @@ PartitionViewStep::onLeave()
 | 
			
		||||
                QMessageBox::warning( m_manualPartitionPage,
 | 
			
		||||
                                      message,
 | 
			
		||||
                                      description );
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Partition* root_p = m_core->findPartitionByMountPoint( "/" );
 | 
			
		||||
        Partition* boot_p = m_core->findPartitionByMountPoint( "/boot" );
 | 
			
		||||
 | 
			
		||||
        if ( root_p and boot_p )
 | 
			
		||||
        {
 | 
			
		||||
            QString message;
 | 
			
		||||
            QString description;
 | 
			
		||||
 | 
			
		||||
            // If the root partition is encrypted, and there's a separate boot
 | 
			
		||||
            // partition which is not encrypted
 | 
			
		||||
            if ( root_p->fileSystem().type() == FileSystem::Luks &&
 | 
			
		||||
                 boot_p->fileSystem().type() != FileSystem::Luks )
 | 
			
		||||
            {
 | 
			
		||||
                message = tr( "Boot partition not encrypted" );
 | 
			
		||||
                description = tr( "A separate boot partition was set up together with "
 | 
			
		||||
                                  "an encrypted root partition, but the boot partition "
 | 
			
		||||
                                  "is not encrypted."
 | 
			
		||||
                                  "<br/><br/>"
 | 
			
		||||
                                  "There are security concerns with this kind of "
 | 
			
		||||
                                  "setup, because important system files are kept "
 | 
			
		||||
                                  "on an unencrypted partition.<br/>"
 | 
			
		||||
                                  "You may continue if you wish, but filesystem "
 | 
			
		||||
                                  "unlocking will happen later during system startup."
 | 
			
		||||
                                  "<br/>To encrypt the boot partition, go back and "
 | 
			
		||||
                                  "recreate it, selecting <strong>Encrypt</strong> "
 | 
			
		||||
                                  "in the partition creation window." );
 | 
			
		||||
 | 
			
		||||
                QMessageBox::warning( m_manualPartitionPage,
 | 
			
		||||
                                      message,
 | 
			
		||||
                                      description );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -508,6 +542,17 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
        gs->insert( "defaultFileSystemType", QStringLiteral( "ext4" ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( configurationMap.contains( "enableLuksAutomatedPartitioning" ) &&
 | 
			
		||||
         configurationMap.value( "enableLuksAutomatedPartitioning" ).type() == QVariant::Bool )
 | 
			
		||||
    {
 | 
			
		||||
        gs->insert( "enableLuksAutomatedPartitioning",
 | 
			
		||||
                    configurationMap.value( "enableLuksAutomatedPartitioning" ).toBool() );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        gs->insert( "enableLuksAutomatedPartitioning", true );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Now that we have the config, we load the PartitionCoreModule in the background
 | 
			
		||||
    // because it could take a while. Then when it's done, we can set up the widgets
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@
 | 
			
		||||
#include "core/KPMHelpers.h"
 | 
			
		||||
#include "Branding.h"
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
#include "PartitionConfig.h"
 | 
			
		||||
 | 
			
		||||
// CalaPM
 | 
			
		||||
#include <kpmcore/core/device.h>
 | 
			
		||||
@@ -98,7 +99,11 @@ mapForPartition( Partition* partition, const QString& uuid )
 | 
			
		||||
        const FS::luks* luksFs = dynamic_cast< const FS::luks* >( &fsRef );
 | 
			
		||||
        if ( luksFs )
 | 
			
		||||
        {
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
            map[ "luksMapperName" ] = luksFs->mapperName().split( "/" ).last();
 | 
			
		||||
#else
 | 
			
		||||
            map[ "luksMapperName" ] = luksFs->mapperName( partition->partitionPath() ).split( "/" ).last();
 | 
			
		||||
#endif
 | 
			
		||||
            map[ "luksUuid" ] = getLuksUuid( partition->partitionPath() );
 | 
			
		||||
            map[ "luksPassphrase" ] = luksFs->passphrase();
 | 
			
		||||
            cDebug() << "luksMapperName:" << map[ "luksMapperName" ];
 | 
			
		||||
 
 | 
			
		||||
@@ -44,6 +44,7 @@
 | 
			
		||||
#include "jobs/CheckFileSystemJob.h"
 | 
			
		||||
#include "jobs/MoveFileSystemJob.h"
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
#include "PartitionConfig.h"
 | 
			
		||||
 | 
			
		||||
// KPMcore
 | 
			
		||||
#include <kpmcore/backend/corebackend.h>
 | 
			
		||||
@@ -93,7 +94,11 @@ public:
 | 
			
		||||
            break;
 | 
			
		||||
        case FileSystem::cmdSupportFileSystem:
 | 
			
		||||
        {
 | 
			
		||||
#ifdef WITH_KPMCORE3
 | 
			
		||||
            qint64 byteLength = m_device->logicalSize() * m_length;
 | 
			
		||||
#else
 | 
			
		||||
            qint64 byteLength = m_device->logicalSectorSize() * m_length;
 | 
			
		||||
#endif
 | 
			
		||||
            bool ok = fs.resize( report, m_partition->partitionPath(), byteLength );
 | 
			
		||||
            if ( !ok )
 | 
			
		||||
                return Calamares::JobResult::error(
 | 
			
		||||
 
 | 
			
		||||
@@ -18,3 +18,23 @@ alwaysShowPartitionLabels: true
 | 
			
		||||
# Suggested values: ext2, ext3, ext4, reiser, xfs, jfs, btrfs
 | 
			
		||||
# If nothing is specified, Calamares defaults to "ext4".
 | 
			
		||||
defaultFileSystemType:  "ext4"
 | 
			
		||||
 | 
			
		||||
# Show/hide LUKS related functionality in automated partitioning modes.
 | 
			
		||||
# Disable this if you choose not to deploy early unlocking support in GRUB2
 | 
			
		||||
# and/or your distribution's initramfs solution.
 | 
			
		||||
#
 | 
			
		||||
# BIG FAT WARNING:
 | 
			
		||||
# This option is unsupported, as it cuts out a crucial security feature.
 | 
			
		||||
# Disabling LUKS and shipping Calamares without a correctly configured GRUB2
 | 
			
		||||
# and initramfs is considered suboptimal use of the Calamares software. The
 | 
			
		||||
# Calamares team will not provide user support for any potential issue that
 | 
			
		||||
# may arise as a consequence of setting this option to false.
 | 
			
		||||
# It is strongly recommended that system integrators put in the work to support
 | 
			
		||||
# LUKS unlocking support in GRUB2 and initramfs/dracut/mkinitcpio/etc.
 | 
			
		||||
# Support is offered to system integrators that wish to do so, through the
 | 
			
		||||
# Calamares bug tracker, as well as in #calamares on Freenode.
 | 
			
		||||
# For more information on setting up GRUB2 for Calamares with LUKS, see
 | 
			
		||||
# https://github.com/calamares/calamares/wiki/LUKS-Deployment
 | 
			
		||||
#
 | 
			
		||||
# If nothing is specified, LUKS is enabled in automated modes.
 | 
			
		||||
#enableLuksAutomatedPartitioning:    true
 | 
			
		||||
 
 | 
			
		||||
@@ -15,3 +15,6 @@ targets:
 | 
			
		||||
disable:
 | 
			
		||||
  - name: "pacman-init"
 | 
			
		||||
    mandatory: false
 | 
			
		||||
 | 
			
		||||
# Example to express an empty list:
 | 
			
		||||
# disable: []
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ calamares_add_plugin( summary
 | 
			
		||||
        SummaryViewStep.cpp
 | 
			
		||||
        SummaryPage.cpp
 | 
			
		||||
    UI
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -119,7 +119,18 @@ def file_copy(source, dest, progress_cb):
 | 
			
		||||
 | 
			
		||||
    process.wait()
 | 
			
		||||
 | 
			
		||||
    if process.returncode != 0:
 | 
			
		||||
    # 23 is the return code rsync returns if it cannot write extended attributes
 | 
			
		||||
    # (with -X) because the target file system does not support it, e.g., the
 | 
			
		||||
    # FAT EFI system partition. We need -X because distributions using file
 | 
			
		||||
    # system capabilities and/or SELinux require the extended attributes. But
 | 
			
		||||
    # distributions using SELinux may also have SELinux labels set on files
 | 
			
		||||
    # under /boot/efi, and rsync complains about those. The only clean way would
 | 
			
		||||
    # be to split the rsync into one with -X and --exclude /boot/efi and a
 | 
			
		||||
    # separate one without -X for /boot/efi, but only if /boot/efi is actually
 | 
			
		||||
    # an EFI system partition. For now, this hack will have to do. See also:
 | 
			
		||||
    # https://bugzilla.redhat.com/show_bug.cgi?id=868755#c50
 | 
			
		||||
    # for the same issue in Anaconda, which uses a similar workaround.
 | 
			
		||||
    if process.returncode != 0 and process.returncode != 23:
 | 
			
		||||
        return "rsync failed with error code {}.".format(process.returncode)
 | 
			
		||||
 | 
			
		||||
    return None
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ calamares_add_plugin( users
 | 
			
		||||
        page_usersetup.ui
 | 
			
		||||
    RESOURCES
 | 
			
		||||
        users.qrc
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
        ${CRYPT_LIBRARIES}
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
 
 | 
			
		||||
@@ -153,8 +153,8 @@ CreateUserJob::exec()
 | 
			
		||||
                              "-s",
 | 
			
		||||
                              "/bin/bash",
 | 
			
		||||
                              "-U",
 | 
			
		||||
                              "-G",
 | 
			
		||||
                              defaultGroups,
 | 
			
		||||
                              "-c",
 | 
			
		||||
                              m_fullName,
 | 
			
		||||
                              m_userName } );
 | 
			
		||||
    if ( ec )
 | 
			
		||||
        return Calamares::JobResult::error( tr( "Cannot create user %1." )
 | 
			
		||||
@@ -162,11 +162,16 @@ CreateUserJob::exec()
 | 
			
		||||
                                            tr( "useradd terminated with error code %1." )
 | 
			
		||||
                                                .arg( ec ) );
 | 
			
		||||
 | 
			
		||||
    ec = CalamaresUtils::System::instance()->targetEnvCall( { "chfn", "-f", m_fullName, m_userName } );
 | 
			
		||||
    ec = CalamaresUtils::System::instance()->
 | 
			
		||||
             targetEnvCall( { "usermod",
 | 
			
		||||
                              "-aG",
 | 
			
		||||
                              defaultGroups,
 | 
			
		||||
                              m_userName } );
 | 
			
		||||
    if ( ec )
 | 
			
		||||
        return Calamares::JobResult::error( tr( "Cannot set full name for user %1." )
 | 
			
		||||
                                                .arg( m_userName ),
 | 
			
		||||
                                            tr( "chfn terminated with error code %1." )
 | 
			
		||||
        return Calamares::JobResult::error( tr( "Cannot add user %1 to groups: %2." )
 | 
			
		||||
                                                .arg( m_userName )
 | 
			
		||||
                                                .arg( defaultGroups ),
 | 
			
		||||
                                            tr( "usermod terminated with error code %1." )
 | 
			
		||||
                                                .arg( ec ) );
 | 
			
		||||
 | 
			
		||||
    ec = CalamaresUtils::System::instance()->
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014-2015, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2014-2017, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *
 | 
			
		||||
 *   Calamares is free software: you can redistribute it and/or modify
 | 
			
		||||
 *   it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -59,6 +59,20 @@ SetPasswordJob::exec()
 | 
			
		||||
        return Calamares::JobResult::error( tr( "Bad destination system path." ),
 | 
			
		||||
                                            tr( "rootMountPoint is %1" ).arg( destDir.absolutePath() ) );
 | 
			
		||||
 | 
			
		||||
    if ( m_userName == "root" &&
 | 
			
		||||
         m_newPassword.isEmpty() ) //special case for disabling root account
 | 
			
		||||
    {
 | 
			
		||||
        int ec = CalamaresUtils::System::instance()->
 | 
			
		||||
                 targetEnvCall( { "passwd",
 | 
			
		||||
                                  "-dl",
 | 
			
		||||
                                  m_userName } );
 | 
			
		||||
        if ( ec )
 | 
			
		||||
            return Calamares::JobResult::error( tr( "Cannot disable root account." ),
 | 
			
		||||
                                                tr( "passwd terminated with error code %1." )
 | 
			
		||||
                                                    .arg( ec ) );
 | 
			
		||||
        return Calamares::JobResult::ok();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QString encrypted = QString::fromLatin1(
 | 
			
		||||
                            crypt( m_newPassword.toLatin1(),
 | 
			
		||||
                                   QString( "$6$%1$" )
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2014-2015, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *   Copyright 2014-2017, Teo Mrnjavac <teo@kde.org>
 | 
			
		||||
 *
 | 
			
		||||
 *   Portions from the Manjaro Installation Framework
 | 
			
		||||
 *   by Roland Singer <roland@manjaro.org>
 | 
			
		||||
@@ -138,6 +138,12 @@ UsersPage::createJobs( const QStringList& defaultGroupsList )
 | 
			
		||||
                                    ui->textBoxRootPassword->text() );
 | 
			
		||||
        list.append( Calamares::job_ptr( j ) );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        j = new SetPasswordJob( "root",
 | 
			
		||||
                                "" ); //explicitly disable root password
 | 
			
		||||
        list.append( Calamares::job_ptr( j ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    j = new SetHostNameJob( ui->textBoxHostname->text() );
 | 
			
		||||
    list.append( Calamares::job_ptr( j ) );
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ calamares_add_plugin( webview
 | 
			
		||||
    EXPORT_MACRO PLUGINDLLEXPORT_PRO
 | 
			
		||||
    SOURCES
 | 
			
		||||
        WebViewStep.cpp
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        ${CALA_WEBVIEW_LINK_LIBRARIES}
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
#include <QWebView>
 | 
			
		||||
#else
 | 
			
		||||
#include <QWebEngineView>
 | 
			
		||||
#include <QtWebEngine>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
CALAMARES_PLUGIN_FACTORY_DEFINITION( WebViewStepFactory, registerPlugin<WebViewStep>(); )
 | 
			
		||||
@@ -33,6 +34,9 @@ WebViewStep::WebViewStep( QObject* parent )
 | 
			
		||||
    : Calamares::ViewStep( parent )
 | 
			
		||||
{
 | 
			
		||||
    emit nextStatusChanged( true );
 | 
			
		||||
#ifdef WEBVIEW_WITH_WEBENGINE
 | 
			
		||||
    QtWebEngine::initialize();
 | 
			
		||||
#endif
 | 
			
		||||
    m_view = new C_QWEBVIEW();
 | 
			
		||||
#ifdef WEBVIEW_WITH_WEBKIT
 | 
			
		||||
    m_view->settings()->setFontFamily( QWebSettings::StandardFont,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui )
 | 
			
		||||
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules )
 | 
			
		||||
find_package( LIBPARTED REQUIRED )
 | 
			
		||||
find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED DBus )
 | 
			
		||||
find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED DBus Network )
 | 
			
		||||
 | 
			
		||||
set_source_files_properties( checker/partman_devices.c PROPERTIES LANGUAGE CXX )
 | 
			
		||||
 | 
			
		||||
@@ -14,6 +14,7 @@ set( CHECKER_SOURCES
 | 
			
		||||
set( CHECKER_LINK_LIBRARIES
 | 
			
		||||
    ${LIBPARTED_LIBS}
 | 
			
		||||
    Qt5::DBus
 | 
			
		||||
    Qt5::Network
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
calamares_add_plugin( welcome
 | 
			
		||||
@@ -25,7 +26,7 @@ calamares_add_plugin( welcome
 | 
			
		||||
        WelcomePage.cpp
 | 
			
		||||
    UI
 | 
			
		||||
        WelcomePage.ui
 | 
			
		||||
    LINK_LIBRARIES
 | 
			
		||||
    LINK_PRIVATE_LIBRARIES
 | 
			
		||||
        calamaresui
 | 
			
		||||
        ${CHECKER_LINK_LIBRARIES}
 | 
			
		||||
    SHARED_LIB
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
 | 
			
		||||
#include "WelcomePage.h"
 | 
			
		||||
#include "checker/RequirementsChecker.h"
 | 
			
		||||
#include "utils/Logger.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <QVariant>
 | 
			
		||||
@@ -128,5 +129,8 @@ WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
    if ( configurationMap.contains( "requirements" ) &&
 | 
			
		||||
         configurationMap.value( "requirements" ).type() == QVariant::Map )
 | 
			
		||||
        m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() );
 | 
			
		||||
    else
 | 
			
		||||
        cDebug() << "WARNING: no valid requirements map found in welcome "
 | 
			
		||||
                    "module configuration.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@
 | 
			
		||||
#include <QFile>
 | 
			
		||||
#include <QFileInfo>
 | 
			
		||||
#include <QLabel>
 | 
			
		||||
#include <QNetworkAccessManager>
 | 
			
		||||
#include <QProcess>
 | 
			
		||||
#include <QTimer>
 | 
			
		||||
 | 
			
		||||
@@ -185,6 +186,7 @@ RequirementsChecker::widget() const
 | 
			
		||||
void
 | 
			
		||||
RequirementsChecker::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
{
 | 
			
		||||
    bool incompleteConfiguration = false;
 | 
			
		||||
    if ( configurationMap.contains( "requiredStorage" ) &&
 | 
			
		||||
         ( configurationMap.value( "requiredStorage" ).type() == QVariant::Double ||
 | 
			
		||||
           configurationMap.value( "requiredStorage" ).type() == QVariant::Int ) )
 | 
			
		||||
@@ -199,6 +201,7 @@ RequirementsChecker::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_requiredStorageGB = 3.;
 | 
			
		||||
        incompleteConfiguration = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( configurationMap.contains( "requiredRam" ) &&
 | 
			
		||||
@@ -208,11 +211,15 @@ RequirementsChecker::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
        bool ok = false;
 | 
			
		||||
        m_requiredRamGB = configurationMap.value( "requiredRam" ).toDouble( &ok );
 | 
			
		||||
        if ( !ok )
 | 
			
		||||
        {
 | 
			
		||||
            m_requiredRamGB = 1.;
 | 
			
		||||
            incompleteConfiguration = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_requiredRamGB = 1.;
 | 
			
		||||
        incompleteConfiguration = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( configurationMap.contains( "check" ) &&
 | 
			
		||||
@@ -221,6 +228,8 @@ RequirementsChecker::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
        m_entriesToCheck.clear();
 | 
			
		||||
        m_entriesToCheck.append( configurationMap.value( "check" ).toStringList() );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
        incompleteConfiguration = true;
 | 
			
		||||
 | 
			
		||||
    if ( configurationMap.contains( "required" ) &&
 | 
			
		||||
         configurationMap.value( "required" ).type() == QVariant::List )
 | 
			
		||||
@@ -228,6 +237,19 @@ RequirementsChecker::setConfigurationMap( const QVariantMap& configurationMap )
 | 
			
		||||
        m_entriesToRequire.clear();
 | 
			
		||||
        m_entriesToRequire.append( configurationMap.value( "required" ).toStringList() );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
        incompleteConfiguration = true;
 | 
			
		||||
 | 
			
		||||
    if ( incompleteConfiguration )
 | 
			
		||||
    {
 | 
			
		||||
        cDebug() << "WARNING: The RequirementsChecker configuration map provided by "
 | 
			
		||||
                    "the welcome module configuration file is incomplete or "
 | 
			
		||||
                    "incorrect.\n"
 | 
			
		||||
                    "Startup will continue for debugging purposes, but one or "
 | 
			
		||||
                    "more checks might not function correctly.\n"
 | 
			
		||||
                    "RequirementsChecker configuration map:\n"
 | 
			
		||||
                 << configurationMap;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -315,30 +337,8 @@ RequirementsChecker::checkHasPower()
 | 
			
		||||
bool
 | 
			
		||||
RequirementsChecker::checkHasInternet()
 | 
			
		||||
{
 | 
			
		||||
    const QString NM_SVC_NAME( "org.freedesktop.NetworkManager" );
 | 
			
		||||
    const QString NM_INTF_NAME( "org.freedesktop.NetworkManager" );
 | 
			
		||||
    const QString NM_PATH( "/org/freedesktop/NetworkManager" );
 | 
			
		||||
    const int NM_STATE_CONNECTED_GLOBAL = 70;
 | 
			
		||||
 | 
			
		||||
    QDBusInterface nmIntf( NM_SVC_NAME,
 | 
			
		||||
                           NM_PATH,
 | 
			
		||||
                           NM_INTF_NAME,
 | 
			
		||||
                           QDBusConnection::systemBus(), 0 );
 | 
			
		||||
 | 
			
		||||
    bool ok = false;
 | 
			
		||||
    int nmState = nmIntf.property( "state" ).toInt( &ok );
 | 
			
		||||
 | 
			
		||||
    if ( !ok || !nmIntf.isValid() )
 | 
			
		||||
    {
 | 
			
		||||
        // We can't talk to NM, so no idea.  Wild guess: we're connected
 | 
			
		||||
        // using ssh with X forwarding, and are therefore connected.  This
 | 
			
		||||
        // allows us to proceed with a minimum of complaint.
 | 
			
		||||
        Calamares::JobQueue::instance()->globalStorage()->insert( "hasInternet", true );
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool hasInternet = nmState == NM_STATE_CONNECTED_GLOBAL;
 | 
			
		||||
 | 
			
		||||
    // default to true in the QNetworkAccessManager::UnknownAccessibility case
 | 
			
		||||
    bool hasInternet = QNetworkAccessManager(this).networkAccessible() != QNetworkAccessManager::NotAccessible;
 | 
			
		||||
    Calamares::JobQueue::instance()->globalStorage()->insert( "hasInternet", hasInternet );
 | 
			
		||||
    return hasInternet;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user