diff --git a/CHANGES b/CHANGES
index db5b75f82..d91de15b2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,16 +3,14 @@ contributors are listed. Note that Calamares does not have a historical
changelog -- this log starts with version 3.2.0. The release notes on the
website will have to do for older versions.
-# 3.2.20 (unreleased) #
+# 3.2.19.1 (unreleased) #
-This release contains contributions from (alphabetically by first name):
- - No external contributors yet
-
-## Core ##
- - No core changes yet
+This is a hotfix release for bugs in the *users* module.
+Reported by Philip Mueller and Walter Lapchynski.
## Modules ##
- - No module changes yet
+ - The *users* module no longer wrote `/etc/hostname` at all.
+ - The *users* module erroneously shows the root password input fields.
# 3.2.19 (2020-02-21) #
diff --git a/lang/calamares_ast.ts b/lang/calamares_ast.ts
index 63c47d8a8..b6e19297c 100644
--- a/lang/calamares_ast.ts
+++ b/lang/calamares_ast.ts
@@ -212,7 +212,7 @@
-
+ Cargando...
@@ -222,7 +222,7 @@
-
+ Falló la carga.
@@ -532,7 +532,7 @@ L'instalador va colar y van perdese tolos cambeos.
- %1 va redimensionase a %2MB y va crease una partición nueva de %3MB pa %4.
+ %1 va redimensionase a %2MB y va crease una partición de %3MB pa %4.
@@ -785,7 +785,7 @@ L'instalador va colar y van perdese tolos cambeos.
- Creando una partición %1 nueva en %2.
+ Creando una partición %1 en %2.
@@ -803,7 +803,7 @@ L'instalador va colar y van perdese tolos cambeos.
- Crear una tabla de particiones nueva va desaniciar tolos datos esistentes nel discu.
+ Crear una tabla de particiones va desaniciar tolos datos esistentes nel discu.
@@ -831,12 +831,12 @@ L'instalador va colar y van perdese tolos cambeos.
- Va crease una tabla de particiones nueva <strong>%1</strong> en <strong>%2</strong> (%3).
+ Va crease una tabla de particiones <strong>%1</strong> en <strong>%2</strong> (%3).
- Creando una tabla de particiones nueva %1 en %2.
+ Creando una tabla de particiones %1 en %2.
@@ -895,17 +895,17 @@ L'instalador va colar y van perdese tolos cambeos.
- Creación d'un grupu nuevu de volúmenes col nome %1.
+ Creación d'un grupu de volúmenes col nome %1.
- Va crease un grupu nuevu de volúmenes col nome <strong>%1</strong>.
+ Va crease un grupu de volúmenes col nome <strong>%1</strong>.
- Creando un grupu nuevu de volúmenes col nome %1.
+ Creando un grupu de volúmenes col nome %1.
@@ -975,7 +975,7 @@ L'instalador va colar y van perdese tolos cambeos.
- Esti instalador <strong>nun pue deteutar una tabla de particiones</strong> nel preséu d'almacenamientu esbilláu.<br><br>El preséu nun tien una tabla de particiones, la tabla de particiones ta toyida o ye d'una triba desconocida.<br>Esti instalador pue crear una tabla de particiones nueva por ti, automáticamente o pente la páxina de particionáu manual.
+ Esti instalador <strong>nun pue deteutar una tabla de particiones</strong> nel preséu d'almacenamientu esbilláu.<br><br>El preséu nun tien una tabla de particiones porque ta toyida o ye d'una triba desconocida.<br>Esti instalador pue crear una tabla de particiones nueva por ti, automáticamente o pente la páxina de particionáu manual.
@@ -1470,22 +1470,22 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Esti procedimientu va instalar software privativu que ta suxetu a términos de llicencia.
-
+ Si nun aceutes los términos, el procedimientu de configuración nun pue siguir.
-
+ Esti procedimientu de configuración pue instalar software privativu que ta suxetu a términos de llicencia pa fornir carauterístiques adicionales y ameyorar la esperiencia d'usuariu.
-
+ Si nun aceutes los términos, el software privativu nun va instalase y van usase les alternatives de códigu abiertu.
@@ -1501,7 +1501,7 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ URL: %1
@@ -1538,7 +1538,7 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Ficheru: %1
@@ -1691,12 +1691,12 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Software ofimáticu
-
+ Paquete ofimáticu
@@ -1711,17 +1711,17 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Restolador web
-
+ Kernel
-
+ Servicios
@@ -1731,12 +1731,12 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Escritoriu
-
+ Aplicaciones
@@ -1744,7 +1744,7 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Notes
@@ -2023,7 +2023,7 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ La contraseña ta balera
@@ -2064,7 +2064,7 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Paquetes
@@ -2142,7 +2142,7 @@ L'instalador va colar y van perdese tolos cambeos.
-
+ Contraseña
@@ -2301,22 +2301,22 @@ L'instalador va colar y van perdese tolos cambeos.
- Grupu de volúmenes nuevu
+ Grupu nuevu
- Redimensionar el grupu de volúmenes
+ Redimensionar el grupu
- Desactivar el grupu de volúmenes
+ Desactivar el grupu
- Desaniciar el grupu de volúmenes
+ Desaniciar el grupu
@@ -2439,12 +2439,12 @@ L'instalador va colar y van perdese tolos cambeos.
- tien polo menos un preséu con espaciu disponible en discu
+ tien polo menos un preséu disponible d'almacenamientu
-
+ Nun hai particiones nes qu'instalar.
@@ -2649,7 +2649,7 @@ Salida:
-
+ El camín <pre>%1</pre> ha ser absolutu.
@@ -2850,7 +2850,7 @@ Salida:
- Redimensionar el grupu de volúmenes
+ Redimensionar el grupu
@@ -3542,7 +3542,7 @@ Salida:
-
+ <h3>%1 <quote>%2</quote></h3>
@@ -3557,12 +3557,12 @@ Salida:
-
+ Problemes conocíos
-
+ Notes del llanzamientu
diff --git a/lang/calamares_it_IT.ts b/lang/calamares_it_IT.ts
index 991746f7b..f73cfe173 100644
--- a/lang/calamares_it_IT.ts
+++ b/lang/calamares_it_IT.ts
@@ -106,7 +106,7 @@
-
+ Albero dei Widget
@@ -137,7 +137,7 @@
-
+ Il fallimento dell'operazione programmata è stato richiesto esplicitamente.
@@ -153,7 +153,7 @@
-
+ Operazione d'esempio (%1)
@@ -212,12 +212,12 @@
-
+ Caricamento ...
-
+ QML Progresso <i>%1</i>.
@@ -238,9 +238,9 @@
-
-
-
+
+ (%n secondo)
+ (%n secondi)
@@ -292,12 +292,12 @@
-
+ Incolla URL Log di Installazione
-
+ Il caricamento è fallito. Non è stato eseguito web-paste.
@@ -454,7 +454,8 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Log di installazione caricato:
+%1
@@ -779,7 +780,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Creare nuova partizione di <strong>%2MiB</strong> su <strong>%4</strong> (%3) con file system <strong>%1</strong>.
@@ -1162,7 +1163,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ <Restart checkbox tooltip>
@@ -1172,7 +1173,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ <h1>Tutto eseguito.</h1><br/>%1 è stato configurato sul tuo computer.<br/>Adesso puoi iniziare a utilizzare il tuo nuovo sistema.
@@ -1187,7 +1188,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ <html><head/><body><p>Quando questa casella è selezionata, il tuo sistema si riavvierà immediatamente quando clicchi su <span style="font-style:italic;">Fatto</span> o chiudi il programma di installazione.</p></body></html>
@@ -1296,7 +1297,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ sta eseguendo il programma di installazione come amministratore (root)
@@ -1311,7 +1312,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ ha uno schermo abbastanza grande da mostrare l'intero programma di installazione
@@ -1329,7 +1330,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Raccogliendo informazioni sulla tua macchina.
@@ -1340,7 +1341,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Codice Batch OEM
@@ -1454,7 +1455,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ <h1>Accordo di Licenza</h1>
@@ -1464,27 +1465,27 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Si prega di leggere l'Accordo di Licenza per l'Utente Finale (EULAs).
-
+ Questa procedura di configurazione installerà software proprietario che è soggetto ai termini di licenza.
-
+ Se non accetti i termini, la procedura di configurazione non può continuare.
-
+ Questa procedura di configurazione installerà software proprietario sottoposto a termini di licenza, per fornire caratteristiche aggiuntive e migliorare l'esperienza utente.
-
+ Se non se ne accettano i termini, il software proprietario non verrà installato e al suo posto saranno utilizzate alternative open source.
@@ -1500,7 +1501,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ URL: %1
@@ -1537,17 +1538,17 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ File: %1
-
+ Mostra il testo della licenza
-
+ Apri l'accordo di licenza nel browser.
@@ -1602,7 +1603,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Configurazione in corso del file chiave LUKS.
@@ -1615,22 +1616,22 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Errore nella configurazione del rootfs crittato
-
+ La partizione root %1 è LUKS ma non sono state configurate passphrase.
-
+ Impossibile creare il file chiave LUKS per la partizione root %1.
-
+ Impossibile configurare il file chiave LUKS per la partizione %1.
@@ -1643,12 +1644,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Errore di Configurazione
-
+ Non è impostato alcun punto di montaggio root per MachineId
@@ -1676,7 +1677,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Installazione di rete. (Disabilitato: Configurazione scorretta)
@@ -1690,52 +1691,52 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Software per ufficio
-
+ Pacchetto per ufficio
-
+ Software navigazione web
-
+ Pacchetto navigazione web
-
+ Browser web
-
+ Kernel
-
+ Servizi
-
+ Accesso
-
+ Ambiente desktop
-
+ Applicazioni
@@ -1743,7 +1744,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Note
@@ -1751,17 +1752,17 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Lo&tto
-
+ <html><head/><body><p>Inserire un identificatore per il lotto. Questo verrà salvato nel sistema di destinazione.</p></body></html>
-
+ <html><head/><body><h1>Configurazione OEM</h1><p>Calamares userà le impostazioni OEM nella configurazione del sistema di destinazione.</p></body></html>
@@ -1769,12 +1770,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Configurazione OEM
-
+ Impostare l'Identificatore del Lotto OEM a <code>%1</code>.
@@ -2022,7 +2023,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Password vuota
@@ -2035,7 +2036,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Nome Prodotto
@@ -2045,17 +2046,17 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Descrizione Estesa del Prodotto
-
+ Selezione del Pacchetto
-
+ Si prega di scegliere un prodotto dalla lista. Il prodotto selezionato verrà installato.
@@ -2063,7 +2064,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Pacchetti
@@ -2120,12 +2121,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Nome Completo
-
+ accesso
@@ -2135,29 +2136,29 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Nome Computer
-
+ Password
-
+ Ripetere Password
-
+ Quando questa casella è selezionata, la robustezza della password viene verificata e non sarà possibile utilizzare password deboli.
-
+ È richiesta una password robusta.
@@ -2443,7 +2444,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno perse
-
+ Non ci sono partizioni su cui installare.
@@ -2630,7 +2631,7 @@ Output:
-
+ Nessun prodotto
@@ -2643,17 +2644,17 @@ Output:
-
+ File non trovato
-
+ Il percorso <pre>%1</pre> deve essere un percorso assoluto.
-
+ Impossibile creare un nuovo file random <pre>%1</pre>.
@@ -2672,7 +2673,7 @@ Output:
-
+ Il programma di installazione non è riuscito a rimuovere il gruppo di volumi denominato '%1'.
@@ -2771,7 +2772,7 @@ Output:
-
+ KPMCore non Disponibile
@@ -3533,7 +3534,8 @@ Output:
-
+ <h3>%1</h3>
+ <p>Questo è un esempio di note di rilascio.</p>
@@ -3541,32 +3543,32 @@ Output:
-
+ <h3>%1 <quote>%2</quote></h3>
-
+ Informazioni su
-
+ Supporto
-
+ Problemi conosciuti
-
+ Note di rilascio
-
+ Donazioni
diff --git a/lang/calamares_lt.ts b/lang/calamares_lt.ts
index c0e28c132..63a79157e 100644
--- a/lang/calamares_lt.ts
+++ b/lang/calamares_lt.ts
@@ -212,17 +212,17 @@
-
+ Įkeliama...
-
+ QML <i>%1</i> žingsnis.
-
+ Įkėlimas nepavyko.
@@ -1636,7 +1636,7 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti.
-
+ Nepavyko konfigūruoti LUKS rakto failo skaidinyje %1.
@@ -1696,52 +1696,52 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti.
-
+ Raštinės programinė įranga
-
+ Raštinės paketas
-
+ Naršyklės programinė įranga
-
+ Naršyklės paketas
-
+ Saityno naršyklė
-
+ Branduolys
-
+ Tarnybos
-
+ Prisijungimas
-
+ Darbalaukis
-
+ Programos
@@ -1749,7 +1749,7 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti.
-
+ Pastabos
@@ -2449,7 +2449,7 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti.
-
+ Nėra skaidinių į kuriuos diegti.
@@ -3539,7 +3539,8 @@ Išvestis:
-
+ <h3>%1</h3>
+ <p>Tai yra pavyzdinė laidos informacija.</p>
@@ -3547,32 +3548,32 @@ Išvestis:
-
+ <h3>%1 <quote>%2</quote></h3>
-
+ Apie
-
+ Palaikymas
-
+ Žinomos problemos
-
+ Laidos informacija
-
+ Paaukoti
diff --git a/lang/calamares_pt_BR.ts b/lang/calamares_pt_BR.ts
index 65c6c39bc..e56c960d9 100644
--- a/lang/calamares_pt_BR.ts
+++ b/lang/calamares_pt_BR.ts
@@ -212,17 +212,17 @@
-
+ Carregando ...
-
+ Passo QML <i>%1</i>.
-
+ Carregamento falhou.
@@ -1632,7 +1632,7 @@ O instalador será fechado e todas as alterações serão perdidas.
-
+ Não foi possível configurar a chave LUKS na partição %1.
@@ -1692,52 +1692,52 @@ O instalador será fechado e todas as alterações serão perdidas.
-
+ Software de office
-
+ Pacote office
-
+ Softwares de browser
-
+ Pacote de browser
-
+ Navegador web
-
+ Kernel
-
+ Seriços
-
+ Login
-
+ Área de trabalho
-
+ Aplicações
@@ -1745,7 +1745,7 @@ O instalador será fechado e todas as alterações serão perdidas.
-
+ Notas
@@ -2445,7 +2445,7 @@ O instalador será fechado e todas as alterações serão perdidas.
-
+ Não há partições para instalar.
@@ -3535,7 +3535,8 @@ Saída:
-
+ <h3>%1</h3>
+ <p>These are example release notes.</p>
@@ -3543,32 +3544,32 @@ Saída:
-
+ <h3>%1 <quote>%2</quote></h3>
-
+ Sobre
-
+ Suporte
-
+ Problemas conhecidos
-
+ Notas de lançamento
-
+ Faça uma doação
diff --git a/lang/calamares_ru.ts b/lang/calamares_ru.ts
index a1da26312..a04763d08 100644
--- a/lang/calamares_ru.ts
+++ b/lang/calamares_ru.ts
@@ -1333,7 +1333,7 @@ The installer will quit and all changes will be lost.
-
+ Сбор информации о вашем компьютере.
@@ -1458,7 +1458,7 @@ The installer will quit and all changes will be lost.
-
+ <h1>Лицензионное соглашение</h1>
@@ -1541,17 +1541,17 @@ The installer will quit and all changes will be lost.
-
+ Файл: %1
-
+ Показать текст лицензии
-
+ Открыть лицензионное соглашение в браузере.
@@ -1714,12 +1714,12 @@ The installer will quit and all changes will be lost.
-
+ Веб-браузер
-
+ Ядро
@@ -1739,7 +1739,7 @@ The installer will quit and all changes will be lost.
-
+ Приложения
@@ -2026,7 +2026,7 @@ The installer will quit and all changes will be lost.
-
+ Пустой пароль
@@ -2124,7 +2124,7 @@ The installer will quit and all changes will be lost.
-
+ Ваше полное имя
@@ -2139,19 +2139,19 @@ The installer will quit and all changes will be lost.
-
+ Имя компьютера
-
+ Пароль
-
+ Повторите пароль
@@ -2647,17 +2647,17 @@ Output:
-
+ Файл не найден
-
+ Путь <pre>%1</pre> должен быть абсолютным путём.
-
+ Не удалось создать новый случайный файл <pre>%1</pre>.
@@ -2795,12 +2795,12 @@ Output:
-
+ Файловая система %1 не обнаружена в этой системе, поэтому её размер невозможно изменить.
-
+ Устройство %1 не обнаружено в этой системе, поэтому его размер невозможно изменить.
@@ -3319,12 +3319,12 @@ Output:
-
+ Допускаются только строчные буквы, числа, символы подчёркивания и дефисы.
-
+ Допускаются только буквы, цифры, символы подчёркивания и дефисы.
@@ -3373,7 +3373,7 @@ Output:
-
+ Список физических томов
diff --git a/lang/python/it_IT/LC_MESSAGES/python.mo b/lang/python/it_IT/LC_MESSAGES/python.mo
index 8a8b461a4..f66197a97 100644
Binary files a/lang/python/it_IT/LC_MESSAGES/python.mo and b/lang/python/it_IT/LC_MESSAGES/python.mo differ
diff --git a/lang/python/it_IT/LC_MESSAGES/python.po b/lang/python/it_IT/LC_MESSAGES/python.po
index b7aa8b2a7..31b21fbe5 100644
--- a/lang/python/it_IT/LC_MESSAGES/python.po
+++ b/lang/python/it_IT/LC_MESSAGES/python.po
@@ -5,8 +5,8 @@
#
# Translators:
# Saverio , 2018
-# Pietro F. Fontana, 2018
# Pierfrancesco Passerini , 2019
+# Pietro F. Fontana, 2020
#
#, fuzzy
msgid ""
@@ -15,7 +15,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-02-19 17:27+0100\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
-"Last-Translator: Pierfrancesco Passerini , 2019\n"
+"Last-Translator: Pietro F. Fontana, 2020\n"
"Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -41,7 +41,7 @@ msgstr ""
#: src/modules/fstab/main.py:328 src/modules/localecfg/main.py:144
#: src/modules/networkcfg/main.py:48
msgid "Configuration Error"
-msgstr ""
+msgstr "Errore di Configurazione"
#: src/modules/mount/main.py:146 src/modules/initcpiocfg/main.py:202
#: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172
diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp
index ac00bafd4..1c7ecf813 100644
--- a/src/calamares/CalamaresWindow.cpp
+++ b/src/calamares/CalamaresWindow.cpp
@@ -135,7 +135,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
sideLayout->addWidget( tv );
tv->setFocusPolicy( Qt::NoFocus );
- if ( Calamares::Settings::instance()->debugMode() )
+ if ( Calamares::Settings::instance()->debugMode() || ( Logger::logLevel() >= Logger::LOGVERBOSE ) )
{
QPushButton* debugWindowBtn = new QPushButton;
debugWindowBtn->setObjectName( "debugButton" );
diff --git a/src/libcalamares/partition/Mount.cpp b/src/libcalamares/partition/Mount.cpp
index 91fcefff5..aa30c9d92 100644
--- a/src/libcalamares/partition/Mount.cpp
+++ b/src/libcalamares/partition/Mount.cpp
@@ -105,8 +105,9 @@ TemporaryMount::TemporaryMount( const QString& devicePath, const QString& filesy
m_d->m_devicePath = devicePath;
m_d->m_mountDir.setAutoRemove( false );
int r = mount( devicePath, m_d->m_mountDir.path(), filesystemName, options );
- if ( !r )
+ if ( r )
{
+ cWarning() << "Mount of" << devicePath << "on" << m_d->m_mountDir.path() << "failed, code" << r;
delete m_d;
m_d = nullptr;
}
@@ -116,7 +117,12 @@ TemporaryMount::~TemporaryMount()
{
if ( m_d )
{
- unmount( m_d->m_devicePath, { "-R" } );
+ int r = unmount( m_d->m_devicePath, { "-R" } );
+ if ( r )
+ {
+ cWarning() << "UnMount of temporary" << m_d->m_devicePath << "on" << m_d->m_mountDir.path()
+ << "failed, code" << r;
+ }
delete m_d;
m_d = nullptr;
}
diff --git a/src/libcalamares/partition/Sync.cpp b/src/libcalamares/partition/Sync.cpp
index c5e131cfa..c71c6a172 100644
--- a/src/libcalamares/partition/Sync.cpp
+++ b/src/libcalamares/partition/Sync.cpp
@@ -1,6 +1,6 @@
/* === This file is part of Calamares - ===
*
- * Copyright 2019, Adriaan de Groot
+ * Copyright 2019-2020, Adriaan de Groot
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,7 +24,14 @@
void
CalamaresUtils::Partition::sync()
{
- auto r = CalamaresUtils::System::runCommand( { "/sbin/udevadm", "settle" }, std::chrono::seconds( 10 ) );
+ /* I would normally use full paths here, e.g. /sbin/udevadm and /bin/sync,
+ * but there's enough variation / opinion on where these executables
+ * should live, that full paths would need to be configurable.
+ * Instead, just run them and assume they're found in PATH;
+ * either chroot(8) or env(1) is used to run the command,
+ * and they do suitable lookup.
+ */
+ auto r = CalamaresUtils::System::runCommand( { "udevadm", "settle" }, std::chrono::seconds( 10 ) );
if ( r.getExitCode() != 0 )
{
@@ -32,5 +39,5 @@ CalamaresUtils::Partition::sync()
r.explainProcess( "udevadm", std::chrono::seconds( 10 ) );
}
- CalamaresUtils::System::runCommand( { "/bin/sync" }, std::chrono::seconds( 10 ) );
+ CalamaresUtils::System::runCommand( { "sync" }, std::chrono::seconds( 10 ) );
}
diff --git a/src/libcalamares/utils/CalamaresUtilsSystem.cpp b/src/libcalamares/utils/CalamaresUtilsSystem.cpp
index a38b28b6d..c464e93f6 100644
--- a/src/libcalamares/utils/CalamaresUtilsSystem.cpp
+++ b/src/libcalamares/utils/CalamaresUtilsSystem.cpp
@@ -247,7 +247,7 @@ System::targetPath( const QString& path ) const
}
CreationResult
-System::createTargetFile( const QString& path, const QByteArray& contents ) const
+System::createTargetFile( const QString& path, const QByteArray& contents, WriteMode mode ) const
{
QString completePath = targetPath( path );
if ( completePath.isEmpty() )
@@ -256,7 +256,7 @@ System::createTargetFile( const QString& path, const QByteArray& contents ) cons
}
QFile f( completePath );
- if ( f.exists() )
+ if ( ( mode == WriteMode::KeepExisting ) && f.exists() )
{
return CreationResult( CreationResult::Code::AlreadyExists );
}
@@ -264,7 +264,7 @@ System::createTargetFile( const QString& path, const QByteArray& contents ) cons
QIODevice::OpenMode m =
#if QT_VERSION >= QT_VERSION_CHECK( 5, 11, 0 )
// New flag from Qt 5.11, implies WriteOnly
- QIODevice::NewOnly |
+ ( mode == WriteMode::KeepExisting ? QIODevice::NewOnly : QIODevice::WriteOnly ) |
#endif
QIODevice::WriteOnly | QIODevice::Truncate;
diff --git a/src/libcalamares/utils/CalamaresUtilsSystem.h b/src/libcalamares/utils/CalamaresUtilsSystem.h
index a163a1208..c4db9dc00 100644
--- a/src/libcalamares/utils/CalamaresUtilsSystem.h
+++ b/src/libcalamares/utils/CalamaresUtilsSystem.h
@@ -258,6 +258,12 @@ public:
*/
DLLEXPORT QString targetPath( const QString& path ) const;
+ enum class WriteMode
+ {
+ KeepExisting,
+ Overwrite
+ };
+
/** @brief Create a (small-ish) file in the target system.
*
* @param path Path to the file; this is interpreted
@@ -265,14 +271,18 @@ public:
* but / in the chroot, or / in OEM modes).
* @param contents Actual content of the file.
*
- * Will not overwrite files. Returns an empty string if the
- * target file already exists.
+ * If the target already exists:
+ * - returns AlreadyExists as a result (and does not overwrite),
+ * - **unless** @p mode is set to Overwrite, then it tries writing as
+ * usual and will not return AlreadyExists.
*
* @return The complete canonical path to the target file from the
* root of the host system, or empty on failure. (Here, it is
* possible to be canonical because the file exists).
*/
- DLLEXPORT CreationResult createTargetFile( const QString& path, const QByteArray& contents ) const;
+ DLLEXPORT CreationResult createTargetFile( const QString& path,
+ const QByteArray& contents,
+ WriteMode mode = WriteMode::KeepExisting ) const;
/** @brief Remove a file from the target system.
*
diff --git a/src/libcalamares/utils/TestPaths.cpp b/src/libcalamares/utils/TestPaths.cpp
index 612c8f97d..2fd7b9c98 100644
--- a/src/libcalamares/utils/TestPaths.cpp
+++ b/src/libcalamares/utils/TestPaths.cpp
@@ -49,6 +49,8 @@ private Q_SLOTS:
void testCreationResult();
void testTargetPath();
void testCreateTarget();
+ void testCreateTargetExists();
+ void testCreateTargetOverwrite();
void testCreateTargetBasedirs();
private:
@@ -96,31 +98,32 @@ TestPaths::init()
m_gs->insert( "rootMountPoint", "/tmp" );
}
-void TestPaths::testCreationResult()
+void
+TestPaths::testCreationResult()
{
using Code = CalamaresUtils::CreationResult::Code;
- for( auto c : { Code::OK, Code::AlreadyExists, Code::Failed, Code::Invalid } )
+ for ( auto c : { Code::OK, Code::AlreadyExists, Code::Failed, Code::Invalid } )
{
auto r = CalamaresUtils::CreationResult( c );
QVERIFY( r.path().isEmpty() );
QCOMPARE( r.path(), QString() );
// Get a warning from Clang if we're not covering everything
- switch( r.code() )
+ switch ( r.code() )
{
- case Code::OK:
- QVERIFY( !r.failed() );
- QVERIFY( r );
- break;
- case Code::AlreadyExists:
- QVERIFY( !r.failed() );
- QVERIFY( !r );
- break;
- case Code::Failed:
- case Code::Invalid:
- QVERIFY( r.failed() );
- QVERIFY( !r );
- break;
+ case Code::OK:
+ QVERIFY( !r.failed() );
+ QVERIFY( r );
+ break;
+ case Code::AlreadyExists:
+ QVERIFY( !r.failed() );
+ QVERIFY( !r );
+ break;
+ case Code::Failed:
+ case Code::Invalid:
+ QVERIFY( r.failed() );
+ QVERIFY( !r );
+ break;
}
}
@@ -168,6 +171,75 @@ TestPaths::testCreateTarget()
QVERIFY( !fi2.exists() );
}
+struct GSRollback
+{
+ GSRollback( const QString& key )
+ : m_key( key )
+ , m_value( Calamares::JobQueue::instance()->globalStorage()->value( key ) )
+ {
+ }
+ ~GSRollback() { Calamares::JobQueue::instance()->globalStorage()->insert( m_key, m_value ); }
+ QString m_key;
+ QVariant m_value;
+};
+
+
+void
+TestPaths::testCreateTargetExists()
+{
+ static const char ltestFile[] = "cala-test-world";
+ GSRollback g( QStringLiteral( "rootMountPoint" ) );
+
+ QTemporaryDir d;
+ d.setAutoRemove( true );
+ Calamares::JobQueue::instance()->globalStorage()->insert( QStringLiteral( "rootMountPoint" ), d.path() );
+
+ QVERIFY( QFileInfo( d.path() ).exists() );
+ auto r = m_system->createTargetFile( ltestFile, "Hello" );
+ QVERIFY( r );
+ QVERIFY( r.path().endsWith( QString( ltestFile ) ) );
+ QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 );
+
+ r = m_system->createTargetFile( ltestFile, "Goodbye" );
+ QVERIFY( !r.failed() ); // It didn't fail!
+ QVERIFY( !r ); // But not unqualified success, either
+
+ QVERIFY( r.path().isEmpty() );
+ QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 ); // Unchanged!
+}
+
+void
+TestPaths::testCreateTargetOverwrite()
+{
+ static const char ltestFile[] = "cala-test-world";
+ GSRollback g( QStringLiteral( "rootMountPoint" ) );
+
+ QTemporaryDir d;
+ d.setAutoRemove( true );
+ Calamares::JobQueue::instance()->globalStorage()->insert( QStringLiteral( "rootMountPoint" ), d.path() );
+
+ QVERIFY( QFileInfo( d.path() ).exists() );
+ auto r = m_system->createTargetFile( ltestFile, "Hello" );
+ QVERIFY( r );
+ QVERIFY( r.path().endsWith( QString( ltestFile ) ) );
+ QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 );
+
+ r = m_system->createTargetFile( ltestFile, "Goodbye", CalamaresUtils::System::WriteMode::KeepExisting );
+ QVERIFY( !r.failed() ); // It didn't fail!
+ QVERIFY( !r ); // But not unqualified success, either
+
+ QVERIFY( r.path().isEmpty() );
+ QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 ); // Unchanged!
+
+ r = m_system->createTargetFile( ltestFile, "Goodbye", CalamaresUtils::System::WriteMode::Overwrite );
+ QVERIFY( !r.failed() ); // It didn't fail!
+ QVERIFY( r ); // Total success
+
+ QVERIFY( r.path().endsWith( QString( ltestFile ) ) );
+ QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 7 );
+}
+
+
struct DirRemover
{
DirRemover( const QString& base, const QString& dir )
diff --git a/src/modules/grubcfg/main.py b/src/modules/grubcfg/main.py
index 39d50b20c..cb218961b 100644
--- a/src/modules/grubcfg/main.py
+++ b/src/modules/grubcfg/main.py
@@ -74,6 +74,12 @@ def modify_grub_default(partitions, root_mount_point, distributor):
swap_uuid = ""
swap_outer_uuid = ""
swap_outer_mappername = None
+ no_save_default = False
+
+ for partition in partitions:
+ if partition["mountPoint"] in ("/", "/boot") and partition["fs"] in ("btrfs", "f2fs"):
+ no_save_default = True
+ break
if have_plymouth:
use_splash = "splash"
@@ -198,6 +204,9 @@ def modify_grub_default(partitions, root_mount_point, distributor):
# We're not updating because of *keepDistributor*, but if
# this was a comment line, then it's still not been set.
have_distributor_line = have_distributor_line or not lines[i].startswith("#")
+ # If btrfs or f2fs is used, don't save default
+ if no_save_default and lines[i].startswith("GRUB_SAVEDEFAULT="):
+ lines[i] = "#GRUB_SAVEDEFAULT=\"true\""
else:
lines = []
diff --git a/src/modules/initcpiocfg/main.py b/src/modules/initcpiocfg/main.py
index ba1d962bb..b3c43ea0b 100644
--- a/src/modules/initcpiocfg/main.py
+++ b/src/modules/initcpiocfg/main.py
@@ -144,6 +144,10 @@ def modify_mkinitcpio_conf(partitions, root_mount_point):
hooks.append("bootsplash-{!s}".format(bootsplash_theme))
for partition in partitions:
+ if partition["fs"] == "linuxswap" and not partition.get("claimed", None):
+ # Skip foreign swap
+ continue
+
if partition["fs"] == "linuxswap":
swap_uuid = partition["uuid"]
if "luksMapperName" in partition:
diff --git a/src/modules/users/SetHostNameJob.cpp b/src/modules/users/SetHostNameJob.cpp
index db220d042..555fcdc7d 100644
--- a/src/modules/users/SetHostNameJob.cpp
+++ b/src/modules/users/SetHostNameJob.cpp
@@ -31,6 +31,8 @@
#include
#include
+using WriteMode = CalamaresUtils::System::WriteMode;
+
SetHostNameJob::SetHostNameJob( const QString& hostname, Actions a )
: Calamares::Job()
, m_hostname( hostname )
@@ -61,9 +63,8 @@ SetHostNameJob::prettyStatusMessage() const
STATICTEST bool
setFileHostname( const QString& hostname )
{
- return !( CalamaresUtils::System::instance()
- ->createTargetFile( QStringLiteral( "/etc/hostname" ), ( hostname + '\n' ).toUtf8() )
- .failed() );
+ return CalamaresUtils::System::instance()->createTargetFile(
+ QStringLiteral( "/etc/hostname" ), ( hostname + '\n' ).toUtf8(), WriteMode::Overwrite );
}
STATICTEST bool
@@ -78,9 +79,8 @@ ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
)";
- return !( CalamaresUtils::System::instance()
- ->createTargetFile( QStringLiteral( "/etc/hosts" ), QString( etc_hosts ).arg( hostname ).toUtf8() )
- .failed() );
+ return CalamaresUtils::System::instance()->createTargetFile(
+ QStringLiteral( "/etc/hosts" ), QString( etc_hosts ).arg( hostname ).toUtf8(), WriteMode::Overwrite );
}
STATICTEST bool
diff --git a/src/modules/users/UsersPage.cpp b/src/modules/users/UsersPage.cpp
index 21f472a40..a18d3a82d 100644
--- a/src/modules/users/UsersPage.cpp
+++ b/src/modules/users/UsersPage.cpp
@@ -105,6 +105,16 @@ UsersPage::UsersPage( QWidget* parent )
checkReady( isReady() );
} );
connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged, this, [this]( int checked ) {
+ /* When "reuse" is checked, hide the fields for explicitly
+ * entering the root password. However, if we're going to
+ * disable the root password anyway, hide them all regardless of
+ * the checkbox -- so when writeRoot is false, checked needs
+ * to be true, to hide them all.
+ */
+ if ( !m_writeRootPassword )
+ {
+ checked = true;
+ }
ui->labelChooseRootPassword->setVisible( !checked );
ui->labelRootPassword->setVisible( !checked );
ui->labelRootPasswordError->setVisible( !checked );
@@ -246,8 +256,8 @@ UsersPage::onActivate()
void
UsersPage::setWriteRootPassword( bool write )
{
- ui->checkBoxReusePassword->setVisible( write );
m_writeRootPassword = write;
+ ui->checkBoxReusePassword->setVisible( write );
}
diff --git a/src/modules/users/users.conf b/src/modules/users/users.conf
index 1c928fd3a..174a60142 100644
--- a/src/modules/users/users.conf
+++ b/src/modules/users/users.conf
@@ -45,8 +45,11 @@ doAutologin: true
# potentially confusing users.
sudoersGroup: wheel
-# Setting this to false , causes the root account to be disabled.
+# Setting this to false, causes the root account to be disabled.
+# When disabled, hides the "Use the same password for administrator"
+# checkbox. Also hides the "Choose a password" and associated text-inputs.
setRootPassword: true
+
# You can control the initial state for the 'reuse password for root'
# checkbox here. Possible values are:
# - true to check or