source: calamares/trunk/fuentes/src/modules/preservefiles/PreserveFiles.cpp @ 7538

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

sync with github

File size: 5.9 KB
Line 
1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2018, Adriaan de Groot <groot@kde.org>
4 *
5 *   Calamares is free software: you can redistribute it and/or modify
6 *   it under the terms of the GNU General Public License as published by
7 *   the Free Software Foundation, either version 3 of the License, or
8 *   (at your option) any later version.
9 *
10 *   Calamares is distributed in the hope that it will be useful,
11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 *   GNU General Public License for more details.
14 *
15 *   You should have received a copy of the GNU General Public License
16 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include "PreserveFiles.h"
20
21#include "CalamaresVersion.h"
22#include "JobQueue.h"
23#include "GlobalStorage.h"
24
25#include "utils/CalamaresUtils.h"
26#include "utils/CalamaresUtilsSystem.h"
27#include "utils/CommandList.h"
28#include "utils/Logger.h"
29#include "utils/Units.h"
30
31#include <QFile>
32
33using CalamaresUtils::operator""_MiB;
34
35QString targetPrefix()
36{
37    if ( CalamaresUtils::System::instance()->doChroot() )
38    {
39        Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
40        if ( gs && gs->contains( "rootMountPoint" ) )
41        {
42            QString r = gs->value( "rootMountPoint" ).toString();
43            if ( !r.isEmpty() )
44                return r;
45            else
46                cDebug() << "RootMountPoint is empty";
47        }
48        else
49        {
50            cDebug() << "No rootMountPoint defined, preserving files to '/'";
51        }
52    }
53
54    return QLatin1Literal( "/" );
55}
56
57QString atReplacements( QString s )
58{
59    Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
60    QString root( "/" );
61    QString user;
62
63    if ( gs && gs->contains( "rootMountPoint" ) )
64        root = gs->value( "rootMountPoint" ).toString();
65    if ( gs && gs->contains( "username" ) )
66        user = gs->value( "username" ).toString();
67
68    return s.replace( "@@ROOT@@", root ).replace( "@@USER@@", user );
69}
70
71PreserveFiles::PreserveFiles( QObject* parent )
72    : Calamares::CppJob( parent )
73{
74}
75
76PreserveFiles::~PreserveFiles()
77{
78}
79
80QString
81PreserveFiles::prettyName() const
82{
83    return tr( "Saving files for later ..." );
84}
85
86Calamares::JobResult PreserveFiles::exec()
87{
88    if ( m_items.isEmpty() )
89        return Calamares::JobResult::error( tr( "No files configured to save for later." ) );
90
91    QString prefix = targetPrefix();
92    if ( !prefix.endsWith( '/' ) )
93        prefix.append( '/' );
94
95    int count = 0;
96    for ( const auto& it : m_items )
97    {
98        QString source = it.source;
99        QString dest = prefix + atReplacements( it.dest );
100
101        if ( it.type == ItemType::Log )
102            source = Logger::logFile();
103        if ( it.type == ItemType::Config )
104        {
105            if ( Calamares::JobQueue::instance()->globalStorage()->save( dest ) )
106                cWarning() << "Could not write config for" << dest;
107            else
108                ++count;
109        }
110        else if ( source.isEmpty() )
111            cWarning() << "Skipping unnamed source file for" << dest;
112        else
113        {
114            QFile sourcef( source );
115            if ( !sourcef.open( QFile::ReadOnly ) )
116            {
117                cWarning() << "Could not read" << source;
118                continue;
119            }
120
121            QFile destf( dest );
122            if ( !destf.open( QFile::WriteOnly ) )
123            {
124                sourcef.close();
125                cWarning() << "Could not open" << destf.fileName() << "for writing; could not copy" << source;
126                continue;
127            }
128
129            QByteArray b;
130            do
131            {
132                b = sourcef.read( 1_MiB );
133                destf.write( b );
134            }
135            while ( b.count() > 0 );
136
137            sourcef.close();
138            destf.close();
139            ++count;
140        }
141    }
142
143    return count == m_items.count() ?
144        Calamares::JobResult::ok() :
145        Calamares::JobResult::error( tr( "Not all of the configured files could be preserved." ) );
146}
147
148void PreserveFiles::setConfigurationMap(const QVariantMap& configurationMap)
149{
150    auto files = configurationMap[ "files" ];
151    if ( !files.isValid() )
152    {
153        cDebug() << "No 'files' key for preservefiles.";
154        return;
155    }
156
157    if ( files.type() != QVariant::List )
158    {
159        cDebug() << "Configuration key 'files' is not a list for preservefiles.";
160        return;
161    }
162
163    QVariantList l = files.toList();
164    unsigned int c = 0;
165    for ( const auto& li : l )
166    {
167        if ( li.type() == QVariant::String )
168        {
169            QString filename = li.toString();
170            if ( !filename.isEmpty() )
171                m_items.append( Item{ filename, filename, ItemType::Path } );
172            else
173                cDebug() << "Empty filename for preservefiles, item" << c;
174        }
175        else if ( li.type() == QVariant::Map )
176        {
177            const auto map = li.toMap();
178            QString dest = map[ "dest" ].toString();
179            QString from = map[ "from" ].toString();
180            ItemType t =
181                ( from == "log" ) ? ItemType::Log :
182                ( from == "config" ) ? ItemType::Config :
183                ItemType::None;
184
185            if ( dest.isEmpty() )
186            {
187                cDebug() << "Empty dest for preservefiles, item" << c;
188            }
189            else if ( t == ItemType::None )
190            {
191                cDebug() << "Invalid type for preservefiles, item" << c;
192            }
193            else
194            {
195                m_items.append( Item{ QString(), dest, t } );
196            }
197        }
198        else
199            cDebug() << "Invalid type for preservefiles, item" << c;
200
201        ++c;
202    }
203}
204
205CALAMARES_PLUGIN_FACTORY_DEFINITION( PreserveFilesFactory, registerPlugin<PreserveFiles>(); )
206
Note: See TracBrowser for help on using the repository browser.