diff --git a/src/modules/welcome/checker/GeneralRequirements.cpp b/src/modules/welcome/checker/GeneralRequirements.cpp index 2f1590590..00579aef6 100644 --- a/src/modules/welcome/checker/GeneralRequirements.cpp +++ b/src/modules/welcome/checker/GeneralRequirements.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-2018, 2020, Adriaan de Groot * Copyright 2017, Gabriel Craciunescu * Copyright 2019, Collabora Ltd * @@ -24,34 +24,29 @@ #include "CheckerContainer.h" #include "partman_devices.h" +#include "Settings.h" #include "modulesystem/Requirement.h" #include "network/Manager.h" -#include "widgets/WaitingWidget.h" #include "utils/CalamaresUtilsGui.h" +#include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" #include "utils/Retranslator.h" -#include "utils/CalamaresUtilsSystem.h" #include "utils/Units.h" #include "utils/Variant.h" -#include "Settings.h" +#include "widgets/WaitingWidget.h" -#include "JobQueue.h" #include "GlobalStorage.h" +#include "JobQueue.h" -#include -#include +#include #include #include -#include #include #include #include -#include -#include #include -#include -#include //geteuid +#include //geteuid GeneralRequirements::GeneralRequirements( QObject* parent ) : QObject( parent ) @@ -67,7 +62,7 @@ biggestSingleScreen() for ( const auto* screen : QGuiApplication::screens() ) { QSize thisScreen = screen->availableSize(); - if ( !s.isValid() || ( s.width() * s.height() < thisScreen.width() * thisScreen.height() ) ) + if ( !s.isValid() || ( s.width() * s.height() < thisScreen.width() * thisScreen.height() ) ) { s = thisScreen; } @@ -75,7 +70,8 @@ biggestSingleScreen() return s; } -Calamares::RequirementsList GeneralRequirements::checkRequirements() +Calamares::RequirementsList +GeneralRequirements::checkRequirements() { QSize availableSize = biggestSingleScreen(); @@ -84,90 +80,108 @@ Calamares::RequirementsList GeneralRequirements::checkRequirements() bool hasPower = false; bool hasInternet = false; bool isRoot = false; - bool enoughScreen = availableSize.isValid() && (availableSize.width() >= CalamaresUtils::windowMinimumWidth) && (availableSize.height() >= CalamaresUtils::windowMinimumHeight); + bool enoughScreen = availableSize.isValid() && ( availableSize.width() >= CalamaresUtils::windowMinimumWidth ) + && ( availableSize.height() >= CalamaresUtils::windowMinimumHeight ); - qint64 requiredStorageB = CalamaresUtils::GiBtoBytes(m_requiredStorageGiB); + qint64 requiredStorageB = CalamaresUtils::GiBtoBytes( m_requiredStorageGiB ); cDebug() << "Need at least storage bytes:" << requiredStorageB; if ( m_entriesToCheck.contains( "storage" ) ) + { enoughStorage = checkEnoughStorage( requiredStorageB ); + } - qint64 requiredRamB = CalamaresUtils::GiBtoBytes(m_requiredRamGiB); + qint64 requiredRamB = CalamaresUtils::GiBtoBytes( m_requiredRamGiB ); cDebug() << "Need at least ram bytes:" << requiredRamB; if ( m_entriesToCheck.contains( "ram" ) ) + { enoughRam = checkEnoughRam( requiredRamB ); + } if ( m_entriesToCheck.contains( "power" ) ) + { hasPower = checkHasPower(); + } if ( m_entriesToCheck.contains( "internet" ) ) + { hasInternet = checkHasInternet(); + } if ( m_entriesToCheck.contains( "root" ) ) + { isRoot = checkIsRoot(); + } - using TR = Logger::DebugRow; - cDebug() << "GeneralRequirements output:" - << TR("enoughStorage", enoughStorage) - << TR("enoughRam", enoughRam) - << TR("hasPower", hasPower) - << TR("hasInternet", hasInternet) - << TR("isRoot", isRoot); + using TR = Logger::DebugRow< const char*, bool >; + cDebug() << "GeneralRequirements output:" << TR( "enoughStorage", enoughStorage ) << TR( "enoughRam", enoughRam ) + << TR( "hasPower", hasPower ) << TR( "hasInternet", hasInternet ) << TR( "isRoot", isRoot ); Calamares::RequirementsList checkEntries; foreach ( const QString& entry, m_entriesToCheck ) { if ( entry == "storage" ) - checkEntries.append( { - entry, - [req=m_requiredStorageGiB]{ return tr( "has at least %1 GiB available drive space" ).arg( req ); }, - [req=m_requiredStorageGiB]{ return tr( "There is not enough drive space. At least %1 GiB is required." ).arg( req ); }, - enoughStorage, - m_entriesToRequire.contains( entry ) - } ); + { + checkEntries.append( + { entry, + [req = m_requiredStorageGiB] { return tr( "has at least %1 GiB available drive space" ).arg( req ); }, + [req = m_requiredStorageGiB] { + return tr( "There is not enough drive space. At least %1 GiB is required." ).arg( req ); + }, + enoughStorage, + m_entriesToRequire.contains( entry ) } ); + } else if ( entry == "ram" ) - checkEntries.append( { - entry, - [req=m_requiredRamGiB]{ return tr( "has at least %1 GiB working memory" ).arg( req ); }, - [req=m_requiredRamGiB]{ return tr( "The system does not have enough working memory. At least %1 GiB is required." ).arg( req ); }, - enoughRam, - m_entriesToRequire.contains( entry ) - } ); + { + checkEntries.append( + { entry, + [req = m_requiredRamGiB] { return tr( "has at least %1 GiB working memory" ).arg( req ); }, + [req = m_requiredRamGiB] { + return tr( "The system does not have enough working memory. At least %1 GiB is required." ) + .arg( req ); + }, + enoughRam, + m_entriesToRequire.contains( entry ) } ); + } else if ( entry == "power" ) - checkEntries.append( { - entry, - []{ return tr( "is plugged in to a power source" ); }, - []{ return tr( "The system is not plugged in to a power source." ); }, - hasPower, - m_entriesToRequire.contains( entry ) - } ); + { + checkEntries.append( { entry, + [] { return tr( "is plugged in to a power source" ); }, + [] { return tr( "The system is not plugged in to a power source." ); }, + hasPower, + m_entriesToRequire.contains( entry ) } ); + } else if ( entry == "internet" ) - checkEntries.append( { - entry, - []{ return tr( "is connected to the Internet" ); }, - []{ return tr( "The system is not connected to the Internet." ); }, - hasInternet, - m_entriesToRequire.contains( entry ) - } ); + { + checkEntries.append( { entry, + [] { return tr( "is connected to the Internet" ); }, + [] { return tr( "The system is not connected to the Internet." ); }, + hasInternet, + m_entriesToRequire.contains( entry ) } ); + } else if ( entry == "root" ) - checkEntries.append( { - entry, - []{ return QString(); }, //we hide it - []{ return Calamares::Settings::instance()->isSetupMode() - ? tr( "The setup program is not running with administrator rights." ) - : tr( "The installer is not running with administrator rights." ); }, - isRoot, - m_entriesToRequire.contains( entry ) - } ); + { + checkEntries.append( { entry, + [] { return tr( "is running the installer as an administrator (root)" ); }, + [] { + return Calamares::Settings::instance()->isSetupMode() + ? tr( "The setup program is not running with administrator rights." ) + : tr( "The installer is not running with administrator rights." ); + }, + isRoot, + m_entriesToRequire.contains( entry ) } ); + } else if ( entry == "screen" ) - checkEntries.append( { - entry, - []{ return QString(); }, // we hide it - []{ return Calamares::Settings::instance()->isSetupMode() - ? tr( "The screen is too small to display the setup program." ) - : tr( "The screen is too small to display the installer." ); }, - enoughScreen, - false - } ); + { + checkEntries.append( { entry, + [] { return tr( "has a screen large enough to show the whole installer" ); }, + [] { + return Calamares::Settings::instance()->isSetupMode() + ? tr( "The screen is too small to display the setup program." ) + : tr( "The screen is too small to display the installer." ); + }, + enoughScreen, + false } ); + } } return checkEntries; } @@ -178,8 +192,7 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) { bool incompleteConfiguration = false; - if ( configurationMap.contains( "check" ) && - configurationMap.value( "check" ).type() == QVariant::List ) + if ( configurationMap.contains( "check" ) && configurationMap.value( "check" ).type() == QVariant::List ) { m_entriesToCheck.clear(); m_entriesToCheck.append( configurationMap.value( "check" ).toStringList() ); @@ -190,8 +203,7 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) incompleteConfiguration = true; } - if ( configurationMap.contains( "required" ) && - configurationMap.value( "required" ).type() == QVariant::List ) + if ( configurationMap.contains( "required" ) && configurationMap.value( "required" ).type() == QVariant::List ) { m_entriesToRequire.clear(); m_entriesToRequire.append( configurationMap.value( "required" ).toStringList() ); @@ -216,11 +228,13 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) // Help out with consistency, but don't fix for ( const auto& r : m_entriesToRequire ) if ( !m_entriesToCheck.contains( r ) ) + { cWarning() << "GeneralRequirements requires" << r << "but does not check it."; + } - if ( configurationMap.contains( "requiredStorage" ) && - ( configurationMap.value( "requiredStorage" ).type() == QVariant::Double || - configurationMap.value( "requiredStorage" ).type() == QVariant::LongLong ) ) + if ( configurationMap.contains( "requiredStorage" ) + && ( configurationMap.value( "requiredStorage" ).type() == QVariant::Double + || configurationMap.value( "requiredStorage" ).type() == QVariant::LongLong ) ) { bool ok = false; m_requiredStorageGiB = configurationMap.value( "requiredStorage" ).toDouble( &ok ); @@ -239,9 +253,9 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) incompleteConfiguration = true; } - if ( configurationMap.contains( "requiredRam" ) && - ( configurationMap.value( "requiredRam" ).type() == QVariant::Double || - configurationMap.value( "requiredRam" ).type() == QVariant::LongLong ) ) + if ( configurationMap.contains( "requiredRam" ) + && ( configurationMap.value( "requiredRam" ).type() == QVariant::Double + || configurationMap.value( "requiredRam" ).type() == QVariant::LongLong ) ) { bool ok = false; m_requiredRamGiB = configurationMap.value( "requiredRam" ).toDouble( &ok ); @@ -266,8 +280,8 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) checkInternetUrl = QUrl( checkInternetSetting.trimmed() ); if ( !checkInternetUrl.isValid() ) { - cWarning() << "GeneralRequirements entry 'internetCheckUrl' is invalid in welcome.conf" << checkInternetSetting - << "reverting to default (http://example.com)."; + cWarning() << "GeneralRequirements entry 'internetCheckUrl' is invalid in welcome.conf" + << checkInternetSetting << "reverting to default (http://example.com)."; checkInternetUrl = QUrl( "http://example.com" ); incompleteConfiguration = true; } @@ -275,7 +289,7 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) else { cWarning() << "GeneralRequirements entry 'internetCheckUrl' is undefined in welcome.conf," - "reverting to default (http://example.com)."; + "reverting to default (http://example.com)."; checkInternetUrl = "http://example.com"; incompleteConfiguration = true; } @@ -310,7 +324,7 @@ GeneralRequirements::checkEnoughRam( qint64 requiredRam ) // Ignore the guesstimate-factor; we get an under-estimate // which is probably the usable RAM for programs. quint64 availableRam = CalamaresUtils::System::instance()->getTotalMemoryB().first; - return availableRam >= requiredRam * 0.95; // because MemTotal is variable + return availableRam >= requiredRam * 0.95; // because MemTotal is variable } @@ -320,19 +334,22 @@ GeneralRequirements::checkBatteryExists() const QFileInfo basePath( "/sys/class/power_supply" ); if ( !( basePath.exists() && basePath.isDir() ) ) + { return false; + } QDir baseDir( basePath.absoluteFilePath() ); const auto entries = baseDir.entryList( QDir::AllDirs | QDir::Readable | QDir::NoDotAndDotDot ); - for ( const auto &item : entries ) + for ( const auto& item : entries ) { - QFileInfo typePath( baseDir.absoluteFilePath( QString( "%1/type" ) - .arg( item ) ) ); + QFileInfo typePath( baseDir.absoluteFilePath( QString( "%1/type" ).arg( item ) ) ); QFile typeFile( typePath.absoluteFilePath() ); if ( typeFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { if ( typeFile.readAll().startsWith( "Battery" ) ) + { return true; + } } } @@ -348,13 +365,12 @@ GeneralRequirements::checkHasPower() const QString UPOWER_PATH( "/org/freedesktop/UPower" ); if ( !checkBatteryExists() ) + { return true; + } cDebug() << "A battery exists, checking for mains power."; - QDBusInterface upowerIntf( UPOWER_SVC_NAME, - UPOWER_PATH, - UPOWER_INTF_NAME, - QDBusConnection::systemBus() ); + QDBusInterface upowerIntf( UPOWER_SVC_NAME, UPOWER_PATH, UPOWER_INTF_NAME, QDBusConnection::systemBus() ); bool onBattery = upowerIntf.property( "OnBattery" ).toBool();