diff --git a/src/calamares/CalamaresApplication.cpp b/src/calamares/CalamaresApplication.cpp index 4889a57b5..36ab8d828 100644 --- a/src/calamares/CalamaresApplication.cpp +++ b/src/calamares/CalamaresApplication.cpp @@ -31,6 +31,9 @@ #include "viewpages/ViewStep.h" #include "ViewManager.h" +#include +#include + CalamaresApplication::CalamaresApplication( int& argc, char *argv[] ) : QApplication( argc, argv ) @@ -130,7 +133,54 @@ CalamaresApplication::startPhase( Calamares::Phase phase ) void CalamaresApplication::initSettings() { - new Calamares::Settings( isDebug(), this ); + QFileInfo settingsFile; + if ( CalamaresUtils::isAppDataDirOverridden() ) + { + settingsFile = QFileInfo( CalamaresUtils::appDataDir().absoluteFilePath( "settings.conf" ) ); + if ( !settingsFile.exists() || !settingsFile.isReadable() ) + { + cLog() << "FATAL ERROR: explicitly configured application data directory" + << CalamaresUtils::appDataDir().absolutePath() + << "does not contain a valid settings.conf file." + << "\nCowardly refusing to continue startup without settings."; + ::exit( EXIT_FAILURE ); + } + } + else + { + QStringList settingsFileCandidatesByPriority; + if ( isDebug() ) + { + settingsFileCandidatesByPriority.append( + QDir::currentPath() + + QDir::separator() + + "settings.conf" ); + } + settingsFileCandidatesByPriority.append( "/etc/calamares/settings.conf" ); + settingsFileCandidatesByPriority.append( CalamaresUtils::appDataDir() + .absoluteFilePath( "settings.conf" ) ); + + foreach ( const QString& path, settingsFileCandidatesByPriority ) + { + QFileInfo pathFi( path ); + if ( pathFi.exists() && pathFi.isReadable() ) + { + settingsFile = pathFi; + break; + } + } + + if ( !settingsFile.exists() || !settingsFile.isReadable() ) + { + cLog() << "FATAL ERROR: none of the expected configuration file paths (" + << settingsFileCandidatesByPriority.join( ", " ) + << ") contain a valid settings.conf file." + << "\nCowardly refusing to continue startup without settings."; + ::exit( EXIT_FAILURE ); + } + } + + new Calamares::Settings( settingsFile.absoluteFilePath(), isDebug(), this ); } diff --git a/src/calamares/main.cpp b/src/calamares/main.cpp index d80c43d5d..2482e9214 100644 --- a/src/calamares/main.cpp +++ b/src/calamares/main.cpp @@ -41,7 +41,7 @@ main( int argc, char *argv[] ) parser.addOption( debugOption ); QCommandLineOption configOption( QStringList() << "c" << "config", - "Configuration dir to use, for testing purposes.", "config" ); + "Configuration directory to use, for testing purposes.", "config" ); parser.addOption( configOption ); parser.process( a ); diff --git a/src/libcalamares/utils/CalamaresUtils.cpp b/src/libcalamares/utils/CalamaresUtils.cpp index 4855698bc..10e38d3de 100644 --- a/src/libcalamares/utils/CalamaresUtils.cpp +++ b/src/libcalamares/utils/CalamaresUtils.cpp @@ -42,6 +42,7 @@ namespace CalamaresUtils { static QDir s_appDataDir( CMAKE_INSTALL_FULL_DATADIR ); +static bool s_isAppDataDirOverridden = false; static bool isWritableDir( const QDir& dir ) @@ -76,6 +77,14 @@ void setAppDataDir( const QDir& dir ) { s_appDataDir = dir; + s_isAppDataDirOverridden = true; +} + + +bool +isAppDataDirOverridden() +{ + return s_isAppDataDirOverridden; } diff --git a/src/libcalamares/utils/CalamaresUtils.h b/src/libcalamares/utils/CalamaresUtils.h index f7713be18..8b22b4f90 100644 --- a/src/libcalamares/utils/CalamaresUtils.h +++ b/src/libcalamares/utils/CalamaresUtils.h @@ -40,6 +40,7 @@ namespace CalamaresUtils * Override app data dir. Only for testing purposes. */ DLLEXPORT void setAppDataDir( const QDir& dir ); + DLLEXPORT bool isAppDataDirOverridden(); } #endif // CALAMARESUTILS_H diff --git a/src/libcalamaresui/Settings.cpp b/src/libcalamaresui/Settings.cpp index 9a07a61e2..7b57aff57 100644 --- a/src/libcalamaresui/Settings.cpp +++ b/src/libcalamaresui/Settings.cpp @@ -40,26 +40,17 @@ Settings::instance() } -Settings::Settings( bool debugMode, QObject* parent ) +Settings::Settings( const QString& settingsFilePath, + bool debugMode, + QObject* parent ) : QObject( parent ) , m_debug( debugMode ) { - QFileInfo settingsFile( "/etc/calamares/settings.conf" ); - if ( !settingsFile.exists() || !settingsFile.isReadable() ) - settingsFile = QFileInfo( CalamaresUtils::appDataDir().absoluteFilePath( "settings.conf" ) ); - - if ( debugMode ) - { - QFileInfo localFile( QDir( QDir::currentPath() ).absoluteFilePath( "settings.conf" ) ); - if ( localFile.exists() && localFile.isReadable() ) - settingsFile.setFile( localFile.absoluteFilePath() ); - } - QFile file( settingsFile.absoluteFilePath() ); - + cDebug() << "Using Calamares settings file at" << settingsFilePath; + QFile file( settingsFilePath ); if ( file.exists() && file.open( QFile::ReadOnly | QFile::Text ) ) { QByteArray ba = file.readAll(); - cDebug() << ba; try { diff --git a/src/libcalamaresui/Settings.h b/src/libcalamaresui/Settings.h index ae48664bc..1c374489a 100644 --- a/src/libcalamaresui/Settings.h +++ b/src/libcalamaresui/Settings.h @@ -33,7 +33,9 @@ class UIDLLEXPORT Settings : public QObject { Q_OBJECT public: - explicit Settings( bool debugMode, QObject *parent = nullptr ); + explicit Settings( const QString& settingsFilePath, + bool debugMode, + QObject *parent = nullptr ); static Settings* instance(); //TODO: load from JSON then emit ready