source: calamares/trunk/fuentes/src/libcalamares/Settings.cpp @ 7538

Last change on this file since 7538 was 7538, checked in by kbut, 17 months ago

sync with github

File size: 7.6 KB
Line 
1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2014-2015, Teo Mrnjavac <teo@kde.org>
4 *   Copyright 2017, Adriaan de Groot <groot@kde.org>
5 *
6 *   Calamares is free software: you can redistribute it and/or modify
7 *   it under the terms of the GNU General Public License as published by
8 *   the Free Software Foundation, either version 3 of the License, or
9 *   (at your option) any later version.
10 *
11 *   Calamares is distributed in the hope that it will be useful,
12 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 *   GNU General Public License for more details.
15 *
16 *   You should have received a copy of the GNU General Public License
17 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "Settings.h"
21
22#include "utils/CalamaresUtils.h"
23#include "utils/Logger.h"
24#include "utils/YamlUtils.h"
25
26#include <QDir>
27#include <QFile>
28#include <QPair>
29
30#include <yaml-cpp/yaml.h>
31
32
33/** Helper function to grab a QString out of the config, and to warn if not present. */
34static QString
35requireString( const YAML::Node& config, const char* key )
36{
37    if ( config[ key ] )
38        return QString::fromStdString( config[ key ].as< std::string >() );
39    else
40    {
41        cWarning() << "Required settings.conf key" << key << "is missing.";
42        return QString();
43    }
44}
45
46/** Helper function to grab a bool out of the config, and to warn if not present. */
47static bool
48requireBool( const YAML::Node& config, const char* key, bool d )
49{
50    if ( config[ key ] )
51        return config[ key ].as< bool >();
52    else
53    {
54        cWarning() << "Required settings.conf key" << key << "is missing.";
55        return d;
56    }
57}
58
59namespace Calamares
60{
61
62Settings* Settings::s_instance = nullptr;
63
64Settings*
65Settings::instance()
66{
67    return s_instance;
68}
69
70Settings::Settings( const QString& settingsFilePath,
71                    bool debugMode,
72                    QObject* parent )
73    : QObject( parent )
74    , m_debug( debugMode )
75    , m_doChroot( true )
76    , m_promptInstall( false )
77{
78    cDebug() << "Using Calamares settings file at" << settingsFilePath;
79    QFile file( settingsFilePath );
80    if ( file.exists() && file.open( QFile::ReadOnly | QFile::Text ) )
81    {
82        QByteArray ba = file.readAll();
83
84        try
85        {
86            YAML::Node config = YAML::Load( ba.constData() );
87            Q_ASSERT( config.IsMap() );
88
89            QStringList rawPaths;
90            config[ "modules-search" ] >> rawPaths;
91            for ( int i = 0; i < rawPaths.length(); ++i )
92            {
93                if ( rawPaths[ i ] == "local" )
94                {
95                    // If we're running in debug mode, we assume we might also be
96                    // running from the build dir, so we add a maximum priority
97                    // module search path in the build dir.
98                    if ( debugMode )
99                    {
100                        QString buildDirModules = QDir::current().absolutePath() +
101                                                  QDir::separator() + "src" +
102                                                  QDir::separator() + "modules";
103                        if ( QDir( buildDirModules ).exists() )
104                            m_modulesSearchPaths.append( buildDirModules );
105                    }
106
107                    // Install path is set in CalamaresAddPlugin.cmake
108                    m_modulesSearchPaths.append( CalamaresUtils::systemLibDir().absolutePath() +
109                                                 QDir::separator() + "calamares" +
110                                                 QDir::separator() + "modules" );
111                }
112                else
113                {
114                    QDir path( rawPaths[ i ] );
115                    if ( path.exists() && path.isReadable() )
116                        m_modulesSearchPaths.append( path.absolutePath() );
117                }
118            }
119
120            // Parse the custom instances section
121            if ( config[ "instances" ] )
122            {
123                QVariant instancesV
124                        = CalamaresUtils::yamlToVariant( config[ "instances" ] ).toList();
125                if ( instancesV.type() == QVariant::List )
126                {
127                    const auto instances = instancesV.toList();
128                    for ( const QVariant& instancesVListItem : instances )
129                    {
130                        if ( instancesVListItem.type() != QVariant::Map )
131                            continue;
132                        QVariantMap instancesVListItemMap =
133                                instancesVListItem.toMap();
134                        QMap< QString, QString > instanceMap;
135                        for ( auto it = instancesVListItemMap.constBegin();
136                              it != instancesVListItemMap.constEnd(); ++it )
137                        {
138                            if ( it.value().type() != QVariant::String )
139                                continue;
140                            instanceMap.insert( it.key(), it.value().toString() );
141                        }
142                        m_customModuleInstances.append( instanceMap );
143                    }
144                }
145            }
146
147            // Parse the modules sequence section
148            Q_ASSERT( config[ "sequence" ] ); // It better exist!
149            {
150                QVariant sequenceV
151                        = CalamaresUtils::yamlToVariant( config[ "sequence" ] );
152                Q_ASSERT( sequenceV.type() == QVariant::List );
153                const auto sequence = sequenceV.toList();
154                for ( const QVariant& sequenceVListItem : sequence )
155                {
156                    if ( sequenceVListItem.type() != QVariant::Map )
157                        continue;
158                    QString thisActionS = sequenceVListItem.toMap().firstKey();
159                    ModuleAction thisAction;
160                    if ( thisActionS == "show" )
161                        thisAction = ModuleAction::Show;
162                    else if ( thisActionS == "exec" )
163                        thisAction = ModuleAction::Exec;
164                    else
165                        continue;
166
167                    QStringList thisActionRoster = sequenceVListItem
168                                                   .toMap()
169                                                   .value( thisActionS )
170                                                   .toStringList();
171                    m_modulesSequence.append( qMakePair( thisAction,
172                                                         thisActionRoster ) );
173                }
174            }
175
176            m_brandingComponentName = requireString( config, "branding" );
177            m_promptInstall = requireBool( config, "prompt-install", false );
178            m_doChroot = requireBool( config, "dont-chroot", true );
179        }
180        catch ( YAML::Exception& e )
181        {
182            CalamaresUtils::explainYamlException( e, ba, file.fileName() );
183        }
184    }
185    else
186    {
187        cWarning() << "Cannot read settings file" << file.fileName();
188    }
189
190    s_instance = this;
191}
192
193
194QStringList
195Settings::modulesSearchPaths() const
196{
197    return m_modulesSearchPaths;
198}
199
200
201Settings::InstanceDescriptionList
202Settings::customModuleInstances() const
203{
204    return m_customModuleInstances;
205}
206
207
208QList< QPair< ModuleAction, QStringList > >
209Settings::modulesSequence() const
210{
211    return m_modulesSequence;
212}
213
214
215QString
216Settings::brandingComponentName() const
217{
218    return m_brandingComponentName;
219}
220
221
222bool
223Settings::showPromptBeforeExecution() const
224{
225    return m_promptInstall;
226}
227
228
229bool
230Settings::debugMode() const
231{
232    return m_debug;
233}
234
235bool
236Settings::doChroot() const
237{
238    return m_doChroot;
239}
240
241
242}
Note: See TracBrowser for help on using the repository browser.